package org.eclipse.uml2.diagram.common.async;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.gmf.runtime.diagram.core.services.ViewService;
import org.eclipse.gmf.runtime.notation.Diagram;
import org.eclipse.uml2.diagram.common.async.SyncModelContext;
import org.eclipse.uml2.diagram.common.async.SyncModelNode;
/**
* Wraps {@link SyncModelContext} in order to push the user synchronization
* changes into the new created diagram.
*/
public class NewDiagramSyncHelper {
private static final String TEMP_DIAGRAM_RESOURCE_URI = "uri://" + NewDiagramSyncHelper.class.getName() + "/diagram.xml"; //$NON-NLS-1$ //$NON-NLS-2$
private final String myDiagramModelId;
private SyncModelContext myContext;
private Resource myTempDiagramResource;
private EObject mySemanticRoot;
private Diagram myTempDiagram;
private SyncModelNode myRootSyncNode;
private boolean myIsDisposed;
public NewDiagramSyncHelper(SyncModelContext context, String diagramModelId) {
myContext = context;
myDiagramModelId = diagramModelId;
myTempDiagramResource = context.getDomain().getResourceSet().createResource(URI.createURI(TEMP_DIAGRAM_RESOURCE_URI));
}
public void setSemanticRoot(EObject newRoot) {
if (mySemanticRoot != newRoot) {
if (mySemanticRoot != null) {
unloadTempDiagram();
myRootSyncNode = null;
}
loadTempDiagram(newRoot);
final Diagram syncDiagram = ViewService.createDiagram(newRoot, myDiagramModelId, myContext.getPreferencesHint());
myContext.runCommand(new Runnable() {
public void run() {
myContext.getSyncModelResource().getContents().clear();
myContext.getSyncModelResource().getContents().add(syncDiagram);
}
});
myRootSyncNode = createRootNode(myContext, syncDiagram, myTempDiagram);
mySemanticRoot = newRoot;
}
}
protected SyncModelNode createRootNode(SyncModelContext context, Diagram syncDiagram, Diagram subjectDiagram) {
return new SyncModelNode(syncDiagram, myTempDiagram, context);
}
public Diagram getNewDiagram() {
return myTempDiagram;
}
public SyncModelNode getSyncRoot() {
return myRootSyncNode;
}
private void unloadTempDiagram() {
if (myTempDiagram == null || myTempDiagramResource == null) {
return;
}
myContext.runCommand(new Runnable() {
public void run() {
myTempDiagramResource.getContents().remove(myTempDiagram);
myTempDiagram = null;
}
});
}
private void loadTempDiagram(final EObject semanticRoot) {
if (myTempDiagram != null) {
throw new IllegalStateException();
}
myContext.runCommand(new Runnable() {
public void run() {
myTempDiagram = ViewService.createDiagram(semanticRoot, myDiagramModelId, myContext.getPreferencesHint());
myTempDiagramResource.getContents().add(myTempDiagram);
}
});
}
private void disposeTempDiagramResource() {
if (myTempDiagramResource != null) {
myTempDiagramResource.unload();
myContext.getDomain().getResourceSet().getResources().remove(myTempDiagramResource);
}
}
public void dispose() {
if (!myIsDisposed) {
myIsDisposed = true;
myContext.dispose(); //this unloads sync-model resource only
disposeTempDiagramResource();
myContext = null;
myTempDiagramResource = null;
myTempDiagram = null;
myRootSyncNode = null;
}
}
}