From 08a12cb55a412b2941b71110fa84d411af9faf89 Mon Sep 17 00:00:00 2001 From: Alexander Doroshko Date: Thu, 18 Jun 2009 22:23:34 +0400 Subject: [PATCH] common code moved to MethodHierarchyBrowserBase --- .../ide/hierarchy/MethodHierarchyBrowserBase.java | 213 +++--- .../hierarchy/method/MethodHierarchyBrowser.java | 743 +++------------------ .../method/OverrideImplementMethodAction.java | 22 +- 3 files changed, 221 insertions(+), 757 deletions(-) copy source/com/intellij/ide/hierarchy/method/MethodHierarchyBrowser.java => lang-impl/src/com/intellij/ide/hierarchy/MethodHierarchyBrowserBase.java (73%) rewrite source/com/intellij/ide/hierarchy/method/MethodHierarchyBrowser.java (93%) diff --git a/source/com/intellij/ide/hierarchy/method/MethodHierarchyBrowser.java b/lang-impl/src/com/intellij/ide/hierarchy/MethodHierarchyBrowserBase.java similarity index 73% copy from source/com/intellij/ide/hierarchy/method/MethodHierarchyBrowser.java copy to lang-impl/src/com/intellij/ide/hierarchy/MethodHierarchyBrowserBase.java index f7a20dea9b..c9947bb3cb 100644 --- a/source/com/intellij/ide/hierarchy/method/MethodHierarchyBrowser.java +++ b/lang-impl/src/com/intellij/ide/hierarchy/MethodHierarchyBrowserBase.java @@ -1,16 +1,14 @@ -package com.intellij.ide.hierarchy.method; +package com.intellij.ide.hierarchy; import com.intellij.ide.IdeBundle; import com.intellij.ide.OccurenceNavigator; import com.intellij.ide.OccurenceNavigatorSupport; import com.intellij.ide.actions.CloseTabToolbarAction; import com.intellij.ide.actions.ContextHelpAction; -import com.intellij.ide.hierarchy.*; import com.intellij.ide.util.treeView.NodeDescriptor; import com.intellij.openapi.Disposable; import com.intellij.openapi.actionSystem.*; import com.intellij.openapi.application.ApplicationManager; -import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.fileEditor.OpenFileDescriptor; import com.intellij.openapi.project.Project; import com.intellij.openapi.ui.MultiLineLabelUI; @@ -20,13 +18,12 @@ import com.intellij.openapi.vfs.VirtualFile; import com.intellij.pom.Navigatable; import com.intellij.psi.*; import com.intellij.ui.AutoScrollToSourceHandler; -import com.intellij.ui.PopupHandler; import com.intellij.ui.TreeSpeedSearch; import com.intellij.ui.TreeToolTipHandler; import com.intellij.ui.content.Content; +import com.intellij.ui.treeStructure.Tree; import com.intellij.util.Alarm; import com.intellij.util.EditSourceOnDoubleClickHandler; -import com.intellij.ui.treeStructure.Tree; import com.intellij.util.ui.UIUtil; import com.intellij.util.ui.tree.TreeUtil; import org.jetbrains.annotations.NonNls; @@ -42,14 +39,12 @@ import java.text.MessageFormat; import java.util.*; import java.util.List; -public final class MethodHierarchyBrowser extends JPanel implements DataProvider, OccurenceNavigator, Disposable, HierarchyBrowser { - private static final Logger LOG = Logger.getInstance("#com.intellij.ide.hierarchy.method.MethodHierarchyBrowser"); - +public abstract class MethodHierarchyBrowserBase extends JPanel implements DataProvider, OccurenceNavigator, Disposable, HierarchyBrowser { @NonNls private static final String HELP_ID = "reference.toolWindows.hierarchy"; + protected final Project myProject; private Content myContent; - private final Project myProject; - private final Hashtable myBuilders = new Hashtable(); + protected final Hashtable myBuilders = new Hashtable(); private final Hashtable myTrees = new Hashtable(); private final RefreshAction myRefreshAction = new RefreshAction(); @@ -57,11 +52,11 @@ public final class MethodHierarchyBrowser extends JPanel implements DataProvider private SmartPsiElementPointer mySmartPsiElementPointer; private final CardLayout myCardLayout; private final JPanel myTreePanel; - private String myCurrentViewName; + protected String myCurrentViewName; private final AutoScrollToSourceHandler myAutoScrollToSourceHandler; - @NonNls static final String METHOD_HIERARCHY_BROWSER_DATA_CONSTANT = "com.intellij.ide.hierarchy.type.MethodHierarchyBrowser"; + @NonNls public static final String METHOD_HIERARCHY_BROWSER_DATA_CONSTANT = "com.intellij.ide.hierarchy.MethodHierarchyBrowserBase"; private final List myRunOnDisposeList = new ArrayList(); private final HashMap myOccurrenceNavigators = new HashMap(); private static final OccurenceNavigator EMPTY_NAVIGATOR = new OccurenceNavigator() { @@ -90,7 +85,7 @@ public final class MethodHierarchyBrowser extends JPanel implements DataProvider } }; - public MethodHierarchyBrowser(final Project project, final PsiMethod method) { + public MethodHierarchyBrowserBase(final Project project, final PsiElement method) { myProject = project; myAutoScrollToSourceHandler = new AutoScrollToSourceHandler() { @@ -111,7 +106,9 @@ public final class MethodHierarchyBrowser extends JPanel implements DataProvider myCardLayout = new CardLayout(); myTreePanel = new JPanel(myCardLayout); - myTrees.put(MethodHierarchyTreeStructure.TYPE, createTree()); + + createTrees(myTrees); + final Enumeration keys = myTrees.keys(); while (keys.hasMoreElements()) { final String key = keys.nextElement(); @@ -119,16 +116,12 @@ public final class MethodHierarchyBrowser extends JPanel implements DataProvider myOccurrenceNavigators.put(key, new OccurenceNavigatorSupport(tree){ @Nullable protected Navigatable createDescriptorForNode(DefaultMutableTreeNode node) { - final Object userObject = node.getUserObject(); - if (userObject instanceof MethodHierarchyNodeDescriptor) { - MethodHierarchyNodeDescriptor nodeDescriptor = (MethodHierarchyNodeDescriptor)userObject; - final PsiElement psiElement = nodeDescriptor.getTargetElement(); - if (psiElement == null || !psiElement.isValid()) return null; + final PsiElement psiElement = getElementFromNode(node); + if (psiElement == null || !psiElement.isValid()) return null; final VirtualFile virtualFile = psiElement.getContainingFile().getVirtualFile(); if (virtualFile != null) { return new OpenFileDescriptor(psiElement.getProject(), virtualFile, psiElement.getTextOffset()); } - } return null; } @@ -147,11 +140,19 @@ public final class MethodHierarchyBrowser extends JPanel implements DataProvider add(createLegendPanel(), BorderLayout.SOUTH); } + protected abstract void createTrees(final Hashtable trees); + + protected abstract PsiElement getElementFromNode(final DefaultMutableTreeNode node); + public JComponent getComponent() { return this; } - private static JPanel createLegendPanel() { + protected abstract JPanel createLegendPanel(); + + protected static JPanel createStandardLegendPanel(final String methodDefinedText, + final String methodNotDefinedLegallyText, + final String methodShouldBeDefined) { final JPanel panel = new JPanel(new GridBagLayout()); JLabel label; @@ -159,7 +160,7 @@ public final class MethodHierarchyBrowser extends JPanel implements DataProvider GridBagConstraints.HORIZONTAL, new Insets(3, 5, 0, 5), 0, 0); label = - new JLabel(IdeBundle.message("hierarchy.legend.method.is.defined.in.class"), IconLoader.getIcon("/hierarchy/methodDefined.png"), + new JLabel(methodDefinedText, IconLoader.getIcon("/hierarchy/methodDefined.png"), SwingConstants.LEFT); label.setUI(new MultiLineLabelUI()); label.setIconTextGap(10); @@ -167,7 +168,7 @@ public final class MethodHierarchyBrowser extends JPanel implements DataProvider gc.gridy++; label = - new JLabel(IdeBundle.message("hierarchy.legend.method.defined.in.superclass"), + new JLabel(methodNotDefinedLegallyText, IconLoader.getIcon("/hierarchy/methodNotDefined.png"), SwingConstants.LEFT); label.setUI(new MultiLineLabelUI()); label.setIconTextGap(10); @@ -175,7 +176,7 @@ public final class MethodHierarchyBrowser extends JPanel implements DataProvider gc.gridy++; label = - new JLabel(IdeBundle.message("hierarchy.legend.method.should.be.defined"), + new JLabel(methodShouldBeDefined, IconLoader.getIcon("/hierarchy/shouldDefineMethod.png"), SwingConstants.LEFT); label.setUI(new MultiLineLabelUI()); label.setIconTextGap(10); @@ -184,14 +185,12 @@ public final class MethodHierarchyBrowser extends JPanel implements DataProvider return panel; } - private JTree createTree() { + protected JTree createTreeWithoutActions() { final Tree tree = new Tree(new DefaultTreeModel(new DefaultMutableTreeNode(""))); tree.getSelectionModel().setSelectionMode(TreeSelectionModel.DISCONTIGUOUS_TREE_SELECTION); tree.setToggleClickCount(-1); tree.setCellRenderer(new HierarchyNodeRenderer()); UIUtil.setLineStyleAngled(tree); - ActionGroup group = (ActionGroup)ActionManager.getInstance().getAction(IdeActions.GROUP_METHOD_HIERARCHY_POPUP); - PopupHandler.installPopupHandler(tree, group, ActionPlaces.METHOD_HIERARCHY_VIEW_POPUP, ActionManager.getInstance()); EditSourceOnDoubleClickHandler.install(tree); myRefreshAction.registerShortcutOn(tree); @@ -201,10 +200,6 @@ public final class MethodHierarchyBrowser extends JPanel implements DataProvider } }); - final BaseOnThisMethodAction baseOnThisMethodAction = new BaseOnThisMethodAction(); - baseOnThisMethodAction.registerCustomShortcutSet( - ActionManager.getInstance().getAction(IdeActions.ACTION_METHOD_HIERARCHY).getShortcutSet(), tree); - new TreeSpeedSearch(tree); TreeUtil.installActions(tree); TreeToolTipHandler.install(tree); @@ -212,7 +207,7 @@ public final class MethodHierarchyBrowser extends JPanel implements DataProvider return tree; } - private void setHierarchyBase(final PsiMethod method) { + private void setHierarchyBase(final PsiElement method) { mySmartPsiElementPointer = SmartPointerManager.getInstance(myProject).createSmartPsiElementPointer(method); } @@ -242,51 +237,59 @@ public final class MethodHierarchyBrowser extends JPanel implements DataProvider myCurrentViewName = typeName; final PsiElement element = mySmartPsiElementPointer.getElement(); - if (!(element instanceof PsiMethod)) { + if (!isApplicableElement(element)) { return; } - final PsiMethod method = (PsiMethod)element; if (myContent != null) { - myContent.setDisplayName(MessageFormat.format(typeName, method.getName())); + if (element instanceof PsiNamedElement) { + myContent.setDisplayName(MessageFormat.format(typeName, ((PsiNamedElement)element).getName())); + } } myCardLayout.show(myTreePanel, typeName); if (!myBuilders.containsKey(typeName)) { - setWaitCursor(); - - // create builder - final JTree tree = myTrees.get(typeName); - final DefaultTreeModel model = new DefaultTreeModel(new DefaultMutableTreeNode("")); - tree.setModel(model); - - PsiDocumentManager.getInstance(myProject).commitAllDocuments(); - if (!MethodHierarchyTreeStructure.TYPE.equals(typeName)) { - LOG.error("unexpected type: " + typeName); - return; + try { + setWaitCursor(); + // create builder + final JTree tree = myTrees.get(typeName); + final DefaultTreeModel model = new DefaultTreeModel(new DefaultMutableTreeNode("")); + tree.setModel(model); + + PsiDocumentManager.getInstance(myProject).commitAllDocuments(); + final HierarchyTreeStructure structure = createHierarchyTreeStructure(typeName, element); + if (structure == null) { + return; + } + final Comparator comparator = getComparator(); + final HierarchyTreeBuilder builder = new HierarchyTreeBuilder(myProject, tree, model, structure, comparator); + + myBuilders.put(typeName, builder); + + final HierarchyNodeDescriptor baseDescriptor = structure.getBaseDescriptor(); + builder.buildNodeForElement(baseDescriptor); + final DefaultMutableTreeNode node = builder.getNodeForElement(baseDescriptor); + if (node != null) { + final TreePath path = new TreePath(node.getPath()); + tree.expandPath(path); + TreeUtil.selectPath(tree, path); + } } - final HierarchyTreeStructure structure = new MethodHierarchyTreeStructure(myProject, method); - final Comparator comparator = JavaHierarchyUtil.getComparator(myProject); - final HierarchyTreeBuilder builder = new HierarchyTreeBuilder(myProject, tree, model, structure, comparator); - - myBuilders.put(typeName, builder); - - final HierarchyNodeDescriptor baseDescriptor = structure.getBaseDescriptor(); - builder.buildNodeForElement(baseDescriptor); - final DefaultMutableTreeNode node = builder.getNodeForElement(baseDescriptor); - if (node != null) { - final TreePath path = new TreePath(node.getPath()); - tree.expandPath(path); - TreeUtil.selectPath(tree, path); + finally { + restoreCursor(); } - - restoreCursor(); } getCurrentTree().requestFocus(); } + protected abstract boolean isApplicableElement(final PsiElement element); + + protected abstract HierarchyTreeStructure createHierarchyTreeStructure(final String typeName, final PsiElement psiElement); + + protected abstract Comparator getComparator(); + private ActionToolbar createToolbar() { final DefaultActionGroup actionGroup = new DefaultActionGroup(); @@ -349,10 +352,13 @@ public final class MethodHierarchyBrowser extends JPanel implements DataProvider storedInfo[0] = builder.storeExpandedAndSelectedInfo(); } - final PsiMethod base = (PsiMethod)mySmartPsiElementPointer.getElement(); + final PsiElement element = mySmartPsiElementPointer.getElement(); + if (!isApplicableElement(element)) { + return; + } final String[] name = new String[]{myCurrentViewName}; dispose(); - setHierarchyBase(base); + setHierarchyBase(element); validate(); ApplicationManager.getApplication().invokeLater(new Runnable() { public void run() { @@ -373,7 +379,7 @@ public final class MethodHierarchyBrowser extends JPanel implements DataProvider private boolean isValidBase() { final PsiElement element = mySmartPsiElementPointer.getElement(); - return element instanceof PsiMethod && element.isValid(); + return isApplicableElement(element) && element.isValid(); } final class ShowImplementationsOnlyAction extends ToggleAction { @@ -394,10 +400,13 @@ public final class MethodHierarchyBrowser extends JPanel implements DataProvider storedInfo[0] = builder.storeExpandedAndSelectedInfo(); } - final PsiMethod base = (PsiMethod)mySmartPsiElementPointer.getElement(); + final PsiElement element = mySmartPsiElementPointer.getElement(); + if (!isApplicableElement(element)) { + return; + } final String[] name = new String[]{myCurrentViewName}; dispose(); - setHierarchyBase(base); + setHierarchyBase(element); validate(); ApplicationManager.getApplication().invokeLater(new Runnable() { public void run() { @@ -431,34 +440,23 @@ public final class MethodHierarchyBrowser extends JPanel implements DataProvider private PsiElement getSelectedElement() { final DefaultMutableTreeNode node = getSelectedNode(); - if (node == null) return null; - final Object userObject = node.getUserObject(); - if (!(userObject instanceof MethodHierarchyNodeDescriptor)) return null; - final PsiElement element = ((MethodHierarchyNodeDescriptor)userObject).getTargetElement(); - return element; + return getElementFromNode(node); } - private PsiMethod[] getSelectedMethods() { - MethodHierarchyNodeDescriptor[] descriptors = getSelectedDescriptors(); - ArrayList psiElements = new ArrayList(); - for (MethodHierarchyNodeDescriptor descriptor : descriptors) { - PsiElement element = descriptor.getTargetElement(); - if (!(element instanceof PsiMethod)) continue; - psiElements.add((PsiMethod)element); - } - return psiElements.toArray(new PsiMethod[psiElements.size()]); - } + protected abstract PsiElement[] getSelectedMethods(); private PsiElement[] getSelectedElements() { - MethodHierarchyNodeDescriptor[] descriptors = getSelectedDescriptors(); + HierarchyNodeDescriptor[] descriptors = getSelectedDescriptors(); ArrayList elements = new ArrayList(); - for (MethodHierarchyNodeDescriptor descriptor : descriptors) { - PsiElement element = descriptor.getTargetElement(); + for (HierarchyNodeDescriptor descriptor : descriptors) { + PsiElement element = getElementFromDescriptor(descriptor); elements.add(element); } return elements.toArray(new PsiElement[elements.size()]); } + protected abstract PsiElement getElementFromDescriptor(final HierarchyNodeDescriptor descriptor); + private DefaultMutableTreeNode getSelectedNode() { final JTree tree = getCurrentTree(); if (tree == null) return null; @@ -523,7 +521,7 @@ public final class MethodHierarchyBrowser extends JPanel implements DataProvider public final void setSelected(final AnActionEvent event, final boolean flag) { final HierarchyBrowserManager hierarchyBrowserManager = HierarchyBrowserManager.getInstance(myProject); hierarchyBrowserManager.getState().SORT_ALPHABETICALLY = flag; - final Comparator comparator = JavaHierarchyUtil.getComparator(myProject); + final Comparator comparator = getComparator(); final Collection builders = myBuilders.values(); for (final HierarchyTreeBuilder builder : builders) { builder.setNodeDescriptorComparator(comparator); @@ -537,26 +535,24 @@ public final class MethodHierarchyBrowser extends JPanel implements DataProvider } } - public static final class BaseOnThisMethodAction extends AnAction { + public static abstract class BaseOnThisMethodAction extends AnAction { public BaseOnThisMethodAction() { super(IdeBundle.message("action.base.on.this.method")); } public final void actionPerformed(final AnActionEvent event) { final DataContext dataContext = event.getDataContext(); - final MethodHierarchyBrowser browser = (MethodHierarchyBrowser)dataContext.getData( - METHOD_HIERARCHY_BROWSER_DATA_CONSTANT); + final MethodHierarchyBrowserBase browser = (MethodHierarchyBrowserBase)dataContext.getData(METHOD_HIERARCHY_BROWSER_DATA_CONSTANT); if (browser == null) return; final PsiElement selectedElement = browser.getSelectedElement(); - if (!(selectedElement instanceof PsiMethod)) { + if (!isApplicableElement(selectedElement)) { return; } - final PsiMethod method = (PsiMethod)selectedElement; final String[] name = new String[]{browser.myCurrentViewName}; browser.dispose(); - browser.setHierarchyBase(method); + browser.setHierarchyBase(selectedElement); browser.validate(); ApplicationManager.getApplication().invokeLater(new Runnable() { public void run() { @@ -567,13 +563,13 @@ public final class MethodHierarchyBrowser extends JPanel implements DataProvider public final void update(final AnActionEvent event) { final Presentation presentation = event.getPresentation(); + presentation.setText(IdeBundle.message("action.base.on.this.method")); registerCustomShortcutSet( ActionManager.getInstance().getAction(IdeActions.ACTION_METHOD_HIERARCHY).getShortcutSet(), null); final DataContext dataContext = event.getDataContext(); - final MethodHierarchyBrowser browser = (MethodHierarchyBrowser)dataContext.getData( - METHOD_HIERARCHY_BROWSER_DATA_CONSTANT); + final MethodHierarchyBrowserBase browser = (MethodHierarchyBrowserBase)dataContext.getData(METHOD_HIERARCHY_BROWSER_DATA_CONSTANT); if (browser == null) { presentation.setVisible(false); presentation.setEnabled(false); @@ -581,7 +577,7 @@ public final class MethodHierarchyBrowser extends JPanel implements DataProvider } final PsiElement selectedElement = browser.getSelectedElement(); - if (!(selectedElement instanceof PsiMethod)) { + if (!isApplicableElement(selectedElement)) { presentation.setEnabled(false); presentation.setVisible(false); return; @@ -589,9 +585,8 @@ public final class MethodHierarchyBrowser extends JPanel implements DataProvider presentation.setVisible(true); - final PsiMethod method = (PsiMethod)selectedElement; - if (!method.equals(browser.mySmartPsiElementPointer.getElement()) && - method.isValid() + if (!selectedElement.equals(browser.mySmartPsiElementPointer.getElement()) && + selectedElement.isValid() ) { presentation.setEnabled(true); } @@ -599,37 +594,31 @@ public final class MethodHierarchyBrowser extends JPanel implements DataProvider presentation.setEnabled(false); } } + + protected abstract boolean isApplicableElement(final PsiElement psiElement); } - public final MethodHierarchyNodeDescriptor[] getSelectedDescriptors() { + public final HierarchyNodeDescriptor[] getSelectedDescriptors() { final JTree tree = getCurrentTree(); if (tree == null) { - return new MethodHierarchyNodeDescriptor[0]; + return new HierarchyNodeDescriptor[0]; } final TreePath[] paths = tree.getSelectionPaths(); if (paths == null) { - return new MethodHierarchyNodeDescriptor[0]; + return new HierarchyNodeDescriptor[0]; } - final ArrayList list = new ArrayList(paths.length); + final ArrayList list = new ArrayList(paths.length); for (final TreePath path : paths) { final Object lastPathComponent = path.getLastPathComponent(); if (lastPathComponent instanceof DefaultMutableTreeNode) { final DefaultMutableTreeNode node = (DefaultMutableTreeNode)lastPathComponent; final Object userObject = node.getUserObject(); - if (userObject instanceof MethodHierarchyNodeDescriptor) { - list.add((MethodHierarchyNodeDescriptor)userObject); + if (userObject instanceof HierarchyNodeDescriptor) { + list.add((HierarchyNodeDescriptor)userObject); } } } - return list.toArray(new MethodHierarchyNodeDescriptor[list.size()]); + return list.toArray(new HierarchyNodeDescriptor[list.size()]); } - @Nullable - public final PsiMethod getBaseMethod() { - final HierarchyTreeBuilder builder = myBuilders.get(myCurrentViewName); - final MethodHierarchyTreeStructure treeStructure = (MethodHierarchyTreeStructure)builder.getTreeStructure(); - - final PsiMethod baseMethod = treeStructure.getBaseMethod(); - return baseMethod; - } } diff --git a/source/com/intellij/ide/hierarchy/method/MethodHierarchyBrowser.java b/source/com/intellij/ide/hierarchy/method/MethodHierarchyBrowser.java dissimilarity index 93% index f7a20dea9b..d27613cd34 100644 --- a/source/com/intellij/ide/hierarchy/method/MethodHierarchyBrowser.java +++ b/source/com/intellij/ide/hierarchy/method/MethodHierarchyBrowser.java @@ -1,635 +1,108 @@ -package com.intellij.ide.hierarchy.method; - -import com.intellij.ide.IdeBundle; -import com.intellij.ide.OccurenceNavigator; -import com.intellij.ide.OccurenceNavigatorSupport; -import com.intellij.ide.actions.CloseTabToolbarAction; -import com.intellij.ide.actions.ContextHelpAction; -import com.intellij.ide.hierarchy.*; -import com.intellij.ide.util.treeView.NodeDescriptor; -import com.intellij.openapi.Disposable; -import com.intellij.openapi.actionSystem.*; -import com.intellij.openapi.application.ApplicationManager; -import com.intellij.openapi.diagnostic.Logger; -import com.intellij.openapi.fileEditor.OpenFileDescriptor; -import com.intellij.openapi.project.Project; -import com.intellij.openapi.ui.MultiLineLabelUI; -import com.intellij.openapi.util.Disposer; -import com.intellij.openapi.util.IconLoader; -import com.intellij.openapi.vfs.VirtualFile; -import com.intellij.pom.Navigatable; -import com.intellij.psi.*; -import com.intellij.ui.AutoScrollToSourceHandler; -import com.intellij.ui.PopupHandler; -import com.intellij.ui.TreeSpeedSearch; -import com.intellij.ui.TreeToolTipHandler; -import com.intellij.ui.content.Content; -import com.intellij.util.Alarm; -import com.intellij.util.EditSourceOnDoubleClickHandler; -import com.intellij.ui.treeStructure.Tree; -import com.intellij.util.ui.UIUtil; -import com.intellij.util.ui.tree.TreeUtil; -import org.jetbrains.annotations.NonNls; -import org.jetbrains.annotations.Nullable; - -import javax.swing.*; -import javax.swing.tree.DefaultMutableTreeNode; -import javax.swing.tree.DefaultTreeModel; -import javax.swing.tree.TreePath; -import javax.swing.tree.TreeSelectionModel; -import java.awt.*; -import java.text.MessageFormat; -import java.util.*; -import java.util.List; - -public final class MethodHierarchyBrowser extends JPanel implements DataProvider, OccurenceNavigator, Disposable, HierarchyBrowser { - private static final Logger LOG = Logger.getInstance("#com.intellij.ide.hierarchy.method.MethodHierarchyBrowser"); - - @NonNls private static final String HELP_ID = "reference.toolWindows.hierarchy"; - - private Content myContent; - private final Project myProject; - private final Hashtable myBuilders = new Hashtable(); - private final Hashtable myTrees = new Hashtable(); - - private final RefreshAction myRefreshAction = new RefreshAction(); - private final Alarm myAlarm = new Alarm(Alarm.ThreadToUse.SHARED_THREAD); - private SmartPsiElementPointer mySmartPsiElementPointer; - private final CardLayout myCardLayout; - private final JPanel myTreePanel; - private String myCurrentViewName; - - private final AutoScrollToSourceHandler myAutoScrollToSourceHandler; - - @NonNls static final String METHOD_HIERARCHY_BROWSER_DATA_CONSTANT = "com.intellij.ide.hierarchy.type.MethodHierarchyBrowser"; - private final List myRunOnDisposeList = new ArrayList(); - private final HashMap myOccurrenceNavigators = new HashMap(); - private static final OccurenceNavigator EMPTY_NAVIGATOR = new OccurenceNavigator() { - public boolean hasNextOccurence() { - return false; - } - - public boolean hasPreviousOccurence() { - return false; - } - - public OccurenceInfo goNextOccurence() { - return null; - } - - public OccurenceInfo goPreviousOccurence() { - return null; - } - - public String getNextOccurenceActionName() { - return ""; - } - - public String getPreviousOccurenceActionName() { - return ""; - } - }; - - public MethodHierarchyBrowser(final Project project, final PsiMethod method) { - myProject = project; - - myAutoScrollToSourceHandler = new AutoScrollToSourceHandler() { - protected boolean isAutoScrollMode() { - return HierarchyBrowserManager.getInstance(myProject).getState().IS_AUTOSCROLL_TO_SOURCE; - } - - protected void setAutoScrollMode(final boolean state) { - HierarchyBrowserManager.getInstance(myProject).getState().IS_AUTOSCROLL_TO_SOURCE = state; - } - }; - - setHierarchyBase(method); - setLayout(new BorderLayout()); - - final ActionToolbar toolbar = createToolbar(); - add(toolbar.getComponent(), BorderLayout.NORTH); - - myCardLayout = new CardLayout(); - myTreePanel = new JPanel(myCardLayout); - myTrees.put(MethodHierarchyTreeStructure.TYPE, createTree()); - final Enumeration keys = myTrees.keys(); - while (keys.hasMoreElements()) { - final String key = keys.nextElement(); - final JTree tree = myTrees.get(key); - myOccurrenceNavigators.put(key, new OccurenceNavigatorSupport(tree){ - @Nullable - protected Navigatable createDescriptorForNode(DefaultMutableTreeNode node) { - final Object userObject = node.getUserObject(); - if (userObject instanceof MethodHierarchyNodeDescriptor) { - MethodHierarchyNodeDescriptor nodeDescriptor = (MethodHierarchyNodeDescriptor)userObject; - final PsiElement psiElement = nodeDescriptor.getTargetElement(); - if (psiElement == null || !psiElement.isValid()) return null; - final VirtualFile virtualFile = psiElement.getContainingFile().getVirtualFile(); - if (virtualFile != null) { - return new OpenFileDescriptor(psiElement.getProject(), virtualFile, psiElement.getTextOffset()); - } - } - return null; - } - - public String getNextOccurenceActionName() { - return IdeBundle.message("hierarchy.method.next.occurence.name"); - } - - public String getPreviousOccurenceActionName() { - return IdeBundle.message("hierarchy.method.prev.occurence.name"); - } - }); - myTreePanel.add(new JScrollPane(tree), key); - } - add(myTreePanel, BorderLayout.CENTER); - - add(createLegendPanel(), BorderLayout.SOUTH); - } - - public JComponent getComponent() { - return this; - } - - private static JPanel createLegendPanel() { - final JPanel panel = new JPanel(new GridBagLayout()); - - JLabel label; - final GridBagConstraints gc = new GridBagConstraints(0, 0, 1, 1, 1, 0, GridBagConstraints.WEST, - GridBagConstraints.HORIZONTAL, new Insets(3, 5, 0, 5), 0, 0); - - label = - new JLabel(IdeBundle.message("hierarchy.legend.method.is.defined.in.class"), IconLoader.getIcon("/hierarchy/methodDefined.png"), - SwingConstants.LEFT); - label.setUI(new MultiLineLabelUI()); - label.setIconTextGap(10); - panel.add(label, gc); - - gc.gridy++; - label = - new JLabel(IdeBundle.message("hierarchy.legend.method.defined.in.superclass"), - IconLoader.getIcon("/hierarchy/methodNotDefined.png"), SwingConstants.LEFT); - label.setUI(new MultiLineLabelUI()); - label.setIconTextGap(10); - panel.add(label, gc); - - gc.gridy++; - label = - new JLabel(IdeBundle.message("hierarchy.legend.method.should.be.defined"), - IconLoader.getIcon("/hierarchy/shouldDefineMethod.png"), SwingConstants.LEFT); - label.setUI(new MultiLineLabelUI()); - label.setIconTextGap(10); - panel.add(label, gc); - - return panel; - } - - private JTree createTree() { - final Tree tree = new Tree(new DefaultTreeModel(new DefaultMutableTreeNode(""))); - tree.getSelectionModel().setSelectionMode(TreeSelectionModel.DISCONTIGUOUS_TREE_SELECTION); - tree.setToggleClickCount(-1); - tree.setCellRenderer(new HierarchyNodeRenderer()); - UIUtil.setLineStyleAngled(tree); - ActionGroup group = (ActionGroup)ActionManager.getInstance().getAction(IdeActions.GROUP_METHOD_HIERARCHY_POPUP); - PopupHandler.installPopupHandler(tree, group, ActionPlaces.METHOD_HIERARCHY_VIEW_POPUP, ActionManager.getInstance()); - EditSourceOnDoubleClickHandler.install(tree); - - myRefreshAction.registerShortcutOn(tree); - myRunOnDisposeList.add(new Runnable() { - public void run() { - myRefreshAction.unregisterCustomShortcutSet(tree); - } - }); - - final BaseOnThisMethodAction baseOnThisMethodAction = new BaseOnThisMethodAction(); - baseOnThisMethodAction.registerCustomShortcutSet( - ActionManager.getInstance().getAction(IdeActions.ACTION_METHOD_HIERARCHY).getShortcutSet(), tree); - - new TreeSpeedSearch(tree); - TreeUtil.installActions(tree); - TreeToolTipHandler.install(tree); - myAutoScrollToSourceHandler.install(tree); - return tree; - } - - private void setHierarchyBase(final PsiMethod method) { - mySmartPsiElementPointer = SmartPointerManager.getInstance(myProject).createSmartPsiElementPointer(method); - } - - public final void setContent(final Content content) { - myContent = content; - } - - private void restoreCursor() { - /*int n =*/ myAlarm.cancelAllRequests(); -// if (n == 0) { - setCursor(Cursor.getDefaultCursor()); -// } - } - - private void setWaitCursor() { - myAlarm.addRequest( - new Runnable() { - public void run() { - setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); - } - }, - 100 - ); - } - - public final void changeView(final String typeName) { - myCurrentViewName = typeName; - - final PsiElement element = mySmartPsiElementPointer.getElement(); - if (!(element instanceof PsiMethod)) { - return; - } - final PsiMethod method = (PsiMethod)element; - - if (myContent != null) { - myContent.setDisplayName(MessageFormat.format(typeName, method.getName())); - } - - myCardLayout.show(myTreePanel, typeName); - - if (!myBuilders.containsKey(typeName)) { - setWaitCursor(); - - // create builder - final JTree tree = myTrees.get(typeName); - final DefaultTreeModel model = new DefaultTreeModel(new DefaultMutableTreeNode("")); - tree.setModel(model); - - PsiDocumentManager.getInstance(myProject).commitAllDocuments(); - if (!MethodHierarchyTreeStructure.TYPE.equals(typeName)) { - LOG.error("unexpected type: " + typeName); - return; - } - final HierarchyTreeStructure structure = new MethodHierarchyTreeStructure(myProject, method); - final Comparator comparator = JavaHierarchyUtil.getComparator(myProject); - final HierarchyTreeBuilder builder = new HierarchyTreeBuilder(myProject, tree, model, structure, comparator); - - myBuilders.put(typeName, builder); - - final HierarchyNodeDescriptor baseDescriptor = structure.getBaseDescriptor(); - builder.buildNodeForElement(baseDescriptor); - final DefaultMutableTreeNode node = builder.getNodeForElement(baseDescriptor); - if (node != null) { - final TreePath path = new TreePath(node.getPath()); - tree.expandPath(path); - TreeUtil.selectPath(tree, path); - } - - restoreCursor(); - } - - getCurrentTree().requestFocus(); - } - - private ActionToolbar createToolbar() { - final DefaultActionGroup actionGroup = new DefaultActionGroup(); - - actionGroup.add(new AlphaSortAction()); - actionGroup.add(new ShowImplementationsOnlyAction()); - actionGroup.add(myRefreshAction); - actionGroup.add(myAutoScrollToSourceHandler.createToggleAction()); - actionGroup.add(new CloseAction()); - actionGroup.add(new ContextHelpAction(HELP_ID)); - - final ActionToolbar toolBar = ActionManager.getInstance().createActionToolbar(ActionPlaces.METHOD_HIERARCHY_VIEW_TOOLBAR, - actionGroup, true); - return toolBar; - } - - public boolean hasNextOccurence() { - return getOccurrenceNavigator().hasNextOccurence(); - } - - private OccurenceNavigator getOccurrenceNavigator() { - if (myCurrentViewName == null) { - return EMPTY_NAVIGATOR; - } - final OccurenceNavigator navigator = myOccurrenceNavigators.get(myCurrentViewName); - return navigator != null? navigator : EMPTY_NAVIGATOR; - } - - public boolean hasPreviousOccurence() { - return getOccurrenceNavigator().hasPreviousOccurence(); - } - - public OccurenceInfo goNextOccurence() { - return getOccurrenceNavigator().goNextOccurence(); - } - - public OccurenceInfo goPreviousOccurence() { - return getOccurrenceNavigator().goPreviousOccurence(); - } - - public String getNextOccurenceActionName() { - return getOccurrenceNavigator().getNextOccurenceActionName(); - } - - public String getPreviousOccurenceActionName() { - return getOccurrenceNavigator().getPreviousOccurenceActionName(); - } - - final class RefreshAction extends com.intellij.ide.actions.RefreshAction { - public RefreshAction() { - super(IdeBundle.message("action.refresh"), - IdeBundle.message("action.refresh"), IconLoader.getIcon("/actions/sync.png")); - } - - public final void actionPerformed(final AnActionEvent e) { - if (!isValidBase()) return; - - final Object[] storedInfo = new Object[1]; - if (myCurrentViewName != null) { - final HierarchyTreeBuilder builder = myBuilders.get(myCurrentViewName); - storedInfo[0] = builder.storeExpandedAndSelectedInfo(); - } - - final PsiMethod base = (PsiMethod)mySmartPsiElementPointer.getElement(); - final String[] name = new String[]{myCurrentViewName}; - dispose(); - setHierarchyBase(base); - validate(); - ApplicationManager.getApplication().invokeLater(new Runnable() { - public void run() { - changeView(name[0]); - if (storedInfo != null) { - final HierarchyTreeBuilder builder = myBuilders.get(myCurrentViewName); - builder.restoreExpandedAndSelectedInfo(storedInfo[0]); - } - } - }); - } - - public final void update(final AnActionEvent event) { - final Presentation presentation = event.getPresentation(); - presentation.setEnabled(isValidBase()); - } - } - - private boolean isValidBase() { - final PsiElement element = mySmartPsiElementPointer.getElement(); - return element instanceof PsiMethod && element.isValid(); - } - - final class ShowImplementationsOnlyAction extends ToggleAction { - public ShowImplementationsOnlyAction() { - super(IdeBundle.message("action.hide.non.implementations"), null, IconLoader.getIcon("/ant/filter.png")); // TODO[anton] use own icon!!! - } - - public final boolean isSelected(final AnActionEvent event) { - return HierarchyBrowserManager.getInstance(myProject).getState().HIDE_CLASSES_WHERE_METHOD_NOT_IMPLEMENTED; - } - - public final void setSelected(final AnActionEvent event, final boolean flag) { - HierarchyBrowserManager.getInstance(myProject).getState().HIDE_CLASSES_WHERE_METHOD_NOT_IMPLEMENTED = flag; - - final Object[] storedInfo = new Object[1]; - if (myCurrentViewName != null) { - final HierarchyTreeBuilder builder = myBuilders.get(myCurrentViewName); - storedInfo[0] = builder.storeExpandedAndSelectedInfo(); - } - - final PsiMethod base = (PsiMethod)mySmartPsiElementPointer.getElement(); - final String[] name = new String[]{myCurrentViewName}; - dispose(); - setHierarchyBase(base); - validate(); - ApplicationManager.getApplication().invokeLater(new Runnable() { - public void run() { - changeView(name[0]); - if (storedInfo != null) { - final HierarchyTreeBuilder builder = myBuilders.get(myCurrentViewName); - builder.restoreExpandedAndSelectedInfo(storedInfo[0]); - } - } - }); - } - - public final void update(final AnActionEvent event) { - super.update(event); - final Presentation presentation = event.getPresentation(); - presentation.setEnabled(isValidBase()); - } - } - - private JTree getCurrentTree() { - if (myCurrentViewName == null) return null; - final JTree tree = myTrees.get(myCurrentViewName); - return tree; - } - - public final class CloseAction extends CloseTabToolbarAction { - public final void actionPerformed(final AnActionEvent e) { - myContent.getManager().removeContent(myContent, true); - } - } - - private PsiElement getSelectedElement() { - final DefaultMutableTreeNode node = getSelectedNode(); - if (node == null) return null; - final Object userObject = node.getUserObject(); - if (!(userObject instanceof MethodHierarchyNodeDescriptor)) return null; - final PsiElement element = ((MethodHierarchyNodeDescriptor)userObject).getTargetElement(); - return element; - } - - private PsiMethod[] getSelectedMethods() { - MethodHierarchyNodeDescriptor[] descriptors = getSelectedDescriptors(); - ArrayList psiElements = new ArrayList(); - for (MethodHierarchyNodeDescriptor descriptor : descriptors) { - PsiElement element = descriptor.getTargetElement(); - if (!(element instanceof PsiMethod)) continue; - psiElements.add((PsiMethod)element); - } - return psiElements.toArray(new PsiMethod[psiElements.size()]); - } - - private PsiElement[] getSelectedElements() { - MethodHierarchyNodeDescriptor[] descriptors = getSelectedDescriptors(); - ArrayList elements = new ArrayList(); - for (MethodHierarchyNodeDescriptor descriptor : descriptors) { - PsiElement element = descriptor.getTargetElement(); - elements.add(element); - } - return elements.toArray(new PsiElement[elements.size()]); - } - - private DefaultMutableTreeNode getSelectedNode() { - final JTree tree = getCurrentTree(); - if (tree == null) return null; - final TreePath path = tree.getSelectionPath(); - if (path == null) return null; - final Object lastPathComponent = path.getLastPathComponent(); - if (!(lastPathComponent instanceof DefaultMutableTreeNode)) return null; - return (DefaultMutableTreeNode)lastPathComponent; - } - - public final Object getData(final String dataId) { - if (DataConstants.PSI_ELEMENT.equals(dataId)) { - return getSelectedElement(); - } - else if (DataConstants.DELETE_ELEMENT_PROVIDER.equals(dataId)) { - return null; - } - else if (METHOD_HIERARCHY_BROWSER_DATA_CONSTANT.equals(dataId)) { - return this; - } - else if (DataConstants.HELP_ID.equals(dataId)) { - return HELP_ID; - } - else if (DataConstants.PSI_ELEMENT_ARRAY.equals(dataId)) { - return getSelectedMethods(); - } else if (DataConstants.NAVIGATABLE_ARRAY.equals(dataId)) { - final PsiElement[] selectedElements = getSelectedElements(); - if (selectedElements == null || selectedElements.length == 0) return null; - final ArrayList navigatables = new ArrayList(); - for (PsiElement selectedElement : selectedElements) { - if (selectedElement instanceof Navigatable && selectedElement.isValid()) { - navigatables.add((Navigatable)selectedElement); - } - } - return navigatables.toArray(new Navigatable[navigatables.size()]); - } - return null; - } - - public final void dispose() { - final Collection builders = myBuilders.values(); - for (final HierarchyTreeBuilder builder : builders) { - Disposer.dispose(builder); - } - for (final Runnable aRunOnDisposeList : myRunOnDisposeList) { - aRunOnDisposeList.run(); - } - myRunOnDisposeList.clear(); - myBuilders.clear(); - } - - private final class AlphaSortAction extends ToggleAction { - public AlphaSortAction() { - super(IdeBundle.message("action.sort.alphabetically"), - IdeBundle.message("action.sort.alphabetically"), IconLoader.getIcon("/objectBrowser/sorted.png")); - } - - public final boolean isSelected(final AnActionEvent event) { - return HierarchyBrowserManager.getInstance(myProject).getState().SORT_ALPHABETICALLY; - } - - public final void setSelected(final AnActionEvent event, final boolean flag) { - final HierarchyBrowserManager hierarchyBrowserManager = HierarchyBrowserManager.getInstance(myProject); - hierarchyBrowserManager.getState().SORT_ALPHABETICALLY = flag; - final Comparator comparator = JavaHierarchyUtil.getComparator(myProject); - final Collection builders = myBuilders.values(); - for (final HierarchyTreeBuilder builder : builders) { - builder.setNodeDescriptorComparator(comparator); - } - } - - public final void update(final AnActionEvent event) { - super.update(event); - final Presentation presentation = event.getPresentation(); - presentation.setEnabled(isValidBase()); - } - } - - public static final class BaseOnThisMethodAction extends AnAction { - public BaseOnThisMethodAction() { - super(IdeBundle.message("action.base.on.this.method")); - } - - public final void actionPerformed(final AnActionEvent event) { - final DataContext dataContext = event.getDataContext(); - final MethodHierarchyBrowser browser = (MethodHierarchyBrowser)dataContext.getData( - METHOD_HIERARCHY_BROWSER_DATA_CONSTANT); - if (browser == null) return; - - final PsiElement selectedElement = browser.getSelectedElement(); - if (!(selectedElement instanceof PsiMethod)) { - return; - } - final PsiMethod method = (PsiMethod)selectedElement; - - final String[] name = new String[]{browser.myCurrentViewName}; - browser.dispose(); - browser.setHierarchyBase(method); - browser.validate(); - ApplicationManager.getApplication().invokeLater(new Runnable() { - public void run() { - browser.changeView(name[0]); - } - }); - } - - public final void update(final AnActionEvent event) { - final Presentation presentation = event.getPresentation(); - - registerCustomShortcutSet( - ActionManager.getInstance().getAction(IdeActions.ACTION_METHOD_HIERARCHY).getShortcutSet(), null); - - final DataContext dataContext = event.getDataContext(); - final MethodHierarchyBrowser browser = (MethodHierarchyBrowser)dataContext.getData( - METHOD_HIERARCHY_BROWSER_DATA_CONSTANT); - if (browser == null) { - presentation.setVisible(false); - presentation.setEnabled(false); - return; - } - - final PsiElement selectedElement = browser.getSelectedElement(); - if (!(selectedElement instanceof PsiMethod)) { - presentation.setEnabled(false); - presentation.setVisible(false); - return; - } - - presentation.setVisible(true); - - final PsiMethod method = (PsiMethod)selectedElement; - if (!method.equals(browser.mySmartPsiElementPointer.getElement()) && - method.isValid() - ) { - presentation.setEnabled(true); - } - else { - presentation.setEnabled(false); - } - } - } - - public final MethodHierarchyNodeDescriptor[] getSelectedDescriptors() { - final JTree tree = getCurrentTree(); - if (tree == null) { - return new MethodHierarchyNodeDescriptor[0]; - } - final TreePath[] paths = tree.getSelectionPaths(); - if (paths == null) { - return new MethodHierarchyNodeDescriptor[0]; - } - final ArrayList list = new ArrayList(paths.length); - for (final TreePath path : paths) { - final Object lastPathComponent = path.getLastPathComponent(); - if (lastPathComponent instanceof DefaultMutableTreeNode) { - final DefaultMutableTreeNode node = (DefaultMutableTreeNode)lastPathComponent; - final Object userObject = node.getUserObject(); - if (userObject instanceof MethodHierarchyNodeDescriptor) { - list.add((MethodHierarchyNodeDescriptor)userObject); - } - } - } - return list.toArray(new MethodHierarchyNodeDescriptor[list.size()]); - } - - @Nullable - public final PsiMethod getBaseMethod() { - final HierarchyTreeBuilder builder = myBuilders.get(myCurrentViewName); - final MethodHierarchyTreeStructure treeStructure = (MethodHierarchyTreeStructure)builder.getTreeStructure(); - - final PsiMethod baseMethod = treeStructure.getBaseMethod(); - return baseMethod; - } -} +package com.intellij.ide.hierarchy.method; + +import com.intellij.ide.IdeBundle; +import com.intellij.ide.hierarchy.*; +import com.intellij.ide.util.treeView.NodeDescriptor; +import com.intellij.openapi.actionSystem.ActionGroup; +import com.intellij.openapi.actionSystem.ActionManager; +import com.intellij.openapi.actionSystem.ActionPlaces; +import com.intellij.openapi.actionSystem.IdeActions; +import com.intellij.openapi.diagnostic.Logger; +import com.intellij.openapi.project.Project; +import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiMethod; +import com.intellij.ui.PopupHandler; +import org.jetbrains.annotations.Nullable; + +import javax.swing.*; +import javax.swing.tree.DefaultMutableTreeNode; +import java.util.ArrayList; +import java.util.Comparator; +import java.util.Hashtable; + +public final class MethodHierarchyBrowser extends MethodHierarchyBrowserBase { + private static final Logger LOG = Logger.getInstance("#com.intellij.ide.hierarchy.method.MethodHierarchyBrowser"); + + public MethodHierarchyBrowser(final Project project, final PsiMethod method) { + super(project, method); + } + + protected void createTrees(Hashtable trees) { + final JTree tree = createTreeWithoutActions(); + ActionGroup group = (ActionGroup)ActionManager.getInstance().getAction(IdeActions.GROUP_METHOD_HIERARCHY_POPUP); + PopupHandler.installPopupHandler(tree, group, ActionPlaces.METHOD_HIERARCHY_VIEW_POPUP, ActionManager.getInstance()); + + final MethodHierarchyBrowserBase.BaseOnThisMethodAction baseOnThisMethodAction = new BaseOnThisMethodAction(); + baseOnThisMethodAction + .registerCustomShortcutSet(ActionManager.getInstance().getAction(IdeActions.ACTION_METHOD_HIERARCHY).getShortcutSet(), tree); + + trees.put(MethodHierarchyTreeStructure.TYPE, tree); + } + + protected JPanel createLegendPanel() { + return createStandardLegendPanel(IdeBundle.message("hierarchy.legend.method.is.defined.in.class"), + IdeBundle.message("hierarchy.legend.method.defined.in.superclass"), + IdeBundle.message("hierarchy.legend.method.should.be.defined")); + } + + protected PsiElement getElementFromNode(final DefaultMutableTreeNode node) { + final Object userObject = node == null ? null : node.getUserObject(); + if (userObject instanceof MethodHierarchyNodeDescriptor) { + MethodHierarchyNodeDescriptor nodeDescriptor = (MethodHierarchyNodeDescriptor)userObject; + return nodeDescriptor.getTargetElement(); + } + return null; + } + + protected PsiElement getElementFromDescriptor(final HierarchyNodeDescriptor descriptor) { + if (descriptor instanceof MethodHierarchyNodeDescriptor) { + return ((MethodHierarchyNodeDescriptor)descriptor).getTargetElement(); + } + return null; + } + + protected boolean isApplicableElement(final PsiElement psiElement) { + return psiElement instanceof PsiMethod; + } + + protected PsiMethod[] getSelectedMethods() { + HierarchyNodeDescriptor[] descriptors = getSelectedDescriptors(); + ArrayList psiElements = new ArrayList(); + for (HierarchyNodeDescriptor descriptor : descriptors) { + if (descriptor instanceof MethodHierarchyNodeDescriptor) { + final PsiElement element = ((MethodHierarchyNodeDescriptor)descriptor).getTargetElement(); + if (!(element instanceof PsiMethod)) continue; + psiElements.add((PsiMethod)element); + } + } + return psiElements.toArray(new PsiMethod[psiElements.size()]); + } + + protected HierarchyTreeStructure createHierarchyTreeStructure(final String typeName, final PsiElement psiElement) { + if (!MethodHierarchyTreeStructure.TYPE.equals(typeName)) { + LOG.error("unexpected type: " + typeName); + return null; + } + final HierarchyTreeStructure structure = new MethodHierarchyTreeStructure(myProject, (PsiMethod)psiElement); + return structure; + } + + protected Comparator getComparator() { + return JavaHierarchyUtil.getComparator(myProject); + } + + public static final class BaseOnThisMethodAction extends MethodHierarchyBrowserBase.BaseOnThisMethodAction { + protected boolean isApplicableElement(final PsiElement psiElement) { + return psiElement instanceof PsiMethod; + } + } + + @Nullable + public final PsiMethod getBaseMethod() { + final HierarchyTreeBuilder builder = myBuilders.get(myCurrentViewName); + final MethodHierarchyTreeStructure treeStructure = (MethodHierarchyTreeStructure)builder.getTreeStructure(); + + final PsiMethod baseMethod = treeStructure.getBaseMethod(); + return baseMethod; + } +} diff --git a/source/com/intellij/ide/hierarchy/method/OverrideImplementMethodAction.java b/source/com/intellij/ide/hierarchy/method/OverrideImplementMethodAction.java index 4cd28bf3bd..7e574128f1 100644 --- a/source/com/intellij/ide/hierarchy/method/OverrideImplementMethodAction.java +++ b/source/com/intellij/ide/hierarchy/method/OverrideImplementMethodAction.java @@ -1,6 +1,8 @@ package com.intellij.ide.hierarchy.method; import com.intellij.codeInsight.generation.OverrideImplementUtil; +import com.intellij.ide.hierarchy.HierarchyNodeDescriptor; +import com.intellij.ide.hierarchy.MethodHierarchyBrowserBase; import com.intellij.openapi.actionSystem.*; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.command.CommandProcessor; @@ -27,7 +29,7 @@ abstract class OverrideImplementMethodAction extends AnAction { public final void actionPerformed(final AnActionEvent event) { final DataContext dataContext = event.getDataContext(); - final MethodHierarchyBrowser methodHierarchyBrowser = (MethodHierarchyBrowser)dataContext.getData(MethodHierarchyBrowser.METHOD_HIERARCHY_BROWSER_DATA_CONSTANT); + final MethodHierarchyBrowser methodHierarchyBrowser = (MethodHierarchyBrowser)dataContext.getData(MethodHierarchyBrowserBase.METHOD_HIERARCHY_BROWSER_DATA_CONSTANT); if (methodHierarchyBrowser == null) return; final Project project = PlatformDataKeys.PROJECT.getData(dataContext); if (project == null) return; @@ -39,11 +41,11 @@ abstract class OverrideImplementMethodAction extends AnAction { public void run() { try{ - final MethodHierarchyNodeDescriptor[] selectedDescriptors = methodHierarchyBrowser.getSelectedDescriptors(); + final HierarchyNodeDescriptor[] selectedDescriptors = methodHierarchyBrowser.getSelectedDescriptors(); if (selectedDescriptors.length > 0) { final List files = new ArrayList(selectedDescriptors.length); - for (MethodHierarchyNodeDescriptor selectedDescriptor1 : selectedDescriptors) { - final PsiFile containingFile = selectedDescriptor1.getPsiClass().getContainingFile(); + for (HierarchyNodeDescriptor selectedDescriptor : selectedDescriptors) { + final PsiFile containingFile = ((MethodHierarchyNodeDescriptor)selectedDescriptor).getPsiClass().getContainingFile(); if (containingFile != null) { final VirtualFile vFile = containingFile.getVirtualFile(); if (vFile != null) { @@ -53,8 +55,8 @@ abstract class OverrideImplementMethodAction extends AnAction { } final ReadonlyStatusHandler.OperationStatus status = ReadonlyStatusHandler.getInstance(project).ensureFilesWritable(files.toArray(new VirtualFile[files.size()])); if (!status.hasReadonlyFiles()) { - for (MethodHierarchyNodeDescriptor selectedDescriptor : selectedDescriptors) { - OverrideImplementUtil.overrideOrImplement(selectedDescriptor.getPsiClass(), methodHierarchyBrowser.getBaseMethod()); + for (HierarchyNodeDescriptor selectedDescriptor : selectedDescriptors) { + OverrideImplementUtil.overrideOrImplement(((MethodHierarchyNodeDescriptor)selectedDescriptor).getPsiClass(), methodHierarchyBrowser.getBaseMethod()); } ToolWindowManager.getInstance(project).activateEditorComponent(); } @@ -93,12 +95,12 @@ abstract class OverrideImplementMethodAction extends AnAction { return; } - final MethodHierarchyNodeDescriptor[] selectedDescriptors = methodHierarchyBrowser.getSelectedDescriptors(); + final HierarchyNodeDescriptor[] selectedDescriptors = methodHierarchyBrowser.getSelectedDescriptors(); int toImplement = 0; int toOverride = 0; - for (final MethodHierarchyNodeDescriptor descriptor : selectedDescriptors) { - if (canImplementOverride(descriptor, methodHierarchyBrowser, true)) { + for (final HierarchyNodeDescriptor descriptor : selectedDescriptors) { + if (canImplementOverride((MethodHierarchyNodeDescriptor)descriptor, methodHierarchyBrowser, true)) { if (toOverride > 0) { // no mixed actions allowed presentation.setEnabled(false); @@ -107,7 +109,7 @@ abstract class OverrideImplementMethodAction extends AnAction { } toImplement++; } - else if (canImplementOverride(descriptor, methodHierarchyBrowser, false)) { + else if (canImplementOverride((MethodHierarchyNodeDescriptor)descriptor, methodHierarchyBrowser, false)) { if (toImplement > 0) { // no mixed actions allowed presentation.setEnabled(false); -- 2.11.4.GIT