blob: 91fb0259fce35b81ed377e4935827eb7ae58e1dc [file] [log] [blame]
/******************************************************************************
* 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;
}
}