/*******************************************************************************
 * Copyright (c) 2010 Boeing.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *     Boeing - initial API and implementation
 *******************************************************************************/
package org.eclipse.ote.ui.message.tree;

import java.util.Collection;
import java.util.Collections;
import org.eclipse.nebula.widgets.xviewer.core.model.XViewerColumn;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Image;

public abstract class AbstractTreeNode {
   private String treeViewName = "treeViewName";
   private AbstractTreeNode parent;
   private Image image;
   private int level;
   private boolean enabled = true;
   private volatile boolean isSelected = false;
   private volatile boolean isDisposed = false;
   private boolean hasMappingToCurrentMemType = true;
   private String disabledReason = "";

   private boolean isChecked = false;

   public AbstractTreeNode(final String treeViewName) {
      this(treeViewName, null);
   }

   /**
    * constructs the node and adds this node to the parent
    */
   public AbstractTreeNode(final String treeViewName, final Image image) {
      this.treeViewName = treeViewName;
      this.image = image;
   }

   protected void setParent(AbstractTreeNode parent) {
      this.parent = parent;
   }

   protected void setImage(Image image) {
      this.image = image;
   }

   /**
    * sets the level or depth of this node. Usually the root is level 0. The level policy is up to the implementation
    */
   protected void setLevel(final int level) {
      this.level = level;
   }

   /**
    * @return Returns the isDisposed.
    */
   public boolean isDisposed() {
      return isDisposed;
   }

   /**
    * destroys the node. Must be called by the parent that wants to remove the child
    * 
    * @param isDisposed The isDisposed to set.
    */
   protected void dispose() {
      removeAll();
      this.isDisposed = true;
   }

   /**
    * gets the name of this node as it would appear in a tree view
    * 
    * @return Returns tree view name string.
    */
   public String getName() {
      return treeViewName;
   }

   abstract String getLabel();

   /**
    * Returns the parent name and this node's name seperated by a dot. If the parent of this node is null then it will
    * return exactly the same as {@link #treeViewName}.
    * 
    * @return Returns qualified name string. exactly the same as {@link #getName()}.
    */
   public String getQualifiedName() {
      if (parent != null) {
         return parent.treeViewName + '.' + treeViewName;
      } else {
         return treeViewName;
      }
   }

   /**
    * gets the level of this node. Level represents the number of descendants this node has. Root has a level of zero
    * 
    * @return Returns level value.
    */
   public int getLevel() {
      return level;
   }

   /**
    * Gets the parent node of this node
    * 
    * @return the parent node or null if no parent exist for this node
    */
   public AbstractTreeNode getParent() {
      return parent;
   }

   /**
    * returns an image that can be displayed
    * 
    * @return Returns image object reference.
    */
   public Image getImage(XViewerColumn columns) {
      return image;
   }

   abstract public void deleteChildren(Collection<AbstractTreeNode> children);

   abstract public void removeAll();

   abstract public boolean hasChildren();

   abstract public Collection<? extends AbstractTreeNode> getChildren();

   public void delete() {
      if (getParent() != null) {
         getParent().deleteChildren(Collections.singleton(this));
      }
   }

   public abstract boolean canSetValue();

   /**
    * Sets the flag determining whether the node can be edited or displays anything in the right-click pop-up menu. For
    * right now this will only apply to non-mapping elements which exist solely in pub/sub and not in other physical
    * types.
    * 
    * @param hasAMapping true if node should be able to be edited.
    */
   public void setHasMappingToCurrentMemType(boolean hasAMapping) {
      this.hasMappingToCurrentMemType = hasAMapping;
   }

   public boolean hasMappingToCurrentMemType() {
      return this.hasMappingToCurrentMemType;
   }

   public void setEnabled(boolean enabled) {
      this.enabled = enabled;
   }

   public boolean isEnabled() {
      return enabled;
   }

   public boolean isSelected() {
      return isSelected;
   }

   public void setSelected(final boolean selected) {
      isSelected = selected;
   }

   public abstract <T> T visit(INodeVisitor<T> visitor);

   public String getLabel(XViewerColumn columns) {
      return "";
   }
   
   public Color getBackground(XViewerColumn col) {
      return null;
   }

   public Image getImage() {
      return image;
   }

   public String getDisabledReason() {
      return disabledReason;
   }

   public void setDisabledReason(String disabledReason) {
      this.disabledReason = disabledReason;
   }

   public boolean isChecked() {
      return isChecked;
   }

   public void setChecked(boolean checked) {
      this.isChecked = checked;
   }

   /**
    * @return
    */
   public Color getBackground() {
      return null;
   }

}
