diff --git a/plugins/org.eclipse.sirius.doc/doc/specifier/FAQ.html b/plugins/org.eclipse.sirius.doc/doc/specifier/FAQ.html new file mode 100644 index 0000000000..2b0ed6a7eb --- /dev/null +++ b/plugins/org.eclipse.sirius.doc/doc/specifier/FAQ.html @@ -0,0 +1,139 @@ + + + + + FAQ + + + + +

Sirius Desktop FAQ

+

This document answers some common questions that specifiers can have when creating advanced Sirius modelers.

+

When I select a element in Sirius diagram, it returns a instance of DDiagram, but i want to get instances of EObject. Is there any way to get EObject from selection in Sirius Diagram?

+

All Sirius model elements which represent a semantic/domain element implement the + org.eclipse.sirius.viewpoint.DSemanticDecorator interface, which provides the + getTarget() method (actually an EMF EReference) to access the underlying + EObject. +

+

This is the case for:

+ +

Retrieve a DNode (or another Sirius representation element) from given semantic element

+

This is the opposite operation of the previous section.

+

Sirius maintains an session-scoped inverse cross-referencer which can be used to find “who references who” even in the absence of explicit navigable references in the model. +
Sirius representation elements have a reference to the semantic model they represents, so you can use it for this kind of task. +
The most convenient way is to use the + org.eclipse.sirius.business.api.query.EObjectQuery : +

+
 Collection<EObject> result = new EObjectQuery(mySemanticElement).getInverseReferences(ViewpointPackage.Literals.DSEMANTIC_DECORATOR__TARGET);
+
+

Note that this will find all the + DSemanticDecorators which represent + mySemanticElement in the whole session (all representations included), which may or may not be what you want. +
If you need more precision, you will have to filter the result (using + EObjectQuery#getRepresentation(DRepresentation) for example to restrict to a specific diagram). +

+

Have editor/properties view in read-only

+

To control the permission on object edition, Sirius use an implementation of + IPermissionAuthority . +
A default one named + ReadOnlyPermissionAuthority is used by Sirius, to enable the read-only mode you can the following code snippet: +

+
IPermissionAuthority permissionAuthority = IPermissionAuthorityRegistry.getPermissionAuthority(session.getTransactionalEditingDomain().getResourceSet());
+if (permissionAuthority instanceof ReadOnlyPermissionAuthority) {
+   ((ReadOnlyPermissionAuthority) permissionAuthority).activate();
+}
+
+

To better control permissions, you can provide your own + IPermissionAuthority implementation using the + PermissionProvider extension point. +

+

Enable direct edit on begin/end labels

+

In addition to its “main” label, an edge on a diagram can also have optional labels at the beginning (source-side) and/or end (target-side). +
However direct edit tools associate with the edge only allow to edit the main label, not the begin/end ones. +
Currently the only way to overcome this limitation is to programmatically contribute additional edit policies on the corresponding GMF Edit Parts. +
+ UML Designer does this for UML associations: see the code + here for how this can be implemented. +

+

Set Coordinates/Position at node creation using a Node Creation Tool

+

You can define the location and size of additional created nodes/edges by using the “CreateView/CreateEdgeView” operation in the creation tool and calling a Java service to use + org.eclipse.sirius.diagram.ui.business.api.view.SiriusLayoutDataManager API. +
Sirius will use this singleton to know the location and size with which to create the nodes/edges. +
After having called + CreateView operation to get the + DDiagramElement created, you can call a Java service as sub operation (a + ChangeContext for example), and in this Java service call: +

+
LayoutData layoutData = SiriusLayoutDataManager.INSTANCE.getData(createdView, true);
+// Update the layout data
+
+

+ Warning: The getData() method does not always return layout data as it does not always exist. See next section for another way of doing this. +

+

Set Coordinates/Position at node creation using an existing node

+

Inside a tool which creates a new node one can use an existing node to set the location and size of the node. +
The tip is to inject a new + RootLayoutData into the + SiriusLayoutDataManager . +
This layout data must concern the graphical container of the new node. +
When Sirius creates the new node, it looks into the + LayoutDataManager if hints exist. +

+

The following method use an existing node to retrieve its location and size and use them to define the location and size of the next created node. +
One could also modify the coordinates before putting them into the layout data manager. +
The code uses the + getEditPart() method defined in the next section. +

+
private void setGraphicalHintsFromExistingNode(DDiagramElement existingNode) {
+  // Give hints about location and size
+  IGraphicalEditPart editPart = getEditPart(existingNode);
+  if (editPart instanceof ShapeEditPart) {
+    ShapeEditPart part = (ShapeEditPart)editPart;
+    SiriusLayoutDataManager.INSTANCE.addData(new RootLayoutData(existingNode.eContainer(), part.getLocation(), part.getSize()));
+  }
+}
+
+

How to get the EditPart corresponding to a DDiagramElement?

+
    private IGraphicalEditPart getEditPart(DDiagramElement diagramElement) {
+        IEditorPart editor = EclipseUIUtil.getActiveEditor();
+         if (editor instanceof DiagramEditor) {
+             Session session = new EObjectQuery(diagramElement).getSession();
+             View gmfView = SiriusGMFHelper.getGmfView(diagramElement, session);
+
IGraphicalEditPart result = null; + if (gmfView != null && editor instanceof DiagramEditor) { + final Map<?, ?> editPartRegistry = ((DiagramEditor) editor).getDiagramGraphicalViewer().getEditPartRegistry(); + final Object editPart = editPartRegistry.get(gmfView); + if (editPart instanceof IGraphicalEditPart) { + result = (IGraphicalEditPart) editPart; + return result; + } + } + } + return null; + } +

How to get all Diagrams in a session?

+

Use the + DialectManager singleton: +

+
DialectManager.INSTANCE.getAllRepresentations(session);
+
+

Also, if you only need the Name/Description of all diagrams, it might be better to use

+
DialectManager.INSTANCE.getAllRepresentationDescriptors(session);
+
+ + \ No newline at end of file diff --git a/plugins/org.eclipse.sirius.doc/doc/specifier/FAQ.textile b/plugins/org.eclipse.sirius.doc/doc/specifier/FAQ.textile new file mode 100644 index 0000000000..89bec7cf58 --- /dev/null +++ b/plugins/org.eclipse.sirius.doc/doc/specifier/FAQ.textile @@ -0,0 +1,112 @@ +h1. Sirius Desktop FAQ + +This document answers some common questions that specifiers can have when creating advanced Sirius modelers. + +h3. When I select a element in Sirius diagram, it returns a instance of DDiagram, but i want to get instances of EObject. Is there any way to get EObject from selection in Sirius Diagram? + +All Sirius model elements which represent a semantic/domain element implement the @org.eclipse.sirius.viewpoint.DSemanticDecorator@ interface, which provides the @getTarget()@ method (actually an EMF EReference) to access the underlying @EObject@. + +This is the case for: +* all "top-level" representations (diagrams, which in practice are instances of @DSemanticDiagram@ that inherit from @DDiagram@; tables, instances of @DTable@; and trees, instances of @DTree@@); +* all the individual elements (@DRepresentationElement@) inside these representations: @DNodes@ /@DContainer@ /@DEdges@ /etc. in diagrams, @DLine@ /@DColumn@ in tables, and @DTreeItem@ in tree representations. @DRepresentationElement@ also provides @getSemanticElements()@ to access the "secondary" associated semantic elements, if any (the ones specified via "Associated Elements Expressions" in the mapping definitions). + +h3. Retrieve a DNode (or another Sirius representation element) from given semantic element + +This is the opposite operation of the previous section. + +Sirius maintains an session-scoped inverse cross-referencer which can be used to find "who references who" even in the absence of explicit navigable references in the model. +Sirius representation elements have a reference to the semantic model they represents, so you can use it for this kind of task. +The most convenient way is to use the @org.eclipse.sirius.business.api.query.EObjectQuery@ : + +bc. + Collection result = new EObjectQuery(mySemanticElement).getInverseReferences(ViewpointPackage.Literals.DSEMANTIC_DECORATOR__TARGET); + +Note that this will find all the @DSemanticDecorators@ which represent @mySemanticElement@ in the whole session (all representations included), which may or may not be what you want. +If you need more precision, you will have to filter the result (using @EObjectQuery#getRepresentation(DRepresentation)@ for example to restrict to a specific diagram). + +h3. Have editor/properties view in read-only + +To control the permission on object edition, Sirius use an implementation of @IPermissionAuthority@ . +A default one named @ReadOnlyPermissionAuthority@ is used by Sirius, to enable the read-only mode you can the following code snippet: + +bc. +IPermissionAuthority permissionAuthority = IPermissionAuthorityRegistry.getPermissionAuthority(session.getTransactionalEditingDomain().getResourceSet()); +if (permissionAuthority instanceof ReadOnlyPermissionAuthority) { + ((ReadOnlyPermissionAuthority) permissionAuthority).activate(); +} + +To better control permissions, you can provide your own @IPermissionAuthority@ implementation using the @PermissionProvider@ extension point. + +h3. Enable direct edit on begin/end labels + +In addition to its "main" label, an edge on a diagram can also have optional labels at the beginning (source-side) and/or end (target-side). +However direct edit tools associate with the edge only allow to edit the main label, not the begin/end ones. +Currently the only way to overcome this limitation is to programmatically contribute additional edit policies on the corresponding GMF Edit Parts. +"UML Designer":https://github.com/ObeoNetwork/UML-Designer/ does this for UML associations: see the code "here":https://github.com/ObeoNetwork/UML-Designer/blob/master/plugins%2Forg.obeonetwork.dsl.uml2.design%2Fsrc%2Forg%2Fobeonetwork%2Fdsl%2Fuml2%2Fdesign%2Finternal%2Feditpart%2FUMLEditPartProvider.java for how this can be implemented. + +h3. Set Coordinates/Position at node creation using a Node Creation Tool + +You can define the location and size of additional created nodes/edges by using the "CreateView/CreateEdgeView" operation in the creation tool and calling a Java service to use @org.eclipse.sirius.diagram.ui.business.api.view.SiriusLayoutDataManager@ API. +Sirius will use this singleton to know the location and size with which to create the nodes/edges. +After having called @CreateView@ operation to get the @DDiagramElement@ created, you can call a Java service as sub operation (a @ChangeContext@ for example), and in this Java service call: + +bc. +LayoutData layoutData = SiriusLayoutDataManager.INSTANCE.getData(createdView, true); +// Update the layout data + +_Warning_: The getData() method does not always return layout data as it does not always exist. See next section for another way of doing this. + +h3. Set Coordinates/Position at node creation using an existing node + +Inside a tool which creates a new node one can use an existing node to set the location and size of the node. +The tip is to inject a new @RootLayoutData@ into the @SiriusLayoutDataManager@ . +This layout data must concern the graphical container of the new node. +When Sirius creates the new node, it looks into the @LayoutDataManager@ if hints exist. + +The following method use an existing node to retrieve its location and size and use them to define the location and size of the next created node. +One could also modify the coordinates before putting them into the layout data manager. +The code uses the @getEditPart()@ method defined in the next section. + +bc. +private void setGraphicalHintsFromExistingNode(DDiagramElement existingNode) { + // Give hints about location and size + IGraphicalEditPart editPart = getEditPart(existingNode); + if (editPart instanceof ShapeEditPart) { + ShapeEditPart part = (ShapeEditPart)editPart; + SiriusLayoutDataManager.INSTANCE.addData(new RootLayoutData(existingNode.eContainer(), part.getLocation(), part.getSize())); + } +} + +h3. How to get the EditPart corresponding to a DDiagramElement? + +bc. + private IGraphicalEditPart getEditPart(DDiagramElement diagramElement) { + IEditorPart editor = EclipseUIUtil.getActiveEditor(); + if (editor instanceof DiagramEditor) { + Session session = new EObjectQuery(diagramElement).getSession(); + View gmfView = SiriusGMFHelper.getGmfView(diagramElement, session); + + IGraphicalEditPart result = null; + if (gmfView != null && editor instanceof DiagramEditor) { + final Map editPartRegistry = ((DiagramEditor) editor).getDiagramGraphicalViewer().getEditPartRegistry(); + final Object editPart = editPartRegistry.get(gmfView); + if (editPart instanceof IGraphicalEditPart) { + result = (IGraphicalEditPart) editPart; + return result; + } + } + } + return null; + } + +h3. How to get all Diagrams in a session? + +Use the @DialectManager@ singleton: + +bc. +DialectManager.INSTANCE.getAllRepresentations(session); + +Also, if you only need the Name/Description of all diagrams, it might be better to use + +bc. +DialectManager.INSTANCE.getAllRepresentationDescriptors(session); diff --git a/plugins/org.eclipse.sirius.doc/doc/specifier/Sirius Specifier Manual.html b/plugins/org.eclipse.sirius.doc/doc/specifier/Sirius Specifier Manual.html index 33138e4e46..be598f113b 100644 --- a/plugins/org.eclipse.sirius.doc/doc/specifier/Sirius Specifier Manual.html +++ b/plugins/org.eclipse.sirius.doc/doc/specifier/Sirius Specifier Manual.html @@ -71,6 +71,9 @@

Sirius Specifier Manual

Viewpoint Specification Models , and the various languages supported. +
  • " + Frequently Asked Questions:FAQ.html answers some common questions that specifiers can have when creating advanced Sirius modelers. +
  • For more information on Sirius, please refer to the diff --git a/plugins/org.eclipse.sirius.doc/doc/specifier/Sirius Specifier Manual.textile b/plugins/org.eclipse.sirius.doc/doc/specifier/Sirius Specifier Manual.textile index 7befdbe791..cd3f95ffe5 100644 --- a/plugins/org.eclipse.sirius.doc/doc/specifier/Sirius Specifier Manual.textile +++ b/plugins/org.eclipse.sirius.doc/doc/specifier/Sirius Specifier Manual.textile @@ -13,6 +13,7 @@ You will find the following sections: * "*Model Operations*":general/Model_Operations.html describes the small language which can be used throughout "_Viewpoint Specification Models_":../Glossary.html#VSM to describe behavior (for example for tools). * "*Colors*":general/Colors.html explains how colors can be specified for all kinds of representations. * "*Queries and Interpreted Expressions*":general/Writing_Queries.html explains the general rules to follow to write the expressions used inside "_Viewpoint Specification Models_":../Glossary.html#VSM, and the various languages supported. +* "*Frequently Asked Questions*:FAQ.html answers some common questions that specifiers can have when creating advanced Sirius modelers. For more information on Sirius, please refer to the "*Sirius User Manual*":../user/Sirius%20User%20Manual.html, which describes how end-users can use the designers you created.