package splar.core.fm;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Vector;
import javax.swing.tree.DefaultMutableTreeNode;
import splar.core.constraints.BooleanVariableInterface;
public class FeatureTreeNode extends DefaultMutableTreeNode implements BooleanVariableInterface, Cloneable {
public static final int UNKNOWN = -1;
public static final int DESELECTED = 0;
public static final int SELECTED = 1;
protected int value = UNKNOWN;
protected boolean isImmutable = false;
protected Map<String,Object> properties;
private IFNodeRenderer nodeRenderer = null;
private String name = "";
private String id = "";
private HashMap<String,FeatureTreeNodeState> states;
// list variables that were propagated from this node
private List<FeatureTreeNode> propagatedNodes = new Vector<FeatureTreeNode>();
// points to the node that caused this node automatic assignment (propagation)
private BooleanVariableInterface propagationVar = null;
public FeatureTreeNode( String id, String name, IFNodeRenderer nodeRenderer ) {
this.id = id;
this.name = name;
this.nodeRenderer = nodeRenderer;
states = new HashMap<String, FeatureTreeNodeState>();
reset();
}
public FeatureTreeNodeState getState(String stateID) {
return states.get(stateID);
}
public void saveState(String stateID) {
FeatureTreeNodeState state = new FeatureTreeNodeState(stateID, this);
state.save();
states.put(stateID, state);
}
public void restoreState(String stateID) {
restoreState(stateID, true);
}
public void restoreState(String stateID, boolean discardState) {
FeatureTreeNodeState state = states.get(stateID);
if ( state != null ) {
state.restore();
if ( discardState ) {
discardState(stateID);
}
}
}
public void discardState(String stateID) {
FeatureTreeNodeState state = states.get(stateID);
if ( state != null ) {
state.discard();
states.remove(stateID);
}
}
public void reset() {
this.value = UNKNOWN;
properties = new LinkedHashMap<String, Object>();
}
public void setProperty(String name, Object object) {
properties.put(name, object);
}
public Object getProperty(String name) {
return properties.get(name);
}
public void setID(String ID) {
this.id = ID;
}
public void setName(String name) {
this.name = name;
}
public boolean isAncestorOf(FeatureTreeNode node) {
FeatureTreeNode ancestor = node;
do {
ancestor = (FeatureTreeNode)ancestor.getParent();
if ( this == ancestor ) {
return true;
}
}
while( ancestor != null);
return false;
}
public void setPropagatedNodes(List<FeatureTreeNode> propagatedNodes) {
this.propagatedNodes = propagatedNodes;
}
public List<FeatureTreeNode> getPropagatedNodes() {
return propagatedNodes;
}
public IFNodeRenderer getRenderer() {
return nodeRenderer;
}
public String getID() {
return id;
}
public String getName() {
return name;
}
public String getDescription() {
return getName();
}
public void setImmutable(boolean immutable) {
isImmutable = immutable;
}
public boolean isImmutable() {
return isImmutable;
}
public boolean isInstantiated() {
return (value != UNKNOWN);
}
public void resetValue() {
if ( !isImmutable ) {
value = UNKNOWN;
}
}
public boolean isPropagation() {
return (propagationVar != null);
}
public BooleanVariableInterface getPropagationVariable() {
return propagationVar;
}
public void assignValue(int value, BooleanVariableInterface propagationVar) {
if ( !isImmutable ) {
this.value = value;
this.propagationVar = propagationVar;
}
}
public void assignValue(int value) {
if ( !isImmutable ) {
this.value = value;
}
}
public int getValue() {
return value;
}
public int hashCode() {
return id.hashCode();
}
public boolean equals(Object var) {
if ( var == null )
return false;
// if ( var instanceof BooleanVariable) {
// return id.equals(((BooleanVariable)var).getID());
// }
return id.equals(((BooleanVariableInterface)var).getID());
}
public String toString() {
return getName() + "(" + getID() +")"; // <!-- :value=" + value +"-->";
}
public void dump() {
System.out.println(getName() + "(" + getID() +") = "+ value );
System.out.println("Properties");
for( String key : properties.keySet() ) {
System.out.println("-> " + key + " = " + properties.get(key));
}
}
private Object attachedData;
public void attachData(Object object) {
attachedData= object;
}
public void resetAttachedData() {
attachedData = null;
}
public Object getAttachedData() {
return attachedData;
}
}