content: // This file is part of AceWiki.
  // Copyright 2008-2013, AceWiki developers.
  // 
  // AceWiki is free software: you can redistribute it and/or modify it under the terms of the GNU
  // Lesser General Public License as published by the Free Software Foundation, either version 3 of
  // the License, or (at your option) any later version.
  // 
  // AceWiki is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
  // even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  // Lesser General Public License for more details.
  // 
  // You should have received a copy of the GNU Lesser General Public License along with AceWiki. If
  // not, see http://www.gnu.org/licenses/.
  
  package ch.uzh.ifi.attempto.preditor;
  
  import nextapp.echo.app.Button;
  import nextapp.echo.app.Extent;
  import nextapp.echo.app.Font;
  import nextapp.echo.app.Insets;
  import ch.uzh.ifi.attempto.echocomp.Style;
  
  /**
   * This abstract class represents an item of a menu of the predictive editor. Each menu item
   * contains the name of the menu group it belongs to.
   * 
   * @author Tobias Kuhn
   */
  public abstract class MenuItem extends Button {
  	
  	private static final long serialVersionUID = 6061341215846815821L;
  	
  	private String menuGroup;
  	private String id;
  	private boolean highlighted = false;
  	private int colorShift;
  	
  	/**
  	 * Initializes a new menu item.
  	 * 
  	 * @param menuGroup The menu group to which this item should be assigned.
  	 */
  	public MenuItem(String menuGroup) {
  		if (menuGroup == null) menuGroup = "";
  		this.menuGroup = menuGroup;
          setWidth(new Extent(146));
          setHeight(new Extent(15));
          setInsets(new Insets(2,0));
  		setBackground(Style.mediumBackground);
  		setForeground(Style.darkForeground);
  		setRolloverEnabled(true);
  		setRolloverForeground(Style.lightForeground);
  		setRolloverBackground(Style.darkBackground);
          setLineWrap(false);
          updateStyle();
  	}
  	
  	/**
  	 * Returns the name of the menu group of this menu item.
  	 * 
  	 * @return The name of the menu group.
  	 */
  	public String getMenuGroup() {
  		return menuGroup;
  	}
  	
  	/**
  	 * This method returns an identifier that is unique (within one instance of the predictive
  	 * editor).
  	 * 
  	 * @return the identifier.
  	 */
  	public String getMenuItemID() {
  		if (id == null) recalculateID();
  		return id;
  	}
      
      /**
       * This method determines whether the menu entry is highlighted or not. Hightlighted menu
       * entries are displayed in bold font and are shown in front of non-highlighted menu entries
       * in sorted lists.
       * 
       * @param highlighted true if this entry should be highlighted.
       */
      public void setHighlighted(boolean highlighted) {
      	this.highlighted = highlighted;
      	updateStyle();
      }
      
      /**
       * Returns whether this menu item is highlighted or not.
       * 
       * @return true if this menu item is highlighted.
       */
      public boolean isHighlighted() {
      	return highlighted;
      }
      
      /**
       * This methods sets the color shift that defines the color in which this menu item is to be
       * displayed.
       * 
       * @see MenuCreator#getColorShift
       * @param colorShift The color shift value.
       */
      public void setColorShift(int colorShift) {
      	int colorShiftDiff = colorShift - this.colorShift;
      	this.colorShift = colorShift;
      	setBackground(Style.shiftColor(super.getBackground(), colorShiftDiff));
      	setForeground(Style.shiftColor(super.getForeground(), colorShiftDiff));
      	setRolloverBackground(Style.shiftColor(super.getRolloverBackground(), colorShiftDiff));
      	setRolloverForeground(Style.shiftColor(super.getRolloverForeground(), colorShiftDiff));
      }
  	
  	/**
  	 * This method should be called internally whenever something changed that has an influence on
  	 * the identifier.
  	 */
  	protected void recalculateID() {
  		id = "";
  		for (String s : getContent()) {
  			id += s.replaceAll(":", "~:").replaceAll("~", "~~") + ":";
  		}
  	}
  	
  	/**
  	 * This method sets the style according to whether or not this menu item is highlighted.
  	 */
  	protected void updateStyle() {
  		if (highlighted) {
  			setFont(new Font(Style.fontTypeface, Font.BOLD, new Extent(12)));
  		} else {
  			setFont(new Font(Style.fontTypeface, Font.PLAIN, new Extent(12)));
  		}
  	}
  	
  	/**
  	 * This method is used to calculate the unique identifier.
  	 * 
  	 * @return An array of strings that uniquely defines the menu item object.
  	 */
  	protected abstract String[] getContent();
  
  	public boolean equals(Object obj) {
  		if (obj instanceof MenuItem) {
  			return getMenuItemID().equals(((MenuItem) obj).getMenuItemID());
  		} else {
  			return false;
  		}
  	}
  	
  }
  