package jetbrains.mps.ide.depanalyzer; /*Generated by MPS */ import javax.swing.JPanel; import com.intellij.openapi.actionSystem.DataProvider; import jetbrains.mps.ide.tools.BaseTool; import com.intellij.openapi.project.Project; import java.awt.BorderLayout; import jetbrains.mps.ide.project.ProjectHelper; import com.intellij.openapi.actionSystem.ActionGroup; import jetbrains.mps.workbench.action.ActionUtils; import jetbrains.mps.ide.tools.CloseAction; import jetbrains.mps.icons.MPSIcons; import jetbrains.mps.baseLanguage.closures.runtime._FunctionTypes; import javax.swing.JComponent; import com.intellij.openapi.actionSystem.ActionManager; import com.intellij.openapi.actionSystem.ActionPlaces; import com.intellij.openapi.ui.Splitter; import com.intellij.ui.components.JBScrollPane; import javax.swing.event.TreeSelectionListener; import javax.swing.event.TreeSelectionEvent; import org.jetbrains.mps.openapi.module.SModule; import javax.swing.tree.TreePath; import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.NonNls; import jetbrains.mps.ide.actions.MPSCommonDataKeys; import jetbrains.mps.workbench.ActionPlace; import com.intellij.openapi.actionSystem.ToggleAction; import javax.swing.Icon; import com.intellij.openapi.actionSystem.AnActionEvent; public class ModuleDependenciesView extends JPanel implements DataProvider { private DependencyTree myLeftTree; private DependencyPathTree myRightTree; public ModuleDependenciesView(BaseTool tool, Project project) { super(new BorderLayout()); jetbrains.mps.project.Project mpsProject = ProjectHelper.fromIdeaProject(project); myLeftTree = new DependencyTree(mpsProject); myRightTree = new DependencyPathTree(mpsProject); ActionGroup group = ActionUtils.groupFromActions(new CloseAction(tool), new ModuleDependenciesView.MyToggleAction("Show Runtime Dependencies", MPSIcons.General.Runtime, false, new _FunctionTypes._void_P1_E0<Boolean>() { public void invoke(Boolean b) { setShowRuntime(b); } }), new ModuleDependenciesView.MyToggleAction("Show Used Languages", MPSIcons.Nodes.Language, true, new _FunctionTypes._void_P1_E0<Boolean>() { public void invoke(Boolean b) { setShowUsedLanguages(b); } })); JComponent toolbar = ActionManager.getInstance().createActionToolbar(ActionPlaces.UNKNOWN, group, true).getComponent(); add(toolbar, BorderLayout.NORTH); Splitter splitter = new Splitter(); splitter.setDividerWidth(2); add(splitter, BorderLayout.CENTER); splitter.setFirstComponent(new JBScrollPane(myLeftTree)); splitter.setSecondComponent(new JBScrollPane(myRightTree)); myLeftTree.addTreeSelectionListener(new TreeSelectionListener() { @Override public void valueChanged(TreeSelectionEvent e) { rebuildDependencies(); } }); } public void setModules(SModule modules) { myLeftTree.setModules(modules); resetAll(); myLeftTree.expandRoot(); } public void rebuildDependencies() { // rebuild right tree based on selection in the left myRightTree.resetDependencies(); TreePath[] paths = myLeftTree.getSelectionPaths(); if (paths != null) { for (TreePath path : paths) { Object o = path.getLastPathComponent(); if (o instanceof ModuleDependencyNode && o != myLeftTree.getRootNode()) { ModuleDependencyNode node = (ModuleDependencyNode) o; myRightTree.revealDependencies(node.getCapturedDependencies()); } } } myRightTree.rebuildNow(); myRightTree.expandAll(); } private void setShowRuntime(boolean b) { myLeftTree.setShowRuntime(b); resetAll(); } private void setShowUsedLanguages(boolean b) { myLeftTree.setShowUsedLanguage(b); resetAll(); } public void resetAll() { myLeftTree.rebuildNow(); rebuildDependencies(); } @Nullable @Override public Object getData(@NonNls String dataId) { if (dataId.equals(MPSCommonDataKeys.PLACE.getName())) { return getPlace(); } // not found return null; } private ActionPlace getPlace() { return ActionPlace.MODULE_DEPENDENCIES; } public static class MyToggleAction extends ToggleAction { private boolean myValue; private _FunctionTypes._void_P1_E0<? super Boolean> mySetValue; public MyToggleAction(String title, Icon icon, boolean value, _FunctionTypes._void_P1_E0<? super Boolean> setValue) { super(title, title, icon); myValue = value; mySetValue = setValue; } @Override public void setSelected(AnActionEvent event, boolean b) { mySetValue.invoke(myValue = b); } @Override public boolean isSelected(AnActionEvent event) { return myValue; } } }