ソースを参照

First inital commit of subdiagrams

Andreas Mülder 13 年 前
コミット
e90d4abb4f
13 ファイル変更291 行追加183 行削除
  1. 0 9
      plugins/org.yakindu.sct.refactoring/src/org/yakindu/sct/refactoring/handlers/impl/ExtractSubdiagramHandler.java
  2. 27 4
      plugins/org.yakindu.sct.refactoring/src/org/yakindu/sct/refactoring/refactor/impl/ExtractSubdiagramRefactoring.java
  3. 32 1
      plugins/org.yakindu.sct.refactoring/src/org/yakindu/sct/refactoring/refactor/impl/InlineSubdiagramRefactoring.java
  4. 4 0
      plugins/org.yakindu.sct.refactoring/src/org/yakindu/sct/refactoring/refactor/impl/SubdiagramRefactoring.java
  5. 80 60
      plugins/org.yakindu.sct.ui.editor/src/org/yakindu/sct/ui/editor/breadcrumb/BreadcrumbDiagramEditor.java
  6. 0 65
      plugins/org.yakindu.sct.ui.editor/src/org/yakindu/sct/ui/editor/breadcrumb/BreadcrumbEditorUtil.java
  7. 11 2
      plugins/org.yakindu.sct.ui.editor/src/org/yakindu/sct/ui/editor/editor/StatechartDiagramEditor.java
  8. 2 2
      plugins/org.yakindu.sct.ui.editor/src/org/yakindu/sct/ui/editor/editparts/StatechartDiagramEditPart.java
  9. 5 5
      plugins/org.yakindu.sct.ui.editor/src/org/yakindu/sct/ui/editor/policies/StatechartCanonicalEditPolicy.java
  10. 14 1
      plugins/org.yakindu.sct.ui.editor/src/org/yakindu/sct/ui/editor/policies/StateCompartmentCanonicalEditPolicy.java
  11. 62 0
      plugins/org.yakindu.sct.ui.editor/src/org/yakindu/sct/ui/editor/providers/DiagramPartitioningDocumentProvider.java
  12. 0 12
      plugins/org.yakindu.sct.ui.editor/src/org/yakindu/sct/ui/editor/submachine/SubStateDecorator.java
  13. 54 22
      plugins/org.yakindu.sct.ui.editor/src/org/yakindu/sct/ui/editor/submachine/SubmachineDecorationProvider.java

+ 0 - 9
plugins/org.yakindu.sct.refactoring/src/org/yakindu/sct/refactoring/handlers/impl/ExtractSubdiagramHandler.java

@@ -11,7 +11,6 @@
 package org.yakindu.sct.refactoring.handlers.impl;
 package org.yakindu.sct.refactoring.handlers.impl;
 
 
 import org.eclipse.gmf.runtime.notation.View;
 import org.eclipse.gmf.runtime.notation.View;
-import org.eclipse.jface.viewers.ISelection;
 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.ExtractSubdiagramRefactoring;
 import org.yakindu.sct.refactoring.refactor.impl.ExtractSubdiagramRefactoring;
@@ -28,12 +27,4 @@ public class ExtractSubdiagramHandler extends AbstractViewRefactoringHandler {
 	public AbstractRefactoring<View> createRefactoring() {
 	public AbstractRefactoring<View> createRefactoring() {
 		return new ExtractSubdiagramRefactoring();
 		return new ExtractSubdiagramRefactoring();
 	}
 	}
-
-	@Override
-	public void setContext(AbstractRefactoring<View> refactoring,
-			ISelection selection) {
-		
-		
-	}
-
 }
 }

+ 27 - 4
plugins/org.yakindu.sct.refactoring/src/org/yakindu/sct/refactoring/refactor/impl/ExtractSubdiagramRefactoring.java

@@ -10,8 +10,15 @@
  */
  */
 package org.yakindu.sct.refactoring.refactor.impl;
 package org.yakindu.sct.refactoring.refactor.impl;
 
 
-import org.eclipse.gmf.runtime.notation.BooleanValueStyle;
+import org.eclipse.emf.common.util.EList;
+import org.eclipse.gmf.runtime.diagram.core.services.ViewService;
+import org.eclipse.gmf.runtime.diagram.core.util.ViewUtil;
+import org.eclipse.gmf.runtime.notation.Diagram;
+import org.eclipse.gmf.runtime.notation.View;
+import org.yakindu.sct.model.sgraph.Region;
 import org.yakindu.sct.model.sgraph.State;
 import org.yakindu.sct.model.sgraph.State;
+import org.yakindu.sct.ui.editor.editor.StatechartDiagramEditor;
+import org.yakindu.sct.ui.editor.providers.SemanticHints;
 
 
 /**
 /**
  * 
  * 
@@ -20,6 +27,7 @@ import org.yakindu.sct.model.sgraph.State;
  */
  */
 public class ExtractSubdiagramRefactoring extends SubdiagramRefactoring {
 public class ExtractSubdiagramRefactoring extends SubdiagramRefactoring {
 
 
+
 	@Override
 	@Override
 	public boolean isExecutable() {
 	public boolean isExecutable() {
 		State state = (State) getContextObject().getElement();
 		State state = (State) getContextObject().getElement();
@@ -27,10 +35,25 @@ public class ExtractSubdiagramRefactoring extends SubdiagramRefactoring {
 				&& getInlineStyle().isBooleanValue();
 				&& getInlineStyle().isBooleanValue();
 	}
 	}
 
 
+	@SuppressWarnings("unchecked")
 	@Override
 	@Override
 	protected void internalExecute() {
 	protected void internalExecute() {
-		System.out.println("Extracting");
-		BooleanValueStyle style = super.getInlineStyle();
-		style.setBooleanValue(false);
+		getInlineStyle().setBooleanValue(false);
+
+		View contextView = getContextObject();
+		State contextElement = (State) contextView.getElement();
+
+		Diagram subdiagram = ViewService.createDiagram(contextElement,
+				StatechartDiagramEditor.ID, preferencesHint);
+		View figureCompartment = ViewUtil.getChildBySemanticHint(contextView,
+				SemanticHints.STATE_FIGURE_COMPARTMENT);
+		EList<View> children = figureCompartment.getChildren();
+		for (View view : children) {
+			if (view.getElement() instanceof Region) {
+				subdiagram.insertChild(view);
+			}
+		}
+		getResource().getContents().add(subdiagram);
+
 	}
 	}
 }
 }

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

@@ -10,6 +10,14 @@
  */
  */
 package org.yakindu.sct.refactoring.refactor.impl;
 package org.yakindu.sct.refactoring.refactor.impl;
 
 
+import org.eclipse.emf.common.util.EList;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.util.EcoreUtil;
+import org.eclipse.gmf.runtime.diagram.core.util.ViewUtil;
+import org.eclipse.gmf.runtime.notation.Diagram;
+import org.eclipse.gmf.runtime.notation.View;
+import org.yakindu.sct.model.sgraph.State;
+import org.yakindu.sct.ui.editor.providers.SemanticHints;
 
 
 /**
 /**
  * 
  * 
@@ -23,10 +31,33 @@ public class InlineSubdiagramRefactoring extends SubdiagramRefactoring {
 		return super.isExecutable() && !getInlineStyle().isBooleanValue();
 		return super.isExecutable() && !getInlineStyle().isBooleanValue();
 	}
 	}
 
 
+	@SuppressWarnings("unchecked")
 	@Override
 	@Override
 	protected void internalExecute() {
 	protected void internalExecute() {
-		System.out.println("Inline");
 		getInlineStyle().setBooleanValue(true);
 		getInlineStyle().setBooleanValue(true);
+
+		View contextView = getContextObject();
+		State contextElement = (State) contextView.getElement();
+		Diagram inlineDiagram = findDiagramForState(contextElement);
+		View figureCompartment = ViewUtil.getChildBySemanticHint(contextView,
+				SemanticHints.STATE_FIGURE_COMPARTMENT);
+
+		EList<View> children = inlineDiagram.getChildren();
+		for (View view : children) {
+			figureCompartment.insertChild(view);
+		}
+		getResource().getContents().remove(inlineDiagram);
 	}
 	}
 
 
+	protected Diagram findDiagramForState(State state) {
+		EList<EObject> contents = getResource().getContents();
+		for (EObject eObject : contents) {
+			if (eObject instanceof Diagram) {
+				if (EcoreUtil.equals(((Diagram) eObject).getElement(), state)) {
+					return (Diagram) eObject;
+				}
+			}
+		}
+		return null;
+	}
 }
 }

+ 4 - 0
plugins/org.yakindu.sct.refactoring/src/org/yakindu/sct/refactoring/refactor/impl/SubdiagramRefactoring.java

@@ -10,10 +10,12 @@
  */
  */
 package org.yakindu.sct.refactoring.refactor.impl;
 package org.yakindu.sct.refactoring.refactor.impl;
 
 
+import org.eclipse.gmf.runtime.diagram.core.preferences.PreferencesHint;
 import org.eclipse.gmf.runtime.notation.BooleanValueStyle;
 import org.eclipse.gmf.runtime.notation.BooleanValueStyle;
 import org.eclipse.gmf.runtime.notation.NotationFactory;
 import org.eclipse.gmf.runtime.notation.NotationFactory;
 import org.eclipse.gmf.runtime.notation.View;
 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.utils.GMFNotationUtil;
 import org.yakindu.sct.ui.editor.utils.GMFNotationUtil;
 
 
 /**
 /**
@@ -25,6 +27,8 @@ public abstract class SubdiagramRefactoring extends AbstractRefactoring<View> {
 
 
 	private static final String INLINE_STYLE = "isInline";
 	private static final String INLINE_STYLE = "isInline";
 
 
+	protected PreferencesHint preferencesHint = DiagramActivator.DIAGRAM_PREFERENCES_HINT;
+
 	@SuppressWarnings("unchecked")
 	@SuppressWarnings("unchecked")
 	protected BooleanValueStyle getInlineStyle() {
 	protected BooleanValueStyle getInlineStyle() {
 		BooleanValueStyle result = GMFNotationUtil.getBooleanValueStyle(
 		BooleanValueStyle result = GMFNotationUtil.getBooleanValueStyle(

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

@@ -12,17 +12,25 @@ package org.yakindu.sct.ui.editor.breadcrumb;
 
 
 import java.util.ArrayList;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collection;
+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.debug.internal.ui.viewers.breadcrumb.BreadcrumbViewer;
 import org.eclipse.debug.internal.ui.viewers.breadcrumb.BreadcrumbViewer;
 import org.eclipse.debug.internal.ui.viewers.breadcrumb.IBreadcrumbDropDownSite;
 import org.eclipse.debug.internal.ui.viewers.breadcrumb.IBreadcrumbDropDownSite;
+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.edit.ui.provider.AdapterFactoryLabelProvider;
+import org.eclipse.gmf.runtime.diagram.ui.parts.IDiagramEditorInput;
 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.NotationPackage;
+import org.eclipse.gmf.runtime.notation.View;
 import org.eclipse.jface.layout.GridDataFactory;
 import org.eclipse.jface.layout.GridDataFactory;
 import org.eclipse.jface.viewers.BaseLabelProvider;
 import org.eclipse.jface.viewers.BaseLabelProvider;
-import org.eclipse.jface.viewers.ISelection;
 import org.eclipse.jface.viewers.ISelectionChangedListener;
 import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.IStructuredSelection;
 import org.eclipse.jface.viewers.ITreePathContentProvider;
 import org.eclipse.jface.viewers.ITreePathContentProvider;
 import org.eclipse.jface.viewers.ITreePathLabelProvider;
 import org.eclipse.jface.viewers.ITreePathLabelProvider;
 import org.eclipse.jface.viewers.SelectionChangedEvent;
 import org.eclipse.jface.viewers.SelectionChangedEvent;
@@ -34,29 +42,42 @@ import org.eclipse.swt.widgets.Composite;
 import org.eclipse.swt.widgets.Control;
 import org.eclipse.swt.widgets.Control;
 import org.eclipse.ui.IEditorInput;
 import org.eclipse.ui.IEditorInput;
 import org.eclipse.ui.IFileEditorInput;
 import org.eclipse.ui.IFileEditorInput;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.PlatformUI;
+import org.yakindu.base.base.NamedElement;
+import org.yakindu.sct.model.sgraph.State;
+import org.yakindu.sct.model.sgraph.Statechart;
+import org.yakindu.sct.model.sgraph.provider.SGraphItemProviderAdapterFactory;
 import org.yakindu.sct.ui.editor.StatechartImages;
 import org.yakindu.sct.ui.editor.StatechartImages;
-import org.yakindu.sct.ui.editor.editor.StatechartDiagramEditor;
 
 
 @SuppressWarnings("restriction")
 @SuppressWarnings("restriction")
 public abstract class BreadcrumbDiagramEditor extends DiagramDocumentEditor {
 public abstract class BreadcrumbDiagramEditor extends DiagramDocumentEditor {
 
 
-	private List<IFile> history;
-
 	public BreadcrumbDiagramEditor(boolean hasFlyoutPalette) {
 	public BreadcrumbDiagramEditor(boolean hasFlyoutPalette) {
 		super(hasFlyoutPalette);
 		super(hasFlyoutPalette);
-		history = new ArrayList<IFile>(0);
 	}
 	}
 
 
 	@Override
 	@Override
 	public void createPartControl(Composite parent) {
 	public void createPartControl(Composite parent) {
 		parent.setLayout(createGridLayout());
 		parent.setLayout(createGridLayout());
-		// grid layout will produce small left and right trimmings; these should
-		// be removed as well
+		createBreadcrumbViewer(parent);
 		super.createPartControl(parent);
 		super.createPartControl(parent);
-		createBreadcrumpViewer(parent);
+	}
+
+	@Override
+	public void setInput(IEditorInput input) {
+		super.setInput(input);
+		if (input instanceof IDiagramEditorInput) {
+			initializeTitle((IDiagramEditorInput) input);
+		}
+	}
+
+	protected void initializeTitle(IDiagramEditorInput input) {
+		Diagram diagram = input.getDiagram();
+		EObject element = diagram.getElement();
+		AdapterFactoryLabelProvider factory = new AdapterFactoryLabelProvider(
+				new SGraphItemProviderAdapterFactory());
+		setTitleImage(factory.getImage(element));
+		setPartName("Subdiagram - " + factory.getText(element));
+
 	}
 	}
 
 
 	private org.eclipse.swt.layout.GridLayout createGridLayout() {
 	private org.eclipse.swt.layout.GridLayout createGridLayout() {
@@ -71,27 +92,43 @@ public abstract class BreadcrumbDiagramEditor extends DiagramDocumentEditor {
 		return layout;
 		return layout;
 	}
 	}
 
 
-	private Object getInputHistory() {
-		return history;
-	}
-
-	@Override
 	public IFileEditorInput getEditorInput() {
 	public IFileEditorInput getEditorInput() {
 		return (IFileEditorInput) super.getEditorInput();
 		return (IFileEditorInput) super.getEditorInput();
 	}
 	}
 
 
-	public void setInput(IEditorInput input) {
-		super.setInput(input);
-		if (input instanceof TrackingFileEditorInput) {
-			history = ((TrackingFileEditorInput) input).getHistory();
+	private List<Diagram> getViewerInput() {
+		List<Diagram> result = new ArrayList<Diagram>();
+		Diagram diagram = getDiagram();
+		result.add(getDiagram());
+		while (diagram.getElement() instanceof State) {
+			diagram = findDiagramForState((State) diagram.getElement());
+			result.add(diagram);
 		}
 		}
-		if (history.isEmpty()) {
-			history.add(getEditorInput().getFile());
+		Collections.reverse(result);
+		return result;
+	}
+
+	private Diagram findDiagramForState(State element) {
+		// TODO: Performance
+		Resource eResource = element.eResource();
+		Collection<Diagram> objects = EcoreUtil.getObjectsByType(
+				eResource.getContents(), NotationPackage.Literals.DIAGRAM);
+		for (Diagram diagram : objects) {
+			TreeIterator<EObject> eAllContents = diagram.eAllContents();
+			while (eAllContents.hasNext()) {
+				EObject next = eAllContents.next();
+				if (next instanceof View) {
+					if (EcoreUtil.equals(((View) next).getElement(), element)) {
+						return ((View) next).getDiagram();
+					}
+				}
+			}
 		}
 		}
-	};
+		return null;
+	}
 
 
-	private void createBreadcrumpViewer(Composite parent) {
-		MyBreadcrumpViewer viewer = new MyBreadcrumpViewer(parent, SWT.NONE);
+	private void createBreadcrumbViewer(Composite parent) {
+		SCTBreadcrumbViewer viewer = new SCTBreadcrumbViewer(parent, SWT.NONE);
 		viewer.setContentProvider(new ITreePathContentProvider() {
 		viewer.setContentProvider(new ITreePathContentProvider() {
 
 
 			private List<IFile> input;
 			private List<IFile> input;
@@ -131,27 +168,11 @@ public abstract class BreadcrumbDiagramEditor extends DiagramDocumentEditor {
 			}
 			}
 		});
 		});
 		viewer.setLabelProvider(new MyLabelProvider());
 		viewer.setLabelProvider(new MyLabelProvider());
-		viewer.setInput(getInputHistory());
+		viewer.setInput(getViewerInput());
 		viewer.addSelectionChangedListener(new ISelectionChangedListener() {
 		viewer.addSelectionChangedListener(new ISelectionChangedListener() {
 
 
 			public void selectionChanged(SelectionChangedEvent event) {
 			public void selectionChanged(SelectionChangedEvent event) {
-				ISelection selection = event.getSelection();
-				if (selection instanceof IStructuredSelection) {
-					IFile firstElement = (IFile) ((IStructuredSelection) selection)
-							.getFirstElement();
-					final IWorkbenchPage page = PlatformUI.getWorkbench()
-							.getActiveWorkbenchWindow().getActivePage();
-
-					try {
-						TrackingFileEditorInput input = new TrackingFileEditorInput(
-								firstElement);
-						input.setHistory(history.subList(0,
-								history.indexOf(firstElement)));
-						page.openEditor(input, StatechartDiagramEditor.ID);
-					} catch (PartInitException e) {
-						e.printStackTrace();
-					}
-				}
+
 			}
 			}
 		});
 		});
 
 
@@ -163,37 +184,36 @@ public abstract class BreadcrumbDiagramEditor extends DiagramDocumentEditor {
 		GridDataFactory.fillDefaults().grab(true, true).applyTo(parent);
 		GridDataFactory.fillDefaults().grab(true, true).applyTo(parent);
 	}
 	}
 
 
-	public List<IFile> getHistory() {
-		return history;
-	}
-
 	public class MyLabelProvider extends BaseLabelProvider implements
 	public class MyLabelProvider extends BaseLabelProvider implements
 			ITreePathLabelProvider {
 			ITreePathLabelProvider {
 
 
 		public void updateLabel(ViewerLabel label, TreePath elementPath) {
 		public void updateLabel(ViewerLabel label, TreePath elementPath) {
-			IFile lastSegment = (IFile) elementPath.getLastSegment();
-			label.setText(lastSegment.getName());
-			label.setImage(StatechartImages.LOGO.image());
+			Diagram lastSegment = (Diagram) elementPath.getLastSegment();
+			NamedElement element = (NamedElement) lastSegment.getElement();
+			AdapterFactoryLabelProvider provider = new AdapterFactoryLabelProvider(
+					new SGraphItemProviderAdapterFactory());
+			label.setText(provider.getText(element));
+			// TODO: change Edit provider
+			if (element instanceof Statechart)
+				label.setImage(StatechartImages.LOGO.image());
+			else
+				label.setImage(provider.getImage(element));
+
 		}
 		}
 	}
 	}
 
 
-	public class MyBreadcrumpViewer extends BreadcrumbViewer {
+	public class SCTBreadcrumbViewer extends BreadcrumbViewer {
 
 
-		public MyBreadcrumpViewer(Composite parent, int style) {
+		public SCTBreadcrumbViewer(Composite parent, int style) {
 			super(parent, style);
 			super(parent, style);
 		}
 		}
 
 
 		@Override
 		@Override
 		protected Control createDropDown(Composite parent,
 		protected Control createDropDown(Composite parent,
 				IBreadcrumbDropDownSite site, TreePath path) {
 				IBreadcrumbDropDownSite site, TreePath path) {
-			return null;
+			return new Composite(parent, SWT.NONE);
+
 		}
 		}
 
 
 	}
 	}
-	
-	@Override
-	public void dispose() {
-		history.clear();
-		super.dispose();
-	}
 }
 }

+ 0 - 65
plugins/org.yakindu.sct.ui.editor/src/org/yakindu/sct/ui/editor/breadcrumb/BreadcrumbEditorUtil.java

@@ -1,65 +0,0 @@
-/**
- * Copyright (c) 2011 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.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.commands.ExecutionException;
-import org.eclipse.core.resources.IFile;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IFileEditorInput;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.PlatformUI;
-import org.yakindu.sct.ui.editor.editor.StatechartDiagramEditor;
-
-import de.itemis.xtext.utils.jface.viewers.util.ActiveEditorTracker;
-
-/**
- * 
- * @author andreas muelder - Initial contribution and API
- * 
- */
-public class BreadcrumbEditorUtil {
-
-	public static void openEditor(IFile file) throws ExecutionException {
-		if (!file.exists()) {
-			return;
-		}
-		IEditorPart result = ActiveEditorTracker.getLastActiveEditor();
-		List<IFile> newHistory = new ArrayList<IFile>();
-		if (result instanceof BreadcrumbDiagramEditor) {
-			List<IFile> history = ((BreadcrumbDiagramEditor) result)
-					.getHistory();
-			newHistory.addAll(history);
-		} else {
-			IEditorInput editorInput = result.getEditorInput();
-			if (editorInput instanceof IFileEditorInput)
-				newHistory.add(((IFileEditorInput) editorInput).getFile());
-		}
-
-		newHistory.add(file);
-		TrackingFileEditorInput fileEditorInput = new TrackingFileEditorInput(
-				file);
-		fileEditorInput.setHistory(newHistory);
-
-		final IWorkbenchPage page = PlatformUI.getWorkbench()
-				.getActiveWorkbenchWindow().getActivePage();
-
-		try {
-			page.openEditor(fileEditorInput, StatechartDiagramEditor.ID);
-		} catch (PartInitException e) {
-			e.printStackTrace();
-		}
-	}
-}

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

@@ -30,7 +30,7 @@ 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.parts.DiagramDocumentEditor;
+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,9 +42,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.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.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;
 
 
@@ -57,7 +59,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 DiagramDocumentEditor implements
+public class StatechartDiagramEditor extends BreadcrumbDiagramEditor implements
 		IGotoMarker {
 		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";
@@ -106,6 +108,13 @@ public class StatechartDiagramEditor extends DiagramDocumentEditor 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());

+ 2 - 2
plugins/org.yakindu.sct.ui.editor/src/org/yakindu/sct/ui/editor/editparts/StatechartDiagramEditPart.java

@@ -17,7 +17,7 @@ import org.eclipse.gmf.runtime.diagram.ui.editparts.IDiagramPreferenceSupport;
 import org.eclipse.gmf.runtime.diagram.ui.editpolicies.DragDropEditPolicy;
 import org.eclipse.gmf.runtime.diagram.ui.editpolicies.DragDropEditPolicy;
 import org.eclipse.gmf.runtime.diagram.ui.editpolicies.EditPolicyRoles;
 import org.eclipse.gmf.runtime.diagram.ui.editpolicies.EditPolicyRoles;
 import org.eclipse.gmf.runtime.notation.View;
 import org.eclipse.gmf.runtime.notation.View;
-import org.yakindu.sct.ui.editor.policies.StatechartCanonicalEditPolicy;
+import org.yakindu.sct.ui.editor.policies.CompositeElementCanonicalEditPolicy;
 
 
 import de.itemis.gmf.runtime.commons.editparts.FixedXYLayoutEditPolicy;
 import de.itemis.gmf.runtime.commons.editparts.FixedXYLayoutEditPolicy;
 
 
@@ -38,7 +38,7 @@ public class StatechartDiagramEditPart extends DiagramEditPart implements
 	@Override
 	@Override
 	protected void createDefaultEditPolicies() {
 	protected void createDefaultEditPolicies() {
 		installEditPolicy(EditPolicyRoles.CANONICAL_ROLE,
 		installEditPolicy(EditPolicyRoles.CANONICAL_ROLE,
-				new StatechartCanonicalEditPolicy());
+				new CompositeElementCanonicalEditPolicy());
 		super.createDefaultEditPolicies();
 		super.createDefaultEditPolicies();
 		installEditPolicy(EditPolicyRoles.DRAG_DROP_ROLE,
 		installEditPolicy(EditPolicyRoles.DRAG_DROP_ROLE,
 				new DragDropEditPolicy());
 				new DragDropEditPolicy());

+ 5 - 5
plugins/org.yakindu.sct.ui.editor/src/org/yakindu/sct/ui/editor/policies/StatechartCanonicalEditPolicy.java

@@ -18,8 +18,8 @@ import org.eclipse.gmf.runtime.diagram.core.util.ViewType;
 import org.eclipse.gmf.runtime.diagram.ui.editparts.IGraphicalEditPart;
 import org.eclipse.gmf.runtime.diagram.ui.editparts.IGraphicalEditPart;
 import org.eclipse.gmf.runtime.diagram.ui.editpolicies.CanonicalEditPolicy;
 import org.eclipse.gmf.runtime.diagram.ui.editpolicies.CanonicalEditPolicy;
 import org.eclipse.gmf.runtime.notation.View;
 import org.eclipse.gmf.runtime.notation.View;
+import org.yakindu.sct.model.sgraph.CompositeElement;
 import org.yakindu.sct.model.sgraph.Region;
 import org.yakindu.sct.model.sgraph.Region;
-import org.yakindu.sct.model.sgraph.Statechart;
 import org.yakindu.sct.ui.editor.providers.SemanticHints;
 import org.yakindu.sct.ui.editor.providers.SemanticHints;
 import org.yakindu.sct.ui.editor.utils.SemanticHintUtil;
 import org.yakindu.sct.ui.editor.utils.SemanticHintUtil;
 
 
@@ -28,7 +28,7 @@ import org.yakindu.sct.ui.editor.utils.SemanticHintUtil;
  * @author andreas muelder
  * @author andreas muelder
  * 
  * 
  */
  */
-public class StatechartCanonicalEditPolicy extends CanonicalEditPolicy {
+public class CompositeElementCanonicalEditPolicy extends CanonicalEditPolicy {
 
 
 	@Override
 	@Override
 	protected List<Region> getSemanticChildrenList() {
 	protected List<Region> getSemanticChildrenList() {
@@ -36,15 +36,15 @@ public class StatechartCanonicalEditPolicy extends CanonicalEditPolicy {
 	}
 	}
 
 
 	@Override
 	@Override
-	public Statechart getSemanticHost() {
-		return (Statechart) super.getSemanticHost();
+	public CompositeElement getSemanticHost() {
+		return (CompositeElement) super.getSemanticHost();
 	}
 	}
 
 
 	@Override
 	@Override
 	public IGraphicalEditPart getHost() {
 	public IGraphicalEditPart getHost() {
 		return (IGraphicalEditPart) super.getHost();
 		return (IGraphicalEditPart) super.getHost();
 	}
 	}
-	
+
 	@Override
 	@Override
 	protected String getFactoryHint(IAdaptable elementAdapter) {
 	protected String getFactoryHint(IAdaptable elementAdapter) {
 		EObject modelElement = (EObject) elementAdapter
 		EObject modelElement = (EObject) elementAdapter

+ 14 - 1
plugins/org.yakindu.sct.ui.editor/src/org/yakindu/sct/ui/editor/policies/StateCompartmentCanonicalEditPolicy.java

@@ -10,6 +10,7 @@
  */
  */
 package org.yakindu.sct.ui.editor.policies;
 package org.yakindu.sct.ui.editor.policies;
 
 
+import java.util.Collections;
 import java.util.List;
 import java.util.List;
 
 
 import org.eclipse.core.runtime.IAdaptable;
 import org.eclipse.core.runtime.IAdaptable;
@@ -17,8 +18,11 @@ import org.eclipse.emf.ecore.EObject;
 import org.eclipse.gmf.runtime.diagram.core.util.ViewType;
 import org.eclipse.gmf.runtime.diagram.core.util.ViewType;
 import org.eclipse.gmf.runtime.diagram.ui.editparts.IGraphicalEditPart;
 import org.eclipse.gmf.runtime.diagram.ui.editparts.IGraphicalEditPart;
 import org.eclipse.gmf.runtime.diagram.ui.editpolicies.CanonicalEditPolicy;
 import org.eclipse.gmf.runtime.diagram.ui.editpolicies.CanonicalEditPolicy;
+import org.eclipse.gmf.runtime.notation.BooleanValueStyle;
 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.editparts.StateEditPart;
+import org.yakindu.sct.ui.editor.utils.GMFNotationUtil;
 import org.yakindu.sct.ui.editor.utils.SemanticHintUtil;
 import org.yakindu.sct.ui.editor.utils.SemanticHintUtil;
 
 
 /**
 /**
@@ -26,10 +30,19 @@ import org.yakindu.sct.ui.editor.utils.SemanticHintUtil;
  */
  */
 public class StateCompartmentCanonicalEditPolicy extends CanonicalEditPolicy {
 public class StateCompartmentCanonicalEditPolicy extends CanonicalEditPolicy {
 
 
+	// TODO: Move to common class
+	private static final String INLINE_STYLE = "isInline";
+
 	@SuppressWarnings("rawtypes")
 	@SuppressWarnings("rawtypes")
 	@Override
 	@Override
 	protected List getSemanticChildrenList() {
 	protected List getSemanticChildrenList() {
-		return getSemanticHost().getRegions();
+		StateEditPart parent = (StateEditPart) getHost().getParent();
+		BooleanValueStyle isInline = GMFNotationUtil.getBooleanValueStyle(
+				parent.getNotationView(), INLINE_STYLE);
+		if (isInline == null || isInline.isBooleanValue())
+			return getSemanticHost().getRegions();
+		return Collections.EMPTY_LIST;
+
 	}
 	}
 
 
 	@Override
 	@Override

+ 62 - 0
plugins/org.yakindu.sct.ui.editor/src/org/yakindu/sct/ui/editor/providers/DiagramPartitioningDocumentProvider.java

@@ -0,0 +1,62 @@
+/**
+ * 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.providers;
+
+import org.eclipse.core.runtime.CoreException;
+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.DiagramEditorInput;
+import org.eclipse.gmf.runtime.diagram.ui.resources.editor.document.IDiagramDocument;
+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.notation.Diagram;
+import org.eclipse.ui.IEditorInput;
+import org.eclipse.ui.part.FileEditorInput;
+
+/**
+ * 
+ * @author andreas muelder - Initial contribution and API
+ * 
+ */
+public class DiagramPartitioningDocumentProvider extends
+		FileDiagramDocumentProvider {
+
+	private Diagram diagram;
+
+	@Override
+	public IEditorInput createInputWithEditingDomain(IEditorInput editorInput,
+			TransactionalEditingDomain domain) {
+		if (editorInput instanceof DiagramEditorInput) {
+			diagram = ((DiagramEditorInput) editorInput).getDiagram();
+			return super
+					.createInputWithEditingDomain(
+							new FileEditorInput(WorkspaceSynchronizer
+									.getFile(diagram.eResource())), domain);
+		}
+		return super.createInputWithEditingDomain(editorInput, domain);
+	}
+
+	@Override
+	protected boolean setDocumentContent(IDocument document,
+			IEditorInput editorInput) throws CoreException {
+		if (diagram != null) {
+			TransactionalEditingDomain editingDomain = TransactionUtil
+					.getEditingDomain(diagram);
+			((IDiagramDocument) document).setEditingDomain(editingDomain);
+			document.setContent(diagram);
+			return true;
+		}
+		return super.setDocumentContent(document, editorInput);
+	}
+
+
+}

+ 0 - 12
plugins/org.yakindu.sct.ui.editor/src/org/yakindu/sct/ui/editor/submachine/SubStateDecorator.java

@@ -62,18 +62,6 @@ public abstract class SubStateDecorator extends InteractiveDecorator {
 		return null;
 		return null;
 	}
 	}
 	
 	
-	
-//	protected abstract void mouseClicked(Decoration decoration, State semanticElement);
-//	
-//
-//	@Override
-//	protected void mousePressed(Decoration decoration, EObject element) {
-//		if (element instanceof State) {
-//			mouseClicked(decoration, (State) element);
-//		}
-//	}
-
-	
 	protected Image renderImage(Diagram diagram) {
 	protected Image renderImage(Diagram diagram) {
 		Assert.isNotNull(diagram);
 		Assert.isNotNull(diagram);
 		Image renderImage = DiagramRenderUtil.renderToSWTImage(diagram);
 		Image renderImage = DiagramRenderUtil.renderToSWTImage(diagram);

+ 54 - 22
plugins/org.yakindu.sct.ui.editor/src/org/yakindu/sct/ui/editor/submachine/SubmachineDecorationProvider.java

@@ -10,21 +10,32 @@
  */
  */
 package org.yakindu.sct.ui.editor.submachine;
 package org.yakindu.sct.ui.editor.submachine;
 
 
-import org.eclipse.emf.common.util.EList;
+import java.util.Collection;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.emf.common.util.URI;
 import org.eclipse.emf.ecore.EObject;
 import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.emf.ecore.util.EcoreUtil;
+import org.eclipse.gmf.runtime.diagram.ui.editparts.IGraphicalEditPart;
+import org.eclipse.gmf.runtime.diagram.ui.parts.DiagramEditorInput;
 import org.eclipse.gmf.runtime.diagram.ui.services.decorator.Decoration;
 import org.eclipse.gmf.runtime.diagram.ui.services.decorator.Decoration;
 import org.eclipse.gmf.runtime.diagram.ui.services.decorator.IDecoratorProvider;
 import org.eclipse.gmf.runtime.diagram.ui.services.decorator.IDecoratorProvider;
 import org.eclipse.gmf.runtime.diagram.ui.services.decorator.IDecoratorTarget;
 import org.eclipse.gmf.runtime.diagram.ui.services.decorator.IDecoratorTarget;
 import org.eclipse.gmf.runtime.diagram.ui.services.decorator.IDecoratorTarget.Direction;
 import org.eclipse.gmf.runtime.diagram.ui.services.decorator.IDecoratorTarget.Direction;
+import org.eclipse.gmf.runtime.notation.BooleanValueStyle;
 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.swt.graphics.Image;
 import org.eclipse.swt.graphics.Image;
+import org.eclipse.ui.IEditorDescriptor;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.PartInitException;
+import org.eclipse.ui.PlatformUI;
 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.model.sgraph.Statechart;
 import org.yakindu.sct.ui.editor.StatechartImages;
 import org.yakindu.sct.ui.editor.StatechartImages;
-import org.yakindu.sct.ui.editor.utils.InteractionUtil;
+import org.yakindu.sct.ui.editor.utils.GMFNotationUtil;
 
 
 import de.itemis.gmf.runtime.commons.decorators.AbstractDecoratorProvider;
 import de.itemis.gmf.runtime.commons.decorators.AbstractDecoratorProvider;
 
 
@@ -39,6 +50,9 @@ public class SubmachineDecorationProvider extends AbstractDecoratorProvider
 	private static final String DECORATOR_KEY = SubmachineDecorator.class
 	private static final String DECORATOR_KEY = SubmachineDecorator.class
 			.getSimpleName();
 			.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)
@@ -54,7 +68,11 @@ public class SubmachineDecorationProvider extends AbstractDecoratorProvider
 
 
 		@Override
 		@Override
 		protected boolean shouldDecorate(State state) {
 		protected boolean shouldDecorate(State state) {
-			return state.getSubstatechart() != null;
+			IGraphicalEditPart adapter = (IGraphicalEditPart) getDecoratorTarget()
+					.getAdapter(IGraphicalEditPart.class);
+			BooleanValueStyle style = GMFNotationUtil.getBooleanValueStyle(
+					adapter.getNotationView(), INLINE_STYLE);
+			return style == null ? false : !style.isBooleanValue();
 		}
 		}
 
 
 		@Override
 		@Override
@@ -64,25 +82,40 @@ public class SubmachineDecorationProvider extends AbstractDecoratorProvider
 
 
 		@Override
 		@Override
 		protected Diagram getTooltipDiagramToRender(State state) {
 		protected Diagram getTooltipDiagramToRender(State state) {
-			Statechart substatechart = state.getSubstatechart();
-			if (substatechart == null) {
-				return null;
-			}
-			Resource eResource = substatechart.eResource();
-			if (eResource == null) {
-				return null;
-			}
-			EList<EObject> contents = eResource.getContents();
-			if (contents == null) {
-				return null;
-			}
-			return (Diagram) EcoreUtil2.getObjectByType(contents,
+			return getDiagramForSemanticElement(state);
+		}
+
+		private Diagram getDiagramForSemanticElement(EObject state) {
+			Collection<Diagram> diagrams = EcoreUtil2.getObjectsByType(state
+					.eResource().getContents(),
 					NotationPackage.Literals.DIAGRAM);
 					NotationPackage.Literals.DIAGRAM);
+			for (Diagram diagram : diagrams) {
+				if (EcoreUtil.equals(diagram.getElement(), state)) {
+					return diagram;
+				}
+			}
+			return null;
 		}
 		}
 
 
 		@Override
 		@Override
-		protected void mousePressed(Decoration decoration, EObject semanticElement) {
-			InteractionUtil.openElement(((State)semanticElement).getSubstatechart());
+		protected void mousePressed(Decoration decoration,
+				EObject semanticElement) {
+			Diagram diagramToOpen = getDiagramForSemanticElement(semanticElement);
+			URI uri = EcoreUtil.getURI(diagramToOpen);
+			IFile file = ResourcesPlugin.getWorkspace().getRoot()
+					.getFile(new Path(uri.toPlatformString(true)));
+			try {
+				IEditorDescriptor desc = PlatformUI.getWorkbench()
+						.getEditorRegistry().getDefaultEditor(file.getName());
+
+				final IWorkbenchPage wbPage = PlatformUI.getWorkbench()
+						.getActiveWorkbenchWindow().getActivePage();
+				wbPage.openEditor(new DiagramEditorInput(diagramToOpen),
+						desc.getId());
+			} catch (PartInitException e) {
+				e.printStackTrace();
+			}
+
 		}
 		}
 
 
 		@Override
 		@Override
@@ -90,9 +123,8 @@ public class SubmachineDecorationProvider extends AbstractDecoratorProvider
 			return IDecoratorTarget.Direction.SOUTH_EAST;
 			return IDecoratorTarget.Direction.SOUTH_EAST;
 		}
 		}
 
 
-		
 		State asState(EObject o) {
 		State asState(EObject o) {
-			return (o instanceof State) ? (State)o : null;
+			return (o instanceof State) ? (State) o : null;
 		}
 		}
 
 
 	}
 	}