package jetbrains.mps.build.mps.pluginSolution.plugin; /*Generated by MPS */ import jetbrains.mps.project.Project; import javax.swing.JComponent; import java.util.List; import jetbrains.mps.internal.collections.runtime.ListSequence; import java.util.Comparator; import org.jetbrains.mps.openapi.module.SModule; import jetbrains.mps.project.Solution; import jetbrains.mps.smodel.Language; import jetbrains.mps.ide.ui.tree.module.NamespaceTreeBuilder; import java.util.Set; import jetbrains.mps.internal.collections.runtime.SetSequence; import java.util.LinkedHashSet; import java.util.LinkedList; import javax.swing.JPanel; import java.awt.GridBagLayout; import javax.swing.JLabel; import javax.swing.border.CompoundBorder; import javax.swing.border.EtchedBorder; import javax.swing.border.EmptyBorder; import jetbrains.mps.ide.common.LayoutUtil; import jetbrains.mps.ide.ui.tree.MPSTreeNode; import jetbrains.mps.project.StandaloneMPSProject; public class LanguagesStep extends AbstractStep { private final AbstractBuildGenerator myGenerator; private CheckBoxTree myCheckTree; private final Project myProject; private final IErrorHandler myHandler; public LanguagesStep(Project project, AbstractBuildGenerator generator, IErrorHandler handler) { this.myGenerator = generator; this.myProject = project; this.myHandler = handler; } @Override public void _init() { super._init(); String errorText = null; if (!(this.myGenerator.isValid())) { errorText = "Invalid input in previous steps."; } this.myHandler.setErrorText(errorText); } @Override public JComponent createMainComponent() { this.myCheckTree = this.createCheckTree(); return this.myCheckTree; } public CheckBoxTree createCheckTree() { ModulesListData data = new ModulesListData(this.myProject.getProjectModules()); List<ModuleData> children = data.getModules(); ListSequence.fromList(children).sort(new Comparator<ModuleData>() { public int compare(ModuleData data1, ModuleData data2) { SModule module1 = data1.getModule(); SModule module2 = data2.getModule(); if (module1.getClass().getName().equals(module2.getClass().getName())) { return data1.getText().compareToIgnoreCase(data2.getText()); } else if (module1 instanceof Solution) { return -1; } else if (module2 instanceof Solution) { return 1; } else if (module1 instanceof Language) { return -1; } return 1; } }, true); NamespaceTreeBuilder builder = new LanguagesStep.MyTreeBuilder(this.myProject); for (ModuleData moduleData : ListSequence.fromList(children)) { builder.addNode(new CheckBoxNode(moduleData, false)); } CheckBoxNode allModulesNode = new CheckBoxNode(data, false); builder.fillNode(allModulesNode); this.fillChildren(allModulesNode); CheckBoxTree tree = new CheckBoxTree(allModulesNode); tree.checkNodeRecursively(allModulesNode, true); return tree; } public <N extends NodeData> void fillChildren(CheckBoxNode<N> node) { int childCount = node.getChildCount(); for (int i = 0; i < childCount; i++) { N data = node.getData(); CheckBoxNode<N> child = (CheckBoxNode<N>) node.getChildAt(i); NodeData childData = child.getData(); data.addChildren(childData); childData.setParent(data); this.fillChildren(child); } } @Override public String getDescription() { return "Select languages and solutions included in build script."; } @Override public void _commit(boolean finish) { Set<NodeData> selectedItems = this.myCheckTree.getSelectedItems(); Set<NodeData> modules = SetSequence.fromSet(new LinkedHashSet<NodeData>()); for (NodeData item : SetSequence.fromSet(selectedItems)) { this.fillWithParents(item, modules); } List<NodeData> toSort = ListSequence.fromListWithValues(new LinkedList<NodeData>(), modules); ListSequence.fromList(toSort).sort(new Comparator<NodeData>() { public int compare(NodeData a, NodeData b) { if ((a instanceof NamespaceData) && (b instanceof ModuleData)) { return -1; } else if ((a instanceof ModuleData) && (b instanceof NamespaceData)) { return 1; } return a.getText().compareToIgnoreCase(b.getText()); } }, true); this.myGenerator.setModules(toSort); } public void fillWithParents(NodeData item, Set<NodeData> collection) { SetSequence.fromSet(collection).addElement(item); if (item.getParent() != null) { this.fillWithParents(item.getParent(), collection); } } @Override protected JPanel createStepPanel() { JPanel stepPanel = new JPanel(new GridBagLayout()); stepPanel.add(new JLabel(this.getDescription()), this.createConstraint(0, 0)); JComponent mainComponent = this.createMainComponent(); mainComponent.setBorder(new CompoundBorder(new EtchedBorder(), new EmptyBorder(2, 2, 2, 2))); stepPanel.add(mainComponent, LayoutUtil.createPanelConstraints(1)); return stepPanel; } @Override protected boolean doLimitStepPanelHeight() { return true; } public static class MyTreeBuilder extends NamespaceTreeBuilder<CheckBoxNode, CheckBoxNamespaceNode> { private final Project myProject; public MyTreeBuilder(Project mpsProject) { super(new NamespaceTreeBuilder.NamespaceNodeBuilder<CheckBoxNamespaceNode>() { @Override public CheckBoxNamespaceNode createNamespaceNode(String text) { return new CheckBoxNamespaceNode(new NamespaceData(text)); } @Override public String getName(CheckBoxNamespaceNode p0) { return p0.getName(); } @Override public boolean isNamespaceNode(MPSTreeNode p0) { return p0 instanceof CheckBoxNamespaceNode; } @Override public void setName(CheckBoxNamespaceNode p0, String p1) { p0.setName(p1); } }); myProject = mpsProject; } @Override protected String getNamespace(CheckBoxNode node) { NodeData data = node.getData(); String namespace = ""; if (data instanceof ModuleData) { ModuleData moduleData = (ModuleData) data; namespace = ((StandaloneMPSProject) this.myProject).getFolderFor(moduleData.getModule()); } if (namespace == null) { return ""; } return namespace; } } }