blob: 4f0d04b5a5ee19c2ecd678f716feff6935bb4bb5 [file] [log] [blame]
/*
* Copyright (c) 2018 Oracle and/or its affiliates. All rights reserved.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v. 2.0, which is available at
* http://www.eclipse.org/legal/epl-2.0.
*
* This Source Code may also be made available under the following Secondary
* Licenses when the conditions for such availability set forth in the
* Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
* version 2 with the GNU Classpath Exception, which is available at
* https://www.gnu.org/software/classpath/license.html.
*
* SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
*/
/*
* $Id: Node.java,v 1.4 2004/11/14 07:33:14 tcfujii Exp $
*/
package components.model;
import java.util.ArrayList;
import java.util.Iterator;
/**
* <p>Node is a JavaBean representing a node in a tree control or menu.</p>
*/
public class Node {
// ----------------------------------------------------------- Constructors
// No-args constructor
public Node() {
super();
}
// Full-up constructor
public Node(String name, String label, String action, String icon,
boolean enabled, boolean expanded) {
setName(name);
setLabel(label);
setAction(action);
setIcon(icon);
setEnabled(enabled);
setExpanded(expanded);
}
// ----------------------------------------------------- Instance Variables
/**
* Maintains a list of all the child nodes of this node.
*/
private ArrayList children = new ArrayList();
// ------------------------------------------------------------- Properties
/**
* The <code>Graph</code> instance representing the
* entire tree.
*/
protected Graph graph = null;
void setGraph(Graph graph) {
this.graph = graph;
}
public Graph getGraph() {
return graph;
}
/*
* Node action (context-relative URL triggered when node selected)
*/
private String action = null;
public String getAction() {
return (this.action);
}
public void setAction(String action) {
this.action = action;
}
private String icon = null;
/*
* Icon for this node if any.
*/
public String getIcon() {
return (this.icon);
}
public void setIcon(String icon) {
this.icon = icon;
}
/*
* Returns the number of children of this Node.
*/
public int getChildCount() {
return (children.size());
}
/*
* The nesting depth of this Node
*/
private int depth = 1;
public int getDepth() {
return (this.depth);
}
/*
* Is this node currently enabled (available for use by the user)?
*/
private boolean enabled = false;
public boolean isEnabled() {
return (this.enabled);
}
public void setEnabled(boolean enabled) {
this.enabled = enabled;
}
/*
* Is this node currently expanded (in a tree control) or open (in a menu)?
*/
private boolean expanded = false;
public boolean isExpanded() {
return (this.expanded);
}
public void setExpanded(boolean expanded) {
this.expanded = expanded;
}
/*
* Node label (visible representation)
*/
private String label = null;
public String getLabel() {
return (this.label);
}
public void setLabel(String label) {
this.label = label;
}
/*
* Node name
*/
private String name = null;
public String getName() {
return (this.name);
}
public void setName(String name) {
this.name = name;
}
/*
* The parent Node
*/
private Node parent = null;
public Node getParent() {
return (this.parent);
}
void setParent(Node parent) {
this.parent = parent;
if (parent == null) {
depth = 1;
} else {
depth = parent.getDepth() + 1;
}
}
/*
* Returns the absolute path of this node
*/
public String getPath() {
Node parent = getParent();
if (parent == null) {
return ("/");
}
ArrayList list = new ArrayList();
list.add(getName());
while (parent != null) {
list.add(0, parent.getPath());
parent = parent.getParent();
}
StringBuffer sb = new StringBuffer();
int n = list.size();
for (int i = 0; i < n; i++) {
if (i != 1) {
sb.append("/");
}
if (i > 0) {
sb.append((String) list.get(i));
}
}
return (sb.toString());
}
/*
* Is this node the currently selected one in the entire tree?
*/
private boolean selected = false;
public boolean isSelected() {
return (this.selected);
}
void setSelected(boolean selected) {
this.selected = selected;
}
/**
* Is this the last node in the set of children for our parent node?
*/
protected boolean last = false;
public boolean isLast() {
return (this.last);
}
void setLast(boolean last) {
this.last = last;
}
/**
* <p> Is this a "leaf" node that is with no children?
*/
public boolean isLeaf() {
synchronized (children) {
return (children.size() < 1);
}
}
// --------------------------------------------------------- Public Methods
/**
* Adds the specified node as a child of this node and sets this node
* as its parent.
*/
public void addChild(Node child) {
if (child.getParent() != null) {
throw new IllegalArgumentException("Child already has a parent");
}
// if graph is created after all the nodes are created, then
// graph will be null.
if (graph != null) {
graph.addNode(child);
}
synchronized (children) {
children.add(child);
}
child.setParent(this);
int n = children.size();
if (n > 0) {
Node node = (Node) children.get(n - 1);
node.setLast(false);
}
child.setLast(true);
}
/**
* Adds the specified node as a child of this node at the
* specifed offset and sets this node as its parent.
*/
public void addChild(int offset, Node child) {
if (child.getParent() != null) {
throw new IllegalArgumentException("Child already has a parent");
}
if (graph != null) {
graph.addNode(child);
}
synchronized (children) {
children.add(offset, child);
}
child.setParent(this);
}
/**
* Returns the node with the specified name by looking up
* by child list. If node is not found returns <code>null</code>
*/
public Node findChild(String name) {
int n = children.size();
for (int i = 0; i < n; i++) {
Node kid = (Node) children.get(i);
if (name.equals(kid.getName())) {
return (kid);
}
}
return (null);
}
/**
* Returns and <code>iterator</code> over the children of this node.
*/
public Iterator getChildren() {
return (children.iterator());
}
/**
* Removes the specified node from the child list of this node.
*/
public void removeChild(Node child) {
if (child.getParent() != this) {
throw new IllegalArgumentException(
"Child not related to this node");
}
synchronized (children) {
children.remove(child);
}
graph.removeNode(child);
child.setParent(null);
}
/**
* Returns a string representing a description of this node.
*/
public String toString() {
StringBuffer sb = new StringBuffer("Node[name=");
sb.append(name);
if (label != null) {
sb.append(",label=");
sb.append(label);
}
if (action != null) {
sb.append(",action=");
sb.append(action);
}
sb.append(",enabled=");
sb.append(enabled);
sb.append(",expanded=");
sb.append(expanded);
sb.append("]");
return sb.toString();
}
}