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

import org.eclipse.bpel.model.CompensationHandler;
import org.eclipse.bpel.model.EventHandler;
import org.eclipse.bpel.model.TerminationHandler;
import org.eclipse.bpel.ui.BPELUIPlugin;
import org.eclipse.bpel.ui.IBPELUIConstants;
import org.eclipse.bpel.ui.editparts.borders.RoundRectangleBorderWithDecoration;
import org.eclipse.bpel.ui.editparts.policies.BPELContainerEditPolicy;
import org.eclipse.bpel.ui.editparts.policies.BPELOrderedLayoutEditPolicy;
import org.eclipse.bpel.ui.editparts.policies.ContainerHighlightEditPolicy;
import org.eclipse.bpel.ui.figures.ILayoutAware;
import org.eclipse.bpel.ui.util.ModelHelper;
import org.eclipse.draw2d.Border;
import org.eclipse.draw2d.Figure;
import org.eclipse.draw2d.FlowLayout;
import org.eclipse.draw2d.IFigure;
import org.eclipse.draw2d.MarginBorder;
import org.eclipse.draw2d.geometry.Insets;
import org.eclipse.gef.EditPolicy;
import org.eclipse.swt.graphics.Image;


public class FaultHandlerEditPart extends BPELEditPart implements ILayoutAware{

	private Image image;
	
	private IFigure contentPane;
	
	private Border containerBorder;
	
	public static final int LEFT_MARGIN = 30;
		
	@Override
	protected void createEditPolicies() {
		super.createEditPolicies();
		
		// Show the selection rectangle
		installEditPolicy(EditPolicy.SELECTION_FEEDBACK_ROLE, new ContainerHighlightEditPolicy(false, false));

		installEditPolicy(EditPolicy.CONTAINER_ROLE, new BPELContainerEditPolicy());
		
		installEditPolicy(EditPolicy.LAYOUT_ROLE, new BPELOrderedLayoutEditPolicy());
	}

	@Override
	protected IFigure createFigure() {
		IFigure figure = new Figure();
		FlowLayout layout = new FlowLayout();
		layout.setMinorAlignment(FlowLayout.ALIGN_CENTER);
		boolean vertical = (getModel() instanceof CompensationHandler) || (getModel() instanceof TerminationHandler);
		boolean horizontalLayout = ModelHelper.isHorizontalLayout(getModel());
		layout.setHorizontal(horizontalLayout ? vertical : !vertical);
		figure.setLayoutManager(layout);
		if (image == null) {
			// Get Image from registry
			if (getModel() instanceof EventHandler) {
				image = BPELUIPlugin.INSTANCE.getImage(IBPELUIConstants.ICON_EVENT_INDICATOR);
			} else if (getModel() instanceof CompensationHandler) {
				image = BPELUIPlugin.INSTANCE.getImage(IBPELUIConstants.ICON_COMPENSATION_INDICATOR);
			} else if (getModel() instanceof TerminationHandler) {
				image = BPELUIPlugin.INSTANCE.getImage(IBPELUIConstants.ICON_TERMINATION_INDICATOR);
			} else {
				image = BPELUIPlugin.INSTANCE.getImage(IBPELUIConstants.ICON_FAULT_INDICATOR);
			}		
		}
		figure.setBorder(new RoundRectangleBorderWithDecoration(figure, image, new Insets(20, 10, 20, 10)));
		figure.setOpaque(true);
		
		this.contentPane = figure;
		
		int topMargin = calcTopMargin(horizontalLayout);
		int leftMargin = calcLeftMargin(horizontalLayout);
		
		IFigure container = new Figure();
		this.containerBorder = new MarginBorder(topMargin,leftMargin,0,0);
		container.setBorder(containerBorder);
		container.add(figure);
		layout = new FlowLayout();
		layout.setHorizontal(false);
		container.setLayoutManager(layout);
		return container;
	}

	@Override
	public void deactivate() {
		if (!isActive()) return;
		super.deactivate();
		if (this.image != null) {
			//this.image.dispose();
			this.image = null;
		}
	
	}	
	
	@Override
	public IFigure getContentPane() {
		return contentPane;
	}
	
	public void switchLayout(boolean horizontal) {
		boolean vertical = (getModel() instanceof CompensationHandler) || (getModel() instanceof TerminationHandler);
		boolean horizontalLayout = ModelHelper.isHorizontalLayout(getModel());
		
		((FlowLayout)getContentPane().getLayoutManager()).setHorizontal(horizontalLayout ? vertical : !vertical);
		
		int leftMargin = calcLeftMargin(horizontal);
		int topMargin = calcTopMargin(horizontal);
		getFigure().setBorder(new MarginBorder(topMargin,leftMargin,0,0));
	}
	
	/**
	 * Calculates the top margin regarding the layout orientation
	 * @return
	 */
	private int calcTopMargin(boolean horizontal){
		int topMargin = 0;
		if(horizontal){
			topMargin = 2;
		}else{
			if(getParent() instanceof ScopeEditPart){
				// Four possible handlers
				topMargin = 42;
			}else if(getParent() instanceof InvokeEditPart){
				// Standard offset
				topMargin = 17;
			}else
				topMargin = 16;
		}
		return topMargin;
	}

	/**
	 * Calculates the left margin regarding the layout orientation
	 * @return
	 */
	private int calcLeftMargin(boolean horizontal){
		int leftMargin = 0;
		if(horizontal && getParent() instanceof ProcessEditPart){
			leftMargin = LEFT_MARGIN;
		}
			
		return leftMargin;
	}
}
