Przeglądaj źródła

Add Domain Validation #936

Andreas Muelder 9 lat temu
rodzic
commit
6d48ce2cf1

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

@@ -80,6 +80,16 @@
                </documentation>
                </documentation>
             </annotation>
             </annotation>
          </attribute>
          </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>
       </complexType>
    </element>
    </element>
 
 

+ 25 - 1
plugins/org.yakindu.sct.domain/src/org/yakindu/sct/domain/extension/DomainRegistry.java

@@ -50,6 +50,7 @@ public class DomainRegistry {
 	private static final String DESCRIPTION = "description";
 	private static final String DESCRIPTION = "description";
 	private static final String IMAGE = "image";
 	private static final String IMAGE = "image";
 	private static final String NAME = "name";
 	private static final String NAME = "name";
+	private static final String DOMAIN_STATUS_PROVIDER = "domainStatusProvider";
 
 
 	private static final String FEATURE = "feature";
 	private static final String FEATURE = "feature";
 	private static final String MODULE_PROVIDER = "moduleProvider";
 	private static final String MODULE_PROVIDER = "moduleProvider";
@@ -94,6 +95,21 @@ public class DomainRegistry {
 		return getDomain(domainID);
 		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) {
 	public static String determineDomainID(URI uri) {
 		String result = BasePackage.Literals.DOMAIN_ELEMENT__DOMAIN_ID.getDefaultValueLiteral();
 		String result = BasePackage.Literals.DOMAIN_ELEMENT__DOMAIN_ID.getDefaultValueLiteral();
 		if (URIConverter.INSTANCE.exists(uri, null)) {
 		if (URIConverter.INSTANCE.exists(uri, null)) {
@@ -145,6 +161,14 @@ public class DomainRegistry {
 			Bundle extensionBundle = Platform.getBundle(element.getContributor().getName());
 			Bundle extensionBundle = Platform.getBundle(element.getContributor().getName());
 			image = extensionBundle.getEntry(path);
 			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),
 		return new DomainImpl(element.getAttribute(DOMAIN_ID), element.getAttribute(NAME),
 				element.getAttribute(DESCRIPTION), image,
 				element.getAttribute(DESCRIPTION), image,
 				Iterables.filter(allModules, new Predicate<ModuleContribution>() {
 				Iterables.filter(allModules, new Predicate<ModuleContribution>() {
@@ -152,7 +176,7 @@ public class DomainRegistry {
 					public boolean apply(ModuleContribution input) {
 					public boolean apply(ModuleContribution input) {
 						return input.getDomainID().equals(element.getAttribute(DOMAIN_ID));
 						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(Status.OK);
+
+	public static enum Status {
+		OK, ERROR
+	}
+
+	private Status status;
+	private String message;
+
+	public DomainStatus(Status status, String message) {
+		this.status = status;
+		this.message = message;
+	}
+
+	public DomainStatus(Status status) {
+		this.status = status;
+	}
+
+	public Status getStatus() {
+		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();
 	URL getImagePath();
 
 
+	DomainStatus isAvailable();
+
 }
 }

+ 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;
+		}
+
+	}
+}

+ 13 - 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.List;
 import java.util.concurrent.ExecutionException;
 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.IDomain;
+import org.yakindu.sct.domain.extension.IDomainStatusProvider;
 
 
 import com.google.common.cache.CacheBuilder;
 import com.google.common.cache.CacheBuilder;
 import com.google.common.cache.CacheLoader;
 import com.google.common.cache.CacheLoader;
@@ -36,6 +38,7 @@ public class DomainImpl implements IDomain {
 	private String name;
 	private String name;
 	private String description;
 	private String description;
 	private URL imagePath;
 	private URL imagePath;
+	private IDomainStatusProvider statusProvider;
 	private Iterable<ModuleContribution> modules;
 	private Iterable<ModuleContribution> modules;
 	private LoadingCache<CacheKey, Injector> injectorCache;
 	private LoadingCache<CacheKey, Injector> injectorCache;
 
 
@@ -88,13 +91,17 @@ public class DomainImpl implements IDomain {
 
 
 	public DomainImpl(String domainID, String name, String description, URL imagePath,
 	public DomainImpl(String domainID, String name, String description, URL imagePath,
 			Iterable<ModuleContribution> modules) {
 			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.domainID = domainID;
 		this.name = name;
 		this.name = name;
 		this.description = description;
 		this.description = description;
 		this.imagePath = imagePath;
 		this.imagePath = imagePath;
 		this.modules = modules;
 		this.modules = modules;
 		initializeCache();
 		initializeCache();
-
 	}
 	}
 
 
 	protected void initializeCache() {
 	protected void initializeCache() {
@@ -154,4 +161,9 @@ public class DomainImpl implements IDomain {
 
 
 	}
 	}
 
 
+	@Override
+	public DomainStatus isAvailable() {
+		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;visibility:=reexport,
  org.eclipse.emf.ecore.xmi,
  org.eclipse.emf.ecore.xmi,
  org.eclipse.xtext,
  org.eclipse.xtext,
- org.yakindu.base.types;visibility:=reexport
+ org.yakindu.base.types;visibility:=reexport,
+ org.yakindu.sct.domain
 Bundle-ActivationPolicy: lazy
 Bundle-ActivationPolicy: lazy

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

@@ -0,0 +1,49 @@
+/**
+ * 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 org.eclipse.xtext.validation.AbstractDeclarativeValidator;
+import org.eclipse.xtext.validation.Check;
+import org.eclipse.xtext.validation.EValidatorRegistrar;
+import org.yakindu.base.base.BasePackage;
+import org.yakindu.base.base.DomainElement;
+import org.yakindu.sct.domain.extension.DomainRegistry;
+
+import com.google.inject.Inject;
+
+/**
+ * @author andreas muelder - Initial contribution and API
+ * 
+ */
+public class DomainValidator extends AbstractDeclarativeValidator {
+
+	public static final String MSG_DOMAIN_UNAVAILABLE = "Domain '%s' not found!";
+	public static final String CODE_DOMAIN_UNAVAILABLE = "DomainUnavailable";
+
+	@Check
+	public void checkDomainAvailable(DomainElement element) {
+		if (!DomainRegistry.domainExists(element.getDomainID())) {
+			error(String.format(MSG_DOMAIN_UNAVAILABLE, element.getDomainID()), element,
+					BasePackage.Literals.NAMED_ELEMENT__NAME, CODE_DOMAIN_UNAVAILABLE);
+		}
+	}
+
+	@Override
+	public boolean isLanguageSpecific() {
+		return false;
+	}
+
+	@Inject
+	public void register(EValidatorRegistrar registrar) {
+		// Do not register because this validator is only a composite #398987
+	}
+
+}

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

@@ -29,6 +29,7 @@ import org.eclipse.xtext.EcoreUtil2;
 import org.eclipse.xtext.validation.AbstractDeclarativeValidator;
 import org.eclipse.xtext.validation.AbstractDeclarativeValidator;
 import org.eclipse.xtext.validation.Check;
 import org.eclipse.xtext.validation.Check;
 import org.eclipse.xtext.validation.CheckType;
 import org.eclipse.xtext.validation.CheckType;
+import org.eclipse.xtext.validation.ComposedChecks;
 import org.eclipse.xtext.validation.EValidatorRegistrar;
 import org.eclipse.xtext.validation.EValidatorRegistrar;
 import org.yakindu.base.base.BasePackage;
 import org.yakindu.base.base.BasePackage;
 import org.yakindu.sct.model.sgraph.Choice;
 import org.yakindu.sct.model.sgraph.Choice;
@@ -85,6 +86,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_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!";
 	public static final String ISSUE_STATECHART_NAME_NO_IDENTIFIER = "%s is not a valid identifier!";
 
 
+	
 	@Check(CheckType.FAST)
 	@Check(CheckType.FAST)
 	public void vertexNotReachable(final Vertex vertex) {
 	public void vertexNotReachable(final Vertex vertex) {
 		if (!(vertex instanceof Entry)) {
 		if (!(vertex instanceof Entry)) {

+ 2 - 1
plugins/org.yakindu.sct.model.stext/src/org/yakindu/sct/model/stext/validation/STextJavaValidator.java

@@ -71,6 +71,7 @@ import org.yakindu.sct.model.sgraph.Trigger;
 import org.yakindu.sct.model.sgraph.Vertex;
 import org.yakindu.sct.model.sgraph.Vertex;
 import org.yakindu.sct.model.sgraph.resource.AbstractSCTResource;
 import org.yakindu.sct.model.sgraph.resource.AbstractSCTResource;
 import org.yakindu.sct.model.sgraph.util.ContextElementAdapter;
 import org.yakindu.sct.model.sgraph.util.ContextElementAdapter;
+import org.yakindu.sct.model.sgraph.validation.DomainValidator;
 import org.yakindu.sct.model.sgraph.validation.SCTResourceValidator;
 import org.yakindu.sct.model.sgraph.validation.SCTResourceValidator;
 import org.yakindu.sct.model.sgraph.validation.SGraphJavaValidator;
 import org.yakindu.sct.model.sgraph.validation.SGraphJavaValidator;
 import org.yakindu.sct.model.stext.services.STextGrammarAccess;
 import org.yakindu.sct.model.stext.services.STextGrammarAccess;
@@ -109,7 +110,7 @@ import com.google.inject.name.Named;
  * @author muelder
  * @author muelder
  * 
  * 
  */
  */
-@ComposedChecks(validators = { SGraphJavaValidator.class, SCTResourceValidator.class, ExpressionsJavaValidator.class })
+@ComposedChecks(validators = { SGraphJavaValidator.class, SCTResourceValidator.class, ExpressionsJavaValidator.class, DomainValidator.class })
 public class STextJavaValidator extends AbstractSTextJavaValidator implements STextValidationMessages {
 public class STextJavaValidator extends AbstractSTextJavaValidator implements STextValidationMessages {
 
 
 	@Inject
 	@Inject

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

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

+ 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);
+	}
+}

+ 45 - 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
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * which accompanies this distribution, and is available at
@@ -10,14 +10,27 @@
  */
  */
 package org.yakindu.sct.ui.editor.editparts;
 package org.yakindu.sct.ui.editor.editparts;
 
 
+import org.eclipse.draw2d.IFigure;
+import org.eclipse.draw2d.Label;
 import org.eclipse.gef.EditPolicy;
 import org.eclipse.gef.EditPolicy;
+import org.eclipse.gef.RootEditPart;
 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.editparts.DiagramEditPart;
 import org.eclipse.gmf.runtime.diagram.ui.editparts.DiagramEditPart;
 import org.eclipse.gmf.runtime.diagram.ui.editparts.IDiagramPreferenceSupport;
 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.diagram.ui.editpolicies.XYLayoutEditPolicy;
 import org.eclipse.gmf.runtime.diagram.ui.editpolicies.XYLayoutEditPolicy;
+import org.eclipse.gmf.runtime.diagram.ui.render.editparts.RenderedDiagramRootEditPart;
 import org.eclipse.gmf.runtime.notation.View;
 import org.eclipse.gmf.runtime.notation.View;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.Font;
+import org.eclipse.swt.graphics.FontData;
+import org.eclipse.ui.ISharedImages;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.xtext.EcoreUtil2;
+import org.yakindu.base.base.DomainElement;
+import org.yakindu.sct.domain.extension.DomainRegistry;
+import org.yakindu.sct.model.sgraph.validation.DomainValidator;
 import org.yakindu.sct.ui.editor.DiagramActivator;
 import org.yakindu.sct.ui.editor.DiagramActivator;
 import org.yakindu.sct.ui.editor.policies.CompositeElementCanonicalEditPolicy;
 import org.yakindu.sct.ui.editor.policies.CompositeElementCanonicalEditPolicy;
 
 
@@ -28,12 +41,43 @@ import org.yakindu.sct.ui.editor.policies.CompositeElementCanonicalEditPolicy;
  */
  */
 public class StatechartDiagramEditPart extends DiagramEditPart implements IDiagramPreferenceSupport {
 public class StatechartDiagramEditPart extends DiagramEditPart implements IDiagramPreferenceSupport {
 
 
+	private static final Font INVALID_DOMAIN_FONT = new Font(null, new FontData("Verdana", 10, SWT.NORMAL));
+
 	private PreferencesHint preferenceHint;
 	private PreferencesHint preferenceHint;
 
 
 	public StatechartDiagramEditPart(View diagramView) {
 	public StatechartDiagramEditPart(View diagramView) {
 		super(diagramView);
 		super(diagramView);
 	}
 	}
 
 
+	@Override
+	public void activate() {
+		super.activate();
+		validateDomain();
+	}
+
+	private void validateDomain() {
+		final DomainElement domainElement = EcoreUtil2.getContainerOfType(resolveSemanticElement(),
+				DomainElement.class);
+		if (domainElement != null && !DomainRegistry.domainExists(domainElement.getDomainID())) {
+			showInvalidDomainMessage(domainElement.getDomainID());
+			disableEditMode();
+		}
+	}
+
+	private void showInvalidDomainMessage(String id) {
+		RootEditPart rootEditPart = getRoot();
+		if (rootEditPart instanceof RenderedDiagramRootEditPart) {
+			IFigure layer = ((RenderedDiagramRootEditPart) rootEditPart)
+					.getLayer(SCTRenderedDiagramRootEditPart.WATERMARK_LAYER);
+			Label figure = new Label(String.format(DomainValidator.MSG_DOMAIN_UNAVAILABLE, id));
+			figure.setIcon(PlatformUI.getWorkbench().getSharedImages().getImage(ISharedImages.IMG_OBJS_ERROR_TSK));
+			figure.setForegroundColor(org.eclipse.draw2d.ColorConstants.red);
+			figure.setFont(INVALID_DOMAIN_FONT);
+			figure.setSize(figure.getPreferredSize());
+			layer.add(figure);
+		}
+	}
+
 	@Override
 	@Override
 	protected void createDefaultEditPolicies() {
 	protected void createDefaultEditPolicies() {
 		installEditPolicy(EditPolicyRoles.CANONICAL_ROLE, new CompositeElementCanonicalEditPolicy());
 		installEditPolicy(EditPolicyRoles.CANONICAL_ROLE, new CompositeElementCanonicalEditPolicy());

+ 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.HashMap;
 import java.util.Map;
 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.editparts.IGraphicalEditPart;
 import org.eclipse.gmf.runtime.diagram.ui.services.editpart.AbstractEditPartProvider;
 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.eclipse.gmf.runtime.notation.View;
 import org.yakindu.sct.ui.editor.editor.StatechartDiagramEditor;
 import org.yakindu.sct.ui.editor.editor.StatechartDiagramEditor;
 import org.yakindu.sct.ui.editor.editparts.BorderItemEditPart;
 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.RegionCompartmentEditPart;
 import org.yakindu.sct.ui.editor.editparts.RegionEditPart;
 import org.yakindu.sct.ui.editor.editparts.RegionEditPart;
 import org.yakindu.sct.ui.editor.editparts.RegionNameEditPart;
 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.StateEditPart;
 import org.yakindu.sct.ui.editor.editparts.StateFigureCompartmentEditPart;
 import org.yakindu.sct.ui.editor.editparts.StateFigureCompartmentEditPart;
 import org.yakindu.sct.ui.editor.editparts.StateNameEditPart;
 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
  * @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;
 	public static final Map<String, Class<? extends IGraphicalEditPart>> editParts;
 	static {
 	static {
@@ -54,12 +58,10 @@ public class StatechartDiagramEditPartProvider extends AbstractEditPartProvider
 	}
 	}
 
 
 	private static void init() {
 	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_TEXT, StatechartTextEditPart.class);
 		editParts.put(STATECHART_NAME, StatechartNameEditPart.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(CHOICE, ChoiceEditPart.class);
 		editParts.put(FINALSTATE, FinalStateEditPart.class);
 		editParts.put(FINALSTATE, FinalStateEditPart.class);
 		editParts.put(ENTRY, EntryEditPart.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(BORDER_ITEM_LABEL_CONTAINER, BorderItemEditPart.class);
 		editParts.put(SHALLOWHISTORY, EntryEditPart.class);
 		editParts.put(SHALLOWHISTORY, EntryEditPart.class);
 		editParts.put(DEEPHISTORY, EntryEditPart.class);
 		editParts.put(DEEPHISTORY, EntryEditPart.class);
-		
+
 		editParts.put(REGION_COMPARTMENT, RegionCompartmentEditPart.class);
 		editParts.put(REGION_COMPARTMENT, RegionCompartmentEditPart.class);
 		editParts.put(REGION, RegionEditPart.class);
 		editParts.put(REGION, RegionEditPart.class);
 		editParts.put(REGION_NAME, RegionNameEditPart.class);
 		editParts.put(REGION_NAME, RegionNameEditPart.class);
-		
+
 		editParts.put(STATE_NAME, StateNameEditPart.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, StateEditPart.class);
 		editParts.put(SUBMACHINE_STATE_NAME, StateNameEditPart.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, StateEditPart.class);
-		editParts.put(STATE_FIGURE_COMPARTMENT,
-				StateFigureCompartmentEditPart.class);
+		editParts.put(STATE_FIGURE_COMPARTMENT, StateFigureCompartmentEditPart.class);
 		editParts.put(TRANSITION, TransitionEditPart.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(EXIT, ExitEditPart.class);
 		editParts.put(SYNCHRONIZATION, SynchronizationEditPart.class);
 		editParts.put(SYNCHRONIZATION, SynchronizationEditPart.class);
 
 
@@ -100,8 +98,7 @@ public class StatechartDiagramEditPartProvider extends AbstractEditPartProvider
 	}
 	}
 
 
 	@Override
 	@Override
-	protected Class<? extends IGraphicalEditPart> getDiagramEditPartClass(
-			View view) {
+	protected Class<? extends IGraphicalEditPart> getDiagramEditPartClass(View view) {
 		return getClass(view.getType());
 		return getClass(view.getType());
 	}
 	}
 
 
@@ -110,4 +107,15 @@ public class StatechartDiagramEditPartProvider extends AbstractEditPartProvider
 		return getClass(view.getType());
 		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());
+	}
+
 }
 }