diff options
Diffstat (limited to 'platform/platform-api/src/com/intellij/ui/CheckboxTreeBase.java')
-rw-r--r-- | platform/platform-api/src/com/intellij/ui/CheckboxTreeBase.java | 266 |
1 files changed, 48 insertions, 218 deletions
diff --git a/platform/platform-api/src/com/intellij/ui/CheckboxTreeBase.java b/platform/platform-api/src/com/intellij/ui/CheckboxTreeBase.java index d9755f342a3f..88f433f7c62a 100644 --- a/platform/platform-api/src/com/intellij/ui/CheckboxTreeBase.java +++ b/platform/platform-api/src/com/intellij/ui/CheckboxTreeBase.java @@ -16,67 +16,49 @@ package com.intellij.ui; import com.intellij.ui.treeStructure.Tree; +import com.intellij.util.EventDispatcher; import com.intellij.util.ui.UIUtil; -import com.intellij.util.ui.tree.TreeUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import javax.swing.*; -import javax.swing.tree.*; +import javax.swing.tree.DefaultTreeModel; +import javax.swing.tree.TreeCellRenderer; +import javax.swing.tree.TreeNode; import java.awt.*; -import java.awt.event.KeyAdapter; -import java.awt.event.KeyEvent; -import java.awt.event.MouseEvent; -import java.lang.reflect.Array; -import java.util.ArrayList; -import java.util.Enumeration; public class CheckboxTreeBase extends Tree { - private final CheckPolicy myCheckPolicy; - private static final CheckPolicy DEFAULT_POLICY = new CheckPolicy(true, true, false, true); + private final CheckboxTreeHelper myHelper; + private final EventDispatcher<CheckboxTreeListener> myEventDispatcher; public CheckboxTreeBase() { this(new CheckboxTreeCellRendererBase(), null); } public CheckboxTreeBase(final CheckboxTreeCellRendererBase cellRenderer, CheckedTreeNode root) { - this(cellRenderer, root, DEFAULT_POLICY); + this(cellRenderer, root, CheckboxTreeHelper.DEFAULT_POLICY); } public CheckboxTreeBase(CheckboxTreeCellRendererBase cellRenderer, @Nullable CheckedTreeNode root, CheckPolicy checkPolicy) { - myCheckPolicy = checkPolicy; - - setRootVisible(false); - setShowsRootHandles(true); - setLineStyleAngled(); - TreeUtil.installActions(this); - - installRenderer(cellRenderer); - - addKeyListener(new KeyAdapter() { - public void keyPressed(KeyEvent e) { - if (isToggleEvent(e)) { - TreePath treePath = getLeadSelectionPath(); - if (treePath == null) return; - final Object o = treePath.getLastPathComponent(); - if (!(o instanceof CheckedTreeNode)) return; - CheckedTreeNode firstNode = (CheckedTreeNode)o; - boolean checked = toggleNode(firstNode); - - TreePath[] selectionPaths = getSelectionPaths(); - for (int i = 0; selectionPaths != null && i < selectionPaths.length; i++) { - final TreePath selectionPath = selectionPaths[i]; - final Object o1 = selectionPath.getLastPathComponent(); - if (!(o1 instanceof CheckedTreeNode)) continue; - CheckedTreeNode node = (CheckedTreeNode)o1; - checkNode(node, checked); - ((DefaultTreeModel)getModel()).nodeChanged(node); - } - - e.consume(); - } + myEventDispatcher = EventDispatcher.create(CheckboxTreeListener.class); + myEventDispatcher.addListener(new CheckboxTreeListener() { + @Override + public void mouseDoubleClicked(@NotNull CheckedTreeNode node) { + onDoubleClick(node); + } + + @Override + public void nodeStateChanged(@NotNull CheckedTreeNode node) { + CheckboxTreeBase.this.onNodeStateChanged(node); + } + + @Override + public void beforeNodeStateChanged(@NotNull CheckedTreeNode node) { + CheckboxTreeBase.this.nodeStateWillChange(node); } }); + myHelper = new CheckboxTreeHelper(checkPolicy, myEventDispatcher); + myHelper.initTree(this, this, cellRenderer); setSelectionRow(0); if (root != null) { @@ -84,55 +66,37 @@ public class CheckboxTreeBase extends Tree { } } + @Deprecated public void installRenderer(final CheckboxTreeCellRendererBase cellRenderer) { setCellRenderer(cellRenderer); - new ClickListener() { - @Override - public boolean onClick(@NotNull MouseEvent e, int clickCount) { - int row = getRowForLocation(e.getX(), e.getY()); - if (row < 0) return false; - final Object o = getPathForRow(row).getLastPathComponent(); - if (!(o instanceof CheckedTreeNode)) return false; - Rectangle rowBounds = getRowBounds(row); - cellRenderer.setBounds(rowBounds); - Rectangle checkBounds = cellRenderer.myCheckbox.getBounds(); - checkBounds.setLocation(rowBounds.getLocation()); - - if (checkBounds.height == 0) checkBounds.height = checkBounds.width = rowBounds.height; - - final CheckedTreeNode node = (CheckedTreeNode)o; - if (checkBounds.contains(e.getPoint())) { - if (node.isEnabled()) { - toggleNode(node); - setSelectionRow(row); - return true; - } - } - else if (clickCount > 1) { - onDoubleClick(node); - return true; - } - return false; - } - }.installOn(this); } - protected void onDoubleClick(final CheckedTreeNode node) { + /** + * @deprecated use {@link #setNodeState} to change node state or subscribe to {@link #addCheckboxTreeListener} to get notifications about state changes + */ + @Deprecated + protected boolean toggleNode(CheckedTreeNode node) { + setNodeState(node, !node.isChecked()); + return node.isChecked(); } - protected boolean isToggleEvent(KeyEvent e) { - return e.getKeyCode() == KeyEvent.VK_SPACE; + /** + * @deprecated use {@link #setNodeState} to change node state or subscribe to {@link #addCheckboxTreeListener} to get notifications about state changes + */ + @Deprecated + protected void checkNode(CheckedTreeNode node, boolean checked) { + setNodeState(node, checked); } - protected boolean toggleNode(CheckedTreeNode node) { - boolean checked = !node.isChecked(); - checkNode(node, checked); + public void setNodeState(@NotNull CheckedTreeNode node, boolean checked) { + myHelper.setNodeState(this, node, checked); + } - // notify model listeners about model change - final TreeModel model = getModel(); - model.valueForPathChanged(new TreePath(node.getPath()), node.getUserObject()); + public void addCheckboxTreeListener(@NotNull CheckboxTreeListener listener) { + myEventDispatcher.addListener(listener); + } - return checked; + protected void onDoubleClick(final CheckedTreeNode node) { } /** @@ -144,38 +108,8 @@ public class CheckboxTreeBase extends Tree { * @param <T> the type of the node * @return an array of collected nodes */ - @SuppressWarnings("unchecked") public <T> T[] getCheckedNodes(final Class<T> nodeType, @Nullable final NodeFilter<T> filter) { - final ArrayList<T> nodes = new ArrayList<T>(); - final Object root = getModel().getRoot(); - if (!(root instanceof CheckedTreeNode)) { - throw new IllegalStateException( - "The root must be instance of the " + CheckedTreeNode.class.getName() + ": " + root.getClass().getName()); - } - new Object() { - @SuppressWarnings("unchecked") - public void collect(CheckedTreeNode node) { - if (node.isLeaf()) { - Object userObject = node.getUserObject(); - if (node.isChecked() && userObject != null && nodeType.isAssignableFrom(userObject.getClass())) { - final T value = (T)userObject; - if (filter != null && !filter.accept(value)) return; - nodes.add(value); - } - } - else { - for (int i = 0; i < node.getChildCount(); i++) { - final TreeNode child = node.getChildAt(i); - if (child instanceof CheckedTreeNode) { - collect((CheckedTreeNode)child); - } - } - } - } - }.collect((CheckedTreeNode)root); - T[] result = (T[])Array.newInstance(nodeType, nodes.size()); - nodes.toArray(result); - return result; + return CheckboxTreeHelper.getCheckedNodes(nodeType, filter, getModel()); } @@ -184,118 +118,14 @@ public class CheckboxTreeBase extends Tree { return -1; } - protected void checkNode(CheckedTreeNode node, boolean checked) { - adjustParentsAndChildren(node, checked); - repaint(); - } - protected void onNodeStateChanged(CheckedTreeNode node) { - } protected void nodeStateWillChange(CheckedTreeNode node) { - - } - - protected void adjustParentsAndChildren(final CheckedTreeNode node, final boolean checked) { - changeNodeState(node, checked); - if (!checked) { - if (myCheckPolicy.uncheckParentWithUncheckedChild) { - TreeNode parent = node.getParent(); - while (parent != null) { - if (parent instanceof CheckedTreeNode) { - changeNodeState((CheckedTreeNode)parent, false); - } - parent = parent.getParent(); - } - } - if (myCheckPolicy.uncheckChildrenWithUncheckedParent) { - uncheckChildren(node); - } - - } - else { - if (myCheckPolicy.checkChildrenWithCheckedParent) { - checkChildren(node); - } - - if (myCheckPolicy.checkParentWithCheckedChild) { - TreeNode parent = node.getParent(); - while (parent != null) { - if (parent instanceof CheckedTreeNode) { - changeNodeState((CheckedTreeNode)parent, true); - } - parent = parent.getParent(); - } - } - - } - repaint(); - } - - private void changeNodeState(final CheckedTreeNode node, final boolean checked) { - if (node.isChecked() != checked) { - nodeStateWillChange(node); - node.setChecked(checked); - onNodeStateChanged(node); - } - } - - private void uncheckChildren(final CheckedTreeNode node) { - final Enumeration children = node.children(); - while (children.hasMoreElements()) { - final Object o = children.nextElement(); - if (!(o instanceof CheckedTreeNode)) continue; - CheckedTreeNode child = (CheckedTreeNode)o; - changeNodeState(child, false); - uncheckChildren(child); - } - } - - private void checkChildren(final CheckedTreeNode node) { - final Enumeration children = node.children(); - while (children.hasMoreElements()) { - final Object o = children.nextElement(); - if (!(o instanceof CheckedTreeNode)) continue; - CheckedTreeNode child = (CheckedTreeNode)o; - changeNodeState(child, true); - checkChildren(child); - } } + @Deprecated protected void adjustParents(final CheckedTreeNode node, final boolean checked) { - TreeNode parentNode = node.getParent(); - if (!(parentNode instanceof CheckedTreeNode)) return; - CheckedTreeNode parent = (CheckedTreeNode)parentNode; - - if (!checked && isAllChildrenUnchecked(parent)) { - changeNodeState(parent, false); - adjustParents(parent, false); - } - else if (checked && isAllChildrenChecked(parent)) { - changeNodeState(parent, true); - adjustParents(parent, true); - } - } - - private static boolean isAllChildrenUnchecked(final CheckedTreeNode node) { - for (int i = 0; i < node.getChildCount(); i++) { - final TreeNode o = node.getChildAt(i); - if ((o instanceof CheckedTreeNode) && ((CheckedTreeNode)o).isChecked()) { - return false; - } - } - return true; - } - - private static boolean isAllChildrenChecked(final CheckedTreeNode node) { - for (int i = 0; i < node.getChildCount(); i++) { - final TreeNode o = node.getChildAt(i); - if ((o instanceof CheckedTreeNode) && !((CheckedTreeNode)o).isChecked()) { - return false; - } - } - return true; } public static class CheckboxTreeCellRendererBase extends JPanel implements TreeCellRenderer { @@ -395,8 +225,8 @@ public class CheckboxTreeBase extends Tree { } /** - * @deprecated * @see CheckboxTreeCellRendererBase#customizeRenderer(javax.swing.JTree, Object, boolean, boolean, boolean, int, boolean) + * @deprecated */ @Deprecated public void customizeCellRenderer(JTree tree, |