/*******************************************************************************
 * Copyright (c) 2008, 2012 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 API and implementation
 *******************************************************************************/
package org.eclipse.bpel.ui.palette;

import org.eclipse.bpel.common.ui.CommonUIPlugin;
import org.eclipse.bpel.common.ui.ICommonUIConstants;
import org.eclipse.bpel.common.ui.palette.IPaletteProvider;
import org.eclipse.bpel.common.ui.palette.OrderedPaletteGroup;
import org.eclipse.bpel.common.ui.palette.PaletteCategory;
import org.eclipse.bpel.model.BPELPackage;
import org.eclipse.bpel.model.terms.BPELTerms;
import org.eclipse.bpel.ui.Messages;
import org.eclipse.bpel.ui.factories.UIObjectFactoryProvider;
import org.eclipse.bpel.ui.util.BPELCreationToolEntry;
import org.eclipse.bpel.ui.util.ZoominToolEntry;
import org.eclipse.bpel.ui.util.ZoomoutToolEntry;
import org.eclipse.gef.palette.MarqueeToolEntry;
import org.eclipse.gef.palette.PaletteContainer;
import org.eclipse.gef.palette.PaletteRoot;
import org.eclipse.gef.palette.PaletteSeparator;
import org.eclipse.gef.palette.SelectionToolEntry;

/**
 * Palette Factory ...
 * 
 * @author Michal Chmielewski (michal.chmielewski@oracle.com)
 * @date May 21, 2007
 */

@SuppressWarnings("nls")
public class PaletteFactory implements IPaletteProvider {

	/**
	 * Brand new shiny palette factory
	 */

	public PaletteFactory() {

	}

	/**
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.bpel.common.ui.palette.IPaletteProvider#contributeItems(org.eclipse.gef.palette.PaletteRoot)
	 */
	public void contributeItems(PaletteRoot paletteRoot) {

		createTopControlPaletteEntries(paletteRoot);
		createBPELPaletteEntries(paletteRoot);
		createBottomControlPaletteEntries(paletteRoot);
	}

	
	void createBPELPaletteEntries(PaletteContainer palette) {

		BPELPackage bpelPackage = BPELPackage.eINSTANCE;
		UIObjectFactoryProvider provider = UIObjectFactoryProvider
				.getInstance();
		
		PaletteCategory basicActionsCategory = new PaletteCategory(Messages.PaletteFactory_Actions);
		basicActionsCategory.setOrder(10);
		basicActionsCategory.setCategoryId("bpel.actions"); //$NON-NLS-1$
		
		String term = BPELTerms.getString(Messages.PaletteFactory_Empty);
			
		basicActionsCategory.add(new BPELCreationToolEntry(term, term, provider
				.getFactoryFor(bpelPackage.getEmpty())));
		basicActionsCategory.add(new BPELCreationToolEntry(
				Messages.BPELEditor_Invoke_35, Messages.BPELEditor_Invoke_36,
				provider.getFactoryFor(bpelPackage.getInvoke())));
		basicActionsCategory.add(new BPELCreationToolEntry(
				Messages.BPELEditor_Receive_4, Messages.BPELEditor_Receive_5,
				provider.getFactoryFor(bpelPackage.getReceive())));
		basicActionsCategory.add(new BPELCreationToolEntry(
				Messages.BPELEditor_Reply_6, Messages.BPELEditor_Reply_7,
				provider.getFactoryFor(bpelPackage.getReply())));
		basicActionsCategory.add(new BPELCreationToolEntry(
				Messages.BPELEditor_OpaqueActivity_1,Messages.BPELEditor_OpaqueActivity_2,
				provider.getFactoryFor(bpelPackage.getOpaqueActivity())));
		basicActionsCategory.add(new BPELCreationToolEntry(
				Messages.BPELEditor_Assign_10, Messages.BPELEditor_Assign_11,
				provider.getFactoryFor(bpelPackage.getAssign())));
		basicActionsCategory.add(new BPELCreationToolEntry(
				Messages.BPELEditor_Validate_XML_12,
				Messages.BPELEditor_Validate_XML_13, provider
						.getFactoryFor(bpelPackage.getValidate())));
		palette.add(basicActionsCategory);

		PaletteCategory controlCategory = new PaletteCategory(Messages.PaletteFactory_Control);
		controlCategory.setOrder(20);
		controlCategory.setCategoryId("bpel.control"); //$NON-NLS-1$

		controlCategory.add(new BPELCreationToolEntry(
				Messages.BPELEditor_If_17, Messages.BPELEditor_If_18, provider
						.getFactoryFor(bpelPackage.getIf())));

		controlCategory.add(new BPELCreationToolEntry(
				Messages.BPELEditor_Pick_8, Messages.BPELEditor_Pick_9,
				provider.getFactoryFor(bpelPackage.getPick())));

		controlCategory.add(new BPELCreationToolEntry(
				Messages.BPELEditor_While_19, Messages.BPELEditor_While_20,
				provider.getFactoryFor(bpelPackage.getWhile())));

		controlCategory.add(new BPELCreationToolEntry(
				Messages.BPELEditor_ForEach_19, Messages.BPELEditor_ForEach_20,
				provider.getFactoryFor(bpelPackage.getForEach())));

		controlCategory.add(new BPELCreationToolEntry(
				Messages.BPELEditor_Repeat_Until_42,
				Messages.BPELEditor_Repeat_Until_43, provider
						.getFactoryFor(bpelPackage.getRepeatUntil())));

		controlCategory.add(new BPELCreationToolEntry(
				Messages.BPELEditor_Wait_21, Messages.BPELEditor_Wait_22,
				provider.getFactoryFor(bpelPackage.getWait())));

		controlCategory.add(new BPELCreationToolEntry(
				Messages.BPELEditor_Sequence_23,
				Messages.BPELEditor_Sequence_24, provider
						.getFactoryFor(bpelPackage.getSequence())));

		controlCategory.add(new BPELCreationToolEntry(
				Messages.BPELEditor_Scope_1, Messages.BPELEditor_Scope_2,
				provider.getFactoryFor(bpelPackage.getScope())));

		controlCategory.add(new BPELCreationToolEntry(
				Messages.BPELEditor_Flow_1, Messages.BPELEditor_Flow_2,
				provider.getFactoryFor(bpelPackage.getFlow())));

		palette.add(controlCategory);

		PaletteCategory faultCategory = new PaletteCategory(Messages.PaletteFactory_Faults);
		faultCategory.setOrder(30);
		faultCategory.setCategoryId("bpel.faults"); //$NON-NLS-1$

		faultCategory.add(new BPELCreationToolEntry(
				Messages.BPELEditor_Exit_26, Messages.BPELEditor_Exit_27,
				provider.getFactoryFor(bpelPackage.getExit())));
		faultCategory.add(new BPELCreationToolEntry(
				Messages.BPELEditor_Throw_28, Messages.BPELEditor_Throw_29,
				provider.getFactoryFor(bpelPackage.getThrow())));
		faultCategory.add(new BPELCreationToolEntry(
				Messages.BPELEditor_ReThrow_1, Messages.BPELEditor_ReThrow_2,
				provider.getFactoryFor(bpelPackage.getRethrow())));
		faultCategory.add(new BPELCreationToolEntry(
				Messages.BPELEditor_Compensate_1,
				Messages.BPELEditor_Compensate_2, provider
						.getFactoryFor(bpelPackage.getCompensate())));
		
		faultCategory.add(new BPELCreationToolEntry(
				Messages.BPELEditor_CompensateScope_1,
				Messages.BPELEditor_CompensateScope_2, provider
						.getFactoryFor(bpelPackage.getCompensateScope())));
		
		palette.add(faultCategory);
	}

	void createTopControlPaletteEntries(PaletteRoot root) {
		OrderedPaletteGroup controlGroup = new OrderedPaletteGroup(
				Messages.BPELEditor_Top_Control_Group_37);
		controlGroup.setOrder(5);
		controlGroup.setCategoryId("bpel.top.control"); //$NON-NLS-1$

		SelectionToolEntry selectionTool = new SelectionToolEntry(
				Messages.BPELEditor_Selection_Tool_38);
		controlGroup.add(selectionTool);

		MarqueeToolEntry marqueeTool = new MarqueeToolEntry(
				Messages.BPELEditor_Marquee_Tool);
		controlGroup.add(marqueeTool);
		
		root.add(controlGroup);
		root.setDefaultEntry(selectionTool);
	}

	void createBottomControlPaletteEntries(PaletteContainer palette) {
		PaletteSeparator separator = new PaletteSeparator("separator"); //$NON-NLS-1$
		palette.add(separator);
		
		OrderedPaletteGroup controlGroup = new OrderedPaletteGroup(
				Messages.BPELEditor_Bottom_Control_Group_39);
		controlGroup.setOrder(200);
		controlGroup.setCategoryId("bpel.bottom.control"); //$NON-NLS-1$

		ZoominToolEntry zoomIn = new ZoominToolEntry(
				Messages.BPELEditor_Zoom_In_40);
		zoomIn.setSmallIcon(CommonUIPlugin.getDefault().getImageRegistry()
				.getDescriptor(ICommonUIConstants.ICON_ZOOM_IN_TOOL));
		controlGroup.add(zoomIn);
		ZoomoutToolEntry zoomOut = new ZoomoutToolEntry(
				Messages.BPELEditor_Zoom_Out_41);
		zoomOut.setSmallIcon(CommonUIPlugin.getDefault().getImageRegistry()
				.getDescriptor(ICommonUIConstants.ICON_ZOOM_OUT_TOOL));
		controlGroup.add(zoomOut);

		palette.add(controlGroup);
	}

}
