Просмотр исходного кода

Added unloading strategy for shared editing domain editors

Andreas Mülder 13 лет назад
Родитель
Сommit
eae53bf326
14 измененных файлов с 228 добавлено и 48 удалено
  1. 1 1
      plugins/org.yakindu.sct.refactoring/src/org/yakindu/sct/refactoring/handlers/impl/InlineSubdiagramHandler.java
  2. 1 1
      plugins/org.yakindu.sct.refactoring/src/org/yakindu/sct/refactoring/refactor/impl/InlineSubdiagramRefactoring.java
  3. 1 2
      plugins/org.yakindu.sct.refactoring/src/org/yakindu/sct/refactoring/refactor/impl/SubdiagramRefactoring.java
  4. 1 1
      plugins/org.yakindu.sct.ui.editor/META-INF/MANIFEST.MF
  5. 1 1
      plugins/org.yakindu.sct.ui.editor/src/org/yakindu/sct/ui/editor/edithelper/RegionEditHelper.java
  6. 3 17
      plugins/org.yakindu.sct.ui.editor/src/org/yakindu/sct/ui/editor/editor/StatechartDiagramEditor.java
  7. 10 1
      plugins/org.yakindu.sct.ui.editor/src/org/yakindu/sct/ui/editor/breadcrumb/DiagramEditorInput.java
  8. 1 1
      plugins/org.yakindu.sct.ui.editor/src/org/yakindu/sct/ui/editor/breadcrumb/DiagramEditorInputFactory.java
  9. 5 4
      plugins/org.yakindu.sct.ui.editor/src/org/yakindu/sct/ui/editor/breadcrumb/DiagramPartitioningBreadcrumbViewer.java
  10. 56 5
      plugins/org.yakindu.sct.ui.editor/src/org/yakindu/sct/ui/editor/providers/DiagramPartitioningDocumentProvider.java
  11. 24 4
      plugins/org.yakindu.sct.ui.editor/src/org/yakindu/sct/ui/editor/breadcrumb/BreadcrumbDiagramEditor.java
  12. 40 5
      plugins/org.yakindu.sct.ui.editor/src/org/yakindu/sct/ui/editor/breadcrumb/DiagramPartitioningUtil.java
  13. 82 0
      plugins/org.yakindu.sct.ui.editor/src/org/yakindu/sct/ui/editor/partitioning/ResourceUnloadingTool.java
  14. 2 5
      plugins/org.yakindu.sct.ui.editor/src/org/yakindu/sct/ui/editor/submachine/SubmachineDecorationProvider.java

+ 1 - 1
plugins/org.yakindu.sct.refactoring/src/org/yakindu/sct/refactoring/handlers/impl/InlineSubdiagramHandler.java

@@ -17,8 +17,8 @@ import org.eclipse.ui.handlers.HandlerUtil;
 import org.yakindu.sct.refactoring.handlers.AbstractViewRefactoringHandler;
 import org.yakindu.sct.refactoring.handlers.AbstractViewRefactoringHandler;
 import org.yakindu.sct.refactoring.refactor.AbstractRefactoring;
 import org.yakindu.sct.refactoring.refactor.AbstractRefactoring;
 import org.yakindu.sct.refactoring.refactor.impl.InlineSubdiagramRefactoring;
 import org.yakindu.sct.refactoring.refactor.impl.InlineSubdiagramRefactoring;
-import org.yakindu.sct.ui.editor.breadcrumb.DiagramPartitioningUtil;
 import org.yakindu.sct.ui.editor.editparts.StateEditPart;
 import org.yakindu.sct.ui.editor.editparts.StateEditPart;
+import org.yakindu.sct.ui.editor.partitioning.DiagramPartitioningUtil;
 
 
 /**
 /**
  * Handler for {@link InlineSubdiagramRefactoring}.
  * Handler for {@link InlineSubdiagramRefactoring}.

+ 1 - 1
plugins/org.yakindu.sct.refactoring/src/org/yakindu/sct/refactoring/refactor/impl/InlineSubdiagramRefactoring.java

@@ -16,7 +16,7 @@ import org.eclipse.gmf.runtime.notation.Diagram;
 import org.eclipse.gmf.runtime.notation.Edge;
 import org.eclipse.gmf.runtime.notation.Edge;
 import org.eclipse.gmf.runtime.notation.View;
 import org.eclipse.gmf.runtime.notation.View;
 import org.yakindu.sct.model.sgraph.State;
 import org.yakindu.sct.model.sgraph.State;
-import org.yakindu.sct.ui.editor.breadcrumb.DiagramPartitioningUtil;
+import org.yakindu.sct.ui.editor.partitioning.DiagramPartitioningUtil;
 import org.yakindu.sct.ui.editor.providers.SemanticHints;
 import org.yakindu.sct.ui.editor.providers.SemanticHints;
 
 
 /**
 /**

+ 1 - 2
plugins/org.yakindu.sct.refactoring/src/org/yakindu/sct/refactoring/refactor/impl/SubdiagramRefactoring.java

@@ -17,6 +17,7 @@ import org.eclipse.gmf.runtime.notation.View;
 import org.yakindu.sct.refactoring.refactor.AbstractRefactoring;
 import org.yakindu.sct.refactoring.refactor.AbstractRefactoring;
 import org.yakindu.sct.ui.editor.DiagramActivator;
 import org.yakindu.sct.ui.editor.DiagramActivator;
 import org.yakindu.sct.ui.editor.utils.GMFNotationUtil;
 import org.yakindu.sct.ui.editor.utils.GMFNotationUtil;
+import static org.yakindu.sct.ui.editor.partitioning.DiagramPartitioningUtil.*;
 
 
 /**
 /**
  * 
  * 
@@ -25,8 +26,6 @@ import org.yakindu.sct.ui.editor.utils.GMFNotationUtil;
  */
  */
 public abstract class SubdiagramRefactoring extends AbstractRefactoring<View> {
 public abstract class SubdiagramRefactoring extends AbstractRefactoring<View> {
 
 
-	private static final String INLINE_STYLE = "isInline";
-
 	protected PreferencesHint preferencesHint = DiagramActivator.DIAGRAM_PREFERENCES_HINT;
 	protected PreferencesHint preferencesHint = DiagramActivator.DIAGRAM_PREFERENCES_HINT;
 
 
 	protected BooleanValueStyle getInlineStyle() {
 	protected BooleanValueStyle getInlineStyle() {

+ 1 - 1
plugins/org.yakindu.sct.ui.editor/META-INF/MANIFEST.MF

@@ -48,7 +48,6 @@ Require-Bundle: org.eclipse.core.runtime,
 Bundle-ActivationPolicy: lazy
 Bundle-ActivationPolicy: lazy
 Bundle-RequiredExecutionEnvironment: J2SE-1.5
 Bundle-RequiredExecutionEnvironment: J2SE-1.5
 Export-Package: org.yakindu.sct.ui.editor,
 Export-Package: org.yakindu.sct.ui.editor,
- org.yakindu.sct.ui.editor.breadcrumb,
  org.yakindu.sct.ui.editor.commands,
  org.yakindu.sct.ui.editor.commands,
  org.yakindu.sct.ui.editor.editor,
  org.yakindu.sct.ui.editor.editor,
  org.yakindu.sct.ui.editor.editor.figures,
  org.yakindu.sct.ui.editor.editor.figures,
@@ -56,6 +55,7 @@ Export-Package: org.yakindu.sct.ui.editor,
  org.yakindu.sct.ui.editor.editparts,
  org.yakindu.sct.ui.editor.editparts,
  org.yakindu.sct.ui.editor.extensions,
  org.yakindu.sct.ui.editor.extensions,
  org.yakindu.sct.ui.editor.factories,
  org.yakindu.sct.ui.editor.factories,
+ org.yakindu.sct.ui.editor.partitioning,
  org.yakindu.sct.ui.editor.policies,
  org.yakindu.sct.ui.editor.policies,
  org.yakindu.sct.ui.editor.preferences,
  org.yakindu.sct.ui.editor.preferences,
  org.yakindu.sct.ui.editor.propertysheets,
  org.yakindu.sct.ui.editor.propertysheets,

+ 1 - 1
plugins/org.yakindu.sct.ui.editor/src/org/yakindu/sct/ui/editor/edithelper/RegionEditHelper.java

@@ -20,7 +20,7 @@ import org.eclipse.gmf.runtime.emf.type.core.commands.DestroyElementCommand;
 import org.eclipse.gmf.runtime.emf.type.core.edithelper.AbstractEditHelper;
 import org.eclipse.gmf.runtime.emf.type.core.edithelper.AbstractEditHelper;
 import org.eclipse.gmf.runtime.emf.type.core.requests.DestroyElementRequest;
 import org.eclipse.gmf.runtime.emf.type.core.requests.DestroyElementRequest;
 import org.yakindu.sct.model.sgraph.State;
 import org.yakindu.sct.model.sgraph.State;
-import org.yakindu.sct.ui.editor.breadcrumb.DiagramPartitioningUtil;
+import org.yakindu.sct.ui.editor.partitioning.DiagramPartitioningUtil;
 
 
 /**
 /**
  * 
  * 

+ 3 - 17
plugins/org.yakindu.sct.ui.editor/src/org/yakindu/sct/ui/editor/editor/StatechartDiagramEditor.java

@@ -30,7 +30,6 @@ import org.eclipse.gef.RootEditPart;
 import org.eclipse.gef.editparts.LayerManager;
 import org.eclipse.gef.editparts.LayerManager;
 import org.eclipse.gmf.runtime.common.ui.services.marker.MarkerNavigationService;
 import org.eclipse.gmf.runtime.common.ui.services.marker.MarkerNavigationService;
 import org.eclipse.gmf.runtime.diagram.core.preferences.PreferencesHint;
 import org.eclipse.gmf.runtime.diagram.core.preferences.PreferencesHint;
-import org.eclipse.gmf.runtime.diagram.ui.resources.editor.document.IDocumentProvider;
 import org.eclipse.swt.widgets.Composite;
 import org.eclipse.swt.widgets.Composite;
 import org.eclipse.ui.IEditorInput;
 import org.eclipse.ui.IEditorInput;
 import org.eclipse.ui.IEditorSite;
 import org.eclipse.ui.IEditorSite;
@@ -42,12 +41,11 @@ import org.eclipse.ui.ide.IGotoMarker;
 import org.eclipse.xtext.ui.XtextProjectHelper;
 import org.eclipse.xtext.ui.XtextProjectHelper;
 import org.yakindu.sct.model.sgraph.SGraphPackage;
 import org.yakindu.sct.model.sgraph.SGraphPackage;
 import org.yakindu.sct.ui.editor.DiagramActivator;
 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;
 import org.yakindu.sct.ui.editor.extensions.ExpressionLanguageProviderExtensions.SemanticTarget;
 import org.yakindu.sct.ui.editor.extensions.ExpressionLanguageProviderExtensions.SemanticTarget;
 import org.yakindu.sct.ui.editor.extensions.IExpressionLanguageProvider;
 import org.yakindu.sct.ui.editor.extensions.IExpressionLanguageProvider;
-import org.yakindu.sct.ui.editor.providers.DiagramPartitioningDocumentProvider;
+import org.yakindu.sct.ui.editor.partitioning.DiagramPartitioningEditor;
+import org.yakindu.sct.ui.editor.partitioning.DiagramPartitioningUtil;
 import org.yakindu.sct.ui.editor.utils.HelpContextIds;
 import org.yakindu.sct.ui.editor.utils.HelpContextIds;
 import org.yakindu.sct.ui.editor.validation.SCTValidationJob;
 import org.yakindu.sct.ui.editor.validation.SCTValidationJob;
 
 
@@ -60,7 +58,7 @@ import de.itemis.xtext.utils.gmf.resource.DirtyStateListener;
  * @author andreas muelder - Initial contribution and API
  * @author andreas muelder - Initial contribution and API
  * @author martin esser
  * @author martin esser
  */
  */
-public class StatechartDiagramEditor extends BreadcrumbDiagramEditor implements IGotoMarker {
+public class StatechartDiagramEditor extends DiagramPartitioningEditor implements IGotoMarker {
 
 
 	public static final String ID = "org.yakindu.sct.ui.editor.editor.StatechartDiagramEditor";
 	public static final String ID = "org.yakindu.sct.ui.editor.editor.StatechartDiagramEditor";
 	private static final int DELAY = 200; // ms
 	private static final int DELAY = 200; // ms
@@ -106,13 +104,6 @@ public class StatechartDiagramEditor extends BreadcrumbDiagramEditor implements
 		initValidationJob();
 		initValidationJob();
 	}
 	}
 
 
-	private DiagramPartitioningDocumentProvider provider = new DiagramPartitioningDocumentProvider();
-
-	@Override
-	public IDocumentProvider getDocumentProvider() {
-		return provider;
-	}
-
 	private void initValidationJob() {
 	private void initValidationJob() {
 		final IFile file = ((IFileEditorInput) getEditorInput()).getFile();
 		final IFile file = ((IFileEditorInput) getEditorInput()).getFile();
 		validationJob = new SCTValidationJob(getDiagram());
 		validationJob = new SCTValidationJob(getDiagram());
@@ -145,11 +136,6 @@ public class StatechartDiagramEditor extends BreadcrumbDiagramEditor implements
 		}
 		}
 	}
 	}
 
 
-	@Override
-	public TransactionalEditingDomain getEditingDomain() {
-		return DiagramPartitioningUtil.getSharedDomain();
-	}
-
 	@Override
 	@Override
 	protected TransactionalEditingDomain createEditingDomain() {
 	protected TransactionalEditingDomain createEditingDomain() {
 		TransactionalEditingDomain domain = DiagramPartitioningUtil.getSharedDomain();
 		TransactionalEditingDomain domain = DiagramPartitioningUtil.getSharedDomain();

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

@@ -8,8 +8,9 @@
  * 	committers of YAKINDU - initial API and implementation
  * 	committers of YAKINDU - initial API and implementation
  * 
  * 
  */
  */
-package org.yakindu.sct.ui.editor.breadcrumb;
+package org.yakindu.sct.ui.editor.partitioning;
 
 
+import org.eclipse.core.resources.IStorage;
 import org.eclipse.emf.transaction.TransactionalEditingDomain;
 import org.eclipse.emf.transaction.TransactionalEditingDomain;
 import org.eclipse.emf.workspace.util.WorkspaceSynchronizer;
 import org.eclipse.emf.workspace.util.WorkspaceSynchronizer;
 import org.eclipse.gmf.runtime.diagram.ui.parts.IDiagramEditorInput;
 import org.eclipse.gmf.runtime.diagram.ui.parts.IDiagramEditorInput;
@@ -74,4 +75,12 @@ public class DiagramEditorInput extends FileEditorInput implements IDiagramEdito
 		return null;
 		return null;
 	}
 	}
 
 
+	@Override
+	public Object getAdapter(@SuppressWarnings("rawtypes") Class adapter) {
+		if (adapter == IStorage.class) {
+			return WorkspaceSynchronizer.getFile(diagram.eResource());
+		}
+		return super.getAdapter(adapter);
+	}
+
 }
 }

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

@@ -8,7 +8,7 @@
  * 	committers of YAKINDU - initial API and implementation
  * 	committers of YAKINDU - initial API and implementation
  * 
  * 
  */
  */
-package org.yakindu.sct.ui.editor.breadcrumb;
+package org.yakindu.sct.ui.editor.partitioning;
 
 
 import java.io.IOException;
 import java.io.IOException;
 import java.util.Collections;
 import java.util.Collections;

+ 5 - 4
plugins/org.yakindu.sct.ui.editor/src/org/yakindu/sct/ui/editor/breadcrumb/DiagramPartitioningBreadcrumbViewer.java

@@ -8,9 +8,9 @@
  * 	committers of YAKINDU - initial API and implementation
  * 	committers of YAKINDU - initial API and implementation
  * 
  * 
  */
  */
-package org.yakindu.sct.ui.editor.breadcrumb;
+package org.yakindu.sct.ui.editor.partitioning;
 
 
-import static org.yakindu.sct.ui.editor.breadcrumb.DiagramPartitioningUtil.openEditor;
+import static org.yakindu.sct.ui.editor.partitioning.DiagramPartitioningUtil.openEditor;
 
 
 import java.util.ArrayList;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collection;
@@ -146,7 +146,7 @@ public class DiagramPartitioningBreadcrumbViewer extends BreadcrumbViewer implem
 	public void selectionChanged(SelectionChangedEvent event) {
 	public void selectionChanged(SelectionChangedEvent event) {
 		Object selection = ((IStructuredSelection) event.getSelection()).getFirstElement();
 		Object selection = ((IStructuredSelection) event.getSelection()).getFirstElement();
 		if (selection instanceof State || selection instanceof Statechart) {
 		if (selection instanceof State || selection instanceof Statechart) {
-			Diagram diagram = DiagramPartitioningUtil.getSubDiagram((EObject) selection);
+			Diagram diagram = DiagramPartitioningUtil.getSubDiagram((CompositeElement) selection);
 			openEditor(diagram);
 			openEditor(diagram);
 		} else if (selection instanceof IFile) {
 		} else if (selection instanceof IFile) {
 			openEditor((IFile) selection);
 			openEditor((IFile) selection);
@@ -230,7 +230,8 @@ public class DiagramPartitioningBreadcrumbViewer extends BreadcrumbViewer implem
 			for (Region region : regions) {
 			for (Region region : regions) {
 				EList<Vertex> vertices = region.getVertices();
 				EList<Vertex> vertices = region.getVertices();
 				for (Vertex vertex : vertices) {
 				for (Vertex vertex : vertices) {
-					if (vertex instanceof State && DiagramPartitioningUtil.getSubDiagram(vertex) != null) {
+					if (vertex instanceof State
+							&& DiagramPartitioningUtil.getSubDiagram((CompositeElement) vertex) != null) {
 						result.add(vertex);
 						result.add(vertex);
 					}
 					}
 				}
 				}

+ 56 - 5
plugins/org.yakindu.sct.ui.editor/src/org/yakindu/sct/ui/editor/providers/DiagramPartitioningDocumentProvider.java

@@ -8,28 +8,58 @@
  * 	committers of YAKINDU - initial API and implementation
  * 	committers of YAKINDU - initial API and implementation
  * 
  * 
  */
  */
-package org.yakindu.sct.ui.editor.providers;
+package org.yakindu.sct.ui.editor.partitioning;
 
 
 import org.eclipse.core.runtime.CoreException;
 import org.eclipse.core.runtime.CoreException;
 import org.eclipse.emf.ecore.resource.Resource;
 import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.emf.edit.domain.EditingDomain;
 import org.eclipse.emf.transaction.TransactionalEditingDomain;
 import org.eclipse.emf.transaction.TransactionalEditingDomain;
 import org.eclipse.gmf.runtime.diagram.ui.parts.IDiagramEditorInput;
 import org.eclipse.gmf.runtime.diagram.ui.parts.IDiagramEditorInput;
 import org.eclipse.gmf.runtime.diagram.ui.resources.editor.document.DiagramDocument;
 import org.eclipse.gmf.runtime.diagram.ui.resources.editor.document.DiagramDocument;
+import org.eclipse.gmf.runtime.diagram.ui.resources.editor.document.DiagramModificationListener;
+import org.eclipse.gmf.runtime.diagram.ui.resources.editor.document.IDiagramDocumentProvider;
 import org.eclipse.gmf.runtime.diagram.ui.resources.editor.document.IDocument;
 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.FileDiagramDocumentProvider;
+import org.eclipse.gmf.runtime.diagram.ui.resources.editor.ide.document.FileDiagramModificationListener;
 import org.eclipse.gmf.runtime.diagram.ui.resources.editor.ide.document.FileEditorInputProxy;
 import org.eclipse.gmf.runtime.diagram.ui.resources.editor.ide.document.FileEditorInputProxy;
 import org.eclipse.gmf.runtime.notation.Diagram;
 import org.eclipse.gmf.runtime.notation.Diagram;
 import org.eclipse.ui.IEditorInput;
 import org.eclipse.ui.IEditorInput;
-import org.yakindu.sct.ui.editor.breadcrumb.DiagramEditorInput;
-import org.yakindu.sct.ui.editor.breadcrumb.DiagramPartitioningUtil;
+import org.eclipse.ui.IFileEditorInput;
 
 
 /**
 /**
+ * Implementation of the {@link IDiagramDocumentProvider} interface that extends
+ * a {@link FileDiagramDocumentProvider}.
+ * 
+ * In addition to the {@link FileDiagramDocumentProvider}, this implementation
+ * acts on a shared editing domain and can handle custom
+ * {@link DiagramEditorInput}. It also unloads non used resources with help of
+ * the {@link ResourceUnloadingTool}
  * 
  * 
  * @author andreas muelder - Initial contribution and API
  * @author andreas muelder - Initial contribution and API
  * 
  * 
  */
  */
 public class DiagramPartitioningDocumentProvider extends FileDiagramDocumentProvider {
 public class DiagramPartitioningDocumentProvider extends FileDiagramDocumentProvider {
 
 
+	/**
+	 * Extension of {@link DiagramFileInfo} that stores the given
+	 * {@link IEditorInput} which is required for the
+	 * {@link ResourceUnloadingTool}
+	 */
+	protected class InputDiagramFileInfo extends DiagramFileInfo {
+
+		private final IEditorInput editorInput;
+
+		public InputDiagramFileInfo(IDocument document, FileSynchronizer fileSynchronizer,
+				DiagramModificationListener listener, IEditorInput editorInput) {
+			super(document, fileSynchronizer, listener);
+			this.editorInput = editorInput;
+		}
+
+		public IEditorInput getEditorInput() {
+			return editorInput;
+		}
+	}
+
 	public IEditorInput createInputWithEditingDomain(IEditorInput editorInput, TransactionalEditingDomain domain) {
 	public IEditorInput createInputWithEditingDomain(IEditorInput editorInput, TransactionalEditingDomain domain) {
 		if (editorInput instanceof DiagramEditorInput) {
 		if (editorInput instanceof DiagramEditorInput) {
 			return editorInput;
 			return editorInput;
@@ -37,6 +67,9 @@ public class DiagramPartitioningDocumentProvider extends FileDiagramDocumentProv
 		return super.createInputWithEditingDomain(editorInput, DiagramPartitioningUtil.getSharedDomain());
 		return super.createInputWithEditingDomain(editorInput, DiagramPartitioningUtil.getSharedDomain());
 	}
 	}
 
 
+	/**
+	 * Sets the {@link EditingDomain} to the shared instance
+	 */
 	@Override
 	@Override
 	protected IDocument createEmptyDocument() {
 	protected IDocument createEmptyDocument() {
 		DiagramDocument diagramDocument = new DiagramDocument();
 		DiagramDocument diagramDocument = new DiagramDocument();
@@ -47,6 +80,8 @@ public class DiagramPartitioningDocumentProvider extends FileDiagramDocumentProv
 	@Override
 	@Override
 	protected ElementInfo createElementInfo(Object element) throws CoreException {
 	protected ElementInfo createElementInfo(Object element) throws CoreException {
 		ElementInfo info = super.createElementInfo(element);
 		ElementInfo info = super.createElementInfo(element);
+		// the canBeSaved flag is calculated based on the dirty state of the
+		// editingdomains resourceset
 		info.fCanBeSaved = isDirty(DiagramPartitioningUtil.getSharedDomain());
 		info.fCanBeSaved = isDirty(DiagramPartitioningUtil.getSharedDomain());
 		return info;
 		return info;
 	}
 	}
@@ -60,9 +95,21 @@ public class DiagramPartitioningDocumentProvider extends FileDiagramDocumentProv
 		return false;
 		return false;
 	}
 	}
 
 
+	protected FileInfo createFileInfo(IDocument document, FileSynchronizer synchronizer, IFileEditorInput input) {
+		assert document instanceof DiagramDocument;
+
+		DiagramModificationListener diagramListener = null;
+		if (((DiagramDocument) document).getDiagram() != null) {
+			diagramListener = new FileDiagramModificationListener(this, (DiagramDocument) document, input);
+		}
+		InputDiagramFileInfo info = new InputDiagramFileInfo(document, synchronizer, diagramListener, input);
+		diagramListener.startListening();
+		return info;
+	}
+
 	@Override
 	@Override
 	protected boolean setDocumentContent(IDocument document, IEditorInput editorInput) throws CoreException {
 	protected boolean setDocumentContent(IDocument document, IEditorInput editorInput) throws CoreException {
-		if (editorInput instanceof DiagramEditorInput) {
+		if (editorInput instanceof IDiagramEditorInput) {
 			Diagram diagram = ((IDiagramEditorInput) editorInput).getDiagram();
 			Diagram diagram = ((IDiagramEditorInput) editorInput).getDiagram();
 			document.setContent(diagram);
 			document.setContent(diagram);
 			return true;
 			return true;
@@ -80,6 +127,10 @@ public class DiagramPartitioningDocumentProvider extends FileDiagramDocumentProv
 		// Unset the content first to avoid call to DiagramIOUtil.unload
 		// Unset the content first to avoid call to DiagramIOUtil.unload
 		super.disposeElementInfo(element, info);
 		super.disposeElementInfo(element, info);
 		info.fDocument.setContent(content);
 		info.fDocument.setContent(content);
+		if (info instanceof InputDiagramFileInfo) {
+			// Unload non needed resources
+			ResourceUnloadingTool.unloadEditorInput(DiagramPartitioningUtil.getSharedDomain().getResourceSet(),
+					((InputDiagramFileInfo) info).getEditorInput());
+		}
 	}
 	}
-
 }
 }

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

@@ -8,17 +8,20 @@
  * 	committers of YAKINDU - initial API and implementation
  * 	committers of YAKINDU - initial API and implementation
  * 
  * 
  */
  */
-package org.yakindu.sct.ui.editor.breadcrumb;
+package org.yakindu.sct.ui.editor.partitioning;
 
 
-import static org.yakindu.sct.ui.editor.breadcrumb.DiagramPartitioningUtil.openEditor;
+import static org.yakindu.sct.ui.editor.partitioning.DiagramPartitioningUtil.openEditor;
 
 
 import java.util.Collection;
 import java.util.Collection;
 import java.util.List;
 import java.util.List;
 
 
 import org.eclipse.core.resources.IFile;
 import org.eclipse.core.resources.IFile;
 import org.eclipse.emf.ecore.EObject;
 import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.edit.domain.IEditingDomainProvider;
 import org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider;
 import org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider;
+import org.eclipse.emf.transaction.TransactionalEditingDomain;
 import org.eclipse.gmf.runtime.diagram.ui.parts.IDiagramEditorInput;
 import org.eclipse.gmf.runtime.diagram.ui.parts.IDiagramEditorInput;
+import org.eclipse.gmf.runtime.diagram.ui.resources.editor.document.IDocumentProvider;
 import org.eclipse.gmf.runtime.diagram.ui.resources.editor.parts.DiagramDocumentEditor;
 import org.eclipse.gmf.runtime.diagram.ui.resources.editor.parts.DiagramDocumentEditor;
 import org.eclipse.gmf.runtime.notation.Diagram;
 import org.eclipse.gmf.runtime.notation.Diagram;
 import org.eclipse.jface.layout.GridDataFactory;
 import org.eclipse.jface.layout.GridDataFactory;
@@ -41,17 +44,34 @@ import org.yakindu.sct.model.sgraph.provider.SGraphItemProviderAdapterFactory;
 import org.yakindu.sct.ui.editor.StatechartImages;
 import org.yakindu.sct.ui.editor.StatechartImages;
 
 
 /**
 /**
+ * Editor that uses a {@link DiagramPartitioningDocumentProvider} and adds a
+ * {@link DiagramPartitioningBreadcrumbViewer} to the top.
  * 
  * 
  * @author andreas muelder - Initial contribution and API
  * @author andreas muelder - Initial contribution and API
  * 
  * 
  */
  */
-public abstract class BreadcrumbDiagramEditor extends DiagramDocumentEditor implements ISelectionChangedListener {
+public abstract class DiagramPartitioningEditor extends DiagramDocumentEditor implements ISelectionChangedListener,
+		IEditingDomainProvider {
 
 
 	private static final String SUBDIAGRAM = "Subdiagram - ";
 	private static final String SUBDIAGRAM = "Subdiagram - ";
+
 	private DiagramPartitioningBreadcrumbViewer viewer;
 	private DiagramPartitioningBreadcrumbViewer viewer;
 
 
-	public BreadcrumbDiagramEditor(boolean hasFlyoutPalette) {
+	private DiagramPartitioningDocumentProvider documentProvider;
+
+	public DiagramPartitioningEditor(boolean hasFlyoutPalette) {
 		super(hasFlyoutPalette);
 		super(hasFlyoutPalette);
+		documentProvider = new DiagramPartitioningDocumentProvider();
+	}
+
+	@Override
+	public TransactionalEditingDomain getEditingDomain() {
+		return DiagramPartitioningUtil.getSharedDomain();
+	}
+
+	@Override
+	public IDocumentProvider getDocumentProvider() {
+		return documentProvider;
 	}
 	}
 
 
 	@Override
 	@Override

+ 40 - 5
plugins/org.yakindu.sct.ui.editor/src/org/yakindu/sct/ui/editor/breadcrumb/DiagramPartitioningUtil.java

@@ -8,7 +8,7 @@
  * 	committers of YAKINDU - initial API and implementation
  * 	committers of YAKINDU - initial API and implementation
  * 
  * 
  */
  */
-package org.yakindu.sct.ui.editor.breadcrumb;
+package org.yakindu.sct.ui.editor.partitioning;
 
 
 import java.util.ArrayList;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collection;
@@ -16,6 +16,7 @@ import java.util.Collections;
 import java.util.List;
 import java.util.List;
 
 
 import org.eclipse.core.resources.IFile;
 import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IResource;
 import org.eclipse.emf.common.util.TreeIterator;
 import org.eclipse.emf.common.util.TreeIterator;
 import org.eclipse.emf.ecore.EObject;
 import org.eclipse.emf.ecore.EObject;
 import org.eclipse.emf.ecore.resource.Resource;
 import org.eclipse.emf.ecore.resource.Resource;
@@ -26,6 +27,7 @@ import org.eclipse.gmf.runtime.diagram.core.DiagramEditingDomainFactory;
 import org.eclipse.gmf.runtime.diagram.ui.parts.IDiagramEditorInput;
 import org.eclipse.gmf.runtime.diagram.ui.parts.IDiagramEditorInput;
 import org.eclipse.gmf.runtime.notation.Diagram;
 import org.eclipse.gmf.runtime.notation.Diagram;
 import org.eclipse.gmf.runtime.notation.NotationPackage;
 import org.eclipse.gmf.runtime.notation.NotationPackage;
+import org.eclipse.gmf.runtime.notation.Style;
 import org.eclipse.gmf.runtime.notation.View;
 import org.eclipse.gmf.runtime.notation.View;
 import org.eclipse.jface.dialogs.MessageDialog;
 import org.eclipse.jface.dialogs.MessageDialog;
 import org.eclipse.swt.widgets.Shell;
 import org.eclipse.swt.widgets.Shell;
@@ -36,8 +38,10 @@ import org.eclipse.ui.IWorkbenchPage;
 import org.eclipse.ui.PartInitException;
 import org.eclipse.ui.PartInitException;
 import org.eclipse.ui.PlatformUI;
 import org.eclipse.ui.PlatformUI;
 import org.eclipse.ui.part.FileEditorInput;
 import org.eclipse.ui.part.FileEditorInput;
+import org.yakindu.sct.model.sgraph.CompositeElement;
 import org.yakindu.sct.model.sgraph.State;
 import org.yakindu.sct.model.sgraph.State;
 import org.yakindu.sct.model.sgraph.Statechart;
 import org.yakindu.sct.model.sgraph.Statechart;
+import org.yakindu.sct.ui.editor.editor.StatechartDiagramEditor;
 
 
 /**
 /**
  * 
  * 
@@ -46,8 +50,20 @@ import org.yakindu.sct.model.sgraph.Statechart;
  */
  */
 public class DiagramPartitioningUtil {
 public class DiagramPartitioningUtil {
 
 
-	private static final String DOMAIN_ID = "SubDiagramDomain";
+	/** GMFs notation {@link Style} id **/
+	public static final String INLINE_STYLE = "isInline";
 
 
+	private static final String DOMAIN_ID = "StatechartDomain";
+
+	private DiagramPartitioningUtil() {
+	}
+
+	/**
+	 * Returns the Shared Editing Domain that is used for all Editors acting on
+	 * the same {@link IResource}
+	 * 
+	 * @return the {@link TransactionalEditingDomain}
+	 */
 	public static synchronized TransactionalEditingDomain getSharedDomain() {
 	public static synchronized TransactionalEditingDomain getSharedDomain() {
 		TransactionalEditingDomain editingDomain = TransactionalEditingDomain.Registry.INSTANCE
 		TransactionalEditingDomain editingDomain = TransactionalEditingDomain.Registry.INSTANCE
 				.getEditingDomain(DOMAIN_ID);
 				.getEditingDomain(DOMAIN_ID);
@@ -57,9 +73,11 @@ public class DiagramPartitioningUtil {
 			TransactionalEditingDomain.Registry.INSTANCE.add(DOMAIN_ID, editingDomain);
 			TransactionalEditingDomain.Registry.INSTANCE.add(DOMAIN_ID, editingDomain);
 		}
 		}
 		return editingDomain;
 		return editingDomain;
-
 	}
 	}
 
 
+	/**
+	 * Returns the {@link Diagram} that contains a given semantic element.
+	 */
 	public static Diagram getDiagramContaining(EObject element) {
 	public static Diagram getDiagramContaining(EObject element) {
 		Resource eResource = element.eResource();
 		Resource eResource = element.eResource();
 		Collection<Diagram> objects = EcoreUtil.getObjectsByType(eResource.getContents(),
 		Collection<Diagram> objects = EcoreUtil.getObjectsByType(eResource.getContents(),
@@ -78,7 +96,11 @@ public class DiagramPartitioningUtil {
 		return null;
 		return null;
 	}
 	}
 
 
-	public static Diagram getSubDiagram(EObject element) {
+	/**
+	 * Returns the Subdiagram for a given {@link State} or {@link Statechart}
+	 * 
+	 */
+	public static Diagram getSubDiagram(CompositeElement element) {
 		Resource eResource = element.eResource();
 		Resource eResource = element.eResource();
 		Collection<Diagram> objects = EcoreUtil.getObjectsByType(eResource.getContents(),
 		Collection<Diagram> objects = EcoreUtil.getObjectsByType(eResource.getContents(),
 				NotationPackage.Literals.DIAGRAM);
 				NotationPackage.Literals.DIAGRAM);
@@ -89,6 +111,10 @@ public class DiagramPartitioningUtil {
 		return null;
 		return null;
 	}
 	}
 
 
+	/**
+	 * Opens the {@link StatechartDiagramEditor} for a fiven {@link IFile}
+	 * 
+	 */
 	public static void openEditor(IFile file) {
 	public static void openEditor(IFile file) {
 		try {
 		try {
 			IEditorDescriptor desc = PlatformUI.getWorkbench().getEditorRegistry().getDefaultEditor(file.getName());
 			IEditorDescriptor desc = PlatformUI.getWorkbench().getEditorRegistry().getDefaultEditor(file.getName());
@@ -100,6 +126,9 @@ public class DiagramPartitioningUtil {
 
 
 	}
 	}
 
 
+	/**
+	 * Opens a subdiagram for a given {@link Diagram}
+	 */
 	public static IEditorPart openEditor(Diagram diagramToOpen) {
 	public static IEditorPart openEditor(Diagram diagramToOpen) {
 		IFile file = WorkspaceSynchronizer.getFile(diagramToOpen.eResource());
 		IFile file = WorkspaceSynchronizer.getFile(diagramToOpen.eResource());
 		try {
 		try {
@@ -116,6 +145,12 @@ public class DiagramPartitioningUtil {
 		return null;
 		return null;
 	}
 	}
 
 
+	/**
+	 * Forces the user to close all opened editors for subdiagrams that are
+	 * inlined.
+	 * 
+	 * @return true if all editors were closed, false otherwise
+	 */
 	public static boolean closeSubdiagramEditors(State state) {
 	public static boolean closeSubdiagramEditors(State state) {
 		Diagram diagram = DiagramPartitioningUtil.getSubDiagram(state);
 		Diagram diagram = DiagramPartitioningUtil.getSubDiagram(state);
 		if (diagram == null)
 		if (diagram == null)
@@ -157,7 +192,7 @@ public class DiagramPartitioningUtil {
 		List<Diagram> result = new ArrayList<Diagram>();
 		List<Diagram> result = new ArrayList<Diagram>();
 		result.add(diagram);
 		result.add(diagram);
 		while (diagram.getElement() instanceof State) {
 		while (diagram.getElement() instanceof State) {
-			diagram = DiagramPartitioningUtil.getSubDiagram(diagram.getElement());
+			diagram = DiagramPartitioningUtil.getSubDiagram((CompositeElement) diagram.getElement());
 			result.add(diagram);
 			result.add(diagram);
 		}
 		}
 		Collections.reverse(result);
 		Collections.reverse(result);

+ 82 - 0
plugins/org.yakindu.sct.ui.editor/src/org/yakindu/sct/ui/editor/partitioning/ResourceUnloadingTool.java

@@ -0,0 +1,82 @@
+package org.yakindu.sct.ui.editor.partitioning;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+
+import org.eclipse.emf.common.ui.URIEditorInput;
+import org.eclipse.emf.common.util.EList;
+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.edit.domain.IEditingDomainProvider;
+import org.eclipse.gmf.runtime.diagram.ui.parts.IDiagramEditorInput;
+import org.eclipse.gmf.runtime.emf.core.util.EMFCoreUtil;
+import org.eclipse.gmf.runtime.notation.Diagram;
+import org.eclipse.ui.IEditorInput;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.IEditorReference;
+import org.eclipse.ui.IFileEditorInput;
+import org.eclipse.ui.PlatformUI;
+
+public class ResourceUnloadingTool {
+
+	public static void unloadEditorInput(ResourceSet resourceSet, IEditorInput editorInput) {
+		final EList<Resource> resources = resourceSet.getResources();
+		final List<Resource> resourcesToUnload = new ArrayList<Resource>(resources);
+		IEditorReference[] editorReferences;
+		try {
+			editorReferences = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage()
+					.getEditorReferences();
+		} catch (final NullPointerException exc) {
+			// Workbench is not yet created or being disposed, so do nothing
+			// see bug http://code.google.com/p/gmftools/issues/detail?id=9
+			return;
+		}
+		for (final IEditorReference openEditorReference : editorReferences) {
+			try {
+				final IEditorInput openEditorInput = openEditorReference.getEditorInput();
+				if (openEditorInput != editorInput) {
+					final IEditorPart openEditor = openEditorReference.getEditor(false);
+					if (openEditor instanceof IEditingDomainProvider) {
+						final IEditingDomainProvider openDiagramEditor = (IEditingDomainProvider) openEditor;
+						final ResourceSet diagramResourceSet = openDiagramEditor.getEditingDomain().getResourceSet();
+						if (diagramResourceSet == resourceSet) {
+							final Resource diagramResource = getDiagramResource(diagramResourceSet, openEditorInput);
+							resourcesToUnload.remove(diagramResource);
+							final Collection<?> imports = EMFCoreUtil.getImports(diagramResource);
+							resourcesToUnload.removeAll(imports);
+						}
+					}
+				}
+			} catch (final Exception exc) {
+				exc.printStackTrace();
+			}
+		}
+		for (final Resource resourceToUnload : resourcesToUnload) {
+			try {
+				resourceToUnload.unload();
+				resources.remove(resourceToUnload);
+			} catch (final Throwable t) {
+				t.printStackTrace();
+			}
+		}
+	}
+
+	private static Resource getDiagramResource(ResourceSet resourceSet, IEditorInput editorInput) {
+		Resource diagramResource = null;
+		if (editorInput instanceof URIEditorInput) {
+			final URI resourceURI = ((URIEditorInput) editorInput).getURI().trimFragment();
+			diagramResource = resourceSet.getResource(resourceURI, false);
+		} else if (editorInput instanceof IDiagramEditorInput) {
+			final Diagram diagram = ((IDiagramEditorInput) editorInput).getDiagram();
+			diagramResource = diagram.eResource();
+		} else if (editorInput instanceof IFileEditorInput) {
+			final URI resourceURI = URI.createPlatformResourceURI(((IFileEditorInput) editorInput).getFile()
+					.getFullPath().toString(), true);
+			diagramResource = resourceSet.getResource(resourceURI, false);
+		}
+		return diagramResource;
+	}
+
+}

+ 2 - 5
plugins/org.yakindu.sct.ui.editor/src/org/yakindu/sct/ui/editor/submachine/SubmachineDecorationProvider.java

@@ -26,7 +26,7 @@ import org.eclipse.swt.graphics.Image;
 import org.eclipse.xtext.EcoreUtil2;
 import org.eclipse.xtext.EcoreUtil2;
 import org.yakindu.sct.model.sgraph.State;
 import org.yakindu.sct.model.sgraph.State;
 import org.yakindu.sct.ui.editor.StatechartImages;
 import org.yakindu.sct.ui.editor.StatechartImages;
-import org.yakindu.sct.ui.editor.breadcrumb.DiagramPartitioningUtil;
+import org.yakindu.sct.ui.editor.partitioning.DiagramPartitioningUtil;
 import org.yakindu.sct.ui.editor.utils.GMFNotationUtil;
 import org.yakindu.sct.ui.editor.utils.GMFNotationUtil;
 
 
 import de.itemis.gmf.runtime.commons.decorators.AbstractDecoratorProvider;
 import de.itemis.gmf.runtime.commons.decorators.AbstractDecoratorProvider;
@@ -40,9 +40,6 @@ public class SubmachineDecorationProvider extends AbstractDecoratorProvider impl
 
 
 	private static final String DECORATOR_KEY = SubmachineDecorator.class.getSimpleName();
 	private static final String DECORATOR_KEY = SubmachineDecorator.class.getSimpleName();
 
 
-	// TODO: Move to common class
-	private static final String INLINE_STYLE = "isInline";
-
 	public void createDecorators(IDecoratorTarget decoratorTarget) {
 	public void createDecorators(IDecoratorTarget decoratorTarget) {
 		Object adapter = decoratorTarget.getAdapter(EObject.class);
 		Object adapter = decoratorTarget.getAdapter(EObject.class);
 		if (adapter instanceof State)
 		if (adapter instanceof State)
@@ -58,7 +55,7 @@ public class SubmachineDecorationProvider extends AbstractDecoratorProvider impl
 		@Override
 		@Override
 		protected boolean shouldDecorate(State state) {
 		protected boolean shouldDecorate(State state) {
 			IGraphicalEditPart adapter = (IGraphicalEditPart) getDecoratorTarget().getAdapter(IGraphicalEditPart.class);
 			IGraphicalEditPart adapter = (IGraphicalEditPart) getDecoratorTarget().getAdapter(IGraphicalEditPart.class);
-			BooleanValueStyle style = GMFNotationUtil.getBooleanValueStyle(adapter.getNotationView(), INLINE_STYLE);
+			BooleanValueStyle style = GMFNotationUtil.getBooleanValueStyle(adapter.getNotationView(), DiagramPartitioningUtil.INLINE_STYLE);
 			return style == null ? false : !style.isBooleanValue();
 			return style == null ? false : !style.isBooleanValue();
 		}
 		}