/*******************************************************************************
 * Copyright (c) 2004, 2005 Sybase, Inc. 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:
 *     Sybase, Inc. - initial API and implementation
 *******************************************************************************/

package org.eclipse.jst.jsf.facesconfig.ui.pageflow;

import org.eclipse.gef.palette.CombinedTemplateCreationEntry;
import org.eclipse.gef.palette.ConnectionCreationToolEntry;
import org.eclipse.gef.palette.MarqueeToolEntry;
import org.eclipse.gef.palette.PaletteDrawer;
import org.eclipse.gef.palette.PaletteGroup;
import org.eclipse.gef.palette.PaletteRoot;
import org.eclipse.gef.palette.PaletteSeparator;
import org.eclipse.gef.palette.SelectionToolEntry;
import org.eclipse.gef.palette.ToolEntry;
import org.eclipse.jst.jsf.facesconfig.ui.EditorPlugin;
import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLink;
import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPage;
import org.eclipse.jst.jsf.facesconfig.ui.pageflow.util.ModelCreationFactory;

/**
 * This is the root of the palette used by pageflow editors.
 */
public class PageflowPaletteRoot extends PaletteRoot {

	/**
	 * Creates a new PageflowPaletteRoot instance.
	 */
	public PageflowPaletteRoot() {
		// create root
		super();

		// a group of default control tools
		// Pageflow.PaletteTool.Group.Controls = Controls
		PaletteGroup controls = new PaletteGroup(
				PageflowMessages.Pageflow_PaletteTool_Group_Controls);
		add(controls);

		// the selection tool
		// Pageflow.PaletteTool.Select.Label = Select
		// Pageflow.PaletteTool.Select.Description = Select one or more items
		ToolEntry tool = new SelectionToolEntry(
				PageflowMessages.Pageflow_PaletteTool_Select_Label,
				PageflowMessages.Pageflow_PaletteTool_Select_Description);

		controls.add(tool);

		// use selection tool as default entry
		setDefaultEntry(tool);

		// the marquee selection tool
		// Pageflow.PaletteTool.Marquee.Label = Marquee
		// Pageflow.PaletteTool.Marquee.Description = Marquee one or more items
		controls.add(new MarqueeToolEntry(
				PageflowMessages.Pageflow_PaletteTool_Marquee_Label,
				PageflowMessages.Pageflow_PaletteTool_Marquee_Description));

		controls.add(new PaletteSeparator());

		// conection creation
		// Pageflow.PaletteTool.Link.Label = Link
		// Pageflow.PaletteTool.Link.Description = Creates an link
		ConnectionCreationToolEntry linkEntry = new ConnectionCreationToolEntry(
				PageflowMessages.Pageflow_PaletteTool_Link_Label,
				PageflowMessages.Pageflow_PaletteTool_Link_Description,
				new ModelCreationFactory(PageflowLink.class), EditorPlugin
						.getDefault().getImageDescriptor(
								"facesconfig/Pageflow_Link.gif"), //$NON-NLS-1$
				EditorPlugin.getDefault().getImageDescriptor(
						"facesconfig/Pageflow_Link24.gif")); //$NON-NLS-1$
		linkEntry.setUserModificationPermission(PERMISSION_FULL_MODIFICATION);
		controls.add(linkEntry);

		controls.add(new PaletteSeparator());

		// Pageflow.PaletteTool.Group.Nodes = Nodes
		PaletteDrawer nodes = new PaletteDrawer(
				PageflowMessages.Pageflow_PaletteTool_Group_Nodes);
		add(nodes);

		// use CombinedTemplateCreationEntry which can be also dragged
		CombinedTemplateCreationEntry entry;

		// Pageflow.PaletteTool.Page.Label = Page
		// Pageflow.PaletteTool.Page.Description = Creates a pageflow page
		entry = new CombinedTemplateCreationEntry(
				PageflowMessages.Pageflow_PaletteTool_Page_Label,
				PageflowMessages.Pageflow_PaletteTool_Page_Description,
				PageflowPage.class,
				new ModelCreationFactory(PageflowPage.class), EditorPlugin
						.getDefault().getImageDescriptor(
								"facesconfig/Pageflow_Page16.gif"), //$NON-NLS-1$
				EditorPlugin.getDefault().getImageDescriptor(
						"facesconfig/Pageflow_Page24.gif")); //$NON-NLS-1$
		nodes.add(entry);
	}
}
