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;
}
}
}