瀏覽代碼

Merge pull request #938 from Yakindu/issue_936

Issue 936
Andreas Mülder 9 年之前
父節點
當前提交
91e5451e80
共有 16 個文件被更改,包括 315 次插入26 次删除
  1. 10 0
      plugins/org.yakindu.sct.domain/schema/domain.exsd
  2. 36 3
      plugins/org.yakindu.sct.domain/src/org/yakindu/sct/domain/extension/DomainRegistry.java
  3. 45 0
      plugins/org.yakindu.sct.domain/src/org/yakindu/sct/domain/extension/DomainStatus.java
  4. 2 0
      plugins/org.yakindu.sct.domain/src/org/yakindu/sct/domain/extension/IDomain.java
  5. 29 0
      plugins/org.yakindu.sct.domain/src/org/yakindu/sct/domain/extension/IDomainStatusProvider.java
  6. 14 1
      plugins/org.yakindu.sct.domain/src/org/yakindu/sct/domain/extension/impl/DomainImpl.java
  7. 2 1
      plugins/org.yakindu.sct.model.sgraph/META-INF/MANIFEST.MF
  8. 59 0
      plugins/org.yakindu.sct.model.sgraph/src/org/yakindu/sct/model/sgraph/validation/DomainValidator.java
  9. 1 0
      plugins/org.yakindu.sct.model.sgraph/src/org/yakindu/sct/model/sgraph/validation/SGraphJavaValidator.java
  10. 1 1
      plugins/org.yakindu.sct.ui.editor/plugin.xml
  11. 4 0
      plugins/org.yakindu.sct.ui.editor/src/org/yakindu/sct/ui/editor/DiagramActivator.java
  12. 48 0
      plugins/org.yakindu.sct.ui.editor/src/org/yakindu/sct/ui/editor/editor/StatechartDiagramEditor.java
  13. 36 0
      plugins/org.yakindu.sct.ui.editor/src/org/yakindu/sct/ui/editor/editparts/SCTRenderedDiagramRootEditPart.java
  14. 1 1
      plugins/org.yakindu.sct.ui.editor/src/org/yakindu/sct/ui/editor/editparts/StatechartDiagramEditPart.java
  15. 1 1
      plugins/org.yakindu.sct.ui.editor/src/org/yakindu/sct/ui/editor/partitioning/DiagramPartitioningEditor.java
  16. 26 18
      plugins/org.yakindu.sct.ui.editor/src/org/yakindu/sct/ui/editor/providers/StatechartDiagramEditPartProvider.java

+ 10 - 0
plugins/org.yakindu.sct.domain/schema/domain.exsd

@@ -80,6 +80,16 @@
                </documentation>
             </annotation>
          </attribute>
+         <attribute name="domainStatusProvider" type="string">
+            <annotation>
+               <documentation>
+                  
+               </documentation>
+               <appinfo>
+                  <meta.attribute kind="java" basedOn=":org.yakindu.sct.domain.extension.IDomainStatusProvider"/>
+               </appinfo>
+            </annotation>
+         </attribute>
       </complexType>
    </element>
 

+ 36 - 3
plugins/org.yakindu.sct.domain/src/org/yakindu/sct/domain/extension/DomainRegistry.java

@@ -30,6 +30,7 @@ import org.eclipse.xtext.EcoreUtil2;
 import org.osgi.framework.Bundle;
 import org.yakindu.base.base.BasePackage;
 import org.yakindu.base.base.DomainElement;
+import org.yakindu.sct.domain.extension.DomainStatus.Severity;
 import org.yakindu.sct.domain.extension.impl.DomainImpl;
 import org.yakindu.sct.domain.extension.impl.ModuleContribution;
 
@@ -50,6 +51,7 @@ public class DomainRegistry {
 	private static final String DESCRIPTION = "description";
 	private static final String IMAGE = "image";
 	private static final String NAME = "name";
+	private static final String DOMAIN_STATUS_PROVIDER = "domainStatusProvider";
 
 	private static final String FEATURE = "feature";
 	private static final String MODULE_PROVIDER = "moduleProvider";
@@ -82,7 +84,6 @@ public class DomainRegistry {
 			if (defaultDomainID.equals(id)) {
 				throw new IllegalArgumentException("No default domain found!");
 			}
-			System.err.println("Could not find domain descriptor for id " + id + " - > using default domain");
 			return getDomain(defaultDomainID);
 		}
 	}
@@ -94,6 +95,21 @@ public class DomainRegistry {
 		return getDomain(domainID);
 	}
 
+	public static boolean domainExists(final String domainID) {
+		try {
+			Iterables.find(getDomains(), new Predicate<IDomain>() {
+				@Override
+				public boolean apply(IDomain input) {
+					return input.getDomainID().equals(domainID == null || domainID.isEmpty()
+							? BasePackage.Literals.DOMAIN_ELEMENT__DOMAIN_ID.getDefaultValueLiteral() : domainID);
+				}
+			});
+		} catch (NoSuchElementException e) {
+			return false;
+		}
+		return true;
+	}
+
 	public static String determineDomainID(URI uri) {
 		String result = BasePackage.Literals.DOMAIN_ELEMENT__DOMAIN_ID.getDefaultValueLiteral();
 		if (URIConverter.INSTANCE.exists(uri, null)) {
@@ -114,6 +130,16 @@ public class DomainRegistry {
 		return result;
 	}
 
+	public static DomainStatus getDomainStatus(String domainID) {
+		if (!DomainRegistry.domainExists(domainID)) {
+			return new DomainStatus(Severity.ERROR,
+					String.format(String.format("Domain '%s' is not available.", domainID)));
+		} else {
+			IDomain domain = DomainRegistry.getDomain(domainID);
+			return domain.getAvailabilityStatus();
+		}
+	}
+
 	protected static void initFromExtensions() {
 		List<ModuleContribution> moduleDescriptors = new ArrayList<>();
 		IConfigurationElement[] configurationElements = Platform.getExtensionRegistry()
@@ -145,6 +171,14 @@ public class DomainRegistry {
 			Bundle extensionBundle = Platform.getBundle(element.getContributor().getName());
 			image = extensionBundle.getEntry(path);
 		}
+		IDomainStatusProvider provider = new IDomainStatusProvider.DefaultDomainStatusProvider();
+		if (element.getAttribute(DOMAIN_STATUS_PROVIDER) != null) {
+			try {
+				provider = (IDomainStatusProvider) element.createExecutableExtension(DOMAIN_STATUS_PROVIDER);
+			} catch (CoreException e) {
+				e.printStackTrace();
+			}
+		}
 		return new DomainImpl(element.getAttribute(DOMAIN_ID), element.getAttribute(NAME),
 				element.getAttribute(DESCRIPTION), image,
 				Iterables.filter(allModules, new Predicate<ModuleContribution>() {
@@ -152,7 +186,6 @@ public class DomainRegistry {
 					public boolean apply(ModuleContribution input) {
 						return input.getDomainID().equals(element.getAttribute(DOMAIN_ID));
 					}
-				}));
+				}), provider);
 	}
-
 }

+ 45 - 0
plugins/org.yakindu.sct.domain/src/org/yakindu/sct/domain/extension/DomainStatus.java

@@ -0,0 +1,45 @@
+/**
+ * Copyright (c) 2016 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.domain.extension;
+
+/**
+ * @author andreas muelder - Initial contribution and API
+ * 
+ */
+public class DomainStatus {
+
+	public static final DomainStatus OK = new DomainStatus(Severity.OK);
+
+	public static enum Severity {
+		OK, ERROR
+	}
+
+	private Severity status;
+	private String message;
+
+	public DomainStatus(Severity status, String message) {
+		this.status = status;
+		this.message = message;
+	}
+
+	public DomainStatus(Severity status) {
+		this.status = status;
+	}
+
+	public Severity getSeverity() {
+		return status;
+	}
+
+	public String getMessage() {
+		return message;
+	}
+
+}

+ 2 - 0
plugins/org.yakindu.sct.domain/src/org/yakindu/sct/domain/extension/IDomain.java

@@ -41,4 +41,6 @@ public interface IDomain {
 
 	URL getImagePath();
 
+	DomainStatus getAvailabilityStatus();
+
 }

+ 29 - 0
plugins/org.yakindu.sct.domain/src/org/yakindu/sct/domain/extension/IDomainStatusProvider.java

@@ -0,0 +1,29 @@
+/**
+ * Copyright (c) 2016 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.domain.extension;
+
+/**
+ * @author andreas muelder - Initial contribution and API
+ * 
+ */
+public interface IDomainStatusProvider {
+
+	public DomainStatus getDomainStatus();
+
+	public class DefaultDomainStatusProvider implements IDomainStatusProvider {
+
+		@Override
+		public DomainStatus getDomainStatus() {
+			return DomainStatus.OK;
+		}
+
+	}
+}

+ 14 - 1
plugins/org.yakindu.sct.domain/src/org/yakindu/sct/domain/extension/impl/DomainImpl.java

@@ -16,7 +16,9 @@ import java.util.Arrays;
 import java.util.List;
 import java.util.concurrent.ExecutionException;
 
+import org.yakindu.sct.domain.extension.DomainStatus;
 import org.yakindu.sct.domain.extension.IDomain;
+import org.yakindu.sct.domain.extension.IDomainStatusProvider;
 
 import com.google.common.cache.CacheBuilder;
 import com.google.common.cache.CacheLoader;
@@ -36,6 +38,7 @@ public class DomainImpl implements IDomain {
 	private String name;
 	private String description;
 	private URL imagePath;
+	private IDomainStatusProvider statusProvider;
 	private Iterable<ModuleContribution> modules;
 	private LoadingCache<CacheKey, Injector> injectorCache;
 
@@ -88,13 +91,18 @@ public class DomainImpl implements IDomain {
 
 	public DomainImpl(String domainID, String name, String description, URL imagePath,
 			Iterable<ModuleContribution> modules) {
+		this(domainID, name, description, imagePath, modules, new IDomainStatusProvider.DefaultDomainStatusProvider());
+	}
+
+	public DomainImpl(String domainID, String name, String description, URL imagePath,
+			Iterable<ModuleContribution> modules, IDomainStatusProvider provider) {
 		this.domainID = domainID;
 		this.name = name;
 		this.description = description;
 		this.imagePath = imagePath;
 		this.modules = modules;
+		this.statusProvider = provider;
 		initializeCache();
-
 	}
 
 	protected void initializeCache() {
@@ -154,4 +162,9 @@ public class DomainImpl implements IDomain {
 
 	}
 
+	@Override
+	public DomainStatus getAvailabilityStatus() {
+		return statusProvider.getDomainStatus();
+	}
+
 }

+ 2 - 1
plugins/org.yakindu.sct.model.sgraph/META-INF/MANIFEST.MF

@@ -17,5 +17,6 @@ Require-Bundle: org.eclipse.core.runtime,
  org.eclipse.emf.ecore;visibility:=reexport,
  org.eclipse.emf.ecore.xmi,
  org.eclipse.xtext,
- org.yakindu.base.types;visibility:=reexport
+ org.yakindu.base.types;visibility:=reexport,
+ org.yakindu.sct.domain
 Bundle-ActivationPolicy: lazy

+ 59 - 0
plugins/org.yakindu.sct.model.sgraph/src/org/yakindu/sct/model/sgraph/validation/DomainValidator.java

@@ -0,0 +1,59 @@
+/**
+ * Copyright (c) 2016 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.model.sgraph.validation;
+
+import java.util.Map;
+
+import org.eclipse.emf.common.util.BasicDiagnostic;
+import org.eclipse.emf.common.util.Diagnostic;
+import org.eclipse.emf.common.util.DiagnosticChain;
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.EDataType;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.EValidator;
+import org.yakindu.base.base.DomainElement;
+import org.yakindu.sct.domain.extension.DomainRegistry;
+import org.yakindu.sct.domain.extension.DomainStatus;
+import org.yakindu.sct.domain.extension.DomainStatus.Severity;
+
+/**
+ * @author andreas muelder - Initial contribution and API
+ * 
+ */
+public class DomainValidator implements EValidator {
+
+	public static final String MSG_DOMAIN_UNAVAILABLE = "Domain '%s' not found!";
+	public static final String CODE_DOMAIN_UNAVAILABLE = "DomainUnavailable";
+
+	@Override
+	public boolean validate(EObject eObject, DiagnosticChain diagnostics, Map<Object, Object> context) {
+		return false;
+	}
+
+	@Override
+	public boolean validate(EClass eClass, EObject eObject, DiagnosticChain diagnostics, Map<Object, Object> context) {
+		if (eObject instanceof DomainElement) {
+			DomainStatus status = DomainRegistry.getDomainStatus(((DomainElement) eObject).getDomainID());
+			if (status.getSeverity() != Severity.OK) {
+				diagnostics.add(new BasicDiagnostic(Diagnostic.ERROR, "DomainValidator", 0, status.getMessage(),
+						new Object[] { eObject }));
+			}
+		}
+		return true;
+	}
+
+	@Override
+	public boolean validate(EDataType eDataType, Object value, DiagnosticChain diagnostics,
+			Map<Object, Object> context) {
+		return false;
+	}
+
+}

+ 1 - 0
plugins/org.yakindu.sct.model.sgraph/src/org/yakindu/sct/model/sgraph/validation/SGraphJavaValidator.java

@@ -85,6 +85,7 @@ public class SGraphJavaValidator extends AbstractDeclarativeValidator {
 	public static final String ISSUE_INITIAL_ENTRY_WITH_TRANSITION_TO_CONTAINER = "Outgoing Transitions from Entries can only target to sibling or inner states.";
 	public static final String ISSUE_STATECHART_NAME_NO_IDENTIFIER = "%s is not a valid identifier!";
 
+	
 	@Check(CheckType.FAST)
 	public void vertexNotReachable(final Vertex vertex) {
 		if (!(vertex instanceof Entry)) {

+ 1 - 1
plugins/org.yakindu.sct.ui.editor/plugin.xml

@@ -239,7 +239,7 @@
       <editpartProvider
             class="org.yakindu.sct.ui.editor.providers.StatechartDiagramEditPartProvider">
          <Priority
-               name="Lowest">
+               name="Medium">
          </Priority>
       </editpartProvider>
    </extension>

+ 4 - 0
plugins/org.yakindu.sct.ui.editor/src/org/yakindu/sct/ui/editor/DiagramActivator.java

@@ -10,9 +10,12 @@
  */
 package org.yakindu.sct.ui.editor;
 
+import org.eclipse.emf.ecore.EValidator;
 import org.eclipse.gmf.runtime.diagram.core.preferences.PreferencesHint;
 import org.eclipse.ui.plugin.AbstractUIPlugin;
 import org.osgi.framework.BundleContext;
+import org.yakindu.sct.model.sgraph.SGraphPackage;
+import org.yakindu.sct.model.sgraph.validation.DomainValidator;
 
 /**
  * 
@@ -37,6 +40,7 @@ public class DiagramActivator extends AbstractUIPlugin {
 		super.start(context);
 		plugin = this;
 		PreferencesHint.registerPreferenceStore(DIAGRAM_PREFERENCES_HINT, getPreferenceStore());
+		EValidator.Registry.INSTANCE.put(SGraphPackage.eINSTANCE, new DomainValidator());
 	}
 
 	@Override

+ 48 - 0
plugins/org.yakindu.sct.ui.editor/src/org/yakindu/sct/ui/editor/editor/StatechartDiagramEditor.java

@@ -16,6 +16,7 @@ import org.eclipse.core.resources.IProject;
 import org.eclipse.core.resources.IProjectDescription;
 import org.eclipse.core.runtime.CoreException;
 import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.draw2d.ColorConstants;
 import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.EObject;
@@ -34,19 +35,27 @@ import org.eclipse.gmf.runtime.diagram.core.preferences.PreferencesHint;
 import org.eclipse.gmf.runtime.diagram.ui.internal.parts.DiagramGraphicalViewerKeyHandler;
 import org.eclipse.gmf.runtime.gef.ui.internal.editparts.AnimatableZoomManager;
 import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.layout.GridDataFactory;
 import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.CLabel;
+import org.eclipse.swt.graphics.Font;
+import org.eclipse.swt.graphics.FontData;
 import org.eclipse.swt.widgets.Composite;
 import org.eclipse.ui.IEditorInput;
 import org.eclipse.ui.IEditorSite;
 import org.eclipse.ui.IFileEditorInput;
+import org.eclipse.ui.ISharedImages;
 import org.eclipse.ui.PartInitException;
 import org.eclipse.ui.PlatformUI;
 import org.eclipse.ui.help.IWorkbenchHelpSystem;
 import org.eclipse.ui.ide.IGotoMarker;
 import org.eclipse.ui.views.contentoutline.IContentOutlinePage;
 import org.eclipse.xtext.ui.XtextProjectHelper;
+import org.yakindu.base.base.DomainElement;
 import org.yakindu.base.xtext.utils.gmf.resource.DirtyStateListener;
 import org.yakindu.sct.domain.extension.DomainRegistry;
+import org.yakindu.sct.domain.extension.DomainStatus;
+import org.yakindu.sct.domain.extension.DomainStatus.Severity;
 import org.yakindu.sct.domain.extension.IDomain;
 import org.yakindu.sct.model.sgraph.SGraphPackage;
 import org.yakindu.sct.ui.editor.DiagramActivator;
@@ -68,6 +77,7 @@ import com.google.inject.Key;
 @SuppressWarnings("restriction")
 public class StatechartDiagramEditor extends DiagramPartitioningEditor implements IGotoMarker {
 
+	private static final Font INVALID_DOMAIN_FONT = new Font(null, new FontData("Verdana", 10, SWT.BOLD));
 	public static final String ID = "org.yakindu.sct.ui.editor.editor.StatechartDiagramEditor";
 	private static final int DELAY = 200; // ms
 
@@ -113,6 +123,44 @@ public class StatechartDiagramEditor extends DiagramPartitioningEditor implement
 		super(true);
 	}
 
+	public boolean isEditable() {
+		DomainStatus domainStatus = getDomainStatus();
+		if (domainStatus.getSeverity() == Severity.ERROR) {
+			return false;
+		}
+		return super.isEditable();
+	}
+
+	protected DomainStatus getDomainStatus() {
+		EObject element = getDiagram().getElement();
+		if (element instanceof DomainElement) {
+			DomainStatus domainStatus = DomainRegistry.getDomainStatus(((DomainElement) element).getDomainID());
+			return domainStatus;
+		}
+		return null;
+	};
+
+	@Override
+	protected void createBreadcrumbViewer(Composite parent) {
+		DomainStatus domainStatus = getDomainStatus();
+		if (domainStatus.getSeverity() == Severity.ERROR) {
+			createStatusLabel(parent, domainStatus);
+			return;
+		}
+		super.createBreadcrumbViewer(parent);
+	}
+
+	private void createStatusLabel(Composite parent, DomainStatus domainStatus) {
+		CLabel label = new CLabel(parent, SWT.SHADOW_OUT);
+		label.setFont(INVALID_DOMAIN_FONT);
+		label.setBackground(ColorConstants.white);
+		label.setForeground(ColorConstants.red);
+		label.setImage(PlatformUI.getWorkbench().getSharedImages().getImage(ISharedImages.IMG_OBJS_ERROR_TSK));
+		label.setText(domainStatus.getMessage() + " - editor is in readonly mode.");
+		GridDataFactory.fillDefaults().grab(true, false).applyTo(label);
+		parent.pack(true);
+	}
+
 	@Override
 	public Object getAdapter(@SuppressWarnings("rawtypes") Class type) {
 		if (IContentOutlinePage.class.equals(type)) {

+ 36 - 0
plugins/org.yakindu.sct.ui.editor/src/org/yakindu/sct/ui/editor/editparts/SCTRenderedDiagramRootEditPart.java

@@ -0,0 +1,36 @@
+/**
+ * Copyright (c) 2016 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.editparts;
+
+import org.eclipse.draw2d.FreeformLayer;
+import org.eclipse.draw2d.LayeredPane;
+import org.eclipse.gmf.runtime.diagram.ui.render.editparts.RenderedDiagramRootEditPart;
+import org.eclipse.gmf.runtime.notation.MeasurementUnit;
+
+/**
+ * 
+ * @author andreas muelder - Initial contribution and API
+ * 
+ */
+public class SCTRenderedDiagramRootEditPart extends RenderedDiagramRootEditPart {
+
+	public static final String WATERMARK_LAYER = "Watermark Layer";
+
+	public SCTRenderedDiagramRootEditPart(MeasurementUnit mu) {
+		super(mu);
+	}
+
+	@Override
+	protected void createLayers(LayeredPane layeredPane) {
+		super.createLayers(layeredPane);
+		layeredPane.add(new FreeformLayer(), WATERMARK_LAYER);
+	}
+}

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

@@ -1,5 +1,5 @@
 /**
- * Copyright (c) 2010 committers of YAKINDU and others.
+ * Copyright (c) 2010-2016 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

+ 1 - 1
plugins/org.yakindu.sct.ui.editor/src/org/yakindu/sct/ui/editor/partitioning/DiagramPartitioningEditor.java

@@ -133,7 +133,7 @@ public abstract class DiagramPartitioningEditor extends DiagramDocumentEditor im
 		getSite().registerContextMenu(ActionIds.DIAGRAM_EDITOR_CONTEXT_MENU, provider, viewer);
 	}
 
-	private void createBreadcrumbViewer(Composite parent) {
+	protected void createBreadcrumbViewer(Composite parent) {
 		viewer = new DiagramPartitioningBreadcrumbViewer(parent, SWT.READ_ONLY);
 		viewer.addSelectionChangedListener(this);
 		viewer.setContentProvider(new BreadcrumbViewerContentProvider());

+ 26 - 18
plugins/org.yakindu.sct.ui.editor/src/org/yakindu/sct/ui/editor/providers/StatechartDiagramEditPartProvider.java

@@ -13,8 +13,12 @@ package org.yakindu.sct.ui.editor.providers;
 import java.util.HashMap;
 import java.util.Map;
 
+import org.eclipse.gef.RootEditPart;
+import org.eclipse.gmf.runtime.common.core.service.IOperation;
 import org.eclipse.gmf.runtime.diagram.ui.editparts.IGraphicalEditPart;
 import org.eclipse.gmf.runtime.diagram.ui.services.editpart.AbstractEditPartProvider;
+import org.eclipse.gmf.runtime.diagram.ui.services.editpart.CreateRootEditPartOperation;
+import org.eclipse.gmf.runtime.notation.Diagram;
 import org.eclipse.gmf.runtime.notation.View;
 import org.yakindu.sct.ui.editor.editor.StatechartDiagramEditor;
 import org.yakindu.sct.ui.editor.editparts.BorderItemEditPart;
@@ -26,6 +30,7 @@ import org.yakindu.sct.ui.editor.editparts.NamedElementLabelEditPart;
 import org.yakindu.sct.ui.editor.editparts.RegionCompartmentEditPart;
 import org.yakindu.sct.ui.editor.editparts.RegionEditPart;
 import org.yakindu.sct.ui.editor.editparts.RegionNameEditPart;
+import org.yakindu.sct.ui.editor.editparts.SCTRenderedDiagramRootEditPart;
 import org.yakindu.sct.ui.editor.editparts.StateEditPart;
 import org.yakindu.sct.ui.editor.editparts.StateFigureCompartmentEditPart;
 import org.yakindu.sct.ui.editor.editparts.StateNameEditPart;
@@ -44,8 +49,7 @@ import org.yakindu.sct.ui.editor.editparts.TransitionExpressionEditPart;
  * @author andreas muelder - Initial contribution and API
  * 
  */
-public class StatechartDiagramEditPartProvider extends AbstractEditPartProvider
-		implements SemanticHints {
+public class StatechartDiagramEditPartProvider extends AbstractEditPartProvider implements SemanticHints {
 
 	public static final Map<String, Class<? extends IGraphicalEditPart>> editParts;
 	static {
@@ -54,12 +58,10 @@ public class StatechartDiagramEditPartProvider extends AbstractEditPartProvider
 	}
 
 	private static void init() {
-		editParts.put(StatechartDiagramEditor.ID,
-				StatechartDiagramEditPart.class);
+		editParts.put(StatechartDiagramEditor.ID, StatechartDiagramEditPart.class);
 		editParts.put(STATECHART_TEXT, StatechartTextEditPart.class);
 		editParts.put(STATECHART_NAME, StatechartNameEditPart.class);
-		editParts.put(STATECHART_TEXT_EXPRESSION,
-				StatechartTextExpressionEditPart.class);
+		editParts.put(STATECHART_TEXT_EXPRESSION, StatechartTextExpressionEditPart.class);
 		editParts.put(CHOICE, ChoiceEditPart.class);
 		editParts.put(FINALSTATE, FinalStateEditPart.class);
 		editParts.put(ENTRY, EntryEditPart.class);
@@ -67,24 +69,20 @@ public class StatechartDiagramEditPartProvider extends AbstractEditPartProvider
 		editParts.put(BORDER_ITEM_LABEL_CONTAINER, BorderItemEditPart.class);
 		editParts.put(SHALLOWHISTORY, EntryEditPart.class);
 		editParts.put(DEEPHISTORY, EntryEditPart.class);
-		
+
 		editParts.put(REGION_COMPARTMENT, RegionCompartmentEditPart.class);
 		editParts.put(REGION, RegionEditPart.class);
 		editParts.put(REGION_NAME, RegionNameEditPart.class);
-		
+
 		editParts.put(STATE_NAME, StateNameEditPart.class);
-		editParts.put(STATE_TEXT_COMPARTMENT,
-				StateTextCompartmentEditPart.class);
+		editParts.put(STATE_TEXT_COMPARTMENT, StateTextCompartmentEditPart.class);
 		editParts.put(SUBMACHINE_STATE, StateEditPart.class);
 		editParts.put(SUBMACHINE_STATE_NAME, StateNameEditPart.class);
-		editParts.put(STATE_TEXT_COMPARTMENT_EXPRESSION,
-				StateTextCompartmentExpressionEditPart.class);
+		editParts.put(STATE_TEXT_COMPARTMENT_EXPRESSION, StateTextCompartmentExpressionEditPart.class);
 		editParts.put(STATE, StateEditPart.class);
-		editParts.put(STATE_FIGURE_COMPARTMENT,
-				StateFigureCompartmentEditPart.class);
+		editParts.put(STATE_FIGURE_COMPARTMENT, StateFigureCompartmentEditPart.class);
 		editParts.put(TRANSITION, TransitionEditPart.class);
-		editParts
-				.put(TRANSITION_EXPRESSION, TransitionExpressionEditPart.class);
+		editParts.put(TRANSITION_EXPRESSION, TransitionExpressionEditPart.class);
 		editParts.put(EXIT, ExitEditPart.class);
 		editParts.put(SYNCHRONIZATION, SynchronizationEditPart.class);
 
@@ -100,8 +98,7 @@ public class StatechartDiagramEditPartProvider extends AbstractEditPartProvider
 	}
 
 	@Override
-	protected Class<? extends IGraphicalEditPart> getDiagramEditPartClass(
-			View view) {
+	protected Class<? extends IGraphicalEditPart> getDiagramEditPartClass(View view) {
 		return getClass(view.getType());
 	}
 
@@ -110,4 +107,15 @@ public class StatechartDiagramEditPartProvider extends AbstractEditPartProvider
 		return getClass(view.getType());
 	}
 
+	public boolean provides(IOperation operation) {
+		if (operation instanceof CreateRootEditPartOperation) {
+			return true;
+		}
+		return super.provides(operation);
+	}
+
+	public RootEditPart createRootEditPart(Diagram diagram) {
+		return new SCTRenderedDiagramRootEditPart(diagram.getMeasurementUnit());
+	}
+
 }