/*******************************************************************************
 * 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.command;

import java.util.Map;

import org.eclipse.emf.ecore.EPackage;
import org.eclipse.jst.jsf.facesconfig.ui.pageflow.PageflowMessages;
import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowFactory;
import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLinkBendpoint;
import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPackage;

/**
 * Move bend point command
 */
public class MoveBendpointCommand extends BendpointCommand {
	/**
	 * old bend point of the link
	 */
	private PageflowLinkBendpoint oldBendpoint;

	public MoveBendpointCommand() {
		// Pageflow.Commands.MoveBendpointCommand.Label = Move Bendpoint
		super(PageflowMessages.Pageflow_Commands_MoveBendpointCommand_Label);
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see Command#execute()
	 */
	public void execute() {
		Map registry = EPackage.Registry.INSTANCE;
		String pageflowURI = PageflowPackage.eNS_URI;
		PageflowPackage pageflowPackage = (PageflowPackage) registry
				.get(pageflowURI);
		PageflowFactory factory = pageflowPackage.getPageflowFactory();
		PageflowLinkBendpoint _newBendpoint = factory.createPFLinkBendpoint();

		_newBendpoint.setRelativeDimensions(getFirstRelativeDimension(),
				getSecondRelativeDimension());
		setOldBendpoint((PageflowLinkBendpoint) getPFLink().getBendPoints().get(
				getIndex()));

		getPFLink().setBendpoint(getIndex(), _newBendpoint);
		super.execute();
	}

	/**
	 * get the old bend point
	 * 
	 * @return - old bend point
	 */
	protected PageflowLinkBendpoint getOldBendpoint() {
		return oldBendpoint;
	}

	/**
	 * set the old bend point
	 * 
	 * @param bp -
	 *            old bend point
	 */
	public void setOldBendpoint(PageflowLinkBendpoint bp) {
		oldBendpoint = bp;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see Command#undo()
	 */
	public void undo() {
		super.undo();
		getPFLink().setBendpoint(getIndex(), getOldBendpoint());
	}

}
