diff options
Diffstat (limited to 'platform/lang-impl/src/com/intellij/ide/actions/GotoRelatedSymbolAction.java')
-rw-r--r-- | platform/lang-impl/src/com/intellij/ide/actions/GotoRelatedSymbolAction.java | 279 |
1 files changed, 4 insertions, 275 deletions
diff --git a/platform/lang-impl/src/com/intellij/ide/actions/GotoRelatedSymbolAction.java b/platform/lang-impl/src/com/intellij/ide/actions/GotoRelatedSymbolAction.java index 2870f806ab8a..229531b3ef53 100644 --- a/platform/lang-impl/src/com/intellij/ide/actions/GotoRelatedSymbolAction.java +++ b/platform/lang-impl/src/com/intellij/ide/actions/GotoRelatedSymbolAction.java @@ -15,39 +15,19 @@ */ package com.intellij.ide.actions; -import com.intellij.ide.util.DefaultPsiElementCellRenderer; +import com.intellij.codeInsight.navigation.NavigationUtil; import com.intellij.navigation.GotoRelatedItem; -import com.intellij.navigation.GotoRelatedProvider; import com.intellij.openapi.actionSystem.AnAction; import com.intellij.openapi.actionSystem.AnActionEvent; import com.intellij.openapi.actionSystem.CommonDataKeys; import com.intellij.openapi.actionSystem.DataContext; import com.intellij.openapi.editor.Editor; -import com.intellij.openapi.extensions.Extensions; -import com.intellij.openapi.ui.popup.JBPopup; -import com.intellij.openapi.ui.popup.PopupStep; -import com.intellij.openapi.ui.popup.util.BaseListPopupStep; -import com.intellij.openapi.util.Ref; -import com.intellij.openapi.util.text.StringUtil; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiFile; -import com.intellij.ui.ColoredListCellRenderer; -import com.intellij.ui.JBColor; -import com.intellij.ui.SeparatorWithText; -import com.intellij.ui.SimpleTextAttributes; -import com.intellij.ui.popup.list.ListPopupImpl; -import com.intellij.ui.popup.list.PopupListElementRenderer; -import com.intellij.util.Processor; -import com.intellij.util.containers.ContainerUtil; -import com.intellij.util.ui.UIUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.TestOnly; -import javax.swing.*; -import java.awt.*; -import java.awt.event.ActionEvent; -import java.util.*; import java.util.List; /** @@ -66,210 +46,20 @@ public class GotoRelatedSymbolAction extends AnAction { PsiElement element = getContextElement(e.getDataContext()); if (element == null) return; - List<GotoRelatedItem> items = getItems(element, e.getDataContext()); + List<GotoRelatedItem> items = NavigationUtil.collectRelatedItems(element, e.getDataContext()); if (items.isEmpty()) return; if (items.size() == 1 && items.get(0).getElement() != null) { items.get(0).navigate(); return; } - createPopup(items, "Choose Target").showInBestPositionFor(e.getDataContext()); - } - - public static JBPopup createPopup(final List<? extends GotoRelatedItem> items, final String title) { - Object[] elements = new Object[items.size()]; - //todo[nik] move presentation logic to GotoRelatedItem class - final Map<PsiElement, GotoRelatedItem> itemsMap = new HashMap<PsiElement, GotoRelatedItem>(); - for (int i = 0; i < items.size(); i++) { - GotoRelatedItem item = items.get(i); - elements[i] = item.getElement() != null ? item.getElement() : item; - itemsMap.put(item.getElement(), item); - } - - return getPsiElementPopup(elements, itemsMap, title, new Processor<Object>() { - @Override - public boolean process(Object element) { - if (element instanceof PsiElement) { - //noinspection SuspiciousMethodCalls - itemsMap.get(element).navigate(); - } - else { - ((GotoRelatedItem)element).navigate(); - } - return true; - } - } - ); - } - - private static JBPopup getPsiElementPopup(final Object[] elements, final Map<PsiElement, GotoRelatedItem> itemsMap, - final String title, final Processor<Object> processor) { - - final Ref<Boolean> hasMnemonic = Ref.create(false); - final DefaultPsiElementCellRenderer renderer = new DefaultPsiElementCellRenderer() { - { - setFocusBorderEnabled(false); - } - - @Override - public String getElementText(PsiElement element) { - String customName = itemsMap.get(element).getCustomName(); - return (customName != null ? customName : super.getElementText(element)); - } - - @Override - protected Icon getIcon(PsiElement element) { - Icon customIcon = itemsMap.get(element).getCustomIcon(); - return customIcon != null ? customIcon : super.getIcon(element); - } - - @Override - public String getContainerText(PsiElement element, String name) { - String customContainerName = itemsMap.get(element).getCustomContainerName(); - - if (customContainerName != null) { - return customContainerName; - } - PsiFile file = element.getContainingFile(); - return file != null && !getElementText(element).equals(file.getName()) - ? "(" + file.getName() + ")" - : null; - } - - @Override - protected DefaultListCellRenderer getRightCellRenderer(Object value) { - return null; - } - - @Override - protected boolean customizeNonPsiElementLeftRenderer(ColoredListCellRenderer renderer, - JList list, - Object value, - int index, - boolean selected, - boolean hasFocus) { - final GotoRelatedItem item = (GotoRelatedItem)value; - Color color = list.getForeground(); - final SimpleTextAttributes nameAttributes = new SimpleTextAttributes(Font.PLAIN, color); - final String name = item.getCustomName(); - if (name == null) return false; - renderer.append(name, nameAttributes); - renderer.setIcon(item.getCustomIcon()); - return true; - } - - @Override - public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { - final JPanel component = (JPanel)super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); - if (!hasMnemonic.get()) return component; - - final JPanel panelWithMnemonic = new JPanel(new BorderLayout()); - final int mnemonic = getMnemonic(value, itemsMap); - final JLabel label = new JLabel(""); - if (mnemonic != -1) { - label.setText(mnemonic + "."); - label.setDisplayedMnemonicIndex(0); - } - label.setPreferredSize(new JLabel("8.").getPreferredSize()); - - final JComponent leftRenderer = (JComponent)component.getComponents()[0]; - component.remove(leftRenderer); - panelWithMnemonic.setBorder(BorderFactory.createEmptyBorder(0, 7, 0, 0)); - panelWithMnemonic.setBackground(leftRenderer.getBackground()); - label.setBackground(leftRenderer.getBackground()); - panelWithMnemonic.add(label, BorderLayout.WEST); - panelWithMnemonic.add(leftRenderer, BorderLayout.CENTER); - component.add(panelWithMnemonic); - return component; - } - }; - final ListPopupImpl popup = new ListPopupImpl(new BaseListPopupStep<Object>(title, Arrays.asList(elements)) { - @Override - public boolean isSpeedSearchEnabled() { - return true; - } - - @Override - public String getIndexedString(Object value) { - if (value instanceof GotoRelatedItem) { - //noinspection ConstantConditions - return ((GotoRelatedItem)value).getCustomName(); - } - final PsiElement element = (PsiElement)value; - return renderer.getElementText(element) + " " + renderer.getContainerText(element, null); - } - - @Override - public PopupStep onChosen(Object selectedValue, boolean finalChoice) { - processor.process(selectedValue); - return super.onChosen(selectedValue, finalChoice); - } - }) { - }; - popup.getList().setCellRenderer(new PopupListElementRenderer(popup) { - Map<Object, String> separators = new HashMap<Object, String>(); - { - final ListModel model = popup.getList().getModel(); - String current = null; - boolean hasTitle = false; - for (int i = 0; i < model.getSize(); i++) { - final Object element = model.getElementAt(i); - final GotoRelatedItem item = itemsMap.get(element); - if (item != null && !StringUtil.equals(current, item.getGroup())) { - current = item.getGroup(); - separators.put(element, current); - if (!hasTitle && !StringUtil.isEmpty(current)) { - hasTitle = true; - } - } - } - - if (!hasTitle) { - separators.remove(model.getElementAt(0)); - } - } - @Override - public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { - final Component component = renderer.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); - final String separator = separators.get(value); - - if (separator != null) { - JPanel panel = new JPanel(new BorderLayout()); - panel.add(component, BorderLayout.CENTER); - final SeparatorWithText sep = new SeparatorWithText() { - @Override - protected void paintComponent(Graphics g) { - g.setColor(new JBColor(Color.WHITE, UIUtil.getSeparatorColor())); - g.fillRect(0,0,getWidth(), getHeight()); - super.paintComponent(g); - } - }; - sep.setCaption(separator); - panel.add(sep, BorderLayout.NORTH); - return panel; - } - return component; - } - }); - - popup.setMinimumSize(new Dimension(200, -1)); - - for (Object item : elements) { - final int mnemonic = getMnemonic(item, itemsMap); - if (mnemonic != -1) { - final Action action = createNumberAction(mnemonic, popup, itemsMap, processor); - popup.registerAction(mnemonic + "Action", KeyStroke.getKeyStroke(String.valueOf(mnemonic)), action); - popup.registerAction(mnemonic + "Action", KeyStroke.getKeyStroke("NUMPAD" + String.valueOf(mnemonic)), action); - hasMnemonic.set(true); - } - } - return popup; + NavigationUtil.getRelatedItemsPopup(items, "Choose Target").showInBestPositionFor(e.getDataContext()); } @TestOnly @NotNull public static List<GotoRelatedItem> getItems(@NotNull PsiFile psiFile, @Nullable Editor editor, @Nullable DataContext dataContext) { - return getItems(getContextElement(psiFile, editor), dataContext); + return NavigationUtil.collectRelatedItems(getContextElement(psiFile, editor), dataContext); } @Nullable @@ -294,65 +84,4 @@ public class GotoRelatedSymbolAction extends AnAction { } return contextElement; } - - @NotNull - public static List<GotoRelatedItem> getItems(@NotNull PsiElement contextElement, @Nullable DataContext dataContext) { - Set<GotoRelatedItem> items = ContainerUtil.newLinkedHashSet(); - for (GotoRelatedProvider provider : Extensions.getExtensions(GotoRelatedProvider.EP_NAME)) { - items.addAll(provider.getItems(contextElement)); - if (dataContext != null) { - items.addAll(provider.getItems(dataContext)); - } - } - sortByGroupNames(items); - return new ArrayList<GotoRelatedItem>(items); - } - - private static void sortByGroupNames(Set<GotoRelatedItem> items) { - Map<String, List<GotoRelatedItem>> map = new HashMap<String, List<GotoRelatedItem>>(); - for (GotoRelatedItem item : items) { - final String key = item.getGroup(); - if (!map.containsKey(key)) { - map.put(key, new ArrayList<GotoRelatedItem>()); - } - map.get(key).add(item); - } - final List<String> keys = new ArrayList<String>(map.keySet()); - Collections.sort(keys, new Comparator<String>() { - @Override - public int compare(String o1, String o2) { - return StringUtil.isEmpty(o1) ? 1 : StringUtil.isEmpty(o2) ? -1 : o1.compareTo(o2); - } - }); - items.clear(); - for (String key : keys) { - items.addAll(map.get(key)); - } - } - - private static Action createNumberAction(final int mnemonic, - final ListPopupImpl listPopup, - final Map<PsiElement, GotoRelatedItem> itemsMap, - final Processor<Object> processor) { - return new AbstractAction() { - @Override - public void actionPerformed(ActionEvent e) { - for (final Object item : listPopup.getListStep().getValues()) { - if (getMnemonic(item, itemsMap) == mnemonic) { - listPopup.setFinalRunnable(new Runnable() { - @Override - public void run() { - processor.process(item); - } - }); - listPopup.closeOk(null); - } - } - } - }; - } - - private static int getMnemonic(Object item, Map<PsiElement, GotoRelatedItem> itemsMap) { - return (item instanceof GotoRelatedItem ? (GotoRelatedItem)item : itemsMap.get((PsiElement)item)).getMnemonic(); - } } |