//------------------------------------------------------------------------------
// Copyright (c) 2005, 2007 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
//------------------------------------------------------------------------------
/*
 * 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.diagramming.part;

import java.util.List;
import org.eclipse.gef.Tool;
import org.eclipse.gef.palette.PaletteContainer;
import org.eclipse.gef.palette.PaletteRoot;
import org.eclipse.gef.palette.ToolEntry;
import org.eclipse.jface.resource.ImageDescriptor;
import java.util.ArrayList;

import org.eclipse.epf.diagram.core.DiagramCoreResources;
import org.eclipse.epf.diagram.core.bridge.BridgeHelper;
import org.eclipse.epf.diagramming.providers.UMLElementTypes;

import org.eclipse.gef.palette.PaletteDrawer;

import org.eclipse.gef.palette.PaletteSeparator;

import org.eclipse.gmf.runtime.diagram.ui.tools.UnspecifiedTypeConnectionTool;
import org.eclipse.gmf.runtime.diagram.ui.tools.UnspecifiedTypeCreationTool;
import org.eclipse.gmf.runtime.emf.type.core.IElementType;

/**
 * @generated
 */
public class UMLPaletteFactory {

	/**
	 * @generated
	 */
	public void fillPalette(PaletteRoot paletteRoot) {
		paletteRoot.add(createFlows1Group());
		paletteRoot.add(createNodes2Group());
	}

	/**
	 * @modiifed
	 */
	private PaletteContainer createFlows1Group() {
		PaletteContainer paletteContainer = new PaletteDrawer(DiagramCoreResources.ActivityDiagram_Palette_flows_title);
		paletteContainer.setDescription(DiagramCoreResources.ActivityDiagram_Palette_flow_create_text);
		paletteContainer.add(createControlFlow1CreationTool());
		return paletteContainer;
	}

	/**
	 * @modiifed
	 */
	private PaletteContainer createNodes2Group() {
		PaletteContainer paletteContainer = new PaletteDrawer(DiagramCoreResources.ActivityDiagram_Palette_nodes_ttiles);
		paletteContainer.setDescription(DiagramCoreResources.ActivityDiagram_Palette_nodes_group_text);
		paletteContainer.add(createActivityPartition1CreationTool());
		paletteContainer.add(createStartNode2CreationTool());
		paletteContainer.add(createForkNode3CreationTool());
		paletteContainer.add(createMergeNode4CreationTool());
		paletteContainer.add(createDecisionNode5CreationTool());
		paletteContainer.add(createEndNode6CreationTool());
		paletteContainer.add(createJoinNode7CreationTool());
		paletteContainer.add(new PaletteSeparator());
		paletteContainer.add(createActivity9CreationTool());
		paletteContainer.add(createPhase10CreationTool());
		paletteContainer.add(createIteration11CreationTool());
		paletteContainer.add(createTaskDescriptor12CreationTool());
		paletteContainer.add(createMilestone13CreationTool());
		return paletteContainer;
	}

	/**
	 * @modiifed
	 */
	private ToolEntry createControlFlow1CreationTool() {
		ImageDescriptor smallImage;
		ImageDescriptor largeImage;

		smallImage = EPFDiagramEditorPlugin
				.findImageDescriptor("/org.eclipse.epf.diagramming/icons/full/obj16/ControlFlow.gif"); //$NON-NLS-1$

		largeImage = smallImage;

		final List<IElementType> relationshipTypes = new ArrayList<IElementType>();
		relationshipTypes.add(UMLElementTypes.ControlFlow_3001);
		ToolEntry result = new LinkToolEntry(DiagramCoreResources.ActivityDiagram_Palette_control_flow_text,
				DiagramCoreResources.ActivityDiagram_Palette_control_flow_create_text, smallImage, largeImage,
				relationshipTypes);

		return result;
	}

	/**
	 * @modiifed
	 */
	private ToolEntry createActivityPartition1CreationTool() {
		ImageDescriptor smallImage;
		ImageDescriptor largeImage;

		smallImage = EPFDiagramEditorPlugin
				.findImageDescriptor("/org.eclipse.epf.diagramming/icons/full/obj16/ActivityPartition.gif"); //$NON-NLS-1$

		largeImage = smallImage;

		final List<IElementType> elementTypes = new ArrayList<IElementType>();
		elementTypes.add(UMLElementTypes.ActivityPartition_1008);
		elementTypes.add(UMLElementTypes.ActivityPartition_2001);
		ToolEntry result = new NodeToolEntry(DiagramCoreResources.ActivityDiagram_Partition_Node_text,
				DiagramCoreResources.ActivityDiagram_Partition_Node_tooltip, smallImage, largeImage,
				elementTypes);

		return result;
	}

	/**
	 * @modiifed
	 */
	private ToolEntry createStartNode2CreationTool() {
		ImageDescriptor smallImage;
		ImageDescriptor largeImage;

		smallImage = EPFDiagramEditorPlugin
				.findImageDescriptor("/org.eclipse.epf.diagramming/icons/full/obj16/InitialNode.gif"); //$NON-NLS-1$

		largeImage = smallImage;

		final List<IElementType> elementTypes = new ArrayList<IElementType>();
		elementTypes.add(UMLElementTypes.InitialNode_1004);
		ToolEntry result = new NodeToolEntry(DiagramCoreResources.ActivityDiagram_StartNode_text,
				DiagramCoreResources.ActivityDiagram_StartNode_tooltip, smallImage, largeImage, elementTypes);

		return result;
	}

	/**
	 * @modiifed
	 */
	private ToolEntry createForkNode3CreationTool() {
		ImageDescriptor smallImage;
		ImageDescriptor largeImage;

		smallImage = EPFDiagramEditorPlugin
				.findImageDescriptor("/org.eclipse.epf.diagramming/icons/full/obj16/ForkNode.gif"); //$NON-NLS-1$

		largeImage = smallImage;

		final List<IElementType> elementTypes = new ArrayList<IElementType>();
		elementTypes.add(UMLElementTypes.ForkNode_1003);
		ToolEntry result = new NodeToolEntry(DiagramCoreResources.ActivityDiagram_Fork_Node_text,
				DiagramCoreResources.ActivityDiagram_Fork_Node_tooltip, smallImage, largeImage, elementTypes);

		return result;
	}

	/**
	 * @modiifed
	 */
	private ToolEntry createMergeNode4CreationTool() {
		ImageDescriptor smallImage;
		ImageDescriptor largeImage;

		smallImage = EPFDiagramEditorPlugin
				.findImageDescriptor("/org.eclipse.epf.diagramming/icons/full/obj16/MergeNode.gif"); //$NON-NLS-1$

		largeImage = smallImage;

		final List<IElementType> elementTypes = new ArrayList<IElementType>();
		elementTypes.add(UMLElementTypes.MergeNode_1002);
		ToolEntry result = new NodeToolEntry(DiagramCoreResources.ActivityDiagram_Merge_Node_text,
				DiagramCoreResources.ActivityDiagram_Merge_Node_tooltip, smallImage, largeImage, elementTypes);

		return result;
	}

	/**
	 * @modiifed
	 */
	private ToolEntry createDecisionNode5CreationTool() {
		ImageDescriptor smallImage;
		ImageDescriptor largeImage;

		smallImage = EPFDiagramEditorPlugin
				.findImageDescriptor("/org.eclipse.epf.diagramming/icons/full/obj16/DecisionNode.gif"); //$NON-NLS-1$

		largeImage = smallImage;

		final List<IElementType> elementTypes = new ArrayList<IElementType>();
		elementTypes.add(UMLElementTypes.DecisionNode_1005);
		ToolEntry result = new NodeToolEntry(DiagramCoreResources.ActivityDiagram_DecisionNode_text,
				DiagramCoreResources.ActivityDiagram_DecisionNode_tooltip, smallImage, largeImage,
				elementTypes);

		return result;
	}

	/**
	 * @modiifed
	 */
	private ToolEntry createEndNode6CreationTool() {
		ImageDescriptor smallImage;
		ImageDescriptor largeImage;

		smallImage = EPFDiagramEditorPlugin
				.findImageDescriptor("/org.eclipse.epf.diagramming/icons/full/obj16/ActivityFinalNode.gif"); //$NON-NLS-1$

		largeImage = smallImage;

		final List<IElementType> elementTypes = new ArrayList<IElementType>();
		elementTypes.add(UMLElementTypes.ActivityFinalNode_1001);
		ToolEntry result = new NodeToolEntry(DiagramCoreResources.ActivityDiagram_EndNode_text, 
				DiagramCoreResources.ActivityDiagram_EndNode_tooltip,
				smallImage, largeImage, elementTypes);

		return result;
	}

	/**
	 * @modiifed
	 */
	private ToolEntry createJoinNode7CreationTool() {
		ImageDescriptor smallImage;
		ImageDescriptor largeImage;

		smallImage = EPFDiagramEditorPlugin
				.findImageDescriptor("/org.eclipse.epf.diagramming/icons/full/obj16/JoinNode.gif"); //$NON-NLS-1$

		largeImage = smallImage;

		final List<IElementType> elementTypes = new ArrayList<IElementType>();
		elementTypes.add(UMLElementTypes.JoinNode_1006);
		ToolEntry result = new NodeToolEntry(DiagramCoreResources.ActivityDiagram_Join_Node_text,
				DiagramCoreResources.ActivityDiagram_Join_Node_tooltip, smallImage, largeImage, elementTypes);

		return result;
	}

	/**
	 * @modiifed
	 */
	private ToolEntry createActivity9CreationTool() {
		ImageDescriptor smallImage;
		ImageDescriptor largeImage;

		smallImage = EPFDiagramEditorPlugin
				.findImageDescriptor("/org.eclipse.epf.diagramming/icons/full/obj16/Activity.gif"); //$NON-NLS-1$

		largeImage = smallImage;

		final List<IElementType> elementTypes = new ArrayList<IElementType>();
		elementTypes.add(UMLElementTypes.StructuredActivityNode_1007);
		ToolEntry result = new NodeToolEntry(DiagramCoreResources.ActivityDiagram_Activity_text, 
				DiagramCoreResources.ActivityDiagram_Activity_tooltip,
				smallImage, largeImage, elementTypes);

		return result;
	}

	/**
	 * @modiifed
	 */
	private ToolEntry createPhase10CreationTool() {
		ImageDescriptor smallImage;
		ImageDescriptor largeImage;

		smallImage = EPFDiagramEditorPlugin
				.findImageDescriptor("/org.eclipse.epf.diagramming/icons/full/obj16/Phase.gif"); //$NON-NLS-1$

		largeImage = smallImage;

		final List<IElementType> elementTypes = new ArrayList<IElementType>();
		elementTypes.add(UMLElementTypes.StructuredActivityNode_1010);
		ToolEntry result = new NodeToolEntry(DiagramCoreResources.ActivityDiagram_Phase_text, 
				DiagramCoreResources.ActivityDiagram_Phase_tooltip,
				smallImage, largeImage, elementTypes);

		return result;
	}

	/**
	 * @modiifed
	 */
	private ToolEntry createIteration11CreationTool() {
		ImageDescriptor smallImage;
		ImageDescriptor largeImage;

		smallImage = EPFDiagramEditorPlugin
				.findImageDescriptor("/org.eclipse.epf.diagramming/icons/full/obj16/Iteration.gif"); //$NON-NLS-1$

		largeImage = smallImage;

		final List<IElementType> elementTypes = new ArrayList<IElementType>();
		elementTypes.add(UMLElementTypes.StructuredActivityNode_1011);
		ToolEntry result = new NodeToolEntry(DiagramCoreResources.ActivityDiagram_Iteration_text,
				DiagramCoreResources.ActivityDiagram_Iteration_tooltip, 
				smallImage, largeImage, elementTypes);

		return result;
	}

	/**
	 * @modiifed
	 */
	private ToolEntry createTaskDescriptor12CreationTool() {
		ImageDescriptor smallImage;
		ImageDescriptor largeImage;

		smallImage = EPFDiagramEditorPlugin
				.findImageDescriptor("/org.eclipse.epf.diagramming/icons/full/obj16/TaskDescriptor.gif"); //$NON-NLS-1$

		largeImage = smallImage;

		final List<IElementType> elementTypes = new ArrayList<IElementType>();
		elementTypes.add(UMLElementTypes.ActivityParameterNode_1009);
		ToolEntry result = new NodeToolEntry(DiagramCoreResources.AbstractDiagram_TaskDescriptor_text,
				DiagramCoreResources.AbstractDiagram_TaskDescriptor_tooltip, 
				smallImage, largeImage,
				elementTypes);

		return result;
	}

	/**
	 * @modiifed
	 */
	private ToolEntry createMilestone13CreationTool() {
		ImageDescriptor smallImage;
		ImageDescriptor largeImage;

		smallImage = EPFDiagramEditorPlugin
				.findImageDescriptor("/org.eclipse.epf.diagramming/icons/full/obj16/Milestone.gif"); //$NON-NLS-1$

		largeImage = smallImage;

		final List<IElementType> elementTypes = new ArrayList<IElementType>();
		elementTypes.add(UMLElementTypes.ActivityParameterNode_1012);
		ToolEntry result = new NodeToolEntry(DiagramCoreResources.ActivityDiagram_Milestone_text,
				DiagramCoreResources.ActivityDiagram_Milestone_tooltip, 
				smallImage, largeImage, elementTypes);

		return result;
	}

	/**
	 * @generated
	 */
	private static class NodeToolEntry extends ToolEntry {

		/**
		 * @generated
		 */
		private final List elementTypes;

		/**
		 * @generated
		 */
		private NodeToolEntry(String title, String description,
				ImageDescriptor smallIcon, ImageDescriptor largeIcon,
				List elementTypes) {
			super(title, description, smallIcon, largeIcon);
			this.elementTypes = elementTypes;
		}

		/**
		 * @modified
		 */
		public Tool createTool() {
			Tool tool = new UnspecifiedTypeCreationTool(elementTypes);
			tool.setProperties(getToolProperties());
			BridgeHelper.elementTypes.add((IElementType)elementTypes
					.get(elementTypes.size() - 1));
			return tool;
		}
	}

	/**
	 * @generated
	 */
	private static class LinkToolEntry extends ToolEntry {

		/**
		 * @generated
		 */
		private final List relationshipTypes;

		/**
		 * @generated
		 */
		private LinkToolEntry(String title, String description,
				ImageDescriptor smallIcon, ImageDescriptor largeIcon,
				List relationshipTypes) {
			super(title, description, smallIcon, largeIcon);
			this.relationshipTypes = relationshipTypes;
		}

		/**
		 * @generated
		 */
		public Tool createTool() {
			Tool tool = new UnspecifiedTypeConnectionTool(relationshipTypes);
			tool.setProperties(getToolProperties());
			return tool;
		}
	}
}
