| /****************************************************************************** |
| * Copyright (c) 2004, 2006 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.gmf.runtime.notation.providers.internal.copypaste; |
| |
| import java.util.ArrayList; |
| import java.util.Collections; |
| import java.util.Iterator; |
| import java.util.List; |
| |
| import org.eclipse.emf.ecore.EObject; |
| |
| import org.eclipse.gmf.runtime.emf.clipboard.core.ClipboardSupportUtil; |
| import org.eclipse.gmf.runtime.emf.clipboard.core.ObjectInfo; |
| import org.eclipse.gmf.runtime.emf.clipboard.core.PasteChildOperation; |
| import org.eclipse.gmf.runtime.emf.clipboard.core.PostPasteChildOperation; |
| import org.eclipse.gmf.runtime.notation.Diagram; |
| import org.eclipse.gmf.runtime.notation.Edge; |
| import org.eclipse.gmf.runtime.notation.NotationPackage; |
| import org.eclipse.gmf.runtime.notation.View; |
| |
| /** |
| * @author Yasser Lulu |
| */ |
| class ConnectorViewPostPasteChildOperation |
| extends PostPasteChildOperation { |
| |
| private boolean pasteSemanticElement; |
| |
| private List semanticElementPasteOperations; |
| |
| ConnectorViewPostPasteChildOperation( |
| ConnectorViewPasteOperation connectorViewPasteOperation, |
| boolean pasteSemanticElement) { |
| super(connectorViewPasteOperation, EMPTY_ARRAY); |
| this.pasteSemanticElement = pasteSemanticElement; |
| } |
| |
| private ConnectorViewPasteOperation getConnectorViewPasteOperation() { |
| return (ConnectorViewPasteOperation) getPasteChildOperation(); |
| } |
| |
| public void paste() |
| throws Exception { |
| |
| EObject pastedElement = doPaste(); |
| //did we succeed? |
| if (pastedElement != null) { |
| setPastedElement(pastedElement); |
| addPastedElement(pastedElement); |
| } else { |
| addPasteFailuresObject(getEObject()); |
| } |
| |
| } |
| |
| |
| /** |
| * @return |
| * @throws Exception |
| */ |
| private EObject doPaste() |
| throws Exception { |
| |
| View sourceView = getConnectorViewPasteOperation().getSourceView(); |
| View targetView = getConnectorViewPasteOperation().getTargetView(); |
| |
| if ((sourceView == null) || (targetView == null)) { |
| return null; |
| } |
| |
| EObject sourceViewContainer = sourceView.eContainer(); |
| EObject targetViewContainer = targetView.eContainer(); |
| |
| if ((sourceViewContainer == null) || (targetViewContainer == null)) { |
| return null; |
| } |
| |
| if (sourceViewContainer.equals(targetViewContainer) == false) { |
| //not in the same container, let's try to see if they are in the |
| // same diagram at least |
| Diagram sourceViewDiagram = NotationClipboardOperationHelper |
| .getContainingDiagram((View) sourceViewContainer); |
| Diagram targetViewDiagram = NotationClipboardOperationHelper |
| .getContainingDiagram((View) targetViewContainer); |
| if ((sourceViewDiagram == null) || (targetViewDiagram == null) |
| || (sourceViewDiagram.equals(targetViewDiagram) == false)) { |
| return null; |
| } |
| } |
| |
| Edge connectorView = getConnectorViewPasteOperation() |
| .getConnectorView(); |
| |
| if (pasteSemanticElement) { |
| EObject semanticElement = connectorView.getElement(); |
| if (semanticElement != null) { |
| if (semanticElement.eIsProxy()) { |
| semanticElement = ClipboardSupportUtil.resolve(semanticElement, |
| getParentPasteProcess().getLoadedIDToEObjectMapCopy()); |
| } |
| String loadedId = getLoadedEObjectID(semanticElement); |
| if (loadedId != null) { |
| //even if we failed to paste the semantic element, we'll |
| // proceed to paste the edge view |
| doPasteSemanticElement(); |
| //should have been pasted by now, if not then return |
| String newId = getEObjectID(semanticElement); |
| if (newId == null) { |
| return null; |
| } |
| } |
| } |
| } |
| EObject pastedElement = null; |
| Diagram pasteTargetDiagram = NotationClipboardOperationHelper |
| .getContainingDiagram((View) sourceViewContainer); |
| if (pasteTargetDiagram != null) { |
| //if we reached here then we should paste the connector and set |
| // refs to it accordingly |
| pastedElement = ClipboardSupportUtil.appendEObjectAt( |
| pasteTargetDiagram, getContainmentFeature(), connectorView); |
| if (pastedElement != null) { |
| ClipboardSupportUtil.appendEObjectAt(sourceView, |
| NotationPackage.eINSTANCE.getView_SourceEdges(), |
| connectorView); |
| ClipboardSupportUtil.appendEObjectAt(targetView, |
| NotationPackage.eINSTANCE.getView_TargetEdges(), |
| connectorView); |
| } |
| } |
| |
| return pastedElement; |
| } |
| |
| private void doPasteSemanticElement() |
| throws Exception { |
| List list = new ArrayList(); |
| Iterator it = getSemanticElementPasteOperations().iterator(); |
| while (it.hasNext()) { |
| PasteChildOperation operation = (PasteChildOperation) it.next(); |
| operation.paste(); |
| PasteChildOperation postPasteOperation = operation |
| .getPostPasteOperation(); |
| if (postPasteOperation != null) { |
| list.add(postPasteOperation); |
| } |
| } |
| performSemanticElementPostPasteOperations(list); |
| } |
| |
| private void performSemanticElementPostPasteOperations(List operations) |
| throws Exception { |
| if (operations.isEmpty() == false) { |
| List postPasteOperations = new ArrayList(); |
| Iterator it = operations.iterator(); |
| while (it.hasNext()) { |
| PasteChildOperation pasteOperation = (PasteChildOperation) it |
| .next(); |
| pasteOperation.paste(); |
| PasteChildOperation postPasteOperation = pasteOperation |
| .getPostPasteOperation(); |
| if (postPasteOperation != null) { |
| postPasteOperations.add(postPasteOperation); |
| } |
| } |
| //perform those newly added post paste operations |
| performSemanticElementPostPasteOperations(postPasteOperations); |
| } |
| } |
| |
| protected List getPostPasteOperations() |
| throws Exception { |
| return Collections.EMPTY_LIST; |
| } |
| |
| /** |
| * @return |
| */ |
| private List getSemanticElementPasteOperations() { |
| if (semanticElementPasteOperations == null) { |
| semanticElementPasteOperations = new ArrayList(); |
| //use either source or target views since by now they should have |
| // been pasted already |
| EObject semanticPasteTarget = NotationClipboardOperationHelper |
| .getSemanticPasteTarget(getConnectorViewPasteOperation() |
| .getSourceView()); |
| if (semanticPasteTarget != null) { |
| Iterator alwaysCopyEObjectInfoIt = getChildObjectInfo() |
| .getCopyAlwaysObjectInfoList().iterator(); |
| while (alwaysCopyEObjectInfoIt.hasNext()) { |
| ObjectInfo alwaysCopyObjectInfo = (ObjectInfo) alwaysCopyEObjectInfoIt |
| .next(); |
| PasteChildOperation pasteOperation = new PasteChildOperation( |
| getParentPasteProcess().clone(semanticPasteTarget), |
| alwaysCopyObjectInfo); |
| semanticElementPasteOperations.add(pasteOperation); |
| } //while always-copy |
| } |
| } |
| return semanticElementPasteOperations; |
| } |
| |
| } |