h1. Release Notes for Sirius

{toc:style=disc|minLevel=2|maxLevel=3}

This document contains the release notes for recent major releases of Sirius. See also "the release notes from previous versions":Release_Notes_Previous.html for details about older releases.

h2(#sirius6.3.0). Changes in Sirius 6.3.0

h3. User-Visible Changes

* <span class="label label-success">Added</span> It is now possible to move labels on border of node, or border node, all around the node. Before, for label larger than the node, only centered location was authorized on North or South side.
* <span class="label label-info">Modified</span> The GIF and BMP formats which are currently supported when exporting diagrams as images should be considered _deprecated_. Their support may be removed in a future version, as they cause various issues depending on the platform and increase the maintenance costs for little value. If you really need diagram images in these formats, you can export in PNG (which is lossless), and convert the image into the required format using an external tool.

h3. Specifier-Visible Changes

* <span class="label label-success">Added</span> A new column @Target@ has been added in the dialog allowing to choose layout options to override for ELK layout algorithms. It describes the element to which the option applies. The filter textfield in that dialog also applies on columns& @Name@, @Targets@ and @Type@.

h3. Developer-Visible Changes

* <span class="label label-info">Modified</span> Upgraded ELK version from 0.4.1 to 0.5.0, see the "ELK documentation":https://projects.eclipse.org/projects/modeling.elk/releases/0.5.0 for the list of changes in that version.
* <span class="label label-info">Modified</span> Upgraded EEF version from 2.1.2 to 2.1.3 (which contains a single bugfix, for "#550436":https://bugs.eclipse.org/bugs/show_bug.cgi?id=550436 ).

h4. Changes in  @org.eclipse.sirius@

* <span class="label label-success">Added</span> A new EAttribute @changeId@ has been added in @DRepresentationDescriptor@. It allows to know if two @DRepresentation@(each associated to one DRepresentationDescriptor) are the same and have the exact same content. It can be useful to not load the representation if not needed. The methods @updateChangeId(DRepresentationDescriptor)@ and @areRepresentationIdentical(DRepresentationDescriptor, DRepresentationDescriptor)@ have been added in @org.eclipse.sirius.business.api.helper.RepresentationHelper@ to get change id information and to update it if needed in DRepresentationDescriptor.
In case of migration the method @org.eclipse.sirius.business.api.migration.AbstractRepresentationsFileMigrationParticipant.updateChangeId(DAnalysis, DRepresentation)@ is available to update change id. New migration participants created after this Sirius version must update the change id of the DRepresentationDescriptor of the DRepresentation they change. The API to do that is described in MigrationParticpant "documentation:":developer/extensions-provide_migrate_contribution.html#MigrationParticipantsImplem .
* <span class="label label-success">Added</span> The method @org.eclipse.sirius.business.api.query.DViewQuery.getLoadedRepresentationsDescriptors()@ has been added and allows to retrieve all loaded @DRepresentationDescriptor@ in a @DView@.
* <span class="label label-success">Added</span> The method @org.eclipse.sirius.business.api.session.AbstractSavingPolicy.hasDifferentSerialization(Resource, Map)@ has been extracted from internal subclasses. It is able to tell whether a save operation on a resource can succeed or not, and if the resulting file will change. It should be used with care as it basically saves the resource in a temporary resource to know whether it will change the file or not.
* <span class="label label-success">Added</span> The method @org.eclipse.sirius.business.api.query.DRepresentationQuery.findDescriptorFromAnalysis(DAnalysis)@ has been added to provide a way to look up for a @DRepresentationDescriptor@ in a given @DAnalysis@.
* <span class="label label-info">Modified</span> The method @org.eclipse.sirius.business.api.dialect.DialectServices.copyRepresentation(DRepresentation, String, Session, IProgressMonitor)@ is now deprecated. It is recommended to use the  new alternative, @org.eclipse.sirius.business.api.dialect.DialectServices.copyRepresentation(DRepresentationDescriptor, String, Session, IProgressMonitor)@ which is identical except that it take a @DRepresentationDescriptor@ instead of a @DRepresentation@. Also the constructor of @org.eclipse.sirius.business.api.dialect.command.CopyRepresentationCommand@ has been modified. Its parameter @Collection<DRepresentation> representations@ has been replaced by @Collection<DRepresentationDescriptor> representationDescriptors@. Theses changes were made  to be able to copy the name that is now only in @DRepresentationDescriptor@.
* <span class="label label-info">Modified</span> The @DocumentedElement@ interface providing a description for the representation implemented by @DRepresentation@ is now implemented by @DRepresentationDescriptor@. Also the @name@ EAttribute in @DRepresentation@ has been added to @DRepresentationDescriptor@. These changes allows to use these information without loading associated representation. The @name@ and @description@ attributes on @DREpresentation@ are now transient and volatile and computed from @DRepresentationDescriptor@
* <span class="label label-info">Modified</span>The class @org.eclipse.sirius.business.api.helper.SiriusHelper@ has been renamed into @org.eclipse.sirius.business.api.helper.RepresentationHelper@.
* <span class="label label-danger">Removed</span> In @org.eclipse.sirius.business.api.session.CustomDataConstants@, the constants @DREPRESENTATION@ and @DREPRESENTATION_DESCRIPTOR@ has been removed because they are not available anymore in custom data.

h4. Changes in  @org.eclipse.sirius.common@

* <span class="label label-success">Added</span> A cache has been added to optimize the way the uri fragments are computed in @org.eclipse.sirius.common.tools.api.util.EqualityHelper@, it is managed with the @setUriFragmentCacheEnabled(boolean)@ method. The cache is currently used in three locations: @org.eclipse.sirius.diagram.business.internal.sync.DDiagramSynchronizer.refreshOperation(IProgressMonitor)@, @org.eclipse.sirius.diagram.business.internal.helper.display.DisplayServiceImpl.refreshAllElementsVisibility(DDiagram)@ and in the hidden elements lookup phase of @org.eclipse.sirius.diagram.ui.edit.api.part.AbstractDDiagramEditPart.activate()@. This optimization is enabled by default, it can be disabled by setting the system property @org.eclipse.sirius.common.enableUriFragmentOptimization@ to @false@.
* <span class="label label-danger">Removed</span> The classes @org.eclipse.sirius.common.tools.api.util.LazyCrossReferencer@, @org.eclipse.sirius.common.tools.api.util.ECrossReferenceAdapterWithUnproxyCapability@ have been merged in @org.eclipse.sirius.business.internal.session.danalysis.SessionLazyCrossReferencer@ to reduce complexity.
* <span class="label label-danger">Removed</span> The class @org.eclipse.sirius.common.tools.api.util.SiriusCrossReferenceAdapterImpl@ has been merged in @org.eclipse.sirius.common.tools.api.util.SiriusCrossReferenceAdapter@.
* <span class="label label-danger">Removed</span> The @org.eclipse.sirius.business.internal.session.danalysis.LocalResourceCollector@ has been merged in @SiriusCrossReferenceAdapter@ to have only one instance of a cross referencer for a Sirius session. This implies that resource collector is no more installed on all resourceSet resources by default but only on those managed by the Sirius session semantic cross reference. But if the getRefencing/ed services are used, it will install itself on a non managed resource and then return the references for all resources on which it is installed.

h4. Changes in  @org.eclipse.sirius.diagram@

* <span class="label label-success">Added</span> A cache has been added to optimize the way Sirius checks that a mapping is in the activated layers of a diagram. The cache is currently used in three locations: @org.eclipse.sirius.diagram.business.internal.sync.DDiagramSynchronizer.refreshOperation(IProgressMonitor)@, @org.eclipse.sirius.diagram.business.internal.helper.display.DisplayServiceImpl.refreshAllElementsVisibility(DDiagram)@ and in the hidden elements lookup phase of @org.eclipse.sirius.diagram.ui.edit.api.part.AbstractDDiagramEditPart.activate()@. This optimization is enabled by default, it can be disabled by setting the system property @org.eclipse.sirius.diagram.enableActiveParentLayerOptimization@ to @false@.

h4. Changes in  @org.eclipse.sirius.diagram.elk@

* <span class="label label-success">Added</span> The @org.eclipse.sirius.diagram.elk.layout.extension@ experimental extension-point has been added to make it possible to extend the ELK layout with pre end post operations. See the extension-point associated documentation and @org.eclipse.sirius.diagram.elk.IELKLayoutExtension@ interface for more details.

h4. Migrations

* <span class="label label-success">Added</span> A migration participant has been added to move the name and documentation from the representations to their descriptors (see "bugzilla #548631":https://bugs.eclipse.org/bugs/show_bug.cgi?id=548631 for more details). The corresponding version, stored in attribute version of viewpoint:DAnalysis of the aird file, is _14.3.0.201908071200_.
* <span class="label label-success">Added</span> A migration participant has been added to change the GMF coordinates of the labels that are:
    * on border of its node or border node
    * larger that its node or border node
    * on the North or South side.
The goal of this migration participant is to keep centered labels visually fixed compared to previous version (see "bugzilla #550382":https://bugs.eclipse.org/bugs/show_bug.cgi?id=549887 for more details). The corresponding version, stored in attribute version of viewpoint:DAnalysis of the aird file, is _14.3.0.201908231800_.
* <span class="label label-success">Added</span> A migration participant has been added to sort the already activated filters. The activated filters list is now sorted on each filter activation, the sorted result is stored in the model whereas in older version the list was sorted on almost each use of those activated filters (see "bugzilla #550663":https://bugs.eclipse.org/bugs/show_bug.cgi?id=550663 for more details). The corresponding version, stored in attribute version of viewpoint:DAnalysis of the aird file, is _14.3.0.201909031200_.

h2(#sirius6.2.2). Changes in Sirius 6.2.2

There are no user-visible changes in Sirius 6.2.2 compared to 6.2.1. The only changes are internal and related either to the build process or to the automated tests.

h2(#sirius6.2.1). Changes in Sirius 6.2.1

h3. Developer-Visible Changes

h4. Changes in  @org.eclipse.sirius@

* <span class="label label-success">Added</span> Added a constructor @org.eclipse.sirius.business.api.query.DRepresentationQuery.DRepresentationQuery(DRepresentation, Session)@ to compute queries directly from the given session instead of computing it.
* <span class="label label-success">Added</span> In @viewpoint.ecore@, the @UIState@ class has a new @subDiagramDecorationDescriptors@ attribute. It is used as a cache to speed up sub diagram decorations computing.
* <span class="label label-success">Added</span> It is now possible to consider that some specific graphical changes need a refresh of the representation. Before Sirius 6.1.3, only semantic changes triggers a refresh. Now you can use @RefreshHelper.registerImpactingNotification(Predicate<Notification>)@ to consider a specific graphical changes. An example is the possibility to launch a refresh when the region container is collapsed or expanded. See "Trigger a Sirius refresh on specific graphical changes":developer/trigger-refresh-graphical-changes.html in the developer documentation for more details.
* <span class="label label-success">Added</span> The method @org.eclipse.sirius.tools.api.ui.RefreshHelper.isAutoRefresh()@ has been added to know if Sirius is in automatic refresh mode or in manual mode.
* <span class="label label-success">Added</span> The methods @org.eclipse.sirius.tools.api.ui.RefreshHelper.registerImpactingNotification(Predicate<Notification>)@ and @org.eclipse.sirius.tools.api.ui.RefreshHelper.unregisterImpactingNotification(Predicate<Notification>)@ have been added to allow to consider some graphical modifications as requiring a refresh. By default, only semantic changes are considered as requiring a refresh.  
* <span class="label label-danger">Removed</span> The @org.eclipse.sirius.business.api.helper.task.NotificationTask@ class has been removed. It was not used anywhere.


h4. Changes in  @org.eclipse.sirius.diagram.ui@

* <span class="label label-info">Modified</span> The @org.eclipse.sirius.diagram.ui.business.api.image.ImageSelector.IMAGES_RESOURCE_NAME@ constant has been deprecated. It was present in the initial commit of Sirius but has never been used in its open source components.

h4. Changes in  @org.eclipse.sirius.tests.swtbot.support@

* <span class="label label-success">Added</span>  The methods @org.eclipse.sirius.tests.swtbot.support.api.widget.SWTBotSiriusFigureCanvas.mouseMoveLeftClick(int, int, boolean, int[])@, @org.eclipse.sirius.tests.swtbot.support.api.editor.SWTBotSiriusGefViewer.click(int, int, boolean, int[])@, @org.eclipse.sirius.tests.swtbot.support.api.editor.SWTBotSiriusDiagramEditor.clickWithKeys(String, int...)@, have been added to make a mouse click with key modifiers for a multi selection for example.

* <span class="label label-success">Added</span>  The method @org.eclipse.sirius.tests.swtbot.support.api.editor.SWTBotSiriusHelper.selectPropertyTabItem(String, SWTBot)@ has been added. It allows to look for property tab from a given bot. The bot corresponding to the property view should be given otherwise the search could fail starting from Eclipse 2019-06.

* <span class="label label-success">Added</span>The method @org.eclipse.sirius.tests.swtbot.support.api.editor.SWTBotSiriusHelper.getShellBot(String)@ has been added and allows to retrieve a bot related to a shell with the given label.

* <span class="label label-success">Added</span>The method @org.eclipse.sirius.tests.swtbot.support.api.editor.SWTBotSiriusHelper.menu(SWTBot, String)@ has been added and allows to retrieve a menu even when the active shell is null. Should be used over @SWTBot.menu(String)@ method.

h2(#sirius6.2.0). Changes in Sirius 6.2.0

h3. User-Visible Changes

* <span class="label label-success">Added</span> On sequence diagrams, it is now possible to remove vertical blank spaces on standard edition mode by dragging the mouse from bottom to top anywhere in the canvas with the Ctrl+Shift keys pressed. This "feature":user/sequences/Sequence%20Diagrams.html#remove_vertical_blank_space was here since version 6.0.0 but was only accessible through the ruler.

h3. Specifier-Visible Changes

* <span class="label label-success">Added</span> It is now possible to add action/group in the "New" contextual menu of diagram elements. This menu was missed in Sirius 6.1.0. It is now documented in the "corresponding documentation":specifier/diagrams/Diagrams.html#group .

h3. Developer-Visible Changes

h4. Changes in @org.eclipse.sirius.common@

* <span class="label label-success">Added</span> A new interface @org.eclipse.sirius.common.tools.api.interpreter.IConverter@ has been added: it encapsulates the coercion rules used to convert raw results returned by interpreted expressions into the types expected by Sirius (depending on the context of use of the expression).
* <span class="label label-success">Added</span> In interface @org.eclipse.sirius.common.tools.api.interpreter.IInterpreter@, a new method @getConverter()@ has been added to obtain the @IConverter@ for a given interpreter.
* <span class="label label-success">Added</span> A new class @org.eclipse.sirius.common.tools.api.interpreter.EvaluationResult@ has been added. It serves as a default implementation of @IEvaluationResult@. It provides static factory methods for common cases (successful evaluation or failure).
* <span class="label label-info">Modified</span> In @org.eclipse.sirius.common.tools.api.interpreter.TypeName@, the methods @getJavaClass()@ and @getPackagePrefix()@ which used to return a @org.eclipse.sirius.ext.base.Option<T>@ now return standard @java.util.Optional<T>@ instead.
* <span class="label label-info">Modified</span> In @org.eclipse.sirius.common.tools.api.profiler.ProfilerTaskRegistry@, the method @get(String)@ which used to return a @org.eclipse.sirius.ext.base.Option<T>@ now return standard @java.util.Optional<T>@ instead.
* <span class="label label-info">Modified</span> In @org.eclipse.sirius.common.tools.api.query.NotifierQuery@, the method @getAdapter(Class<?>)@ which used to return a @org.eclipse.sirius.ext.base.Option<T>@ now return standard @java.util.Optional<T>@ instead.
* <span class="label label-info">Modified</span> In @org.eclipse.sirius.common.tools.api.resource.ResourceSetSync@, the method @getResourceSetSync(TransactionalEditingDomain)@ which used to return a @org.eclipse.sirius.ext.base.Option<T>@ now return standard @java.util.Optional<T>@ instead.
* <span class="label label-info">Modified</span> In @org.eclipse.sirius.common.tools.api.util.MarkerUtil@, the method @addMarkerFor(IResource, String, int, String)@ which used to return a @org.eclipse.sirius.ext.base.Option<T>@ now return standard @java.util.Optional<T>@ instead.
* <span class="label label-info">Modified</span> In @org.eclipse.sirius.common.tools.api.util.ReflectionHelper@, all the following methods which used to return a @org.eclipse.sirius.ext.base.Option<T>@ now return standard @java.util.Optional<T>@ instead: @setConstructorVisibleWithoutException(Class<? extends Object>, Class<?>...)@
@setFieldVisibleWithoutException(Class<? extends Object>, String)@, @getClassForNameWithoutException(String)@, @instantiateWithoutException(String, Class<?>[], Object[])@, @getFieldValueWithoutException(Object, String)@, @getFieldValueWithoutException(Class<? extends Object>, String)@, and @getFieldValueWithoutException(Object, String, Class<? extends Object>)@.
* <span class="label label-info">Modified</span> The interface @org.eclipse.sirius.common.tools.api.interpreter.IInterpreterWithDiagnostic.IEvaluationResult@ has been promoted as a top-level type as @org.eclipse.sirius.common.tools.api.interpreter.IEvaluationResult@. In the process it has gained several methods to check for success and coerce the raw evaluation result into any of the types that are used by Sirius (depending on the usage context).
* <span class="label label-danger">Removed</span> In interface @org.eclipse.sirius.common.tools.api.interpreter.IInterpreter@ (and all its implementations shipped with Sirius), the methods @addVariableStatusListener()@ and @removeVariableStatusListener()@ have been removed, along with the corresponding type @org.eclipse.sirius.common.tools.api.interpreter.IVariableStatusListener@. These correspond to obsolete and unused mechanisms.
* <span class="label label-danger">Removed</span> The @interface org.eclipse.sirius.common.tools.api.interpreter.IInterpreterWithDiagnostic@ has been removed. The single method it defined, @evaluateExpression()@, is now implemented directly by the main @IInterpreter@ interface. In effect, all @IInterpreter@ are now "with diagnostic". 
* <span class="label label-danger">Removed</span> The interface @org.eclipse.sirius.tools.api.interpreter.context.SiriusInterpreterContextFactory@ has been removed from the API (it has been moved into an internal package): it should only be needed by Sirius itself and has no reason to be exposed as public API.

h4. Changes in @org.eclipse.sirius.common.ui@

* <span class="label label-info">Modified</span> In @org.eclipse.sirius.common.ui.tools.api.dialog.quickoutline.QuickOutlineDescriptor@, the methods @getFirstPage()@ and @getNextPage(QuickOutlinePageDescriptor)@ which used to return a @org.eclipse.sirius.ext.base.Option<T>@ now return standard @java.util.Optional<T>@ instead.

h4. Changes in  @org.eclipse.sirius.diagram.layoutdata@

* <span class="label label-danger">Removed</span> This plugin has been removed and fully replaced by  @org.eclipse.sirius.diagram.formatdata@

h4. Changes in  @org.eclipse.sirius.diagram@

* <span class="label label-success">Added</span> The message @org.eclipse.sirius.diagram.Messages.SynchronizeGMFModelCommand_label@ has been added. It replaces @org.eclipse.sirius.diagram.ui.provider.Messages.SynchronizeGMFModelCommand_label@.
* <span class="label label-success">Added</span> In @org.eclipse.sirius.diagram.business.api.query.DragAndDropTargetQuery@, a new method @getLogicalChildren()@ has been added. It makes it easy to iterate over the logical structure of diagram elements. A static factory method @on()@ was also added to provide a more fluent API, e.g. @DragAndDropTargetQuery.on(container).getLogicalChildren()@.
* <span class="label label-success">Added</span> The extension point org.eclipse.sirius.diagram.customBundledImageShape has been created in order to provide custom shape to the bundled image style. This extension point offers more flexibility on the specification of the svg tags and attributes holding the color, border color and border size information than the extension point org.eclipse.sirius.diagram.bundledImageShape.
* <span class="label label-info">Modified</span> The extension point org.eclipse.sirius.diagram.bundledImageShape has been marked as deprecated. Shapes provided by this extension point still work.
* <span class="label label-info">Modified</span> The method @org.eclipse.sirius.diagram.tools.api.command.IDiagramCommandFactory.buildInsertVerticalBlankSpaceCommand(DDiagram, int, int)@ has been renamed to @org.eclipse.sirius.diagram.tools.api.command.IDiagramCommandFactory.buildInsertOrRemoveVerticalBlankSpaceCommand(DDiagram, int, int)@ because it handles now both addition and removal.
* <span class="label label-info">Modified</span> Method _getAllEdgeMappings_ defined in @org.eclipse.sirius.diagram.business.internal.metamodel.helper.ContentHelper@ has been moved in a new class called @org.eclipse.sirius.diagram.business.internal.metamodel.helper.ContentLayerHelper@ to ensure method to be independent from pure Sirius code. 
* <span class="label label-danger">Removed</span> EOperations and features have been removed from the metamodel @diagram.ecore@. This is the ones that are computed outside of EMF environment with dependencies to IInterpreter or that are deprecated. The following EOperations have been removed/replaced: 
** @DEdge.isRootFolding@ has been removed
** @DDiagram.getNodesFromMapping@ has been replaced by @DDiagramSpecOperations.getNodesFromMapping@
** @DDiagram.getEdgesFromMapping@ has been replaced by @DDiagramSpecOperations.getEdgesFromMapping@
** @DDiagram.getContainersFromMapping@ has been replaced by @DDiagramSpecOperations.getEdgesFromMapping@
** @DiagramElementMapping.checkPrecondition@ has been replaced by @SiriusElementMappingSpecOperations.checkPrecondition@
** @DiagramElementMapping.getAllMappings@ has been replaced by @MappingHelper.getAllMappings@
** @DiagramElementMapping.isFrom@ has been replaced by @SiriusElementMappingSpecOperations.isFrom@
** @AbstractNodeMapping.clearDNodesDone@ has been replaced by @NodeMappingHelper.clearDNodesDone@
** @AbstractNodeMapping.addDoneNode@ has been replaced by @NodeMappingHelper.addDoneNode@
** @AbstractNodeMapping.getAllBorderedNodeMappings@ has been replaced by @MappingHelper.getAllBorderedNodeMappings@
** @NodeMapping.createNode@ has been replaced by @NodeMappingHelper.createNode@. You must verify that @NodeMapping@ is an @INodeMappingExt@ before calling this method. Previously, in other cases, when a @NodeMapping@ is not @INodeMappingExt@, an @UnsupportedOperationException@ was thrown.
** @NodeMapping.updateNode@ has been replaced by @NodeMappingHelper.updateNode@
** @NodeMapping.updateListElement@ has been replaced by @NodeMappingHelper.updateListElement@
** @NodeMapping.getNodesCandidates(semanticOrigin,container)@ has been replaced by @NodeMappingHelper.getNodesCandidates(semanticOrigin,container)@
** @NodeMapping.getNodesCandidates(semanticOrigin,container,containerView)@ has been replaced by @NodeMappingHelper.getNodesCandidates(semanticOrigin,container,containerView)@
** @ContainerMapping.getBestStyle@ has been replaced by @ContainerMappingWithInterpreterHelper.getBestStyle@
** @EdgeMapping.createEdge(source,target,semanticTarget)@ has been replaced by @EdgeMappingHelper.createEdge(EdgeMapping, EdgeTarget, EdgeTarget, EObject, EObject)@
** @EdgeMapping.createEdge(source,target,container,semanticTarget)@ has been replaced by @EdgeMappingHelper.createEdge(EdgeMapping, EdgeTarget, EdgeTarget, EObject, EObject)@
** @EdgeMapping.getBestStyle@ has been replaced by @MappingWithInterpreterHelper.getBestStyle@
** @EdgeMapping.updateEdge@ has been replaced by @EdgeMappingHelper.updateEdge@
** @EdgeMapping.getEdgeTargetCandidates(semanticOrigin,viewPoint)@ has been replaced by @EdgeMappingHelper.getEdgeTargetCandidates@
** @EdgeMapping.getEdgeSourceCandidates@ has been replaced by @EdgeMappingHelper.getEdgeSourceCandidates@
** @EdgeMapping.getEdgeTargetCandidates(semanticOrigin,container,containerView)@ has been replaced by @EdgeMappingHelper.getEdgeTargetCandidates@
** @EdgeCreationDescription.getBestMapping@ has been removed because it is never used.
** @ContainerDropDescription.getBestMapping@ has been replaced by @ContainerMappingWithInterpreterHelper.getBestMapping@
** @Filter.isVisible@ has been replaced by @FilterService.isVisible(Filter, DDiagramElement)@
** @VariableFilter.resetVariables@ has been replaced by @VariableFilterWrapper.resetVariables@
* <span class="label label-info">Modified</span> The following features have been removed/replaced:
** @DiagramDescription.allNodeMappings@ has been replaced by @ContentHelper.getAllNodeMappings@ (with @false@ value for parameter @withoutOptionalLayers@)
** @DiagramDescription.allContainerMappings@ has been replaced by @ContentHelper.getAllContainerMappings@ (with @false@ value for parameter @withoutOptionalLayers@)
** @DiagramDescription.allLayers@ has been replaced by @LayerHelper.getAllLayers@
** @ContainerMapping.allNodeMappings@ has been replaced by @ContainerMappingHelper.getAllNodeMappings@
** @ContainerMapping.allContainerMappings@ has been replaced by @ContainerMappingHelper.getAllContainerMappings@
** @Layer.allEdgeMappings@ has been replaced by @ContentLayerHelper.getAllEdgeMappings@

h4. Changes in  @org.eclipse.sirius.diagram.ui@

* <span class="label label-success">Added</span> The method @org.eclipse.sirius.diagram.ui.business.api.query.EditPartQuery.getDDiagram()@ has been added to retrieve the  @DDiagram@ associated to the edit part or to one of its ancestor.
* <span class="label label-danger">Removed</span> The message @org.eclipse.sirius.diagram.ui.provider.Messages.SynchronizeGMFModelCommand_label@ has been removed. It has been replaced in @org.eclipse.sirius.diagram.Messages@.
* <span class="label label-danger">Removed</span> The extension point @layoutDataManager@, deprecated since Sirius 4.1.0, has been removed. The corresponding plug-in @org.eclipse.sirius.diagram.layoutdata@ has also been removed.
* <span class="label label-success">Added</span> The method @org.eclipse.sirius.diagram.ui.business.api.query.ConnectionEditPartQuery.getCenteredAnchorsAbsoluteLocation(Rectangle)@ has been added in order to compute the location of the anchor of a connection centered on its target or source.
* <span class="label label-success">Added</span> The method @org.eclipse.sirius.diagram.ui.business.api.query.ConnectionQuery.getAbsolutePointList(RelativeBendpoints, PrecisionPoint, PrecisionPoint)@ has been added to compute the absolute coordinates of the bendpoints of a connection.

h4. Changes in @org.eclipse.sirius.ui.editor@

* <span class="label label-info">Modified</span> The method @org.eclipse.sirius.ui.editor.api.pages.PageProvider.provides()@ now takes the @SessionEditor@ as an additional parameter to allow implementation to decide if it should provide an additional page or not.

h4. Changes in @org.eclipse.sirius.diagram.sequence@

* <span class="label label-success">Added</span> A new translatable message @org.eclipse.sirius.diagram.sequence.Messages.VerticalSpaceReduction_operationName@ has been added. It's key is @VerticalSpaceReduction_operationName@ and its default value is @Auto-reduction of {0}@. It is used when reducing spaces in sequence diagram.
* <span class="label label-success">Added</span> A new translatable message @org.eclipse.sirius.diagram.ui.provider.Messages.RemoveBlankSpace_cmdName@ has been added. It's key is @RemoveBlankSpace_cmdName@ and its default value is @Remove blank space@. It is used when removing spaces in sequence diagram.
* <span class="label label-success">Added</span>  The methods @org.eclipse.sirius.tests.swtbot.support.api.editor.SWTBotSiriusDiagramEditor.dragWithKeys(int, int, int, int, AtomicBoolean, int...)@, @org.eclipse.sirius.tests.swtbot.support.api.editor.SWTBotSiriusGefViewer.dragWithKeys(int, int, int, int, AtomicBoolean, int...)@, @org.eclipse.sirius.tests.swtbot.support.api.widget.SWTBotSiriusFigureCanvas.mouseDragWithKeys(int, int, int, int, AtomicBoolean, int...)@, have been added to make a drag an drop with more than one key modifier.

h4. Changes in @org.eclipse.sirius.ecore.extender@

* <span class="label label-info">Modified</span> In @org.eclipse.sirius.ecore.extender.business.internal.accessor.ModelAccessorAdapter@, the methods @getAdapter(ResourceSet resourceSet)@ and @removeAdapter(ResourceSet resourceSet)@ now return @java.util.Optional<T>@ instead of instance of Sirius's custom @org.eclipse.sirius.ext.base.Option<T>@.

h4. Changes in @org.eclipse.sirius.ext.gmf.runtime@

* <span class="label label-info">Modified</span> In @org.eclipse.sirius.ext.gmf.runtime.editparts.GraphicalHelper@, all the methods which used to take or return an @org.eclipse.sirius.ext.base.Option<T>@ not take or return a standard @java.util.Optional<T>@ instead.

h4. Changes in @org.eclipse.sirius.tests.swtbot.support@

* <span class="label label-success">Added</span> The methods @org.eclipse.sirius.tests.swtbot.support.api.editor.SWTBotSiriusDiagramEditor.dragWithKeys(int, int, int, int, AtomicBoolean, int...)@, @org.eclipse.sirius.tests.swtbot.support.api.editor.SWTBotSiriusGefViewer.dragWithKeys(int, int, int, int, AtomicBoolean, int...)@ and @org.eclipse.sirius.tests.swtbot.support.api.widget.SWTBotSiriusFigureCanvas.mouseDragWithKeys(int, int, int, int, AtomicBoolean, int...)@ have been added and allows to do a drag and drop with any key modifier you want.
* <span class="label label-info">Modified</span> The methods @org.eclipse.sirius.tests.swtbot.support.api.editor.SWTBotSiriusDiagramEditor.dragWithKey(int, int, int, int, int, AtomicBoolean)@, @org.eclipse.sirius.tests.swtbot.support.api.editor.SWTBotSiriusGefViewer.dragWithKey(int, int, int, int, int, AtomicBoolean)@ and @org.eclipse.sirius.tests.swtbot.support.api.widget.SWTBotSiriusFigureCanvas.mouseDragWithKey(int, int, int, int, int, AtomicBoolean)@ have been marked as deprecated. The method @org.eclipse.sirius.tests.swtbot.support.api.editor.SWTBotSiriusDiagramEditor.dragWithKeys(int, int, int, int, AtomicBoolean, int...)@, @org.eclipse.sirius.tests.swtbot.support.api.editor.SWTBotSiriusGefViewer.dragWithKeys(int, int, int, int, AtomicBoolean, int...)@ and @org.eclipse.sirius.tests.swtbot.support.api.widget.SWTBotSiriusFigureCanvas.mouseDragWithKeys(int, int, int, int, AtomicBoolean, int...)@ should be used instead.C

h2(#sirius6.1.2). Changes in Sirius 6.1.2

h3. User-Visible Changes

* <span class="label label-info">Modified</span> Invalid representations, that are either representations which semantic target does not exist anymore or representations that can not be retrieved anymore, are grayed in the Model Explorer and the only available action is _Delete_. It was previously the case only for representations which semantic target does not exist anymore.

h3. Developer-Visible Changes

* <span class="label label-success">Added</span> If the @org.eclipse.sirius.diagam.ui.hidePrintingOfPermissionAuthorityDecoration@ system property is set to true and if there is no other printable decoration provided at the same location (South-West), the permission authority decorations displayed on diagrams are not printed nor exported in images (export as image actions).

h4. Changes in  @org.eclipse.sirius@

* <span class="label label-success">Added</span> The methods @org.eclipse.sirius.business.api.query.DRepresentationDescriptorQuery.isRepresentationReachable()@ and @org.eclipse.sirius.business.api.query.DRepresentationDescriptorQuery.isRepresentationValid()@ have been added. The former allows to know if the @DRepresentation@ can be retrieved from the @DRepresentationDescriptor.repPath@: the repPath is correctly set and the representation effectively exists. The latter returns true if the @DRepresentationDescriptor@ is either dangling (@DRepresentationDescriptor.repPath@ can not be found) or can not by retrieved.

h4. Changes in  @org.eclipse.sirius.diagram.ui@

* <span class="label label-success">Added</span>  A new field @CustomLayoutConfiguration layoutConfiguration@ has been added to @org.eclipse.sirius.diagram.ui.tools.api.layout.provider.DefaultLayoutProvider@ and its setter method 
@setLayoutConfiguration(CustomLayoutConfiguration)@. It allows any layout provider to be aware of any VSM layout configuration that should be used.

* <span class="label label-info">Modified</span> The method @getDiagramLayoutProvider(DiagramEditPart, IAdaptable)@ in package  @org.eclipse.sirius.diagram.ui.tools.api.layout.provider.AbstractLayoutProvider@ has been made protected to allow to provide layout provider from other mechanism than LayoutService.

h4. Changes in  @org.eclipse.sirius.diagram@

* <span class="label label-success">Added</span> The getter and setter methods have been added for the new attribute @org.eclipse.sirius.diagram.ui.tools.api.decoration.DecorationDescriptor.isPrintable@. This attribute is used to know if the decoration should be hidden when printing or exporting the diagram. The behavior is applied only if there is no printable decoration in its diagram element location (South, West, South-West etc).

h4. Changes in  @org.eclipse.sirius.common@

* <span class="label label-danger">Removed</span> The class @org.eclipse.sirius.common.tools.api.util.SiriusCopier@ has been replaced by the internal class @org.eclipse.sirius.tools.internal.SiriusCopierHelper@. @SiriusCopier.Helper.copy(T)@ and @SiriusCopier.Helper.copyAll(Collection<? extends T>)@ have been replaced by @SiriusCopierHelper.copyWithNoUidDuplication(T)@, @SiriusCopierHelper.copyAllWithNoUidDuplication(Collection<? extends T>)@ and @SiriusCopierHelper.copyAllWithNoUidDuplication(Collection<? extends EObject>, boolean, boolean, boolean)@. It provides the ability to copy an object without copying the EAttribute @IDENTIFIED_ELEMENT__UID@. For all these methods, this id is not set by the factory or during object creation, it is set during the copy using @org.eclipse.emf.ecore.util.EcoreUtil.generateUUID()@.


h2(#sirius6.1.1). Changes in Sirius 6.1.1

h4. Changes in  @org.eclipse.sirius.diagram@

* <span class="label label-success">Added</span> Add method @allowsVisibilityModeActivation()@ in @org.eclipse.sirius.diagram.business.api.diagramtype.IDiagramDescriptionProvider@ This method is used to know if the visibility mode is supported by a specific diagram description.

h2(#sirius6.1.0). Changes in Sirius 6.1.0

* <span class="label label-info">IMPORTANT</span>  The new (and still experimental) _Workflow_ and _Server_ features depend on a specific version of Eclipse Jetty which is available in the main Eclipse Photon repository. They can not be used under Oxygen (which include older and incompatible versions of Jetty).
* <span class="label label-info">IMPORTANT</span> Please note that starting from version 6.1, Sirius is now licensed under "version 2.0 of the Eclipse Public License":https://www.eclipse.org/legal/epl-2.0/, which updates some wording and clarifies some points but neither changes the open-source nature of Sirius nor the implications of using or embedding it. See "the official FAQ":https://www.eclipse.org/legal/epl-2.0/faq.php for details about the difference between EPL v1.0 (which was used before) and v2.0.

h3. User-Visible Changes

* <span class="label label-success">Added</span> A new preference has been added in the Sirius preference panel. It allows Sirius to ask the user if he wants to save session resources after an automatic migration. If the new preference is ticked, the pop-up will only appear for session opening caused by a direct action of the user (i.e. opening a diagram or unfolding the resources in the model explorer). You can refer to the "user documentation ":user/general/Modeling%20Project.html#Migration for more details.
* <span class="label label-success">Added</span> On sequence diagrams, it is now possible to add vertical blank spaces on standard edition mode by dragging the mouse anywhere in the canvas with the Ctrl+Shift keys pressed.  This "feature:":user/sequences/Sequence%20Diagrams.html#insert_vertical_blank_space was here since version 6.0.0 but was only accessible through the ruler.
* <span class="label label-success">Added</span> The preference @org.eclipse.sirius.ui.business.api.preferences.SiriusUIPreferencesKeys.PREF_DISPLAY_VSM_USER_FIXED_COLOR_IN_PALETTE@ has been added and can be managed in Preferences/Sirius/Sirius Diagram/Appearance/Display viewpoint colors. It allows to display, in the color palette, the user fixed color(defined in the activated viewpoints) in addition to standard colors. The color palette is available in Appearance tab of the Properties view.
* <span class="label label-success">Added</span> A new visibility diagram edit "mode":user/diagrams/Diagrams.html#edit_modes is available. It allows to see diagram elements hidden manually with some transparency. In this mode the visibility can be changed by a double click on the target diagram element.
!user/diagrams/images/show_hide_mode_example.png!
* <span class="label label-success">Added</span> A new dropdown menu gathering the layouting, visibility and standard mode is now available in the tabbar of diagram editors to activate the chosen edit mode. The standard mode corresponds to a diagram editor without the layouting and visibility mode activated.
!user/diagrams/images/show_hide_mode_tabbar_activate.png!
* <span class="label label-success">Added</span> A quick fix is now available on the error marker signaling a modeling project without a representations file. Processing this quick fix will create a new empty representation file.
* <span class="label label-info">Modified</span> The tool "Link Note", introduced in Sirius 6.0.0, has been renamed into "Representation Link".
* <span class="label label-info">Modified</span> A "Representation Link" is no longer deleted automatically when the targeted representation is deleted. Instead, the note header changes to "Broken Representation Link" and the note icon changes to a small red diagonal cross. You can refer to the "user documentation":user/diagrams/Diagrams.html#notes for more details.

h3. Specifier-Visible Changes

* <span class="label label-success">Added</span> "Initial documentation":specifier/workflows/Workflows.html has been added for the "Workflow" feature introduced in 6.0.0 (which is still experimental).
* <span class="label label-success">Added</span> The contribution of @PopupMenu@ in diagram has been improved. It is now possible to define @Group@ in @PopupMenu@. A group allows to group several actions. It appears like a separator between groups of actions. It is also possible to reuse existing menu or group.
Previously, it was possible to add new menus and actions at the end of the contextual menu:
!images/popupMenuBefore.png!
Now, it is possible to:
* group actions (actions in MySpecificPopupMenu2 for example),
* add new menus and actions in a new group of an existing menu (action MyActionF1 and menu MySpecificPopupMenu2 for example)
* add new menus and actions in an existing group of an existing menu (action MyActionH1 and menu MySpecificPopupMenu3 for example):
!images/popupMenuAfter.png!
* add new actions in the "Select All" menu of the "tab-bar":user/diagrams/Diagrams.html#ref_tabbar. Some services have been directly provided in Sirius in class @org.eclipse.sirius.diagram.ui.tools.api.interpreter.StandardDiagramServices@: see "org.eclipse.sirius.diagram.ui developer visible changes":#DeveloperVisibleChanges for the list of services or chapter "Selection after tool execution":specifier/general/ToolsSpecification.html#selectionAfterToolExecution of documentation to see how to use them.
Refer to the "specifier documentation":specifier/diagrams/Diagrams.html#group for details.
* <span class="label label-info">Modified</span> Specifier can now hide header column of Edition Table (the left-most column of the table). It is possible by specifying value -1 in the _Initial Header Column Width_ field of Edition table representation. See "the documentation":specifier/tables/Tables.html#edition_tables for details.

h3. Developer-Visible Changes

<span class="label label-info">IMPORTANT</span> Note that all plug-ins in the _Sirius Server_ feature (@org.eclipse.sirius.server.*@ and @org.eclipse.sirius.services.*@) are still considered experimental in this version. In particular, all APIs (Java, HTTP, WebSocket) they provide should be treated as provisional even if they are exposed publicly in @*.api.*@ packages. We reserve the right to modify them in incompatible ways even in future maintenance versions.

* <span class="label label-success">Added</span> Mechanism to ask user input on opening of a session with migrated resources if the session opening comes from a direct user action
** New available UI callback (@org.eclipse.sirius.tools.api.command.ui.UICallBack.askUserAndSaveMigratedSession(session)@) used to ask user if he wants to save the resources after migration and save them if necessary.
** New method to open session when this is due to a direct user action (@org.eclipse.sirius.business.api.session.SessionManager.openSession(sessionResourceURI, monitor, uiCallback, isDirectUserActionLoading)@). Previous version calls this new version with the value false for @isDirectUserActionLoading@ parameter
** New system preference to know if user want to be asked to save resources after automatic migration @org.eclipse.sirius.common.tools.api.constant.CommonPreferencesConstants.PREF_ASK_TO_SAVE_RESOURCE_AFTER_MIGRATION@
* <span class="label label-success">Added</span> @org.eclipse.sirius.migrationHandler@ extension point has been added. It allows to contribute migration process, mainly handle migration options.
* <span class="label label-info">Modified</span> Upgraded ELK version from 0.3.0 to 0.4.0, see the "ELK documentation":https://projects.eclipse.org/projects/modeling.elk/releases/0.4.0 for the list of changes in that version.
* <span class="label label-info">Modified</span> The Acceleo version has been changed from 3.7.2 to 3.7.4.
* <span class="label label-info">Modified</span> The class @SiriusFormatDataManagerForSemanticElements@ has been moved from package @org.eclipse.sirius.diagram.ui.tools.internal.format.semantic@ to @org.eclipse.sirius.diagram.ui.tools.api.format.semantic@.
* <span class="label label-danger">Removed</span> _EOperations_ @checkRule@ and @getMessage@ of @ValidationRule@ _EClass_ have been removed from @viewpoint@ metamodel. These operations were deprecated and useless since we used method of @org.eclipse.sirius.business.internal.metamodel.description.validation.operations.ValidationRuleOperations@ class.

h4. Changes in @org.eclipse.sirius.ui@

* <span class="label label-success">Added</span> @org.eclipse.sirius.ui.business.api.preferences.SiriusUIPreferencesKeys.PREF_DISPLAY_VSM_USER_FIXED_COLOR_IN_PALETTE@ has been added. Its default value is true. It allows to display, in the color palette, the user fixed color(defined in the activated viewpoints) in addition to standard colors. The color palette is available in Appearance tab of the Properties view.


h4. Changes in @org.eclipse.sirius.diagram.ui@

* <span class="label label-success">Added</span> Some specific services exist natively in Sirius and can be used to contribute new select all actions. Theses services are all in the class @org.eclipse.sirius.diagram.ui.tools.api.interpreter.StandardDiagramServices@:
** @stdGetViewsRepresentingSameEType(DSemanticDiagram, List<DSemanticDecorator>)@: Return the list of @DSemanticDecorator@ representing semantic element with same EType as the current selected diagram elements.
** @stdGetViewsWithSameMapping(DSemanticDiagram, List<DSemanticDecorator>)@: Return the list of @DSemanticDecorator@ having the same mappings as the current selected diagram elements.
** @stdGetViewsRepresentingSelectedType(DSemanticDiagram)@: Return the list of @DSemanticDecorator@ in the current diagram representing semantic element having the EType provided by the end-user through a dialog box. This dialog box can be improved. There is currently no completion, neither validation.
** @stdGetViewsOfExpression(DSemanticDiagram)@: Return the list of @DSemanticDecorator@ corresponding to the evaluation of an expression written by the end-user in a dialog box. This dialog box can be improved. There is currently no completion, neither validation.
* <span class="label label-success">Added</span> The query @isRepresentationLink()@ has been added in @org.eclipse.sirius.diagram.ui.business.api.query.ViewQuery@ to know if the view is a representation link or a normal note.
* <span class="label label-success">Added</span> The query @isRepresentationLinkBroken()@ has been added in @org.eclipse.sirius.diagram.ui.business.api.query.ViewQuery@ to know, for a representation link, if it refers to a deleted representation descriptor. Invocations should be guarded by @isRepresentationLink()@.
* <span class="label label-info">Modified</span> The interface @org.eclipse.sirius.diagram.ui.tools.api.figure.ViewNodeContainerFigureDesc@ has been moved to @org.eclipse.sirius.ext.gmf.runtime.gef.ui.figures@ package.
* <span class="label label-info">Modified</span> The interface @org.eclipse.sirius.diagram.ui.tools.api.figure.StyledFigure@ has been moved to @org.eclipse.sirius.ext.draw2d.figure@ package.
* <span class="label label-info">Modified</span> The interface @org.eclipse.sirius.diagram.ui.tools.api.figure.ITransparentFigure@ has been moved to @org.eclipse.sirius.ext.draw2d.figure@ package.
* <span class="label label-info">Modified</span> The interface @org.eclipse.sirius.diagram.ui.tools.api.figure.IRoundedCorner@ has been moved to @org.eclipse.sirius.ext.draw2d.figure@ package.
* <span class="label label-info">Modified</span> The interface @org.eclipse.sirius.diagram.ui.tools.api.figure.ImageFigureWithAlpha@ has been moved to @org.eclipse.sirius.ext.draw2d.figure@ package.
* <span class="label label-info">Modified</span> The interface @org.eclipse.sirius.diagram.ui.tools.api.figure.anchor.ZoomDependantAnchor@ has been moved to @org.eclipse.sirius.ext.gmf.runtime.gef.ui.figures.util@ package.
* <span class="label label-info">Modified</span> The interface @org.eclipse.sirius.diagram.ui.tools.api.figure.anchor.AnchorProvider@ has been moved to @org.eclipse.sirius.ext.gmf.runtime.gef.ui.figures.util@ package.
* <span class="label label-info">Modified</span> The class @org.eclipse.sirius.diagram.ui.tools.api.figure.ViewGradientFigureDesc@ has been moved to @org.eclipse.sirius.ext.draw2d.figure@ package.
* <span class="label label-info">Modified</span> The class @org.eclipse.sirius.diagram.ui.tools.api.figure.TransparentFigureGraphicsModifier@ has been moved to @org.eclipse.sirius.ext.draw2d.figure@ package.
* <span class="label label-info">Modified</span> The class @org.eclipse.sirius.diagram.ui.tools.api.figure.SiriusWrapLabel@ has been moved to @org.eclipse.sirius.ext.gmf.runtime.gef.ui.figures@ package.
* <span class="label label-info">Modified</span> The class @org.eclipse.sirius.diagram.ui.tools.api.figure.PolygoneAndPolylineDecoraction@ has been moved to @org.eclipse.sirius.ext.draw2d.figure@ package.
* <span class="label label-info">Modified</span> The class @org.eclipse.sirius.diagram.ui.tools.api.figure.ParallelogramFigure@ has been moved to @org.eclipse.sirius.ext.gmf.runtime.gef.ui.figures@ package.
* <span class="label label-info">Modified</span> The class @org.eclipse.sirius.diagram.ui.tools.api.figure.OneLineMarginBorder@ has been moved to @org.eclipse.sirius.ext.gmf.runtime.gef.ui.figures@ package.
* <span class="label label-info">Modified</span> The class @org.eclipse.sirius.diagram.ui.tools.api.figure.ODesignEllipseFigure@ has been moved to @org.eclipse.sirius.ext.draw2d.figure@ package.
* <span class="label label-info">Modified</span> The class @org.eclipse.sirius.diagram.ui.tools.api.figure.GaugeSectionFigure@ has been moved to @org.eclipse.sirius.ext.gmf.runtime.gef.ui.figures@ package.
* <span class="label label-info">Modified</span> The class @org.eclipse.sirius.diagram.ui.tools.api.figure.GaugeCompositeFigure@ has been moved to @org.eclipse.sirius.ext.gmf.runtime.gef.ui.figures@ package.
* <span class="label label-info">Modified</span> The class @org.eclipse.sirius.diagram.ui.tools.api.figure.DBorderedNodeFigure@ has been moved to @org.eclipse.sirius.ext.gmf.runtime.gef.ui.figures@ package.
* <span class="label label-info">Modified</span> The class @org.eclipse.sirius.diagram.ui.tools.api.figure.anchor.AirSlidableImageAnchor@ has been moved to @org.eclipse.sirius.ext.gmf.runtime.gef.ui.figures.util@ package.
* <span class="label label-info">Modified</span> The class @org.eclipse.sirius.diagram.ui.tools.api.figure.AlphaDropShadowBorder@ has been moved to @org.eclipse.sirius.ext.gmf.runtime.gef.ui.figures@ package.
* <span class="label label-info">Modified</span> The class @org.eclipse.sirius.diagram.ui.tools.api.figure.AirStyleDefaultSizeNodeFigure@ has been moved to @org.eclipse.sirius.ext.gmf.runtime.gef.ui.figures@ package.
* <span class="label label-info">Modified</span> The class @org.eclipse.sirius.diagram.ui.tools.api.figure.AirNoteFigure@ has been moved to @org.eclipse.sirius.ext.gmf.runtime.gef.ui.figures@ package.
* <span class="label label-info">Modified</span> The class @org.eclipse.sirius.diagram.ui.tools.api.figure.AirDefaultSizeNodeFigure@ has been moved to @org.eclipse.sirius.ext.gmf.runtime.gef.ui.figures@ package.
* <span class="label label-info">Modified</span> The class @org.eclipse.sirius.diagram.ui.tools.api.figure.AbstractTransparentRectangle@ has been moved to @org.eclipse.sirius.ext.draw2d.figure@ package.
* <span class="label label-info">Modified</span> The class @org.eclipse.sirius.diagram.ui.tools.api.figure.AbstractTransparentRectangle@ has been moved to @org.eclipse.sirius.ext.draw2d.figure@ package.
* <span class="label label-info">Modified</span> The class @org.eclipse.sirius.diagram.ui.tools.api.figure.AbstractTransparentNode@ has been moved to @org.eclipse.sirius.ext.gmf.runtime.gef.ui.figures@ package.
* <span class="label label-info">Modified</span> The class @org.eclipse.sirius.diagram.ui.tools.api.figure.AbstractTransparentImage@ has been moved to @org.eclipse.sirius.ext.gmf.runtime.gef.ui.figures@ package.
* <span class="label label-info">Modified</span> The class @org.eclipse.sirius.diagram.ui.tools.api.figure.AbstractTransparentEllipse@ has been moved to @org.eclipse.sirius.ext.draw2d.figure@ package.
* <span class="label label-info">Modified</span> The class @org.eclipse.sirius.diagram.ui.tools.api.figure.AbstractGeoShapePolygonFigure@ has been moved to @org.eclipse.sirius.ext.gmf.runtime.gef.ui.figures@ package.
* <span class="label label-info">Modified</span> An int parameter replace now the BackgroundStyle parameter into the class @org.eclipse.sirius.diagram.ui.tools.api.figure.GradientRoundedRectangle@. This parameter represents still the backgroundStyle in int format.

h4. Changes in @org.eclipse.sirius.diagram.sequence.ui@

* <span class="label label-info">Modified</span> The class @org.eclipse.sirius.diagram.sequence.ui.tool.internal.figure.HorizontalGuide@ has been moved to @org.eclipse.sirius.ext.draw2d.figure@ package.
* <span class="label label-info">Modified</span> The class @org.eclipse.sirius.diagram.sequence.ui.tool.internal.figure.CombinedFragmentInvisibleResizableCompartmentFigure@ has been moved to @org.eclipse.sirius.ext.gmf.runtime.gef.ui.figures@ package.
* <span class="label label-info">Modified</span> The class @org.eclipse.sirius.diagram.sequence.ui.tool.internal.figure.SequenceSlidableAnchor@ has been moved to @org.eclipse.sirius.ext.gmf.runtime.gef.ui.figures@ package.

h4. Changes in  @org.eclipse.sirius.common@

* <span class="label label-success">Added</span> The new preference @PREF_ASK_TO_SAVE_RESOURCE_AFTER_MIGRATION@ has been added in @CommonPreferencesConstants@. If true users will be asked to save the VSM or aird if it has been automatically migrated after a user action.
* <span class="label label-success">Added</span> The new @org.eclipse.sirius.common.tools.api.util.SiriusCopier@ has been added to provide the ability to copy an object without copying the attribute seen as id by EMF. If this id is not set by the factory or during object creation and if its concrete expected type is @String@, it is set during the copy using @org.eclipse.emf.ecore.util.EcoreUtil.generateUUID()@.

h4. Changes in @org.eclipse.sirius.tests.swtbot.support@

* <span class="label label-success">Added</span> The new method @AbstractSiriusSwtBotGefTestCase.changeSiriusCommonPreference(String, Boolean)@ has been added. It allows to change a preference defined in @oes.common@ plugin.

h4. Migrations

* <span class="label label-success">Added</span> A migration participant has been added to convert the serialized xmi:id to the technical id (uid attribut) for Sirius model elements of the .aird files (see "bugzilla #525261":https://bugs.eclipse.org/bugs/show_bug.cgi?id=525261 for more details). The corresponding version, stored in attribute version of viewpoint:DAnalysis of the aird file, is _14.1.0.201808300808_.
* <span class="label label-success">Added</span> A migration participant has been added to fix diagrams with corrupted Note, Text or Note Attachment (see "bugzilla #539550":https://bugs.eclipse.org/bugs/show_bug.cgi?id=539550 for more details). The corresponding version, stored in attribute version of viewpoint:DAnalysis of the aird file, is _14.1.0.201809271200_.
* <span class="label label-success">Added</span> A migration participant has been added to update existing representation link. (see "bugzilla #533175":https://bugs.eclipse.org/bugs/show_bug.cgi?id=535648 for more details). The corresponding version, stored in attribute version of viewpoint:DAnalysis of the aird file, is _14.1.0.201810111800_.
* <span class="label label-success">Added</span> A migration participant has been added to fix edge with multiple connector style (see "bugzilla #539944":https://bugs.eclipse.org/bugs/show_bug.cgi?id=539944 for more details). The corresponding version, stored in attribute version of viewpoint:DAnalysis of the aird file, is _14.1.0.201810161215_.

h2(#sirius6.0.0). Changes in Sirius 6.0.0

h3. User-Visible Changes

* <span class="label label-success">Added</span> A new feature allows user to insert vertical blank space in sequence diagram. You can refer to the "user documentation ":user/sequences/Sequence%20Diagrams.html#insert_vertical_blank_space for more details. 
* <span class="label label-success">Added</span> A new feature called "Generic Edge Creation Tool" allows to create an edge by starting to select the source and the target before choosing the concrete edge creation tool. That allows to restrict the list of possible edge creation tools (possibly only one edge or no one) according to the selected source and target.
!images/genericEdgeCreationTool.png!
*  <span class="label label-success">Added</span> A new feature called "Link Note" has been added. It is a special kind of note which references any existing representation in the project. It is possible to navigate to the target representation by double clicking on a link note. You can refer to the "user documentation":user/diagrams/Diagrams.html#notes for more details.
* <span class="label label-success">Added</span> The color palette for text, line and fill buttons, in appearance tab in properties view, has been enhanced. Before, when clicking on text, line or fill buttons, the available colors were only 12 arbitrary colors. Now, there are 50 maximum colors distributed in 10 columns. The displayed colors are
** a shading of black to white then,
** all fixed colors defined in VSM of all selected viewpoints and 
** the Sirius fixed colors following the colors of the rainbow.
!images/color_palette.png!

h3. Specifier-Visible Changes

* <span class="label label-success">Added</span> An action is added in main toolbar to reload the VSM of installed plug-ins that may have changed. Refer to the "specifier documentation":specifier/general/Specifying_Viewpoints.html#reloadVSM for details.
* <span class="label label-success">Added</span> In the VSM editor, when the cursor is inside an interpreted expression at a location which corresponds to a Java service invocation, hitting *F3* will navigate to the service implementation in a Java editor. See "the documentation":specifier/general/Writing_Queries.html#service_navigation for more details.
* <span class="label label-success">Added</span> Specifier can now define a background color for a diagram representation. It is possible by specifying color in the _Background_ property section of the _Diagram Description_. Pre-defined system colors and colors from the _User Color Palette_ are supported. See "the documentation":specifier/diagrams/Diagrams.html#diagram_description for details.
* <span class="label label-success">Added</span> A new experimental feature regarding layouting is available. It brings you the capabilities of ELK layouting framework. If installed you can specify in your VSM the layout algorithm triggered by arrange all button among the ELK algorithms. To get an overview of what is possible with ELK you can read this "article":https://blog.obeo.fr/a-picture-is-worth-a-thousand-words. To know how to use the ELK algorithms, read the "documentation":specifier/diagrams/Diagrams.html#useElk
* <span class="label label-info">Modified</span> Warning: Java service throwing an @OperationCanceledException@ with a message containing the specific key word "@-RT-@" has now a specific behavior. In this case, the @OperationCanceledException@ is rethrown to rollback the command if this Java service is called from an AQL expression or through the service interpreter. You can refer to "bugzilla 531487":https://bugs.eclipse.org/bugs/show_bug.cgi?id=531487 for more details.

h3. Developer-Visible Changes

* <span class="label label-info">Modified</span> The SWTBot test framework version has been upgraded toward SWTBot 2.6. The main impacts are described below:
** The way we retrieved some views by using @bot.viewByTitle@ (like "Problems" or "Error Log") may not work anymore. Use @bot.viewByPartName@ instead.
** @org.eclipse.swtbot.swt.finder.widgets.AbstractSWTBot.contextMenu(String)@ raise a @WidgetNotFoundException@ instead of a @TimeoutException@.
** The @org.eclipse.sirius.tests.swtbot.support.utils.dnd.DndUtil@ has been updated to be compatible with Oxygen and Photon platforms. Some methods may not work anymore on Neon platform.
* <span class="label label-info">Modified</span> Some changes have been done in the image export tooling. Main impacts are described below:
** The export of images, methods @org.eclipse.sirius.ui.tools.api.actions.export.ExportAction.execute@ and @org.eclipse.sirius.ui.tools.api.actions.export.ExportAction.createImageFiles@, do not open UI Dialogs anymore. It throws an @java.lang.reflect.InvocationTargetException@ that wraps the real cause of the error (@org.eclipse.sirius.ui.tools.api.actions.export.SizeTooLargeException@ or @java.lang.OutOfMemoryError@). Callers have to handle properly the exception.
** The mechanism allowing to authorize or forbid the export of an image, method @org.eclipse.sirius.diagram.ui.tools.api.part.DiagramEditPartService.isTooBig@, can now handle very large images that previously leads to incorrect exports.
* <span class="label label-danger">Removed</span> Since Sirius 5.0.0, @org.eclipse.sirius.ext.jface.viewers.IToolTipProvider@ is not used anymore to provide a tooltip on diagram element decorations defined in the VSM. The tooltip is defined directly with an interpreted expression on @GenericDecorationDescription@, @MappingBasedDecoration@ and @SemanticBasedDecoration@.

h4. Changes in @org.eclipse.sirius.common@

* <span class="label label-danger">Removed</span> The interface @org.eclipse.sirius.common.tools.api.interpreter.IExpressionProposal@ and its only implementation @DefaultExpressionProposal@ (in the same package) have been removed. They were not used anywhere, expression completion API is actually defined in package @org.eclipse.sirius.common.tools.api.contentassist@ which has its own types.

h4. Changes in @org.eclipse.sirius@

* <span class="label label-success">Added</span> The method @org.eclipse.sirius.business.api.componentization.ViewpointRegistry.reloadAllFromPlugins()@ has been added to reload, from the runtime, all the VSMs of installed plug-ins and have the effect dynamically in the runtime.
* <span class="label label-info">Modified</span> The class @org.eclipse.sirius.business.api.componentization.ViewpointRegistryImpl()@ has been moved to @org.eclipse.sirius.business.internal.componentization@ package.
* <span class="label label-danger">Removed</span> The whole @contribution@ metamodel, which lived in package @org.eclipse.sirius.description.contribution@, has been removed. It corresponded to an experimental feature which has been abandonned long ago.
* <span class="label label-danger">Removed</span> The whole @DRefreshable.refresh()@ EOperation has been removed from the metamodel, along with all its implementations. Client code that needs the functionality can use either @DialectManager.refresh()@ for @DRepesentations@ or the new @org.eclipse.sirius.diagram.tools.api.command.view.RefreshSiriusElement.refresh(DRefreshable)@ static method for diagram elements (@DRefreshable.refresh()@ was a no-op for elements of other dialects). 
* <span class="label label-danger">Removed</span> The @org.eclipse.sirius.viewpointSpecificationModel@ extension point has been removed. It was part of the same experimental feauture and not actually used in practice.
* <span class="label label-danger">Removed</span> In @org.eclipse.sirius.business.api.session.danalysis.DAnalysisSessionHelper@, the method @getViewpointSelection()@ has been removed. It used an internal type as argument which has also been removed.
* <span class="label label-danger">Removed</span> In @org.eclipse.sirius.business.api.helper.SiriusResourceHelper@, the method @getCorrespondingViewpoint(Session session, URI, boolean)@ has been removed. It was not used anywhere, the real one is @getCorrespondingViewpoint(Session, Viewpoint)@ in the same class.
* <span class="label label-danger">Removed</span> In @org.eclipse.sirius.business.api.dialect.DialectServices@ (and all its implementations), the method @refreshEffectiveRepresentationDescription(DRepresentation, IProgressMonitor)@ has been removed. It corresponded to an experimental feature which has been abandonned long ago. 
* <span class="label label-success">Added</span> A new @ToolSection@, @ToolGroup@  and @ToolInstance@ model element have been added in @viewpoint@ metamodel. These elements are used to represent tools available for a @DDiagram@ with their visibility, enabling and filtering status. @ToolSectionInstance@ are available in the @UIState@ of a @DDiagram@ by using the @toolSections@ reference. 
* <span class="label label-danger">Removed</span> the class @ToolFilterDescriptionListener@ has been removed because of the new @ToolMangament@ mechanism used to handle tools and layer changes.

h4. Changes in @org.eclipse.sirius.diagram@

* <span class="label label-success">Added</span> @org.eclipse.sirius.diagram.tools.api.preferences.SiriusDiagramPreferencesKeys.PREF_DISPLAY_GENERIC_EDGE_CREATION_TOOL@ has been added to make to possible to hide the new generic edge creation tool. See the _User-Visible Changes_ or the user documentation for more details.
* <span class="label label-success">Added</span> A component @ToolManagement@ has been created to manage tool availability and status for a given @DDiagram@. It comes with the listener interface @ToolChangeListener@ that can be used to be warned about tool changes.
* <span class="label label-success">Added</span>  An interface @ToolConstants@ has been created to gather constants relative to tool management.
* <span class="label label-info">Modified</span> The constants @SiriusDiagramPaletteFactory#GENERIC_CONNECTION_CREATION_TOOL@ and @SiriusDiagramPaletteFactory#TOOL_NOTEATTACHMENT@ have been moved in @ToolConstants@
* <span class="label label-info">Modified</span> The classes @ToolFilter@ and @ToolFilterFromDescription@ have been moved from the plugin @oes.diagram.ui@ to @oes.diagram@ in package @org.eclipse.sirius.diagram.tools.api.managment@

h4. Changes in @org.eclipse.sirius.diagram.ui@

* <span class="label label-success">Added</span> @org.eclipse.sirius.diagram.ui.tools.api.editor.tabbar.AbstractTabbarContributor.createStraightenContribution()@ has been added to make accessible the creation of the Straighten To tabbar contribution item.

* <span class="label label-success">Added</span> @org.eclipse.sirius.diagram.ui.customLayoutAlgorithmProvider@ extension point has been added. It allows to contribute layout algorithms that can be configured directly in the VSM. This extension point comes with the following classes as API: @org.eclipse.sirius.diagram.ui.api.layout.CustomLayoutAlgorithmProvider@, @org.eclipse.sirius.diagram.ui.api.layout.CustomLayoutAlgorithm@, @org.eclipse.sirius.diagram.ui.api.layout.EnumChoice@ and @org.eclipse.sirius.diagram.ui.api.layout.LayoutOptionFactory@.

* <span class="label label-info">Modified</span> The methods @hideLayer(Layer)@, @showLayer(Layer)@, @addToolFilter(ToolFilter)@ and @removeToolFilter(ToolFilter)@ of @org.eclipse.sirius.diagram.ui.tools.api.graphical.edit.palette.PaletteManager@ have been made deprecated. They are not used anymore. The API @ToolManagement@ is now the entry point to make palette update regarding tools and layer changes.

* <span class="label label-info">Modified</span> The @Diagram@ parameter of the methods @oes.update(Diagram)@ and @oes.update(Diagram,boolean)@ has been changed to @DDiagram@.

h4. Changes in @org.eclipse.sirius.ui@

* <span class="label label-danger">Removed</span> The class @org.eclipse.sirius.ui.business.api.viewpoint.ViewpointSelectionDialog@ has been removed.

h4. Changes in @org.eclipse.sirius.tests.junit.support@

* <span class="label label-success">Added</span> @org.eclipse.sirius.tests.support.api.TestsUtil.isBeforeOxygenPlatform()@ has been added to detect if the current platform corresponds to a version before Oxygen.
* <span class="label label-info">Modified</span> A @String@ parameter has been added to the method @org.eclipse.sirius.tests.support.api.TestsUtil.setTargetPlatform()@. This new parameter corresponds to the plug-in name from where the tests are currently launched (for example @org.eclipse.sirius.tests.swtbot.Activator.PLUGIN_ID@). It avoids to build a wrong target platform containing each Sirius plug-ins twice. 

h4. Changes in @org.eclipse.sirius.tests.swtbot.support@

* <span class="label label-danger">Removed</span> The method @org.eclipse.sirius.tests.swtbot.support.utils.dnd.DndUtil#dragAndDrop(AbstractSWTBot<? extends Widget>, AbstractSWTBot<? extends Widget>)@ has been removed. When explicit drop coordinates are not needed, use the standard SWTbot @org.eclipse.swtbot.swt.finder.widgets.AbstractSWTBot.dragAndDrop(AbstractSWTBot<? extends Widget>)@ method instead. 

h4. Migrations

* <span class="label label-success">Added</span> A migration participant has been added to fix diagram with note attachment corrupted (see "bugzilla #533177":https://bugs.eclipse.org/bugs/show_bug.cgi?id=533177 for more details). The corresponding version, stored in attribute version of viewpoint:DAnalysis of the aird file, is _13.0.0.201804031646_.

h4. Translation Keys Changes

h2(#sirius5.1.1). Changes in Sirius 5.1.1

h3. User-Visible Changes

* <span class="label label-info">Modified</span> When exporting a diagram as an image, it is now possible to choose an image size level. Before this, a preference called _AutoScale_ was available and when it was enable, the diagram was scaled to the maximum size safely allowed by the system. Now, a new preference named _Size of exported images_ is available in the _Sirius > Sirius Diagram_ preference page and offer this possibility. Setting size to _Max_ generates same diagrams as by using the previous preference _AutoScale_. This can produce image with big size in long generation time. If _Size of exported images_ is set to level _Nominal_, diagram will be exported with nominal size (quality will be lower but export time will be shorter). This new preference allows you to choose the tradeoff you want. The "user documentation ":user/diagrams/Diagrams.html#Exportingimages details this change with an example. 
* <span class="label label-info">Modified</span> The "_Auto Size_" action can now be applied on region container. Before that, the action was available only for regions.
* <span class="label label-info">Modified</span> The "_Make Same Size_" action can now be applied on region container. If selected region containers have the same number of regions, the regions will have the same size. If the region container used for reference has more regions than the other(s), the last region of others will have the size of all remaining regions in the one used for reference.
* <span class="label label-info">Modified</span> In diagrams, the selection by drawing a rectangle on container (using ALT key) now has the same behaviors than selection by drawing a rectangle on the diagram's background. You can refer to _Selection_ section of the "Standard Tools":user/diagrams/Diagrams.html#standardToolId chapter for more details on this tool.

h3. Developer-Visible Changes

h4. Changes in @org.eclipse.sirius@

* <span class="label label-success">Added</span> The method @org.eclipse.sirius.business.api.query.SiriusReferenceFinder.of(EObject)@ has been added to provide an easy way to get the @SiriusReferenceFinder@ from an @EObject@ in the Sirius @Session@. 
* <span class="label label-info">Modified</span> (experimental) The method @org.eclipse.sirius.business.api.query.SiriusReferenceFinder.getReferencingSiriusElements(Collection<EObject>, SearchScope)@. The SearchScope.LOADED_REPRESENTATIONS_SCOPE scope covers the search and result scope. Then, no additional resource will be loaded using this scope.

h4. Changes in @org.eclipse.sirius.diagram.ui@

* <span class="label label-warning">Deprecated</span> Preference @PREF_SCALE_DIAGRAMS_ON_EXPORT@ from @org.eclipse.sirius.diagram.ui.tools.api.preferences.SiriusDiagramUiPreferencesKeys@ is now deprecated. User should use new preference @org.eclipse.sirius.ui.business.api.preferences.SiriusUIPreferencesKeys@: @PREF_SCALE_LEVEL_DIAGRAMS_ON_EXPORT@.
* <span class="label label-success">Added</span> A new attribute @margin@ has been added in @org.eclipse.sirius.diagram.ui.business.api.DiagramExportResult@. This attribute indicates what margin has been used to produce a white frame during diagram export. This attribute is available from the getter @getMargin()@. A new constructor is also available to pass on the margin @org.eclipse.sirius.diagram.ui.business.api.DiagramExportResult.DiagramExportResult(DDiagram, double, int, Collection<IPath>)@. 
* <span class="label label-info">Modified</span> If you previously override the default Sirius value for @SiriusDiagramUiPreferencesKeys.PREF_SCALE_DIAGRAMS_ON_EXPORT@, you must replace this override by an override of the new preference @SiriusUIPreferencesKeys.PREF_SCALE_LEVEL_DIAGRAMS_ON_EXPORT@. Example: 
pre.. SiriusEditPlugin.getPlugin().getPreferenceStore().setDefault(SiriusUIPreferencesKeys.PREF_SCALE_LEVEL_DIAGRAMS_ON_EXPORT.name(),0); 

h4. Changes in @org.eclipse.sirius.ui@

* <span class="label label-success">Added</span> A new preference has been added to @org.eclipse.sirius.ui.business.api.preferences.SiriusUIPreferencesKeys@: @PREF_SCALE_LEVEL_DIAGRAMS_ON_EXPORT@. It is used to control the scaling level behavior when exporting diagrams. Refer to the JavaDoc for the details. 
* <span class="label label-success">Added</span> The type @org.eclipse.sirius.ui.business.api.dialect.ExportFormat@ has a new attribute representing the scaling level to use for diagram export. It is defined by an integer type. Refer to the JavaDoc for details on its meaning.

h4. Changes in @org.eclipse.sirius.tests.junit.support@

* <span class="label label-success">Added</span> The method @SiriusTestCase.loadModeler(URI, EditingDomain)@ allows to load the VSM at the specified URI and register all its Viewpoints in the current testcase. There is a new method, @org.eclipse.sirius.tests.support.api.SiriusTestCase.loadModeler(URI, EditingDomain, boolean)@, to allow to load the VSM at the specified URI without registering its viewpoints. It can be useful to load a VSM for an editing domain of another session than the current session of the
testcase.

h2(#sirius5.1.0). Changes in Sirius 5.1.0

h3. User-Visible Changes

* <span class="label label-success">Added</span> When exporting a diagram as an image, it is now possible to choose whether or not the diagram should be scaled. If disabled, the diagram will be exported with its normal size (equivalent to a 100% zoom level). If auto-scaling is enabled, the diagram will be scaled to the maximum size safely allowed by the system (this can be different on different OSes). Note that when auto-scaling is enabled, the image files produced may be larger than without. When exporting very large diagrams it is also possible that the diagram will be scaled _down_ (i.e. with a zoom level smaller than 100%). Enabling auto-scaling can be chosen on a case by case basis from the export dialog; the initial value in the dialog can be controlled by a new preference available in the _Sirius > Sirius Diagram_ preference page.
* <span class="label label-success">Added</span> The end user can now "remove all bend-points":user/diagrams/Diagrams.html#RemoveBendpoints on rectilinear edges. It was only possible on oblique edges before. This action is available on edge context menu "Remove Bend-points" or by using the shortcut "Ctrl" + "Shift" + "-". If number of bend-points can not be reduced, remove action will be inefficient.
* <span class="label label-success">Added</span> The status Synchronized/Unsynchronized of the diagram is now displayed in the status bar when the diagram editor has the focus or can be directly displayed "in the diagram":user/diagrams/Diagrams.html#synchronized_diagram with a decorator.
* <span class="label label-success">Added</span> The user now have a drop down menu in the tabbar with all available straighten to edge actions. 
* <span class="label label-success">Added</span> Straighten to actions on edge are now available even if the selection contains incompatible elements (edge labels for example). Their execution affects only compatible edges.
* <span class="label label-success">Added</span> Four new straighten actions are available (with top pinned, with bottom pinned, with left pinned, with right pinned) and allow to straighten edges from the opposed straightening axis point of view.
* <span class="label label-info">Modified</span> In a diagram, when selecting an edge or a node that are not fully displayed in the editor, now, the reveal is not done anymore, that is, the displayed content of the editor is not moved anymore. If the user want to fully see the selected element, he may drag the editor content using center mouse button. 
* <span class="label label-info">Modified</span> In a diagram with _snapToGrid_ enabled:
** When performing a drag and drop from the model explorer or a palette tool to the diagram, the new created element is now snapped to the grid.
** When performing an _Arrange all_ or an _Arrange Linked Border Node_ action, all diagram elements are now snapped to the grid.
** When performing a drag and drop or a tool that will create multiple elements, all created elements are still visible but now snapped to the grid. 
** When creating an edge with a tool that also create the associated border nodes, the border nodes are now snapped near the click location. Before, they were created to respect a shortest path.
!./images/borderNodesWithSnapToGrid.png! 
* <span class="label label-info">Modified</span> In a sequence diagram, it is now possible to resize the combined fragment when the first or the last operand is selected (increase the size of the first operand to the top, or increase the size of the last operand to the bottom). Before, it was necessary to select the combined fragment itself to resize it. 
* <span class="label label-info">Modified</span> In a sequence diagram, it is now possible to resize an _Execution_ contained in an _Operand_ without previously resize its _Operand_ if more space is needed. The _Operand_, and if necessary the _Combined Fragment_, is resized too.
* <span class="label label-info">Modified</span> In a diagram, the action _Show/Hide label_ is now visible even if the selection contains invalid elements (ie elements without label). The action is applied only on valid elements of the selection.
* <span class="label label-info">Modified</span> In a diagram, the Line Style actions (Tree, Oblique or Rectilinear Routing Style) is now visible in the contextual menu even if the selection contains invalid elements (other elements than edges). The action is applied only on valid elements of the selection.
* <span class="label label-info">Modified</span> When an user defines a custom bundled image shape for a figure ("bundleImageShape":developer/extensions-provide_custom_bundled_image_shape.html#bundleImageShape ), opening or refreshing a diagram will not display exception anymore when the bundleImageShape extension is not valid. A warning is now displayed in the Error Log view to inform user of which attribute of the extension is not correct.

h3. Specifier-Visible Changes

* <span class="label label-success">Added</span> An "automatic migration":./user/general/Modeling%20Project.html#Migration has been added in this version to fix diagram with edge labels corrupted (see "bugzilla #518870":https://bugs.eclipse.org/bugs/show_bug.cgi?id=518870 for more details). Contrary to all previous migrations, this one logs an information in the _Error Log_ view to inform how many labels have been fixed in concerned diagrams. If detected as "corrupted label", the label is reset to its default location (as if you launch the "Snap Back" action of it). If at least one label is detected as "corrupted label", the layout is also potentially corrupted (nodes, children of the diagram, with x or y coordinate very big). In this case, the concerned nodes are moved near 5000 (or -5000) as new coordinate. A message is added in this case: _Some nodes have also been moved as the layout of this diagram is corrupted. A Reset Origin and/or manual layout is probably needed for this diagram._ The rules applied to detect a corrupted label are the following:
** If the label is less than 250 pixels away from the reference point on its corresponding edge, the label is not considered as distant.
** If the label is more than 1000 pixels away from the reference point on its corresponding edge, the label is considered as distant.
** Between these 2 limits, the label is considered as distant if the distance between the center of the label and the edge is higher than "four times the size of the nearest segment".
* <span class="label label-info">Modified</span> In manual refresh mode (_Automatic Refresh_ Sirius preference disabled), when the _Force Refresh_ option of a tool is enabled in your VSM, only the current representation is refreshed when the tool is applied. Before this version, all open representations were refreshed.
* <span class="label label-info">Modified</span> The filtering expression variables available in the properties view definition in the 'Extends' tab were renamed to match the following pattern: featureName+'Description'.
* <span class="label label-info">Modified</span> The _Reference Name_ field of _Create instance_ completion will display only features with a consistent type with the one specified in _Type Name_ field (if a type has been specified).
* <span class="label label-info">Modified</span> The _Type Name_ field of _Create instance_ completion will display only types consistent with the feature type specified in _Reference Name_ field (if a valid feature has been specified).

h3. Developer-Visible Changes

h4. Migrations

* <span class="label label-success">Added</span> A migration has been added to fix diagram with edge labels corrupted (see "bugzilla #518870":https://bugs.eclipse.org/bugs/show_bug.cgi?id=518870 for more details). The corresponding version, stored in attribute version of viewpoint:DAnalysis of the aird file, is _12.1.0.201706291600_.
* <span class="label label-success">Added</span> A new class @org.eclipse.sirius.ext.gmf.runtime.gef.ui.figures.SiriusDefaultSizeNodeFigure@ has been added in plugin @org.eclipse.sirius.ext.gmf.runtime@. The goal of the class is to workaround a "GMF bug":https://bugs.eclipse.org/bugs/show_bug.cgi?id=519250. So if you have created class which inherits from @org.eclipse.gmf.runtime.gef.ui.figures.DefaultSizeNodeFigure@, you must now use the new @SiriusDefaultSizeNodeFigure@ instead.
* <span class="label label-success">Added</span> A migration has been added to add an @uid@ to all instances of type DRepresentation. This @uid@ is used to reference the DRepresentation from the DRepresentationDescriptor. @DRepresentationDescriptor.repPath@ has been changed to have @uid@ as fragment. The corresponding version, stored in attribute version of viewpoint:DAnalysis of the aird file, is _12.1.0.201707281200_.
* <span class="label label-success">Added</span> A migration has been added to fix diagram with edge bend-points corrupted (see "bugzilla #519044":https://bugs.eclipse.org/bugs/show_bug.cgi?id=519044 for more details). The corresponding version, stored in attribute version of viewpoint:DAnalysis of the aird file, is _12.1.0.201708031200_.

h4. Translation Keys Changes

See "this document":i18n_changes.html#sirius51 for the complete list of message keys added or removed in Sirius 5.0.

h4(#replazyloading). Representations lazy loading (experimental).

A new mode (currently experimental) is available to load representations on demand and not during session opening. This feature implies to serialize Sirius representations in separate resources. This mode can be activated by setting the system property @createLocalRepresentationInSeparateResource@ at true. For more detail, see the developer documentation: "Representations lazy loading (experimental)":./developer/representations_lazy_loading.html.

h4. Changes in @org.eclipse.sirius@

* <span class="label label-success">Added</span> A new convenience static method has been added on the @org.eclipse.sirius.business.api.session.Session@ interface to retrieve the session an arbitrary @EObject@ is part of: @Optional<Session> s = Session.of(myObject);@. It returns a @java.util.Optional<Session>@ so all the usual patterns apply, e.g. @Session.of(obj).ifPresent(s -> doSomething(s));@.
* <span class="label label-success">Added</span> @org.eclipse.sirius.viewpoint.DRepresentationDescriptor.isLoadedRepresentation()@ has been added to know if the representation linked with this {@link DRepresentationDescriptor} is loaded. By default, all representations are held in the same resource than the DRepresentationDescriptor, in that case the method will always return true.
* <span class="label label-success">Added</span> @org.eclipse.sirius.business.api.session.danalysis.DAnalysisSession.allAnalyses()@ has been added in the interface to reflect the already existing @org.eclipse.sirius.business.internal.session.danalysis.DAnalysisSessionImpl.allAnalyses()@ implementation.
* <span class="label label-success">Added</span> @org.eclipse.sirius.business.api.dialect.DialectManager.getLoadedRepresentations(EObject, Session)@ has been added to get all loaded representations in the given session with the given EObject as target.
* <span class="label label-success">Added</span> @org.eclipse.sirius.business.api.dialect.DialectServices.getAllLoadedRepresentations(Session)@ has been added to get all loaded representations in the given session.
* <span class="label label-success">Added</span> @org.eclipse.sirius.business.api.helper.SiriusUtil.REPRESENTATIONS_FOLDER_NAME@ constant has been added. This is the default folder where representations file (*.srm) are located if the system property "createLocalRepresentationInSeparateResource" is set at true.
* <span class="label label-success">Added</span> @org.eclipse.sirius.tools.api.command.ui.UICallBack.shouldDeleteRepresentation(Set<DRepresentationDescriptor>)@ has been added to be called when the user interface should prompt for a choice about the representation deletion.
* <span class="label label-success">Added</span> (experimental) The new API @org.eclipse.sirius.business.api.query.SiriusReferenceFinder@ and @org.eclipse.sirius.business.api.query.EObjectQuery.getSiriusReferenceFinder()@ method to get it have been added. This API allows getting the DRepresentations or DRepresentationElements that reference the provided semantic object. It also allows getting the DRepresentationDescriptor which associated DRepresentation is or contains elements that reference the provided semantic object. This API will be useful for "representation lazy loading":#replazyloading as it may, in the future, not need to load all not yet loaded representations. For now, the use of this API will load all not loaded representations.
* <span class="label label-danger">Removed</span> @org.eclipse.sirius.business.api.dialect.DialectServices.getRepresentationDescriptors(EObject, Session)@ has been moved to @org.eclipse.sirius.business.api.dialect.DialectManager@.
* <span class="label label-danger">Removed</span> @org.eclipse.sirius.business.api.dialect.DialectServices.getAllRepresentationDescriptors(Session)@ has been moved to @org.eclipse.sirius.business.api.dialect.DialectManager@.
* <span class="label label-danger">Removed</span> @org.eclipse.sirius.business.api.dialect.DialectServices.getRepresentationDescriptors(RepresentationDescription, Session)@ has been moved to @org.eclipse.sirius.business.api.dialect.DialectManager@.
* <span class="label label-danger">Removed</span> The implementations of @getRepresentationDescriptors(EObject, Session)@, @getAllRepresentationDescriptors(Session)@ and @getRepresentationDescriptors(RepresentationDescription, Session)@ have been removed from @AbstractRepresentationDialectServices@. They are implemented in @DialectManagerImpl@.
* <span class="label label-danger">Removed</span> @org.eclipse.sirius.business.api.dialect.DialectServices.getRepresentations(EObject, Session)@ has been moved to @org.eclipse.sirius.business.api.dialect.DialectManager@
* <span class="label label-danger">Removed</span> @org.eclipse.sirius.business.api.dialect.DialectServices.getAllRepresentations(Session)@ has been moved to @org.eclipse.sirius.business.api.dialect.DialectManager@
* <span class="label label-danger">Removed</span> @org.eclipse.sirius.business.api.dialect.DialectServices.getRepresentations(RepresentationDescription, Session)@ has been moved to @org.eclipse.sirius.business.api.dialect.DialectManager@
* <span class="label label-danger">Removed</span> The implementations of @getRepresentations(EObject, Session)@, @getAllRepresentations(Session)@ and @getRepresentations(RepresentationDescription, Session)@ have been removed from @AbstractRepresentationDialectServices@. They are implemented in @DialectManagerImpl@.

h4. Changes in @org.eclipse.sirius.common@

* <span class="label label-success">Added</span> @org.eclipse.sirius.common.tools.api.util.LazyCrossReferencer.setEObjectToBeIgnored(Predicate<EObject>)@ has  been added to filter inverse references to prevent some references resolution.
* <span class="label label-info">Modified</span> @org.eclipse.sirius.common.tools.api.util.WorkspaceUtil.getFilesFromWorkspace(Collection<IProject>, String)@ signature has been modified in @getFilesFromWorkspace(Collection<IContainer>, String)@ to be more generic.

h4. Changes in @org.eclipse.sirius.diagram@

* <span class="label label-success">Added</span> A new query has been added in @org.eclipse.sirius.diagram.business.api.query.DDiagramQuery@. This query, @getAllActivatedLayers@, returns all the activated layers (transient or not) of the given diagram. It should replace @DDiagram.getActivatedLayers@ in several cases if you directly use it.

h4. Changes in @org.eclipse.sirius.diagram.ui@

* <span class="label label-success">Added</span> Three new preferences have been added to @org.eclipse.sirius.diagram.ui.tools.api.preferences.SiriusDiagramUiPreferencesKeys@: @PREF_SCALE_DIAGRAMS_ON_EXPORT@, @PREF_MAXIMUM_EXPORT_BUFFER_SIZE@, @PREF_MAXIMUM_EXPORT_BUFFER_SIZE_WINDOWS@. They are used to control the auto-scaling behavior when exporting diagrams. Refer to the JavaDoc for the details.
* <span class="label label-success">Added</span> In @org.eclipse.sirius.diagram.ui.tools.api.part.DiagramEditPartService@, two new methods have been added:
** @setAllowDownScaling(boolean)@: when auto-scaling is enabled (which is controlled by the already existing @setAutoScalingEnabled()@), this is used to control if down-scaling is allowed or not. 
** @getScalingFactor()@: after the export has been performed, this can be used to obtain the scaling factor that was effectively used.
* <span class="label label-success">Added</span> The class @org.eclipse.sirius.diagram.ui.business.api.DiagramExportResult@ has been added, which inherits from @ExportResult@. It is returned by the @DialectManager.exportWithResult()@ methods when the representation exported is a diagram, and in addition to the information provided by @ExportResult@ gives access to the scaling factor that was used when exporting the diagram.
* <span class="label label-success">Added</span> The new preference @org.eclipse.sirius.diagram.ui.tools.api.preferences.SiriusDiagramUiPreferencesKeys.PREF_SHOW_SYNCHRONIZE_STATUS_DECORATOR@ has been added to say if the "synchronize status":user/diagrams/Diagrams.html#synchronized_diagram decorator must be shown or not.
* <span class="label label-success">Added</span> A new method @checkShapesIntersect()@ has been added in @org.eclipse.sirius.diagram.ui.business.api.query.ConnectionEditPartQuery@ to check if source and target of the connection intersect (only intersect - not one contained in another).

h4. Changes in @org.eclipse.sirius.ext.emf.edit@

* <span class="label label-info">Modified</span> @org.eclipse.sirius.ext.emf.edit.EditingDomainServices@ does not use @Collection@ anymore as return type or parameter type in its services. @java.util.Collection@ has been replaced by @java.util.List@. As mentioned in the "specifier documentation":./specifier/general/Writing_Queries.html#service_methods, it is recommended to use List or Set instead of Collection in java services signature.

h4. Changes in @org.eclipse.sirius.ui@

* <span class="label label-success">Added</span> In @org.eclipse.sirius.ui.tools.api.dialogs.AbstractExportRepresentationsAsImagesDialog@ a new method @isAutoScaleDiagram()@ has been added to indicate (once the dialog has been closed) if the user has requested to enable auto-scaling on diagram export. 
* <span class="label label-success">Added</span> In @org.eclipse.sirius.ui.tools.api.actions.export.ExportAction@, a new method @setAutoScaleDiagram(boolean)@ to ask for automatic scaling of diagrams on export.
* <span class="label label-success">Added</span> In @org.eclipse.sirius.ui.business.api.dialect.DialectUIServices@, two new methods @exportWithResult()@ have been added. They are equivalent to the existing @export()@ methods (which return @void@) except that they return an instance of the new type @org.eclipse.sirius.ui.business.api.dialect.ExportResult@. This gives access to the list of all the actual files produced by the export operation. Note that in the case of the diagram dialect, @exportWithResult()@ actually returns a more specific @DiagramExportResult@ with additional diagram-specific information.
* <span class="label label-success">Added</span> The type @org.eclipse.sirius.ui.business.api.dialect.ExportFormat@ has a new attribute representing the scaling policy to use for diagram. It is defined by a new enumerated type @ExportFormat.ScalingPolicy@ which can have four different values: @WORKSPACE_DEFAULT@, @AUTO_SCALING@, @NO_SCALING@, @AUTO_SCALING_IF_LARGER@. Refer to the JavaDoc for details on their meanings.
* <span class="label label-success">Added</span> @org.eclipse.sirius.ui.tools.api.wizards.CreateEMFModelWizard@ is a new wizard that can be invoked to create instances of any metamodel. It will ask the end-user for a metamodel (@EPackage@), a concrete type to instanciate as root element, and finally the local path of the file to create. See the class Javadoc for sample usage. Note that the first two pages of the wizard (EPackage and root type selection) can be customized through the @org.eclipse.sirius.common.package_meta_data@ extension point to provide user-oriented name and documentation for an EPackage, and to suggest specific EClasses as good root candidates.
* <span class="label label-success">Added</span> @org.eclipse.sirius.ui.tools.api.command.AbstractSWTCallback.shouldDeleteRepresentation(Set<DRepresentationDescriptor>)@ default implementation has been added to prompt the confirm dialog.
* <span class="label label-success">Added</span> @org.eclipse.sirius.ui.business.api.session.SessionEditorInput.SessionEditorInput(URI, URI, String, Session)@ has been added to provide the @DRepresentationDescriptor@ URI to retrieve the @DRepresentation@ from the @DRepresentationDescriptor.getRepresentation()@ method instead of performing a direct load.
* <span class="label label-info">Modified</span> The org.eclipse.sirius.ui.tools.api.assist.TextContentProposalProvider.getSelectedElement() method is now protected instead of private to let sub-classes retrieving the selected element.

h4. Changes in @org.eclipse.sirius.ui.editor@

* <span class="label label-success">Added</span> New classes have been added in package @org.eclipse.sirius.ui.editor.api.pages@. They are the following: @AbstractSessionEditorPage@, @PageProvider@, @PageUpdateCOmmand@, @PositioningKind@, @PageUpdateCommandFactory@. These classes allow to provide custom pages to session editor instances.
* <span class="label label-success">Added</span> An extension point @org.eclipse.sirius.ui.editor.sessionEditorPageProvider@ has been added to allow custom page providing for session editor instances.

