/*******************************************************************************
 * Copyright (c) 2009, 2019 Xored Software Inc and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v2.0
 * which accompanies this distribution, and is available at
 * https://www.eclipse.org/legal/epl-v20.html
 *
 * Contributors:
 *     Xored Software Inc - initial API and implementation and/or initial documentation
 *******************************************************************************/
package org.eclipse.rcptt.tesla.core.protocol.diagram;

import org.eclipse.rcptt.tesla.core.TeslaFeatures;

public class DiagramFeatures {

	private static final String CAT_DIAGRAMS = "Diagrams";
	private static final String CAT_DIAGRAM_MOUSE_OPTIONS = "$Diagram mouse options";
	private static final String FIG_IDENT = "$Figure identity recording";
	public static final String STORE_PALETTE_AS_NAME = "org.eclipse.rcptt.tesla.protocol.diagram.palette.entry";

	public static final String PART_LOCATOR_USE_FEATURE_NAME_IDENTITY = "org.eclipse.rcptt.tesla.protocol.diagram.part.locator.name.feature.support";

	public static final String PART_LOCATOR_USE_FEATURE_IDENTITY = "org.eclipse.rcptt.tesla.protocol.diagram.part.locator.feature.identity.support";
	public static final String PART_LOCATOR_USE_FEATURE_IDENTITY_NAMES = "org.eclipse.rcptt.tesla.protocol.diagram.part.locator.feature.identity.names";

	public static final String PART_LOCATOR_USE_IDENTITY = "org.eclipse.rcptt.tesla.protocol.diagram.part.locator.identity";
	public static final String PART_LOCATOR_USE_TEXT_IDENTITY = "org.eclipse.rcptt.tesla.protocol.diagram.part.locator.text.support";

	public static enum PartIdentity {
		Address, ClassName
	};

	public static final String[] PART_IDENTITY = new String[] {
			PartIdentity.Address.name(), PartIdentity.ClassName.name() };

	/**
	 * Record mouse-move only then mouse-down is happen and no mouse-up
	 */
	public static final String MOUSE_MOVE_MODE = "org.eclipse.rcptt.tesla.protocol.diagram.mouse.move.mode";
	public static final String MOUSE_HOVER_SUPPORT = "org.eclipse.rcptt.tesla.protocol.diagram.mouse.hover.support";

	public static enum MouseMoveMode {
		Smart,
		Never,
		Always
	}
	private static final String[] MOUSE_MOVE_VALUES = new String [] { MouseMoveMode.Smart.toString(),
		MouseMoveMode.Never.toString(), MouseMoveMode.Always.toString() };
	
	public static void init(TeslaFeatures opt) {
		opt.boolOption(STORE_PALETTE_AS_NAME, true).category(CAT_DIAGRAMS)
				.name("Store palette tools by name").showIn(TeslaFeatures.NONE);

		opt.option(MOUSE_MOVE_MODE)
				.category(CAT_DIAGRAM_MOUSE_OPTIONS)
				.name("Mouse move recording mode")
				.values(MOUSE_MOVE_VALUES)
				.defaultValue(MouseMoveMode.Smart.toString())
				.value(MouseMoveMode.Smart.toString())
				.showIn(TeslaFeatures.ADV_OPTIONS, TeslaFeatures.CP_OPTIONS);

		opt.boolOption(MOUSE_HOVER_SUPPORT, true)
				.category(CAT_DIAGRAM_MOUSE_OPTIONS)
				.name("Record mouse-hover commands")
				.showIn(TeslaFeatures.ADV_OPTIONS, TeslaFeatures.CP_OPTIONS);

		// By EMF name
		opt.boolOption(PART_LOCATOR_USE_FEATURE_NAME_IDENTITY, true)
				.category(FIG_IDENT)
				.name("EMF object identity by 'name feature' support")
				.showIn(TeslaFeatures.NONE).order(0);
		// By Text identity
		opt.boolOption(PART_LOCATOR_USE_TEXT_IDENTITY, true)
				.category(FIG_IDENT).name("Use text content for part identity")
				.showIn(TeslaFeatures.ADV_OPTIONS, TeslaFeatures.CP_OPTIONS)
				.order(2);
		// EMF features
		opt.boolOption(PART_LOCATOR_USE_FEATURE_IDENTITY, false)
				.category(FIG_IDENT).defaultValue("").value("")
				.name("EMF object identity by specified features")
				.showIn(TeslaFeatures.NONE).order(3);
		opt.option(PART_LOCATOR_USE_FEATURE_IDENTITY_NAMES)
				.category(FIG_IDENT)
				.name("Use following EMF features for part identity")
				.value("id,title")
				.defaultValue("id,title")
				.description(
						"Use following feature names\n(comma separated) then generate edit part selector")
				.showIn(TeslaFeatures.ADV_OPTIONS, TeslaFeatures.CP_OPTIONS)
				.order(4);
		// By Class name
		opt.option(PART_LOCATOR_USE_IDENTITY).category(FIG_IDENT)
				.defaultValue(PART_IDENTITY[1]).value(PART_IDENTITY[1])
				.name("Non EMF object identity method").values(PART_IDENTITY)
				.showIn(TeslaFeatures.ADV_OPTIONS).order(5);

	}
}
