diff options
Diffstat (limited to 'platform/lang-impl/src/com/intellij/ide/util/gotoByName')
-rw-r--r-- | platform/lang-impl/src/com/intellij/ide/util/gotoByName/GotoActionItemProvider.java | 169 | ||||
-rw-r--r-- | platform/lang-impl/src/com/intellij/ide/util/gotoByName/GotoActionModel.java | 285 |
2 files changed, 296 insertions, 158 deletions
diff --git a/platform/lang-impl/src/com/intellij/ide/util/gotoByName/GotoActionItemProvider.java b/platform/lang-impl/src/com/intellij/ide/util/gotoByName/GotoActionItemProvider.java new file mode 100644 index 000000000000..a6e6c8fdf658 --- /dev/null +++ b/platform/lang-impl/src/com/intellij/ide/util/gotoByName/GotoActionItemProvider.java @@ -0,0 +1,169 @@ +/* + * Copyright 2000-2014 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.intellij.ide.util.gotoByName; + +import com.intellij.ide.DataManager; +import com.intellij.ide.actions.ApplyIntentionAction; +import com.intellij.ide.ui.search.ActionFromOptionDescriptorProvider; +import com.intellij.ide.ui.search.OptionDescription; +import com.intellij.ide.ui.search.SearchableOptionsRegistrar; +import com.intellij.ide.ui.search.SearchableOptionsRegistrarImpl; +import com.intellij.openapi.actionSystem.ActionManager; +import com.intellij.openapi.actionSystem.AnAction; +import com.intellij.openapi.actionSystem.DataContext; +import com.intellij.openapi.actionSystem.impl.ActionManagerImpl; +import com.intellij.openapi.progress.ProgressIndicator; +import com.intellij.util.Function; +import com.intellij.util.Processor; +import com.intellij.util.containers.ContainerUtil; +import org.jetbrains.annotations.NotNull; + +import java.util.*; + +import static com.intellij.ide.util.gotoByName.GotoActionModel.*; + +/** + * @author peter + */ +public class GotoActionItemProvider implements ChooseByNameItemProvider { + private final ActionManager myActionManager = ActionManager.getInstance(); + protected final SearchableOptionsRegistrar myIndex = SearchableOptionsRegistrar.getInstance(); + private final GotoActionModel myModel; + + public GotoActionItemProvider(GotoActionModel model) { + myModel = model; + } + + @NotNull + @Override + public List<String> filterNames(@NotNull ChooseByNameBase base, @NotNull String[] names, @NotNull String pattern) { + return Collections.emptyList(); // no common prefix insertion in goto action + } + + @Override + public boolean filterElements(@NotNull final ChooseByNameBase base, + @NotNull final String pattern, + boolean everywhere, + @NotNull ProgressIndicator cancelled, + @NotNull final Processor<Object> consumer) { + return filterElements(pattern, everywhere, new Processor<MatchedValue>() { + @Override + public boolean process(MatchedValue value) { + return consumer.process(value); + } + }); + } + + public boolean filterElements(String pattern, boolean everywhere, Processor<MatchedValue> consumer) { + DataContext dataContext = DataManager.getInstance().getDataContext(myModel.getContextComponent()); + + if (!processIntentions(pattern, consumer, dataContext)) return false; + if (!processActions(pattern, everywhere, consumer, dataContext)) return false; + if (!processOptions(pattern, consumer, dataContext)) return false; + + return true; + } + + private boolean processOptions(String pattern, Processor<MatchedValue> consumer, DataContext dataContext) { + List<Comparable> options = ContainerUtil.newArrayList(); + final Set<String> words = myIndex.getProcessedWords(pattern); + Set<OptionDescription> optionDescriptions = null; + final String actionManagerName = myActionManager.getComponentName(); + for (String word : words) { + final Set<OptionDescription> descriptions = ((SearchableOptionsRegistrarImpl)myIndex).getAcceptableDescriptions(word); + if (descriptions != null) { + for (Iterator<OptionDescription> iterator = descriptions.iterator(); iterator.hasNext(); ) { + OptionDescription description = iterator.next(); + if (actionManagerName.equals(description.getPath())) { + iterator.remove(); + } + } + if (!descriptions.isEmpty()) { + if (optionDescriptions == null) { + optionDescriptions = descriptions; + } + else { + optionDescriptions.retainAll(descriptions); + } + } + } else { + optionDescriptions = null; + break; + } + } + if (optionDescriptions != null && !optionDescriptions.isEmpty()) { + Set<String> currentHits = new HashSet<String>(); + for (Iterator<OptionDescription> iterator = optionDescriptions.iterator(); iterator.hasNext(); ) { + OptionDescription description = iterator.next(); + final String hit = description.getHit(); + if (hit == null || !currentHits.add(hit.trim())) { + iterator.remove(); + } + } + for (OptionDescription description : optionDescriptions) { + for (ActionFromOptionDescriptorProvider converter : ActionFromOptionDescriptorProvider.EP.getExtensions()) { + AnAction action = converter.provide(description); + if (action != null) options.add(new ActionWrapper(action, null, MatchMode.NAME, dataContext)); + options.add(description); + } + } + } + return processItems(pattern, options, consumer); + } + + private boolean processActions(String pattern, boolean everywhere, Processor<MatchedValue> consumer, DataContext dataContext) { + List<AnAction> actions = ContainerUtil.newArrayList(); + if (everywhere) { + for (String id : ((ActionManagerImpl)myActionManager).getActionIds()) { + ContainerUtil.addIfNotNull(actions, myActionManager.getAction(id)); + } + } else { + actions.addAll(myModel.myActionsMap.keySet()); + } + + List<ActionWrapper> actionWrappers = ContainerUtil.newArrayList(); + for (AnAction action : actions) { + MatchMode mode = myModel.actionMatches(pattern, action); + if (mode != MatchMode.NONE) { + actionWrappers.add(new ActionWrapper(action, myModel.myActionsMap.get(action), mode, dataContext)); + } + } + return processItems(pattern, actionWrappers, consumer); + } + + private boolean processIntentions(String pattern, Processor<MatchedValue> consumer, DataContext dataContext) { + List<ActionWrapper> intentions = ContainerUtil.newArrayList(); + for (String intentionText : myModel.myIntentions.keySet()) { + final ApplyIntentionAction intentionAction = myModel.myIntentions.get(intentionText); + if (myModel.actionMatches(pattern, intentionAction) != MatchMode.NONE) { + intentions.add(new ActionWrapper(intentionAction, intentionText, MatchMode.INTENTION, dataContext)); + } + } + return processItems(pattern, intentions, consumer); + } + + private static boolean processItems(final String pattern, List<? extends Comparable> items, Processor<MatchedValue> consumer) { + List<MatchedValue> matched = ContainerUtil.map(items, new Function<Comparable, MatchedValue>() { + @Override + public MatchedValue fun(Comparable comparable) { + return new MatchedValue(comparable, pattern); + } + }); + Collections.sort(matched); + return ContainerUtil.process(matched, consumer); + } + +} diff --git a/platform/lang-impl/src/com/intellij/ide/util/gotoByName/GotoActionModel.java b/platform/lang-impl/src/com/intellij/ide/util/gotoByName/GotoActionModel.java index 45fe6a9a074c..91f0d3368521 100644 --- a/platform/lang-impl/src/com/intellij/ide/util/gotoByName/GotoActionModel.java +++ b/platform/lang-impl/src/com/intellij/ide/util/gotoByName/GotoActionModel.java @@ -16,34 +16,28 @@ package com.intellij.ide.util.gotoByName; -import com.intellij.ide.DataManager; import com.intellij.ide.IdeBundle; import com.intellij.ide.actions.ApplyIntentionAction; -import com.intellij.ide.ui.search.ActionFromOptionDescriptorProvider; +import com.intellij.ide.actions.ShowSettingsUtilImpl; import com.intellij.ide.ui.search.OptionDescription; import com.intellij.ide.ui.search.SearchableOptionsRegistrar; -import com.intellij.ide.ui.search.SearchableOptionsRegistrarImpl; import com.intellij.openapi.actionSystem.*; import com.intellij.openapi.actionSystem.ex.ActionUtil; -import com.intellij.openapi.actionSystem.impl.ActionManagerImpl; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.keymap.KeymapManager; import com.intellij.openapi.keymap.KeymapUtil; import com.intellij.openapi.options.Configurable; import com.intellij.openapi.options.SearchableConfigurable; -import com.intellij.openapi.options.ex.IdeConfigurablesGroup; -import com.intellij.openapi.options.ex.ProjectConfigurablesGroup; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.Comparing; import com.intellij.openapi.util.SystemInfo; +import com.intellij.openapi.util.TextRange; import com.intellij.openapi.util.text.StringUtil; import com.intellij.psi.PsiFile; -import com.intellij.ui.ColorUtil; -import com.intellij.ui.IdeBorderFactory; -import com.intellij.ui.LayeredIcon; -import com.intellij.ui.LightColors; +import com.intellij.ui.*; import com.intellij.ui.components.JBLabel; +import com.intellij.ui.speedSearch.SpeedSearchUtil; import com.intellij.util.ArrayUtil; import com.intellij.util.containers.ContainerUtil; import com.intellij.util.ui.EmptyIcon; @@ -58,9 +52,10 @@ import java.awt.*; import java.util.*; import java.util.List; +import static com.intellij.ui.SimpleTextAttributes.STYLE_PLAIN; +import static com.intellij.ui.SimpleTextAttributes.STYLE_SEARCH_MATCH; + public class GotoActionModel implements ChooseByNameModel, CustomMatcherModel, Comparator<Object>, EdtSortingModel { - @NonNls public static final String SETTINGS_KEY = "$$$SETTINGS$$$"; - @NonNls public static final String INTENTIONS_KEY = "$$$INTENTIONS_KEY$$$"; @Nullable private final Project myProject; private final Component myContextComponent; @@ -103,10 +98,7 @@ public class GotoActionModel implements ChooseByNameModel, CustomMatcherModel, C } } myIndex = SearchableOptionsRegistrar.getInstance(); - fillConfigurablesNames(new IdeConfigurablesGroup().getConfigurables()); - if (project != null) { - fillConfigurablesNames(new ProjectConfigurablesGroup(project).getConfigurables()); - } + fillConfigurablesNames(ShowSettingsUtilImpl.getConfigurables(project, true)); } private void fillConfigurablesNames(Configurable[] configurables) { @@ -151,13 +143,61 @@ public class GotoActionModel implements ChooseByNameModel, CustomMatcherModel, C public void saveInitialCheckBoxState(boolean state) { } + public static class MatchedValue implements Comparable<MatchedValue> { + @NotNull public final Comparable value; + @NotNull final String pattern; + + MatchedValue(@NotNull Comparable value, @NotNull String pattern) { + this.value = value; + this.pattern = pattern; + } + + @Nullable + private String getValueText() { + if (value instanceof OptionDescription) return ((OptionDescription)value).getHit(); + if (!(value instanceof ActionWrapper)) return null; + return ((ActionWrapper)value).getAction().getTemplatePresentation().getText(); + } + + private int getMatchingDegree() { + String text = getValueText(); + if (text != null) { + if (StringUtil.equalsIgnoreCase(StringUtil.trimEnd(text, "..."), pattern)) return 3; + if (StringUtil.startsWithIgnoreCase(text, pattern)) return 2; + if (StringUtil.containsIgnoreCase(text, pattern)) return 1; + } + return 0; + } + + @Override + public int compareTo(@NotNull MatchedValue o) { + if (value instanceof OptionDescription && !(o.value instanceof OptionDescription)) { + return 1; + } + if (o.value instanceof OptionDescription && !(value instanceof OptionDescription)) { + return -1; + } + + if (value instanceof ActionWrapper && o.value instanceof ActionWrapper && ApplicationManager.getApplication().isDispatchThread()) { + boolean p1Enable = ((ActionWrapper)value).isAvailable(); + boolean p2enable = ((ActionWrapper)o.value).isAvailable(); + if (p1Enable && !p2enable) return -1; + if (!p1Enable && p2enable) return 1; + } + + int diff = o.getMatchingDegree() - getMatchingDegree(); + //noinspection unchecked + return diff != 0 ? diff : value.compareTo(o.value); + } + } + @Override public ListCellRenderer getListCellRenderer() { return new DefaultListCellRenderer() { @Override public Component getListCellRendererComponent(@NotNull final JList list, - final Object value, + final Object matchedValue, final int index, final boolean isSelected, final boolean cellHasFocus) { final JPanel panel = new JPanel(new BorderLayout()); panel.setBorder(IdeBorderFactory.createEmptyBorder(2)); @@ -165,21 +205,40 @@ public class GotoActionModel implements ChooseByNameModel, CustomMatcherModel, C Color bg = UIUtil.getListBackground(isSelected); panel.setBackground(bg); + if (matchedValue instanceof String) { //... + final JBLabel label = new JBLabel((String)matchedValue); + label.setIcon(EMPTY_ICON); + panel.add(label, BorderLayout.WEST); + return panel; + } + Color groupFg = isSelected ? UIUtil.getListSelectionForeground() : UIUtil.getLabelDisabledForeground(); + Object value = ((MatchedValue) matchedValue).value; + String pattern = ((MatchedValue)matchedValue).pattern; + + SimpleColoredComponent nameComponent = new SimpleColoredComponent(); + nameComponent.setBackground(bg); + panel.add(nameComponent, BorderLayout.CENTER); + if (value instanceof ActionWrapper) { final ActionWrapper actionWithParentGroup = (ActionWrapper)value; final AnAction anAction = actionWithParentGroup.getAction(); final Presentation templatePresentation = anAction.getTemplatePresentation(); - final Icon icon = templatePresentation.getIcon(); final Color fg = defaultActionForeground(isSelected, actionWithParentGroup.getPresentation()); - final JLabel actionLabel = createActionLabel(anAction, templatePresentation.getText(), fg, bg, icon); - panel.add(actionLabel, BorderLayout.WEST); + panel.add(createIconLabel(templatePresentation.getIcon()), BorderLayout.WEST); + + appendWithColoredMatches(nameComponent, templatePresentation.getText(), pattern, fg, isSelected); - final String groupName = actionWithParentGroup.getGroupName(); + final Shortcut shortcut = preferKeyboardShortcut(KeymapManager.getInstance().getActiveKeymap().getShortcuts(getActionId(anAction))); + if (shortcut != null) { + nameComponent.append(" (" + KeymapUtil.getShortcutText(shortcut) + ")", new SimpleTextAttributes(STYLE_PLAIN, groupFg)); + } + + String groupName = actionWithParentGroup.getAction() instanceof ApplyIntentionAction ? null : actionWithParentGroup.getGroupName(); if (groupName != null) { final JLabel groupLabel = new JLabel(groupName); groupLabel.setBackground(bg); @@ -189,7 +248,9 @@ public class GotoActionModel implements ChooseByNameModel, CustomMatcherModel, C } else if (value instanceof OptionDescription) { if (!isSelected) { - panel.setBackground(UIUtil.isUnderDarcula() ? ColorUtil.brighter(UIUtil.getListBackground(), 1) : LightColors.SLIGHTLY_GRAY); + Color descriptorBg = UIUtil.isUnderDarcula() ? ColorUtil.brighter(UIUtil.getListBackground(), 1) : LightColors.SLIGHTLY_GRAY; + panel.setBackground(descriptorBg); + nameComponent.setBackground(descriptorBg); } String hit = ((OptionDescription)value).getHit(); if (hit == null) { @@ -200,23 +261,31 @@ public class GotoActionModel implements ChooseByNameModel, CustomMatcherModel, C hit = hit.replace(" ", " "); //avoid extra spaces from mnemonics and xml conversion final Color fg = UIUtil.getListForeground(isSelected); - final JLabel label = new JLabel(hit.trim()); - label.setIcon(EMPTY_ICON); - label.setForeground(fg); - label.setBackground(bg); - panel.add(label, BorderLayout.WEST); + + appendWithColoredMatches(nameComponent, hit.trim(), pattern, fg, isSelected); + + panel.add(new JLabel(EMPTY_ICON), BorderLayout.WEST); + final JLabel settingsLabel = new JLabel(getGroupName((OptionDescription)value)); settingsLabel.setForeground(groupFg); settingsLabel.setBackground(bg); panel.add(settingsLabel, BorderLayout.EAST); } - else if (value instanceof String) { - final JBLabel label = new JBLabel((String)value); - label.setIcon(EMPTY_ICON); - panel.add(label, BorderLayout.WEST); - } return panel; } + + private void appendWithColoredMatches(SimpleColoredComponent nameComponent, String name, String pattern, Color fg, boolean selected) { + final SimpleTextAttributes plain = new SimpleTextAttributes(STYLE_PLAIN, fg); + final SimpleTextAttributes highlighted = new SimpleTextAttributes(null, fg, null, STYLE_SEARCH_MATCH); + List<TextRange> fragments = ContainerUtil.newArrayList(); + if (selected) { + int matchStart = StringUtil.indexOfIgnoreCase(name, pattern, 0); + if (matchStart >= 0) { + fragments.add(TextRange.from(matchStart, pattern.length())); + } + } + SpeedSearchUtil.appendColoredFragments(nameComponent, name, fragments, plain, highlighted); + } }; } @@ -224,6 +293,18 @@ public class GotoActionModel implements ChooseByNameModel, CustomMatcherModel, C return myActionManager.getId(anAction); } + private static JLabel createIconLabel(final Icon icon) { + final LayeredIcon layeredIcon = new LayeredIcon(2); + layeredIcon.setIcon(EMPTY_ICON, 0); + if (icon != null && icon.getIconWidth() <= EMPTY_ICON.getIconWidth() && icon.getIconHeight() <= EMPTY_ICON.getIconHeight()) { + layeredIcon + .setIcon(icon, 1, (-icon.getIconWidth() + EMPTY_ICON.getIconWidth()) / 2, (EMPTY_ICON.getIconHeight() - icon.getIconHeight()) / 2); + } + + return new JLabel(layeredIcon); + } + + protected JLabel createActionLabel(final AnAction anAction, final String anActionName, final Color fg, final Color bg, final Icon icon) { @@ -256,23 +337,7 @@ public class GotoActionModel implements ChooseByNameModel, CustomMatcherModel, C public int compare(@NotNull Object o1, @NotNull Object o2) { if (ChooseByNameBase.EXTRA_ELEM.equals(o1)) return 1; if (ChooseByNameBase.EXTRA_ELEM.equals(o2)) return -1; - - if (o1 instanceof OptionDescription && !(o2 instanceof OptionDescription)) { - return 1; - } - if (o2 instanceof OptionDescription && !(o1 instanceof OptionDescription)) { - return -1; - } - - if (o1 instanceof OptionDescription) { - return ((OptionDescription)o1).compareTo(o2); - } - - if (o1 instanceof ActionWrapper && o2 instanceof ActionWrapper) { - return ((ActionWrapper)o1).compareTo((ActionWrapper)o2); - } - - return StringUtil.compare(getFullName(o1), getFullName(o2), true); + return ((MatchedValue) o1).compareTo((MatchedValue)o2); } public static AnActionEvent updateActionBeforeShow(AnAction anAction, DataContext dataContext) { @@ -293,107 +358,17 @@ public class GotoActionModel implements ChooseByNameModel, CustomMatcherModel, C @Override @NotNull public String[] getNames(boolean checkBoxState) { - final LinkedHashSet<String> result = new LinkedHashSet<String>(); - result.add(INTENTIONS_KEY); - for (AnAction action : myActionsMap.keySet()) { - result.add(getActionId(action)); - } - if (checkBoxState) { - final Set<String> ids = ((ActionManagerImpl)myActionManager).getActionIds(); - for (String id : ids) { - result.add(id); - } - } - result.add(SETTINGS_KEY); - return ArrayUtil.toStringArray(result); + return ArrayUtil.EMPTY_STRING_ARRAY; } @Override @NotNull public Object[] getElementsByName(final String id, final boolean checkBoxState, final String pattern) { - List<Object> objects = new ArrayList<Object>(); - final AnAction act = myActionManager.getAction(id); - DataContext dataContext = DataManager.getInstance().getDataContext(myContextComponent); - if (act != null) { - final HashMap<AnAction, String> map = new HashMap<AnAction, String>(); - final MatchMode matchMode = actionMatches(pattern, act); - final String groupName = myActionsMap.get(act); - if (map.put(act, groupName) == null) { - objects.add(new ActionWrapper(act, groupName, matchMode, dataContext)); - } - if (checkBoxState) { - final Set<String> ids = ((ActionManagerImpl)myActionManager).getActionIds(); - for (AnAction action : map.keySet()) { //do not add already included actions - ids.remove(getActionId(action)); - } - if (ids.contains(id)) { - final AnAction anAction = myActionManager.getAction(id); - map.put(anAction, null); - if (anAction != null) { - objects.add(new ActionWrapper(anAction, null, MatchMode.NON_MENU, dataContext)); - } - } - } - } else if (Comparing.strEqual(id, INTENTIONS_KEY)) { - for (String intentionText : myIntentions.keySet()) { - final ApplyIntentionAction intentionAction = myIntentions.get(intentionText); - if (actionMatches(pattern, intentionAction) != MatchMode.NONE) { - objects.add(new ActionWrapper(intentionAction, intentionText, MatchMode.INTENTION, dataContext)); - } - } - } - if (Comparing.strEqual(id, SETTINGS_KEY)) { - final Set<String> words = myIndex.getProcessedWords(pattern); - Set<OptionDescription> optionDescriptions = null; - final String actionManagerName = myActionManager.getComponentName(); - for (String word : words) { - final Set<OptionDescription> descriptions = ((SearchableOptionsRegistrarImpl)myIndex).getAcceptableDescriptions(word); - if (descriptions != null) { - for (Iterator<OptionDescription> iterator = descriptions.iterator(); iterator.hasNext(); ) { - OptionDescription description = iterator.next(); - if (actionManagerName.equals(description.getPath())) { - iterator.remove(); - } - } - if (!descriptions.isEmpty()) { - if (optionDescriptions == null) { - optionDescriptions = descriptions; - } - else { - optionDescriptions.retainAll(descriptions); - } - } - } else { - optionDescriptions = null; - break; - } - } - if (optionDescriptions != null && !optionDescriptions.isEmpty()) { - Set<String> currentHits = new HashSet<String>(); - for (Iterator<OptionDescription> iterator = optionDescriptions.iterator(); iterator.hasNext(); ) { - OptionDescription description = iterator.next(); - final String hit = description.getHit(); - if (hit == null || !currentHits.add(hit.trim())) { - iterator.remove(); - } - } - for (OptionDescription description : optionDescriptions) { - for (ActionFromOptionDescriptorProvider converter : ActionFromOptionDescriptorProvider.EP.getExtensions()) { - AnAction action = converter.provide(description); - if (action != null) { - String title = getGroupName(description); - objects.add(new ActionWrapper(action, title, MatchMode.NAME, dataContext)); - } - objects.add(description); - } - } - } - } - return objects.toArray(new Object[objects.size()]); + return ArrayUtil.EMPTY_OBJECT_ARRAY; } @NotNull - private String getGroupName(@NotNull OptionDescription description) { + String getGroupName(@NotNull OptionDescription description) { String id = description.getConfigurableId(); String name = myConfigurablesNames.get(id); String settings = SystemInfo.isMac ? "Preferences" : "Settings"; @@ -459,10 +434,8 @@ public class GotoActionModel implements ChooseByNameModel, CustomMatcherModel, C } @Override - public String getElementName(final Object element) { - if (element instanceof OptionDescription) return ((OptionDescription)element).getHit(); - if (!(element instanceof ActionWrapper)) return null; - return ((ActionWrapper)element).getAction().getTemplatePresentation().getText(); + public String getElementName(final Object mv) { + return ((MatchedValue) mv).getValueText(); } @Override @@ -485,7 +458,10 @@ public class GotoActionModel implements ChooseByNameModel, CustomMatcherModel, C return MatchMode.DESCRIPTION; } final String groupName = myActionsMap.get(anAction); - return groupName != null && text != null && matcher.matches(groupName + " " + text, compiledPattern) ? MatchMode.GROUP : MatchMode.NONE; + if (groupName == null) { + return text != null && matcher.matches(text, compiledPattern) ? MatchMode.NON_MENU : MatchMode.NONE; + } + return text != null && matcher.matches(groupName + " " + text, compiledPattern) ? MatchMode.GROUP : MatchMode.NONE; } @Nullable @@ -498,7 +474,7 @@ public class GotoActionModel implements ChooseByNameModel, CustomMatcherModel, C } @NotNull - private Pattern getPattern(@NotNull String pattern) { + Pattern getPattern(@NotNull String pattern) { String converted = convertPattern(pattern.trim()); Pattern compiledPattern = myCompiledPattern; if (compiledPattern != null && !Comparing.strEqual(converted, compiledPattern.getPattern())) { @@ -528,7 +504,7 @@ public class GotoActionModel implements ChooseByNameModel, CustomMatcherModel, C NONE, INTENTION, NAME, DESCRIPTION, GROUP, NON_MENU } - private static String convertPattern(String pattern) { + static String convertPattern(String pattern) { final int eol = pattern.indexOf('\n'); if (eol != -1) { pattern = pattern.substring(0, eol); @@ -632,7 +608,7 @@ public class GotoActionModel implements ChooseByNameModel, CustomMatcherModel, C return new Perl5Matcher(); } }; - private PatternMatcher getMatcher() { + PatternMatcher getMatcher() { return myMatcher.get(); } @@ -660,20 +636,13 @@ public class GotoActionModel implements ChooseByNameModel, CustomMatcherModel, C @Override public int compareTo(@NotNull ActionWrapper o) { - if (ApplicationManager.getApplication().isDispatchThread()) { - boolean p1Enable = visible(); - boolean p2enable = o.visible(); - if (p1Enable && !p2enable) return -1; - if (!p1Enable && p2enable) return 1; - } - int compared = myMode.compareTo(o.getMode()); return compared != 0 ? compared : StringUtil.compare(myAction.getTemplatePresentation().getText(), o.getAction().getTemplatePresentation().getText(), true); } - private boolean visible() { + private boolean isAvailable() { return getPresentation().isEnabledAndVisible(); } |