/* 
 
Copyright 2006 Rene Grothmann, modified by Eric Hakenholz

This file is part of C.a.R. software.

    C.a.R. is a free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, version 3 of the License.

    C.a.R. 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 General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
 */
 
 
 package rene.gui;

import java.util.StringTokenizer;

import rene.dialogs.ItemEditorElement;
import rene.util.sort.SortObject;

/**
 * A keyboard item. Can be constructed from a menu string (like
 * editor.file.open) and a key string (like control.o). Can test a key event, if
 * it fits.
 */

public class KeyboardItem implements ItemEditorElement, SortObject {
	boolean Shift, Control, Alt;
	String CharKey;
	String MenuString, ActionName;
	int CommandType = 0;

	/**
	 * Copy constructor, for use in editing (clone).
	 */
	public KeyboardItem(final KeyboardItem item) {
		Shift = item.Shift;
		Control = item.Control;
		Alt = item.Alt;
		CharKey = item.CharKey;
		MenuString = item.MenuString;
		ActionName = item.ActionName;
		CommandType = item.CommandType;
	}

	/**
	 * @param charkey
	 *            The keyboard descriptive character (like "page down")
	 * @param menustring
	 *            The menu item (may have some *s added)
	 * @param actionname
	 *            The description of the menu item.
	 * @param shift
	 *            ,control,alt Modifier flags.
	 * @param commandtype
	 *            The command key, that is needed (0 is none).
	 */
	public KeyboardItem(final String charkey, final String menustring,
			final String actionname, final boolean shift,
			final boolean control, final boolean alt, final int commandtype) {
		Shift = shift;
		Control = control;
		Alt = alt;
		CharKey = charkey.toLowerCase();
		MenuString = menustring;
		ActionName = actionname;
		CommandType = commandtype;
	}

	/**
	 * @param menu
	 *            The menu string.
	 * @param key
	 *            The key descripion a la "esc1.shift.control.e"
	 */
	public KeyboardItem(final String menu, final String key) {
		MenuString = menu;
		Shift = Control = Alt = false;
		CommandType = 0;
		CharKey = "";
		final StringTokenizer t = new StringTokenizer(key, ".");
		while (t.hasMoreTokens()) {
			final String token = (String) t.nextToken();
			if (t.hasMoreTokens()) {
				if (token.equals("control"))
					Control = true;
				else if (token.equals("shift"))
					Shift = true;
				else if (token.equals("alt"))
					Alt = true;
				else if (token.startsWith("esc"))
					// esc should be followed by a number
				{
					try {
						CommandType = Integer.parseInt(token.substring(3));
					} catch (final Exception e) {
					}
				} else
					return;
			} else {
				if (key.equals(""))
					return;
				CharKey = token.toLowerCase();
			}
		}
		ActionName = Global.name(getStrippedMenuString());
	}

	public String getMenuString() {
		return MenuString;
	}

	public String getActionName() {
		return ActionName;
	}

	public String getCharKey() {
		return CharKey;
	}

	public boolean isShift() {
		return Shift;
	}

	public boolean isControl() {
		return Control;
	}

	public boolean isAlt() {
		return Alt;
	}

	public int getCommandType() {
		return CommandType;
	}

	/**
	 * Get a menu string, which is stripped from stars.
	 */
	public String getStrippedMenuString() {
		String s = MenuString;
		while (s.endsWith("*"))
			s = s.substring(0, s.length() - 1);
		return s;
	}

	/**
	 * Compute a visible shortcut to append after the menu items (like
	 * "(Ctr O)". The modifiers depend on the language.
	 */
	public String shortcut() {
		if (CharKey.equals("none"))
			return "";
		String s = CharKey.toUpperCase();
		if (Alt)
			s = Global.name("shortcut.alt") + " " + s;
		if (Control)
			s = Global.name("shortcut.control") + " " + s;
		if (Shift)
			s = Global.name("shortcut.shift") + " " + s;
		if (CommandType > 0)
			s = Keyboard.commandShortcut(CommandType) + " " + s;
		return s;
	}

	/**
	 * Get the name of this KeyboardItem element.
	 */
	public String getName() {
		return MenuString;
	}

	/**
	 * Method of SortObject, necessary to sort the keys by name.
	 */
	public int compare(final SortObject o) {
		return getName().compareTo(((KeyboardItem) o).getName());
	}

	/**
	 * Return a key description for this item (to save as parameter). This
	 * should be the same as the key parameter in the constructor.
	 */
	public String keyDescription() {
		String s = CharKey.toLowerCase();
		if (s.equals("none") || s.equals("default"))
			return s;
		if (Alt)
			s = "alt." + s;
		if (Control)
			s = "control." + s;
		if (Shift)
			s = "shift." + s;
		if (CommandType > 0)
			s = "esc" + CommandType + "." + s;
		return s;
	}
}
