package jetbrains.mps.build.mps.pluginSolution.plugin; /*Generated by MPS */ import javax.swing.JPanel; import javax.swing.JTree; import java.util.Set; import jetbrains.mps.internal.collections.runtime.SetSequence; import java.util.HashSet; import java.awt.BorderLayout; import com.intellij.ui.treeStructure.Tree; import javax.swing.tree.TreeSelectionModel; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import com.intellij.ui.ScrollPaneFactory; import javax.swing.tree.TreePath; public class CheckBoxTree<N extends NodeData> extends JPanel { private final JTree myTree; private final Set<N> mySelectedItems = SetSequence.fromSet(new HashSet<N>()); public CheckBoxTree(CheckBoxNode node) { super(new BorderLayout()); this.myTree = new Tree(node); this.myTree.setCellRenderer(new CheckBoxCellRenderrer()); this.myTree.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION); this.myTree.addMouseListener(new MouseAdapter() { @Override public void mousePressed(MouseEvent e) { CheckBoxTree.this.mouseParessed(e.getX(), e.getY()); } }); this.add(ScrollPaneFactory.createScrollPane(myTree), BorderLayout.CENTER); } public void mouseParessed(int x, int y) { int row = this.myTree.getRowForLocation(x, y); if (row == 0) { this.myTree.revalidate(); this.myTree.repaint(); } TreePath path = this.myTree.getPathForRow(row); if (path == null) { return; } Object lastPathComponent = path.getLastPathComponent(); CheckBoxNode<N> cbNode = (CheckBoxNode) lastPathComponent; boolean isChecked = this.isChecked(cbNode); this.checkNodeRecursively(cbNode, !(isChecked)); if (isChecked) { this.uncheckParents(cbNode); } this.repaint(); } public void checkNodeRecursively(CheckBoxNode<N> checkBoxNode, boolean check) { this.checkNode(checkBoxNode, check); int childCount = checkBoxNode.getChildCount(); for (int i = 0; i < childCount; i++) { this.checkNodeRecursively((CheckBoxNode<N>) checkBoxNode.getChildAt(i), check); } } public boolean isChecked(CheckBoxNode<N> cbNode) { return SetSequence.fromSet(CheckBoxTree.this.mySelectedItems).contains(cbNode.getData()); } public void uncheckParents(CheckBoxNode<N> cbNode) { CheckBoxNode<N> parent = (CheckBoxNode<N>) cbNode.getParent(); if (parent == null) { return; } this.checkNode(parent, false); this.uncheckParents(parent); } private void checkNode(CheckBoxNode<N> checkBoxNode, boolean check) { if (check) { SetSequence.fromSet(CheckBoxTree.this.mySelectedItems).addElement(checkBoxNode.getData()); } else { SetSequence.fromSet(CheckBoxTree.this.mySelectedItems).removeElement(checkBoxNode.getData()); } checkBoxNode.setChecked(check); } public Set<N> getSelectedItems() { return SetSequence.fromSetWithValues(new HashSet<N>(), this.mySelectedItems); } }