h1. Release Notes for Older Version of Sirius

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

This document contains the release notes for older versions of of Sirius.

h2(#sirius6.4.1). Changes in Sirius 6.4.1

This is service release to fix two issues which were not detected in time for 6.4.0. The issues only impact a new API which was introduced in 6.4.0 (Bug 563117 - _Copy format to existing/new diagram based on source to target semantic elements mapping_).

Users who want to use this specific feature are encouraged to move to 6.4.1. The bugs have zero impact on the rest of Sirius so there is no need to update if you do not use this specific API.

h2(#sirius6.4.0). Changes in Sirius 6.4.0

<span class="label label-info">Important</span> In order to reduce the maintenance burden of Sirius, we have decided to deprecate some older mechanisms for which there exist better alternatives. In Sirius 6.4.x all of these are still available, but they may be removed in future versions
(6.5 or 7.0) without further notice. If any of these planned removals are an issue for you, please "open a ticket":https://bugs.eclipse.org/bugs/enter_bug.cgi?product=Sirius so we can discuss options.

The features which are deprecated starting from 6.4.0 are:

* **Exporting diagrams as GIF, BMP or PDF**. We will focus on PNG and JPG support for raster formats, and SVG for vector formats. If you need another image format, use an external tool to do the conversion.
* **OCL expressions in VSMs (@odesign@ files)**, as supported by the @org.eclipse.sirius.common.ocl@ plug-in. Use AQL expressions instead.
* **The "Workflow" feature**. Workflow was experimental and to our knowledge not used in practice. This corresponds to the @org.eclipse.sirius.workflow.*@ and @org.eclipse.sirius.editor.workflow@ plug-ins.
* **The server parts which supported the Workflow feature**. It was our first experiment in moving Sirius to the web, but this is now replaced by the newly published "Sirius Web":https://www.eclipse.org/sirius/sirius-web.html. This corresponds to all the @org.eclipse.sirius.server.*@ plug-ins.

Also note that Sirius 6.4 is still compatible with Java 8, but we may move to Java 11 (LTS) in 2021. Eclipse 2020-09 already requires Java 11 to start, and Java 8 is quite old at this point. When we move to Java 11 we will drop support for Eclipse versions older than 2020-09. Again, if that is an issue for you, please open a ticket so we can discuss it.

Sirius 6.4 is officially supported on Eclipse 2020-03 to 2020-12, with Eclipse 2020-06 being the reference platform (where the tests are run and verified). It most likely works fine with any Eclipse from 2019-06 onward, but this is not guaranteed.

h3. User-Visible Changes

* <span class="label label-success">Added</span> With a non modeling project (a.k.a. legacy project), a "Invalid representations" section is displayed under the aird node. It is displayed only if a representation is invalid in the Sirius Session.

h3. Specifier-Visible Changes

Several improvements have been done concerning ELK integration. This feature is always considered as experimental (because several bugs remain). Additional documentation is available "here":specifier/diagrams/Diagrams.html#useElk .

h3. Developer-Visible Changes

* <span class="label label-success">Added</span> @org.eclipse.sirius.ui.tools.api.dialogs.AnalysisSelectorFilteredItemsSelectionDialog@ has been created in order to have custom analysis selector provider able to modify the analysis selector dialog.
* <span class="label label-success">Added</span> The method @org.eclipse.sirius.tools.api.command.ui.UICallBack.askUserToRefreshTheDiagram()@ has been added. It is used to ask the user to refresh the representation when something wrong happens when opening the editor. This method allows to skip the UI part.
* <span class="label label-success">Added</span> The method @org.eclipse.sirius.ui.business.api.dialect.DialectEditor.isLastRepresentationRefreshSucceeded()@ to know if the last refresh done in the editor has succeeded.
* <span class="label label-info">Modified</span> Upgraded ELK version from 0.6.1 to 0.7.0, see the "ELK documentation":https://projects.eclipse.org/projects/modeling.elk/releases/0.7.0 for the list of changes in that version (and previous).

h4. Changes in  @org.eclipse.sirius@

* <span class="label label-info">Modified</span> The method  @org.eclipse.sirius.business.api.session.danalysis.DAnalysisSelectorProvider.getPriority()@ has been added. It is used in @org.eclipse.sirius.business.api.session.danalysis.DAnalysisSelectorService.getSelector(DAnalysisSession)@ to ensure that the right DAnalysisSelector is used. The DAnalysisSelector is searched first with the DAnalysisSelectorProvider with higher priority.

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

* <span class="label label-success">Added</span> A new method, @org.eclipse.sirius.common.tools.api.util.CommandStackUtil.flushOperations(CommandStack)@ has been added to flush the command stack. By default the @CommandStack.flush()@ "disposes all the commands in the stack". Concretely, it removes the default context from the list of contexts of all operations. And operations without context, after this, are removed from history. In several cases, it is not enough. The @ResourceUndoContext@ must also be removed. This is what this method done to really removed operations from IOperationHistory. This method was already used in @org.eclipse.sirius.business.internal.session.danalysis.DAnalysisSessionImpl@, it has been extracted from here.
* <span class="label label-success">Added</span> A new query, @org.eclipse.sirius.common.tools.api.query.IllegalStateExceptionQuery.isAConnectionLostException()@, has been added to detect a specific kind of @IllegalStateException@. In a collaborative environment, Obeo Designer Team Edition or Team For Capella for example, when the data is hosted on a server, the connection with the server can be lost. Sirius is not ready to handle this context. If Sirius tries to access to data, for example with an async refresh of the UI that needs information from data to be refreshed, a @org.eclipse.net4j.util.lifecycle.LifecycleException@ is thrown with the message @"Not active: CDOTransactionImpl"@. This kind of errors is showed to the end-user instead of silently be caught. Indeed, in this situation, the UI should be refreshed with "blank data" instead of displaying an "incomprehensible" popup to the end-user. This new query allows to detect this specific case. The template to use it is:

bc.. 
try {
    //code to protect
} catch (IllegalStateException e) {
    if (new IllegalStateExceptionQuery(e).isAConnectionLostException()) {
        // Generally catch silently the exception
    } else {
        throw e;
    }
}

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

* <span class="label label-success">Added</span> A new method, @getDefaultDimension()@ has been added in @org.eclipse.sirius.diagram.ui.edit.api.part.AbstractDiagramElementContainerEditPart()@. This method was already used previously in Sirius but was private. It is now public and is used for example for having information during ELK layout.
* <span class="label label-success">Added</span> A new method, @layoutEditParts(List, IAdaptable, boolean)@ has been added in @org.eclipse.sirius.diagram.ui.tools.api.layout.provider.AbstractLayoutProvider@. It allows for implementations to do specific code according to the arrangeAll or arrangeSelection aspect when layoutEditParts is called. By default, the code called is the same than the @org.eclipse.gmf.runtime.diagram.ui.services.layout.AbstractLayoutEditPartProvider.layoutEditParts(List, IAdaptable)@ implementation.
* <span class="label label-success">Added</span> A new method, @useStandardArrangeSelectionMechanism()@ has been added in @org.eclipse.sirius.diagram.ui.api.layout.CustomLayoutAlgorithm@ to know if a specific layout algorithm relies on the behavior of @org.eclipse.sirius.diagram.ui.tools.internal.layout.provider.ArrangeSelectionLayoutProvider@. Previously, this was the case for all layout algorithm but it can be useful to disable it (for ELK layout for example). This method is associated with @org.eclipse.sirius.diagram.ui.api.layout.CustomLayoutAlgorithm.CustomLayoutAlgorithmBuilder.setStandardArrangeSelectionMechanism(boolean)@
* <span class="label label-success">Added</span> A new API in @org.eclipse.sirius.diagram.ui.tools.api.format.MappingBasedSiriusFormatManagerFactory@ has been added to make it possible to apply a copy-paste format to an existing or a new diagram with different semantic targets. This API receives a mapping between the source and target semantic elements to retrieve which graphical element in the target diagram corresponds to the one in source diagram. See the "developer":developer/copy_paste_format_new_semantic.html documentation for more details. *NOTE:* The initial version of this new API available in Sirius 6.4.0 has a few issues that have been fixed in 6.4.1. If you wan to leverage this new API you are encouraged to use Sirius 6.4.1.

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

* <span class="label label-success">Added</span> A new method, @preClose()@ has been added in @org.eclipse.sirius.ui.business.api.dialect.DialectEditor@. This method is called in sync when the editor is asking to be closed (the real closure is done in async). This allows to dispose actions, for example, as soon as the closure is requested. There is a default implementation, that does nothing, for all dialect editors.

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

* <span class="label label-success">Added</span> New methods have been added to @org.eclipse.sirius.tests.support.api.TestsUtil@ to check the current Java runtime version. The parameter is the expected version of Java, i.e: ...7, 8, 9, ..., 13, 14, ...
** @isJavaVersion(int)@
** @isJavaVersionOrOlder(int)@
** @isJavaVersionOrNewer(int)@
* <span class="label label-success">Added</span> The method @org.eclipse.sirius.tests.support.api.SiriusTestCase.waitSaveSessionJob()@ has been added to ensure that the SaveSessionJob, potentially triggered by @org.eclipse.sirius.ui.business.internal.session.SaveSessionWhenNoDialectEditorsListener.statusChangedInternal(Collection<ResourceStatusChange>)@ is finished before continue. It can be call, for example, after changing the list of selected viewpoints, without any editor opened.

h2(#sirius6.3.2). Changes in Sirius 6.3.2

h3. User-Visible Changes

* <span class="label label-info">Modified</span> In diagrams, the display of the label of the compartments has been improved. When there is not enough space to display the label of the compartment container or the contained compartments, it is displayed on multiple lines. Refer to "Compartment section":user/diagrams/Diagrams.html#Compartments for more information.
A consequence is that the display of existing compartments in diagrams may be changed. When refreshing the existing diagram, the project may become dirty.
* <span class="label label-info">Modified</span> In Sirius 6.3.1, the behavior for the labels of operands, in sequence diagrams, has been changed. Since Sirius 6.3.1, they are drawn on top of the rest of the diagram elements so that they are always completely visible. Since Sirius 6.3.2, this is now the same for labels of combined fragment. Indeed, the problem was the same:

  !images/combined_fragment_label_before.png!

  With Sirius 6.3.2, the label is now on the top of execution:

  !images/combined_fragment_label_after.png!

h3. Developer-Visible Changes

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

* <span class="label label-success">Added</span> In the @org.eclipse.sirius.common.package_meta_data@ extension point, it is now possible for a given metamodel (nsURI) to declare some EClasses as potential DocumentRoots. This is needed with some XSD-derived metamodels which normally declare some of their containment references as transient to make sure Sirius will properly consider these classes (and their contents) as needing to be serialized. 

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

* <span class="label label-success">Added</span>The class @org.eclipse.sirius.diagram.ui.graphical.figures.OverlayLabelsDrawerFigure@ is a "virtual" figure that should be added to the @DDiagramRootEditPart#OVERLAY_LAYER@ and which paints all the overlay labels (instance of @OverlayLabel@) on top of the rest of the diagram to make sure they are always readable. This figure is currently only used by sequence diagrams for operand labels(@org.eclipse.sirius.diagram.sequence.ui.tool.internal.edit.part.OperandEditPart@) and combined fragment labels (@org.eclipse.sirius.diagram.sequence.ui.tool.internal.edit.part.CombinedFragmentEditPart@). 
* <span class="label label-success">Added</span> The class @org.eclipse.sirius.diagram.ui.graphical.figures.OverlayLabel@ is a special label that can be painted or not, on the OVERLAY layer, depending on the current context/layer.
* <span class="label label-success">Added</span> A new field, @useOverlayLabel@, has been added in @org.eclipse.sirius.diagram.ui.edit.api.part.AbstractDiagramElementContainerEditPart@. Its value can be changed with @setUseOverlayLabel(boolean)@ and accessed through @useOverlayLabel()@. This new field allows to use an @OverlayLabel@ for the figure of this edit part.
* <span class="label label-success">Added</span> A new constructor has been added for class @org.eclipse.sirius.diagram.ui.tools.api.figure.GradientRoundedRectangle@ to allow the use of @OverlayLabel@ for this kind of figure (@GradientRoundedRectangle(Dimension, int, View, boolean)@).

h2(#sirius6.3.1). Changes in Sirius 6.3.1

*IMPORTANT NOTE:* Sirius 6.3.1 includes a change in internal data structures used to store diagrams which is not backward-compatible with previous versions, including Sirius 6.3.0. In practice this means that once opened and saved with Sirius 6.3.1, @aird@ files can no longer be opened with Sirius 6.3.0 or earlier.

h3. User-Visible Changes

* <span class="label label-success">Added</span> A new type of jump link has been added in Sirius 6.3.1. As reminder, a jump link is a way to graphically improve the way how 2 edges intersect. This new type is graphically represented by a blank line instead of the classical "jump". This new type is documented in the "Appearance":user/diagrams/Diagrams.html#Appearance section of edge Properties view.
* <span class="label label-success">Added</span> New preferences have been added to allow to override the default values of jump links properties. They are documented in the "Connections":user/diagrams/Diagrams.html#Connections section of the Preferences.
* <span class="label label-info">Modified</span> When the end-user changes the routing style of an edge into Oblique style (from a different style), the edge is now transformed into an oblique line without intermediate bendpoints.
* <span class="label label-info">Modified</span> In sequence diagrams, the labels of operands (sections inside combined fragments) could be partially hidden by other diagram elements, for exemple executions:

  !images/operand_label_before.png!


  They are now drawn on top of the rest of the diagram elements so that they are always completely visible:


  !images/operand_label_after.png!
  
* <span class="label label-danger">Removed</span> The feature concerning the capability to move labels on border of node, or border node, all around the node, added in 6.3.0, has been reverted. There are unexpected side effects (wrong location after a rename of a label for example).

h3. Developer-Visible Changes

* <span class="label label-info">Modified</span> Upgraded ELK version from 0.5.0 to 0.6.1, see the "ELK documentation":https://projects.eclipse.org/projects/modeling.elk/releases/0.6.1 for the list of changes in that version (and previous).
* <span class="label label-info">Modified</span> Sirius now requires GMF Notation & Runtime 1.13.0.
* <span class="label label-info">Modified</span> @org.eclipse.sirius.diagram.ui.tools.api.graphical.edit.styles.SimpleStyleConfiguration.isShowIcon(DDiagramElement, IGraphicalEditPart)@ is now protected instead of private.

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

* <span class="label label-success">Added</span> New preferences key have been added in @org.eclipse.sirius.diagram.tools.api.preferences.SiriusDiagramCorePreferences@:
** @PREF_JUMP_LINK_ENABLE_OVERRIDE@: Id of the preference that says if the override of jump links preferences is enabled or not.
** @PREF_JUMP_LINK_ENABLE_OVERRIDE_DEFAULT_VALUE@: Default value for override of jump link preference, equals to @false@.
** @PREF_JUMP_LINK_STATUS@: Id of the preference used to know the default jump link status if the override of connection jump links preferences is enabled.
** @PREF_JUMP_LINK_STATUS_DEFAULT_VALUE@: Default value of above preference, equals to @JumpLinkStatus#NONE@.
** @PREF_JUMP_LINK_TYPE@:  Id of the preference used to know the default jump link type if the override of connection jump links preferences is enabled.
** @PREF_JUMP_LINK_TYPE_DEFAULT_VALUE@: Default value of above preference, equals to @JumpLinkType#SEMICIRCLE@.
** @PREF_REVERSE_JUMP_LINK@: Id of the preference used to know if reverse of the jump link is enabled or not,  if the override of connection jump links preferences is enabled.
** @PREF_REVERSE_JUMP_LINK_DEFAULT_VALUE@: Default value for reverse jump link preference, equals to @false@.

h4. Migrations

* <span class="label label-success">Added</span> A migration participant has been added only to change the version of the model. Indeed, if the new value "Tunnel" of GMF jump link type is used, see "User-Visible Changes" in "Sirius 6.1.3":Release_Notes.html#sirius6.3.1, the model will be invalid for an older version of Sirius. The corresponding version, stored in attribute version of viewpoint:DAnalysis of the aird file, is _14.3.1.202003101500_.
* <span class="label label-info">Modified</span> The migration participant @LabelOnBorderMigrationParticipant@ has been updated to revert the effect of itself. This migration participant has been added in Sirius 6.3.0 according to buzgilla "550382":https://bugs.eclipse.org/bugs/show_bug.cgi?id=550382. The new feature added in this bugzilla was imperfect so it is decided to revert it. The new corresponding version, stored in attribute version of viewpoint:DAnalysis of the aird file, is _14.3.1.202003261200_.

h4. Translation Keys Changes

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

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 <a href="https://projects.eclipse.org/projects/modeling.elk/releases/0.5.0" target="_blank">ELK documentation</a> 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 <a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=550436" target="_blank">#550436</a>).

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 <a href="https://www.eclipse.org/legal/epl-2.0/" target="_blank">version 2.0 of the Eclipse Public License</a>, 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 <a href="https://www.eclipse.org/legal/epl-2.0/faq.php" target="_blank">the official FAQ</a> 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_.

h4. Translation Keys Changes

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

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.obeosoft.com/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

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

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.

h2(#sirius5.0.1). Changes in Sirius 5.0.1

Sirius 5.0.1 is a maintenance release with only bugfixes and small tweaks to the UI of "the aird editor":user/general/Aird_Editor.html.

h2(#sirius5.0.0). Changes in Sirius 5.0.0

h3. User-Visible Changes

* <span class="label label-success">Added</span> An new _aird editor_ is available on _.aird_ files. It provides an alternative, form-based GUI to visualize and manipulate sirius sessions which is not tied to the Modeling perspective or Model Explorer view. See "the editor's documentation":user/general/Aird_Editor.html for more details.
* <span class="label label-info">Modified</span> The label alignment of Notes from the Palette has been modified from Juno to Luna or newer versions of Eclipse. The label alignment had changed from _TOP_ & _CENTER_ to _MIDDLE_ & _LEFT_ (respectively). The initial alignment (_TOP_ & _CENTER_) has been restored. This is done with an "automatic migration":./user/general/Modeling%20Project.html#Migration of the aird file.
* <span class="label label-info">Modified</span> The _Export diagram as images_ action now adatps the output resolution based on the diagram size. This leads to better resolution for small to medium diagrams (and also bigger file) and to an operation which is no longer failing with out of memory errors in case of very big diagrams.
* <span class="label label-info">Modified</span> The "straighten to" actions previously had a limitation concerning overlap detection. This is no longer the case. The previous known limitation has been removed from the documentation (__In case of multi-selection, the overlap check is done in the current context of existing border nodes and not in the context of location of border nodes after each straighten edges.__).
* <span class="label label-info">Modified</span> Decorators on diagram elements are drawn on top of other figures. If there is an overlap between a decorator of a figure A and another figure B that is over figure A, when user clicks on the decorator, the figure B is now selected (before it was the parent figure A).

h3. Developer-Visible Changes

h3. Specifier-Visible Changes

* <span class="label label-success">Added</span> It is now possible to automatically create one or several pre-configured widget(s) in a group if its domain class and if the meta-models of the properties view containing it have been specified. The widget(s) created will be infered from the features in the domain class (e.g. a properly configured _Checkbox_ widget will be created for boolean attributes).
* <span class="label label-success">Added</span> Property Views definitions now support extending and overriding Properties View Descriptions without modifying the original. See "the documentation":specifier/properties/Properties_View_Description.html#extensibility_features for details.
* <span class="label label-success">Added</span> New model operations are available. You can now open a "dialog":specifier/general/Model_Operations.html#dialog or a "wizard":specifier/general/Model_Operations.html#wizard thanks to new dedicated model operations leveraging the Properties View language. You can also create new variable with the new _Let_ model operation, see its "documentation":specifier/general/Model_Operations.html#let for more details.
* <span class="label label-success">Added</span> In Property Views definitions, you can now create _Toolbar Actions_ on pages and groups in order to define small buttons in their toolbars.
* <span class="label label-success">Added</span> _Buttons_ and _Widget Actions_ can now use an image along with a label thanks to the new _Image expression_.
* <span class="label label-success">Added</span> It is now possible to execute some behavior when the end users will click on the _Reference Widget_ thanks to the addition of an _Initial Operation_.
* <span class="label label-success">Added</span> You can indicate that a _Dynamic Mapping For_ should force the refresh of the user interface with the _Force Refresh_ property.
* <span class="label label-success">Added</span> _Categories_ have been added in order to organize the pages and groups of the _Properties_ DSL.
* <span class="label label-info">Modified</span> The notion of transient layer has been introduced in Sirius 5.0. (Refer to "Sirius Specifier":specifier/diagrams/Diagrams.html#Transientlayer and "Sirius User":user/diagrams/Diagrams.html#transientLayer documentation in Diagram chapter). A transient layer is an additional layer containing only decorations or tools. If you have such layer in your VSM, users may encounter some unexpected behaviors. If the layer is not _active by default_, its activation state will not be persisted at session close. In other words, if a transient layer is enabled in a diagram and then the session is closed, at the next diagram opening, the layer will be disabled. If users have existing representations file, made with previous version, with such kind of layers activated, they will no longer enabled at the next opening in Sirius 5.0.0. If the layer is _active by default_ then it will be automatically applied when opening your diagram. We consider this behavior as a known limitation and an enhancement may be done in a further release. In the meantime, there is a workaround which consists to add a fake mapping (that is any mapping with its fields empty) so that the layer will not be considered as transient.
* <span class="label label-info">Modified</span> The tab used to configure the metamodels used by the Properties view description is now using the same interface as the metamodels tab used to configure the representations.
* <span class="label label-info">Modified</span> The @package::Class@ syntax for domain classes and type names in the VSM is now fully supported and the new default. It means this syntax is interpreted by Sirius and completion is provided for it when the first @:@ character is entered. The legacy syntax @package.Class@ is still supported for compatibility.
* <span class="label label-info">Modified</span> The organization of the contextual actions in the odesign for the _Properties_ DSL has been improved.
* <span class="label label-info">Modified</span> Most of the concepts of the _Properties_ DSL can now have an identifier, a label and some documentation.

h4. Migrations

* <span class="label label-success">Added</span> A migration is added in this version to fix the alignment of the text in notes (as explained in user visible changes). The corresponding version, stored in attribute version of viewpoint:DAnalysis of the aird file, is _12.0.0.201704070000_.

h4. Translation Keys Changes

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

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

* <span class="label label-success">Added</span> @org.eclipse.sirius.common.tools.api.util.SiriusCrossReferenceAdapterImpl.setFeatureToBeCrossReferencedWhiteList(Collection<EReference>)@ to set a white list of references that must be referenced even if the reference is derived.
* <span class="label label-success">Added</span> @org.eclipse.sirius.common.tools.api.util.SiriusCrossReferenceAdapterImpl.isIncluded(EReference)@ has been overridden to consider features in the white list.
* <span class="label label-success">Added</span> A new extension point, @org.eclipse.sirius.common.package_meta_data@ has been added. It can be used to associate user-oriented meta-data to Ecore metamodels, identified by their @nsURI@: a user-oriented name/label (as opposed to the technical nsURI), a (short) description/documentation, and a list of suggested EClasses defined in the EPackage that are good candidates as root model elements. These meta-data are currently used only in the generic model creation wizard integrated in the aird editor.

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

* <span class="label label-danger">Removed</span> The @org.eclipse.sirius.common.ui.tools.api.dialog.FeatureEditorDialog@ class has been removed; use the @org.eclipse.emf.edit.ui.celleditor.FeatureEditorDialog@ equivalent provided by EMF directly instead.

h4. Changes in @org.eclipse.sirius@ 

* <span class="label label-success">Added</span> An experimental mode to serialize representations in a different file is available with system property @createRepresentationInSeparateResource=true@. That means all new representations will be saved, when this property is enabled, in a separate file with @*.srm@ extension.
* <span class="label label-success">Added</span> The method @org.eclipse.sirius.business.api.dialect.DialectServices.canCreate(EObject, RepresentationDescription, boolean)@ has been added to better control the checks done by already existing @org.eclipse.sirius.business.api.dialect.DialectServices.canCreate(EObject, RepresentationDescription)@ method. The new boolean allow to deactivate the check verifying that the viewpoint of the given description must be activated so the method can return true.
* <span class="label label-success">Added</span> The @org.eclipse.sirius.viewpoint.description.DAnnotation.references@ feature has been added. It allows to have some information without having to search them into the entire model of the Sirius session. Ideally only elements from semantic resources of the session should be referenced or else it may broke the session behavior either because resolving too soon EObject in the session or because adding a resource that is not known by Sirius session.
* <span class="label label-success">Added</span> @org.eclipse.sirius.business.api.query.EObjectQuery.getImpactedRepDescriptorFromDAnnotationData()@ method has been added to help retrieve the @DRepresentationDescriptors@ which owned @DAnnotation@ are referencing a given @EObject@ with @DAnnotation.references@.
* <span class="label label-success">Added</span> @org.eclipse.sirius.viewpoint.DRepresentationDescriptor#repPath@ attribute has been added to hold the representation path since the @org.eclipse.sirius.viewpoint.DRepresentationDescriptor#representation@ feature is derived. This attribute is not intended to be modified by client. You should use @org.eclipse.sirius.viewpoint.DRepresentationDescriptor.setRepresentation(DRepresentation)@ or @org.eclipse.sirius.viewpoint.DRepresentationDescriptor.updateRepresentation(DRepresentation)@ instead.
* <span class="label label-success">Added</span> @org.eclipse.sirius.viewpoint.DRepresentationDescriptor.updateRepresentation(DRepresentation)@ has been added to update the repPath attribute according to the given representation. This method is intended to be called if the representation instance is still the same but requires to recompute the repPath.
* <span class="label label-success">Added</span> @org.eclipse.sirius.business.api.query.FileQuery.isSrmFile()@ has been added to indicate if the file extension is dedicated to a file containing representations.
* <span class="label label-success">Added</span> @org.eclipse.sirius.dRepresentationLocationRule@ extension point has been added to customize the resource location of new representations. See "Provide representation location rule (experimental)":extensions-provide_representation_location_rule.html for more details.
* <span class="label label-success">Added</span> @org.eclipse.sirius.business.api.session.danalysis.DRepresentationLocationRule@ interface has been added to provide a customized rule to the @org.eclipse.sirius.dRepresentationLocationRule@ extension point.
* <span class="label label-success">Added</span> @org.eclipse.sirius.business.api.helper.SiriusUtil.REPRESENTATION_FILE_EXTENSION@ constant has been added to reference the new *.srm extension.
* <span class="label label-success">Added</span> @org.eclipse.sirius.business.api.session.Session.getSrmResources()@ has been added to provide the list of representation resources (serialized as *.srm files by default).
* <span class="label label-success">Added</span> @org.eclipse.sirius.business.api.query.ResourceQuery.isAirdOrSrmResource()@ has been added to know whether the resource is a srm resource (@org.eclipse.sirius.business.api.query.ResourceQuery.isSrmResource()@) or an aird resource.
* <span class="label label-success">Added</span> @org.eclipse.sirius.business.api.query.ResourceQuery.isSrmResource()@ has been added to know whether the resource contains a @DRepresentation@ as root element.
* <span class="label label-success">Added</span> @org.eclipse.sirius.diagram.ui.tools.api.migration.DiagramCrossReferencer.DiagramCrossReferencer(Collection<Resource>)@ constructor has been added to compute the cross references on a list of resources.
* <span class="label label-success">Added</span> A new @org.eclipse.sirius.modelOperationManager@ extension point has been addded. It allows the contribution of new types of _Model Operations_ which are then usable in modeler definitions (@*.odesign@).
* <span class="label label-info">Modified</span> @org.eclipse.sirius.viewpoint.DRepresentationDescriptor#representation@ feature is now derived, transient and volatile. The representation is compute by using the @org.eclipse.sirius.viewpoint.DRepresentationDescriptor#repPath@ attribute.
* <span class="label label-info">Modified</span> The @org.eclipse.sirius.business.api.query.DViewQuery.getAllContentInRepresentations(Predicate<? super EObject>)@ now takes a @java.util.Predicate@ (from Java 8) as argument instead of a @com.google.common.base.Predicate@.
* <span class="label label-info">Modified</span> The extension point @org.eclipse.sirius.ui.modelingprojectresourcelistener@ is no longer expected to be used. It is an internal extension point. Clients using this extension point to ignore some files as potential semantic models must now use the extension point @org.eclipse.sirius.resourceStrategy@. This extension point existed before Sirius 5.0.0 but was not API. It becomes API with Sirius 5.0.0, see the "developer documentation":developer/extensions-provide_resource_strategy.html for more details.
** If you used to override protected methods @boolean isPotentialSemanticResource(IFile)@ and @boolean isLoadableModel(IFile, Session)@ of class @org.eclipse.sirius.ui.tools.api.views.modelexplorerview.resourcelistener.DefaultModelingProjectResourceListener@, you can now create a @resourceStrategy@ of type @org.eclipse.sirius.business.api.resource.strategy.ResourceStrategy.ResourceStrategyType.SEMANTIC_RESOURCE@ and respectively override @boolean isPotentialSemanticResource(URI)@ and @boolean isLoadableModel(URI,Session)@. As a reminder, to get an URI from an IFile, you can use: @URI.createPlatformResourceURI(iFile.getFullPath().toString(), true)@. And to get an IFile from an URI, you can use: @ResourcesPlugin.getWorkspace().getRoot().getFile(new Path(uri.toPlatformString(true)))@.
** If you used to override protected methods @boolean isRepresentationsModel(IFile)@ and @boolean isVsmModel(IFile)@ of class @org.eclipse.sirius.ui.tools.api.views.modelexplorerview.resourcelistener.DefaultModelingProjectResourceListener@, they no longer exist. They correspond to core API and is not supposed to be overridden. They are accessible through API @org.eclipse.sirius.business.api.query.FileQuery.FileQuery(IFile)@.
** All necessary classes for extension point @org.eclipse.sirius.resourceStrategy@ are now APIs:
*** @org.eclipse.sirius.business.api.resource.strategy.ResourceStrategyRegistry@: Registry to have access to all overridable services through a @ResourceStrategy@
*** @org.eclipse.sirius.business.api.resource.strategy.ResourceStrategy@: Interface implemented by all resource strategies
*** @org.eclipse.sirius.business.api.resource.strategy.AbstractResourceStrategyImpl@: Default implementation of above interface. All resource strategies contributed with the extension need to extend it.
*** @org.eclipse.sirius.business.api.resource.strategy.LegacyReleaseResourceStrategyImpl@ (previously named @DefaultResourceStrategyImpl@): A resource strategy with the code used before the optimization concerning the @org.eclipse.sirius.business.api.resource.strategy.ResourceStrategy.ResourceStrategyType.RELEASE_RESOURCE_AT_RESOURCESET_DISPOSE@. It is not used but can be quickly contributed by someone that want the previous behavior (before Sirius 4.0.0 M6).
* <span class="label label-danger">Removed</span> The already deprecated constructor of @org.eclipse.sirius.business.api.control.SiriusUncontrolCommand@ with signature @SiriusUncontrolCommand(EObject, boolean, IProgressMonitor)@ has been removed; instead, use the alternate constructor with an additional explicit @boolean shouldEndBySaving@ parameter (set it to @true@ to obtain the same behavior as the removed constructor).
* <span class="label label-danger">Removed</span> In @org.eclipse.sirius.business.api.dialect.DialectServices@, methods @canCreateIdentifier@ and @createIdentifier@ have been removed.
* <span class="label label-danger">Removed</span> The @org.eclipse.sirius.business.api.dialect.identifier@ package and all its content (@AbstractRepresentationElementIdentifier@ and @RepresentationElementIdentifier@) have been removed.

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

* <span class="label label-success">Added</span> Two new methods have been added to the interface @org.eclipse.sirius.ui.business.api.viewpoint.ViewpointSelection.Callback@: @selectViewpoint(Viewpoint, Session, boolean, Set<Viewpoint>, IProgressMonitor)@ and @deselectViewpoint(Viewpoint, Session, Set<Viewpoint>, IProgressMonitor)@. These methods add a new parameter that is a set of viewpoints compared to the same methods without these parameters. These set contains all viewpoints that will be deactivated/activated in addition of the one that is asked to be deactivated/activated. It allows the callback implementation to better handle viewpoint dependencies interaction by being able to know if missing dependencies will be activated or deactivated.
* <span class="label label-success">Added</span> An interface @org.eclipse.sirius.ui.business.api.editor.ISiriusEditor@ has been added to gather @org.eclipse.sirius.ui.editor.SessionEditor@ and @org.eclipse.sirius.ui.business.api.dialect.DialectEditor@ under the same abstraction. It allows to provide @org.eclipse.sirius.ui.business.api.session.IEditingSession@ saving functionalities for session editor or any new editor that is not a dialect editor. 
* <span class="label label-success">Added</span> A method @getSiriusEditors()@  has been added to interface @org.eclipse.sirius.ui.business.api.session.IEditingSession@. It allows to retrieve all @org.eclipse.sirius.ui.business.api.editor.ISiriusEditor@ that are registered in the session.
* <span class="label label-success">Added</span> The method @org.eclipse.sirius.ui.business.api.dialect.DialectUIServices.refreshEditor(DialectEditor, IProgressMonitor)@ has been added to allow specifiers to do a full refresh of its dialect editor easily.
* <span class="label label-success">Added</span> The method @org.eclipse.sirius.ui.tools.api.color.VisualBindingManager.getDefaultFontWithRuntimeSizeAndFromLabelFormat(List<FontFormat>)@ has been added to allow to retrieve a font using the given format and the default Sirius font (arial) and the runtime height.
* <span class="label label-success">Added</span> The method @org.eclipse.sirius.ui.tools.api.color.VisualBindingManager.getFontFromNameAndLabelFormatAndWithDefaultSize(List<FontFormat>, String)@ has been added to allow to retrieve a font using the given format and the given font name and the runtime height.
* <span class="label label-success">Added</span> The method @org.eclipse.sirius.ui.tools.api.wizards.page.ViewpointsSelectionWizardPage.setBrowserMinWidth(int)@ has been added to allow modification of the minimum width (with default value "0") of the browser part of the viewpoint selection wizard.
* <span class="label label-success">Added</span> The method @org.eclipse.sirius.ui.tools.api.wizards.page.ViewpointsSelectionWizardPage.setColumnWidthEquality(boolean)@ has been added to allow modification of column width equality (with default value "false") of the root composite of the viewpoint selection wizard.
* <span class="label label-success">Added</span> The method @org.eclipse.sirius.ui.tools.api.color.VisualBindingManager.getDefaultFontWithRuntimeSizeAndFromLabelFormat(List<FontFormat>)@ has been added to allow to retrieve a font using the given format and the default Sirius font (arial) and the runtime height.
* <span class="label label-success">Added</span> The method @org.eclipse.sirius.ui.tools.api.color.VisualBindingManager.getFontFromNameAndLabelFormatAndWithDefaultSize(List<FontFormat>, String)@ has been added to allow to retrieve a font using the given format and the given font name and the runtime height.
* <span class="label label-success">Added</span> The method @org.eclipse.sirius.ui.tools.api.dialogs.AbstractExportRepresentationsAsImagesDialog.isExportDecorations()@ has been added to know if decorations are displayed in the exported image.
* <span class="label label-success">Added</span> @org.eclipse.sirius.ui.business.api.dialect.DialectUIServices.export(DRepresentation, Session, IPath, ExportFormat, IProgressMonitor, boolean)@ method has been added. Compared to the previous method signature, the boolean parameter @exportDecorations@ has been added to allow to choose if the diagram element decorations will be exported or not.
* <span class="label label-info">Modified</span> The boolean parameter @exportDecorations@ has been added to @org.eclipse.sirius.ui.tools.api.actions.export.ExportAction.ExportAction(Session, Collection<DRepresentation>, IPath, ImageFileFormat, boolean, boolean)@ constructor. It allows to choose if the diagram element decorations will be exported or not.
* <span class="label label-info">Modified</span> The method @attachEditor(DialectEditor)@ from the interface @org.eclipse.sirius.ui.business.api.session.IEditingSession@ has its parameter type modified from @DialectEditor@ to the new abstraction @ISiriusEditor@ to provide saving capabilities with other editors than the dialect ones.
* <span class="label label-info">Modified</span> The method @detachEditor(DialectEditor)@ from the interface @org.eclipse.sirius.ui.business.api.session.IEditingSession@ has its parameter type modified from @DialectEditor@ to the new abstraction @ISiriusEditor@ to provide saving capabilities with other editors than the dialect ones.
* <span class="label label-info">Modified</span> The method @detachEditor(DialectEditor, boolean)@ from the interface @org.eclipse.sirius.ui.business.api.session.IEditingSession@ has its first parameter type modified from @DialectEditor@ to the new abstraction @ISiriusEditor@ to provide saving capabilities with other editors than the dialect ones.
* <span class="label label-info">Modified</span> The method @org.eclipse.sirius.ui.tools.api.assist.TextContentProposalProvider.getContentContext(String, int)@ has been made protected instead of private to allow to use it for sub types.
* <span class="label label-info">Modified</span> The method @org.eclipse.sirius.ui.tools.api.assist.TextContentProposalProvider.removeDuplicatedProposals(List<ContentProposal>)@ has been made protected instead of private to allow to use it in sub types.
* <span class="label label-info">Modified</span> The method @org.eclipse.sirius.ui.tools.api.project.ModelingProjectManager.createLocalRepresentationsFile(IProject, IProgressMonitor)@ has its return type changed from @void@ to @Session@ to allow callers to have access to the newly created session directly.
* <span class="label label-info">Modified</span> The method @org.eclipse.sirius.ui.tools.api.views.ViewHelper.getContentProvider()@ has been renamed into @createContentProvider()@ and now returns a new instance on each invocation.
* <span class="label label-danger">Removed</span> The old _Model Request Interpreter_ view is not available anymore. It is superseded by the _Interpreter_ view, which comes from the Acceleo project but does not actually depend on Acceleo or AQL and can be installed separately (using the feature @org.eclipse.acceleo.ui.interpreter@, which is available directly from the Sirius update-sites). The corresponding interface @org.eclipse.sirius.ui.tools.api.views.interpreterview.InterpreterView@ has been removed. Technically, the implementation code for the old _Model Request Interpreter_ view is still present if needed during the transition, but not exposed or used anywhere. It will be removed in a future version. 

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

* <span class="label label-success">Added</span> The utility class @org.eclipse.sirius.diagram.business.api.helper.decoration.DecorationHelper@ has been added. It provides @updateDecorations(List<Layer>)@ and @updateAllDecorations@ methods that allow to update only decorations in a diagram.
* <span class="label label-info">Moved</span> The method @org.eclipse.sirius.diagram.business.api.refresh.IRefreshOverride.aroundRefresh(DDiagram)@ has been moved to @org.eclipse.sirius.diagram.business.api.refresh.IRefreshExtension@ to unify methods handling refresh extension under one interface. 
* <span class="label label-info">Modified</span> The method @org.eclipse.sirius.diagram.business.api.refresh.IRefreshExtension.aroundRefresh(DDiagram)@ has been modified with a default behavior that is the one before introduction of the method to avoid breaking compatibility.
* <span class="label label-danger">Removed</span> The interface @org.eclipse.sirius.diagram.business.api.refresh.IRefreshOverride@ has been removed because its only method has been moved into @org.eclipse.sirius.diagram.business.api.refresh.IRefreshExtension@ interface
* <span class="label label-danger">Removed</span> The @org.eclipse.sirius.diagram.business.internal.dialect.identifier@ package and all its content (@DiagramIdenttifier@, @NodeIdentifier@, @EdgeIdentifier@, @NodeContainerIdentifier@, and @NodeStyleIdentifier@) have been removed.

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

* <span class="label label-success">Added</span> Constants @org.eclipse.sirius.diagram.ui.business.api.query.ViewQuery.SPECIFIC_STYLES@ & @org.eclipse.sirius.diagram.ui.business.api.query.ViewQuery.VERTICAL_ALIGNMENT@ have been added to retrieve the initial label alignment of Notes from the Palette (see "user-visible changes":Release_Notes.html#UserVisibleChanges ). Currently the vertical alignment can not be changed (potential new feature later).
* <span class="label label-success">Added</span> The class @org.eclipse.sirius.diagram.ui.graphical.edit.policies.SiriusDecoratorEditPolicy@ has been added to improve the behavior of decorator selection.
* <span class="label label-success">Added</span> A new decoration mechanism has been implemented. Now, Sirius uses a single @IDecorator@ to decorate EditPart in diagram. That allows Sirius to manage the relative positioning between decorations.
** <span class="label label-success">Added</span> @org.eclipse.sirius.diagram.ui.tools.api.decoration.SiriusDecorationDescriptorProvider@ represents a provider able to give the decoration descriptors. @org.eclipse.sirius.diagram.ui.tools.api.decoration.AbstractSiriusDecorationDescriptorProvider@ is an abstract class that can be inherited to implement @SiriusDecorationDescriptorProvider@.
** <span class="label label-success">Added</span> @org.eclipse.sirius.diagram.ui.tools.api.decoration.DecorationDescriptor@ is a simple POJO that contains information needed to display decoration.
** <span class="label label-success">Added</span> @org.eclipse.sirius.diagram.ui.tools.api.decoration.SiriusDecorationProviderRegistry@ allows to register and get @SiriusDecorationDescriptorProvider@.
* <span class="label label-success">Added</span> The preference @SiriusDiagramUiPreferencesKeys.PREF_AUTHORIZE_DECORATION_OVERLAP@ has been added in @org.eclipse.sirius.diagram.ui.tools.api.preferences.SiriusDiagramUiPreferencesKeys@. If true, the overlap is authorized between decoration group on diagram element.
** <span class="label label-success">Added</span> The class @org.eclipse.sirius.diagram.ui.provider.DiagramUIPlugin.Implementation.DynamicDiagramUIPreferences@ and the method @org.eclipse.sirius.diagram.ui.provider.DiagramUIPlugin.Implementation.getDynamicPreferences()@ have been added to have good performances in getting the preference value.
* <span class="label label-info">Modified</span> The preference @SiriusDiagramUiPreferencesKeys.PREF_PRINT_DECORATION@ has been added in @org.eclipse.sirius.diagram.ui.tools.api.preferences.SiriusDiagramUiPreferencesKeys@. If true, the decorations of the diagram elements of a diagram will be printed, when printing a diagram.
* <span class="label label-info">Modified</span> The @org.eclipse.sirius.diagram.ui.tools.api.part.DiagramEditPartService.DiagramEditPartService@ class which can be used to export diagrams as images is now automatically adapting the output resolution for raster image based on maximum buffer size specified through the @plugin.propeties@ file of the @org.eclipse.sirius.diagram.ui@ plugin. This leads to a noticeable increase of the export image size (you can expect a 10 factor on small diagrams) and the method will no longer fail with OutOfMemory errors as bigger diagrams will lead to a lower output resolution. Implementers using this class can override the @DiagramEditPartService.getMaximumTotalSize()@ method to return their own limit or @DiagramEditPartService.getExportResolutionFactor(DiagramEditPart, SiriusDiagramImageGenerator)@ and return @1.0@ to get back to the previous behavior.
* <span class="label label-info">Moved</span> The methods of interface @org.eclipse.sirius.diagram.ui.tools.api.format.SiriusFormatDataManagerWithMapping@ that are @getFormatData(FormatDataKey, RepresentationElementMapping)@ and @addFormatData(FormatDataKey, RepresentationElementMapping, AbstractFormatData)@ have been moved into the interface @org.eclipse.sirius.diagram.ui.tools.api.format.SiriusFormatDataManager@ to reduce interface numbers for less complexity.
* <span class="label label-info">Moved</span> The methods of interface @org.eclipse.sirius.diagram.ui.tools.api.format.SiriusFormatDataManagerWithMapping@ that are @getFormatData(FormatDataKey, RepresentationElementMapping)@ and @addFormatData(FormatDataKey, RepresentationElementMapping, AbstractFormatData)@ have been moved into the interface @org.eclipse.sirius.diagram.ui.tools.api.format.SiriusFormatDataManager@ to reduce interface numbers for less complexity.
* <span class="label label-danger">Removed</span> The methods @getFormatData(FormatDataKey key)@ and @addFormatData(FormatDataKey key, AbstractFormatData formatData)@ have been removed from interface @org.eclipse.sirius.diagram.ui.tools.api.format.SiriusFormatDataManager@ because they were deprecated.
* <span class="label label-danger">Removed</span> The interface @org.eclipse.sirius.diagram.ui.tools.api.format.SiriusFormatDataManagerWithMapping@ has been removed because all its methods have been moved into interface @org.eclipse.sirius.diagram.ui.tools.api.format.SiriusFormatDataManager@
** <span class="label label-danger">Removed</span> @org.eclipse.sirius.diagram.ui.tools.api.decoration.AbstractSiriusDecorator@ is removed because now useless.
* <span class="label label-danger">Removed</span> The methods @getFormatData(FormatDataKey key)@ and @addFormatData(FormatDataKey key, AbstractFormatData formatData)@ have been removed from interface @org.eclipse.sirius.diagram.ui.tools.api.format.SiriusFormatDataManager@ because they were deprecated.
* <span class="label label-danger">Removed</span> The interface @org.eclipse.sirius.diagram.ui.tools.api.format.SiriusFormatDataManagerWithMapping@ has been removed because all its methods have been moved into interface @org.eclipse.sirius.diagram.ui.tools.api.format.SiriusFormatDataManager@

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

* <span class="label label-danger">Removed</span> The @DTableElementSynchronizer@ _EClass_ has been removed from the table meta-model. It only defined _EOperations_ and has been replaced with an equivalent (internal) plain Java class.

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

* <span class="label label-success">Added</span> The enum class for Sirius tree preferences @org.eclipse.sirius.tree.ui.tools.api.preferences.SiriusTreeUiPreferencesKeys@ has been added with the enum value @SiriusTreeUiPreferencesKeys.PREF_ALWAYS_USE_STANDARD_FONT_SIZE@. This enum value is the preference when true allowing to use runtime font height when displaying Sirius tree editor's items instead of the one specified in the VSM.

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

This plugin is new in Sirius 5.0. It provides a session editor showing loaded models, representations and viewpoint activation status of the session. It has functionalities allowing to change the viewpoint activation status, to create/remove representations or to load unload external models. The graphical block showing loaded models is integrated with CNF. You can provide content extension to its viewer by using an id matching the pattern @org.eclipse.sirius.ui.editor.graphicalcomponents.semanticModelsViewer.contentExtension.*@. You also can provide action extension by using an id matching the pattern @org.eclipse.sirius.ui.editor.graphicalcomponents.semanticModelsViewer.actionExtension.*@. The extension will be selectable/unselectable by using a @Customize View@ button on the models block header.

h4. Changes in @org.eclipse.sirius.properties.core@

* <span class="label label-success">Added</span> The class @org.eclipse.sirius.properties.core.internal.converter.ViewDescriptionConverter@ has been moved as an API to @org.eclipse.sirius.properties.core.api.ViewDescriptionConverter@.
* <span class="label label-success">Added</span> The classes necessary to support the preprocessing of the odesign for the inheritance in its Properties parts are available in the API package @org.eclipse.sirius.properties.core.api@.
* <span class="label label-success">Added</span> The class @org.eclipse.sirius.properties.core.internal.SiriusInterpreter@ has been moved as an API to @org.eclipse.sirius.properties.core.api.SiriusInterpreter@. This class could be used by those who want to create custom model operations using the Properties framework.
* <span class="label label-success">Added</span> The class @org.eclipse.sirius.properties.core.api.SiriusDomainClassTester@ has been added as an API for those who want to create custom model operations using the Properties framework.
* <span class="label label-success">Added</span> The method @org.eclipse.sirius.ext.emf.edit.EditingDomainServices.createInstance(EClass)@ has been added to allow the creation of a new instance from an EClass in the interpreters.
* <span class="label label-info">Modified</span> The default rules have been transfered to a new dedicated plugin named @org.eclipse.sirius.properties.defaultrules@.

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

* <span class="label label-info">Modified</span> All the content related to the IDescriptionConverter and ILinkResolver has been moved from the plugin @org.eclipse.sirius.ui.properties@ to the newly created plugin @org.eclipse.sirius.properties.core@. It includes all the APIs and both extension points.

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

* <span class="label label-info">Modified</span> In the package @org.eclipse.sirius.editor.properties.sections.description.representationdescription@ the class @RepresentationDescriptionMetamodelsUpdater@ has been replaced by @DescriptionMetamodelsUpdater@ which can now be used with any EObject with a many-valued EReference to EPackages. The behavior of the class @RepresentationDescriptionMetamodelPropertySectionSpec@ has been transfered to an abstract class independent of @RepresentationDescription@ named @AbstractMetamodelPropertySectionSpec@. Those classes are now used for the edition of the metamodels of both the Properties view description and the various representations.
 
h4. Changes in @org.eclipse.sirius.tests.junit.support@

* <span class="label label-success">Added</span> The utility method @org.eclipse.sirius.tests.support.api.TestsUtil.setTargetPlatform()@ has been added to allow to load a PDE target platform according to all known OSGi bundles. It is useful to compile a plug-in in the execution runtime of the tests.
* <span class="label label-success">Added</span> The utility class @org.eclipse.sirius.tests.support.api.OpenedSessionsCondition@ has been extracted from a junit test to be used by multiple junit tests. It allows to wait until a session is in opened state.

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

* <span class="label label-success">Added</span> The method @getTreeItem(SWTBotTreeItem[], String, boolean, boolean)@ has been added in @org.eclipse.sirius.tests.swtbot.support.utils@ to retrieve recursively a @SWTBotTreeItem@ in a @SWTBotTreeItem@ array. Compared to @getTreeItem(SWTBotTreeItem[], String)@, it adds the capability to control if the search must be done on enabled items or enabled and disabled items and if the tree must be expanded during the search to check non displayed items.
* <span class="label label-success">Added</span> A new utility method @org.eclipse.sirius.tests.swtbot.support.api.editor.SWTBotSiriusDiagramEditor.dragCentered(String, Class<? extends EditPart>, int, int)@ improving the dragCentered method by adding the aimed Class in parameter.
* <span class="label label-info">Modified</span> A new AtomicBoolean parameter has been added to the utility method @mouseDragWithKey(int, int, int, int, int)@ in classes @org.eclipse.sirius.tests.swtbot.support.api.editor.SWTBotSiriusDiagramEditor@, @org.eclipse.sirius.tests.swtbot.support.api.editor.SWTBotSiriusGefViewer@ and @org.eclipse.sirius.tests.swtbot.support.api.widget.SWTBotSiriusFigureCanvas@. This allows to correctly wait the end of the drag'n'drop.
** Sample of code to use:
pre.. final AtomicBoolean dragFinished = new AtomicBoolean(false);
editor.dragWithKey(start.x, start.y, endpoint.x, endpoint.y, SWT.F3, dragFinished);
// Wait that the drag is done (the async Runnable simulating the
// drag)
bot.waitUntil(new ICondition() {
    @Override
    public boolean test() throws Exception {
        return dragFinished.get();
    }

    @Override
    public void init(SWTBot bot) {
    }

    @Override
    public String getFailureMessage() {
        return "The drag'n'drop operation has not finished.";
    }
});
// Wait that the figures are redrawn. In a fast environment, figures
// are not really redrawn and the rest of the test is not reliable.
SWTBotUtils.waitAllUiEvents();

h2(#sirius4.1.2). Changes in Sirius 4.1.2

h3. User-Visible Changes

* <span class="label label-success">Added</span> A new preference named _Maximum size of tabs name_ is available in the Sirius Properties View preference page. This preference is used to shorten the tabs names when the default rules are used to render the properties view.
!./images/PreferencePageMaxTabName.png! 

h3. Developer-Visible Changes

* <span class="label label-success">Added</span> @org.eclipse.sirius.diagram.ui.tools.api.format.SiriusFormatDataManagerWithMapping@ class has been added to handle copy/paste format with mapping information when an element target of a format pasting has many source diagram format corresponding to its key. In this case, we use the mapping information to get the more precise data format. And if no result matched, then we return the first found by using the key.

* <span class="label label-success">Added</span> @org.eclipse.sirius.diagram.ui.tools.api.format.SiriusFormatDataManagerWithMapping.getFormatData(FormatDataKey, RepresentationElementMapping)@ method has been added to retrieve during format pasting the data format corresponding to the given key and mapping when more than one result correspond to the key. If no result matches the mapping, then the first result found by using the key is returned.

* <span class="label label-success">Added</span> @org.eclipse.sirius.diagram.ui.tools.api.format.SiriusFormatDataManagerWithMapping.addFormatData(FormatDataKey, RepresentationElementMapping, AbstractFormatData)@ method has been added to allow data format manager to register data format with mapping information when copying format.

* <span class="label label-success">Deprecated</span>
@org.eclipse.sirius.diagram.ui.tools.api.format.SiriusFormatDataManager.getFormatData(FormatDataKey)@ It is replaced by @org.eclipse.sirius.diagram.ui.tools.api.format.SiriusFormatDataManagerWithMapping.getFormatData(FormatDataKey, RepresentationElementMapping)@ to better handle copy/paste format cases.

* <span class="label label-success">Deprecated</span>
@org.eclipse.sirius.diagram.ui.tools.api.format.SiriusFormatDataManager.addFormatData(FormatDataKey, AbstractFormatData)@ It is replaced by @org.eclipse.sirius.diagram.ui.tools.api.format.SiriusFormatDataManagerWithMapping.addFormatData(FormatDataKey, RepresentationElementMapping, AbstractFormatData)@ to better handle copy/paste format cases.

h2(#sirius4.1.1). Changes in Sirius 4.1.1

h3. User-Visible Changes

* <span class="label label-info">Modified</span>The "straighten to" actions were previously disabled when an edge is connected to border nodes that have several edges. It is now allowed.

h3. Developer-Visible Changes

* <span class="label label-success">Added</span> @org.eclipse.sirius.table.business.api.helper.TableHelper.getEStructuralFeature(DLine, DColumn)@ method has been added to retrieve the EStructuralFeature associated to a table column.

h2(#sirius4.1.0). Changes in Sirius 4.1.0

h3. User-Visible Changes

* <span class="label label-success">Added</span> Copy/Paste Layout has been completed with Copy/Paste Style and Copy/Paste Format. _Paste Format_ is equivalent to paste _Layout_ and _Style_ action. See chapter "_Copy/paste of format_":./user/diagrams/Diagrams.html#copy_paste_format in _User Manual_ for more details.
* <span class="label label-success">Added</span> The "snap to shape":./user/diagrams/Diagrams.html#snap_to_shapes feature is now available on border nodes.
* <span class="label label-success">Added</span> It is now possible to display an attachment link between an edge and its labels when label or edge is selected. This is not the default behavior but it can be activated by a preference in _Sirius/Sirius Diagram/Connections_ preference page. See chapter "_Display attachment link between edge and its labels_":./user/diagrams/Diagrams.html#edge_label_attachment in _User Manual_ for more details.
* <span class="label label-success">Added</span> It is now possible to straighten an edge to top, bottom, left or right. These actions are available on edge contextual menu _Layout/Straighten_. See chapter "_Straighten an edge_":./user/diagrams/Diagrams.html#straighten_an_edge in _User Manual_ for more details.
* <span class="label label-success">Added</span> It is now possible to disable the _Default_ and _Semantic_ properties tabs (visible when selecting and element from the _Model Explorer_ or from a Sirius editor, respectively) when using modelers which provide fully-functional replacements defined directly with Sirius. This is controled in the new _Sirius > Sirius Properties View_ preference page.
* <span class="label label-success">Added</span> Sirius-defined properties view are now enabled for semantic elements selected directly from inside the _Model Explorer_ (as long as the selected element is from inside an open Sirius session/project). Previously only elements selected from inside a Sirius editor were supported.
* <span class="label label-info">Modified</span> In the Sirius-provided _Properties View_, the edition of a text field is only taken into account when pressing _Enter_ or leaving the field. Previously it was triggered asynchronously after a small delay without activity, which could be confusing.
* <span class="label label-info">Modified</span> When trying to open a session which holds a representation resource or a VSP which was saved using a more recent version of Sirius than the one you are using, the session will be automatically closed displaying an error message. You can overload this behavior by providing you own implementation of @UICallBack@ in which you can have an UI feedback letting you choose if you want to open the session anyway. Warning: if you choose to proceed, there is no guarantee that the resulting session will be usable. It may even lead to data loss or corruption; use at your own risk.
If a viewpoint has been defined with a more recent version of Sirius than the one you are using, the @ViewpointRegistry@ will not register it and a warning is logged in the error log view to inform the user.
* <span class="label label-info">Modified</span> The "move edge group":./user/diagrams/Diagrams.html#move_edge_group feature now also work for a selection of edge group.
* <span class="label label-info">Modified</span> In a diagram editor, the zoom with mouse wheel is now zooming on mouse location instead of center of the editor. See "user documentation":./user/diagrams/Diagrams.html#zooming_diagram_id .
* <span class="label label-info">Modified</span> The direct edit on a Note or Text is now accessible by a slow double click like any other diagram element.
* <span class="label label-info">Modified</span> The shortcut _Ctrl+&_, for "_Reset Origin_":./user/diagrams/Diagrams.html#reset_origin action, has been replaced by _Ctrl+HOME_.

h3. Specifier-Visible Changes

* <span class="label label-success">Added</span> It is now possible to inline a copy of the default Properties Views model inside the VSM. This is a copy of the model Sirius would use if no _Properties View Description_ was specified. It can be used as a starting point for manual customization, or as a complement for elements for which you do not provide any custom rules. 
* <span class="label label-success">Added</span> In the definition of the Properties view, hyperlink and label widgets can now have widget actions.
* <span class="label label-success">Added</span> Hyperlink and label widgets now have a @displayExpression@, if blank the result of the value expression will be used after a call to the method @java.lang.Object#toString()@.
* <span class="label label-success">Added</span> Hyperlink and label widgets now support optional associated actions (visible as buttons on the right of the widget).
* <span class="label label-success">Added</span> A new widget named List with the same behavior as the multiple reference widget.
* <span class="label label-success">Added</span> _Page_ and _Group_ descriptions in _Properties View_ models now support a @preconditionExpression@, which behaves in the same way as preconditions for mappings on representation descriptions.
* <span class="label label-info">Modified</span> The rules concerning the layout of compartments have been changed/completed. You can have a look at the "dedicated chapter":specifier/diagrams/Diagrams.html#compartments_layout in the specifier documentation for more details.
* <span class="label label-info">Modified</span> In the VSM editor, all dialogs which ask for selecting elements from the VSM will now show the fully qualified path of each element, instead of just their name, to allow distinguishing elements with the same name appearing in different places.
* <span class="label label-info">Modified</span> The properties @fontSize@ and @labelFontSize@ have been renamed into @fontSizeExpression@ and @labelFontSizeExpression@ since both of them were already treated as expression.
* <span class="label label-info">Modified</span> In the VSM editor, the _Identifier_ attribute of many _Prroperties View_ related elements has been moved into the _Advanced_ tab and renamed _Extension Id_, as it is not actually required on common use cases but only for extensibility purposes.
* <span class="label label-info">Modified</span> The property @Domain Class Expression@ in @DynamicMappingFor@ elements (in properties views definitions) has been renamed into @Iterable Expression@.
* <span class="label label-info">Modified</span> The _Properties View_ widget which was named _Reference_ in Sirius 4.0 has been renamed as _List_, as it corresponds to an arbitrary list of elements with customizable buttons for acting on them. A new _Reference_ widget was added for handling plain _EReference_ edition with minimal configuration needed.
* <span class="label label-info">Modified</span> When opening a VSM, the editor now automatically expands the first few levels to immediatly reveal the interesting elements (representation descriptions).
* <span class="label label-warning">Deprecated</span> The extension point @org.eclipse.sirius.diagram.ui.layoutDataManager@ is deprecated. It is replaced by the new extension point @org.eclipse.sirius.diagram.ui.formatDataManager@. The deprecated extension point will be removed in the next 5.0 Sirius major release. Several classes associated with this deprecated extension point are also deprecated (see Developer-Visible Changes for details).

h3. Developer-Visible Changes

* <span class="label label-success">Added</span> As the first step to save the DRepresentation in its own resource, @org.eclipse.sirius.viewpoint.DView.getOwnedRepresentationDescriptors()@ has been added as a wrapper of the @DRepresentation@. The @DRepresentationDescriptor@ is contained by the @DView@ and the @DRepresentationDescriptor@ have a reference to the @DRepresentation@. In this step, the main impact is that the Sirius common navigator does not display the @DRepresentation@ anymore but the @DRepresentationDescriptor@ instead. All the actions and commands are then based on @DRepresentationDescriptor@.
* <span class="label label-success">Added</span> As the second step to save the DRepresentation in its own resource, @org.eclipse.sirius.viewpoint.DView.getOwnedRepresentations()@ has been removed. The @DRepresentation@ is now created as root element of the representations resource. The main impact is on the core of Sirius but also potentially on client Sirius customization. Each peace of code that makes the supposition that the @DView@ is the container of the @DRepresentation@ must be reworked. The code using methods in the following list may be concerned by the rework:
** @EObject.eContainer()@. If the object is a @DRepresentation@, its container is now null.
** @EcoreUtil.getRootContainer(xxx)@. The root container of a DDiagramElement is the @DRepresentation@ and not the @DAnalysis@ any more.
** @EcoreUtil.isAncestor(xxx)@. the @DView@ is not an ancestor of a @DRepresentation@ (or its content) anymore.
* <span class="label label-success">Added</span> As a developer, the followings utility methods will help you to migrate your code following the second step described above:
** @org.eclipse.sirius.business.api.query.DViewQuery.getLoadedRepresentations()@ replaces the removed @DView.getOwnedRepresentations()@ method. It provides all the loaded representations holds by a @DView@. In this step, all that representations are always loaded as they are into the .aird resource.
** @org.eclipse.sirius.business.api.query.DViewQuery.getAllContentInRepresentations(final Predicate<? super EObject>)@ provides the content of a @DView@ according to a predicate.
** @org.eclipse.sirius.business.api.query.DRepresentationQuery.getRepresentationDescriptor()@ provides the @DRepresentationDescriptor@ which references the @DRepresentation@.
** @org.eclipse.sirius.business.api.query.EObjectQuery.getDAnalysis()@ allows to retrieve a DAnalysis from a @DRepresentationElement@

h4. Changes in @org.eclipse.sirius@

* <span class="label label-success">Added</span> A new extension point named @org.eclipse.sirius.interpretedExpressionQueryProvider@ (with the associated new interface @org.eclipse.sirius.business.api.dialect.description.IInterpretedExpressionQueryProvider@) allows external contribution of @IInterpretedExpressionQuery@ specific to some particular expression occurrences in the VSM. This is used in particular for VSM extensions which do not fit well into the hard-coded assumptions about @IInterpretedExpressionQuery@. In Sirius 4.1, this is used to add completion and validation support for expressions used in properties views descriptions.
* <span class="label label-success">Added</span> @org.eclipse.sirius.business.api.migration.AirdResourceVersionMismatchException@ exception has been added to cancel Sirius session opening due to an .aird version mismatch, i.e. when one the of the loaded Representation resources is coming from a newer Sirius release.
* <span class="label label-success">Added</span> @org.eclipse.sirius.viewpoint.DView.getOwnedRepresentationDescriptors()@ has been added as the first step to save the DRepresentation in its own resource. In this step, the DRepresentationDescriptor life cycle is the same as the associated DRepresentation.
** @org.eclipse.sirius.business.api.dialect.command.RenameRepresentationCommand@
** @org.eclipse.sirius.business.api.dialect.command.DeleteRepresentationCommand@
** @org.eclipse.sirius.business.api.dialect.command.MoveRepresentationCommand@
** @org.eclipse.sirius.business.api.dialect.command.CopyRepresentationCommand@
* <span class="label label-success">Added</span> @getAvailableRepresentationDescriptions(Collection<Viewpoint>, EObject)@, @getAllRepresentationDescriptors(Session )@, @getRepresentationDescriptors(EObject, Session)@ and @getRepresentationDescriptors(RepresentationDescription, Session )@ have been added in @org.eclipse.sirius.business.api.dialect.DialectServices@ and implemented in @org.eclipse.sirius.business.api.dialect.AbstractRepresentationDialectServices@. These methods are used, instead of their equivalent with DRepresentation, for every functionality which relies on @DRepresentationDescriptor@ instead of @DRepresentation@ such as actions, wizards or views.
* <span class="label label-success">Added</span> @org.eclipse.sirius.business.api.dialect.AbstractRepresentationDialectServices.isSupported(DRepresentationDescriptor)@ has been added because actions, wizards or views that were related to @DRepresentation@ are now related to @DRepresentationDescriptor@.
* <span class="label label-success">Added</span> @org.eclipse.sirius.ui.business.api.dialect.DialectUIServices.canHandle(DRepresentationDescriptor)@ has been added because actions, wizards or views that were related to @DRepresentation@ are now related to @DRepresentationDescriptor@.
* <span class="label label-success">Added</span> @org.eclipse.sirius.ui.business.api.dialect.DialectUIManager.canExport(DRepresentationDescriptor, ExportFormat)@ has been added because actions, wizards or views that were related to @DRepresentation@ are now related to @DRepresentationDescriptor@.
* <span class="label label-success">Added</span> @org.eclipse.sirius.business.api.query.DRepresentationQuery.getRepresentationDescriptor()@ has been added to retrieve the @DRepresentationDescriptor@ that references the @DRepresentation@.
* <span class="label label-success">Added</span> @org.eclipse.sirius.business.api.session.CustomDataConstants.DREPRESENTATION_DESCRIPTOR_FROM_DESCRIPTION@ and @org.eclipse.sirius.business.api.session.CustomDataConstants.DREPRESENTATION_DESCRIPTOR@ have been added. They are used to get or put @DRepresentationDescriptor@ in the model managed by the @Session@ through the @org.eclipse.sirius.business.api.session.SessionService.putCustomData(String, EObject, EObject)@ and @SessionService.getCustomData(String, EObject)@ methods.
* <span class="label label-success">Added</span> @org.eclipse.sirius.business.api.query.EObjectQuery.getDAnalysis()@ has been added to retrieve a DAnalysis from a @DRepresentationElement@
* <span class="label label-info">Modified</span> @org.eclipse.sirius.business.api.session.danalysis.DAnalysisSessionHelper.findContainerForAddedRepresentation(DAnalysis, DRepresentation)@ has been changed to @findDViewForRepresentationDescription(DAnalysis , final RepresentationDescription)@ because that API was previously badly defined.
* <span class="label label-info">Modified</span> @org.eclipse.sirius.business.api.dialect.DialectServices.deleteRepresentation(DRepresentation, Session)@ has been changed to @deleteRepresentation(DRepresentationDescriptor, Session)@ because now the @DRepresentationDescriptor@ is the entry point to delete the @DRepresentation@ and itself.
* <span class="label label-info">Modified</span> @DRepresentationDescriptor@ is now the entry point to move, control or uncontrol a @DRepresentation@ instead of the @DRepresentation@ itself. Accordingly, the return type or parameter of the followings have changed to switch from @DRepresentation@ to @DRepresentationDescriptor@
** constructors of @org.eclipse.sirius.business.api.control.SiriusControlCommand@
** the constructor @org.eclipse.sirius.business.api.dialect.command.MoveRepresentationCommand.MoveRepresentationCommand(Session, DAnalysis, Collection<DRepresentationDescriptor>)@
** the method @org.eclipse.sirius.business.api.session.danalysis.DAnalysisSession.moveRepresentation(DAnalysis, DRepresentationDescriptor)@
* <span class="label label-info">Modified</span> @org.eclipse.sirius.business.api.session.danalysis.DAnalysisSessionHelper.updateModelsReferences(DView)@ has replaced @updateModelsReferences(DAnalysis, Iterator<DSemanticDecorator>)@ because it is more suited to the client needs.

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

* <span class="label label-success">Added</span> The class @org.eclipse.sirius.ui.business.api.dialect.HierarchyLabelProvider@ has been added to provide a generic label provider for VSM model element giving hierarchical label. This label provider replaces the one returned by deprecated method @DialectUIServices.getHierarchyLabelProvider()@. 
* <span class="label label-info">Modified</span> @AbstractSWTCallback@ provides a default implementation of @UICallBack.askSessionReopeningWithResourceVersionMismatch()@ method to give feedback about version mismatch and give the choice to reopen session despite a potential corruption.
* <span class="label label-info">Modified</span> The method @org.eclipse.sirius.ui.tools.api.control.SiriusControlHandler.getRepresentationsToMove(Shell, Session, EObject)@ and @SiriusControlHandler.collectExistingRepresentations@ have been renamed to @getRepresentationDescriptorsToMove(Shell, Session, EObject)@ and @SiriusControlHandler.collectExistingRepresentationDescriptors@. The return type of both that methods and @SiriusControlHandler.askUserWhichRepresentationToSplit@ has been changed to @DRepresentationDescriptor@ as @DRepresentationDescriptor@ is the entry point to work with a @DRepresentation@ instead of DRepresentation itself.
* <span class="label label-warning">Deprecated</span> The method @org.eclipse.sirius.ui.business.api.dialect.DialectUIServices.getHierarchyLabelProvider()@ has been deprecated in favor of generic label provider @HierarchyLabelProvider@.

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

* <span class="label label-success">Added</span> @org.eclipse.sirius.diagram.business.api.diagramtype.IDiagramDescriptionProvider.allowsCopyPasteFormat(DSemanticDecorator)@ has been added in replacement of @allowsCopyPasteLayout(DSemanticDecorator)@ that is now deprecated. This 2 methods must return the same result. @allowsCopyPasteLayout(DSemanticDecorator)@ will be removed in the new major version.

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

* <span class="label label-success">Added</span> The constant @EDGE_SNAP_BACK@ has been added in class @org.eclipse.sirius.diagram.ui.tools.api.ui.actions.ActionIds@. It corresponds to the new snap back label action id that is present on edges.
* <span class="label label-success">Added</span> 2 methods are added in @org.eclipse.sirius.diagram.ui.tools.api.layout.SiriusLayoutDataManager@ (and also in @org.eclipse.sirius.diagram.ui.tools.api.layout.AbstractSiriusLayoutDataManager@):
** @applyFormat(IGraphicalEditPart)@: Apply the current format data (layout data and style data) to the given edit part.
** @applyStyle(IGraphicalEditPart)@: Apply the current style data to the give edit part.
* <span class="label label-success">Added</span> 2 methods are added in @org.eclipse.sirius.diagram.ui.tools.api.editor.tabbar.AbstractTabbarContributor@:
** @createCopyFormatContribution(IDiagramWorkbenchPart)@: In replacement of @createCopyLayoutContribution(IDiagramWorkbenchPart)@ that is now deprecated.
** @createPasteFormatContribution(IDiagramWorkbenchPart)@: In replacement of @createPasteLayoutContribution(IDiagramWorkbenchPart)@ that is now deprecated.
* <span class="label label-success">Added</span> New action ids have been added in @org.eclipse.sirius.diagram.ui.tools.api.ui.actions.ActionIds@:
** @COPY_FORMAT@: Action contribution id for the copy format. It replaces the old @COPY_LAYOUT@.
** @PASTE_FORMAT@: Action contribution id for the paste format. It does not replace the old @PASTE_LAYOUT@. The paste format paste the layout and the style. The paste layout only paste layout.
** @PASTE_STYLE@: Action contribution id for the paste style.
* <span class="label label-success">Added</span> @org.eclipse.sirius.diagram.ui.business.api.query.NodeQuery.isDescendantOf(View)@ has been added to know if a view is a descendant of another view.
* <span class="label label-success">Added</span> @org.eclipse.sirius.diagram.ui.business.api.query.ViewQuery.getAncestor(int...)@ has been added to retrieve the first ancestor of the view, or itself, that has at least one of the visualID passed as parameter.
* <span class="label label-success">Added</span> The new preference key @PREF_SHOW_LINK_EDGE_LABEL_ON_SELECTION@ has been added in @org.eclipse.sirius.diagram.ui.tools.api.preferences.SiriusDiagramUiPreferencesKeys@. It corresponds to the preference shown in _Sirius/Sirius Diagram/Connections_ Eclipse preferences.
* <span class="label label-success">Added</span> The new figure @org.eclipse.sirius.diagram.ui.tools.api.figure.SiriusWrapLabelWithAttachment@ is a specific @SiriusWrapLabel@ that allows to show an attachment between the label and its edge.
* <span class="label label-success">Added</span> A new kind of request, @org.eclipse.sirius.diagram.ui.tools.api.requests.StraightenToRequest@, has been added to handle the new _Straighten to_ actions. The corresponding id has also been added: @org.eclipse.sirius.diagram.ui.tools.api.requests.RequestConstants.REQ_STRAIGHTEN@.
* <span class="label label-success">Added</span> 4 action ids have been added in @org.eclipse.sirius.diagram.ui.tools.api.ui.actions.ActionIds@:
** @STRAIGHTEN_TO_TOP@: For _Straighten to top_ action,
** @STRAIGHTEN_TO_BOTTOM@: For _Straighten to bottom_ action,
** @STRAIGHTEN_TO_LEFT@: For _Straighten to left_ action,
** @STRAIGHTEN_TO_RIGHT@: For _Straighten to right_ action.
* <span class="label label-success">Added</span> Constants have been added in @org.eclipse.sirius.diagram.ui.tools.api.image.DiagramImagesPath@ for the icon path of the four new straighten actions.
* <span class="label label-info">Modified</span> @org.eclipse.sirius.diagram.ui.tools.api.layout.AbstractSiriusLayoutDataManager@ is deprecated, use @org.eclipse.sirius.diagram.ui.tools.api.format.AbstractSiriusFormatDataManager@ instead.
* <span class="label label-info">Modified</span> @org.eclipse.sirius.diagram.ui.tools.api.layout.ILayoutDataManagerProvider@ is deprecated, use @org.eclipse.sirius.diagram.ui.tools.api.format.IFormatDataManagerProvider@ instead.
* <span class="label label-info">Modified</span> @org.eclipse.sirius.diagram.ui.tools.api.layout.LayoutDataHelper@ is deprecated, use @org.eclipse.sirius.diagram.ui.tools.api.format.FormatDataHelper@ instead.
* <span class="label label-info">Modified</span> @org.eclipse.sirius.diagram.ui.tools.api.layout.LayoutDataKey@ is deprecated, use @org.eclipse.sirius.diagram.ui.tools.api.format.FormatDataKey@ instead.
* <span class="label label-info">Modified</span> @org.eclipse.sirius.diagram.ui.tools.api.layout.SiriusLayoutDataManager@ is deprecated, use @org.eclipse.sirius.diagram.ui.tools.api.format.SiriusFormatDataManager@ instead.
* <span class="label label-info">Modified</span> @org.eclipse.sirius.diagram.ui.tools.api.layout.SiriusLayoutDataManagerForSemanticElementsFactory@ is deprecated, use @org.eclipse.sirius.diagram.ui.tools.api.format.SiriusFormatDataManagerForSemanticElementsFactory@ instead.
* <span class="label label-info">Moved</span> The translation key @HierarchyLabelProvider_elementWihtoutNameLabel@ has been removed from the @org.eclipse.sirius.diagram.ui@ plug-in's @Messages@ class, and moved into the @org.eclipse.sirius.ui@'s @Messages@ class.

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

* <span class="label label-success">Added</span> The class @SiriusSnapFeedbackPolicy@ has been copied from @org.eclipse.sirius.ext.gef.editpolicies@ to @org.eclipse.sirius.ext.gmf.runtime.editpolicies@. The old class in plug-in @org.eclipse.sirius.ext.gef@ is deprecated and will be removed in the next version.

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

* <span class="label label-success">Added</span> The utility methods @getRepresentationDescriptors(final String)@, @getRepresentationDescriptors(final String , final Session )@ and @getRepresentationDescriptorFromRepresentation(DRepresentation)@ have been added in class @org.eclipse.sirius.tests.support.api.SiriusTestCase@ to adapt tests considering the @DView.ownedRepresentationDescriptors@ addition.

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

* <span class="label label-success">Added</span> The utility method @mouseScrollWithKey(int, int, int, int)@, has been added in classes @org.eclipse.sirius.tests.swtbot.support.api.editor.SWTBotSiriusDiagramEditor@, @org.eclipse.sirius.tests.swtbot.support.api.editor.SWTBotSiriusGefViewer@ and @org.eclipse.sirius.tests.swtbot.support.api.widget.SWTBotSiriusFigureCanvas@ to allow testing events occurring after a mouse scroll combined to a keyboard key pressed at a given absolute position.

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

* <span class="label label-info">Modified</span> The property @domainClassExpression@ has been renamed into @iterableExpression@.
* <span class="label label-info">Modified</span> The properties @fontSize@ and @labelFontSize@ have been renamed into @fontSizeExpression@ and @labelFontSizeExpression@ since both of them were already treated as expression.

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

* <span class="label label-success">Added</span> Four utility classes have been added as API in the package @org.eclipse.sirius.ui.properties.api@ in order to help with the transformation of the description of custom widgets. The class @AbstractDescriptionConverter@ can now be used as superclass for all the converters. The classes @DefautDescriptionConverter@, @DefautStyleDescriptionConverter@ and @DefautDescriptionWithInitialOperationConverter@, now accessible, should handle most of the use cases. 

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

* <span class="label label-info">Modified</span> The message @org.eclipse.sirius.ecore.extender.business.api.permission.exception.LockedInstanceException.PERMISSION_ISSUE_MESSAGE@ has been modified. You should now use the @MessageFormat@. Example: @LockedInstanceException.PERMISSION_ISSUE_MESSAGE + getText(lockedElements)@ must be replaced by @MessageFormat.format(LockedInstanceException.PERMISSION_ISSUE_MESSAGE, getText(lockedElements))@.
* <span class="label label-info">Modified</span> The @org.eclipse.sirius.ecore.extender.business.api.accessor.ModelAccessorsRegistry@ has been refactored to avoid problem with @ModelAccessor@ lifecycle. The constructor has no longer a parameter.

h2(#sirius4.0.0). Changes in Sirius 4.0.0

h3. User-Visible Changes

* <span class="label label-success">Added</span> The user can now filter elements according to a Typed variable (String, Integer, EEnum or any EDataType). If a user applies a filter containing Typed Variables, a dialog is displayed to allow user entering the Typed Variable values. That values can be used as variables in the Condition Expression of the Variable Filter.
* <span class="label label-success">Added</span> When the diagram is larger than the editor, you can move it in all directions pressing the middle-button and dragging the mouse (keeping the button pressed).
* <span class="label label-info">Modified</span> Now if an object is locked and cannot be modified according to @IPermissionAuthority@, the properties view will not be editable if this locked object is selected from the Model Explorer view.
* <span class="label label-info">Modified</span> When trying to reconnect an edge end on another edge, the edge is now highlighted only if a reconnect tool is found (the precondition of the tool is not tested here).
* <span class="label label-info">Modified</span> List items now have the same margin whichever their parent is a simple list or a compartmentalized list. The margin in compartmentalized list was incorrectly set to 0 pixel.
* <span class="label label-info">Modified</span> The wizard to ask the new representation name has been changed. These concerns the title of the wizard and the input label. Example with a new Entities diagram for EcoreTools:
!images/representationNameWizardChange.png!
* <span class="label label-info">Modified</span> The export of diagram as image handles the gradient color for container background for BMP, JPG, PNG and SVG formats. Before, it only works for JPG format.
* <span class="label label-info">Modified</span> The <img src="images/ApplyAppearanceProperties.png" style="box-shadow:none;display:inline;margin:0px;padding:0px;"/> @Apply Appearance Properties@ action has been modified to use the last selected element as base style instead of the first one.

h3. Specifier-Visible Changes

* <span class="label label-success">Added</span> Sirius 4.0 introduces *experimental* support for specifying the properties views of your modelers directly from inside the VSM. This feature uses the same dynamic approach as for specifying diagrams, tables and trees, with a very flexible configuration language and no code generation involved (including live preview of any change). As of Sirius 4.0, this feature should be considered in an experimental state with details subject to changes until Sirius 4.1, and is not installed by default. To install it, make sure either "the Eclipse Neon repositry":http://download.eclipse.org/releases/neon or the "Sirius 4.0":http://download.eclipse.org/sirius/updates/releases/4.0.0/neon and "EEF 1.6":http://download.eclipse.org/modeling/emft/eef/updates/releases/1.6.0 repositories are available, and then to install the following features (from in the _Modeling_ category of Neon, or _Sirius Experimental Features_ of the Sirius repository ):
** _Sirius Properties Views - Runtime Support_ (@org.eclipse.sirius.properties.feature.feature.group@): needed at runtime for deployed modelers which have properties views defined in their specification.
** _Sirius Properties Views - Specifier Support_ (@org.eclipse.sirius.specifier.properties.feature.feature.group@): provides support for editing the configuration model directly inside the VSM editor and the specifier documentation.
Once this is done, you can find the actual documentation in the _Sirius Specifier Manual_, under the "_Properties View_":specifier/properties/Properties_View_Description.html section.
* <span class="label label-success">Added</span> All static strings defined in the VSMs which are visible to the end-user of the modeler, like viewpoint and tools names, can now be internationalized. Simply replace the name with a translation key reference of the form @%myUniqueKey@ in the VSM, and define the value in the _Viewpoint Specification Project_'s @plugin.properties@ (for the default value), or @plugin_XX.properties@ for locale @XX@. The underlying mechanism is the same as for Eclipse/OSGi plug-ins, so translations can even be contributed by physically separate plug-in fragments. See "the corresponding section":specifier/general/Specifying_Viewpoints.html#translatable_messages in the documentation for more details.
* <span class="label label-success">Added</span> It is possible to create "Typed Variable":specifier/diagrams/Diagrams.html#filter_with_typed_variable under Variable Filter.
* <span class="label label-success">Added</span> A new class @org.eclipse.sirius.ext.emf.edit.EditingDomainServices@ (from plug-in @org.eclipse.sirius.ext.emf.edit@) has been added with a complete set of service methods to leverage most of the features of the "EMF Edit" framework, for example the various _Item Providers_ associated to semantic elements. See "the documentation":specifier/general/Writing_Queries.html#editing_domain_services for details.
* <span class="label label-success">Added</span> The specifier can now restrict the border node authorized sides. This new option is available in the advanced tab of the border node style. See the "specifier documentation":specifier/diagrams/Diagrams.html#authorizedsides for more details.
* <span class="label label-info">Modified</span> The use of type literals in operations like @filter()@ or @oclIsKindOf()@ requires to explicitly add the domain meta-models plug-ins to the dependencies of the _Viewpoint Specification Project_. The documentation has been modified to recommend this.
* <span class="label label-info">Modified</span> *Warning*: Before this version, a style customization of an @EEnum@ attribute, like @labelFormat@, worked with a value expression using a Java service returning a @EEnumLiteral@. It is now forbidden. You must return an @Enumerator@. The documentation about "Styles Customization":specifier/diagrams/Diagrams.html#enum_customization now details this case.
* <span class="label label-info">Modified</span> The @BorderSizeComputationExpression@ migration has been corrected to recursively handle the sub container mappings. VSM created or migrated with Sirius 3.1.0, 3.1.1 or 3.1.2 might require a manual modification for the style descriptions of sub container mappings with border size computation equals to 0 as we cannot determine if they were added (or updated) after or before the migration: starting with Sirius 3.1.0, no border will be displayed for a 0 pixel value whereas with older version container always had at least a 1 pixel border.
* <span class="label label-info">Modified</span> The variable under VariableFilter, previously named "Variable", is renamed to "Select Model Element Variable". It is functionally equivalent.

h3. Developer-Visible Changes

* <span class="label label-success">Added</span> It is now possible to provide a full customized tab-bar by implementing the @ITabbarContributor@ through the @org.eclipse.sirius.diagram.ui.tabbarContributor@ extension-point. See the "developer documentation":developer/extensions-provide_tabbar_extensions.html#contributeFullTabbar for more details.
* <span class="label label-success">Added</span> It is now possible to provide new shapes for basic shape styles through the @org.eclipse.sirius.diagram.bundledImageShape@ extension-point. See the "developer documentation":developer/extensions-provide_custom_bundled_image_shape.html for more details.

h4. Changes in @org.eclipse.sirius@

* <span class="label label-success">Added</span> The method @org.eclipse.sirius.ui.business.api.session.SessionEditorInput.getStatus()@ has been added to have the status about session opening, i.e. if it has been correctly opened, cancelled or an exception has occurred. 
* <span class="label label-success">Added</span> A new variant of @org.eclipse.sirius.business.api.helper.task.TaskHelper.buildTaskFromModelOperation(EObject, ModelOperation)@ has been added, which does not require to specify a @DRepresentation@ in the context. It allows the creation of a task which executes a behavior specified by @ModelOperations@ outside of the context of a specific representation, provided the @ModelOperations@ work in that context.
* <span class="label label-success">Added</span> @org.eclipse.sirius.viewpoint.description.TypedVariable@ has been created.
* <span class="label label-success">Added</span> @org.eclipse.sirius.viewpoint.description.InteractiveVariableDescription@ has been created as tag interface for variables that require user interaction to be valued.
* <span class="label label-success">Added</span> @org.eclipse.sirius.tools.api.command.ui.UICallBack.askForTypedVariable(List<TypedVariable>, List<String>)@ has been created.
* <span class="label label-success">Added</span> @org.eclipse.sirius.tools.api.command.ui.NoUICallback.askForTypedVariable(List<TypedVariable>, List<String>)@ has been created.
* <span class="label label-success">Added</span> @org.eclipse.sirius.business.api.dialect.DialectServices.getRequiredViewpoints(DRepresentation)@ has been added to have mean to get required viewpoints to use a representation.
* <span class="label label-success">Added</span> @org.eclipse.sirius.business.api.dialect.AbstractRepresentationDialectServices.getRequiredViewpoints(DRepresentation)@ has been added to have a default implementation of @DialectServices.getRequiredViewpoints(DRepresentation)@ method.
* <span class="label label-success">Added</span> @org.eclipse.sirius.business.api.dialect.AbstractRepresentationDialectServices.isRelatedViewpointSelected(Session, RepresentationDescription)@ protected method has been added to check if a @RepresentationDescription@ is usable in the context of the specified session.
* <span class="label label-success">Added</span> @org.eclipse.sirius.tools.api.command.ui.UICallBack.askForDetailName(String, String, String)@ method has been added to replace the deprecated @org.eclipse.sirius.tools.api.command.ui.UICallBack.askForDetailName(String, String)@. This method now uses the description name as title for the wizard. This new method has been implemented by @org.eclipse.sirius.ui.tools.api.command.AbstractSWTCallback@ and @org.eclipse.sirius.tools.api.command.ui.NoUICallback@.
* <span class="label label-success">Added</span> @org.eclipse.sirius.ui.tools.api.project.ModelingProjectManager.loadAndOpenRepresentationsFile(URI, boolean)@ has been added to specify if job used to open a session must be considered as launched by the user or not, because by default with @ModelingProjectManager.loadAndOpenRepresentationsFile(URI)@ the job was not considered as launched by the user.
* <span class="label label-info">Modified</span> @org.eclipse.sirius.viewpoint.description.tool.SelectModelElementVariable@ now implements @org.eclipse.sirius.viewpoint.description.InteractiveVariableDescription@.
* <span class="label label-info">Modified</span> @org.eclipse.sirius.viewpoint.description.tool.AbstractVariable@ has been moved to @org.eclipse.sirius.viewpoint.description.AbstractVariable@.
* <span class="label label-info">Modified</span> @org.eclipse.sirius.viewpoint.description.tool.SubVariable@ has been moved to @org.eclipse.sirius.viewpoint.description.SubVariable@.
* <span class="label label-info">Modified</span> @org.eclipse.sirius.business.api.modelingproject.ModelingProject.getMainRepresentationsFileURI()@ methods no more update workspace resource about markers, now this must be done in caller on IllegalArgumentException catch in a workspace aware operation.
* <span class="label label-info">Modified</span> @org.eclipse.sirius.business.api.dialect.command.RefreshRepresentationsCommand.canExecute()@ now returns false if a @DRepresentation@ cannot be refreshed, by calling @DialectManager.canRefresh(DRepresentation)@.
* <span class="label label-info">Modified</span> Several methods of @org.eclipse.sirius.business.api.session.danalysis.DAnalysisSessionHelper@ now return a @fr.obeo.dsl.viewpoint.DView@ instead of a @fr.obeo.dsl.viewpoint.DRepresentationContainer@: * @findContainer(EObject, Viewpoint, Collection<DAnalysis>, DAnalysisSelector)@,
** @findContainerForAddedRepresentation(EObject, Viewpoint, Collection<DAnalysis>, DAnalysisSelector, DRepresentation)@,
** @findContainerForAddedRepresentation(DAnalysis, DRepresentation)@, @findFreeContainer(Viewpoint, Collection<DAnalysis>, DAnalysisSelector)@
** @findFreeContainer(Viewpoint, Collection<DAnalysis>, DAnalysisSelector)@.
* <span class="label label-danger">Removed</span> The @org.eclipse.sirius.viewpoint.DRepresentationContainer@ EClass have been removed. It used to be the only implementation of @org.eclipse.sirius.viewpoint.DView@, the @models@ derived transient reference has been moved to @DView@. An automatic migration has been added during the loading of the representation to handle this change.
* <span class="label label-danger">Removed</span> The class @org.eclipse.sirius.business.api.extender.MetamodelDescriptorProvider2@ has been deleted and is now @MetamodelDescriptorProvider@. 

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

* <span class="label label-success">Added</span> A method @getInferredVariableTypes(Boolean value)@ in @org.eclipse.sirius.common.tools.api.interpreter.ValidationResult@ so that @IInterpreter@ implementations able to infer more specific types based on predicates result provides this information to Sirius which will then use it for validating other expressions. You might want to look at @org.eclipse.sirius.common.acceleo.aql.business.internal.AQLSiriusInterpreter@ which is an implementation providing this type inference.
* <span class="label label-success">Added</span> A helper @org.eclipse.sirius.common.tools.api.util.MessageTranslator@ providing @getMessage(EObject, String)@ and @getMessage(Bundle, String)@ service dedicated into processing a translatable message to return the translation in the active language when available. This service returns the String without modification if not translatable or no translation is available.
* <span class="label label-success">Added</span> The "INFO" severity has been added to @org.eclipse.sirius.common.tools.api.interpreter.IInterpreterStatus@ to reflect all kind of language validation severity (of AQL for example).

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

* <span class="label label-success">Added</span> @org.eclipse.sirius.diagram.VariableValue@, @org.eclipse.sirius.diagram.TypedVariableValue@ and @org.eclipse.sirius.diagram.EObjectVariableValue@ has been created.
* <span class="label label-success">Added</span> @org.eclipse.sirius.diagram.description.filter.impl.VariableFilterImpl.resetVariables()@ has been created to indicate that variables have to be computed again.
* <span class="label label-success">Added</span> @org.eclipse.sirius.diagram.description.style.Side@ EEnum has been added to define a border node side on the parent.
* <span class="label label-success">Added</span> @org.eclipse.sirius.diagram.description.style.NodeStyleDescription#forbiddenSides@ attribute has been added to set the border node forbidden sides on the parent.
* <span class="label label-success">Added</span> @org.eclipse.sirius.diagram.business.api.query.DNodeQuery.getForbiddenSide()@ has been added to retrieve the forbidden sides of a DNode (make sense only for Border Nodes).
* <span class="label label-info">Modified</span> The type of @org.eclipse.sirius.diagram.description.filter.VariableFilter.ownedVariable@ has been changed to @org.eclipse.sirius.viewpoint.description.InteractiveVariableDescription@.
* <span class="label label-info">Modified</span> The type of @org.eclipse.sirius.diagram.FilterVariableHistory.ownedValues@ has been changed to @org.eclipse.sirius.diagram.VariableValue@.
* <span class="label label-info">Modified</span> The return type of @org.eclipse.sirius.diagram.business.api.helper.SiriusDiagramUtil.findRepresentationContainer(DDiagram)@ has been changed from @org.eclipse.sirius.viewpoint.DRepresentationContainer@ to @org.eclipse.sirius.viewpoint.DView@.
* <span class="label label-danger">Removed</span> @org.eclipse.sirius.diagram.description.filter.FilterVariable@ has been removed. It is replaced by @org.eclipse.sirius.viewpoint.description.tool.SelectModelElementVariable@.
* <span class="label label-danger">Removed</span> @org.eclipse.sirius.diagram.description.filter.impl.VariableFilterImpl.setFilterContext()@ has been removed. This method was, in part, useless and is replaced by @org.eclipse.sirius.diagram.description.filter.impl.VariableFilterImpl.resetVariables()@.

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

* <span class="label label-success">Added</span> @org.eclipse.sirius.ui.tools.api.command.AbstractSWTCallback.askForTypedVariable(List<TypedVariable>, List<String>)@ has been created.
* <span class="label label-success">Added</span> The new internationalizable label @Messages_createRepresentationInputDialog_DefaultRepresentationDescName@ has been added (available through @org.eclipse.sirius.ui.tools.api.Messages.createRepresentationInputDialog_DefaultRepresentationDescName@. Its value is "Representation".
* <span class="label label-info">Modified</span> The internationalizable label @Messages_createRepresentationInputDialog_NewRepresentationNameLabel@ has been replaced by "Name:" (previous value was "Representation name:"). 
* <span class="label label-info">Modified</span> The internationalizable label @Messages_createRepresentationInputDialog_RepresentationDescriptionLabel@ has been replaced by "Representation description: {0}" (previous value was "Representation description: "). 
* <span class="label label-info">Modified</span> The internationalizable label @Messages_createRepresentationInputDialog_Title@ has been replaced by "New {0}" (previous value was "New Representation").
* <span class="label label-danger">Removed</span> The internationalizable label @org.eclipse.sirius.viewpoint.provider.Messages.OpenRepresentationsFileJob_initModelingProjectsTask@ has been removed as this message is no more used.
* <span class="label label-danger">Removed</span> The class @org.eclipse.sirius.ui.business.api.editor.SpecificSessionManager@ has been removed. 

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

* <span class="label label-success">Added</span> A new system property named @org.eclipse.sirius.diagram.ui.svg.maxCacheSizeMB@ has been added. It can be used to tweak the maximum size (in megabytes) of pre-rendered SVG images to keep in cache. The default is 50, corresponding to 50MB of bitmaps of 4 8-bit channels. Increasing the limit can improve performance when using diagrams with a lot of SVG images, at the cost of increased memory usage.
* <span class="label label-success">Added</span> @org.eclipse.sirius.diagram.ui.tools.api.editor.tabbar.ITabbarContributor@ interface has been added to provide a customized tab-bar for a specific selection.
* <span class="label label-success">Added</span> @org.eclipse.sirius.diagram.ui.tools.api.editor.tabbar.AbstractTabbarContributor@ is an abstract implementation of @ITabbarContributor@ that allows reusing one or several of the default Sirius contribution items.
* <span class="label label-success">Added</span> @org.eclipse.sirius.diagram.editor.properties.sections.style.bundledimagedescription.BundledImageDescriptionShapePropertySectionSpec@ has been added to have a custom display in the VSM for provided basic shape.
* <span class="label label-success">Added</span> @org.eclipse.sirius.diagram.ui.edit.api.part.AbstractDiagramBorderNodeEditPart.createNodeFigure()@ has been created to factorize the @DNode2EditPart@ and @DNode4EditPart@ constructors.
* <span class="label label-success">Added</span> @org.eclipse.sirius.diagram.ui.tools.api.figure.DBorderedNodeFigure.setForbiddenSides(int...)@ has been added to set the figure forbidden sides on its parent.
* <span class="label label-success">Added</span> @org.eclipse.sirius.diagram.ui.tools.api.figure.DBorderedNodeFigure.getAuthorizedSides()@ has been added to retrieve the figure authorized side (by default all sides).
* <span class="label label-success">Added</span> The following protected methods have been added to @org.eclipse.sirius.diagram.ui.tools.api.figure.SVGFigure@ : @String getKey(Graphics)@, @Image getImage(Rectangle, Graphics)@, @static boolean doRemoveFromCache(String)@.
* <span class="label label-success">Added</span> 2 methods are added in @org.eclipse.sirius.diagram.ui.tools.api.part.DiagramEditPartService@ to manage gradient color in export to PNG or SVG formats: @DiagramEditPartService.saveSVGToFile(IPath, SiriusDiagramSVGGenerator, IProgressMonitor)@ and @org.eclipse.sirius.diagram.ui.tools.api.part.DiagramEditPartService.saveToFile(IPath, SiriusDiagramSVGGenerator, ImageFileFormat, IProgressMonitor)@. These 2 methods are copy of parent methods with @SiriusDiagramSVGGenerator@ as parameter instead of a @DiagramSVGGenerator@.
* <span class="label label-success">Added</span> The method @org.eclipse.sirius.ui.tools.api.color.VisualBindingManager.getGradientPaintFromValue(int, int, int, int, Color, Color)@ has been added to handle a cache for @java.awt.GradientPaint@ as it is the case for @org.eclipse.swt.graphics.Pattern@ with @getPatternFromValue()@.
* <span class="label label-success">Added</span> Methods have been added in @org.eclipse.sirius.diagram.ui.tools.api.figure.GradientHelper@ to handle @java.awt.GradientPaint@ as @org.eclipse.swt.graphics.Pattern@: @getGradientPaintDiag(Rectangle, Color, Color)@, @getGradientPaintLeftToRight(Rectangle, Color, Color)@, @getGradientPaintTopToBottom(Rectangle, Color, Color)@ and @getGradientPaint(int, Rectangle, Color, Color)@.
* <span class="label label-success">Added</span> @org.eclipse.sirius.diagram.ui.tools.api.ui.actions.ActionIds.ACTION_SIRIUS_COPY_APPEARANCE_PROPERTIES@ has been added to identify the new _Sirius Copy Appearence Properties_ action.
* <span class="label label-info">Modified</span> @org.eclipse.sirius.diagram.ui.tools.api.figure.BundleImageFigure@ now overrides the method @setBorder(Border border)@. It also provides the accessors for the new field @mainBorderSize@.
* <span class="label label-info">Modified</span> @org.eclipse.sirius.diagram.ui.tools.api.figure.BundledImageFigure@ now inherits directly from @SVGFigure@ instead of @AbstractCachedSVGFigure@.
* <span class="label label-info">Modified</span> @org.eclipse.sirius.diagram.ui.tools.api.figure.SVGWorkspaceImageFigure@ now inherits directly from @SVGFigure@ instead of @AbstractCachedSVGFigure@.
* <span class="label label-info">Modified</span> @org.eclipse.sirius.diagram.ui.tools.api.figure.SVGFigure@ now implements interfaces @StyledFigure@, @ITransparentFigure@ and @ImageFigureWithAlpha@.
* <span class="label label-danger">Removed</span> The following mehtods have been removed from @org.eclipse.sirius.diagram.ui.tools.api.figure.SVGFigure@: @NodeList getNodes(String)@, @Color getColor(Element, String)@, @void updateRenderingHints(Graphics)@, @staticImage toSWT(Device, BufferedImage)@, @boolean checkContentAvailable()@, @Rectangle2D getAreaOfInterest()@, @void setAreaOfInterest(Rectangle2D)@, @boolean isSpecifyCanvasWidth()@, @void setSpecifyCanvasWidth(boolean)@, @boolean isSpecifyCanvasHeight()@, @void setSpecifyCanvasHeight(boolean)@, @boolean getSpecifyCanvasWidth()@, @boolean getSpecifyCanvasHeight()@.
* <span class="label label-danger">Removed</span> The class @org.eclipse.sirius.diagram.ui.tools.api.figure.AbstractCachedSVGFigure@ has been removed. Its functionality was merged directly into @SVGFigure@.
* <span class="label label-danger">Removed</span> The static @org.eclipse.sirius.diagram.ui.tools.api.figure.SVGWorkspaceImageFigure.createImageFigure(ContainerStyle)@ method has been removed; it was broken and not called anywhere.

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

* <span class="label label-info">Modified</span> @org.eclipse.sirius.ext.emf.ui.properties.ExtensiblePropertySource.collector@ field is now in protected visibility to be modifiable and accessible by subclass.

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

* <span class="label label-success">Added</span> The interface @org.eclipse.sirius.ext.gmf.runtime.diagram.ui.tools.MoveInDiagramDragTracker@ has been added to declare states used by all DragTrackers which manage move in diagram using mouse middle click.

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

* <span class="label label-success">Added</span> @org.eclipse.sirius.ui.tools.api.properties.SiriusExtensiblePropertyDescriptor@ has been added to provide a specific @ExtensiblePropertyDescriptor@ which test @IPermissionAuthority@ to make properties view editable or not.
* <span class="label label-info">Modified</span> @org.eclipse.sirius.ui.tools.api.properties.SiriusExtensiblePropertySource@ has been modified to use @SiriusExtensiblePropertyDescriptor@ to provide not editable properties view when the object, selected from the Model Explorer view, cannot be modified.
* <span class="label label-danger">Removed</span> The @org.eclipse.sirius.ui@, and thus the whole @org.eclipse.sirius.runtime@ feature no longer depends on the JDT (technically the dependency towards @org.eclipse.jdt.core@ has been removed). If you need the JDT Core in your environment, you will need to add the dependency explicitly. The Sirius specification environment (@org.eclipse.sirius.editor@) still depends on PDE (and thus indirectly the JDT too).

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

* <span class="label label-success">Added</span> The class @org.eclipse.sirius.tests.support.api.DefaultTestMemento@ has been created. It help to simulate a real @IMemento@ for editor restoration.
* <span class="label label-success">Added</span> The method @SiriusTestCase.initViewpoint(String, Session, boolean)@ has been added to allow viewpoint activation without creating representations.
* <span class="label label-success">Added</span> The methods @initLoggers()@ and @disposeLoggers()@ of class @org.eclipse.sirius.tests.support.api.SiriusTestCase@ have now a protected visibility (instead of private) to allow subclasses to use this logger without all the @genericSetUp@ behavior.
* <span class="label label-warning">Deprecated</span> The method @SiriusTestCase.initViewpoint(String, Session, EObject)@ has been deprecated because the last parameter is useless to activate a viewpoint.

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

* <span class="label label-success">Added</span> The method @getTreeItem(final SWTBotTreeItem[], final String)@ has been added in @org.eclipse.sirius.tests.swtbot.support.utils@ to retrieve recursively a @SWTBotTreeItem@ in a @SWTBotTreeItem@ array.
* <span class="label label-success">Added</span> The class @org.eclipse.sirius.tests.swtbot.support.api.condition.ShellChangedCondition@ has been added to wait until the current active shell has changed.
* <span class="label label-success">Added</span> The class @org.eclipse.sirius.tests.swtbot.support.api.condition.TreeItemWithImageCondition@ has been added to wait until the given treeItem has the expected image.
* <span class="label label-info">Modified</span> A second @String@ parameter has been added to the method @org.eclipse.sirius.tests.swtbot.support.api.business.UILocalSession.newDiagramRepresentation(String, String)@. This parameter is the label of the representation description. It is necessary since the change of the wizard to ask the new representation name (see User-Visible Changes for detail).
* <span class="label label-info">Modified</span> A third @String@ parameter has been added to the constructor of @org.eclipse.sirius.tests.swtbot.support.api.business.UINewRepresentationBuilder@ for the same above reasons.
 
h4. Changes in @org.eclipse.sirius.common.xtext@

* <span class="label label-info">Modified</span> The dependency from @org.eclipse.sirius.common.xtext@ to the JDT plug-in @org.eclipse.jdt.core@ is now optional. If you need the JDT Core in your environment, you will need to add the dependency explicitly. The Sirius specification environment (@org.eclipse.sirius.editor@) still depends on PDE (and thus indirectly the JDT too).

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

* <span class="label label-success">Added</span> The method @bindCompletionProcessor(AbstractPropertySection, IAssistContentProvider, Text)@ has been added to the class @org.eclipse.sirius.editor.tools.api.assist.TypeContentProposalProvider@ to allow to bind a specific IAssistContentProvider to the text.

h2(#sirius3.1.0). Changes in Sirius 3.1.0

h3. User-Visible Changes

* <span class="label label-success">Added</span> A new feature allows to snap to all shapes (instead of just to snap to sibling shapes). The <kdb>F4</kdb> shortcut key activates this mode when you resize a node, move a node or move a bendpoint of an edge, see "the documentation":./user/diagrams/Diagrams.html#snap_to_shapes for details.
* <span class="label label-success">Added</span> A new feature allows to move the edge group (Edge, Label, Border Nodes) if the <kdb>F3</kdb> shortcut is pressed during the edge moving/dragging. This feature is only available for the case of edges with border node as source and target. See "documentation":./user/diagrams/Diagrams.html#move_edge_group for more details.
* <span class="label label-success">Added</span> The label of edges now stays as much as possible near the edge when it is moved.
Sample before Sirius 3.1:
!images/edgeLabelMoveBeforeSirius3.1.gif! 
Same sample since Sirius 3.1:
!images/edgeLabelMoveAfterSirius3.1.gif!
* <span class="label label-success">Added</span> It is now possible to collapse compartments using the handle visible on the following illustrations. The handle's position varies depending on the label alignment to avoid overlapping (depending on the list elements alignment for a list with an hidden label).
!images/compartments_collapse.png! 
!images/compartments_collapse2.png!
* <span class="label label-info">Modified</span> The _Snap to Grid_ and _Snap to Shapes_ features are now automatically disabled on Sequence diagrams. As indicated "in the user documentation":./user/sequences/Sequence%20Diagrams.html#introduction, to work correctly, Sirius sequence diagrams must have a tight control on where the graphical elements are placed on the diagram and on their synchronization with the underlying semantic model. Previously, the user had to explicitely disable the snap features.
* <span class="label label-info">Modified</span> The _Link with Editor_ behavior has changed. The link with editor was previously unidirectional from the Common Navigator (Model Explorer view or Project view) toward the active representation. Now, when selecting one or several elements in the representation, the corresponding semantic elements are selected in the Common Navigator.
* <span class="label label-info">Modified</span> The _Arrange Linked Bordered Nodes_ tabbar action has been renamed to _Arrange Linked Border Nodes_ as it is border nodes which are layouted and not bordered nodes.

h3. Specifier-Visible Changes

* <span class="label label-info">Modified</span> The _Acceleo Query Language_ (AQL) interpreter has been improved. AQL, and its support in Sirius, is no longer considered experimental, and instead is now the recommended query language to use for new VSMs. Improvements mostly concern better completion and validation, and more precise error reporting. In particular AQL expressions will now be able to display warnings and errors in the Interpreter view. The message displayed in the Interpreter view after an evaluation has also been improved to display the qualified name of the type of the value computed (@ePackageName::eClassName@). The improvements realized can be viewed by clicking on the image below (click to zoom).
!images/improvedsiriusinterpreter_thumbnail.png!:images/improvedsiriusinterpreter.png
* <span class="label label-info">Modified</span> Related to the previous point, the projects created by the _Viewpoint Specification Project_ wizard are now configured to use AQL by default (instead of Acceleo 3/MTL before). They depend on @org.eclipse.sirius.common.acceleo.aql@ instead of @org.eclipse.sirius.common.acceleo.mtl@, and do not have the Acceleo nature anymore (it is not needed by AQL). If you want to use another language in your queries, make sure you set the appropriate dependencies so that the Sirius support for that language will be present at runtime to interpret the queries.
* <span class="label label-info">Modified</span> The support for containers with vertical or horizontal _compartments_ on diagrams was introduced in Sirius 3.0.0 as an experimental feature. Several improvements and corrections have been done around the behaviors of this feature which is no longer considered experimental. Validation rules and tooltips in the VSM editor are here to help the specifier create a consistent mapping structure.
* <span class="label label-info">Modified</span> <span class="label label-info">Experimental</span> New, experimental support for recursive _compartments_ on diagrams: the _children presentation_ property of a _Container Mapping_, which is defined as a _compartment_ (its parent _ContainerMapping_ has a _VerticalStack_ or _HorizontalStack_ _children presentation_), can now also be set to _Vertical Stack_ and _Horizontal Stack_. It allows to define complex stacks of _compartments_ mixing both stack directions. While working reliably, this support is marked experimental in Sirius 3.1.0 as there are still some behaviors which do not behave as expected. If you make use of this feature, be aware that some details may still change in future releases, including 3.1.x maintenance releases.
* <span class="label label-info">Modified</span> You now really have the capability to set the @BorderSizeComputationExpression@ as 0 for style of @ContainerMapping@. Before Sirius 3.1.0, a size of 0 was interpreted as 1 at runtime. For compatibility reason, all existing @BorderSizeComputationExpression@ equals to 0 for style of @ContainerMapping@ are automatically set to 1 (ditto for results of this expression in representations file for container elements). For @ContainerMapping@, the default value of @BorderSizeComputationExpression@ for new style is now 1, except for _Worskpace Image_ where the value is 0.
* <span class="label label-info">Modified</span> The delete command availability computation has been changed. In case of a delete tool, the availability is now computed considering first the precondition of the tool and then the delete authorisation (using @IPermissionAuthority@) of the potential to delete objects. This is the reverse order of what was done before, and can have performance impacts if the precondition is slow. The specifier will to take care to ensure a good performance for the precondition expression of the delete tool.

h3. Developer-Visible Changes

h4. Partial support for internationalization

Sirius 3.1 introduces partial support for internationalization: all literal strings from the runtime part of Sirius are now externalized and can be localized by third parties by providing the appropriate "language packs" as OSGi fragments. Note that this does not concern the VSM editor's UI, the VSMs themselves, or the parts of the UI inherited from Eclipse/EMF/GEF/GMF and other libraries and frameworks used by Sirius.

Some API changes were required to enable this. While technically breaking changes if interpreting strictly the OSGi versioning rules, the major version number of the impacted bundles was not incremented as the changes only concern classes that should not impact the vast majority of users. Most breaking changes concern the plug-in/activator classes from each bundle. They are:
* <span class="label label-success">Added</span>@org.eclipse.sirius.diagram.layoutdata.LayoutDataPlugin@, a subclass of @org.eclipse.emf.common.EMFPlugin@ has been added. The corresponding OSGi bundle activator is the internal class @LayoutDataPlugin.Implementation@.
* <span class="label label-success">Added</span>@org.eclipse.sirius.diagram.sequence.SequenceDiagramPlugin@, a subclass of @org.eclipse.emf.common.EMFPlugin@ has been added. The corresponding OSGi bundle activator is the internal class @SequenceDiagramPlugin.Implementation@.
* <span class="label label-success">Added</span>@org.eclipse.sirius.common.xtext.internal.XtextIntegrationPlugin@, a subclass of @org.eclipse.emf.common.EMFPlugin@ has been added. The corresponding OSGi bundle activator is the internal class @XtextIntegrationPlugin.Implementation@.
* <span class="label label-success">Added</span> @org.eclipse.sirius.ext.base.BasePlugin@, a subclass of @org.eclipse.emf.common.EMFPlugin@ has been added. The corresponding OSGi bundle activator is the internal class @BasePlugin.Implementation@.
* <span class="label label-success">Added</span> @org.eclipse.sirius.ext.draw2d.Draw2DExtPlugin@, a subclass of @org.eclipse.emf.common.EMFPlugin@ has been added. The corresponding OSGi bundle activator is the internal class @Draw2DExtPlugin.Implementation@.
* <span class="label label-success">Added</span> @org.eclipse.sirius.ext.e3.ui.Eclipse3UIExtPlugin@, a subclass of @org.eclipse.emf.common.EMFPlugin@ has been added. The corresponding OSGi bundle activator is the internal class @Eclipse3UIExtPlugin.Implementation@.
* <span class="label label-success">Added</span> @org.eclipse.sirius.ext.emf.EMFExtPlugin@, a subclass of @org.eclipse.emf.common.EMFPlugin@ has been added. The corresponding OSGi bundle activator is the internal class @EMFExtPlugin.Implementation@.
* <span class="label label-success">Added</span> @org.eclipse.sirius.synchronizer.internal.SynchronizerPlugin@, a subclass of @org.eclipse.emf.common.EMFPlugin@ has been added. The corresponding OSGi bundle activator is the internal class @SynchronizerPlugin.Implementation@.
* <span class="label label-success">Added</span> @org.eclipse.sirius.tree.tools.internal.TreePlugin@, a subclass of @org.eclipse.emf.common.EMFPlugin@ has been added. The corresponding OSGi bundle activator is the internal class @TreePlugin.Implementation@.
* <span class="label label-info">Modified</span> @org.eclipse.sirius.common.acceleo.mtl.ide.AcceleoMTLInterpreterIDEPlugin@ is no longer an OSGi @BundleActivator@, and instead extends @org.eclipse.emf.common.EMFPlugin@. The actual bundle activator is the new internal class @AcceleoMTLInterpreterIDEPlugin.Implementation@.
* <span class="label label-info">Modified</span> @org.eclipse.sirius.common.acceleo.mtl.ide.AcceleoMTLInterpreterPlugin@ is no longer an OSGi @BundleActivator@, and instead extends @org.eclipse.emf.common.EMFPlugin@. The actual bundle activator is the new internal class @AcceleoMTLInterpreterPlugin.Implementation@.
* <span class="label label-info">Modified</span> @org.eclipse.sirius.common.ocl.DslOclPlugin@ is no longer a @org.eclipse.core.runtime.Plugin@ (nor an OSGi @BundleActivator@), and instead extends @org.eclipse.emf.common.EMFPlugin@. The actual bundle activator is the new internal class @DslOclPlugin.Implementation@.
* <span class="label label-info">Modified</span> @org.eclipse.sirius.common.tools.DslCommonPlugin@ is no longer a @org.eclipse.core.runtime.Plugin@ (nor an OSGi @BundleActivator@), and instead extends @org.eclipse.emf.common.EMFPlugin@. The actual bundle activator is the new internal class @DslCommonPlugin.Implementation@.
* <span class="label label-info">Modified</span> @org.eclipse.sirius.diagram.DiagramPlugin@ is no longer a @org.eclipse.core.runtime.Plugin@ (nor an OSGi @BundleActivator@), and instead extends @org.eclipse.emf.common.EMFPlugin@. The actual bundle activator is the new internal class @DiagramPlugin.Implementation@.
* <span class="label label-info">Modified</span> @org.eclipse.sirius.ecore.extender.business.internal.ExtenderPlugin@ is no longer a @org.eclipse.core.runtime.Plugin@ (nor an OSGi @BundleActivator@), and instead extends @org.eclipse.emf.common.EMFPlugin@. The actual bundle activator is the new internal class @ExtenderPlugin.Implementation@.
* <span class="label label-info">Modified</span> @org.eclipse.sirius.table.tools.internal.TablePlugin@ is no longer a @org.eclipse.core.runtime.Plugin@ (nor an OSGi @BundleActivator@), and instead extends @org.eclipse.emf.common.EMFPlugin@. The actual bundle activator is the new internal class @TablePlugin.Implementation@.
* <span class="label label-info">Renamed, Modified</span> @org.eclipse.sirius.eef.adapters.Activator@ has been renamed into @org.eclipse.sirius.eef.adapters.EEFAdapterPlugin@ and is no longer an OSGi bundle activator (hence the name change, to avoid confusion). Instead it extends @org.eclipse.emf.common.EMFPlugin@. The actual bundle activator is the new internal class @EEFAdapterPlugin.Implementation@.
* <span class="label label-info">Renamed, Modified</span> @org.eclipse.sirius.common.acceleo.interpreter.Activator@ has been renamed into @org.eclipse.sirius.common.acceleo.interpreter.InterpreterViewPlugin@ and is no longer an OSGi bundle activator (hence the name change, to avoid confusion). Instead it extends @org.eclipse.emf.common.EMFPlugin@. The actual bundle activator is the new internal class @InterpreterViewPlugin.Implementation@.
* <span class="label label-info">Renamed, Modified</span> @org.eclipse.sirius.table.ui.ext.Activator@ has been renamed into @org.eclipse.sirius.table.ui.ext.TableUIExtPlugin@ and is no longer an OSGi bundle activator (hence the name change, to avoid confusion). Instead it extends @org.eclipse.emf.common.EMFPlugin@. The actual bundle activator is the new internal class @TableUIExtPlugin.Implementation@.
* <span class="label label-info">Renamed, Modified</span> @org.eclipse.sirius.ui.ext.Activator@ has been renamed into @org.eclipse.sirius.ui.ext.SiriusUIExtPlugin@ and is no longer an OSGi bundle activator (hence the name change, to avoid confusion). Instead it extends @org.eclipse.emf.common.EMFPlugin@. The actual bundle activator is the new internal class @SiriusUIExtPlugin.Implementation@.
* <span class="label label-info">Renamed, Modified</span> @org.eclipse.sirius.tree.ui.ext.Activator@ has been renamed into @org.eclipse.sirius.tree.ui.ext.TreeUIExtPlugin@ and is no longer an OSGi bundle activator (hence the name change, to avoid confusion). Instead it extends @org.eclipse.emf.common.EMFPlugin@. The actual bundle activator is the new internal class @TreeUIExtPlugin.Implementation@.
* <span class="label label-info">Renamed</span> @org.eclipse.sirius.diagram.sequence.ui.SequenceDiagramPlugin@ has been renamed into @org.eclipse.sirius.diagram.sequence.ui.SequenceDiagramUIPlugin@ for consistency and to avoid potential name clashes with the new @org.eclipse.sirius.diagram.sequence.SequenceDiagramPlugin@.

Additional non-breaking changes:
* <span class="label label-success">Added</span> @org.eclipse.sirius.ext.base.I18N@ has been added. It provides common utility code to support internationalization. 
* <span class="label label-success">Added</span> The translation keys (and default values) have been added to all the concerned bundles, in their @plugin.properties@ file. These (translated) messages are available at runtime as static fields of new @Messages@ classes, added to all concerned bundles (always in the same package as their plug-in/activator class). The concerned bundles are:
** @org.eclipse.sirius@
** @org.eclipse.sirius.ext.base@
** @org.eclipse.sirius.ecore.extender@
** @org.eclipse.sirius.synchronizer@
** @org.eclipse.sirius.common@
** @org.eclipse.sirius.common.acceleo.aql@
** @org.eclipse.sirius.common.acceleo.aql.ide@
** @org.eclipse.sirius.common.acceleo.mtl@
** @org.eclipse.sirius.common.acceleo.mtl.ide@
** @org.eclipse.sirius.common.ui@
** @org.eclipse.sirius.diagram.layoutdata@
** @org.eclipse.sirius.diagram.sequence@
** @org.eclipse.sirius.diagram.sequence.ui@
** @org.eclipse.sirius.diagram@
** @org.eclipse.sirius.diagram.ui@
** @org.eclipse.sirius.eef.adapters@
** @org.eclipse.sirius.interpreter@
** @org.eclipse.sirius.table@
** @org.eclipse.sirius.table.ui@
** @org.eclipse.sirius.tree@
** @org.eclipse.sirius.tree.ui@
** @org.eclipse.sirius.ui@

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

* <span class="label label-success">Added</span> The method @invokeMethod@ has been added in class @org.eclipse.sirius.common.tools.api.util.ReflectionHelper@ to call a private method. Warning: This method must be used carefully.
* <span class="label label-success">Added</span> The method @invokeMethodWithoutException@ has been added in class @org.eclipse.sirius.common.tools.api.util.ReflectionHelper@ to call a private method. This method returns true (and not the result of the method) if it is called without exception. It returns false otherwise. Warning: This method must be used carefully.

* <span class="label label-success">Added</span> The new interface @org.eclipse.sirius.common.tools.api.interpreter.IInterpreterWithDiagnostic@ has been added. It allows an interpreter to evaluate an expression and return not only the result of the evaluation but also a diagnostic.
* <span class="label label-success">Added</span> The new class @org.eclipse.sirius.common.tools.api.contentassist.ContentProposalWithReplacement@ has been added. It allows interpreters to provide proposals for the code completion which can replace an existing part of the expression used. This behavior can be used if the user has started to type a value that would be returned by the code completion. For example, if the user types @aql:self.na@ and if he selects the content proposal @name@, it can replace the existing part of the expression @na@ to write @aql:self.name@ instead of just appending @name@ to create @aql:self.naname@.
* <span class="label label-success">Added</span> The new class @org.eclipse.sirius.common.tools.api.contentassist.ContentProposalBuilder@ used to build the content proposals with their various parameters more easily.

h4. Changes in @org.eclipse.sirius@

* <span class="label label-success">Added</span> The method @addEvaluateSelectionExpressionTask@ has been added in class @org.eclipse.sirius.tools.api.command.AbstractCommandFactory@ to allow selection after tool execution.
* <span class="label label-success">Added</span> The class @org.eclipse.sirius.common.tools.api.interpreter.StandardServices@ has been added. This class owns methods used for @service:@ interpreter.
* <span class="label label-success">Added</span> The class @org.eclipse.sirius.business.api.extender.MetamodelDescriptorProvider2@ has been added and should be preferred instead of implementing @MetamodelDescriptorProvider@.
* <span class="label label-success">Added</span> @org.eclipse.sirius.business.api.componentization.ViewpointRegistryImpl.addViewpointFileCollector()@ method has been added to replace deprecated @ViewpointRegistryImpl.addSiriusFileCollector()@.
* <span class="label label-info">Modified</span> @org.eclipse.sirius.ecore.extender.business.api.permission.IPermissionAuthority.canDeleteInstance(EObject)@ when called for an object will not be called for children of this object as we know it will return true because if we can delete a parent object we can delete its children. 
* <span class="label label-info">Modified</span> @org.eclipse.sirius.tools.api.command.DCommand@ no longer inherits from @IUndoableCommand@ since undo/redo is managed by EMF Transaction.
* <span class="label label-warning">Deprecated</span> @org.eclipse.sirius.business.api.componentization.ViewpointRegistryImpl.addSiriusFileCollector()@ method has been deprecated as it is about @ViewpointFileCollector@ and not @SiriusFileCollector@.
* <span class="label label-danger">Removed</span> @org.eclipse.sirius.business.api.helper.task.ICommandTask.undo()/redo()@ methods removed because they are useless since undo/redo is managed by EMF Transaction.
* <span class="label label-danger">Removed</span> @org.eclipse.sirius.tools.api.command.IUndoableCommand@ interface removed because it is useless since undo/redo is managed by EMF Transaction.

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

* <span class="label label-success">Added</span> @org.eclipse.sirius.ui.business.api.session.SessionEditorInput.getInput()@ method has been added to get the real input for a @DRepresentation@.
* <span class="label label-success">Added</span> @org.eclipse.sirius.ui.business.api.session.SessionEditorInput.getSession(boolean)@ method has been added to let the caller choose to create and open a new @Session@ or not when the known session is closed or does not exist. The @getSession@ method calls getSession(true).
* <span class="label label-success">Added</span> @org.eclipse.sirius.ui.business.api.dialect.DialectUIServices.selectAndReveal(DialectEditor, List<DRepresentationElement>)@ method has been added to explicitly indicate to reveal elements out of the screen (hidden because of the scrollbars location) when selecting them.
* <span class="label label-warning">Deprecated</span> @org.eclipse.sirius.ui.business.api.session.SessionEditorInput.dispose()@ method has been deprecated as an @IEditorInput@ can be reused by several instances of @IEditorPart@ through the navigation history view.

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

* <span class="label label-success">Added</span> The class @org.eclipse.sirius.diagram.ui.graphical.edit.policies.RegionRegionContainerResizableEditPolicy@ has been added to handle @DNodeContainer@ which are both @Region@ and @RegionContainer@: during resize they might have to propagate the resize to their children and/or parents.
* <span class="label label-success">Added</span> The constant @org.eclipse.sirius.diagram.ui.tools.api.layout.LayoutUtils.COLLAPSED_VERTICAL_REGION_HEIGHT@ has been added to centralize the minimum height of a collapsed Region from a Region Container with a vertical stack children presentation.
* <span class="label label-success">Added</span> @org.eclipse.sirius.diagram.ui.edit.api.part.IDiagramNodeEditPart/IDiagramBorderNodeEditPart.getNodeLabel()@ methods has been moved up to @org.eclipse.sirius.diagram.ui.edit.api.part.IAbstractDiagramNodeEditPart.getNodeLabel()@ as both @IDiagramNodeEditPart@ and @IDiagramBorderNodeEditPart@ inherits of @IAbstractDiagramNodeEditPart@.
* <span class="label label-success">Added</span> @org.eclipse.sirius.diagram.ui.tools.api.ui.actions.ActionIds.ARRANGE_BORDER_NODES@ added to replace @org.eclipse.sirius.diagram.ui.tools.api.ui.actions.ActionIds.ARRANGE_BORDERED_NODES_TOOLBAR@ which is deprecated.
* <span class="label label-success">Added</span> @org.eclipse.sirius.diagram.ui.tools.api.ui.actions.ActionIds.ARRANGE_BORDER_NODES_TOOLBAR@ added to replace @org.eclipse.sirius.diagram.ui.tools.api.ui.actions.ActionIds.ARRANGE_BORDERED_NODES@ which is deprecated 
* <span class="label label-success">Added</span> @org.eclipse.sirius.diagram.ui.graphical.edit.policies.SetConnectionBendpointsAndLabelCommmand@ is a new class that allows to update edge label when updating bendpoints. Several existing Sirius commands now extends this new class.
* <span class="label label-success">Added</span> @org.eclipse.sirius.diagram.ui.tools.api.decorators.AbstractSiriusDecorator.shouldBeVisibleAtPrint()@ method added to leave @AbstractSiriusDecorator@ extenders indicate if decoration should be visible at diagram export/print.
* <span class="label label-warning">Deprecated</span> @org.eclipse.sirius.diagram.ui.tools.api.ui.actions.ActionIds.ARRANGE_BORDERED_NODES@ deprecated in favor @org.eclipse.sirius.diagram.ui.tools.api.ui.actions.ActionIds.ARRANGE_BORDER_NODES@ as it is an action id about border nodes layout.
* <span class="label label-warning">Deprecated</span> @org.eclipse.sirius.diagram.ui.tools.api.ui.actions.ActionIds.ARRANGE_BORDERED_NODES_TOOLBAR@ deprecated in favor @org.eclipse.sirius.diagram.ui.tools.api.ui.actions.ActionIds.ARRANGE_BORDER_NODES_TOOLBAR@ as it is an action id about border nodes layout.
* <span class="label label-danger">Removed</span> @org.eclipse.sirius.diagram.ui.graphical.edit.policies.EdgeCreationEditPolicy@ has been removed as it should not be in API and has been replaced by internal @org.eclipse.sirius.diagram.ui.internal.edit.policies.SiriusConnectionEditPolicy@.
* <span class="label label-danger">Removed</span> The method @setUseLocalCoordinates(boolean)@ has been removed from @org.eclipse.sirius.diagram.ui.tools.api.figure.GradientRoundedRectangle@, @org.eclipse.sirius.diagram.ui.tools.api.figure.ViewNodeContainerParallelogram@, @org.eclipse.sirius.diagram.ui.tools.api.figure.ViewNodeContainerRectangleFigureDesc@ as it was generated by GMF tooling and never used in Sirius whose edit parts and edit policies expect @org.eclipse.draw2d.IFigure.useLocalCoordinates()@ to always return false for its figures. 

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

* <span class="label label-success">Added</span> @org.eclipse.sirius.synchronizer.CreatedOutput.synchronizeChildren()@ method takes now a @RefreshPlan@ in parameter to have more informations to say if children must be synchronized.

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

* <span class="label label-success">Added</span> The class @org.eclipse.sirius.tests.support.api.AbstractToolDescriptionTestCase@ has been created. It contains utility methods about tools.
* <span class="label label-info">Modified</span> The class @org.eclipse.sirius.tests.support.api.SiriusDiagramTestCase@ has been modified 
** <span class="label label-info">Modified</span> It now inherits from @AbstractToolDescriptionTestCase@ 
** <span class="label label-success">Added</span> The method @applyContainerCreationTool(String,DDiagram,EObject)@ has been added.
** <span class="label label-success">Added</span> The method @applyGenericTool(String,DDiagram,EObject)@ has been added.

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

* <span class="label label-success">Added</span> The methods @closePerspective(String)@, @closeSiriusPerspective()@ and @closeModelingPerspective()@ have been added in class @org.eclipse.sirius.tests.swtbot.support.api.perspective.DesignerPerspectives@ to allow the closing of perspectives.
* <span class="label label-success">Added</span> The @org.eclipse.sirius.tests.swtbot.support.api.condition.PerspectiveActivatedCondition@ new offers the capability to inverse the test. This condition becomes a DeactivatedCondition instead of an ActivatedCondition by using the new constructor with inverse parameter.
* <span class="label label-success">Added</span> The methods @isSnapToShape@ and @isSnapToGrid()@ have been added in class @org.eclipse.sirius.tests.swtbot.support.api.editor.SWTBotSiriusDiagramEditor@. They allow to know the state of the corresponding properties.
* <span class="label label-success">Added</span> The method @org.eclipse.sirius.tests.swtbot.support.api.editor.SWTBotSiriusDiagramEditor.dragWithKey(int, int, int, int, int)@ (and also @SWTBotSiriusGefViewer.dragWithKey@ and @SWTBotSiriusFigureCanvas.mouseDragWithKey@), has an additional fifth parameter compared to @drag(int, int, int, int)@ method, to indicate the key code to press during the drag'n'drop. It is possible to call this method with @SWT.None@ to obtain the standard behavior of @drag@ method. This method also has a correct behavior for the move of bendpoints of edges.
* <span class="label label-success">Added</span> @org.eclipse.sirius.tests.swtbot.support.api.condition.TopCondition@: New condition to wait that top of the edit part is on the expected location.
* <span class="label label-success">Added</span> @org.eclipse.sirius.tests.swtbot.support.api.condition.BendpointLocationCondition@: New condition to wait that a bendpoint is on the expected x or y location.
* <span class="label label-success">Added</span> @org.eclipse.sirius.tests.swtbot.support.api.condition.TreeChildrenNumberCondition@: New condition to wait that a tree has the expected number of children.
* <span class="label label-success">Added</span> @org.eclipse.sirius.tests.swtbot.support.utils.SWTBotCommonHelper.saveCurrentEditor(Session)@: This new method is preferable to @saveCurrentEditor()@ because there is a wait condition to ensure that the save is finished.
* <span class="label label-info">Modified</span> @org.eclipse.sirius.tests.swtbot.support.api.condition.CheckBoundsCondition@: This condition now also checks the bounds location if the checkWidth or checkHeight (or both) is false.

h4. Changes in @org.eclipse.sirius.ext.gef@

* <span class="label label-success">Added</span> The new class @org.eclipse.sirius.ext.gef.query.EditPartQuery@ has been added. It allows to retrieve all children of the current part.

h4. Changes in @org.eclipse.sirius.ext.jface@

* <span class="label label-success">Added</span> The new class @org.eclipse.sirius.ext.jface.viewers.IToolTipProvider@ has been copied from JFace 3.10 from Luna, so that we can use it with Juno and Kepler too.

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

* <span class="label label-success">Added</span> Two new @getIntersection@ methods have been added in @org.eclipse.sirius.ext.gmf.runtime.editparts.GraphicalHelper@. They are similar to the existing @getIntersection@ methods, but they consider the nearest point on the figure if there is no intersection.

h2(#sirius3.0.0). Changes in Sirius 3.0.0

h3. User-Visible Changes

* <span class="label label-success">Added</span> The ability to print table representations has been re-introduced.
* <span class="label label-success">Added</span> The quick outline feature has been added for tree and table editors, see documentation for details.
* <span class="label label-success">Added</span> The label of a list or container can now be hidden by the user from the outline, the tabbar or the contextual menu.
* <span class="label label-success">Added</span> In the _Appearance_ tab, in addition to _Bold_ and _Italic_, it is now possible to set the font formatting style to _Underline_ and _Strike through_ (or any combination of these).
* <span class="label label-success">Added</span> Container elements on diagrams now support vertical and horizontal compartments layout (this is only visible if the modeler configuration makes use of this new feature). 
* <span class="label label-success">Added</span> In table and tree editors, a _Refresh_ can now be launched by hitting <kbd>F5</kbd> like in diagrams (previously the only way was to click on the _Refresh_ icon or menu item).
* <span class="label label-success">Added</span> In table editors, hitting the <kdb>Del</kdb> key is now equivalent to selecting _Delete Line_ in the context menu.
* <span class="label label-success">Added</span> On diagrams, it is now possible to set a custom background image on list containers.
* <span class="label label-info">Modified</span> In the _Viewpoint Selection_ dialog and wizard page, the "plug-in" decorator for viewpoints loaded from plug-ins is removed, and a "Folder" decorator for viewpoints loaded from the current workspace has been added. This makes the icons more visible in the most common where viewpoints come from installed plug-ins.

h3. Specifier-Visible Changes

* <span class="label label-success">Added</span> <span class="label label-info">Experimental</span> Optional support for the experimental _Acceleo Query Language_ (AQL) has been added to write interpreted expressions.  It is provided by the @org.eclipse.sirius.common.acceleo.aql@ (required for evaluating the expressions) and @org.eclipse.sirius.common.acceleo.aql.ide@  (optional, only needed to provide specification-time features like expression completion) plug-ins. AQL is similar to Acceleo 3/MTL, but simpler and provides much better performance in the Sirius context. If you make use of this feature, be aware that some details may still change in future releases, including 3.0.x maintenance releases. See <a href="https://www.eclipse.org/acceleo/documentation/aql.html" target="_blank">the AQL documentation</a> for more details on the language itself.
* <span class="label label-success">Added</span> <span class="label label-info">Experimental</span> New, experimental support for containers with vertical or horizontal _compartments_ on diagrams: the _children presentation_ property of a _Container Mapping_ has two new values: _Vertical Stack_ and _Horizontal Stack_. They indicate that a container will present its children containers as a vertical/horizontal stack of compartments. While working reliably, this support is marked experimental in Sirius 3.0.0 as there are still some combinations of mappings, styles and behaviors which do not behave as expected. If you make use of this feature, be aware that some details may still change in future releases, including 3.0.x maintenance releases.
* <span class="label label-success">Added</span> Everywhere an image path can be configured in the VSM, a new button is present on the right of the text field. It opens a dialog to select an image, either from the workspace or from an installed plug-in.
* <span class="label label-success">Added</span> Everywhere an interpreted expression can be configured in the VSM, a new button is present on the right of the text field. It opens a multi-line dialog to edit long expression more easily. Auto-completion is supported inside the multi-line dialog.
* <span class="label label-success">Added</span> Compressed SVG images (@*.svgz@) are now supported everywhere normal SVG images were supported.
* <span class="label label-success">Added</span> When developing a modeler in "live mode", with the VSM in the same workspace as the sample session(s) which use it, VSM expressions which use @service:@ or @aql:@ can now invoke Java services which are defined in the workspace (with no need to launch a separate runtime).
* <span class="label label-success">Added</span> A quick outline is now accessible in the VSM editor by using the shortcut <kbd>Ctrl+o</kbd>. It supports filtering on both an element's name and properties for quick, keyboard-only navigation in complex VSMs.
* <span class="label label-success">Added</span> The "hide label by default capability" has been added to the container styles.
* <span class="label label-success">Added</span> In addition to _Bold_ and _Italic_, _Underline_ and _Strike Through_ styles have been added on the label font format.
* <span class="label label-success">Improved</span> Many VSM elements which are required are now created automatically. For example the default layer of a _Diagram Description_ is automatically added to new _Diagram Descriptions_.
* <span class="label label-success">Improved</span> Some default values have been modified to better reflect actual usage. This does not impact existing VSM and only applies to newly created elements.
** The label position on a _Node_ mapping is now _node_ by default (instead of _border_ before).
** The _Arc Width_ and _Arc Height_ are now 10 by default (instead of 1 before).
** The _Enable popup bars_ is now set by default on new diagrams.
** No default value for interpreted expressions use the Acceleo 3 / MTL syntax anymore, but only use the core @var:@ and @feature:@ interpreters, which are always present.
* <span class="label label-success">Improved</span> The precision of the VSM validation, especially regarding the typing of computed expressions, has been greatly improved. Other validation rules like static image paths have also been added or improved.
* <span class="label label-info">Modified</span> In the VSM editor, the context menu entries (categories and items) have been reorganized to put most common actions/items first.
* <span class="label label-info">Modified</span> In diagrams, the style previously named "Lozenge" is now called "Diamond".
* <span class="label label-info">Modified</span> In the _Open_ menu on a representation, the menu is computed from the navigation tool's label instead of its name/id.
* <span class="label label-info">Modified</span> All Acceleo 3 references have been removed from the Sirius metamodels to avoid a dependency to Acceleo 3. An automatic migration has been added during the loading of the VSM to avoid a change of behavior. This migration adds explicitly the old default value (@[eContents()->size()/]@) in the VSM, that was implicit before. Customers who want to completely remove this dependency must remove the Acceleo 3 expressions from there VSM after the migration.
* <span class="label label-info">Modified</span> The default icons paths of _Selection Wizard_ and _Pane-Based Selection Wizard_ used to reference invalid icons, so the corresponding tools had no icon per default in the palette. The default icons paths have been corrected to reference the icons displayed for those elements in the VSM editor.
* <span class="label label-info">Modified</span> "@*@" can now be used as feature name of a table's _Feature Column_ to skip the feature name validation during the cell creation. This allow to compute the label of cells for lines whose semantic element types have no common _EStructuralFeature_ (inherited or with same name).

h3. Developer-Visible Changes

The most important and impacting changes in this release are (details below in plug-in specific sections):
* <span class="label label-success">Added</span>  The new extension point @org.eclipse.sirius.ui.siriuspropertiescelleditor@, defined in @org.eclipse.sirius.ui@, can be used to provide customized cell editors for semantic element's properties as shown in the properties view on a Sirius representation.
* <span class="label label-success">Added</span>  The new class @org.eclipse.sirius.eef.components.SiriusAwarePropertiesEditingComponent@ can be used as root class of the generated EEF components to greatly improve performances when using both EEF properties views with Sirius representations. 
* <span class="label label-info">Modified</span> The minimum version of EEF required for using @org.eclipse.sirius.eef.adapters@ is now 1.5.0 (from 1.2 before). EEF 1.5 is source and binary-compatible with EEF 1.2 to 1.4, and no re-generation of the EEF views should be needed to switch to 1.5.
* <span class="label label-info">Modified</span> The @org.eclipse.sirius.business.internal.session.IsModifiedSavingPolicy@ saving policy, introduced in Sirius 2.0.0 but not enabled at that time is now the default. The previous implementation, @org.eclipse.sirius.business.api.session.SavingPolicyImpl@ is still available if needed.
* <span class="label label-info">Modified</span> All metamodels defined by Sirius have been modified to use EMF's @MinimalEObjectImpl.Container@ as base class, which reduces memory consumption compared to previous versions.
* <span class="label label-info">Modified</span> The @RGBValues@ type used in Sirius to represent colors has been converted into an immutable EMF EDataType, which also reduces memory consumption compared to previous versions.
* <span class="label label-info">Modified</span> The @AirdResourceImpl@ type, use for the @*.aird@ resources, no longer inherits from GMF's @GMFResource@ or depend on GMF in any way. This makes the @org.eclipse.sirius@ now completely independent on GMF.
* <span class="label label-info">Modified</span> The @DAnalsysis.models@ reference has been replaced by the @DAnalsysis.semanticModels@ attribute, in conjunction with the new @ResourceDescriptor@ data-type. The @DAnalysis.getModels()@ Java method is still present for compatibility and returns the same values, but the returned list can not be modified. All changes must be made directly on @DAnalsysis.semanticModels@ and will be reflected in the value returned by @DAnalysis.getModels()@. While not technically deprecated yet, @DAnalysis.getModels()@ should be avoided and may be removed in a future release.
* <span class="label label-info">Moved</span> Extensions in @plugin.xml@ that provide UI functionalities have been moved to new @org.eclipse.sirius.*.ext@ plug-ins, to make the contributions to the UI optional. If your product consumed directly the Sirius plug-ins instead of the high-level features, you may need to add the new plug-ins if you want the Sirius UI contributions to stay available.
* <span class="label label-danger">Removed</span> Many unused types defined in the metamodels have been removed. This should not impact normal client code. Existing models will be automatically migrated on loading if needed.
* <span class="label label-danger">Removed</span> Sirius no longer installs the @AirDCrossReferenceAdapterImpl@, which was a subclass of GMF's @CrossReferenceAdapter@ on session resources (@*.aird@). If your code relied on GMF's implementation to find inverse references, it can use the Sirius session's @Session.getSemanticCrossReferencer()@ instead, which provides the same service (and more) and avoids the redundant installation of GMF's version.

Packaging changes:
* <span class="label label-success">Added</span> Two new feature have been added concerning the new support for the AQL language:
** @org.eclipse.sirius.runtime.aql@ includes the minimum required to execute AQL queries at runtime. It must be present on end-users' systems for modelers which use AQL expressions to work.
** @org.eclipse.sirius.aql@ includes both the runtime requirements and the development-time features like support for auto-completion of AQL expressions in the VSM editor.
* <span class="label label-success">Added</span>  The new feature @org.eclipse.sirius.specifier@ includes everything needed to have a complete Sirius specification environment, with support for all dialects. It includes support for Acceleo 3/MTL queries, but not for AQL (provided by @org.eclipse.sirius.aql@) or OCL (provided by @org.eclipse.sirius.runtime.ocl@). Future Sirius releases will probably swap AQL and Acceleo 3, making AQL the defaut and part of the main feature, and Acceleo 3/MTL optional in a separate feature.
* <span class="label label-success">Added</span> All Sirius releases and milestones are available as zipped archives in addition to a normal p2 repository/update-site. For each version and platform (e.g. 3.0.0 on Eclipse Mars), two archives are available: one with the Sirius core, and one with the Sirius automated test suites and the sample modelers they rely on. See the "Sirius wiki":https://wiki.eclipse.org/Sirius/Update_Sites and release pages for more details and links to these archives, for example @http://download.eclipse.org/sirius/updates/releases/2.0.5/@. This is retro-active on all previously released versions of Sirius, but not on milestones before 3.0.0.

Other changes:
* <span class="label label-success">Added</span> Sirius now provides an <a href="http://www.eclipse.org/oomph" target="_blank">Oomph</a> setup file to automatically create a fully configured Eclipse installation ready for contributing patches to Sirius. The latest version can be obtained <a href="http://git.eclipse.org/c/sirius/org.eclipse.sirius.git/plain/releng/org.eclipse.sirius.settings/Sirius.setup" target="_blank">here</a>.
* <span class="label label-success">Added</span> New patches proposed by contributors on the <a href="https://git.eclipse.org/r/#/admin/projects/sirius/org.eclipse.sirius" target="_blank">Sirius Gerrit</a> now automatically trigger a sub-set of the Sirius automated test suites, which give a good feedback on the absence of regressions introduced by the proposed patch.

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

* <span class="label label-success">Added</span> The @org.eclipse.sirius.common.tools.api.util.SiriusCrossReferenceAdapter@ interface and the @org.eclipse.sirius.common.tools.api.util.SiriusCrossReferenceAdapterImpl@ have been added to have the capability to disable the proxy resolution. This feature is typically used to prevent loading a resource during its unloading. *Warning* : _Every additional custom CrossReferenceAdapter_  should extend @SiriusCrossReferenceAdapterImpl@ or at least implement @SiriusCrossReferenceAdapter@ with the same implementation as @SiriusCrossReferenceAdapterImpl@.
* <span class="label label-success">Added</span> @org.eclipse.sirius.common.tools.api.util.ECrossReferenceAdapterWithUnproxyCapability@ is a specific kind of @SiriusCrossReferenceAdapter@. It provides the capability to resolve all proxy cross references to a given resource. It is now used by the Session as semantic cross referencer. This type is exposed as API but it is not intended to be used/referenced/extended by user code (as the below @LazyCrossReferencer@ type).
* <span class="label label-success">Added</span> The static method @org.eclipse.sirius.common.tools.api.util.ReflectionHelper.getFieldValueWithoutException(Class<?>, String)@ has been added to return an internal static value of a class.   
* <span class="label label-success">Added</span> @org.eclipse.sirius.common.tools.api.resource.ResourceSetSync@ has a new state @CHANGES_CANCELED@ used to define the state where the user canceled its changes.
* <span class="label label-success">Added</span> The @org.eclipse.sirius.common.tools.api.resource.ImageFileFormat@ class has been added (it was in @org.eclipse.sirius.ext.swt@ before).
* <span class="label label-success">Added</span> The method @org.eclipse.sirius.common.tools.api.util.EclipseUtil.getConfigurationElementsFor()@ has been added: it calls @org.eclipse.core.runtime.Platform.getExtensionRegistry().getConfigurationElementsFor()@ only if @Platform.isRunning()@.
* <span class="label label-success">Added</span> The interface @org.eclipse.sirius.business.api.migration.IMigrationParticipant@ exposes a new method @postXMLEndElement([..])@ which is called during a migration operation. This method should be overridden by participants which have to hook the loading process after each end of XML tag. The  corresponding abstract class @org.eclipse.sirius.business.api.migration.AbstractMigrationParticipant@ provides a default empty  implementation.
* <span class="label label-success">Added</span> A new class @org.eclipse.sirius.common.tools.api.interpreter.JavaExtensionsManager@ can now be used by langages interpreters to benefit from a consistent handling of Java extensions and support for loading Java services from the workspace.
* <span class="label label-success">Added</span> The class @org.eclipse.sirius.common.tools.api.interpreter.TypeName@ has been introduced to represent in the codebase any type which was previously represented as a plain String.
* <span class="label label-success">Added</span> A new interface @org.eclipse.sirius.common.tools.api.interpreter.TypedValidation@ has been introduced for @IInterpreter@ implementations able to provide richer information when validating an expression. This information is captured through a @org.eclipse.sirius.common.tools.api.interpreter.ValidationResult@ instance.
* <span class="label label-success">Added</span> The class @org.eclipse.sirius.common.tools.api.interpreter.VariableType@ has been introduced to represent the possible types a variable can have in a Viewpoint specification model.
* <span class="label label-success">Added</span> The utility class @org.eclipse.sirius.common.tools.api.interpreter.IInterpreterContextUtils@ has been introduced to factorize code related to managing @IInterpreterContext@ instances.
* <span class="label label-success">Added</span> The class @org.eclipse.sirius.business.api.dialect.description.MultiLanguagesValidator@ has been introduced to provide a safe and more efficient way to switch to the proper @IInterpreter@ instance when validating expressions.
* <span class="label label-success">Added</span> <span class="label label-danger">Removed</span> The class @org.eclipse.sirius.common.tools.api.util.RefreshIdFactory@ has been replaced with @org.eclipse.sirius.common.tools.api.util.RefreshIdsHolder@ which no longer rely on a global singleton but attach information to an EObject representing the current scope. This impacts @org.eclipse.sirius.diagram.business.api.query.AbstractDNodeQuery@ , @org.eclipse.sirius.common.tools.api.util.CartesianProduct@ and @org.eclipse.sirius.common.tools.api.util.EObjectCouple@ which are now requiring now a @RefreshIdsHolder@ instance.
* <span class="label label-info">Modified</span>@org.eclipse.sirius.common.tools.api.util.LazyCrossReferencer@ now extends @ECrossReferenceAdapterWithUnproxyCapability@ and implements @resolveProxyCrossReferences(Resource)@.
* <span class="label label-info">Moved</span> The @org.eclipse.sirius.common.tools.api.util.LazyCrossReferencer.enableResolve()@  and @disableResolve()@  methods has been moved to @SiriusCrossReferenceAdapter.enableResolveProxy()@  and @disableResolveProxy()@.
* <span class="label label-info">Modified</span> The static method @org.eclipse.sirius.common.tools.api.interpreter.DefaultInterpreterContextFactory.createInterpreterContext(...)@ now requires a @Map<String, VariableType>@ for the accessible variables instead of a @Map<String, String>@.
* <span class="label label-info">Modified</span> The methods @org.eclipse.sirius.common.tools.api.interpreter.IInterpreterContext.getVariables()@  and @org.eclipse.sirius.business.api.dialect.description.IInterpretedExpressionQuery.getAvailableVariables()@ are now returning a map containing @VariableType@ instances instead of encoded Strings.
* <span class="label label-info">Modified</span> The method @org.eclipse.sirius.common.tools.api.interpreter.IInterpreterStatus.getTargetTypes()@ no longer returns a list of encoded Strings but a @VariableType@ instance instead.
* <span class="label label-warning">Deprecated</span> The method @org.eclipse.sirius.common.tools.api.interpreter.IInterpreterContext.getTargetTypes()@ has been deprecated in favor of @org.eclipse.sirius.common.tools.api.interpreter.IInterpreterContext.getTargetType()@ which returns a @VariableType@ instance instead of encoded Strings.

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

* <span class="label label-success">Added</span> Classes from @org.eclipse.sirius.common.ui.tools.api.dialog.quickoutline@ packages are available in API to allow editor to provide quick outline feature easily.
* <span class="label label-success">Added</span> The methods @displaySyncExec(Runnable)@ , @displayAsyncExec(Runnable)@ and @synchronizeWithUIThread()@ have been added in class @org.eclipse.sirius.common.ui.tools.api.util.EclipseUIUtil@ to encapsulate accesses to the current @Display@ instance.
* <span class="label label-info">Moved</span> Extensions in @plugin.xml@ that provide UI functionalities have been moved to @org.eclipse.sirius.common.ui.ext@.

h4. Changes in @org.eclipse.sirius@

* <span class="label label-success">Added</span> The method @org.eclipse.sirius.business.api.session.danalysis.DAnalysisSessionHelper.findContainerForAddedRepresentation(DAnalysis, DRepresentation)@ has been added to return a @DRepresentationContainer@ from the @DAnalysis@ parameter and the added @DRepresentation@.
* <span class="label label-success">Added</span> The method @org.eclipse.sirius.business.api.migration.IMigrationParticipant.updateCreatedObject(EObject newObject, String loadedVersion)@ has been added to update object values in VSM before loading this objects from XML file.
* <span class="label label-success">Added</span> The method @org.eclipse.sirius.tools.api.ui.RefreshEditorsPrecommitListener.disable()@ has been added to disable the next refresh attempt in the current precommit loop iteration.
* <span class="label label-success">Added</span> The new constant @org.eclipse.sirius.business.api.helper.SiriusUtil.ENVIRONMENT_URI_SCHEME@ declares environment URI scheme.
* <span class="label label-success">Added</span> The new constant @org.eclipse.sirius.business.api.helper.SiriusUtil.VIEWPOINT_ENVIRONMENT_RESOURCE_URI@ declares @environment:/viewpoint@ resource URI.
* <span class="label label-success">Added</span> The new constant @org.eclipse.sirius.viewpoint.description.util.DescriptionResourceImpl.OPTION_SIRIUS_USE_URI_FRAGMENT_AS_ID@ added to define a option to enable the use of a id map for odesign resource, id being uri's fragment. 
* <span class="label label-success">Added</span> The query @org.eclipse.sirius.business.api.query.EObjectQuery@ has now a new constructor with an additional parameter, ECrossReferenceAdapter. This can be usefull if there is many calls to inverse references methods for the same Session. This avoids to get the semantic cross referencer from the EObject each time. This query also proposes a new method @getInverseReferences(Set<EReference>)@.
* <span class="label label-success">Added</span> There is a new capability on Dialect. This capability is to refresh only impacted elements concerned by a list of notifications. It is used, for example, to refresh the opened representations when the user chooses manual refresh mode. Each dialect that want to offer this capability must implement @org.eclipse.sirius.business.api.dialect.DialectServices.refreshImpactedElements(DRepresentation, Collection<Notification>, IProgressMonitor)@. A default implementation that does nothing is done in @org.eclipse.sirius.business.api.dialect.AbstractRepresentationDialectServices@.
* <span class="label label-success">Added</span> A new method has been added in the query @org.eclipse.sirius.business.api.query.DAnalysisQuery@ named @getMainModels()@. This method returns a Set of the main model and the other non controlled models.
* <span class="label label-success">Added</span> A new method has been added in @org.eclipse.sirius.viewpoint.DAnalysis@ named @getSemanticResources()@. This method returns a list of @org.eclipse.sirius.business.api.resource.ResourceDescriptor@ which is a descriptor of the semantic resource.
* <span class="label label-info">Modified</span> @org.eclipse.sirius.viewpoint.RGBValues@ has been changed from an @EClass@ to an @EDataType@, it is not an @EObject@ anymore.
* <span class="label label-success">Added</span> The API @org.eclipse.sirius.business.api.metamodel.helper.FontFormatHelper@ has been added. It helps to update label format multi valued features.
* <span class="label label-info">Modified</span> @org.eclipse.sirius.business.api.session.SessionListener.SEMANTIC_CHANGE@ is no more send to @SessionListener@ and @SessionManagerListener@ listeners on save when a semantic resource is saved. Use a @ResourceSyncClient@ listener on @ResourceSetSync@ to have know if a semantic resource is saved.
* <span class="label label-info">Modified</span> The default constructor has been changed in @org.eclipse.sirius.tools.api.command.semantic.RemoveSemanticResourceCommand@.
** The boolean value @removeReferencingResources@ has been added to indicate if the referencing resources are also to remove.
** The boolean value @removeFromControlledResources@ has been removed because controlled resources are managed internally.
* <span class="label label-info">Modified</span> The boolean value @removeReferencingResources@ has been added in @org.eclipse.sirius.business.api.session.Session.removeSemanticResource@ method to indicate if the referencing resources are also to remove.
* <span class="label label-info">Modified</span> The @getModels()@ method in @org.eclipse.sirius.viewpoint.DAnalysis@ returns a non-modifiable list. Use @getSemanticResources()@ instead.
* <span class="label label-info">Moved</span> The @isBbocked()@ and @setBlocked()@ methods on the @org.eclipse.sirius.viewpoint.DAnalysisSessionEObject@ EClass have been removed, as they were not actually used in the internal code.
* <span class="label label-warning">Deprecated</span> @org.eclipse.sirius.business.api.helper.task.ICommandTask.undo()/redo()@ methods are deprecated because they are useless since undo/redo is managed by EMF Transaction.
* <span class="label label-warning">Deprecated</span> @org.eclipse.sirius.tools.api.command.IUndoableCommand@ interface are deprecated because it is useless since undo/redo is managed by EMF Transaction.
* <span class="label label-warning">Deprecated</span> @org.eclipse.sirius.business.api.helper.task.TaskExecutor.undo()/redo()@ methods are deprecated because they are useless since undo/redo is managed by EMF Transaction.
* <span class="label label-danger">Removed</span> The @org.eclipse.sirius.business.api.session.Session.createSemanticResource()@ method has been removed. Use @Session.addSemanticResource()@ instead.
* <span class="label label-danger">Removed</span> The @ExtendedPackage@ @EDataType@ which was defined in the @http://www.eclipse.org/sirius/1.1.0@ package was not actually used anywhere and has been removed.
* <span class="label label-danger">Removed</span> The @DView@ methods @getAllRepresentations()@, @getReferencedRepresentations()@ and @getHiddenRepresentations()@ have been removed: @getReferencedRepresentations()@ and @getHiddenRepresentations()@  were never actually used, making @getAllRepresentations()@ strictly equivalent to @getOwnedRepresentations()@. Code that used @getAllRepresentations()@ can simply use @getOwnedRepresentations()@ instead. 
* <span class="label label-danger">Removed</span> The API @org.eclipse.sirius.viewpoint.DSourceFileLink@ has been removed.
* <span class="label label-danger">Removed</span> The API @org.eclipse.sirius.viewpoint.DNavigable@ has been removed.
* <span class="label label-danger">Removed</span> The API @org.eclipse.sirius.viewpoint.DNavigationLink@ has been removed.
* <span class="label label-danger">Removed</span> The API @org.eclipse.sirius.viewpoint.DValidable@ has been removed.
* <span class="label label-danger">Removed</span> The enum @org.eclipse.sirius.viewpoint.NavigationTargetType@ has been removed.
* <span class="label label-danger">Removed</span> The API @org.eclipse.sirius.viewpoint.DLabelled@ has been removed.
* <span class="label label-danger">Removed</span> The API @org.eclipse.sirius.viewpoint.DContainer@ has been removed.

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

* <span class="label label-success">Added</span> The method @org.eclipse.sirius.ui.business.api.dialect.DialectUIServices.completeToolTipText(String, EObject, EStructuralFeature)@ has been added to customize the tooltip displayed in the VSM editor by using the feature of the current object. The old method @org.eclipse.sirius.ui.business.api.dialect.DialectUIServices.completeToolTipText(String, EObject)@ has been deprecated.
* <span class="label label-success">Added</span> The class @org.eclipse.sirius.ui.tools.api.properties.SiriusExtensiblePropertySource@ has been added. It allows developers to make their properties views CellEditor customizable by using the new extension point @org.eclipse.sirius.ui.siriuspropertiescelleditor@
* <span class="label label-success">Added</span> The interface @org.eclipse.sirius.ext.emf.ui.ICellEditorProvider@ has been added to allow clients to provide their own @CellEditor@ - in the Sirius semantic properties views - through the new extension point @org.eclipse.sirius.ui.siriuspropertiescelleditor@.
* <span class="label label-success">Added</span> The method @org.eclipse.sirius.ui.business.api.session.IEditingSession.detachEditor(DialectEditor, boolean)@ has been added to choose whether we should revert the user changes when detaching the editor.
* <span class="label label-success">Added</span> A @org.eclipse.sirius.ui.tools.api.views.LockDecorationUpdater@ is now available to add it on a @org.eclipse.ui.navigator.CommonNavigator@ to be refreshed when notifications are send to @org.eclipse.sirius.ecore.extender.business.api.permission.IAuthorityListener@. 
* <span class="label label-success">Added</span> A new job @org.eclipse.sirius.ui.tools.api.views.RefreshLabelImageJob@ has been added to refresh the icon of specified elements on a @org.eclipse.ui.navigator.CommonNavigator@.
* <span class="label label-info">Moved</span> Extensions in @plugin.xml@ that provide UI functionalities have been moved to @org.eclipse.sirius.ui.ext@.

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

* <span class="label label-info">Modified</span> The method @org.eclipse.sirius.ecore.extender.business.api.accessor.ModelAccessor.eRemoveInverseCrossReferences()@ has been changed to return the list of changed objects by the inverse cross references removal.
* <span class="label label-info">Modified</span> The method @org.eclipse.sirius.ecore.extender.business.api.accessor.IMetamodelExtender.eRemoveInverseCrossReferences()@ has been changed to return the list of changed objects by the inverse cross references removal.
* <span class="label label-info">Modified</span> The method @org.eclipse.sirius.ecore.extender.business.api.accessor.CompositeMetamodelExtender.eRemoveInverseCrossReferences()@ has been changed to return the list of changed objects by the inverse cross references removal.
* <span class="label label-danger">Removed</span> The exception @org.eclipse.sirius.ecore.extender.IllegalURIException@ has been removed. It was not actually thrown anywhere in the code.

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

* <span class="label label-success">Added</span> The static method @org.eclipse.sirius.editor.tools.api.assist.TypeContentProposalProvider.bindPluginsCompletionProcessors(AbstractPropertySection, Text)@ has been added. This method is very similar to @org.eclipse.sirius.editor.tools.api.assist.TypeContentProposalProvider.bindCompletionProcessor(AbstractPropertySection, Text)@, the difference is that it binds the completion processors available in plugins to the text.

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

* <span class="label label-success">Added</span> The @org.eclipse.sirius.diagram.tools.api.command.ChangeLayerActivationCommand@ has been added. This command was previously internal.
* <span class="label label-success">Added</span> The new constant @org.eclipse.sirius.diagram.business.api.helper.SiriusDiagramUtil.DIAGRAM_ENVIRONMENT_RESOURCE_URI@ declares the @environment:/diagram@ resource URI.
* <span class="label label-success">Added</span> The method @org.eclipse.sirius.diagram.business.api.diagramtype.IDiagramDescriptionProvider.completeToolTipText(String, EObject, EStructuralFeature)@ has been added to customize the tooltip displayed in the VSM editor by using the feature of the current object. The old method @org.eclipse.sirius.diagram.business.api.diagramtype.IDiagramDescriptionProvider.completeToolTipText(String, EObject)@ has been deprecated.
* <span class="label label-success">Added</span> New methods have been added to @org.eclipse.sirius.diagram.business.api.query.ContainerMappingQuery@ to test the children presentation mode of the current @ContainerMapping@: @isVerticalStackContainer()@, @isHorizontalStackContainer()@, @isRegionContainer()@ and @isRegion()@.
* @org.eclipse.sirius.diagram.business.api.query.AbstractDNodeQuery@ now requires a @org.eclipse.sirius.common.tools.api.util.RefreshIdsHolder@ to check for equality in the context of a refresh operation.
* <span class="label label-danger">Removed</span> The @DNodeList.lineWidth@ attribute has been removed from the metamodel, the corresponding generated elements do not exist anymore:  @org.eclipse.sirius.diagram.DNodeList.getLineWidth()@,  @org.eclipse.sirius.diagram.DNodeList.setLineWidth()@,  @org.eclipse.sirius.diagram.DiagramPackage.DNODE_LIST__LINE_WIDTH@, @org.eclipse.sirius.diagram.DiagramPackage.getDNodeList_LineWidth()@, @org.eclipse.sirius.diagram.DiagramPackage.Literals.DNODE_LIST__LINE_WIDTH()@.
* <span class="label label-danger">Removed</span> @org.eclipse.sirius.diagram.ComputedStyleDescriptionRegistry.cache@ reference has been removed from the metamodel as it is no more useful, to limit memory consumed by computed @StyleDescription@ we directly look for them in the @ComputedStyleDescriptionRegistry.computedStyleDescriptions@ list.

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

* <span class="label label-success">Added</span> <span class="label label-info">Modified</span>  The @org.eclipse.sirius.diagram.ui.tools.api.figure.ImageFigureWithAlpha@ interface has been added to identify Figures having the capability to return an alpha value from a coordinate. @org.eclipse.sirius.diagram.ui.tools.api.figure.AbstractCachedSVGFigure@ and @org.eclipse.sirius.diagram.ui.tools.api.figure.AbstractTransparentImage@  now implement this new interface.
* <span class="label label-success">Added</span> The method @org.eclipse.sirius.diagram.ui.tools.api.figure.locator.DBorderItemLocator.resetBorderItemMovedState()@ has been added to allow to reset the state of @borderItemHasMoved@. This method must be used carefully only in case where @setConstraint(Rectangle)@ is called to compute temporary a @getValidLocation(Rectangle, IFigure, Collection, List)@, one time with a new value and just after with the old value.
* <span class="label label-success">Added</span> The constant @org.eclipse.sirius.diagram.ui.tools.api.image.DiagramImagesPath.HIDDEN_LABEL_DECORATOR@ has been added to represent the path of hidden label decorator used in the outline.
* <span class="label label-success">Added</span> The class @org.eclipse.sirius.diagram.ui.business.api.provider.DDiagramElementContainerLabelItemProvider@ has been added to represent container and list labels as virtual nodes in the Show/Hide wizards.
* <span class="label label-info">Modified</span> The @org.eclipse.sirius.diagram.ui.tools.api.figure.locator.DBorderItemLocator@ did not take into account the rectangle size passed to @getValidLocation@. To resolve that limitation, several protected methods that took a Point as location now take a Rectangle:
** @locateOnBorder(Point, int, int, IFigure, Collection<IFigure>, List<IFigure>)@ now takes a @Rectangle@ instead a @Point@: @locateOnBorder(Rectangle, int, int, IFigure, Collection<IFigure>, List<IFigure>)@;
** @locateOnSouthBorder@, @locateOnNorthBorder@, @locateOnWestBorder@ and @locateOnEastBorder@ signatures is now @(Rectangle, int, IFigure, Collection<IFigure>, List<IFigure>)@;
** @locateOnParent@ signature is now @locateOnParent(Rectangle, int, IFigure)@;
** @conflicts@ signature is now @conflicts(Rectangle, IFigure, Collection<IFigure>, List<IFigure>)@.
* <span class="label label-info">Moved</span> The constant @DiagramImagesPath.LINK_TO_VIEWPOINT_IMG@ has been moved to @org.eclipse.sirius.ui.tools.api.image.ImagesPath.LINK_TO_VIEWPOINT_IMG@. This is more coherent because the corresponding image is in core @org.eclipse.sirius.common.ui@ plugin.
* <span class="label label-info">Moved</span> @org.eclipse.sirius.diagram.ui.tools.api.layout.PinHelper@ moved from @org.eclipse.sirius.diagram.ui@ plugin to @org.eclipse.sirius.diagram@ plugin, i.e. @org.eclipse.sirius.diagram.tools.api.layout.PinHelper@ with @PinHelper.IsPinned(IDiagramElementEditPart)@ removed in favor of @PinHelper.IsPinned(DDiagramElement)@.
* <span class="label label-info">Moved</span> External java actions declared as @org.eclipse.sirius.diagram.ui.tools.internal.actions.pinning.pinElementsActionId@ and @org.eclipse.sirius.diagram.ui.tools.internal.actions.pinning.unpinElementsActionId@ are now declared as @org.eclipse.sirius.diagram.tools.internal.actions.pinning.pinElementsActionId@ and @org.eclipse.sirius.diagram.tools.internal.actions.pinning.unpinElementsActionId@ in @org.eclipse.sirius.diagram@ plugin.
* <span class="label label-info">Moved</span> Extensions in @plugin.xml@ that provides UI functionalities have been moved to @org.eclipse.sirius.diagram.ui.ext@.
* <span class="label label-warning">Deprecated</span> @org.eclipse.sirius.diagram.ui.tools.api.util.GMFNotationHelper.findGMFDiagram()@ became deprecated in favor of @DiagramCreationUtil.findAssociatedGMFDiagram()/getAssociatedGMFDiagram()@
* <span class="label label-danger">Removed</span> The @org.eclipse.sirius.diagram.ui.edit.api.part.IDiagramEdgeEditPart.getEAdapterStrokeColor@ method has been removed as the corresponding adapter was uneffective and is no more used and installed on the edge edit parts.
* <span class="label label-danger">Removed</span> @org.eclipse.sirius.diagram.ui.tools.api.figure.InvisibleResizableCompartmentFigure@ class has been removed, use a @org.eclipse.gmf.runtime.diagram.ui.figures.ShapeCompartmentFigure@ with a @org.eclipse.draw2d.MarginBorder@ or a null border instead.
* <span class="label label-danger">Removed</span>  The method @org.eclipse.sirius.diagram.ui.edit.api.part.IDiagramElementEditPart.getEAdapterSemanticElements()@ has been removed (and all its implementations). For manual refresh, this adapter has been replaced with the @RefreshEditorsPrecommitListener@.
* <span class="label label-danger">Removed</span>   The method @org.eclipse.sirius.diagram.ui.part.SiriusDiagramEditorUtil.findView()@ has been deleted in flavor of @SiriusGMFHelper.getGmfView()@. If you was using @SiriusDiagramEditorUtil.findView()@ with a semantic element in parameter, retrieve before the corresponding @DDiagram@ or @DDiagramElement@ and use @SiriusGMFHelper.getGmfView(DSemanticDecorator)@ from this last to get the corresponding GMF View. To get a @DDiagram@ or @DDiagramElement@ from a semantic element, you can use @EObjectQuery.getInverseReferences(EReference)@ API, see @org.eclipse.sirius.diagram.ui.business.api.view.ValidateAction.getDSemanticDecorator()@ for an example. 

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

* <span class="label label-danger">Removed</span> The methods @org.eclipse.sirius.table.business.api.helper.TableHelper.getColumn()@ have been removed because they are not useful, @TableHelper.getColumn(DLine, int)@ can be replaced by @DTable.getColumns().get(int)@ and @TableHelper.getColumn(DTable, String)@ should not be used as we can have several columns with a same featureName.
* <span class="label label-danger">Removed</span> The method @org.eclipse.sirius.table.business.api.helper.TableHelper.getEClassifier(DLine, int)@ has been removed because it is not useful, use @TableHelper.getEClassifier(line, column)@ instead.
* <span class="label label-danger">Removed</span> The method @org.eclipse.sirius.table.business.api.helper.TableHelper.getTableElement(DTableElementStyle)@ has been removed because it is not useful, @DTableElementStyle.eContainer()@ can be used instead.
* <span class="label label-danger">Removed</span> The methods @org.eclipse.sirius.table.business.api.helper.TableHelper.getCell(DCellStyle)@ has been removed because they are not useful, use @DCellStyle.eContainer@ instead.
* <span class="label label-danger">Removed</span> The methods @org.eclipse.sirius.table.business.api.helper.TableHelper.getCell(RGBValues)@ has been removed, @RGBValues@ is not an @EObject@ anymore. The method was looking in the eContainer hierarchy of a an instance of @RGBValues@ to find the parent @DCell@.
* <span class="label label-danger">Removed</span> The method @org.eclipse.sirius.table.business.api.helper.TableHelper.getCreateCellTool(DCell)@ has been removed because it is not useful, use @TableHelper.getCreateCellTool(line, column)@ instead.
* <span class="label label-danger">Removed</span> The method @org.eclipse.sirius.table.business.api.helper.TableHelper.getCellDefaultForegroundColor()@ has been removed because it is not useful, use @EnvironmentSystemColorFactory.getDefault().getSystemColorDescription("gray")@ instead.
* <span class="label label-danger">Removed</span> The interface @DTableElementUpdater@ has been removed from metamodel. It is now unnecessary. This interface was here to provide operations to activate and deactivate the listeners, that have been replaced by the @RefreshImpactedElementsCommand@ launched from @RefreshEditorsPrecommitListener@.

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

* <span class="label label-info">Moved</span> Extensions in @plugin.xml@ that provide UI functionalities have been moved to @org.eclipse.sirius.table.ui.ext@.

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

* <span class="label label-success">Added</span> The method @org.eclipse.sirius.tree.business.api.interaction.DTreeItemUserInteraction.refreshContent(boolean fullRefresh)@ has been added to allow full refresh from a specified @DTreeItem@.
* <span class="label label-success">Added</span> The EMF Command @org.eclipse.sirius.tree.business.api.command.DTreeItemLocalRefreshCommand@ has been added to call @DTreeItemUserInteraction.refreshContent(boolean fullRefresh)@ in an EMF Command. 
* <span class="label label-success">Added</span> The method @org.eclipse.sirius.tree.business.api.interaction.DTreeItemUserInteraction.expand(IProgressMonitor)@ has been added similar to @DTreeItemUserInteraction.expand()@ but taking a @IProgressMonitor@ in parameter to have progression on @DTreeItem@ expanding.
* <span class="label label-success">Added</span> The method @org.eclipse.sirius.tree.business.api.interaction.DTreeItemUserInteraction.collapse(IProgressMonitor)@ has been added similar to @DTreeItemUserInteraction.collapse()@ but taking a @IProgressMonitor@ in parameter to have progression on @DTreeItem@ collapsing.
* <span class="label label-success">Added</span> The method @org.eclipse.sirius.tree.business.api.interaction.DTreeItemUserInteraction.expandAll(IProgressMonitor)@ has been added similar to @DTreeItemUserInteraction.expandAll()@ but taking a @IProgressMonitor@ in parameter to have progression on @DTreeItem@ expanding.
* <span class="label label-success">Added</span> The method @org.eclipse.sirius.tree.business.api.interaction.DTreeItemUserInteraction.refreshContent(boolean, IProgressMonitor)@ has been added similar to @DTreeItemUserInteraction.refreshContent(boolean)@ but taking a @IProgressMonitor@ in parameter to have progression on @DTreeItem@ expanding.
* <span class="label label-success">Added</span> The method @DTreeUserInteraction.expand(IProgressMonitor)@ has been added similar to @org.eclipse.sirius.tree.business.api.interaction.DTreeUserInteraction.expand()@ but taking a @IProgressMonitor@ in parameter to have progression on @DTreeItem@ expanding.
* <span class="label label-success">Added</span> The method @DTreeUserInteraction.expandAll(IProgressMonitor)@ has been added similar to @org.eclipse.sirius.tree.business.api.interaction.DTreeUserInteraction.expandAll()@ but taking a @IProgressMonitor@ in parameter to have progression on @DTreeItem@ expanding.
* <span class="label label-info">Modified</span> The constructor @org.eclipse.sirius.tree.business.api.command.DTreeItemExpansionChangeCommand.DTreeItemExpansionChangeCommand(GlobalContext, TransactionalEditingDomain, DTreeItem, IProgressMonitor, boolean)@ has an additional @IProgressMonitor@ parameter.
* <span class="label label-danger">Removed</span> The interface @DTreeElementUpdater@ has been removed from metamodel. It is now unnecessary. This interface was here to provide operations to activate and deactivate the listeners, that have been replaced by the @RefreshImpactedElementsCommand@ launched from @RefreshEditorsPrecommitListener@.

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

* <span class="label label-info">Modified</span> The method @org.eclipse.sirius.tree.ui.properties.section.common.AbstractDTreePropertySection.update(final TransactionalEditingDomain domain, final Notification notification)@ has been replaced by @org.eclipse.sirius.tree.ui.properties.section.common.AbstractDTreePropertySection.update(ResourceSetChangeEvent)@ to allow to update only once per ResourceSetChangeEvent and let subclasses make additional filtering on the notifications.
* <span class="label label-info">Modified</span> The return type of the method @org.eclipse.sirius.tree.ui.properties.section.common.AbstractDTreePropertySection.getEventListener()@ has been changed from @DemultiplexingListener@ to @ResourceSetListener@.
* <span class="label label-info">Modified</span> The type of @org.eclipse.sirius.tree.ui.properties.section.common.AbstractDTreePropertySection.eventListener@ has been changed from @DemultiplexingListener@ to @ResourceSetListener@.
* <span class="label label-info">Moved</span> Extensions in @plugin.xml@ that provide UI functionalities have been moved to @org.eclipse.sirius.tree.ui.ext@.

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

* <span class="label label-success">Added</span>  The method @org.eclipse.sirius.synchronizer.ModelToModelSynchronizer.update(CreatedOutput, boolean, IProgressMonitor)@ has been added similar to @org.eclipse.sirius.synchronizer.ModelToModelSynchronizer.update(CreatedOutput, boolean)@ but taking a @IProgressMonitor@ in parameter to have progression on synchronization.
* <span class="label label-info">Modified</span> The method @org.eclipse.sirius.synchronizer.SemanticPartitionInvalidator.hasFastResult(EObject, SemanticPartition, CreatedOutput)@ now takes a @CreatedOutput@ as additional parameter element to allow to have the parent output element.
* <span class="label label-info">Modified</span> The method @org.eclipse.sirius.synchronizer.SemanticPartition.evaluate(EObject, CreatedOutput)@ now takes a @CreatedOutput@ as additional parameter. This @CreatedOutput@ represents the output model element which will become the parent of the elements created from the evaluation result.

h4. Changes in @org.eclipse.sirius.ext.swt@

* <span class="label label-info">Moved</span> The @org.eclipse.sirius.ext.swt.ImageFileFormat@ class has been moved in @org.eclipse.sirius.common.tools.api.resource@ (in the @org.eclipse.sirius.common@ plugin).

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

* <span class="label label-success">Added</span> The classes @org.eclipse.sirius.ext.e3.ui.dialogs.FilteredTree@ and @org.eclipse.sirius.ext.e3.ui.dialogs.PatternFilter@ have been added in order to have the latest functionalites of @org.eclipse.ui.dialogs.FilteredTree@ with Eclipse Juno.

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

* <span class="label label-success">Added</span> The class @org.eclipse.sirius.ext.emf.tx.DelegatingValidateEditSupport@ has been added to be able to have a @ValidateEditSupport@ which delegate to an existing @ValidateEditSupport@.

h4. Changes in @org.eclipse.sirius.eef.adapters@

This plug-in now requires the version 1.5.0 of @org.eclipse.emf.eef.runtime@ bundle.

* <span class="label label-success">Added</span>  The new class @org.eclipse.sirius.eef.components.SiriusAwarePropertiesEditingComponent@ can be used as root class of the generated EEF components to greatly improve performances when using both EEF properties views with Sirius representations. Refer to _Using the Extended Editing Framework with Sirius_ documentation for details.
* <span class="label label-info">Modified</span>The following packages are set to @x-internal:=true@
** @org.eclipse.sirius.eef.actions@
** @org.eclipse.sirius.eef.adapters@

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

* <span class="label label-success">Added</span> The method @org.eclipse.sirius.tests.support.api.EclipseTestsSupportHelper.setReadOnlyStatus(boolean, IResource...)@ has been added to change the read only status of the given resources.
* <span class="label label-success">Added</span> The @warnings@ member variable has been added to @org.eclipse.sirius.tests.support.api.SiriusTestCase@ to allow the recording of warning logs. Methods @doesAWarningOccurs()@, @clearWarnings()@, @setWarningCatchActive(boolean)@, @isWarningCatchActive()@ and @getWarningLoggersMessage()@ have also been added to manage the @warnings@ member variable in the same way as the existing @errors@ member variable.
* <span class="label label-success">Added</span> The method @org.eclipse.sirius.tests.support.api.SiriusTestCase.loadModeler(URI, EditingDomain)@ has been added to load a VSM resource and make the @Viewpoints@ it defines accessible via the @SiriusTestsCase.viewpoints@ field.
* <span class="label label-success">Added</span> The class @org.eclipse.sirius.tests.support.api.ImageComposer@ has been added to the test API to do assertions on image decorators.
* <span class="label label-success">Added</span> The enum @SiriusTestCase.ResourceURIType@ and the method @SiriusTestCase.toURI(final String, ResourceURIType)@ have been added to allow choosing the type of URI created (@platform:@ or @plugin:@).
* <span class="label label-info">Modified</span> The @SiriusTestCase.genericSetUp(List<URI>, List<URI>, boolean, URI)@ method has been set to protected so that it can be called from concrete test cases. This method allows initializing session.
* <span class="label label-info">Moved</span> The class @TreeItemLabelFontFormatQuery@ was moved into @org.eclipse.sirius.tests.support.api@ (from @org.eclipse.sirius.tests.swtbot.support.api.widget@), as it can be used in non-SWTBot tests..
* <span class="label label-warning">Deprecated</span> The method @org.eclipse.sirius.tests.support.api.SiriusDiagramTestCase.setReadOnly(IFile)@ has been deprecated, @org.eclipse.sirius.tests.support.api.EclipseTestsSupportHelper.setReadOnlyStatus(boolean, IResource...)@ can be used instead.

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

* <span class="label label-success">Added</span> The @warnings@ member variable has been added to @org.eclipse.sirius.tests.swtbot.support.api.AbstractSiriusSwtBotGefTestCase@ to allow the recording of warning logs. Methods @doesAWarningOccurs()@, @setWarningCatchActive(boolean)@, @isWarningCatchActive()@ and @getWarningLoggersMessage()@ have also been added to manage the @warnings@ member variable in the same way as the existing @errors@ member variable.
* <span class="label label-success">Added</span> The method @org.eclipse.sirius.tests.swtbot.support.api.editor.SWTBotSiriusDiagramEditor.getDRepresentation()@ has been added to return the @org.eclipse.sirius.viewpoint.DRepresentation@ instance available in the diagram editor.
* <span class="label label-info">Modified</span> The method @org.eclipse.sirius.tests.swtbot.support.api.AbstractSiriusSwtBotGefTestCase.getSectionButton()@  now only takes the button's tooltip instead of a numerical position index and the tooltip.
* <span class="label label-info">Modified</span> The methods @org.eclipse.sirius.tests.swtbot.support.api.editor.SWTBotSiriusHelper.selectPropertyTabItem(String)@ now returns a @boolean@ that is true when the property tab item is found, false otherwise.
* <span class="label label-info">Moved</span> The class @TreeItemLabelFontFormatQuery@ was moved into @org.eclipse.sirius.tests.support.api@ (from @org.eclipse.sirius.tests.swtbot.support.api.widget@), as it can be used in non-SWTBot tests..
* <span class="label label-warning">Deprecated</span> The methods @org.eclipse.sirius.tests.swtbot.support.api.business.UIPerspective.deleteProject(UIProject)@ and @org.eclipse.sirius.tests.swtbot.support.api.business.UIPerspective.deleteProject(String)@ have been deprecated, @org.eclipse.sirius.tests.support.api.EclipseTestsSupportHelper.setReadOnlyStatus(boolean, IResource...)@ can be used instead.

h4. New plug-ins

The following UI plug-ins has been added:
* <span class="label label-success">Added</span> @org.eclipse.sirius.ui.ext@
* <span class="label label-success">Added</span> @org.eclipse.sirius.common.ui.ext@
* <span class="label label-success">Added</span> @org.eclipse.sirius.diagram.ui.ext@
* <span class="label label-success">Added</span> @org.eclipse.sirius.table.ui.ext@
* <span class="label label-success">Added</span> @org.eclipse.sirius.tree.ui.ext@

These plug-ins own the extension definitions related to perspective, views, newWizard, menus, contextual menus, editors and preference pages that were previously in @org.eclipse.sirius.xxx.ui@ plug-ins.
Now, downstream projects can define features that do not contain @org.eclipse.sirius.xxx.ui.ext@, allowing them not have all that functionalities they may not want.

h2(#sirius2.0.0). Changes in Sirius 2.0.0

h3. User-Visible Changes

* It is now possible to select element that intersects the selection rectangle and not that is completely contained by the selection rectangle. This new behavior is enabled when user selects elements from right to left. The normal mode (previous mode) remains when the user selects elements from left to right.
* The edges appearance is now kept, as much as possible, when one of its extremity is moved. A move of an extremity should move only the closest segment of the edge.
* The edges appearance is kept as much as possible when a node (container or not) is moved. A move of a node now impacts only the closest segment of the linked edges.
!images/moveNode-edgeImpact-changedBehavior.gif!
* When a node, container or not, is resized to the left, upwards, or both, the location of its children (elements inside a container and border nodes) is not changed. It is possible to retrieve the previous behavior by pressing the F3 function key during the resize.
!images/containerResize-changedBehavior.gif!
* The "snap to shapes" is now enabled by default (see  _Sirius > Sirius Diagram > Rulers and Grid_ preference page). This is true only for new diagrams. The existing diagrams are not impacted.
* The "Navigate" top-level contextual menu entry with mixed actions for creating new representations and opening existing ones has been changed by two top-level menus:
** One named "New", which lists only the available actions to create new representations on the selected element.
** One named "Open", which lists only the existing representations on the selected element. 
* When a shape is resized (no matter the direction), the edge(s) connection location (toward or from this one) is kept. Before that, edges connections moved according to the ratio of the resizing.
Example with this initial state before resizing:
!images/shapeResize1.png!
Result after resizing without this feature (the edges have moved):
!images/shapeResize2.png!
Result after resizing with this feature (the edges keep the same location):
!images/shapeResize3.png!
* There is now the possibility to distribute the selected shapes (see "Sirius User Manual/Diagrams/Features Overview/Distribute elements":user/diagrams/Diagrams.html#distribute for more details):
** Distribute gaps horizontally
** Distribute centers horizontally
** Distribute gaps vertically
** Distribute centers vertically
* The end user can now remove all bend-points between the two edge ends. This action is available on edge context menu "Remove Bend-points" or by using the shortcut "Ctrl" + "Shift" + "-".
* Reconnection of an edge will only now move the minimum necessary bendpoints instead of reseting it to default.
* A new action has been added to reset the diagram (or container) origin: the diagram (or container) bounds (the rectangle formed by the highest, the leftmost, the lowest and the rightmost children elements) can have a negative origin or can be shifted toward the bottom-right with a blank zone at the top-left. This action aims to move all diagram (or container) elements so that the it retrieves its origin while keeping elements layout.

h3. Specifier-Visible Changes

* The specifier can now choose to hold the edge ends toward the center of the source, target or both. New fields within the "advance" tab of EdgeStyle description have been added to choose for which source or target mappings an edge should be centered. See "Edges Styles > Edge Centering":specifier/diagrams/Diagrams.html#edges_styles in the specifier manual for more details.
* When creating a new Viewpoint Specification Project using the supplied wizard: _New > Viewpoint Specification Project_, the VSM name is now given according to the project name. If the project name is suffixed with "design", the VSM name is provided by the last word before this suffix. Otherwise, the VSM name is given by the last word of the project name.
* "Lozenge" is replaced by "Diamond" in diagram style.

h3. API Changes

h4. Changes in @org.eclipse.sirius@

* The @org.eclipse.sirius.business.api.session.ViewpointSelector@ class has been added, with easy-to-use methods to select/deselect viewpoint in a given session.
* The @VIEWPOINT_REGISTRY_INITIAL_SIZE@ preference and @VIEWPOINT_REGISTRY_INITIAL_SIZE_DEFAULT_VALUE@ default value has been removed from @org.eclipse.sirius.tools.api.preferences.DCorePreferences@.
* The method @org.eclipse.sirius.business.api.query.DRepresentationQuery.isDanglingRepresentation()@ has been added to introduce the possibility to check if a representation is a dangling representation, ie. if its a DSemanticDecorator, its target is null or does not belong to a session.
* @org.eclipse.sirius.ecore.extender.business.api.permission.exception.LockedInstanceException@ now can take several EObjects in constructor and a method @LockedInstanceException.getLockedElements()@ has been added to get all EObjects put in constructor.
@org.eclipse.sirius.tools.api.command.InvalidPermissionCommand@ now can take several EObjects in constructor to throw a @LockedInstanceException@ with several EObjects.
* The @org.eclipse.sirius.business.api.helper.task.AbstractDeleteDRepresentationElementTask@ class has been renamed into @DeleteEObjectTask@.
* The interface @org.eclipse.sirius.tools.api.command.listener.IChangeListener@ and all classes related to this mechanism (@ChangeListenerFactory@, @TriggerOperation@) have been removed as this mechanism proves to be inefficient. It can be replaced by a pre/post commit listener or a @org.eclipse.sirius.business.api.session.ModelChangeTrigger@
* The @org.eclipse.sirius.tools.api.ui.IExternalAction2@ interface has been removed. It was created to disable some @IChangeListener@ when the action indicates it will not delete elements.
* @org.eclipse.sirius.business.api.dialect.DialectServices.refresh(DRepresentation, boolean, IProgressMonitor@ has been added to specify if we want partial refresh or not. By default partial refresh is done. full refresh is only implements for tree dialect.
* @org.eclipse.sirius.business.api.dialect.AbstractRepresentationDialectServices.refresh(DRepresentation, IProgressMonitor)@ has been added to call by default @DialectServices.refresh(DRepresentation, false, IProgressMonitor)@ to do a partial refresh.
* @org.eclipse.sirius.business.api.dialect.command.RefreshRepresentationsCommand.RefreshRepresentationsCommand(TransactionalEditingDomain, boolean, IProgressMonitor, DRepresentation...)@ and @RefreshRepresentationsCommand(TransactionalEditingDomain, boolean, IProgressMonitor, Collection<DRepresentation>)@ constructors has been added to specify a partial refresh or a full refresh.
* @org.eclipse.sirius.business.api.dialect.DRepresentationNotificationFilter@ has been added to have
 a common precommit/postcommit notifications filter to tree/table dialect.
* @org.eclipse.sirius.tools.api.profiler.SiriusTasksKey.CHANGE_SWT_LINE_COLAPSE_STATE_KEY@ constant has been deprecated in favor of @SiriusTasksKey.CHANGE_SWT_LINE_COLLAPSE_STATE_KEY@ to fix a typo.
* @org.eclipse.sirius.business.api.color.AbstractColorUpdater.DEFAULT_RED_VALUE/DEFAULT_GREEN_VALUE/DEFAULT_BLUE_VALUE@ constants have been added to have access to default @RGBValues@'s values. This is used during refresh when there isn't any @ColorDescription@, for example in tree dialect where background color definition is optional.
* The @org.eclipse.sirius.business.api.tool.ToolFilterDescriptionListener.ToolFilterDescriptionListener()@ constructor now takes an @IInterpreter@ as additional parameter to capture the current interpreter and avoid calls to the @IInterpreterRegistry@ for each evaluation of the tool filter expressions.
* @org.eclipse.sirius.business.api.query.AirdResourceQuery.getAirDCrossReferenceAdapter()@ and @org.eclipse.sirius.business.internal.resource.AirdCrossReferencerAdapter@ have been removed. The adapter was here to customize GMF's own @org.eclipse.gmf.runtime.emf.core.util.CrossReferenceAdapter@. However considering the way Sirius uses GMF, this adapter is not needed.

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

* In @org.eclipse.sirius.ui.business.api.session.UserSession@, the methods @selectSirius()@, @selectOnlySirius()@ and @findSiriusByName()@ have been renamed into @selectViewpoint()@, @selectOnlyViewpoint()@ and @findViewpointByName()@ to correct a wrong rebranding.

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

* The method @org.eclipse.sirius.common.tools.api.resource.ResourceSetSync.getResourceSetSync(TransactionalEditingDomain)@ has been added to look for a @ResourceSetSync@ without creating a new one if no synchronizer currently exists.
* The class @org.eclipse.sirius.common.tools.api.util.SmartAdapter@ has been removed as this mechanism proves to be inefficient. The only user of this mechanism was the @org.eclipse.sirius.tools.api.command.listener.IChangeListener@ which has also been removed.
* The class @org.eclipse.sirius.common.tools.api.ecore.WorkspaceEPackageRegistry@ has been moved to the @org.eclipse.sirius.editor@ plugin. @org.eclipse.sirius.common.tools.DslCommonPlugin.getWorkspaceEPackageRegistry@ has been removed. The same method has been added in @org.eclipse.sirius.editor.editorPlugin.SiriusEditorPlugin@.
* A new class @org.eclipse.sirius.common.tools.api.resource.ResourceMigrationMarker@ has been introduced for adopters. This marker can be attached to a Resource in order to indicate that some automatic migration *might* have change the structure of the model during the loading (with no isModified flag). Sirius will then use this information to consider saving the file even if there is no logical change. 

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

* The method @org.eclipse.sirius.common.ui.tools.api.util.EclipseUIUtil.addSelectionListener(IWorkbenchPart, ISelectionListener)@ has been added to register a new selection listener to the site for the workbench part. This method looks for a @ISelectionService@ by calling @IServiceLocator.getService()@ on the site.
* The method @org.eclipse.sirius.common.ui.tools.api.util.EclipseUIUtil.removeSelectionListener(IWorkbenchPart, ISelectionListener)@ has been added to unregister an existing selection listener from site for the workbench part. This method looks for a @ISelectionService@ by calling @IServiceLocator.getService()@ on the site.

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

* The @org.eclipse.sirius.diagram.ui.business.api.view.refresh@ package and all its content has been move into the @org.eclipse.sirius.diagram@ plug-in, under the name @org.eclipse.sirius.diagram.business.api.view.refresh@.
* A new extension point @org.eclipse.sirius.diagram.canonicalSynchronizerFactoryOverride@ has been defined. Its only intended implementer is the @org.eclipse.sirius.diagram.ui@ plug-in. It is used by the diagram dialect's core to delegate to the UI plug-in the canonical synchronizer logic, which depends on the UI.
* In @org.eclipse.sirius.diagram.business.api.refresh.CanonicalSynchronizer@, a new method @postCreation()@ has been added. It is called exactly once, right after a diagram has been created and synchronized the first time.
* @org.eclipse.sirius.diagram.description.style.EdgeStyleDescription@ metamodel class has three more features: @centeredSourceMappings@, @centeredTargetMappings@ and @AlwaysCenter@. Those features let the specifier determine for which mappings the edge source/target should be centered or whether the source/target should be systematically centered. The @endsCentering@ values are restricted by the new @org.eclipse.sirius.diagram.description.CenteringStyle@ enumeration.
* @org.eclipse.sirius.diagram.EdgeStyle@ metamodel class has now an attribute @centered@ of type @org.eclipse.sirius.diagram.description.CenteringStyle@, to determine whether the edge target or source ends should be centered.


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

* The @org.eclipse.sirius.diagram.ui.business.api.view.refresh@ package and all its content has been move into the @org.eclipse.sirius.diagram@ plug-in, under the name @org.eclipse.sirius.diagram.business.api.view.refresh@.  
* The method @org.eclipse.sirius.diagram.ui.business.internal.query.DNodeContainerQuery.getDefaultDimension()@ has been added to compute the default size of a DNodeContainer.
* The parameter @additionalFiguresForConflictDetection@ has been added to several methods of @org.eclipse.sirius.diagram.ui.tools.api.figure.locator.DBorderItemLocator@. This parameter is used in case of simultaneous border nodes moves. This list corresponds to the already known border nodes feedbacks. They are used to detect conflicts with other moved nodes.
* @org.eclipse.sirius.diagram.ui.business.api.query.ConnectionEditPartQuery@ now provides two new methods @isEdgeWithRectilinearRoutingStyle()@ and @isEdgeWithObliqueRoutingStyle()@ that respectively checks if an edge has a rectilinear routing style or an oblique routing style.
* @org.eclipse.sirius.diagram.ui.business.api.query.ConnectionQuery@ now provides two new methods @getAbsoluteBendpointsConstraint()@ and @getRelativeBendpointsConstraint()@ that returns an option of list of @Bendpoint@ of a connection whether they are respectively @AbsoluteBendpoint@ or @RelatveBendpoint@.
* @org.eclipse.sirius.diagram.ui.business.api.query.EdgeQuery@ also provides two new methods @isEdgeWithRectilinearRoutingStyle()@ and @isEdgeWithObliqueRoutingStyle()@ that respectively checks if an edge has a rectilinear routing style or an oblique routing style.
* @org.eclipse.sirius.diagram.ui.tools.api.requests.DistributeRequest@: A new @ChangeBoundsRequest@ to manage distribution of shapes.
* A constant @REQ_DISTRIBUTE@ has been added in @org.eclipse.sirius.diagram.ui.tools.api.requests.RequestConstants@ to identify the new type of request, @DistributeRequest@.
* Constants have been added in @org.eclipse.sirius.diagram.ui.tools.api.ui.actions.ActionIds@ for the new drop down menu in tabbar and for the four new distribute actions.
* Constants have been added in @org.eclipse.sirius.diagram.ui.tools.api.image.DiagramImagesPath@ for the icon path of the four new distribute actions.
* A new method has been added in @org.eclipse.sirius.diagram.ui.business.api.view.SiriusLayoutDataManager@ to retrieve the opposite edge layout data of another edge layout data. An edge layout data stored in the incomingEdgeLayoutDatas ref of its parent data can have an opposite edge layout data in the outgoingEdgeLayoutDatas of the other ends.
* A Constant @org.eclipse.sirius.diagram.ui.tools.api.requests.RequestConstants.REQ_RESET_ORIGIN@ has been added to identify requests to get the ResetOrigin command.
* A new method @org.eclipse.sirius.diagram.ui.business.api.query.NodeQuery.isContainer()@ has been added to test whether the GMF node visualID corresponds to a ContainerEditPart.

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

* @org.eclipse.sirius.tree.ui.business.api.helper.TreeUIHelper.toContentHTMl()@ has changed of behavior: refresh of @DTree@ is now partial, i.e. not done for children of collapsed @DTreeItemContainer@. Consequently code calling @TreeUIHelper.toContentHTMl()@ must do a full refresh if children of collapsed @DTreeItemContainer@ must be displayed in returned HTML.
* @org.eclipse.sirius.tree.ui.business.api.helper.TreeUIHelper.toTreeDescriptor()@ same as for @TreeUIHelper.toContentHTMl()@

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

* @org.eclipse.sirius.tree.business.api.interaction.DTreeUserInteraction.refreshContent(boolean, IProgressMonitor)@ has been added to specify if we want partial refresh or not.
* @org.eclipse.sirius.tree.business.api.command.DTreeItemExpansionChangeCommand@ has been added to execute an expansion/collapse of @DTreeItem@. On expansion a refresh of children is done.

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

* @org.eclipse.sirius.synchronizer.CreatedOutput.synchronizeChildren()@ has been added to allow doing a partial refresh of tree, i.e. to not refresh children of collapsed tree item.
* @org.eclipse.sirius.synchronizer.ModelToModelSynchronizer.update(CreatedOutput, boolean)@ has been added to specify if we want partial refresh or not.

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

* @org.eclipse.sirius.ecore.extender.business.api.accessor.IMetamodelExtender.eRemoveInverseCrossReferences(EObject, ECrossReferenceAdapter, EReferencePredicate)@ has been added as a way to remove the inverse cross references without removing an @EObject@ from its container. For example it can be used to avoid the dangling references to an indirectly detached object without removing it from its already detached container and avoid additional REMOVE notifications. The method has been extracted from and is now used by @IMetamodelExtender.eDelete()@.
* @org.eclipse.sirius.ecore.extender.business.api.accessor.ModelAccessor.eRemoveCrossReferences(EObject, ECrossReferenceAdapter, EReferencePredicate)@ has been added as a way to remove the inverse cross references without removing an @EObject@ from its container after a check by the permission authority that all changeable feature to modify can be edited.

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

* Several utilities have been added in @org.eclipse.sirius.ext.gmf.runtime.editparts.GraphicalHelper@:
** @applyZoomOnPoint(IGraphicalEditPart, Point)@: Apply the current zoom (of @IGraphicalEditPart@'s diagram) on the @Point@ and return the @Point@ for convenience.
** @applyInverseZoomOnPoint(IGraphicalEditPart, Point)@: Apply the inverse of the current zoom (of @IGraphicalEditPart@'s diagram) on the @Point@ and return the @Point@ for convenience.
** @appliedZoomOnRelativePoint(IGraphicalEditPart, Point)@ is now deprecated. Use @applyZoomOnPoint(IGraphicalEditPart, Point)@ instead.
** @getAnchorPoint(IGraphicalEditPart parent, Anchor anchor)@: Get the @Point@ (absolute draw2d coordinates) corresponding to this @Anchor@.
** @getAnchorPoint(IGraphicalEditPart parent, IdentityAnchor anchor)@: Get the @Point@ (absolute draw2d coordinates) corresponding to this @IdentityAnchor@.
** @getIntersection(Point, Point, IGraphicalEditPart, boolean)@: Get intersection between a line between lineOrigin and lineTerminus, and the rectangle bounds of the @IGraphicalEditPart@. If there are several intersections, the shortest is returned.
** @getAbsoluteBounds(IGraphicalEditPart)@: Get the absolute bounds of this @IGraphicalEditPart@.
** @getAbsoluteBoundsIn100Percent(IGraphicalEditPart)@: Get the absolute bounds of this @IGraphicalEditPart@ but adapted according to the current zoom level.
** @isSnapToGridEnabled(EditPart)@: Return true if the snapToGrid is enabled for the diagram containing this edit part, false otherwise.

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

* The method @SWTBotSiriusDiagramEditor.setSnapToGrid(boolean)@ has been added. It allows to disable or enable the snapToGrid option for this editor.
* The method @SWTBotSiriusDiagramEditor.setSnapToGrid(boolean, double, int)@ has been added. It allows to disable or enable the snapToGrid option for this editor. In case of activation, you can also set the grid spacing and the ruler units.
* The method @SWTBotSiriusDiagramEditor.disableSnapToGrid()@ has been deprecated, use @SWTBotSiriusDiagramEditor.setSnapToGrid(false)@ instead.
* The method @SWTBotSiriusDiagramEditor.adaptLocationToSnap(Point)@ has been added. It allows to adapt location according to SnapToHelper of the current editor.
* The method @SWTBotSiriusDiagramEditor.getDiagramEditPart()@ has been added. It allows to retrieve the diagram edit part of the current editor.
* In @ViewpointSelectionDialog@, the methods @selectViewpoints(String...)@ and @deselectViewpoints(String...)@ have been added to allow viewpoints selection and deselection from an array of @String@. These methods are shortcuts to the @selectViewpoints(Set<String>, Set<String>)@ method.
* Add method @changeLayerActivation(String)@ on @SWTBotSiriusDiagramEditor@ to offer the same service as similar method on @UIDiagramRepresentation@.

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

* In @org.eclipse.sirius.test.support.SiriusTestCase@, the methods deactivateSirius(), initSirius() and findSirius() have been renamed into deactivateViewpoint(), initViewpoint() and findViewppoint() to correct a wrong rebranding.

h2(#sirius1.0.0). Changes in Sirius 1.0.0 (from Sirius 1.0.0M7)

h3. User-Visible Changes

* The ability to print table representations has been disabled for the 1.0.0 release due to an external dependency issue (see <a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=435204" target="_blank">bug #435204</a> for the details).

h3. Specifier-Visible Changes

* _Node_, _Container_ and _Edge_ mappings can not be created as direct children of a _Diagram Description_ anymore, the first level mappings must be created as direct children of a _Layer_.
* Mapping (resp. tools) can not be added as reused mapping (resp. tools) of a _Diagram Description_, they must be added to the reused mappings (resp. tools) of a _Layer_. The corresponding property sections will be shown only for old VSM with reused elements.

h3. API Changes

h4. Changes in @org.eclipse.sirius@

* In package @org.eclipse.sirius.business.api.control@,  the constructors of @SiriusControlCommand@ and @SiriusUncontrolCommand@ which assume implicitly that the session should be saved as part of the command are now deprecated. Use the alternative constructors (a new one has been added to @SiriusUncontrolCommand@) to say explicitly if the command should save the session. Most code should do the save themselves outside of the command, and thus pass @false@  to the @shouldEndBySaving@ argument of these constructors.
* In package @org.eclipse.sirius.business.api.session@, class @SavingPolicyImpl@ (the default session saving policy) now inherits from the new @AbstractSavingPolicy@ class. The new abstract class can be used as a base to implement different policies by simply overriding the @computeResourcesToSave()@ method.

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

* To enable the resize of border nodes whose parent is a list, the @createLayoutEditPolicy@ and @getResizeBorderItemCommand@ methods have been extracted from  @org.eclipse.sirius.diagram.ui.edit.api.part.AbstractDiagramContainerPart@ and placed into @org.eclipse.sirius.diagram.ui.edit.api.part.AbstractDiagramElementContainerEditPart@. The @org.eclipse.sirius.diagram.ui.edit.api.part.AbstractDiagramListEditPart.createLayoutEditPolicy@ implementation has been removed.

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

* @org.eclipse.sirius.editor.tools.api.menu.AbstractMenuBuilder.getLabel()@ visibility has been changed from protected to public.
* @org.eclipse.sirius.editor.tools.api.menu.CompositeMenuBuilder@ has been introduced to avoid duplicated menu. A @CompositeMenuBuilder@ is created to encapsulate @AbstractMenuBuilder@ with the same label.

h2(#sirius1.0M7). Changes in Sirius 1.0.0M7 (from Sirius 1.0M6)

h3. Specifier-Visible Changes

* The default value of the _Semantic Candidates Expression_ for Tree Items has changed from an empty string (meaning "any compatible element in the session") to @feature:eAllContents@ which only looks for compatible candidates inside the current element (recursively). The new behavior is more efficient on large models and consistent with what happens for diagrams. The change does not affect existing VSMs which continue to work as before whatever was the expression they used. Users who want the old behavior on specific mappings can simply remove the expression in the properties view.
* In the _Time Profiler_ view, the _Time (hh:mm:ss,ms)_ has been removed. It was redundant with the existing _Time (ms)_ column, harder to read/sort, and showed wrongly formatted results.

h3. API Changes

h4(#separationOfDiagramSpecificConcept-step3). Move diagram.ecore in its own plugin

This milestone (Sirius 1.0M7) includes the third, and final, step towards a full separation of the diagram-specific stuff out of the core of Sirius (see "Step1":#separationOfDiagramSpecificConcept-step1 and "Step2":#separationOfDiagramSpecificConcept-step2 for more details).

All classes related to diagrams in @org.eclipse.sirius@ have been moved to @org.eclipse.sirius.diagram@.
All classes related to diagrams in @org.eclipse.sirius.ui@ have been moved to @org.eclipse.sirius.diagram.ui@.
All classes related to diagrams in @org.eclipse.sirius.editor@ have been moved to @org.eclipse.sirius.editor.diagram@.
In the same way, all classes related to UI in @org.eclipse.diagram@ have been moved to @org.eclipse.sirius.diagram.ui@. To simplify this step almost all classes of @org.eclipse.diagram@ have been moved in @org.eclipse.sirius.diagram.ui@ (and probably not only UI classes). These classes have been moved in @src-diag@ source folder to facilitate future work about moving some of these classes in @org.eclipse.diagram@ again.

Unlike, the "Step1":#separationOfDiagramSpecificConcept-step1, a simple "Organize Imports" operation is not enough. First, you will probably need to add dependencies to @org.eclipse.sirius.diagram@, @org.eclipse.sirius.diagram.ui@ or @org.eclipse.sirius.editor.diagram@ in the MANIFEST.MF of your projects that depend on Sirius diagram classes. The dependencies to add depend on what you really use.

* @ViewpointRegistry.getDiagramDescriptionMappingsRegistry()@ has been removed. You can now directly call @org.eclipse.sirius.diagram.business.api.componentization.DiagramDescriptionMappingsRegistry.INSTANCE.DialectServices@.
* New methods have been added to @IRepairParticipant@ to isolate specific diagram repair steps.
** @removeElements(DView, TransactionalEditingDomain, IProgressMonitor)@: Removes elements from the @DView@ that will be recreated by the refresh (called later).
** @cleanRepresentations(EList<DRepresentation>)@: Cleans representations (specific representation states like filters) and eventually returns some of them if they need to be removed.
** @refreshRepresentations(DAnalysis, DView)@: This method is only implemented by the diagram participant. To simplify work for this step, this method manages core and diagram elements. It should be clean up once the split will be done.
* To break the dependencies from Core to Diagram, several services have been added to:
** @DialectServices@, with default implementations in @AbstractRepresentationDialectServices@:
*** @createTask(CommandContext, ModelAccessor, ModelOperation, Session, UICallBack)@: Creates a new task corresponding to the ModelOperation. Only needed for ModelOperation specific to one dialect.
*** @handles(RepresentationExtensionDescription)@: Tells if the current dialect handles the given @RepresentationExtensionDescription@.
*** @invalidateMappingCache()@: Allows each dialect to clean and compute again its proper mapping cache.
*** @allowsEStructuralFeatureCustomization(EObject)@: allows dialects to indicate if they allow EStrucuralFeaturesCustomization for the given VSM element. It is currently supported for style descriptions in diagrams only.
** @DialectUIServices@
*** @canHandle(RepresentationDescription)@ and @canHandle(RepresentationExtensionDescription)@: tell whether the dialect is able to handle the given representation description or extension description.
*** @completeToolTipText(String, EObject)@ allows the dialect to customize the tooltip displayed in a property section of a given VSM element.
** @DialectUIManager@
*** @canExport(DRepresentation, ExportFormat)@: New method returning true if at least one dialect is able to export this representation to this format, false otherwise.
** @IDiagramDescriptionProvider@
*** @completeToolTipText(String, EObject)@ allows the diagram type to customize the tooltip displayed in a property section of a given VSM element. @SequenceDiagramTypeProvider@ implements this method to mention some Sequence specific variable available in core and diagram tool preconditions in the context of a Sequence diagram.
* All methods of @SiriusHelper@ concerning diagrams have been moved to @org.eclipse.sirius.diagram.business.api.helper.SiriusDiagramHelper@.
* All methods of @SiriusUtil@ concerning diagrams have been moved to @org.eclipse.sirius.diagram.business.api.helper.SiriusDiagramUtil@.
* All methods of @org.eclipse.sirius.business.api.query.EObjectQuery@ concerning diagrams have been moved to @org.eclipse.sirius.diagram.business.api.query.EObjectQuery@.
* <a href="https://wiki.eclipse.org/Sirius/Modularization#Library_Extensions" target="_blank">Library Extensions</a>:
** All methods depending only on draw2d of @org.eclipse.sirius.diagram.ui.tools.api.draw2d.ui.figures.FigureUtilities@ have been moved in @org.eclipse.sirius.ext.draw2d.figure.FigureUtilities@
** @fr.obeo.dsl.viewpoint.diagram.ui.tools.api.layout.GraphicalHelper@ has been moved to @org.eclipse.sirius.ext.gmf.runtime.editparts.GraphicalHelper@.
** @org.eclipse.sirius.diagram.part.SiriusDiagramEditorPlugin@ has been renamed into @org.eclipse.sirius.diagram.DiagramPlugin@. This plugin is not a UI plugin any more, @org.eclipse.sirius.diagram.ui.provider.DiagramUIPlugin.getPlugin()@ should be used instead for UI related aspects. For example @DiagramUIPlugin.getPlugin().getPreferenceStore()@ should be used instead of @DiagramPlugin.getDefault().getPreferenceStore()@ or @SiriusDiagramEditorPlugin.getInstance().getPreferenceStore()@.
* @DeleteFromDiagramContributionItem@ and @SetStyleToWorkspaceImageContributionItem@ have been merged into @SiriusActionBarActionContributionItem@
* Images
** Images of @org.eclipse.sirius.diagram@ have been moved to @org.eclipse.sirius.diagram.ui@. In your code, you should replace @SiriusDiagramEditorPlugin.getInstance().getImage()@ and @DiagramPlugin.getInstance().getImage()@ by @DiagramUIPlugin.getPlugin().getImage()@. That is the case for all methods concerning images in @DiagramPlugin@ (previously named @SiriusDiagramEditorPlugin@).
** Some images of @org.eclipse.sirius.ui@ have been moved to @org.eclipse.sirius.diagram.ui@, the corresponding constants in @org.eclipse.sirius.ui.tools.api.image.ImagesPath@ have been moved in @org.eclipse.sirius.diagram.ui.tools.api.image.DiagramImagesPath@.
* The method @static void refreshSelection(DiagramElementMapping)@ from @org.eclipse.sirius.editor.tools.api.menu.AbstractEObjectRefactoringAction@ is not available anymore.
* Preferences
** @org.eclipse.sirius.business.api.preferences.SiriusPreferencesKeys.PREF_AUTO_PIN_ON_CREATE@ has been moved to @org.eclipse.sirius.diagram.tools.api.preferences.SiriusDiagramPreferencesKeys@.
* Ids
** The Sirius diagram editor id is now @org.eclipse.sirius.diagram.ui.part.SiriusDiagramEditorID@
** Its property contributor is now @org.eclipse.sirius.diagram.ui@. This id has to be changed in plugins providing additional property sections to the Sirius diagram editor (created with EEF for example).

h5. Moved extension points

Several extension points have been moved:
* from @org.eclipse.sirius@ to @org.eclipse.sirius.diagram@. You should change the id of the following extension point in your plugin.xml (@org.eclipse.sirius.xxxx@ replaced by @org.eclipse.sirius.diagram.xxxx@):
** diagramTypeProvider
* from @org.eclipse.sirius.diagram@ to @org.eclipse.sirius.diagram.ui@. You should change the id of the following extension points in your plugin.xml (@org.eclipse.sirius.diagram.xxxx@ replaced by @org.eclipse.sirius.diagram.ui.xxxx@):
** diagramIdentifierProvider
** imageSelector
** layoutDataManager
** layoutProvider
** styleConfigurationProvider
** viewOrderingProvider

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

* In class @org.eclipse.sirius.common.tools.api.util.EclipseUtil@, the method @getExtensionPlugins(Class<T>, String, String, String, Predicate<String>)@ has been removed from API to avoid exposing a Guava-specific @Predicate@. Instead, use the new method @getExtensionPluginsByKey()@ which returns all the extensions organized by the specified key, and filter the result according to whatever critera the @Predicate@ tested on the key.

h4. Changes in @org.eclipse.sirius@

* @org.eclipse.sirius.business.api.query.URIQuery.isSiriusEnvironmentURI@ has been replaced by
** @isSiriusCoreEnvironmentURI@ which checks that the given resource is the Sirius core Environment.xmi file.
** and @isEnvironmentURI@ which checks that the given resource has an @environment@ uri scheme.
* In @org.eclipse.sirius.business.api.dialect.DialectManager@
** the setter @setRefreshActivatedOnRepresentationOpening(boolean)@ has been removed as the refresh on opening should be managed from the corresponding preference @org.eclipse.sirius.ui.business.api.preferences.SiriusUIPreferencesKeys.PREF_REFRESH_ON_REPRESENTATION_OPENING@.
** @isRefreshActivatedOnRepresentationOpening()@ has been moved into @org.eclipse.sirius.ui.business.api.dialect.DialectUIManager@ as it refers to an UI behavior.
* The @DRepresentation.createContents()@ (both variants) and @DRepresentation.updateContents()@ EOperations have been removed. They were not used anywhere.
* The @org.eclipse.sirius.business.api.modelingproject.ModelingProject.MODELING_PROJECT_PREDICATE@ constant has been removed to reduce Sirius's exposure of Guava'specific types. Use the equivalent @ModelingProject.hasModelingProjectNature()@ method instead.
* The method @org.eclipse.sirius.business.api.query.EObjectQuery.getInverseReferences(Predicate<Setting>)@ has been removed from API to avoid exposing a the Guava-specific @Predicate@ type.
* In class @org.eclipse.sirius.business.api.dialect.description.AbstractInterpretedExpressionQuery@, the protected methods @appendAllLocalVariableDefinitions()@ and @appendEditMaskVariables()@ now take a @Map<String, Collection<String>>@ instead of a Guava-specific @Multimap@. The new protected method @addDefinition()@ can be used to make it easier to add entries to the map. Subclasses in Sirius have been updated to match the new signature.
* The message @org.eclipse.sirius.business.api.modelingproject.ModelingProject.ZERO_REPRESENTATIONS_FILE_FOUND_IN@ has been removed without replacement. It was not really an API constant.
* The behavior of method @org.eclipse.sirius.business.api.modelingproject.ModelingProject.getMainRepresentationsFileURI()@ has changed. It now marks this project as invalid and adds a marker on it, if it is considered as invalid (no or many representations files).
* A new query @org.eclipse.sirius.business.api.query.IFileQuery@ has been added with a method to check if file is handled by an opened session, ie:
** a semantic resource of this session,
** a referenced sub representations file,
** a controlled resource.
* The @EObjectLink@ class has been removed from the metamodel. It was not used anywhere.
* In interface @org.eclipse.sirius.business.api.dialect.description.IInterpretedExpressionTargetSwitch@, the @getFirstRelevantContainerFinder()@ method which returned a Guava @Function<EObject, EObject>@ has been replaced with the new method @getFirstRelevantContainer(EObject)@ which directly returns the result of applying the previously returned function. All implementers in Sirius itself have been updated.
* The constructor @org.eclipse.sirius.business.api.dialect.description.DefaultInterpretedExpressionTargetSwitch(EStructuralFeature, IInterpretedExpressionTargetSwitch, Function<EObject, EObject>)@ has been removed to avoid exposing a the Guava-specific @Predicate@ type. Sub-classes which used it with a non-null @Function@ should override the @getFirstRelevantContainer(EObject)@ method to return the result of that function instead.
* The @org.eclipse.sirius.business.api.helper.task.AbstractDeleteDRepresentationElementTask@ constructor which took a Guava @Predicate<EReference>@ now takes an equivalent @EReferencePredicate@ (from @org.eclipse.sirius.ext.emf@).
* The constants @DSEMANTICDECORATOR_REFERENCE_TO_IGNORE_PREDICATE@ and @NOTATION_VIEW_ELEMENT_REFERENCE_TO_IGNORE_PREDICATE@ from @org.eclipse.sirius.business.internal.session.danalysis.DanglingRefRemovalTrigger@ are now instances of @EReferencePredicate@ instead of Guava's @Predicate<EReference>@.
* In class @org.eclipse.sirius.business.api.session.SessionEventBroker@, the method @addlLocalTrigger()@ now takes a @org.eclipse.emf.transaction.NotificationFilter@ instead of a Guava-specific @Predicate<Notification>@ as first argument.
* The constant @org.eclipse.sirius.tools.api.ui.RefreshEditorsPrecommitListener.IS_IMPACTING@ is now a @NotificationFilter@ instead of a @Predicate@, to match the API change in @SessionEventBroker.addLocalTrigger()@.
* The @org.eclipse.sirius.business.api.session.Session@ interface has a new @getSavingPolicy()@ method which gives access to the currently configured saving policy.

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

* The references @DNode.ownedDetails@ and @DDiagramElementContainerImpl.ownedDetails@ have been removed from the metamodel, along with the corresponding implementation methods. They were not used in practice.
* The @DDiagramLink@ EClass has been removed from the meta-model, along with the corresponding generated Java code. It was not used in practice.
* The @DDiagram.clean()@ EOperation has been removed. It was deprecated and not used anymore. All the Java code which existed only to help in the implementation of that operation has also been removed. This includes:
** The @org.eclipse.sirius.diagram.tools.api.validation.constraint.AbstractDDiagramConstraint.activate()@ and @deactivate()@ methods.
** The @org.eclipse.sirius.business.api.helper.SiriusHelper.unSetHarmlessDanglingReferences()@ method.
** The @org.eclipse.sirius.tools.api.profiler.SiriusTasksKey.CLEANING_NODES_KEY@ constant.
* The @DSemanticDiagram.getRootContents()@ method (which was deprecated) has been removed.
* The @DDiagram.findDiagramElements()@ EOperation has been removed. It was deprecated and always returned an empty list if called.
* The @DDiagram.info@ attribute has been removed. It was not used anywhere.
* The @DDiagram.subDiagram@ reference has been removed. It was not used anywhere.
* The @DDiagramElement.isFold()@ EOperation has been removed. It was deprecated and edge folding has long been implemented using different mechanisms.
* In the @ContainerMapping@ type, the following EOperations have been removed: @createContainer()@, @updateContainer()@, and @getNodesCandidate()@. Although their usage is highly discouraged, if you really need to you can currently use the corresponding methods in the internal @ContainerMappingHelper@ instead (use @SiriusPlugin.getDefault().getInterpreterRegistry().getInterpreter(semanticElement)@ to obtain the @IInterpreter@ those methods need). As with all internal code, there is no guarantee these methods will still exist in future versions.
* The @AbstractNodeMapping.getDNodesDone()@ EOperation has been removed. It was not used anywhere.
* In the @NodeMapping@ type, the @getBestStyle()@ and @createListElement()@ EOperations have been removed. Although their usage is highly discouraged, if you really need to you can currently use the corresponding methods in the internal @MappingHelper@ instead (use @SiriusPlugin.getDefault().getInterpreterRegistry().getInterpreter(semanticElement)@ to obtain the @IInterpreter@ these methods need). As with all internal code, there is no guarantee these methods will still exist in future versions.
* In interface @org.eclipse.sirius.diagram.business.api.diagramtype.IDiagramDescriptionProvider@, the methods @allowsPinUnpin()@, @allowsHideReveal@, and @allowsCopyPasteLayout()@  have been modified to take directly the @DDiagramElement@ to test (and return a @boolean@) instead of returning a Guava-specific @Predicate@ which then had to be invoked.
* In class @org.eclipse.sirius.diagram.ui.tools.api.layout.PinHelper@, .the method @allowsPinUnpin()@ has been modified to take a @DDiagramElement@ directly and return a @boolean@, instead of taking a @DDiagram@ and return a Guava-specific @Predicate@ which then had to be invoked on actual @DDiagramElements@..
* The interface @org.eclipse.sirius.diagram.ui.edit.api.part.ISiriusEditPart@ has been added and is now part of all the type hierarchy of any EditPart provided by Sirius. This allows a simple @instanceof ISiriusEditPart@ to discriminate the edit part instances coming from Sirius.

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

* The @org.eclipse.sirius.diagram.sequence.util.SiriusFunctions@ class has been removed. It was not used anywhere.
* The @org.eclipse.sirius.diagram.sequence.util.NotificationQuery@ class has been removed. It had been exposed by mistake.
* The @org.eclipse.sirius.diagram.sequence.business.internal.util.NotationPredicate@ class has been removed from API, to reduce Sirius's exposure of Guava'specific types.
* All the static methods in @org.eclipse.sirius.diagram.sequence.util.Range@ which returned Guava-specific types (@Function@ or @Ordering@) have been removed from API.
* @org.eclipse.sirius.diagram.sequence.template.AbstractRule@ no longer inherits from Guava's @Function@ interface, but from the news ad-hoc @org.eclipse.sirius.diagram.sequence.template.Transformer@ interface instead, which is functionally equivalent.

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

* @org.eclipse.sirius.ui.business.api.preferences.DesignerUIPreferencesKeys@ has been renamed into @org.eclipse.sirius.ui.business.api.preferences.SiriusUIPreferencesKeys@
* Methods @getMissingDependencies()@ and @getMissingDependenciesErrorMessage()@ from @org.eclipse.sirius.ui.business.api.viewpoint.ViewpointSelection@ now use @Map<String, Collection<String>>@ instead of Guava's @Multimap@.
* @org.eclipse.sirius.ui.tools.api.project.ModelingProjectManager.initializeAfterLoad()@ method has been removed. There is no replacement for this method documented as "Not intended to be used by client".

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

* All variants of @eDelete()@ methods which took a @Predicate<EReference>@ in types @ModelAccessore@, @IMetamodelExtender@ and @CompositeMetamodelExtender@ now take an equivalent @EReferencePredicate@ (from @org.eclipse.sirius.ext.emf@).
* The @ModelUtils.resolveAll(ResourceSet set, EReferencePredicate)@ now takes an @EReferencePredicate@ instead of a Guava-specific @Predicate<EReference>@.

h4. Changes in @org.eclipse.sirius.ext.base@

* The @org.eclipse.sirius.ext.base.Options.isSome()@ method has been removed to reduce Sirius's exposure of Guava'specific types. Use @Option.some()@ directly instead.
* @org.eclipse.sirius.ext.base.relations.Relation@ no longer inherits from @com.google.common.base.Function@, but keeps the same API otherwise.

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

* The @org.eclipse.sirius.synchronizer.Mapping.IS_CHECK_ONLY@ constant has been removed to reduce Sirius's exposure of Guava'specific types. Use @!Mapping.getCreator().some()@ instead.
* The @Maybe@ and @MaybeFactory@ types have been removed, and all their uses in @org.eclipse.sirius.synchronizer@ converted to the equivalent @Option@ and @Options@ types from @org.eclipse.sirius.ext.base@.
* The internal class @MappingHiearchy.HiearchyIterator@ has been removed from API.

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

* The @shouldReloadSession@ boolean parameter has been removed from @org.eclipse.sirius.tests.support.api.SiriusTestCase.disableUICallBackOnDialectEditor(DialectEditor)@, it was not used and could let the tester think he can change the reload behavior from the dialog factory.
* @org.eclipse.sirius.tests.swtbot.support.api.AbstractSiriusSwtBotGefTestCase.refreshDiagram()@ has been removed. This method did not handle the non dynamic tabbar and was a duplicate of manualRefresh(). Callers must select the diagram before the call,the click(0,0) instruction was not sufficient in several cases (for example if there is a node/container in (0,0)).
* @org.eclipse.sirius.tests.swtbot.support.api.editor.SWTBotDesignerEditor@ has been renamed into @SWTBotSiriusDiagramEditor@.
* @org.eclipse.sirius.tests.swtbot.support.api.editor.SWTBotDesignerGefViewer@ has been renamed into @SWTBotSiriusGefViewer@.
* @org.eclipse.sirius.tests.swtbot.support.api.editor.SWTBotDesignerHelper@ has been renamed into @SWTBotSiriusHelper@.
* Methods @AbstractSiriusSwtBotGefTestCase.openRepresentation@ with @SWTBotDesignerEditor@ as returned type have been renamed into @openDiagram@, marked as deprecated and replaced with methods returning a @SWTBotEditor@. You can now use methods @openRepresentation@ for DTree or DTable. If the @expectedRepresentationClass@ is @DDiagram.class@, the returned type will be a @SWTBotSiriusDiagramEditor@.
* Method @org.eclipse.sirius.tests.swtbot.support.api.editor.SWTBotSiriusHelper.getDesignerEditor(String)@ has been renamed into @getSiriusDiagramEditor@.
* Add @SWTBotSiriusHelper.getSiriusEditor(String)@ to return the @SWTBotEditor@ (diagram, tree or table editor) with the given name. The name is the name as displayed on the editor's tab in Eclipse. In case of multiple editors with the same fileName, the same method with an additional parameter, the index, has been added @SWTBotSiriusHelper.getSiriusEditor(String, int)@.
* Change the behavior of @org.eclipse.sirius.tests.swtbot.support.api.editor.SWTBotSiriusDiagramEditor.zoom(ZoomLevel)@ to directly change the zoom level of the current diagram editor without trying to change it from the zoom combo in the tabbar.
* Add @org.eclipse.sirius.tests.swtbot.support.api.editor.SWTBotSiriusDiagramEditor.zoomFromToolbar(ZoomLevel)@ to add possibility to explicitly change the zoom level from the tabbar.

h2(#sirius1.0M6). Changes in Sirius 1.0.0M6 (from Sirius 1.0M5)

h3. API Changes

h4(#tests). High-level API for Automated Tests Using JUnit and SWTBot

Starting from version 1.0.0M6, Sirius includes high-level APIs to help creating automated tests using JUnit and/or SWTBot. These can be used either to test Sirius itself or to test Sirius-based modelers. These APIs are provided by two plug-ins:
* @org.eclipse.sirius.tests.support@: support code for JUnit (plug-in) tests using Sirius.
* @org.eclipse.sirius.tests.swtbot.support@: support code for SWTBot tests using Sirius.

Both plug-ins are only available if you install the new @org.eclipse.sirius.tests@ feature.

h4(#separationOfDiagramSpecificConcept-step2). Move diagram-specific EPackages into their own diagram.ecore model

This milestone (Sirius 1.0M6) includes the second step towards a full separation of the diagram-specific stuff out of the core of Sirius (see "Step1":#separationOfDiagramSpecificConcept-step1 for more details).

This step is less impactful on your code than the first step. Nevertheless, some missed classes during first step have moved during this step:
* Remove @DDiagramSet@ and its corresponding reference from @DRepresentationContainer@: No longer needed
* @DragAndDropTarget@, @DragAndDropTargetDescription@ and @ContainerDropDescription@ have been moved to diagram EPackage.
* @viewpoint/diagram/description/validation@ EPackage has been moved to @viewpoint/description/validation@: revert what was done in step 1 by mistake.

The existing VSM (@*.odesign@) and representations file (@*.aird@) are automatically migrated.

Warning: If you have some code based on the root EPackage of an EClass, it may be necessary to adapt it. Example:

pre. 
EPackage rootPackage = (EPackage) EcoreUtil.getRootContainer(element.eClass());
if (rootPackage != null && rootPackage.getNsURI().equals(ViewpointPackage.eINSTANCE.getNsURI())) {

should be adapted in

pre. 
EPackage rootPackage = (EPackage) EcoreUtil.getRootContainer(element.eClass());
if (rootPackage != null && rootPackage.getNsURI().equals(DiagramPackage.eINSTANCE.getNsURI())) {

if @element@ is a Diagram concept.

h4. Changes in @org.eclipse.sirius@

* The @org.eclipse.sirius.tools.api.command.IDiagramCommandFactory.setAutoRefreshDView()@ method was removed. It had no effect, any code which called it can simply be removed.
* The deprecated interface @org.eclipse.sirius.business.api.componentization.ViewpointRegistryListener@ has been removed. Use @org.eclipse.sirius.business.api.componentization.ViewpointRegistryListener2@ instead.
* @org.eclipse.sirius.business.api.session.SessionManagerListener2@ and @org.eclipse.sirius.business.api.session.SessionManagerListener@ have been merged into @org.eclipse.sirius.business.api.session.SessionManagerListener@ which is not deprecated any more.
* The deprecated method @org.eclipse.sirius.business.api.session.SessionManagerListener.notifyUpdatedSession(Session)@ has been removed. Use @org.eclipse.sirius.business.api.session.SessionManagerListener.notify(Session, int)@ instead.
* @org.eclipse.sirius.business.api.helper.task.RemoveDanglingReferencesTask@ and @org.eclipse.sirius.business.api.helper.task.RemoveSemanticDanglingReferenceTask@ and @org.eclipse.sirius.tools.api.command.AbstractCommandFactory.addRemoveDanglingReferencesTask()@ have been removed. These tasks were added to in several commands to remove dangling references at the end. They are now replaced by a specific @ModelChangeTrigger@ to detect the detachment of @EObject@ and remove the dangling references. It is added to the @SessionEventBroker@ during the session opening.
* @org.eclipse.sirius.tools.api.ui.RefreshEditorsPrecommitListener@ was a precommit @ResourceSetListener@, it became a @ModelChangeTrigger@ and is now added to the SessionEventBroker during the session opening. This modification allows to correctly manage the order of our different precommit commands. It is triggered after the dangling reference remover.
* @org.eclipse.sirius.tools.api.command.semantic.RemoveDanglingReferences@ is no more used in Sirius commands. It can still be used to clean a resourceSet or a resource (repair tool, import/export, ..). It also has a new static method @removeDanglingReferences(Resource)@ to remove dangling references as an entry point.
* The protected predicate @org.eclipse.sirius.business.api.helper.task.AbstractDeleteDRepresentationElementTask.DSEMANTICDECORATOR_REFERENCE_T0_IGNORE_PREDICATE@ has been removed, the internal predicate @DanglingRefRemovalTrigger.DSEMANTICDECORATOR_REFERENCE_T0_IGNORE_PREDICATE@ is used instead.
* The @org.eclipse.sirius.business.api.helper.SiriusUtil.findDiagram(EObject)@ method has been removed. Use the equivalent @new org.eclipse.sirius.business.api.query.EObjectQuery(element).getParentDiagram()@ instead.

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

* The @org.eclipse.sirius.ui.tools.api.perspectives.DesignPerspective@ interface has been moved to @org.eclipse.sirius.editor.tools.api.perspectives@ package in @org.eclipse.sirius.editor@ plugin. This perspective is now provided through the @org.eclipse.sirius.editor@ plugin. The perspective ID is kept unchanged for a compatibility reason.
* The deprecated class @org.eclipse.sirius.ui.tools.api.dialogs.ExportRepresentationsAsImagesDialog@ has been removed. Use @org.eclipse.sirius.ui.tools.api.dialogs.ExportSeveralRepresentationsAsImagesDialog@ instead.

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

* @org.sirius.diagram.graphical.edit.policies.AirNoteAttachmentEditPolicy@ has been removed, with the new dangling reference management, it became identical to its superclass, use @org.eclipse.gmf.runtime.diagram.ui.internal.editpolicies.ConnectionEditPolicy@ instead. Its provider @org.sirius.diagram.graphicalou .edit.policies.AirNoteAttachmentEditPolicyProvider@ and declaration in plugin.xml have been removed too.

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

* The @org.eclipse.sirius.table.tools.api.command.ITableCommandFactory.setAutoRefreshDTable()@ method was removed. It had no effect, any code which called it can simply be removed.


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

* The @org.eclipse.sirius.tree.business.api.command.ITreeCommandFactory.setAutoRefreshDTree()@ method was removed. It had no effect, any code which called it can simply be removed.

h2(#sirius1.0M5). Changes in Sirius 1.0.0M5 (from Sirius 1.0M4)

h3. User-Visible Changes

* The table csv export has been improved to handle cropped label. In some specific cases, the cell label is automatically cropped and '...' is concatenated to the resulting value. This cropped displayed label was previously exported, now the complete semantic value is exported.

h3. API Changes

h4. Library Extensions

This milestone (Sirius 1.0M5) introduces several new plug-ins, collectively called "library extensions". They are all named @org.eclipse.sirius.ext.LIB@, where @LIB@ is the name of a library or component Sirius depends on. These plug-ins are used to isolate generic code which extends existing libraries with features and helpers needed for Sirius, but which do not depend on Sirius themselves. A relatively large part of the code in Sirius is of this kind: things that could/should be in EMF, GMF, Eclipse itself, etc. and which are not Sirius-specific but which make it easier to build Sirius itself. Sirius 1.0M5 introduces several of these library extensions and starts to fill them with existing classes which were "hidden" inside Sirius and are now exposed in library extensions. Most of the time, existing code which used the Sirius API will only need to:
# Add the necessary @Import-Package@ (recommended) or @Require-Bundle@ to depend on the library extension(s) where the code they use now lives;
# Perform a simple "Organize Imports" operation, which should find the classes and interfaces in their new locations.

h4(#separationOfDiagramSpecificConcept-step1). Move diagram-specific EClasses into a separate EPackage

For historical reasons, the core Sirius metamodels defined in viewpoint.ecore contain both generic (dialect-independant like Viewpoint, RepresentationDescription, DAnalysis...) concepts and diagram-specific ones (e.g. DNode, EdgeStyle, ContainerCreationDescription...). The table and tree metamodels are more cleanly separated.
This milestone (Sirius 1.0M5) includes the first step towards a full separation of the diagram-specific stuff out of the core of Sirius. So many EClasses have been moved.

Most of the time, existing code which used these Sirius EClasses will only need to perform a simple "Organize Imports" operation, which should find the classes and interfaces in their new locations.
The "Organize imports" is not sufficient in case of imported classes existing several time in different packages (@EFactory@ classes for example with @DescriptionFactory@, or @EPackage@ classes for example with @DescriptionPackage@). And in some cases @ViewpointFactory@ (and @ViewpointPackage@) will have to be replaced by @DiagramFactory@ (and @DiagramPackage@).

The @Switch@ classes if overridden also require a particular attention.

The existing VSM (@*.odesign@) and representations file (@*.aird@) are automatically migrated.
Warning: Nevertheless, if you reference these Sirius concepts with the EPackage qualifier in your VSM (@*.odesign@), in interpreted expressions for example, you must change @viewpoint@ in @diagram@. For example @viewpoint::DDiagramElement@ becomes @diagram::DDiagramElement@.

The impacted EPackages are :
* @viewpoint@ : some of its EClasses have been moved to @viewpoint/diagram@
* @viewpoint/description@ : some of its EClasses have been moved to @viewpoint/diagram/description@
* @viewpoint/description/style@ : some of its EClasses have been moved to @viewpoint/diagram/description/style@
* @viewpoint/description/tool@ : some of its EClasses have been moved to @viewpoint/diagram/description/tool@
* @viewpoint/description/filter@ : this EPackage has been moved to @viewpoint/diagram/description/filter@
* @viewpoint/description/validation@ : this EPackage has been moved to @viewpoint/diagram/description/validation@
* @viewpoint/description/concern@ : this EPackage has been moved to @viewpoint/diagram/description/concern@

h4. Changes in @org.eclipse.sirius@

* The @org.eclipse.sirius.business.api.migration.resource.StringCouple@ class has been removed.
* The @org.eclipse.sirius.business.api.dialect.description.IInterpretedExpressionTargetSwitch.getFirstRelevantContainerFinder@ method has been added to let each dialect use its own @Function@ to retrieve the first relevant container of a given @EObject@, i.e. the first container from which a domain class can be determined.

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

* The @org.eclipse.sirius.common.ui.business.api.interpreter.VariableContentProvider@ class has been removed.
* The @org.eclipse.sirius.common.ui.tools.api.util.ISimpleAction@ interface has been removed.
* The method @org.eclipse.sirius.common.ui.tools.api.dialog.RenameDialog.setText()@ has been removed. You can now directly call  @org.eclipse.sirius.common.ui.tools.api.dialog.RenameDialog.setDefaultNewName()@ which has been added to set the default new name to display. Note that this method must be called before Dialog.create().
* The overriden method @org.eclipse.sirius.common.ui.tools.api.dialog.RenameDialog.setTitle()@ has been removed. Note that the inherited @setTile()@ method is still available but must be called before Dialog.create().

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

* The @org.eclipse.sirius.table.business.api.query.DCellQuery.getExportableLabel()@ method has been added to compute the label to export when the label is cropped by the @org.eclipse.emf.edit.provider.ItemPropertyDescriptor.ItemDelegator@.

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

* The @org.eclipse.sirius.table.ui.business.api.helper.TableUIHelper@ now uses @DCellQuery.getExportableLabel()@ to compute the cell labels used in HTML export.

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

* The long-deprecated @org.eclipse.sirius.ui.business.api.session.DeprecatedIEditingSession@ interface has been removed. Use the corresponding methods from @org.eclipse.sirius.ui.business.api.session.IEditingSession@ instead.

h2(#sirius1.0M4). Changes in Sirius 1.0.0M4 (from Sirius 0.9)

h3. User-Visible Changes

* The ability to print table representations, which had been disabled for the 0.9 release, has been re-enabled.

h3. API Changes

Sirius 1.0.0M4 includes a lots of API-breaking changes, as part of a global effort to improve the quality of the Sirius internals. In this milestone in particular, most of the APIs which were marked as deprecated in previous versions of Sirius (and before that of Viewpoint) have been either removed (if a replacement exists) or marked as non-deprecated (if no replacement exists yet).

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

* Two deprecated constructors have been removed in @FeatureEditorDialog@. Use the remaining constructor instead, which provides proper behavior for both unique and non-unique features.
* The deprecated method @IEditingDomainFactory.createEditingDomain()@ has been removed. Use the (inherited) @createEditingDomain(ResourceSet)@ instead, which ensures correct behavior for all kinds of models (Xtext for example).
* The deprecated field @org.eclipse.sirius.common.tools.api.listener.Notification.FOLD@ has been removed. It was never used by Sirius itself, so if your code tried to listen to this kind of notification it was never actually called and can be safely removed.
* The deprecated methods @getExtensionPlugins()@ and @getElementsProvidedByPlugin@ from @EcliseUtil@ have been removed. If you need this kind of functionality, use the Eclipse APIs directly instead.
* The deprecated fields @COLUMN_SEMANTIC@ and @LINE_SEMANTIC@ of @IInterpreterSiriusVariables@ have been removed. Use the constants of @org.eclipse.sirius.table.tools.api.interpreter.IInterpreterSiriusTableVariables@ instead.

h4. Changes in @org.eclipse.sirius@

* The deprecated method @DialectServices.initRepresentations(Viewpoint, EObject)@ has been removed. Use the version which takes an additional @IProgressMonitor@ instead.
* The deprecated constructor in @CreateRepresentationCommand@ has been removed. Use the alternative constructor which takes an additional @IProgressMonitor@ instead.
* The two deprecated constructors in @RefreshRepresentationCommand@ have been removed. Use the alternative constructors which take an additional @IProgressMonitor@ instead.
* The deprecated method @DisplayService.computeVisibility(Session, DDiagram, DDiagramElement)@ has been removed. Use the variant @computeVisibility()@ which takes a @DiagramMappingsManager@ instead of a @Session@.
* The following deprecated methods in @FilterService@ have been removed:
** @activateCache()@: use @DisplayService.activateCache()@ instead.
** @deactivateCache()@: use @DisplayService.deactivateCache()@ instead.
** @activate()@: use @DisplayService.activate()@ instead.
** @deactivate()@: use @DisplayService.deactivate()@ instead.
** @isActivated()@: use @DisplayServiceManager.INSTANCE.getMode() == DisplayMode.NORMAL@ instead.
** @isCollapse()@: use @isCollapsed()@ instead.
** @isVisibleForFilters()@: use @getAppliedFilters()@ instead.
** @isVisible()@: use @DisplayService.isDisplayed()@ instead.
** @isFiltered()@, @isNotFiltered()@, @isVisibleForActivatedFilters(), @checkFilters()@: use @getAppliedFilters()@ and @DDiagram.getActivatedFilters()@ instead.
* The deprecated methods @isDirectlyHidden()@ and @isIndirectlyHidden()@ in @HideFilterHelper@ have been removed. Use the corresponding methods in @DDiagramElementQuery@ instead.
* The deprecated method @SavingPolicy.save(Iterable, Map)@ has been removed. Use the variant which takes an additional @IProgressMonitor@ instead.
* The deprecated constructor @AbstractCommandFactory(TransactionalEditingDomain, ModelAccessor)@ has been removed. Use the variant without the @ModelAccessor@ argument instead.
* The deprecated constructor @CommandContext(EObject)@ has been removed. Use the variant which takes an additional @DRepresentation@ instead.
* The deprecated methods @activate(TransactionalEditingDomain)@ and @deactivate(TransactionalEditingDomain)@ in @IChangeListener@ have been removed. Use the variants with no argument instead.
* The deprecated constructor @AddSemanticResourceCommand(Session, URI)@ has been removed. Use the variant which takes an additional @IProgressMonitor@ instead.
* The deprecated constructors of @RemoveSemanticResourceCommand@ have been removed. Use the variants which takes an additional @IProgressMonitor@ instead.
* The deprecated constructor in @CreateDiagramWithInitialOperation@ has been removed. Use the variant which takes an additional @IProgressMonitor@ instead.
* The deprecated method @SessionManager.addResource(Session, Resource)@ has been removed. Use the @Session.addSemanticResource(URI, IProgressMonitor)@ instead. In code, @mySessionManager.addResource(mySession, myResource)@ should be replaced by @mySession.addSemanticResource(myResource.getURI(), new NullProgressMonitor())@. Notice that this replacement has not the exact same behavior. The notifications @SessionListener.ABOUT_TO_BE_REPLACED@ and @SessionListener.REPLACED@ are not thrown with @addSemanticResource@ contrary to @addResource@. But this kind of notifications is more for reloading of resource.
* The deprecated constructor of @DefaultLocalSessionCreationOperation@ have been removed. Use the variant which takes an additional @IProgressMonitor@ instead.
* The deprecated method @SessionManager.getSession(URI)@ has been removed. Use the variant which takes an additional @IProgressMonitor@ instead.
* The deprecated method @SessionFactory.createSession(URI)@ has been removed. Use the variant which takes an additional @IProgressMonitor@ instead.
* Deprecated class @RefreshRepresentationCommand@ has been removed. Use the class @RefreshRepresentationsCommand@ instead.
* Deprecated classes @RevealSiriusElement@ and @RevealDDiagramElement@ have been removed. Use the class @RevealDDiagramElements@ instead.
* The deprecated method @DAnalysisSession.save(Map<?, ?>)@ has been removed. Use the variant which takes an additional @IProgressMonitor@ instead.
* The deprecated method @MappingTableEntry.getImporter()@ has been updated. It now returns an optional (@org.eclipse.sirius.common.tools.api.util.Option@) of @MappingTableEntry@.
* The deprecated class @IEMFCommandFactory@ has been removed. It is not used in Sirius code anymore.
* The deprecated method @IDiagramCommandFactory.buildCreateDiagramFromDescription(DiagramDescription, EObject)@ has been removed. Use the variant which takes an additional @IProgressMonitor@ instead.
* The deprecated methods @dispose()@ and @disposeInterpreterRegistry(EObject)@ have been removed from @InterpreterRegistry@. They corresponded to dead code.
* The deprecated method @InterpreterRegistry.prepareImportsFromModelElement(IInterpreter, EObject)@ has been removed. Use @InterpreterRegistry.prepareImportsFromSession(IInterpreter, Session)@ instead. To get @Session@ from @EObject@, you can use @SessionManager.INSTANCE.getSession(EObject)@.
* The deprecated method @SiriusHelper.createDAnalysis()@ has been removed. Use @ViewpointFactory.eINSTANCE.createDAnalysis()@ instead.
* The deprecated method @SessionFactory.createSession(DAnalysis)@ has been removed. It is not intended to be used, but it can be replaced by @SessionFactory.INSTANCE.createSession(analysis.eResource().getURI(), new NullProgressMonitor())@.
* The method @buildDoExecuteDetailsOperation(DSemanticDecorator, RepresentationCreationDescription, String) has been pull up from @ITableCommandFactory@, @ITreeCommandFactory@ and @IDiagramCommandFactory@ to @ICommandFactory@.
* The method @getUserInterfaceCallBack()@ has been pull up from @ITableCommandFactory@ and @ITreeCommandFactory@ to @ICommandFactory@. And @AbstractCommandFactory@ now implements this method.
* The unused reference @allActivatedEdgeMappings@ from @Layer@ and @DiagramDescription@ has been removed from the viewpoint.ecore meta-model. This reference always returns empty list.

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

* The deprecated methods @IDiagramEdgeEditPart.refreshPath()@ and @AbstractDiagramEdgeEditPart.refreshPath()@ have been removed. It is not called in Sirius code anymore

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

* The deprecated methods @IMetamodelExtender.eDelete(EObject)@, @CompositeMetamodelExtender.eDelete(EObject)@ and @ModelAccessor.eDelete(EObject)@ have been removed. Use the variants which takes an additional @ECrossReferenceAdapter@ instead. This @ECrossReferenceAdapter@ can be null.

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

* All deprecated methods in @ModelingProjectManager@ have been removed. Use the corresponding versions which take an additional @IProgressMonitor@ parameter instead.
* All deprecated methods in @ViewpointSelection@ have been removed. Use the corresponding versions which take an additional @IProgressMonitor@ parameter instead.
* Deprecated class @org.eclipse.sirius.ui.business.api.control.SiriusControlCommand@ has been removed. Use the class @org.eclipse.sirius.business.api.control.SiriusControlCommand@ instead (same constructor but with an additional @IProgressMonitor@ parameter).
** Ditto for @SiriusUnControlCommand@
* The deprecated method @DialectUIServices.openEditor(Session, DRepresentation)@ has been removed. Use the variant which takes an additional @IProgressMonitor@ instead.
* The deprecated method @SessionHelper.openStartupRepresentations(Session)@ has been removed. Use the variant which takes an additional @IProgressMonitor@ instead.
* The deprecated method @SiriusControlHandler.performControl(Shell, EObject)@ has been removed. Use the variant which takes an additional @IProgressMonitor@ instead.
* The deprecated method @SiriusUncontrolHandler.performUncontrol(Shell, EObject)@ has been removed. Use the variant which takes an additional @IProgressMonitor@ instead.
* New class @AbstractCreateRepresentationFromRepresentationCreationDescription@: Generalization of all @CreateRepresentationFromRepresentationCreationDescription@ classes (iof plug-ins sirius.diagram, sirius.table.ui, sirius.tree.ui).

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

* The deprecated method @TableHelper.getCell(DLine, String)@ has been removed. Use the variant which take a DLine and a DColumn as parameters.

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

* The deprecated method @DTreeUserInteraction.refreshContent()@ has been removed. Use the variant which take an additional @IProgressMonitor@ parameter instead.

h2(#sirius0.9). Changes in Sirius 0.9.0

Version 0.9.0 is the first release under the Sirius name and under the Eclipse Foundation umbrella. Except for the few cases mentioned below (in the "Other API Changes", "Specifier-Visible Changes" and "User-Visible Changes" sections), Sirius 0.9.0 is functionally equivalent to the latest version of Viewpoint (version 6.10), which was the name of the project before it was open sourced at Eclipse. See the rest of the documentation for the complete list of feature of the Sirius platform.

h3. Migrating from Obeo Designer or Viewpoint to Sirius

If you have existing projects which used this technology before it became Eclipse Sirius and want to migrate to Sirius, you must:
# first migrate your projects and models to the latest pre-Sirius version of Viewpoint or Obeo Designer available to you (Viewpoint is the previous name of Sirius);
# then migrate those to Sirius 0.9.

The latest version of Viewpoint which was available in an Obeo Designer release is Viewpoint 6.8, released in Obeo Designer 6.2. Sirius 0.9 is based on Viewpoint 6.10, which was not released publicly.

If you were using Obeo Designer, you must thus first migrate your projects and models to Obeo Designer 6.2, and then consult the "release notes for Viewpoint 6.9 and 6.10":release_notes_vp.html, which lists the API changes from Viewpoint 6.8 to 6.10.

Once your projects are compatible with the latest Viewpoint available to you, you can migrate to Sirius, first by updating your Viewpoint Specification Projects and plug-ins which use the Viewpoint APIs, then by updating any Modeling Project and representation files (@*.aird@).

h4. Migrating Viewpoint Specification Projects

* Any plug-in dependencies towards Viewpoint plug-ins must be updated to the corresponding Sirius plug-in and version number. See the correspondence table below for the plug-in names to use.
* If your plug-ins used any of the extension points defined in Viewpoint, you will need to update your @plugin.xml@ files to reference the correct extension points identifiers. In particular, all Viewpoint Specification Projects created using Viewpoint use the @fr.obeo.dsl.viewpoint.componentization@ in their @plugin.xml@ to register the VSMs they define. This should be changed to use the equivalent @org.eclipse.sirius.componentization@ extension point id. The identifier changes for the other extension points follow the same rules as the name changes of the plug-ins they are defined in.
* The migration of your VSMs (@*.odesign@ files) is automatic: simply open your files once in the VSM editor, perform some no-op change to make the editor "dirty" and save it. The saved version will have been migrated to Sirius.
* If you had Java code which used the Viewpoint APIs, you will need to update it to use the Sirius APIs. A simple "Source > Organize Imports" on your source folders should find most classes you used in their new namespace. The Viewpoint code base and APIs used the term "Viewpoint" both for the name of the product and for the name of the concept. When it refered to the name of the product, the names were changed to use "Sirius" instead, so you may need to adjust some names in your code beyond just updating the imports (for example, @ViewpointControlCommand@ is now @SiriusControlCommand@).

Note that if you used Obeo Designer, you may have used the legacy Acceleo 2.x language for the computed expressions inside the @*.odesign@ files (if your expressions are of the form @<%something%>@ then you used the legacy language). That language is not supported anymore in Sirius 0.9, so you must migrate your expressions to use Acceleo 3 and/or the specialized interpreters (@var:@, @feature:@ and @service:@, see the documentation).

h4. Migrating Modeling Projects and Representation Files

* First migrate any modeler definitions used by your modeling projects and representation files (see the section above).
* Modeling projects created using Viewpoint will not be recognized directly by Sirius, because the nature identfier has changed. You must use the "Configure/Convert to Modeling Project" action in the project's context menu to make it a Sirius-compatible modeling project (see the section below for the technical details of the change).
* The migration of you representation files (@*.aird@) is performed automatically when they are loaded in memory. It will become permanent the first time you save it (you can force this by opening a representation, making some arbitrary change and saving the session).

h3. Plug-ins version numbers.

As of Sirius 0.9, and probably at least until Sirius 1.0 when the APIs will be more stable, all the bundles share the same version, which is also the version for the feature. If you used versioned dependencies to the old Viewpoint code (e.g. dependencies towards Viewpoint 6.8), you need to adjust the versions in your @MANIFEST.MF@ files in addition to the namespaces.

h3. Major namespace changes

In the context of the move as an official Eclipse project named Sirius, all the namespaces used in the code have changed.

h4. Plug-in and features identifiers

All identifiers have changed to start with the @org.eclipse.sirius@ namespace prefix. The tables below give the mapping between the Viewpoint plug-in and features identifiers and their Sirius equivalent.

|_. Viewpoint 6.x plug-in                     |_. Sirius 0.9 plug-in                      |
| fr.obeo.dsl.common                          | org.eclipse.sirius.common                 |
| fr.obeo.dsl.common.acceleo.mtl              | org.eclipse.sirius.common.acceleo.mtl     |
| fr.obeo.dsl.common.acceleo.mtl.ide          | org.eclipse.sirius.common.acceleo.mtl.ide |
| fr.obeo.dsl.common.ocl                      | org.eclipse.sirius.common.ocl             |
| fr.obeo.dsl.common.ui                       | org.eclipse.sirius.common.ui              |
| fr.obeo.dsl.common.xtext                    | org.eclipse.sirius.common.xtext           |
| fr.obeo.dsl.viewpoint                       | org.eclipse.sirius                        |
| fr.obeo.dsl.viewpoint.diagram               | org.eclipse.sirius.diagram                |
| fr.obeo.dsl.viewpoint.diagram.layoutdata    | org.eclipse.sirius.layoutdata             |
| fr.obeo.dsl.viewpoint.diagram.sequence      | org.eclipse.sirius.sequence               |
| fr.obeo.dsl.viewpoint.diagram.sequence.edit | org.eclipse.sirius.sequence.edit          |
| fr.obeo.dsl.viewpoint.diagram.sequence.ui   | org.eclipse.sirius.sequence.edit.ui       |
| fr.obeo.dsl.viewpoint.doc                   | org.eclipse.sirius.doc                    |
| fr.obeo.dsl.viewpoint.editor                | org.eclipse.sirius.editor                 |
| fr.obeo.dsl.viewpoint.editor.sequence       | org.eclipse.sirius.editor.sequence        |
| fr.obeo.dsl.viewpoint.editor.table          | org.eclipse.sirius.editor.table           |
| fr.obeo.dsl.viewpoint.editor.tree           | org.eclipse.sirius.editor.tree            |
| fr.obeo.dsl.viewpoint.eef.adapters          | org.eclipse.sirius.eef.adapters           |
| fr.obeo.dsl.viewpoint.interpreter           | org.eclipse.sirius.interpreter            |
| fr.obeo.dsl.viewpoint.table                 | org.eclipse.sirius.table                  |
| fr.obeo.dsl.viewpoint.table.ui              | org.eclipse.sirius.table.ui               |
| fr.obeo.dsl.viewpoint.tree                  | org.eclipse.sirius.tree                   |
| fr.obeo.dsl.viewpoint.tree.ui               | org.eclipse.sirius.tree.ui                |
| fr.obeo.dsl.viewpoint.ui                    | org.eclipse.sirius.ui                     |
| fr.obeo.mda.ecore.extender                  | org.eclipse.sirius.ecore.extender         |
| fr.obeo.mda.pim.ecore.design                | org.eclipse.sirius.sample.ecore.design       |
| org.eclipselab.emf.synchronizer             | org.eclipse.sirius.synchronizer           |

|_. Viewpoint 6.x feature                        |_. Sirius 0.9 feature                        |
| fr.obeo.dsl.viewpoint.runtime                  | org.eclipse.sirius.runtime                  |
| fr.obeo.dsl.viewpoint.runtime.acceleo          | org.eclipse.sirius.runtime.acceleo          |
| fr.obeo.dsl.viewpoint.runtime.ide.eef          | org.eclipse.sirius.runtime.ide.eef          |
| fr.obeo.dsl.viewpoint.runtime.ide.ui           | org.eclipse.sirius.runtime.ide.ui           |
| fr.obeo.dsl.viewpoint.runtime.ide.ui.acceleo   | org.eclipse.sirius.runtime.ide.ui.acceleo   |
| fr.obeo.dsl.viewpoint.runtime.ide.xtext        | org.eclipse.sirius.runtime.ide.xtext        |
| fr.obeo.dsl.viewpoint.runtime.ocl              | org.eclipse.sirius.runtime.ocl              |
| fr.obeo.dsl.viewpoint.specifier.ide.ui         | org.eclipse.sirius.specifier.ide.ui         |
| fr.obeo.dsl.viewpoint.specifier.ide.ui.acceleo | org.eclipse.sirius.specifier.ide.ui.acceleo |
| fr.obeo.dsl.viewpoint.doc.feature              | org.eclipse.sirius.doc.feature              |

h4. Java Packages and Classes Names

The Java package names have changed to start with the identifier of the plug-in they are defined in (which has changed). A simple "Source > Organize Imports" on your source folders should find most classes you used in their new namespace.

The Viewpoint code base and APIs used the term "Viewpoint" both for the name of the product and for the name of the concept. When it refered to the name of the product, the names where changed to use "Sirius" instead (for example, @ViewpointControlCommand@ is now @SiriusControlCommand@).

h4. Models namespace URIs

All namespace URIs have also been changed from "http://www.obeo.fr/dsl/viewpoint*" to "http://www.eclipse.org/sirius/".

If you have created VSM file (.odesign) or representations file (.aird) with Viewpoint, the changes of the namespace URIs will be automatically migrated during the loading of your VSM or your representations file. These new nsURIs will be stored physically in the file during the first save. If the file is not saved, the automatic migration will be replayed at the next opening.

h3. Nature ID

The modeling project has a specific nature (@org.eclipse.sirius.nature.modelingproject@).
If you have modeling project created with Viewpoint, you must launch the action "Configure/Convert to Modeling Project" to replace old nature id (@fr.obeo.dsl.viewpoint.nature.modelingproject@) by the new one.
If you have many modeling projects to "migrate", you can easily make a script to replace @fr.obeo.dsl.viewpoint.nature.modelingproject@ by @org.eclipse.sirius.nature.modelingproject@ in all @.project@ file of each modeling projects.

h3. Other API Changes

This section only lists API changes in Sirius 0.9.0 compared to the latest version of Viewpoint it is based on, i.e. Viewpoint 6.10.

h4. API Added

* Add @IMigrationParticipant.getPackage()@ to return the EPackage to use for the given namespace. This change concerns our internal migration framework. This is useful to handle our namespace changes (from Viewpoint to Sirius).

h4. API Removal

* Removed @org.eclipse.sirius.common.tools.api.interpreter.IAcceleoInterpreterVariables@: This interface only defined a single constant, which refered to the syntax of an obsolete version of the Acceleo language.
* Removed @org.eclipse.sirius.common.tools.api.resource.IFileContributorExtension@: This interface only defined a few constants relative to an extension point which does not exist anymore.
* Removed the @org.eclipse.sirius.reconciler@ extension point definition (which used to be defined in the @org.eclipse.sirius@ plug-in): This extension point is not supported anymore (and has not been for a long time).
* Removed all the deprecated methods from @Session@ and replaced the internal calls with the equivalent versions with @IProgressMonitors@. The removed methods are:

pre.. 
void open();
void addSemanticResource(Resource newResource, boolean addCrossReferencedResources);
void addSemanticResource(URI semanticModelURI, boolean addCrossReferencedResources);
void addSemanticResource(URI semanticModelURI, boolean addCrossReferencedResources, IProgressMonitor monitor);
void removeSemanticResource(Resource resource, boolean removeCrossReferencedResources);
void removeSemanticResource(Resource semanticResource);
void save();
void close();
Collection<Viewpoint> getSelectedViewpoints();
void createView(Viewpoint viewpoint, Collection<EObject> semantics);
void createView(Viewpoint viewpoint, Collection<EObject> semantics, boolean createNewRepresentations);
void addSelectedView(DView view) throws IllegalArgumentException;
void removeSelectedView(DView view);

h3. Specifier-Visible Changes

New variables are available for @sizeComputationExpression@ to compute the size of edges on @EdgeStyleDescription@ and @BracketEdgeStyleDescription@:
* _diagram_: the current @DDiagram@
* _view_: the current @DEdge@
* _sourceView_: the source view of the current edge.
* _targetView_: the target view of the current edge.

h3. User-Visible Changes

* The ability to print table representations has been disabled for the 0.9 release due to an external dependency issue (see <a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=422223" target="_blank">bug #422223</a>: for the details). It should be re-introduced in 1.0.
