package org.mypsycho.swing.tree; import java.util.Enumeration; import javax.swing.tree.DefaultMutableTreeNode; import javax.swing.tree.MutableTreeNode; import javax.swing.tree.TreeModel; import javax.swing.tree.TreePath; /** * <p>Title : </p> * <p>Description : </p> * <p>Copyright : Copyright (c) 2004</p> * <p>Company : </p> * @author non attribuable * @version 1.0 */ public class DefaultCheckTreeNode extends DefaultMutableTreeNode implements MutableCheckTreeNode { private static final long serialVersionUID = -1875604487001167147L; boolean allSelected = false; boolean someSelected = false; public DefaultCheckTreeNode() { this(null, false); } public DefaultCheckTreeNode(Object userObject) { this(userObject, false); } public DefaultCheckTreeNode(Object userObject, boolean selected) { super(userObject); allSelected = selected; } public void insert(MutableTreeNode newChild, int childIndex) { super.insert((MutableCheckTreeNode) newChild, childIndex); } public void remove(int childIndex) { super.remove(childIndex); } public boolean isAllSelected() { return allSelected; } public boolean isSomeSelected() { return someSelected; } public void setSelected(boolean selected, TreeModel model) { if (selected && allSelected) { // No change return; } if (!selected && !allSelected && !someSelected) { // No change return; } if (getChildCount() == 0) { // No children allSelected = selected; someSelected = false; // May be useless model.valueForPathChanged(new TreePath(getPath()), getUserObject()); validateParentSelection(model); } else { for (Enumeration<?> eChildren = children(); eChildren.hasMoreElements(); ) { ((CheckTreeNode) eChildren.nextElement()).setSelected(selected, model); } } } /** * Called when the state of a child may have changed. */ public void validateSelection(TreeModel model) { if (getChildCount() == 0) { // Maybe the last child has been removed if (someSelected) { someSelected = false; } validateParentSelection(model); return; } boolean nowAllSelected = true; boolean nowSomeSelected = false; // Compute the new state. for (Enumeration<?> eChildren = children(); eChildren.hasMoreElements(); ) { CheckTreeNode node = (CheckTreeNode) eChildren.nextElement(); if (!node.isAllSelected()) { nowAllSelected = false; if (nowSomeSelected) break; if (node.isSomeSelected()) { nowSomeSelected = true; break; } } else { nowSomeSelected = true; } } if (nowAllSelected) nowSomeSelected = false; // Notify when the state changed. if ((nowAllSelected != allSelected) || (nowSomeSelected != someSelected)) { allSelected = nowAllSelected; someSelected = nowSomeSelected; model.valueForPathChanged(new TreePath(getPath()), getUserObject()); // Propagate to validation to the parent. validateParentSelection(model); } } protected void validateParentSelection(TreeModel model) { if (getParent() != null) { ((CheckTreeNode) getParent()).validateSelection(model); } } } // ednDefaultCheckTreeNode extends