//------------------------------------------------------------------------------
// Copyright (c) 2005, 2006 IBM Corporation and others.
// 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:
// IBM Corporation - initial implementation
//------------------------------------------------------------------------------
package org.eclipse.epf.library.layout;

import java.util.ArrayList;
import java.util.List;

import org.eclipse.epf.library.layout.util.XmlElement;

/**
 * This class defines the bookmark data structure for the published bookmark entries. 
 * 
 * @author Jinhua Xi
 * @since 1.0
 */
public class Bookmark {

	static final long serialVersionUID = -3652582791326323863L;

	// points to the description file in the file system
	private String _fileName = ""; //$NON-NLS-1$

	// used as "closed" or "default" icon
	private String _closedIconName = ""; //$NON-NLS-1$

	// used as "open" icon
	private String _openIconName = ""; //$NON-NLS-1$

	// presentation name of the entry
	private String _presentationName = ""; //$NON-NLS-1$

	// whether mouse is over the bookmark
	// this is for backwards compatibility
	// private boolean _isMouseOver = false;

	// whether the file exists in the file system
	private boolean _isExist = true;

	// whether the file is from content library
	private boolean _isFromContentLibrary = true;

	// unique id.
	// A bookmark may not have a uniqueID in which case the
	// bookmark has no relation to any layout elements.
	private String _uniqueId = null;

	// whether the bookmark is visible
	private boolean _isVisible = true;

	// whether the bookmark is enabled
	// this is to support a special case where bookmarks
	// are to remain hidden and cannot be unhidden as
	// well as transparency
	private boolean _isEnabled = true;

	// whether the bookmark is transparent
	private boolean _isTransparent = false;

	// whether the bookmark is a default one
	// default means that it is published and is read-only
	private boolean _isDefault = false;

	// whether the bookmark is the current one
	// current means the first one to be focused on
	private boolean _isCurrent = false;

	private String queryString = ""; //$NON-NLS-1$
	
	private List children = new ArrayList();

	private Bookmark parent = null;
	
	// the owner element of the node
	private Object owner = null;
	
	/**
	 * Default constructor. Takes in the presentation name of the process layout
	 * entry.
	 */
	public Bookmark(String name) {
		_uniqueId = null;
		_presentationName = name;
		if (_presentationName == null) {
			_presentationName = ""; //$NON-NLS-1$
		}
	}

	/**
	 * Name and uniqueId for a layout node.
	 */
	public Bookmark(String presentationName, String uniqueId) {
		this(presentationName);
		_uniqueId = uniqueId;

	}

	public void setOwner(Object element) {
		this.owner = element;
	}
	
	public Object getOwner() {
		return this.owner;
	}
	
	/**
	 * Override to return presentation name as the user object.
	 */
	public Object getUserObject() {
		return (_presentationName);
	}

	/**
	 * set the user object
	 * @param userObject Object
	 */
	public void setUserObject(Object userObject) {
		_presentationName = (String) userObject;
		if (_presentationName == null) {
			_presentationName = ""; //$NON-NLS-1$
		}
	}

	/**
	 * set the presentation name
	 * 
	 * @param name String
	 */
	public void setPresentationName(String name) {
		_presentationName = name;
		if (_presentationName == null) {
			_presentationName = ""; //$NON-NLS-1$
		}
	}

	/**
	 * get the presentation name
	 * 
	 * @return String
	 */
	public String getPresentationName() {
		return (_presentationName);
	}

	/**
	 * set the file name
	 * 
	 * @param name String
	 */
	public void setFileName(String name) {
		_fileName = name;
		if (_fileName == null) {
			_fileName = ""; //$NON-NLS-1$
		}
	}

	/**
	 * get the file name
	 * 
	 * @return String
	 */
	public String getFileName() {
		return (_fileName);
	}

	/**
	 * set the icon name for the closed icon
	 * @param name String
	 */
	public void setClosedIconName(String name) {
		_closedIconName = name;
	}

	/**
	 * get the closed icon name
	 * 
	 * @return String
	 */
	public String getClosedIconName() {
		return (_closedIconName);
	}

	/**
	 * get the open icon name
	 * 
	 * @return String the open icon name
	 */
	public String getOpenIconName() {
		return (_openIconName);
	}

	/**
	 * set the open icon name
	 * 
	 * @param name String
	 */
	public void setOpenIconName(String name) {
		_openIconName = name;
	}

	/**
	 * set the exist flag
	 * 
	 * @param isExist boolean
	 */
	public void setExist(boolean isExist) {
		_isExist = isExist;
	}

	/**
	 * get the exist flag
	 * 
	 * @return boolean
	 */
	public boolean isExist() {
		return (_isExist);
	}

	/**
	 * this is a legacy method, not used any more
	 * @deprecated
	 * @param flag boolean
	 */
	public void setFromContentLibrary(boolean flag) {
		_isFromContentLibrary = flag;
	}

	/**
	 * this is a legacy method, not used any more
	 * @deprecated
	 * @return boolean
	 */
	public boolean isFromContentLibrary() {
		return (_isFromContentLibrary);
	}

	/**
	 * get the unique id of the bookmark
	 * 
	 * @return String
	 */
	public String getUniqueId() {
		return (_uniqueId);
	}

	/**
	 * set the unique id of the bookmark
	 * 
	 * @param uniqueId String
	 */
	public void setUniqueId(String uniqueId) {
		_uniqueId = uniqueId;
	}

	/**
	 * set the visible flag
	 * 
	 * @param isVisible boolean
	 */
	public void setVisible(boolean isVisible) {
		_isVisible = isVisible;
		// special case where all children need to change as well
		for (int i = 0; i < getChildCount(); i++) {
			Bookmark child = (Bookmark) ((Bookmark) getChildAt(i));
			child.setVisible(isVisible);
		}
	}

	/**
	 * get the visible flag
	 * 
	 * @return boolean
	 */
	public boolean isVisible() {
		return (_isVisible);
	}

	/**
	 * set the enabled flag
	 * 
	 * @param isEnabled boolean
	 */
	public void setEnabled(boolean isEnabled) {
		_isEnabled = isEnabled;
		// special case where all children need to change as well
		for (int i = 0; i < getChildCount(); i++) {
			Bookmark child = (Bookmark) ((Bookmark) getChildAt(i));
			child.setEnabled(isEnabled);
		}
	}

	/**
	 * get the enabled flag
	 * 
	 * @return boolean
	 */
	public boolean isEnabled() {
		return (_isEnabled);
	}

	/**
	 * set the transparant flag
	 * 
	 * @param isTransparent boolean
	 */
	public void setTransparency(boolean isTransparent) {
		// set at this bookmark only, not children
		_isTransparent = isTransparent;
	}

	/**
	 * get the transparent flag
	 * 
	 * @return boolean
	 */
	public boolean isTransparent() {
		return (_isTransparent);
	}

	/**
	 * set the bookmark as default
	 * 
	 * @param isDefault boolean
	 */
	public void setDefault(boolean isDefault) {
		_isDefault = isDefault;
	}

	/**
	 * check if this bookmark is set as default
	 * 
	 * @return boolean
	 */
	public boolean isDefault() {
		return (_isDefault);
	}

	/**
	 * set the current flag
	 * 
	 * @param isCurrent boolean
	 */
	public void setCurrent(boolean isCurrent) {
		_isCurrent = isCurrent;
	}

	/**
	 * get the current flag
	 * 
	 * @return boolean
	 */
	public boolean isCurrent() {
		return (_isCurrent);
	}

	/**
	 * get the number of children
	 * 
	 * @return int
	 */
	public int getChildCount() {
		return children.size();
	}

	/**
	 * Retrieves real child count regardless of visibility.
	 */
	public int getActualChildCount() {
		return (getChildCount());
	}

	/**
	 * get the specified child
	 * @param i int position of the child
	 * @return Object the child bookmark
	 */
	public Object getChildAt(int i) {
		return children.get(i);
	}

	/**
	 * same as getChildAt
	 * 
	 * @param i int position of the child
	 * @return Object the child
	 */
	public Object getActualChildAt(int i) {
		return children.get(i);
	}

	/**
	 * add a new child bookmark
	 * 
	 * @param child Bookmark
	 */
	public void addChild(Bookmark child) {
		children.add(child);
		child.parent = this;
	}

	public Bookmark getParent() {
		return this.parent;
	}
	
	/**
	 * get the query string to this bookmark.
	 * 
	 * @return String
	 */
	public String getQueryString()
	{
		return queryString;
	}
	
	/**
	 * set the query string
	 * 
	 * @param queryStr String
	 */
	public void setQueryString(String queryStr)
	{
		this.queryString = queryStr;
	}
	
	/**
	 * get the xml document for this bookmark.
	 * 
	 * @return XmlElement
	 */
	public XmlElement getXmlElement() {
		XmlElement elementXml = new XmlElement("Element") //$NON-NLS-1$
				.setAttribute("guid", getUniqueId()) //$NON-NLS-1$
				.setAttribute("name", getPresentationName().trim()) //$NON-NLS-1$
				.setAttribute("closedIconName", getClosedIconName()) //$NON-NLS-1$
				.setAttribute("openIconName", getOpenIconName()) //$NON-NLS-1$
				.setAttribute("exist", isExist() ? "true" : "false") //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
				.setAttribute(
						"fromContentLibrary", isFromContentLibrary() ? "true" : "false") //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
				.setAttribute("visible", isVisible() ? "true" : "false") //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
				.setAttribute("enabled", isEnabled() ? "true" : "false") //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
				.setAttribute("transparent", isTransparent() ? "true" : "false") //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
				.setAttribute("default", isDefault() ? "true" : "false") //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
				.setAttribute("current", isCurrent() ? "true" : "false"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$

		elementXml.setAttribute("closedIconId", getIconId(getClosedIconName())); //$NON-NLS-1$
		
		String qStr = getQueryString();
		if ( qStr == null || qStr.length() == 0 ) {
			qStr = "?nodeId=" + elementXml.getId(); //$NON-NLS-1$
		} else {
			qStr += "&nodeId=" + elementXml.getId();  //$NON-NLS-1$
		}
		
		elementXml.setAttribute("url", getFileName() + qStr); //$NON-NLS-1$
	
		for (int i = 0; i < getChildCount(); i++) {
			Bookmark child = (Bookmark) getActualChildAt(i);
			elementXml.addChild(child.getXmlElement());
		}

		return elementXml;
	}

	public String getUrl() {
		return getFileName() + getQueryString();
	}
	
	public String getIconId(String iconFileName) {
		if ( iconFileName == null ) {
			return ""; //$NON-NLS-1$
		}

		return Integer.toHexString(iconFileName.hashCode());
	}
}