/*
 * Licensed Materials - Property of Rogue Wave Software, Inc. 
 * © Copyright Rogue Wave Software, Inc. 2014, 2015 
 * © Copyright IBM Corp. 2009, 2014
 * © Copyright ILOG 1996, 2009
 * All Rights Reserved.
 *
 * Note to U.S. Government Users Restricted Rights:
 * The Software and Documentation were developed at private expense and
 * are "Commercial Items" as that term is defined at 48 CFR 2.101,
 * consisting of "Commercial Computer Software" and
 * "Commercial Computer Software Documentation", as such terms are
 * used in 48 CFR 12.212 or 48 CFR 227.7202-1 through 227.7202-4,
 * as applicable.
 */

import ilog.views.sdm.model.IlvSDMNode;

import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.TreeModel;
import java.util.Enumeration;
import java.util.Vector;

public class TreeSDMNode implements IlvSDMNode
{
  private TreeSDMNode parent;
  private TreeModel treeModel;
  private Object treeNode;
  private Vector children;

  public TreeSDMNode(TreeModel treeModel, TreeSDMNode parent, Object treeNode)
  {
    this.parent = parent;
    this.treeModel = treeModel;
    this.treeNode = treeNode;
    
    createChildren();
  }

  public String getTag()
  {
    return "treenode";
  }

  public String getID()
  {
    return String.valueOf(hashCode());
  }

  public Enumeration getChildren()
  {
    return children.elements();
  }

  public IlvSDMNode getParent()
  {
    return parent;
  }
  
  public Object getProperty(String property)
  {
    if(treeNode instanceof DefaultMutableTreeNode){
      if(property.equals("userObject")){
        return ((DefaultMutableTreeNode)treeNode).getUserObject();
      }
      if(property.equals("CSSclass") && ((DefaultMutableTreeNode)treeNode).getParent() != null){
        return ((DefaultMutableTreeNode)((DefaultMutableTreeNode)treeNode).getParent()).getUserObject();
      }
    }
    return null;
  }
  
  public String[] getPropertyNames()
  {
    if(treeNode instanceof DefaultMutableTreeNode)
      return new String[] { "userObject", "CSSclass" };
    else
      return new String[0];
  }
  
  // Private methods.
  
  private void createChildren()
  {
    children = new Vector();
    
    int count = treeModel.getChildCount(treeNode);
    for(int i = 0; i < count; i++){
      Object childTreeNode = treeModel.getChild(treeNode, i);
      
      TreeSDMNode childSDMNode = new TreeSDMNode(treeModel, this, childTreeNode);
      children.addElement(childSDMNode);
      
      TreeSDMLink childSDMLink = new TreeSDMLink(this, childSDMNode);
      children.addElement(childSDMLink);
    }
  }
}