/* * org.openmicroscopy.shoola.util.ui.clsf.TreeCheckNode * *------------------------------------------------------------------------------ * Copyright (C) 2006 University of Dundee. All rights reserved. * * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * *------------------------------------------------------------------------------ */ package org.openmicroscopy.shoola.util.ui.clsf; //Java imports import java.util.Collections; import java.util.HashSet; import java.util.Iterator; import java.util.Set; import javax.swing.Icon; import javax.swing.tree.DefaultMutableTreeNode; //Third-party libraries //Application-internal dependencies /** * A {@link DefaultMutableTreeNode} node hosting the icon associated to the * node. * * @author Jean-Marie Burel      * <a href="mailto:j.burel@dundee.ac.uk">j.burel@dundee.ac.uk</a> * @version 2.2 * <small> * (<b>Internal version:</b> $Revision$ $Date$) * </small> * @since OME2.2 */ public class TreeCheckNode extends DefaultMutableTreeNode { /** The icon associated to that node. */ private Icon nodeIcon; /** Flag to indicate if the node is selected. */ private boolean selected; /** * The set of nodes that have been added to this node. * Will always be empty for a leaf node. */ private Set childrenDisplay; /** * Back pointer to the parent node or <code>null</code> if this is the root. */ private TreeCheckNode parentDisplay; /** The name of the node. Might be <code>null</code>. */ private String name; /** Indicates if the specified node as to be considered as a leaf node. */ private boolean leafNode; /** * Creates a new instance. * * @param hierarchyObject The hierarchy object associated to this node. * Mustn't be <code>null</code>. * @param nodeIcon The icon associated to this node. */ public TreeCheckNode(Object hierarchyObject, Icon nodeIcon) { this(hierarchyObject, nodeIcon, null, false); } /** * Creates a new instance. * * @param hierarchyObject The hierarchy object associated to this node. * Mustn't be <code>null</code>. * @param nodeIcon The icon associated to this node. * @param name The name of the node. * @param leafNode Passed <code>true</code> if the node is a leaf, * <code>false</code> otherwise. */ public TreeCheckNode(Object hierarchyObject, Icon nodeIcon, String name, boolean leafNode) { if (hierarchyObject == null) throw new IllegalArgumentException("No hierachyObject."); setUserObject(hierarchyObject); childrenDisplay = new HashSet(); this.nodeIcon = nodeIcon; this.name = name; this.leafNode = leafNode; } /** * Returns <code>true</code> if the node is considered as a leaf node, * <code>false</code> otherwise. * * @return See above. */ public boolean isLeafNode() { return leafNode; } /** * Returns the parent node or <code>null</code> if this is the root. * * @return See above. */ public TreeCheckNode getParentDisplay() { return parentDisplay; } /** * Returns all the child nodes to this node in the visualization tree. * Note that, although never <code>null</code>, the returned set may be * empty. In particular, this is always the case for a leaf node — * that is an {@link TreeCheckNode}. * * @return A <i>read-only</i> set containing all the child nodes. */ public Set getChildrenDisplay() { return Collections.unmodifiableSet(childrenDisplay); } /** * Returns <code>true</code> if the nodes contain children, * <code>false</code> otherwise. * * @return See above. */ public boolean hasChildrenDisplay() { return (childrenDisplay.size() != 0); } /** * Adds a node to the visualization tree as a child of this node. * The node is added to the internal desktop of this node, but you * will have to set its bounds for it to show up — this is a * consequence of the fact that a desktop has no layout manager. * The <code>child</code>'s parent is set to be this node. If <code> * child</code> is currently a child to another node <code>n</code>, * then <code>child</code> is first * {@link #removeChildDisplay(TreeCheckNode) removed} from <code>n</code> * and then added to this node. * * @param child The node to add. Mustn't be <code>null</code>. * @see DefaultMutableTreeNode */ public void addChildDisplay(TreeCheckNode child) { if (child == null) throw new NullPointerException("No child."); if (childrenDisplay.contains(child)) return; if (child.parentDisplay != null) //Was the child of another node. child.parentDisplay.removeChildDisplay(child); child.parentDisplay = this; childrenDisplay.add(child); } /** * Removes the specified <code>child</code> node. * If <code>child</code> is not among the children of this node, no action * is taken. Otherwise, it is removed from the children set and orphaned. * That is, its parent (which is this node) is set to <code>null</code>. * * @param child The node to remove. Mustn't be <code>null</code>. */ public void removeChildDisplay(TreeCheckNode child) { if (child == null) throw new NullPointerException("No child."); if (childrenDisplay.contains(child)) { //NOTE: parentDisplay != null b/c child has been added through //the add method. child.parentDisplay.childrenDisplay.remove(child); child.parentDisplay = null; } } /** Removes all <code>children</code> nodes from the children set. */ public void removeAllChildrenDisplay() { Iterator i = childrenDisplay.iterator(); Set toRemove = new HashSet(childrenDisplay.size()); while (i.hasNext()) toRemove.add(i.next()); i = toRemove.iterator(); while (i.hasNext()) removeChildDisplay((TreeCheckNode) i.next()); } /** * Returns the icon associated to that node. * * @return See above. */ public Icon getNodeIcon() { return nodeIcon; } /** * Returns <code>true</code> if the node is selected, <code>false</code> * otherwise. * * @return See above. */ public boolean isSelected() { return selected; } /** * Sets <code>true</code> if the node is selected, <code>false</code> * otherwise. * * @param selected The flag to set. */ public void setSelected(boolean selected) { this.selected = selected; } /** * Overridden to return the name of the node. * @see DefaultMutableTreeNode#toString() */ public String toString() { if (name != null) return name; return getUserObject().toString(); } }