/******************************************************************************* * 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.commands; import org.eclipse.bpel.model.Activity; import org.eclipse.bpel.model.Flow; import org.eclipse.bpel.model.Link; import org.eclipse.bpel.ui.IBPELUIConstants; import org.eclipse.bpel.ui.Policy; import org.eclipse.bpel.ui.commands.util.AutoUndoCommand; import org.eclipse.bpel.ui.util.FlowLinkUtil; import org.eclipse.emf.ecore.EObject; import org.eclipse.gef.commands.Command; public class AddLinkCommand extends AutoUndoCommand { protected Flow flow; protected Activity source; protected Activity target; protected Link link; protected Command setNameCmd; protected boolean addNewObjectMode = false; public void setAddNewObjectMode(boolean addNewObjectMode) { this.addNewObjectMode = addNewObjectMode; } public AddLinkCommand(Command setNameCmd, EObject modelRoot) { super(IBPELUIConstants.CMD_ADD_LINK, modelRoot); this.setNameCmd = setNameCmd; } @Override public boolean canDoExecute() { if (link == null || source == null || target == null) return false; if (source == target) return false; if (FlowLinkUtil.getCommonFlow(source, target) == null && !addNewObjectMode) return false; return true; } @Override public void doExecute() { if (setNameCmd != null) { // This is a hack. // TODO: Fix this when we stop using canExecute()==false for no-op commands. if (!setNameCmd.canExecute()) setNameCmd = null; } flow = FlowLinkUtil.getCommonFlow(source, target); if (flow == null) { if (Policy.DEBUG) System.out.println("No common flow found!!"); //$NON-NLS-1$ return; } if (setNameCmd != null) setNameCmd.execute(); FlowLinkUtil.setLinkSource(link, source); FlowLinkUtil.setLinkTarget(link, target); if (link.eContainer() != null) { Flow oldParent = (Flow)link.eContainer().eContainer(); if (oldParent != null) { FlowLinkUtil.removeFlowLink(oldParent, link); } } FlowLinkUtil.addFlowLink(flow, link); } public Link getLink() { return link; } public void setSource(Activity source) { this.source = source; } public void setTarget(Activity target) { this.target = target; } public void setLink(Link link) { this.link = link; } }