/*
* Copyright 2003-2010 Tufts University Licensed under the
* Educational Community License, Version 2.0 (the "License"); you may
* not use this file except in compliance with the License. You may
* obtain a copy of the License at
*
* http://www.osedu.org/licenses/ECL-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an "AS IS"
* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
* or implied. See the License for the specific language governing
* permissions and limitations under the License.
*/
/*
* HierarchyNode.java
*
* Created on October 2, 2003, 11:11 AM
*/
package tufts.oki.hierarchy;
import java.util.Vector;
import java.util.Enumeration;
import javax.swing.tree.DefaultMutableTreeNode;
import tufts.vue.LWComponent;
import tufts.vue.VUE;
/**
*
* @author Daisuke Fujiwara
* todo: re-implement so doesn't cache a copy of the node name?
* or: make a label change listener on the LWComponent
*/
/**A class that represents a node of a hierarchy structure*/
public class HierarchyNode implements osid.hierarchy.Node
{
private osid.shared.Type type;
private osid.shared.Id id;
private String name;
private String description;
private DefaultMutableTreeNode treeNode;
private LWComponent component;
/** Creates a new instance of HierarchyNode */
public HierarchyNode(osid.shared.Id id, DefaultMutableTreeNode treeNode)
{
type = null;
this.id = id;
name = null;
description = null;
component = null;
this.treeNode = treeNode;
}
/**A method that retrieves the children of the node*/
public osid.hierarchy.NodeIterator getChildren() throws osid.hierarchy.HierarchyException
{
if (treeNode == null)
throw new osid.hierarchy.HierarchyException("tree node is null");
Vector children = new Vector();
for (Enumeration e = treeNode.children(); e.hasMoreElements();)
{
Object nextElement = e.nextElement();
//for each child node, retrieves the hierarchy node associated with it and adds to the node vector
DefaultMutableTreeNode childTreeNode = (DefaultMutableTreeNode) nextElement;
children.addElement((osid.hierarchy.Node) (childTreeNode.getUserObject()));
}
return (osid.hierarchy.NodeIterator) (new HierarchyNodeIterator(children));
}
/**A method that returns the node's ID*/
public osid.shared.Id getId() throws osid.hierarchy.HierarchyException
{
return id;
}
/**A method that returns the node's display name*/
public String getDisplayName() throws osid.hierarchy.HierarchyException
{
//return component.getDisplayLabel();
return name;
}
/**A method that modifies the node's display name*/
public void updateDisplayName(java.lang.String name) throws osid.hierarchy.HierarchyException
{
if (name == null)
throw new osid.hierarchy.HierarchyException("display name is null");
this.name = name;
}
/**A method that returns the node's description*/
public String getDescription() throws osid.hierarchy.HierarchyException
{
return this.description;
}
/**A method that modifies the node's description*/
public void updateDescription(java.lang.String description) throws osid.hierarchy.HierarchyException
{
if (description == null)
throw new osid.hierarchy.HierarchyException("description is null");
this.description = description;
}
/**A method that retrieves the parents of the node*/
public osid.hierarchy.NodeIterator getParents() throws osid.hierarchy.HierarchyException
{
if (treeNode == null)
throw new osid.hierarchy.HierarchyException("tree node is null");
Vector parents = new java.util.Vector();
DefaultMutableTreeNode parentTreeNode = (DefaultMutableTreeNode) treeNode.getParent();
//this ONLY works for the single parent structure
if (parentTreeNode != null)
parents.addElement((osid.hierarchy.Node) (parentTreeNode.getUserObject()));
//maybe not needed, since you can check for this one level up
else
throw new osid.hierarchy.HierarchyException("this node doesn't have a parent");
return (osid.hierarchy.NodeIterator) (new HierarchyNodeIterator(parents));
}
/**A method that sets the type of the node*/
public void setType(osid.shared.Type type) throws osid.hierarchy.HierarchyException
{
this.type = type;
}
/**A method that gets the type of the node*/
public osid.shared.Type getType() throws osid.hierarchy.HierarchyException
{
return type;
}
/**A method that indicates whether the node is a leaf or not*/
public boolean isLeaf() throws osid.hierarchy.HierarchyException
{
return treeNode.isLeaf();
}
/** method that indicates whether the node is a root or not*/
public boolean isRoot() throws osid.hierarchy.HierarchyException
{
return treeNode.isRoot();
}
/**A method that adds a parent to the node*/
public void addParent(osid.shared.Id nodeId) throws osid.hierarchy.HierarchyException
{
//unimplmented
}
/**A method that removes a parent from the node*/
public void removeParent(osid.shared.Id nodeId) throws osid.hierarchy.HierarchyException
{
//unimplemented
}
/**A method that changes a parent to another parent*/
public void changeParent(osid.shared.Id first, osid.shared.Id second) throws osid.hierarchy.HierarchyException
{
//unimplemented
}
/** custom methods */
/**A method that returns the tree node associated with the hierarchy node*/
public DefaultMutableTreeNode getTreeNode()
{
return treeNode;
}
/**A method that changes the label associated with the LWComponent*/
public void changeLWComponentLabel(String label) throws osid.hierarchy.HierarchyException
{
if (!component.getDisplayLabel().equals(label)) {
component.setLabel(label);
updateDisplayName(label);
//creating an undo action
VUE.getUndoManager().mark();
}
}
/**A method that sets the LWComponent associated with the hierarchy node*/
public void setLWComponent(LWComponent component)
{
this.component = component;
}
/**A method that gets the LWComponent associated with the hierarchy node*/
public LWComponent getLWComponent()
{
return component;
}
/**A method that returns the string representation of the node*/
public String toString()
{
return name;
}
}