package jetbrains.mps.ide.hierarchy; /*Generated by MPS */ import jetbrains.mps.ide.tools.BaseProjectTool; import javax.swing.JScrollPane; import com.intellij.ide.OccurenceNavigatorSupport; import com.intellij.openapi.project.Project; import javax.swing.Icon; import com.intellij.openapi.wm.ToolWindowAnchor; import jetbrains.mps.project.MPSProject; import org.jetbrains.annotations.Nullable; import com.intellij.pom.Navigatable; import javax.swing.tree.DefaultMutableTreeNode; import org.jetbrains.mps.openapi.model.SNodeReference; import jetbrains.mps.ide.navigation.NodeNavigatable; import com.intellij.usageView.UsageViewBundle; import com.intellij.ui.ScrollPaneFactory; import com.intellij.openapi.application.ApplicationManager; import javax.swing.JComponent; import com.intellij.openapi.actionSystem.ActionManager; import com.intellij.openapi.actionSystem.ActionPlaces; import jetbrains.mps.openapi.navigation.EditorNavigator; import com.intellij.openapi.actionSystem.DefaultActionGroup; import jetbrains.mps.ide.hierarchy.toggle.GroupedToggleAction; import jetbrains.mps.ide.hierarchy.icons.Icons; import jetbrains.mps.ide.hierarchy.toggle.ToggleActionGroup; import com.intellij.openapi.actionSystem.ToggleAction; import com.intellij.openapi.actionSystem.AnActionEvent; import jetbrains.mps.workbench.action.BaseAction; import com.intellij.icons.AllIcons; import java.util.Map; import jetbrains.mps.workbench.action.ActionUtils; import org.jetbrains.mps.openapi.model.SNode; import jetbrains.mps.util.StringUtil; import com.intellij.openapi.ui.SimpleToolWindowPanel; import com.intellij.ide.OccurenceNavigator; import com.intellij.openapi.actionSystem.DataProvider; import org.jetbrains.annotations.NonNls; import com.intellij.openapi.actionSystem.PlatformDataKeys; public abstract class AbstractHierarchyView extends BaseProjectTool { protected AbstractHierarchyTree myHierarchyTree; protected AbstractHierarchyView.RootPanel myComponent; public JScrollPane myScrollPane; private OccurenceNavigatorSupport myOccurenceNavigator; public AbstractHierarchyView(Project project, String id, int number, Icon icon) { super(project, id, number, icon, ToolWindowAnchor.RIGHT, false); } public MPSProject getMPSProject() { return getProject().getComponent(MPSProject.class); } @Override public void disposeComponent() { if (myHierarchyTree == null) { return; } myHierarchyTree.dispose(); } @Override protected void createTool() { myHierarchyTree = createHierarchyTree(false); myOccurenceNavigator = new OccurenceNavigatorSupport(myHierarchyTree) { @Nullable @Override protected Navigatable createDescriptorForNode(DefaultMutableTreeNode node) { if (!(node instanceof HierarchyTreeNode)) { return null; } SNodeReference ptr = ((HierarchyTreeNode) node).getNodeReference(); Navigatable n = new NodeNavigatable(getMPSProject(), ptr); return (n.canNavigate() ? n : null); } @Override public String getPreviousOccurenceActionName() { return UsageViewBundle.message("action.previous.occurrence"); } @Override public String getNextOccurenceActionName() { return UsageViewBundle.message("action.next.occurrence"); } }; myHierarchyTree.setRootVisible(true); this.myComponent = new AbstractHierarchyView.RootPanel(); myScrollPane = ScrollPaneFactory.createScrollPane(myHierarchyTree, true); myComponent.setContent(myScrollPane); showItemInHierarchy(null); createControlPanel(); } protected void createControlPanel() { ApplicationManager.getApplication().invokeLater(new Runnable() { @Override public void run() { if (myComponent != null) { JComponent buttonsPanel = ActionManager.getInstance().createActionToolbar(ActionPlaces.TYPE_HIERARCHY_VIEW_TOOLBAR, createButtonsGroup(), true).getComponent(); myComponent.setToolbar(buttonsPanel); } } }); } protected abstract AbstractHierarchyTree createHierarchyTree(boolean isParentHierarchy); public void openNode(SNodeReference nodeRef) { final jetbrains.mps.project.Project mpsProject = getMPSProject(); if (mpsProject == null) { return; } new EditorNavigator(mpsProject).shallFocus(true).shallSelect(true).open(nodeRef); } protected DefaultActionGroup createButtonsGroup() { GroupedToggleAction childrenAction = new GroupedToggleAction("Children Hierarchy", "Show children hierarchy", Icons.CHILDREN_ICON, true) { @Override public void select() { myHierarchyTree.setParentHierarchy(false); myHierarchyTree.rebuildNow(); } }; GroupedToggleAction parentAction = new GroupedToggleAction("Parent Hierarchy", "Show parent hierarchy", Icons.PARENT_ICON, false) { @Override public void select() { myHierarchyTree.setParentHierarchy(true); myHierarchyTree.rebuildNow(); } }; ToggleActionGroup toggleGroup = new ToggleActionGroup(); toggleGroup.add(childrenAction); toggleGroup.add(parentAction); ToggleAction thisModelAction = new ToggleAction("Only This Model", "Show hierarchy only for model", Icons.THIS_MODEL_ICON) { private boolean mySelected = false; @Override public boolean isSelected(AnActionEvent e) { return mySelected; } @Override public void setSelected(AnActionEvent e, boolean state) { mySelected = state; myHierarchyTree.setIsOnlyInOneModel(mySelected); } }; ToggleAction generatorModelsAction = new ToggleAction("Show Generator Classes", "Show classes from generator models in hierarchy", Icons.GENERATOR_ICON) { private boolean mySelected = false; @Override public boolean isSelected(AnActionEvent e) { return mySelected; } @Override public void setSelected(AnActionEvent e, boolean state) { mySelected = state; myHierarchyTree.setShowGeneratorModels(mySelected); } }; BaseAction expandAllAction = new BaseAction("Expand all", "Expand all nodes", AllIcons.Actions.Expandall) { @Override protected void doExecute(AnActionEvent e, Map<String, Object> _params) { myHierarchyTree.expandAll(); } }; BaseAction collapseAllAction = new BaseAction("Collapse all", "Collapse all nodes", AllIcons.Actions.Collapseall) { @Override protected void doExecute(AnActionEvent e, Map<String, Object> _params) { myHierarchyTree.collapseAll(); } }; BaseAction refreshAction = new BaseAction("Refresh", "Refresh", AllIcons.Actions.Refresh) { @Override protected void doExecute(AnActionEvent e, Map<String, Object> _params) { myHierarchyTree.rebuildNow(); } }; return ActionUtils.groupFromActions(childrenAction, parentAction, thisModelAction, generatorModelsAction, expandAllAction, collapseAllAction, refreshAction, createCloseAction()); } public void showItemInHierarchy(SNode node) { myHierarchyTree.setHierarchyNode(node); final jetbrains.mps.project.Project mpsProject = getMPSProject(); mpsProject.getModelAccess().runReadInEDT(new Runnable() { @Override public void run() { Project project = getProject(); if (project == null || project.isDisposed()) { return; } myHierarchyTree.rebuildNow(); if (myHierarchyTree.getActiveTreeNode() != null) { myHierarchyTree.setRootNodeText("<html>Hierarchy for <font color=\"#400090\"><b>" + StringUtil.escapeXml(myHierarchyTree.getActiveTreeNode().calculateNodeIdentifier()) + "</b></font>", getIcon()); myHierarchyTree.selectNode(myHierarchyTree.getActiveTreeNode()); } if (!(isTreeInfinite())) { myHierarchyTree.expandAll(); } } }); } protected boolean isTreeInfinite() { return false; } @Override public JComponent getComponent() { return myComponent; } public class RootPanel extends SimpleToolWindowPanel implements OccurenceNavigator, DataProvider { public RootPanel() { super(true, true); } @Nullable public Object getData(@NonNls String id) { if (PlatformDataKeys.HELP_ID.is(id)) { return "ideaInterface.hierarchyView"; } return super.getData(id); } @Override public String getPreviousOccurenceActionName() { return (myOccurenceNavigator != null ? myOccurenceNavigator.getPreviousOccurenceActionName() : ""); } @Override public String getNextOccurenceActionName() { return (myOccurenceNavigator != null ? myOccurenceNavigator.getNextOccurenceActionName() : ""); } @Override public OccurenceNavigator.OccurenceInfo goPreviousOccurence() { return (myOccurenceNavigator != null ? myOccurenceNavigator.goPreviousOccurence() : null); } @Override public OccurenceNavigator.OccurenceInfo goNextOccurence() { return (myOccurenceNavigator != null ? myOccurenceNavigator.goNextOccurence() : null); } @Override public boolean hasPreviousOccurence() { return myOccurenceNavigator != null && myOccurenceNavigator.hasPreviousOccurence(); } @Override public boolean hasNextOccurence() { return myOccurenceNavigator != null && myOccurenceNavigator.hasNextOccurence(); } } }