Explorar el Código

Added Shared Editing Domain for Subdiagrams

Andreas Mülder hace 12 años
padre
commit
00c9a53080

+ 2 - 2
plugins/org.yakindu.sct.ui.editor/src/org/yakindu/sct/ui/editor/breadcrumb/BreadcrumbDiagramEditor.java

@@ -48,7 +48,7 @@ import org.yakindu.sct.ui.editor.StatechartImages;
 public abstract class BreadcrumbDiagramEditor extends DiagramDocumentEditor implements ISelectionChangedListener {
 
 	private static final String SUBDIAGRAM = "Subdiagram - ";
-	private SCTBreadcrumbViewer viewer;
+	private DiagramPartitioningBreadcrumbViewer viewer;
 
 	public BreadcrumbDiagramEditor(boolean hasFlyoutPalette) {
 		super(hasFlyoutPalette);
@@ -88,7 +88,7 @@ public abstract class BreadcrumbDiagramEditor extends DiagramDocumentEditor impl
 	}
 
 	private void createBreadcrumbViewer(Composite parent) {
-		viewer = new SCTBreadcrumbViewer(parent, SWT.READ_ONLY);
+		viewer = new DiagramPartitioningBreadcrumbViewer(parent, SWT.READ_ONLY);
 		viewer.addSelectionChangedListener(this);
 		viewer.setContentProvider(new BreadcrumbViewerContentProvider());
 		viewer.setLabelProvider(new BreadcrumbViewerLabelProvider());

+ 10 - 2
plugins/org.yakindu.sct.ui.editor/src/org/yakindu/sct/ui/editor/breadcrumb/DiagramEditorInput.java

@@ -11,11 +11,11 @@
 package org.yakindu.sct.ui.editor.breadcrumb;
 
 import org.eclipse.emf.transaction.TransactionalEditingDomain;
-import org.eclipse.emf.transaction.util.TransactionUtil;
 import org.eclipse.emf.workspace.util.WorkspaceSynchronizer;
 import org.eclipse.gmf.runtime.diagram.ui.parts.IDiagramEditorInput;
 import org.eclipse.gmf.runtime.diagram.ui.resources.editor.document.MEditingDomainElement;
 import org.eclipse.gmf.runtime.notation.Diagram;
+import org.eclipse.ui.IPersistableElement;
 import org.eclipse.ui.part.FileEditorInput;
 
 /**
@@ -63,7 +63,15 @@ public class DiagramEditorInput extends FileEditorInput implements IDiagramEdito
 	}
 
 	public TransactionalEditingDomain getEditingDomain() {
-		return TransactionUtil.getEditingDomain(diagram);
+		return DiagramPartitioningUtil.getSharedDomain();
+	}
+
+	@Override
+	public IPersistableElement getPersistable() {
+		// TODO: It is currently not possible to restore Editors with open
+		// DiagramEditorInput cause they will not act on the shared editing
+		// domain
+		return null;
 	}
 
 }

+ 61 - 0
plugins/org.yakindu.sct.ui.editor/src/org/yakindu/sct/ui/editor/breadcrumb/DiagramEditorInputFactory.java

@@ -0,0 +1,61 @@
+/**
+ * Copyright (c) 2013 committers of YAKINDU 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:
+ * 	committers of YAKINDU - initial API and implementation
+ * 
+ */
+package org.yakindu.sct.ui.editor.breadcrumb;
+
+import java.io.IOException;
+import java.util.Collections;
+
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.emf.ecore.resource.ResourceSet;
+import org.eclipse.emf.ecore.util.EcoreUtil;
+import org.eclipse.gmf.runtime.notation.Diagram;
+import org.eclipse.ui.IElementFactory;
+import org.eclipse.ui.IMemento;
+
+/**
+ * 
+ * @author andreas muelder - Initial contribution and API
+ * 
+ */
+public class DiagramEditorInputFactory implements IElementFactory {
+
+	private static final String EMF_URI = "uri";
+
+	public static final String ID = "org.yakindu.sct.ui.editor.DiagramEditorInputFactory";
+
+	public IAdaptable createElement(IMemento memento) {
+		String uriStr = memento.getString(EMF_URI);
+		if (uriStr == null) {
+			return null;
+		}
+		URI uri = URI.createURI(uriStr);
+		ResourceSet resourceSet = DiagramPartitioningUtil.getSharedDomain().getResourceSet();
+		Resource resource = resourceSet.getResource(uri, false);
+		if (resource == null)
+			resource = resourceSet.createResource(uri);
+		try {
+			resource.load(Collections.emptyMap());
+		} catch (IOException e) {
+			e.printStackTrace();
+		}
+		Diagram diagram = (Diagram) resource.getEObject(uri.fragment());
+		return new DiagramEditorInput(diagram);
+	}
+
+	public static void saveState(IMemento memento, DiagramEditorInput input) {
+		URI uri = EcoreUtil.getURI(input.getDiagram());
+		String fileString = uri.toString();
+		memento.putString(EMF_URI, fileString);
+	}
+
+}

+ 2 - 2
plugins/org.yakindu.sct.ui.editor/src/org/yakindu/sct/ui/editor/breadcrumb/SCTBreadcrumbViewer.java

@@ -63,9 +63,9 @@ import org.yakindu.sct.ui.editor.StatechartImages;
  * 
  */
 @SuppressWarnings("restriction")
-public class SCTBreadcrumbViewer extends BreadcrumbViewer implements ISelectionChangedListener {
+public class DiagramPartitioningBreadcrumbViewer extends BreadcrumbViewer implements ISelectionChangedListener {
 
-	public SCTBreadcrumbViewer(Composite parent, int style) {
+	public DiagramPartitioningBreadcrumbViewer(Composite parent, int style) {
 		super(parent, style);
 	}
 

+ 21 - 3
plugins/org.yakindu.sct.ui.editor/src/org/yakindu/sct/ui/editor/breadcrumb/DiagramPartitioningUtil.java

@@ -20,7 +20,9 @@ import org.eclipse.emf.common.util.TreeIterator;
 import org.eclipse.emf.ecore.EObject;
 import org.eclipse.emf.ecore.resource.Resource;
 import org.eclipse.emf.ecore.util.EcoreUtil;
+import org.eclipse.emf.transaction.TransactionalEditingDomain;
 import org.eclipse.emf.workspace.util.WorkspaceSynchronizer;
+import org.eclipse.gmf.runtime.diagram.core.DiagramEditingDomainFactory;
 import org.eclipse.gmf.runtime.diagram.ui.parts.IDiagramEditorInput;
 import org.eclipse.gmf.runtime.notation.Diagram;
 import org.eclipse.gmf.runtime.notation.NotationPackage;
@@ -28,6 +30,7 @@ import org.eclipse.gmf.runtime.notation.View;
 import org.eclipse.jface.dialogs.MessageDialog;
 import org.eclipse.swt.widgets.Shell;
 import org.eclipse.ui.IEditorDescriptor;
+import org.eclipse.ui.IEditorPart;
 import org.eclipse.ui.IEditorReference;
 import org.eclipse.ui.IWorkbenchPage;
 import org.eclipse.ui.PartInitException;
@@ -43,6 +46,20 @@ import org.yakindu.sct.model.sgraph.Statechart;
  */
 public class DiagramPartitioningUtil {
 
+	private static final String DOMAIN_ID = "SubDiagramDomain";
+
+	public static synchronized TransactionalEditingDomain getSharedDomain() {
+		TransactionalEditingDomain editingDomain = TransactionalEditingDomain.Registry.INSTANCE
+				.getEditingDomain(DOMAIN_ID);
+		if (editingDomain == null) {
+			editingDomain = DiagramEditingDomainFactory.getInstance().createEditingDomain();
+			editingDomain.setID(DOMAIN_ID);
+			TransactionalEditingDomain.Registry.INSTANCE.add(DOMAIN_ID, editingDomain);
+		}
+		return editingDomain;
+
+	}
+
 	public static Diagram getDiagramContaining(EObject element) {
 		Resource eResource = element.eResource();
 		Collection<Diagram> objects = EcoreUtil.getObjectsByType(eResource.getContents(),
@@ -83,19 +100,20 @@ public class DiagramPartitioningUtil {
 
 	}
 
-	public static void openEditor(Diagram diagramToOpen) {
+	public static IEditorPart openEditor(Diagram diagramToOpen) {
 		IFile file = WorkspaceSynchronizer.getFile(diagramToOpen.eResource());
 		try {
 			IEditorDescriptor desc = PlatformUI.getWorkbench().getEditorRegistry().getDefaultEditor(file.getName());
 			final IWorkbenchPage wbPage = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
 			if (diagramToOpen.getElement() instanceof Statechart) {
-				wbPage.openEditor(new FileEditorInput(file), desc.getId());
+				return wbPage.openEditor(new FileEditorInput(file), desc.getId());
 			} else if (diagramToOpen.getElement() instanceof State) {
-				wbPage.openEditor(new DiagramEditorInput(diagramToOpen), desc.getId());
+				return wbPage.openEditor(new DiagramEditorInput(diagramToOpen), desc.getId());
 			}
 		} catch (PartInitException e) {
 			e.printStackTrace();
 		}
+		return null;
 	}
 
 	public static boolean closeSubdiagramEditors(State state) {

+ 7 - 2
plugins/org.yakindu.sct.ui.editor/src/org/yakindu/sct/ui/editor/editor/StatechartDiagramEditor.java

@@ -43,6 +43,7 @@ import org.eclipse.xtext.ui.XtextProjectHelper;
 import org.yakindu.sct.model.sgraph.SGraphPackage;
 import org.yakindu.sct.ui.editor.DiagramActivator;
 import org.yakindu.sct.ui.editor.breadcrumb.BreadcrumbDiagramEditor;
+import org.yakindu.sct.ui.editor.breadcrumb.DiagramPartitioningUtil;
 import org.yakindu.sct.ui.editor.extensions.ExpressionLanguageProviderExtensions;
 import org.yakindu.sct.ui.editor.extensions.ExpressionLanguageProviderExtensions.SemanticTarget;
 import org.yakindu.sct.ui.editor.extensions.IExpressionLanguageProvider;
@@ -144,9 +145,14 @@ public class StatechartDiagramEditor extends BreadcrumbDiagramEditor implements
 		}
 	}
 
+	@Override
+	public TransactionalEditingDomain getEditingDomain() {
+		return DiagramPartitioningUtil.getSharedDomain();
+	}
+
 	@Override
 	protected TransactionalEditingDomain createEditingDomain() {
-		TransactionalEditingDomain domain = super.createEditingDomain();
+		TransactionalEditingDomain domain = DiagramPartitioningUtil.getSharedDomain();
 		domainAdapter = new DirtyStateListener();
 		domain.addResourceSetListener(domainAdapter);
 		return domain;
@@ -189,7 +195,6 @@ public class StatechartDiagramEditor extends BreadcrumbDiagramEditor implements
 		validationJob.cancel();
 		getEditingDomain().removeResourceSetListener(validationListener);
 		getEditingDomain().removeResourceSetListener(domainAdapter);
-		//TODO: check why this can be null
 		if (domainAdapter != null)
 			domainAdapter.dispose();
 		IFileEditorInput editorInput = (IFileEditorInput) getEditorInput();

+ 16 - 12
plugins/org.yakindu.sct.ui.editor/src/org/yakindu/sct/ui/editor/providers/DiagramPartitioningDocumentProvider.java

@@ -13,14 +13,15 @@ package org.yakindu.sct.ui.editor.providers;
 import org.eclipse.core.runtime.CoreException;
 import org.eclipse.emf.ecore.resource.Resource;
 import org.eclipse.emf.transaction.TransactionalEditingDomain;
-import org.eclipse.emf.transaction.util.TransactionUtil;
 import org.eclipse.gmf.runtime.diagram.ui.parts.IDiagramEditorInput;
-import org.eclipse.gmf.runtime.diagram.ui.resources.editor.document.IDiagramDocument;
+import org.eclipse.gmf.runtime.diagram.ui.resources.editor.document.DiagramDocument;
 import org.eclipse.gmf.runtime.diagram.ui.resources.editor.document.IDocument;
 import org.eclipse.gmf.runtime.diagram.ui.resources.editor.ide.document.FileDiagramDocumentProvider;
+import org.eclipse.gmf.runtime.diagram.ui.resources.editor.ide.document.FileEditorInputProxy;
 import org.eclipse.gmf.runtime.notation.Diagram;
 import org.eclipse.ui.IEditorInput;
 import org.yakindu.sct.ui.editor.breadcrumb.DiagramEditorInput;
+import org.yakindu.sct.ui.editor.breadcrumb.DiagramPartitioningUtil;
 
 /**
  * 
@@ -33,18 +34,20 @@ public class DiagramPartitioningDocumentProvider extends FileDiagramDocumentProv
 		if (editorInput instanceof DiagramEditorInput) {
 			return editorInput;
 		}
-		return super.createInputWithEditingDomain(editorInput, domain);
+		return super.createInputWithEditingDomain(editorInput, DiagramPartitioningUtil.getSharedDomain());
+	}
+
+	@Override
+	protected IDocument createEmptyDocument() {
+		DiagramDocument diagramDocument = new DiagramDocument();
+		diagramDocument.setEditingDomain(DiagramPartitioningUtil.getSharedDomain());
+		return diagramDocument;
 	}
 
 	@Override
 	protected ElementInfo createElementInfo(Object element) throws CoreException {
 		ElementInfo info = super.createElementInfo(element);
-		// If the editor is a subdiagram, set the dirty flag to true if the
-		// resourceset is dirty
-		if (element instanceof IDiagramEditorInput) {
-			Diagram diagram = ((IDiagramEditorInput) element).getDiagram();
-			info.fCanBeSaved = isDirty(TransactionUtil.getEditingDomain(diagram));
-		}
+		info.fCanBeSaved = isDirty(DiagramPartitioningUtil.getSharedDomain());
 		return info;
 	}
 
@@ -59,12 +62,13 @@ public class DiagramPartitioningDocumentProvider extends FileDiagramDocumentProv
 
 	@Override
 	protected boolean setDocumentContent(IDocument document, IEditorInput editorInput) throws CoreException {
-		if (editorInput instanceof IDiagramEditorInput) {
+		if (editorInput instanceof DiagramEditorInput) {
 			Diagram diagram = ((IDiagramEditorInput) editorInput).getDiagram();
-			TransactionalEditingDomain editingDomain = TransactionUtil.getEditingDomain(diagram);
-			((IDiagramDocument) document).setEditingDomain(editingDomain);
 			document.setContent(diagram);
 			return true;
+		} else if (editorInput instanceof FileEditorInputProxy) {
+			setDocumentContentFromStorage(document, ((FileEditorInputProxy) editorInput).getFile());
+			return true;
 		}
 		return super.setDocumentContent(document, editorInput);
 	}