/**
* Title: idegaTree<p>
* Description: <p>
* Copyright: Copyright (c) idega<p>
* Company: idega margmi�lun<p>
* @author idega 2000 - idega team - <a href="mailto:gummi@idega.is">gummi@idega.is</a>
* @version 1.0
*/
package com.idega.util;
import java.util.*;
public class IdegaTree {
private Hashtable theTree;
public IdegaTree() {
this.theTree = new Hashtable();
}
public Object getNode(Object node_id){
IdegaNode myNode = (IdegaNode)(this.theTree.get(node_id));
return myNode.getNode();
}
public Vector getChildren_ids(Object node_id){
IdegaNode myNode = (IdegaNode)(this.theTree.get(node_id));
return myNode.getChildren_ids();
}
public Vector getChildrens(Object node_id){
IdegaNode myNode = (IdegaNode)(this.theTree.get(node_id));
Vector Child_ids = myNode.getChildren_ids();
Vector Childs = new Vector();
IdegaNode returnNode = new IdegaNode();
for (int i = 0; i < Child_ids.size(); i++){
returnNode = new IdegaNode(Child_ids.elementAt(i));
Childs.add(returnNode.getNode());
}
return Childs;
}
public Object getParentID(Object node_id){
IdegaNode myNode = (IdegaNode)(this.theTree.get(node_id));
return myNode.getParentID();
}
/**
* �etta fall byr til t�man hnut sem foreldri ef �a� er ekki til fyrir og
* skrifar �ar af lei�andi yfir hnut komi annar me� sama ID.
*/
public void addNode(Object theObject, Object node_id, Object parent_id){
if (!this.theTree.contains(node_id)){
IdegaNode myNode = new IdegaNode(parent_id);
myNode.addNode(theObject);
this.theTree.put(node_id,myNode);
addChilde( node_id, parent_id);
} else{
IdegaNode myNode = (IdegaNode)(this.theTree.remove(node_id));
myNode.addNode(theObject);
myNode.setParent(parent_id);
this.theTree.put(node_id,myNode);
addChilde( node_id, parent_id);
}
}
/**
* �etta fall krefst �ess a� foreldri se til i trenu
*/
public void addNodeInOrder(Object theObject, Object node_id, Object parent_id){
IdegaNode myNode = new IdegaNode(parent_id);
myNode.addNode(theObject);
this.theTree.put(node_id,myNode);
addChildeInOrder( node_id, parent_id);
}
/**
* ei�ir hnut en f�rir b�rn sin a foreldri sitt
*/
public void removeNode(Object node_id){
IdegaNode thisNode = (IdegaNode)(this.theTree.remove(node_id));
removeChilde( node_id, thisNode.getParentID()); //from Parent
Vector childes = thisNode.getChildren_ids();
for (int i = 0; i < childes.size(); i++ ){
addChilde( childes.elementAt(i), thisNode.getParentID() );
}
}
/**
* ei�ir hnut og �llu �vi sem fyrir ne�an hann er (ekki utf�rt)
*/
public void removeNodesTree(Object node_id){
IdegaNode thisNode = (IdegaNode)(this.theTree.remove(node_id));
removeChilde( node_id, thisNode.getParentID()); //from Parent
}
/**
* Kallar � toString() falli� ur Hashtable hlutnum sem heldur utan um tr��.
*/
public String toString(){
return this.theTree.toString();
}
// ### Private - F�ll ###
private void removeChilde(Object childe, Object parent){ // from parent
IdegaNode myNode = (IdegaNode)(this.theTree.remove(parent));
myNode.removeChildren(childe);
this.theTree.put(parent, myNode);
}
private void addChilde( Object childe, Object parent){
if (this.theTree.contains(parent)){
IdegaNode myNode = (IdegaNode)(this.theTree.remove(parent));
myNode.addChildren(childe);
this.theTree.put( parent, myNode);
} else{
IdegaNode myNode = new IdegaNode();
myNode.addChildren(childe);
this.theTree.put( parent, myNode);
}
}
private void addChildeInOrder(Object childe, Object parent){
IdegaNode myNode = (IdegaNode)(this.theTree.remove(parent));
myNode.addChildren(childe);
this.theTree.put(parent, myNode);
}
private class IdegaNode{
// private Object id;
private Object myParentID;
private Vector childeIDs;
private Object theNode;
public IdegaNode(Object parent_id){
this.myParentID = parent_id;
this.childeIDs = new Vector();
this.childeIDs.trimToSize();
}
public IdegaNode(){
this.childeIDs = new Vector();
this.childeIDs.trimToSize();
}
/*
public IdegaNode(Object node_id){
id = node_id;
}
/*
public Object getNodeID(){
return id;
}*/
public void setParent(Object parent_id){
this.myParentID = parent_id;
}
public void addChildren( Object children_id ){
this.childeIDs.add(children_id);
this.childeIDs.trimToSize();
}
public void addNode( Object Node ){
this.theNode = Node;
}
public Object getNode(){
return this.theNode;
}
public boolean hasChildren(){
return (this.childeIDs.size() > 0);
}
public boolean removeChildren( Object children_id ){
boolean temp = this.childeIDs.remove(children_id);
this.childeIDs.trimToSize();
return temp;
}
public Vector getChildren_ids(){
return this.childeIDs;
}
public Object getParentID(){
return this.myParentID;
}
} // class IdegaNode
} // class IdegaTree