Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristian W. Damus2015-12-04 13:52:01 +0000
committerChristian W. Damus2015-12-08 13:58:31 +0000
commit49bd194639354cde35b15717e4ead156f4613754 (patch)
tree2f3b4a83815186201eb39fbcb058d07d8880f6d4 /plugins
parented54bfa4c258ade68f0c9a4eb1263bb8aa37a92e (diff)
downloadorg.eclipse.papyrus-49bd194639354cde35b15717e4ead156f4613754.tar.gz
org.eclipse.papyrus-49bd194639354cde35b15717e4ead156f4613754.tar.xz
org.eclipse.papyrus-49bd194639354cde35b15717e4ead156f4613754.zip
Bug 469188: [Editor] Page management improvements in the Papyrus multi-editor
https://bugs.eclipse.org/bugs/show_bug.cgi?id=469188 This is a squashed commit comprising all of the changes on the committers/cdamus/469188-editor-welcome branch for the introduction of a Welcome Page in the Papyrus Editor. commit 51d64a198c2069b208b5231212a5514441514c54 Implement drag-and-drop rearrangement of the sections in the simple grid-wise layout of the Welcome Page. Persist the user's customization in the sash/di resource with the sash model, using new classes in the Welcome package. commit b59f057cf1e08b51942aac1f45226a304c48039e Fix enablement condition for Show Welcome Page action which has been broken since the page was changed from an editor to a plain composite. commit 69cee20b44c699c6a078e66bf9b16a83c1de7315 Remove the databinding properties APIs for Forms widgets that are no longer needed since the NatTable refactoring of the Diagrams table in the welcome page. commit 00cfdd106421c0b1366c2a7deade819b4a3041ef Add table of languages to the General section in the welcome page. Add section of hyperlinks to related views to the welcome page. Implement ordering of the contents of the welcome page according to tab 'afterTab' relationships and priorities. Overall the layout is still two rows with a variable number of columns. commit a7d739b8e03bea5d4cf5e4d0d3663adbc62f5018 Let the SashModel report to listeners when its storage mode changes so that the two different UI presentations of that mode can remain up-to- date at all times. commit 7fc4f8bf1f0fcee31f84b976e29cd7b3848ec47d Ensure that new models initially track the active page of each tab folder because they store their layout privately by default. commit 6d5dbf27a4428645655bcf6ff9a99d4a3c77dcb8 Implement optional tracking of the active page in the private sash model and switching between private and shared storage of the layout. Includes: * enhancement of the Sash DI model to include a currently selected page for each tab folder and a boolean flag whether to restore the last selection in each tab folder * a new editor lifecycle event for "pre display" to provide a hook to set up the page activation before the SWT controls are rendered, so that the editor doesn't open up and then change page selections while the user watches * expose the SaveLayoutBeforeClose behaviour for re-use when changing layout options in the welcome page * update enablement from editable-ness for Properties widgets that force refresh commit 97897b3d0d295a71a7173a584ceda3ac24c5c6ea Factor out some more common bits into core plug-ins (e.g., the IsWelcomeElement constraint in the properties environment). Create the list of tables in the welcome page. This requires some renaming of properties model content in the diagrams list for disambiguation. commit f73fe34e87c915cc603ec12c608c020406ea7d73 Refactor the Diagrams table as a reusable NatTable of hyperlinks. commit a6308f25a8c6e6c129174e9c418cb90e6f025e16 Move the column headers of the diagrams table out into a separate composite that does not scroll vertically with the table of hyperlinks (though it does track the table's horizontal scroll position). commit 0425bf34630e4420db3674fa8d4641820a305478 Add a separate preference page for Welcome Page Content. This depends on a new extension in the context registry for association of contexts with preferences pages (by default, associating legacy contexts with the Properties View preference page). commit 06719c107a3f323be53ca6ada4f820f2d4ef10cb Rework the contribution of welcome-page content to: * eliminate the custom extension point for section providers * use the Properties View framework to obtain welcome-page sections for the Welcome model element Update the Diagrams table provider as a property section for the Welcome model. This involves implementation of a custom table-of- hyperlinks widget. Several reusable data-bindings classes are added to the appropriate Papyrus infra-layer bundles. commit 4069f62cc89413b8739cc6c33211ac5a11942bc4 Welcome page content for diagrams. commit 8599ee6bdf7b2c7423811fee3e2441a618621ce4 The Welcome Page doesn't need to be an editor, just a composite. So, let any page part (including simple composites) be optionally closeable and change the WelcomePage into a simple composite part instead of a nested workbench editor-part. commit 83b581ea9aadb5b852b36b2fa0524ca7df60b255 Initial definition of an extension point for welcome section providers. commit f949eaf6cf131449f4584b71072033b22cd1cea2 Initial implementation of a (so far, empty) Welcome page that is always open when no other Papyrus editor pages are open. Change-Id: I351118dc0b6a0dea505719a8c62ef430c273c7cf
Diffstat (limited to 'plugins')
-rw-r--r--plugins/infra/core/org.eclipse.papyrus.infra.core.sasheditor.di/META-INF/MANIFEST.MF1
-rw-r--r--plugins/infra/core/org.eclipse.papyrus.infra.core.sasheditor.di/custom-src/org/eclipse/papyrus/infra/core/sasheditor/di/contentprovider/DiSashModelManager.java13
-rw-r--r--plugins/infra/core/org.eclipse.papyrus.infra.core.sasheditor.di/custom-src/org/eclipse/papyrus/infra/core/sasheditor/di/contentprovider/DiSashModelMngr.java13
-rw-r--r--plugins/infra/core/org.eclipse.papyrus.infra.core.sasheditor.di/custom-src/org/eclipse/papyrus/infra/core/sasheditor/di/contentprovider/commands/CloseAllDiagramsCommand.java55
-rw-r--r--plugins/infra/core/org.eclipse.papyrus.infra.core.sasheditor.di/custom-src/org/eclipse/papyrus/infra/core/sasheditor/di/contentprovider/commands/CloseDiagramCommand.java26
-rw-r--r--plugins/infra/core/org.eclipse.papyrus.infra.core.sasheditor.di/custom-src/org/eclipse/papyrus/infra/core/sasheditor/di/contentprovider/commands/CloseOtherDiagramsCommand.java47
-rw-r--r--plugins/infra/core/org.eclipse.papyrus.infra.core.sasheditor.di/custom-src/org/eclipse/papyrus/infra/core/sasheditor/di/contentprovider/commands/PageContext.java98
-rw-r--r--plugins/infra/core/org.eclipse.papyrus.infra.core.sasheditor.di/custom-src/org/eclipse/papyrus/infra/core/sasheditor/di/contentprovider/utils/IPageUtils.java23
-rw-r--r--plugins/infra/core/org.eclipse.papyrus.infra.core.sasheditor.di/model/di.ecore6
-rw-r--r--plugins/infra/core/org.eclipse.papyrus.infra.core.sasheditor.di/model/sashwindowsdi.genmodel16
-rw-r--r--plugins/infra/core/org.eclipse.papyrus.infra.core.sasheditor.di/model/sashwindowsdi.notation2447
-rw-r--r--plugins/infra/core/org.eclipse.papyrus.infra.core.sasheditor.di/model/sashwindowsdi.uml1210
-rw-r--r--plugins/infra/core/org.eclipse.papyrus.infra.core.sasheditor.di/src/org/eclipse/papyrus/infra/core/sashwindows/di/DiPackage.java83
-rw-r--r--plugins/infra/core/org.eclipse.papyrus.infra.core.sasheditor.di/src/org/eclipse/papyrus/infra/core/sashwindows/di/SashModel.java47
-rw-r--r--plugins/infra/core/org.eclipse.papyrus.infra.core.sasheditor.di/src/org/eclipse/papyrus/infra/core/sashwindows/di/TabFolder.java53
-rw-r--r--plugins/infra/core/org.eclipse.papyrus.infra.core.sasheditor.di/src/org/eclipse/papyrus/infra/core/sashwindows/di/impl/DiFactoryImpl.java33
-rw-r--r--plugins/infra/core/org.eclipse.papyrus.infra.core.sasheditor.di/src/org/eclipse/papyrus/infra/core/sashwindows/di/impl/DiPackageImpl.java65
-rw-r--r--plugins/infra/core/org.eclipse.papyrus.infra.core.sasheditor.di/src/org/eclipse/papyrus/infra/core/sashwindows/di/impl/SashModelImpl.java95
-rw-r--r--plugins/infra/core/org.eclipse.papyrus.infra.core.sasheditor.di/src/org/eclipse/papyrus/infra/core/sashwindows/di/impl/TabFolderImpl.java114
-rw-r--r--plugins/infra/core/org.eclipse.papyrus.infra.core.sasheditor/src/org/eclipse/papyrus/infra/core/sasheditor/editor/ICloseablePart.java60
-rw-r--r--plugins/infra/core/org.eclipse.papyrus.infra.core.sasheditor/src/org/eclipse/papyrus/infra/core/sasheditor/internal/ComponentPart.java10
-rw-r--r--plugins/infra/core/org.eclipse.papyrus.infra.core.sasheditor/src/org/eclipse/papyrus/infra/core/sasheditor/internal/EditorPart.java27
-rw-r--r--plugins/infra/core/org.eclipse.papyrus.infra.core.sasheditor/src/org/eclipse/papyrus/infra/core/sasheditor/internal/PTabFolder.java8
-rw-r--r--plugins/infra/core/org.eclipse.papyrus.infra.core.sasheditor/src/org/eclipse/papyrus/infra/core/sasheditor/internal/PagePart.java25
-rw-r--r--plugins/infra/core/org.eclipse.papyrus.infra.core.sasheditor/src/org/eclipse/papyrus/infra/core/sasheditor/internal/TabFolderPart.java28
-rw-r--r--plugins/infra/core/org.eclipse.papyrus.infra.core.sasheditor/src/org/eclipse/papyrus/infra/core/sasheditor/internal/TabItemPart.java4
-rw-r--r--plugins/infra/core/org.eclipse.papyrus.infra.core/src/org/eclipse/papyrus/infra/core/editor/CoreMultiDiagramEditor.java5
-rw-r--r--plugins/infra/core/org.eclipse.papyrus.infra.core/src/org/eclipse/papyrus/infra/core/editor/MultiDiagramPropertySheetPage.java58
-rw-r--r--plugins/infra/core/org.eclipse.papyrus.infra.core/src/org/eclipse/papyrus/infra/core/internal/commands/PageLayoutStorageState.java46
-rw-r--r--plugins/infra/core/org.eclipse.papyrus.infra.core/src/org/eclipse/papyrus/infra/core/resource/sasheditor/SashLayoutCommandFactory.java108
-rw-r--r--plugins/infra/core/org.eclipse.papyrus.infra.core/src/org/eclipse/papyrus/infra/core/resource/sasheditor/SashModel.java118
-rw-r--r--plugins/infra/core/org.eclipse.papyrus.infra.core/src/org/eclipse/papyrus/infra/core/services/EditorLifecycleEventListener.java12
-rw-r--r--plugins/infra/core/org.eclipse.papyrus.infra.core/src/org/eclipse/papyrus/infra/core/services/internal/EditorLifecycleManagerImpl.java21
-rw-r--r--plugins/infra/core/org.eclipse.papyrus.infra.core/src/org/eclipse/papyrus/infra/core/services/internal/InternalEditorLifecycleManager.java10
-rw-r--r--plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome.nattable/.classpath7
-rw-r--r--plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome.nattable/.project28
-rw-r--r--plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome.nattable/.settings/org.eclipse.jdt.core.prefs296
-rw-r--r--plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome.nattable/.settings/org.eclipse.jdt.ui.prefs68
-rw-r--r--plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome.nattable/META-INF/MANIFEST.MF32
-rw-r--r--plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome.nattable/about.html28
-rw-r--r--plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome.nattable/build.properties22
-rw-r--r--plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome.nattable/model/environment.xmi9
-rw-r--r--plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome.nattable/model/general/languages.ctx20
-rw-r--r--plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome.nattable/model/general/ui/SingleLanguages.xwt12
-rw-r--r--plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome.nattable/plugin.properties13
-rw-r--r--plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome.nattable/plugin.xml31
-rw-r--r--plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome.nattable/pom.xml14
-rw-r--r--plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome.nattable/src/org/eclipse/papyrus/infra/editor/welcome/nattable/ServiceConfigAttributes.java132
-rw-r--r--plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome.nattable/src/org/eclipse/papyrus/infra/editor/welcome/nattable/hyperlink/HyperlinkNavigationAction.java62
-rw-r--r--plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome.nattable/src/org/eclipse/papyrus/infra/editor/welcome/nattable/hyperlink/HyperlinkNavigationConfiguration.java160
-rw-r--r--plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome.nattable/src/org/eclipse/papyrus/infra/editor/welcome/nattable/internal/Activator.java60
-rw-r--r--plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome.nattable/src/org/eclipse/papyrus/infra/editor/welcome/nattable/internal/widgets/LanguagesTable.java91
-rw-r--r--plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome.nattable/src/org/eclipse/papyrus/infra/editor/welcome/nattable/painter/LabelPainter.java119
-rw-r--r--plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome.nattable/src/org/eclipse/papyrus/infra/editor/welcome/nattable/painter/LabelProviderImagePainter.java52
-rw-r--r--plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome.nattable/src/org/eclipse/papyrus/infra/editor/welcome/nattable/painter/LabelProviderTextPainter.java77
-rw-r--r--plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome.nattable/src/org/eclipse/papyrus/infra/editor/welcome/nattable/sorting/ColumnHeaderHelper.java157
-rw-r--r--plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome.nattable/src/org/eclipse/papyrus/infra/editor/welcome/nattable/sorting/EventListObservableAdapter.java198
-rw-r--r--plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome.nattable/src/org/eclipse/papyrus/infra/editor/welcome/nattable/sorting/PapyrusGlazedListEventsLayer.java159
-rw-r--r--plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome.nattable/src/org/eclipse/papyrus/infra/editor/welcome/nattable/widgets/FormTable.java230
-rw-r--r--plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome.nattable/src/org/eclipse/papyrus/infra/editor/welcome/nattable/widgets/HyperlinkTable.java53
-rw-r--r--plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/.classpath8
-rw-r--r--plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/.project28
-rw-r--r--plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/.settings/org.eclipse.jdt.core.prefs296
-rw-r--r--plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/.settings/org.eclipse.jdt.ui.prefs68
-rw-r--r--plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/META-INF/MANIFEST.MF38
-rw-r--r--plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/about.html28
-rw-r--r--plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/build.properties24
-rw-r--r--plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/icons/full/editor16/welcome16.gifbin0 -> 254 bytes
-rw-r--r--plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/icons/full/obj16/layout.pngbin0 -> 378 bytes
-rw-r--r--plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/model/environment.xmi19
-rw-r--r--plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/model/general/general.ctx32
-rw-r--r--plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/model/general/ui/SinglePageLayout.xwt12
-rw-r--r--plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/model/general/ui/SingleViewLinks.xwt13
-rw-r--r--plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/model/welcome.di2
-rw-r--r--plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/model/welcome.ecore36
-rw-r--r--plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/model/welcome.genmodel66
-rw-r--r--plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/model/welcome.notation218
-rw-r--r--plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/model/welcome.uml90
-rw-r--r--plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/plugin.properties21
-rw-r--r--plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/plugin.xml163
-rw-r--r--plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/pom.xml14
-rw-r--r--plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/src-gen/org/eclipse/papyrus/infra/editor/welcome/Welcome.java74
-rw-r--r--plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/src-gen/org/eclipse/papyrus/infra/editor/welcome/WelcomeFactory.java76
-rw-r--r--plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/src-gen/org/eclipse/papyrus/infra/editor/welcome/WelcomePackage.java528
-rw-r--r--plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/src-gen/org/eclipse/papyrus/infra/editor/welcome/WelcomePage.java110
-rw-r--r--plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/src-gen/org/eclipse/papyrus/infra/editor/welcome/WelcomeSection.java123
-rw-r--r--plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/src-gen/org/eclipse/papyrus/infra/editor/welcome/internal/impl/WelcomeFactoryImpl.java142
-rw-r--r--plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/src-gen/org/eclipse/papyrus/infra/editor/welcome/internal/impl/WelcomeImpl.java250
-rw-r--r--plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/src-gen/org/eclipse/papyrus/infra/editor/welcome/internal/impl/WelcomePackageImpl.java401
-rw-r--r--plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/src-gen/org/eclipse/papyrus/infra/editor/welcome/internal/impl/WelcomePageImpl.java315
-rw-r--r--plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/src-gen/org/eclipse/papyrus/infra/editor/welcome/internal/impl/WelcomeSectionImpl.java410
-rw-r--r--plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/src-gen/org/eclipse/papyrus/infra/editor/welcome/internal/operations/WelcomePageOperations.java120
-rw-r--r--plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/src-gen/org/eclipse/papyrus/infra/editor/welcome/internal/operations/WelcomeSectionOperations.java52
-rw-r--r--plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/src-gen/org/eclipse/papyrus/infra/editor/welcome/util/WelcomeAdapterFactory.java179
-rw-r--r--plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/src-gen/org/eclipse/papyrus/infra/editor/welcome/util/WelcomeSwitch.java183
-rw-r--r--plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/src/org/eclipse/papyrus/infra/editor/welcome/IWelcomePageService.java54
-rw-r--r--plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/src/org/eclipse/papyrus/infra/editor/welcome/internal/Activator.java80
-rw-r--r--plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/src/org/eclipse/papyrus/infra/editor/welcome/internal/WelcomeAdapterFactory.java48
-rw-r--r--plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/src/org/eclipse/papyrus/infra/editor/welcome/internal/WelcomeLayout.java366
-rw-r--r--plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/src/org/eclipse/papyrus/infra/editor/welcome/internal/WelcomePage.java218
-rw-r--r--plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/src/org/eclipse/papyrus/infra/editor/welcome/internal/WelcomePageFactory.java135
-rw-r--r--plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/src/org/eclipse/papyrus/infra/editor/welcome/internal/WelcomePageService.java417
-rw-r--r--plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/src/org/eclipse/papyrus/infra/editor/welcome/internal/WelcomeTab.java133
-rw-r--r--plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/src/org/eclipse/papyrus/infra/editor/welcome/internal/commands/ResetWelcomePageHandler.java71
-rw-r--r--plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/src/org/eclipse/papyrus/infra/editor/welcome/internal/commands/ShowWelcomePageHandler.java71
-rw-r--r--plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/src/org/eclipse/papyrus/infra/editor/welcome/internal/constraints/IsWelcomeElement.java50
-rw-r--r--plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/src/org/eclipse/papyrus/infra/editor/welcome/internal/dnd/WelcomeSectionTransfer.java32
-rw-r--r--plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/src/org/eclipse/papyrus/infra/editor/welcome/internal/modelelements/AbstractPageLayoutToggleValue.java106
-rw-r--r--plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/src/org/eclipse/papyrus/infra/editor/welcome/internal/modelelements/LanguageObservable.java82
-rw-r--r--plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/src/org/eclipse/papyrus/infra/editor/welcome/internal/modelelements/LanguagesObservableList.java81
-rw-r--r--plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/src/org/eclipse/papyrus/infra/editor/welcome/internal/modelelements/PrivateLayoutValue.java78
-rw-r--r--plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/src/org/eclipse/papyrus/infra/editor/welcome/internal/modelelements/RestoreActivePageValue.java52
-rw-r--r--plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/src/org/eclipse/papyrus/infra/editor/welcome/internal/modelelements/WelcomeModelElement.java100
-rw-r--r--plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/src/org/eclipse/papyrus/infra/editor/welcome/internal/modelelements/WelcomeModelElementFactory.java45
-rw-r--r--plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/src/org/eclipse/papyrus/infra/editor/welcome/internal/widgets/OpenViewLink.java171
-rw-r--r--plugins/infra/emf/org.eclipse.papyrus.infra.emf/src/org/eclipse/papyrus/infra/emf/utils/EMFHelper.java104
-rw-r--r--plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.welcome/.classpath7
-rw-r--r--plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.welcome/.project28
-rw-r--r--plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.welcome/.settings/org.eclipse.jdt.core.prefs296
-rw-r--r--plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.welcome/.settings/org.eclipse.jdt.ui.prefs68
-rw-r--r--plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.welcome/META-INF/MANIFEST.MF40
-rw-r--r--plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.welcome/about.html28
-rw-r--r--plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.welcome/build.properties22
-rw-r--r--plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.welcome/model/diagrams/diagrams.ctx20
-rw-r--r--plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.welcome/model/diagrams/ui/SingleDiagrams.xwt13
-rw-r--r--plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.welcome/model/environment.xmi20
-rw-r--r--plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.welcome/plugin.properties13
-rw-r--r--plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.welcome/plugin.xml31
-rw-r--r--plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.welcome/pom.xml14
-rw-r--r--plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.welcome/src/org/eclipse/papyrus/infra/gmfdiag/welcome/internal/Activator.java60
-rw-r--r--plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.welcome/src/org/eclipse/papyrus/infra/gmfdiag/welcome/internal/modelelements/DiagramObservable.java187
-rw-r--r--plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.welcome/src/org/eclipse/papyrus/infra/gmfdiag/welcome/internal/modelelements/DiagramsObservableList.java87
-rw-r--r--plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.welcome/src/org/eclipse/papyrus/infra/gmfdiag/welcome/internal/modelelements/WelcomeModelElement.java68
-rw-r--r--plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.welcome/src/org/eclipse/papyrus/infra/gmfdiag/welcome/internal/modelelements/WelcomeModelElementFactory.java45
-rw-r--r--plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.welcome/src/org/eclipse/papyrus/infra/gmfdiag/welcome/internal/widgets/CreateNewDiagramButton.java179
-rw-r--r--plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.welcome/src/org/eclipse/papyrus/infra/gmfdiag/welcome/internal/widgets/DiagramsTable.java92
-rw-r--r--plugins/infra/nattable/org.eclipse.papyrus.infra.nattable.welcome/.classpath7
-rw-r--r--plugins/infra/nattable/org.eclipse.papyrus.infra.nattable.welcome/.project28
-rw-r--r--plugins/infra/nattable/org.eclipse.papyrus.infra.nattable.welcome/.settings/org.eclipse.jdt.core.prefs296
-rw-r--r--plugins/infra/nattable/org.eclipse.papyrus.infra.nattable.welcome/.settings/org.eclipse.jdt.ui.prefs68
-rw-r--r--plugins/infra/nattable/org.eclipse.papyrus.infra.nattable.welcome/META-INF/MANIFEST.MF39
-rw-r--r--plugins/infra/nattable/org.eclipse.papyrus.infra.nattable.welcome/about.html28
-rw-r--r--plugins/infra/nattable/org.eclipse.papyrus.infra.nattable.welcome/build.properties22
-rw-r--r--plugins/infra/nattable/org.eclipse.papyrus.infra.nattable.welcome/model/environment.xmi20
-rw-r--r--plugins/infra/nattable/org.eclipse.papyrus.infra.nattable.welcome/model/tables/tables.ctx21
-rw-r--r--plugins/infra/nattable/org.eclipse.papyrus.infra.nattable.welcome/model/tables/ui/SingleTables.xwt13
-rw-r--r--plugins/infra/nattable/org.eclipse.papyrus.infra.nattable.welcome/plugin.properties13
-rw-r--r--plugins/infra/nattable/org.eclipse.papyrus.infra.nattable.welcome/plugin.xml31
-rw-r--r--plugins/infra/nattable/org.eclipse.papyrus.infra.nattable.welcome/pom.xml14
-rw-r--r--plugins/infra/nattable/org.eclipse.papyrus.infra.nattable.welcome/src/org/eclipse/papyrus/infra/nattable/welcome/internal/Activator.java60
-rw-r--r--plugins/infra/nattable/org.eclipse.papyrus.infra.nattable.welcome/src/org/eclipse/papyrus/infra/nattable/welcome/internal/modelelements/TableObservable.java187
-rw-r--r--plugins/infra/nattable/org.eclipse.papyrus.infra.nattable.welcome/src/org/eclipse/papyrus/infra/nattable/welcome/internal/modelelements/TablesObservableList.java87
-rw-r--r--plugins/infra/nattable/org.eclipse.papyrus.infra.nattable.welcome/src/org/eclipse/papyrus/infra/nattable/welcome/internal/modelelements/WelcomeModelElement.java68
-rw-r--r--plugins/infra/nattable/org.eclipse.papyrus.infra.nattable.welcome/src/org/eclipse/papyrus/infra/nattable/welcome/internal/modelelements/WelcomeModelElementFactory.java45
-rw-r--r--plugins/infra/nattable/org.eclipse.papyrus.infra.nattable.welcome/src/org/eclipse/papyrus/infra/nattable/welcome/internal/widgets/CreateNewTableButton.java180
-rw-r--r--plugins/infra/nattable/org.eclipse.papyrus.infra.nattable.welcome/src/org/eclipse/papyrus/infra/nattable/welcome/internal/widgets/TablesTable.java92
-rwxr-xr-xplugins/infra/nattable/pom.xml3
-rw-r--r--plugins/infra/org.eclipse.papyrus.infra.tools/.classpath4
-rw-r--r--plugins/infra/org.eclipse.papyrus.infra.tools/.settings/org.eclipse.jdt.core.prefs6
-rw-r--r--plugins/infra/org.eclipse.papyrus.infra.tools/META-INF/MANIFEST.MF3
-rw-r--r--plugins/infra/org.eclipse.papyrus.infra.tools/src/org/eclipse/papyrus/infra/tools/databinding/TouchableValue.java74
-rw-r--r--plugins/infra/org.eclipse.papyrus.infra.tools/src/org/eclipse/papyrus/infra/tools/databinding/WritableListWithIterator.java179
-rw-r--r--plugins/infra/org.eclipse.papyrus.infra.tools/src/org/eclipse/papyrus/infra/tools/dnd/PapyrusTransfer.java105
-rw-r--r--plugins/infra/org.eclipse.papyrus.infra.tools/src/org/eclipse/papyrus/infra/tools/util/PlatformHelper.java29
-rw-r--r--plugins/infra/widget/org.eclipse.papyrus.infra.widgets/.classpath14
-rwxr-xr-xplugins/infra/widget/org.eclipse.papyrus.infra.widgets/.settings/org.eclipse.jdt.core.prefs6
-rw-r--r--plugins/infra/widget/org.eclipse.papyrus.infra.widgets/META-INF/MANIFEST.MF2
-rw-r--r--plugins/infra/widget/org.eclipse.papyrus.infra.widgets/src/org/eclipse/papyrus/infra/widgets/providers/WorkbenchFilteredLabelProvider.java28
-rw-r--r--plugins/views/properties/org.eclipse.papyrus.views.properties/schema/context.exsd306
-rw-r--r--plugins/views/properties/org.eclipse.papyrus.views.properties/src/org/eclipse/papyrus/views/properties/extensions/ContextExtensionPoint.java78
-rw-r--r--plugins/views/properties/org.eclipse.papyrus.views.properties/src/org/eclipse/papyrus/views/properties/preferences/Preferences.java39
-rw-r--r--plugins/views/properties/org.eclipse.papyrus.views.properties/src/org/eclipse/papyrus/views/properties/runtime/ConfigurationManager.java66
-rw-r--r--plugins/views/properties/org.eclipse.papyrus.views.properties/src/org/eclipse/papyrus/views/properties/widgets/AbstractPropertyEditor.java7
173 files changed, 15110 insertions, 2224 deletions
diff --git a/plugins/infra/core/org.eclipse.papyrus.infra.core.sasheditor.di/META-INF/MANIFEST.MF b/plugins/infra/core/org.eclipse.papyrus.infra.core.sasheditor.di/META-INF/MANIFEST.MF
index 666b0fc893c..ae5263cb498 100644
--- a/plugins/infra/core/org.eclipse.papyrus.infra.core.sasheditor.di/META-INF/MANIFEST.MF
+++ b/plugins/infra/core/org.eclipse.papyrus.infra.core.sasheditor.di/META-INF/MANIFEST.MF
@@ -19,6 +19,7 @@ Require-Bundle: org.eclipse.swt;bundle-version="3.5.0",
org.eclipse.emf.ecore;visibility:=reexport,
org.eclipse.emf.ecore.xmi;bundle-version="2.5.0";visibility:=reexport,
org.eclipse.uml2.types;visibility:=reexport,
+ org.eclipse.uml2.common;visibility:=reexport,
org.eclipse.emf.transaction;bundle-version="1.4.0",
org.eclipse.papyrus.infra.core.log;bundle-version="1.2.0"
Bundle-Vendor: %providerName
diff --git a/plugins/infra/core/org.eclipse.papyrus.infra.core.sasheditor.di/custom-src/org/eclipse/papyrus/infra/core/sasheditor/di/contentprovider/DiSashModelManager.java b/plugins/infra/core/org.eclipse.papyrus.infra.core.sasheditor.di/custom-src/org/eclipse/papyrus/infra/core/sasheditor/di/contentprovider/DiSashModelManager.java
index 205f47d2ed4..5737b1ff72a 100644
--- a/plugins/infra/core/org.eclipse.papyrus.infra.core.sasheditor.di/custom-src/org/eclipse/papyrus/infra/core/sasheditor/di/contentprovider/DiSashModelManager.java
+++ b/plugins/infra/core/org.eclipse.papyrus.infra.core.sasheditor.di/custom-src/org/eclipse/papyrus/infra/core/sasheditor/di/contentprovider/DiSashModelManager.java
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (c) 2013 Cedric Dumoulin.
+ * Copyright (c) 2013, 2015 Cedric Dumoulin, Christian W. Damus, and others.
*
*
* All rights reserved. This program and the accompanying materials
@@ -9,6 +9,7 @@
*
* Contributors:
* Cedric Dumoulin Cedric.dumoulin@lifl.fr - Initial API and implementation
+ * Christian W. Damus - bug 469188
*
*****************************************************************************/
@@ -290,7 +291,15 @@ public class DiSashModelManager {
* @return
*/
protected SashWindowsMngr createDefaultSashModel() {
- return DiUtils.createDefaultSashWindowsMngr();
+ SashWindowsMngr result = DiUtils.createDefaultSashWindowsMngr();
+
+ if (result.getSashModel() != null) {
+ // Default this to true for new models, which store the sash model
+ // in the workspace private area by default
+ result.getSashModel().setRestoreActivePage(true);
+ }
+
+ return result;
}
/**
diff --git a/plugins/infra/core/org.eclipse.papyrus.infra.core.sasheditor.di/custom-src/org/eclipse/papyrus/infra/core/sasheditor/di/contentprovider/DiSashModelMngr.java b/plugins/infra/core/org.eclipse.papyrus.infra.core.sasheditor.di/custom-src/org/eclipse/papyrus/infra/core/sasheditor/di/contentprovider/DiSashModelMngr.java
index 960ac65849e..9fb452b4a0e 100644
--- a/plugins/infra/core/org.eclipse.papyrus.infra.core.sasheditor.di/custom-src/org/eclipse/papyrus/infra/core/sasheditor/di/contentprovider/DiSashModelMngr.java
+++ b/plugins/infra/core/org.eclipse.papyrus.infra.core.sasheditor.di/custom-src/org/eclipse/papyrus/infra/core/sasheditor/di/contentprovider/DiSashModelMngr.java
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (c) 2009 CEA LIST & LIFL
+ * Copyright (c) 2009, 2015 CEA LIST & LIFL, Christian W. Damus, and others
*
*
* All rights reserved. This program and the accompanying materials
@@ -9,6 +9,7 @@
*
* Contributors:
* Cedric Dumoulin Cedric.dumoulin@lifl.fr - Initial API and implementation
+ * Christian W. Damus - bug 469188
*
*****************************************************************************/
@@ -209,7 +210,15 @@ public class DiSashModelMngr {
* @return
*/
protected SashWindowsMngr createDefaultSashModel() {
- return DiUtils.createDefaultSashWindowsMngr();
+ SashWindowsMngr result = DiUtils.createDefaultSashWindowsMngr();
+
+ if (result.getSashModel() != null) {
+ // Default this to true for new models, which store the sash model
+ // in the workspace private area by default
+ result.getSashModel().setRestoreActivePage(true);
+ }
+
+ return result;
}
/**
diff --git a/plugins/infra/core/org.eclipse.papyrus.infra.core.sasheditor.di/custom-src/org/eclipse/papyrus/infra/core/sasheditor/di/contentprovider/commands/CloseAllDiagramsCommand.java b/plugins/infra/core/org.eclipse.papyrus.infra.core.sasheditor.di/custom-src/org/eclipse/papyrus/infra/core/sasheditor/di/contentprovider/commands/CloseAllDiagramsCommand.java
index deab4ff85f4..300ab5f75ac 100644
--- a/plugins/infra/core/org.eclipse.papyrus.infra.core.sasheditor.di/custom-src/org/eclipse/papyrus/infra/core/sasheditor/di/contentprovider/commands/CloseAllDiagramsCommand.java
+++ b/plugins/infra/core/org.eclipse.papyrus.infra.core.sasheditor.di/custom-src/org/eclipse/papyrus/infra/core/sasheditor/di/contentprovider/commands/CloseAllDiagramsCommand.java
@@ -3,9 +3,7 @@ package org.eclipse.papyrus.infra.core.sasheditor.di.contentprovider.commands;
import org.eclipse.core.commands.AbstractHandler;
import org.eclipse.core.commands.ExecutionEvent;
import org.eclipse.core.commands.ExecutionException;
-import org.eclipse.papyrus.infra.core.sasheditor.contentprovider.IPageManager;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.handlers.HandlerUtil;
+import org.eclipse.papyrus.infra.core.sasheditor.di.contentprovider.utils.IPageUtils;
/**
* A command to be used with the Eclipse Commands Framework.
@@ -22,7 +20,9 @@ public class CloseAllDiagramsCommand extends AbstractHandler {
*/
@Override
public void setEnabled(Object evaluationContext) {
- // System.out.println("call to CloseAllDiagramsCommand.setEnable(" + evaluationContext + ")");
+ PageContext context = new PageContext(evaluationContext);
+ setBaseEnabled((context.getOpenPageCount() > 0)
+ && context.getOpenPages().stream().allMatch(IPageUtils::canClose));
}
/**
@@ -31,53 +31,12 @@ public class CloseAllDiagramsCommand extends AbstractHandler {
*/
@Override
public Object execute(ExecutionEvent event) throws ExecutionException {
-
- IPageManager pageManager;
- try {
- pageManager = getPageManager(event);
- } catch (NullPointerException e) {
- // PageMngr or Editing Domain can't be found
- return null;
+ PageContext context = new PageContext(event);
+ if ((context.getOpenPageCount() > 0) && context.getOpenPages().stream().allMatch(IPageUtils::canClose)) {
+ context.pageManager.closeAllOpenedPages();
}
- execute(pageManager);
return null;
}
- /**
- * Get the PageMngr used to interact with the content provider.
- *
- * @param event
- * @return
- * @throws NullPointerException
- * if the PageMngr can't be found.
- */
- private IPageManager getPageManager(ExecutionEvent event) {
- IEditorPart part = HandlerUtil.getActiveEditor(event);
- IPageManager pageManager = (IPageManager) part.getAdapter(IPageManager.class);
-
- return pageManager;
- }
-
- /**
- * Close all the diagrams.
- *
- * @param pageManager
- */
- public void execute(final IPageManager pageManager) throws ExecutionException {
- boolean atLeastOneOpenPage = false;
- for (Object pageIdentifier : pageManager.allPages()) {
- if (pageManager.isOpen(pageIdentifier)) {
- atLeastOneOpenPage = true;
- break;
- }
- }
-
- if (!atLeastOneOpenPage) {
- return;
- }
-
- pageManager.closeAllOpenedPages();
- }
-
}
diff --git a/plugins/infra/core/org.eclipse.papyrus.infra.core.sasheditor.di/custom-src/org/eclipse/papyrus/infra/core/sasheditor/di/contentprovider/commands/CloseDiagramCommand.java b/plugins/infra/core/org.eclipse.papyrus.infra.core.sasheditor.di/custom-src/org/eclipse/papyrus/infra/core/sasheditor/di/contentprovider/commands/CloseDiagramCommand.java
index 360a7076edc..a6fc28a9a8b 100644
--- a/plugins/infra/core/org.eclipse.papyrus.infra.core.sasheditor.di/custom-src/org/eclipse/papyrus/infra/core/sasheditor/di/contentprovider/commands/CloseDiagramCommand.java
+++ b/plugins/infra/core/org.eclipse.papyrus.infra.core.sasheditor.di/custom-src/org/eclipse/papyrus/infra/core/sasheditor/di/contentprovider/commands/CloseDiagramCommand.java
@@ -3,12 +3,8 @@ package org.eclipse.papyrus.infra.core.sasheditor.di.contentprovider.commands;
import org.eclipse.core.commands.AbstractHandler;
import org.eclipse.core.commands.ExecutionEvent;
import org.eclipse.core.commands.ExecutionException;
-import org.eclipse.papyrus.infra.core.sasheditor.contentprovider.IPageManager;
-import org.eclipse.papyrus.infra.core.sasheditor.editor.ISashWindowsContainer;
+import org.eclipse.papyrus.infra.core.sasheditor.di.contentprovider.utils.IPageUtils;
import org.eclipse.papyrus.infra.core.sasheditor.internal.SashWindowsContainer;
-import org.eclipse.papyrus.infra.core.sashwindows.di.PageRef;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.handlers.HandlerUtil;
/**
* A command to be used with the Eclipse Commands Framework.
@@ -25,7 +21,7 @@ public class CloseDiagramCommand extends AbstractHandler {
*/
@Override
public void setEnabled(Object evaluationContext) {
- // System.out.println("call to CloseDiagramCommand.setEnable(" + evaluationContext + ")");
+ setBaseEnabled(IPageUtils.canClose(new PageContext(evaluationContext).currentPage));
}
/**
@@ -34,22 +30,10 @@ public class CloseDiagramCommand extends AbstractHandler {
*/
@Override
public Object execute(ExecutionEvent event) throws ExecutionException {
+ PageContext context = new PageContext(event);
- try {
- IEditorPart part = HandlerUtil.getActiveEditor(event);
- IPageManager pageManager = (IPageManager) part.getAdapter(IPageManager.class);
- ISashWindowsContainer container = (ISashWindowsContainer) part.getAdapter(ISashWindowsContainer.class);
- Object pageIdentifier = container.getActiveSashWindowsPage().getRawModel();
- // FIXME Bug from sash Di to be corrected
- if (pageIdentifier instanceof PageRef) {
- pageIdentifier = ((PageRef) pageIdentifier).getPageIdentifier();
- }
-
- pageManager.closePage(pageIdentifier);
-
- } catch (NullPointerException e) {
- // PageMngr can't be found
- return null;
+ if (context.isValid() && IPageUtils.canClose(context.currentPage)) {
+ context.pageManager.closePage(context.currentPageIdentifier);
}
return null;
diff --git a/plugins/infra/core/org.eclipse.papyrus.infra.core.sasheditor.di/custom-src/org/eclipse/papyrus/infra/core/sasheditor/di/contentprovider/commands/CloseOtherDiagramsCommand.java b/plugins/infra/core/org.eclipse.papyrus.infra.core.sasheditor.di/custom-src/org/eclipse/papyrus/infra/core/sasheditor/di/contentprovider/commands/CloseOtherDiagramsCommand.java
index 4e7361ed378..9b3ead1b029 100644
--- a/plugins/infra/core/org.eclipse.papyrus.infra.core.sasheditor.di/custom-src/org/eclipse/papyrus/infra/core/sasheditor/di/contentprovider/commands/CloseOtherDiagramsCommand.java
+++ b/plugins/infra/core/org.eclipse.papyrus.infra.core.sasheditor.di/custom-src/org/eclipse/papyrus/infra/core/sasheditor/di/contentprovider/commands/CloseOtherDiagramsCommand.java
@@ -3,12 +3,7 @@ package org.eclipse.papyrus.infra.core.sasheditor.di.contentprovider.commands;
import org.eclipse.core.commands.AbstractHandler;
import org.eclipse.core.commands.ExecutionEvent;
import org.eclipse.core.commands.ExecutionException;
-import org.eclipse.papyrus.infra.core.sasheditor.contentprovider.IPageManager;
-import org.eclipse.papyrus.infra.core.sasheditor.editor.ISashWindowsContainer;
import org.eclipse.papyrus.infra.core.sasheditor.internal.SashWindowsContainer;
-import org.eclipse.papyrus.infra.core.sashwindows.di.PageRef;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.handlers.HandlerUtil;
/**
* A command to be used with the Eclipse Commands Framework.
@@ -25,7 +20,7 @@ public class CloseOtherDiagramsCommand extends AbstractHandler {
*/
@Override
public void setEnabled(Object evaluationContext) {
- // System.out.println("call to CloseDiagramCommand.setEnable(" + evaluationContext + ")");
+ setBaseEnabled(new PageContext(evaluationContext).getOpenPageCount() > 1);
}
/**
@@ -34,47 +29,13 @@ public class CloseOtherDiagramsCommand extends AbstractHandler {
*/
@Override
public Object execute(ExecutionEvent event) throws ExecutionException {
+ PageContext context = new PageContext(event);
- try {
- IEditorPart part = HandlerUtil.getActiveEditor(event);
- IPageManager pageManager = (IPageManager) part.getAdapter(IPageManager.class);
- ISashWindowsContainer container = (ISashWindowsContainer) part.getAdapter(ISashWindowsContainer.class);
- Object pageIdentifier = container.getActiveSashWindowsPage().getRawModel();
- // FIXME Bug from sash Di to be corrected
- if (pageIdentifier instanceof PageRef) {
- pageIdentifier = ((PageRef) pageIdentifier).getPageIdentifier();
- }
- execute(pageManager, pageIdentifier);
-
- } catch (NullPointerException e) {
- // PageMngr can't be found
- return null;
+ if (context.isValid() && (context.getOpenPageCount() > 1)) {
+ context.pageManager.closeOtherPages(context.currentPageIdentifier);
}
-
-
return null;
}
- /**
- * Close selected page.
- *
- * @param pageManager
- */
- public void execute(final IPageManager pageManager, final Object pageIdentifier) {
- boolean atLeastOneDifferentPageOpen = false;
- for (Object page : pageManager.allPages()) {
- if (page != pageIdentifier && pageManager.isOpen(page)) {
- atLeastOneDifferentPageOpen = true;
- break;
- }
- }
-
- if (!atLeastOneDifferentPageOpen) {
- return; // Nothing to do
- }
-
- pageManager.closeOtherPages(pageIdentifier);
- }
-
}
diff --git a/plugins/infra/core/org.eclipse.papyrus.infra.core.sasheditor.di/custom-src/org/eclipse/papyrus/infra/core/sasheditor/di/contentprovider/commands/PageContext.java b/plugins/infra/core/org.eclipse.papyrus.infra.core.sasheditor.di/custom-src/org/eclipse/papyrus/infra/core/sasheditor/di/contentprovider/commands/PageContext.java
new file mode 100644
index 00000000000..e64c3890932
--- /dev/null
+++ b/plugins/infra/core/org.eclipse.papyrus.infra.core.sasheditor.di/custom-src/org/eclipse/papyrus/infra/core/sasheditor/di/contentprovider/commands/PageContext.java
@@ -0,0 +1,98 @@
+/*****************************************************************************
+ * Copyright (c) 2015 Christian W. Damus and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Christian W. Damus - Initial API and implementation
+ *
+ *****************************************************************************/
+
+package org.eclipse.papyrus.infra.core.sasheditor.di.contentprovider.commands;
+
+import java.util.Collection;
+import java.util.Collections;
+
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.papyrus.infra.core.sasheditor.contentprovider.IPageManager;
+import org.eclipse.papyrus.infra.core.sasheditor.di.contentprovider.utils.IPageUtils;
+import org.eclipse.papyrus.infra.core.sasheditor.editor.IComponentPage;
+import org.eclipse.papyrus.infra.core.sasheditor.editor.IEditorPage;
+import org.eclipse.papyrus.infra.core.sasheditor.editor.IPage;
+import org.eclipse.papyrus.infra.core.sasheditor.editor.IPageVisitor;
+import org.eclipse.papyrus.infra.core.sasheditor.editor.ISashWindowsContainer;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.ISources;
+import org.eclipse.ui.handlers.HandlerUtil;
+
+/**
+ * A convenient aggregation of objects needed for processing page management commands
+ * in the context of the Papyrus multi-diagram editor.
+ */
+class PageContext {
+ final IEditorPart editor;
+ final IPageManager pageManager;
+ final ISashWindowsContainer sashContainer;
+ final Object currentPageIdentifier;
+ final IPage currentPage;
+
+ PageContext(ExecutionEvent event) {
+ this(HandlerUtil.getActiveEditor(event));
+ }
+
+ PageContext(Object evaluationContext) {
+ this((IEditorPart) HandlerUtil.getVariable(evaluationContext, ISources.ACTIVE_EDITOR_NAME));
+ }
+
+ PageContext(IEditorPart activeEditor) {
+ super();
+
+ editor = activeEditor;
+ sashContainer = (activeEditor == null) ? null : activeEditor.getAdapter(ISashWindowsContainer.class);
+
+ if ((sashContainer == null) || sashContainer.isDisposed()) {
+ pageManager = null;
+ currentPage = null;
+ currentPageIdentifier = null;
+ } else {
+ pageManager = activeEditor.getAdapter(IPageManager.class);
+ currentPage = sashContainer.getActiveSashWindowsPage();
+ currentPageIdentifier = (currentPage == null) ? null : IPageUtils.getRawModel(currentPage);
+ }
+ }
+
+ boolean isValid() {
+ return (pageManager != null) && (currentPageIdentifier != null) && (sashContainer != null);
+ }
+
+ int getOpenPageCount() {
+ return getOpenPages().size();
+ }
+
+ Collection<IPage> getOpenPages() {
+ Collection<IPage> result;
+
+ if (!isValid()) {
+ result = Collections.emptyList();
+ } else {
+ result = new java.util.ArrayList<>();
+ sashContainer.visit(new IPageVisitor() {
+
+ @Override
+ public void accept(IEditorPage page) {
+ result.add(page);
+ }
+
+ @Override
+ public void accept(IComponentPage page) {
+ result.add(page);
+ }
+ });
+ }
+
+ return result;
+ }
+}
diff --git a/plugins/infra/core/org.eclipse.papyrus.infra.core.sasheditor.di/custom-src/org/eclipse/papyrus/infra/core/sasheditor/di/contentprovider/utils/IPageUtils.java b/plugins/infra/core/org.eclipse.papyrus.infra.core.sasheditor.di/custom-src/org/eclipse/papyrus/infra/core/sasheditor/di/contentprovider/utils/IPageUtils.java
index b0e607df076..cac86d97047 100644
--- a/plugins/infra/core/org.eclipse.papyrus.infra.core.sasheditor.di/custom-src/org/eclipse/papyrus/infra/core/sasheditor/di/contentprovider/utils/IPageUtils.java
+++ b/plugins/infra/core/org.eclipse.papyrus.infra.core.sasheditor.di/custom-src/org/eclipse/papyrus/infra/core/sasheditor/di/contentprovider/utils/IPageUtils.java
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (c) 2010, 2014 LIFL, CEA LIST, and others.
+ * Copyright (c) 2010, 2015 LIFL, CEA LIST, Christian W. Damus, and others.
*
*
* All rights reserved. This program and the accompanying materials
@@ -10,6 +10,7 @@
* Contributors:
* Cedric Dumoulin (LIFL) cedric.dumoulin@lifl.fr - Initial API and implementation
* Christian W. Damus (CEA) - bug 433371
+ * Christian W. Damus - bug 469188
*
*****************************************************************************/
@@ -18,6 +19,7 @@ package org.eclipse.papyrus.infra.core.sasheditor.di.contentprovider.utils;
import java.util.HashMap;
import java.util.Map;
+import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.emf.common.command.Command;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.transaction.RecordingCommand;
@@ -25,6 +27,7 @@ import org.eclipse.emf.transaction.TransactionalEditingDomain;
import org.eclipse.papyrus.infra.core.sasheditor.contentprovider.IPageManager;
import org.eclipse.papyrus.infra.core.sasheditor.di.contentprovider.internal.PageManagerImpl;
import org.eclipse.papyrus.infra.core.sasheditor.di.contentprovider.internal.PageManagerImpl.SashModelOperation;
+import org.eclipse.papyrus.infra.core.sasheditor.editor.ICloseablePart;
import org.eclipse.papyrus.infra.core.sasheditor.editor.IPage;
import org.eclipse.papyrus.infra.core.sasheditor.editor.ISashWindowsContainer;
import org.eclipse.papyrus.infra.core.sashwindows.di.PageRef;
@@ -57,8 +60,7 @@ public class IPageUtils {
Object pageModel = page.getRawModel();
// Get the real model because of bug
- if (pageModel instanceof PageRef)
- {
+ if (pageModel instanceof PageRef) {
return ((PageRef) pageModel).getPageIdentifier();
}
// do not use trick
@@ -164,4 +166,19 @@ public class IPageUtils {
throw new IllegalAccessError(e.getLocalizedMessage());
}
}
+
+ /**
+ * Queries whether the user should be permitted to close a {@code page}.
+ *
+ * @param page
+ * a page
+ * @return whether it can be closed
+ */
+ public static boolean canClose(IPage page) {
+ ICloseablePart closeable = (page instanceof IAdaptable)
+ ? ((IAdaptable) page).getAdapter(ICloseablePart.class)
+ : null;
+
+ return (closeable == null) || closeable.canClose();
+ }
}
diff --git a/plugins/infra/core/org.eclipse.papyrus.infra.core.sasheditor.di/model/di.ecore b/plugins/infra/core/org.eclipse.papyrus.infra.core.sasheditor.di/model/di.ecore
index 1b572ac2299..42cbafe650a 100644
--- a/plugins/infra/core/org.eclipse.papyrus.infra.core.sasheditor.di/model/di.ecore
+++ b/plugins/infra/core/org.eclipse.papyrus.infra.core.sasheditor.di/model/di.ecore
@@ -76,6 +76,8 @@
upperBound="-1" eType="#//Window" containment="true"/>
<eStructuralFeatures xsi:type="ecore:EReference" name="currentSelection" ordered="false"
unique="false" lowerBound="1" eType="#//TabFolder"/>
+ <eStructuralFeatures xsi:type="ecore:EAttribute" name="restoreActivePage" ordered="false"
+ lowerBound="1" eType="#//boolean"/>
</eClassifiers>
<eClassifiers xsi:type="ecore:EClass" name="Window" eSuperTypes="#//PanelParent">
<eStructuralFeatures xsi:type="ecore:EReference" name="position" ordered="false"
@@ -143,6 +145,10 @@
</eOperations>
<eStructuralFeatures xsi:type="ecore:EReference" name="children" ordered="false"
upperBound="-1" eType="#//PageRef" containment="true" eOpposite="#//PageRef/parent"/>
+ <eStructuralFeatures xsi:type="ecore:EReference" name="currentSelection" ordered="false"
+ eType="#//PageRef">
+ <eAnnotations source="subsets" references="#//TabFolder/children"/>
+ </eStructuralFeatures>
</eClassifiers>
<eClassifiers xsi:type="ecore:EClass" name="PageRef">
<eOperations name="isForIdentifier" ordered="false" lowerBound="1" eType="#//boolean">
diff --git a/plugins/infra/core/org.eclipse.papyrus.infra.core.sasheditor.di/model/sashwindowsdi.genmodel b/plugins/infra/core/org.eclipse.papyrus.infra.core.sasheditor.di/model/sashwindowsdi.genmodel
index 2b4d21d3967..1673dbb947d 100644
--- a/plugins/infra/core/org.eclipse.papyrus.infra.core.sasheditor.di/model/sashwindowsdi.genmodel
+++ b/plugins/infra/core/org.eclipse.papyrus.infra.core.sasheditor.di/model/sashwindowsdi.genmodel
@@ -3,21 +3,22 @@
xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" xmlns:genmodel="http://www.eclipse.org/uml2/2.2.0/GenModel"
modelDirectory="/org.eclipse.papyrus.infra.core.sasheditor.di/src"
modelPluginID="org.eclipse.papyrus.infra.core.sasheditor.di" modelName="Sashwindowsdi"
- importerID="org.eclipse.uml2.uml.ecore.importer" complianceLevel="5.0" copyrightFields="false"
- usedGenPackages="platform:/plugin/org.eclipse.emf.ecore/model/Ecore.genmodel#//ecore ../../org.eclipse.uml2.types/model/Types.genmodel#//types">
+ codeFormatting="true" commentFormatting="true" importerID="org.eclipse.uml2.uml.ecore.importer"
+ complianceLevel="5.0" copyrightFields="false" usedGenPackages="platform:/plugin/org.eclipse.emf.ecore/model/Ecore.genmodel#//ecore ../../org.eclipse.uml2.types/model/Types.genmodel#//types"
+ cleanup="true">
<genAnnotations source="http://www.eclipse.org/emf/2002/GenModel/importer/org.eclipse.uml2.uml.ecore.importer">
<details key="ECORE_TAGGED_VALUES" value="PROCESS"/>
- <details key="UNION_PROPERTIES" value="REPORT"/>
+ <details key="UNION_PROPERTIES" value="PROCESS"/>
<details key="DUPLICATE_FEATURES" value="DISCARD"/>
- <details key="SUBSETTING_PROPERTIES" value="REPORT"/>
+ <details key="SUBSETTING_PROPERTIES" value="PROCESS"/>
<details key="COMMENTS" value="PROCESS"/>
<details key="DUPLICATE_FEATURE_INHERITANCE" value="DISCARD"/>
<details key="DUPLICATE_OPERATIONS" value="DISCARD"/>
<details key="INVARIANT_CONSTRAINTS" value="PROCESS"/>
- <details key="REDEFINING_PROPERTIES" value="REPORT"/>
+ <details key="REDEFINING_PROPERTIES" value="PROCESS"/>
<details key="ANNOTATION_DETAILS" value="PROCESS"/>
<details key="DUPLICATE_OPERATION_INHERITANCE" value="DISCARD"/>
- <details key="REDEFINING_OPERATIONS" value="REPORT"/>
+ <details key="REDEFINING_OPERATIONS" value="PROCESS"/>
<details key="DERIVED_FEATURES" value="PROCESS"/>
<details key="OPERATION_BODIES" value="IGNORE"/>
<details key="CAMEL_CASE_NAMES" value="IGNORE"/>
@@ -41,6 +42,7 @@
createChild="true" ecoreFeature="ecore:EReference di.ecore#//SashModel/windows"/>
<genFeatures xsi:type="genmodel:GenFeature" notify="false" createChild="false"
propertySortChoices="true" ecoreFeature="ecore:EReference di.ecore#//SashModel/currentSelection"/>
+ <genFeatures xsi:type="genmodel:GenFeature" createChild="false" ecoreFeature="ecore:EAttribute di.ecore#//SashModel/restoreActivePage"/>
<genOperations xsi:type="genmodel:GenOperation" ecoreOperation="di.ecore#//SashModel/addPage">
<genParameters xsi:type="genmodel:GenParameter" ecoreParameter="di.ecore#//SashModel/addPage/pageIdentifier"/>
</genOperations>
@@ -121,6 +123,8 @@
<genClasses xsi:type="genmodel:GenClass" ecoreClass="di.ecore#//TabFolder">
<genFeatures xsi:type="genmodel:GenFeature" property="None" children="true"
createChild="true" ecoreFeature="ecore:EReference di.ecore#//TabFolder/children"/>
+ <genFeatures xsi:type="genmodel:GenFeature" createChild="true" propertySortChoices="true"
+ ecoreFeature="ecore:EReference di.ecore#//TabFolder/currentSelection"/>
<genOperations xsi:type="genmodel:GenOperation" ecoreOperation="di.ecore#//TabFolder/movePage">
<genParameters xsi:type="genmodel:GenParameter" ecoreParameter="di.ecore#//TabFolder/movePage/oldIndex"/>
<genParameters xsi:type="genmodel:GenParameter" ecoreParameter="di.ecore#//TabFolder/movePage/newIndex"/>
diff --git a/plugins/infra/core/org.eclipse.papyrus.infra.core.sasheditor.di/model/sashwindowsdi.notation b/plugins/infra/core/org.eclipse.papyrus.infra.core.sasheditor.di/model/sashwindowsdi.notation
index 54eb7fe90d0..a2058c1d7fc 100644
--- a/plugins/infra/core/org.eclipse.papyrus.infra.core.sasheditor.di/model/sashwindowsdi.notation
+++ b/plugins/infra/core/org.eclipse.papyrus.infra.core.sasheditor.di/model/sashwindowsdi.notation
@@ -1,1191 +1,1256 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<xmi:XMI xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" xmlns:notation="http://www.eclipse.org/gmf/runtime/1.0.2/notation" xmlns:uml="http://www.eclipse.org/uml2/5.0.0/UML">
- <notation:Diagram xmi:id="_xRNpEGyFEeKx9Kegn5X27A" type="PapyrusUMLClassDiagram" name="overview" measurementUnit="Pixel">
- <children xmi:type="notation:Shape" xmi:id="_z0HqsGyFEeKx9Kegn5X27A" type="2008" fontName="Segoe UI" lineColor="0">
- <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_z0RbsGyFEeKx9Kegn5X27A" source="ShadowFigure">
- <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_z0RbsWyFEeKx9Kegn5X27A" key="ShadowFigure_Value" value="false"/>
- </eAnnotations>
- <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_z0RbsmyFEeKx9Kegn5X27A" source="displayNameLabelIcon">
- <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_z0Rbs2yFEeKx9Kegn5X27A" key="displayNameLabelIcon_value" value="false"/>
- </eAnnotations>
- <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_z0RbtGyFEeKx9Kegn5X27A" source="QualifiedName">
- <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_z0RbtWyFEeKx9Kegn5X27A" key="QualifiedNameDepth" value="1000"/>
- </eAnnotations>
- <children xmi:type="notation:DecorationNode" xmi:id="_z0RbtmyFEeKx9Kegn5X27A" type="5029"/>
- <children xmi:type="notation:BasicCompartment" xmi:id="_z0Rbt2yFEeKx9Kegn5X27A" type="7017">
- <styles xmi:type="notation:TitleStyle" xmi:id="_z0RbuGyFEeKx9Kegn5X27A"/>
- <styles xmi:type="notation:SortingStyle" xmi:id="_z0RbuWyFEeKx9Kegn5X27A"/>
- <styles xmi:type="notation:FilteringStyle" xmi:id="_z0RbumyFEeKx9Kegn5X27A"/>
- <layoutConstraint xmi:type="notation:Bounds" xmi:id="_z0Rbu2yFEeKx9Kegn5X27A"/>
- </children>
- <children xmi:type="notation:BasicCompartment" xmi:id="_z0RbvGyFEeKx9Kegn5X27A" type="7018">
- <styles xmi:type="notation:TitleStyle" xmi:id="_z0RbvWyFEeKx9Kegn5X27A"/>
- <styles xmi:type="notation:SortingStyle" xmi:id="_z0RbvmyFEeKx9Kegn5X27A"/>
- <styles xmi:type="notation:FilteringStyle" xmi:id="_z0Rbv2yFEeKx9Kegn5X27A"/>
- <layoutConstraint xmi:type="notation:Bounds" xmi:id="_z0RbwGyFEeKx9Kegn5X27A"/>
- </children>
- <children xmi:type="notation:BasicCompartment" xmi:id="_z0RbwWyFEeKx9Kegn5X27A" type="7019">
- <styles xmi:type="notation:TitleStyle" xmi:id="_z0RbwmyFEeKx9Kegn5X27A"/>
- <styles xmi:type="notation:SortingStyle" xmi:id="_z0Rbw2yFEeKx9Kegn5X27A"/>
- <styles xmi:type="notation:FilteringStyle" xmi:id="_z0RbxGyFEeKx9Kegn5X27A"/>
- <layoutConstraint xmi:type="notation:Bounds" xmi:id="_z0RbxWyFEeKx9Kegn5X27A"/>
- </children>
- <children xmi:type="notation:DecorationNode" xmi:id="_Dd9EgFViEeWe8LyZrqaAug" type="8510">
- <layoutConstraint xmi:type="notation:Location" xmi:id="_Dd9EgVViEeWe8LyZrqaAug" y="5"/>
- </children>
- <element xmi:type="uml:Class" href="sashwindowsdi.uml#_Xa5wIEJVEd6kIY39uis5Uw"/>
- <layoutConstraint xmi:type="notation:Bounds" xmi:id="_z0HqsWyFEeKx9Kegn5X27A" x="498" y="216"/>
- </children>
- <children xmi:type="notation:Shape" xmi:id="_z1T9gGyFEeKx9Kegn5X27A" type="2008" fontName="Segoe UI" lineColor="0">
- <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_z1T9gmyFEeKx9Kegn5X27A" source="ShadowFigure">
- <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_z1T9g2yFEeKx9Kegn5X27A" key="ShadowFigure_Value" value="false"/>
- </eAnnotations>
- <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_z1T9hGyFEeKx9Kegn5X27A" source="displayNameLabelIcon">
- <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_z1T9hWyFEeKx9Kegn5X27A" key="displayNameLabelIcon_value" value="false"/>
- </eAnnotations>
- <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_z1T9hmyFEeKx9Kegn5X27A" source="QualifiedName">
- <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_z1T9h2yFEeKx9Kegn5X27A" key="QualifiedNameDepth" value="1000"/>
- </eAnnotations>
- <children xmi:type="notation:DecorationNode" xmi:id="_z1T9iGyFEeKx9Kegn5X27A" type="5029"/>
- <children xmi:type="notation:BasicCompartment" xmi:id="_z1T9iWyFEeKx9Kegn5X27A" type="7017">
- <styles xmi:type="notation:TitleStyle" xmi:id="_z1T9imyFEeKx9Kegn5X27A"/>
- <styles xmi:type="notation:SortingStyle" xmi:id="_z1T9i2yFEeKx9Kegn5X27A"/>
- <styles xmi:type="notation:FilteringStyle" xmi:id="_z1T9jGyFEeKx9Kegn5X27A"/>
- <layoutConstraint xmi:type="notation:Bounds" xmi:id="_z1T9jWyFEeKx9Kegn5X27A"/>
- </children>
- <children xmi:type="notation:BasicCompartment" xmi:id="_z1T9jmyFEeKx9Kegn5X27A" type="7018">
- <styles xmi:type="notation:TitleStyle" xmi:id="_z1T9j2yFEeKx9Kegn5X27A"/>
- <styles xmi:type="notation:SortingStyle" xmi:id="_z1T9kGyFEeKx9Kegn5X27A"/>
- <styles xmi:type="notation:FilteringStyle" xmi:id="_z1T9kWyFEeKx9Kegn5X27A"/>
- <layoutConstraint xmi:type="notation:Bounds" xmi:id="_z1T9kmyFEeKx9Kegn5X27A"/>
- </children>
- <children xmi:type="notation:BasicCompartment" xmi:id="_z1T9k2yFEeKx9Kegn5X27A" type="7019">
- <styles xmi:type="notation:TitleStyle" xmi:id="_z1T9lGyFEeKx9Kegn5X27A"/>
- <styles xmi:type="notation:SortingStyle" xmi:id="_z1T9lWyFEeKx9Kegn5X27A"/>
- <styles xmi:type="notation:FilteringStyle" xmi:id="_z1T9lmyFEeKx9Kegn5X27A"/>
- <layoutConstraint xmi:type="notation:Bounds" xmi:id="_z1T9l2yFEeKx9Kegn5X27A"/>
- </children>
- <children xmi:type="notation:DecorationNode" xmi:id="_Dd9EglViEeWe8LyZrqaAug" type="8510">
- <layoutConstraint xmi:type="notation:Location" xmi:id="_Dd9Eg1ViEeWe8LyZrqaAug" y="5"/>
- </children>
- <element xmi:type="uml:Class" href="sashwindowsdi.uml#_UiIMMEJVEd6kIY39uis5Uw"/>
- <layoutConstraint xmi:type="notation:Bounds" xmi:id="_z1T9gWyFEeKx9Kegn5X27A" x="276" y="216"/>
- </children>
- <children xmi:type="notation:Shape" xmi:id="_4bTRMGyFEeKx9Kegn5X27A" type="2008" fontName="Segoe UI" lineColor="0">
- <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_4bTRMmyFEeKx9Kegn5X27A" source="ShadowFigure">
- <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_4bTRM2yFEeKx9Kegn5X27A" key="ShadowFigure_Value" value="false"/>
- </eAnnotations>
- <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_4bcbIGyFEeKx9Kegn5X27A" source="displayNameLabelIcon">
- <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_4bcbIWyFEeKx9Kegn5X27A" key="displayNameLabelIcon_value" value="false"/>
- </eAnnotations>
- <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_4bcbImyFEeKx9Kegn5X27A" source="QualifiedName">
- <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_4bcbI2yFEeKx9Kegn5X27A" key="QualifiedNameDepth" value="1000"/>
- </eAnnotations>
- <children xmi:type="notation:DecorationNode" xmi:id="_4bcbJGyFEeKx9Kegn5X27A" type="5029"/>
- <children xmi:type="notation:BasicCompartment" xmi:id="_4bcbJWyFEeKx9Kegn5X27A" type="7017">
- <styles xmi:type="notation:TitleStyle" xmi:id="_4bcbJmyFEeKx9Kegn5X27A"/>
- <styles xmi:type="notation:SortingStyle" xmi:id="_4bcbJ2yFEeKx9Kegn5X27A"/>
- <styles xmi:type="notation:FilteringStyle" xmi:id="_4bcbKGyFEeKx9Kegn5X27A"/>
- <layoutConstraint xmi:type="notation:Bounds" xmi:id="_4bcbKWyFEeKx9Kegn5X27A"/>
- </children>
- <children xmi:type="notation:BasicCompartment" xmi:id="_4bcbKmyFEeKx9Kegn5X27A" type="7018">
- <styles xmi:type="notation:TitleStyle" xmi:id="_4bcbK2yFEeKx9Kegn5X27A"/>
- <styles xmi:type="notation:SortingStyle" xmi:id="_4bcbLGyFEeKx9Kegn5X27A"/>
- <styles xmi:type="notation:FilteringStyle" xmi:id="_4bcbLWyFEeKx9Kegn5X27A"/>
- <layoutConstraint xmi:type="notation:Bounds" xmi:id="_4bcbLmyFEeKx9Kegn5X27A"/>
- </children>
- <children xmi:type="notation:BasicCompartment" xmi:id="_4bcbL2yFEeKx9Kegn5X27A" type="7019">
- <styles xmi:type="notation:TitleStyle" xmi:id="_4bcbMGyFEeKx9Kegn5X27A"/>
- <styles xmi:type="notation:SortingStyle" xmi:id="_4bcbMWyFEeKx9Kegn5X27A"/>
- <styles xmi:type="notation:FilteringStyle" xmi:id="_4bcbMmyFEeKx9Kegn5X27A"/>
- <layoutConstraint xmi:type="notation:Bounds" xmi:id="_4bcbM2yFEeKx9Kegn5X27A"/>
- </children>
- <children xmi:type="notation:DecorationNode" xmi:id="_Dd9EhFViEeWe8LyZrqaAug" type="8510">
- <layoutConstraint xmi:type="notation:Location" xmi:id="_Dd9EhVViEeWe8LyZrqaAug" y="5"/>
- </children>
- <element xmi:type="uml:Class" href="sashwindowsdi.uml#_fbWYgEJVEd6kIY39uis5Uw"/>
- <layoutConstraint xmi:type="notation:Bounds" xmi:id="_4bTRMWyFEeKx9Kegn5X27A" x="936" y="222"/>
- </children>
- <children xmi:type="notation:Shape" xmi:id="_6BzU8GyFEeKx9Kegn5X27A" type="2008" fontName="Segoe UI" lineColor="0">
- <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_6BzU8myFEeKx9Kegn5X27A" source="ShadowFigure">
- <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_6BzU82yFEeKx9Kegn5X27A" key="ShadowFigure_Value" value="false"/>
- </eAnnotations>
- <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_6BzU9GyFEeKx9Kegn5X27A" source="displayNameLabelIcon">
- <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_6BzU9WyFEeKx9Kegn5X27A" key="displayNameLabelIcon_value" value="false"/>
- </eAnnotations>
- <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_6BzU9myFEeKx9Kegn5X27A" source="QualifiedName">
- <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_6BzU92yFEeKx9Kegn5X27A" key="QualifiedNameDepth" value="1000"/>
- </eAnnotations>
- <children xmi:type="notation:DecorationNode" xmi:id="_6BzU-GyFEeKx9Kegn5X27A" type="5029"/>
- <children xmi:type="notation:BasicCompartment" xmi:id="_6BzU-WyFEeKx9Kegn5X27A" type="7017">
- <styles xmi:type="notation:TitleStyle" xmi:id="_6BzU-myFEeKx9Kegn5X27A"/>
- <styles xmi:type="notation:SortingStyle" xmi:id="_6BzU-2yFEeKx9Kegn5X27A"/>
- <styles xmi:type="notation:FilteringStyle" xmi:id="_6BzU_GyFEeKx9Kegn5X27A"/>
- <layoutConstraint xmi:type="notation:Bounds" xmi:id="_6BzU_WyFEeKx9Kegn5X27A"/>
- </children>
- <children xmi:type="notation:BasicCompartment" xmi:id="_6BzU_myFEeKx9Kegn5X27A" type="7018">
- <styles xmi:type="notation:TitleStyle" xmi:id="_6BzU_2yFEeKx9Kegn5X27A"/>
- <styles xmi:type="notation:SortingStyle" xmi:id="_6BzVAGyFEeKx9Kegn5X27A"/>
- <styles xmi:type="notation:FilteringStyle" xmi:id="_6BzVAWyFEeKx9Kegn5X27A"/>
- <layoutConstraint xmi:type="notation:Bounds" xmi:id="_6BzVAmyFEeKx9Kegn5X27A"/>
- </children>
- <children xmi:type="notation:BasicCompartment" xmi:id="_6BzVA2yFEeKx9Kegn5X27A" type="7019">
- <styles xmi:type="notation:TitleStyle" xmi:id="_6BzVBGyFEeKx9Kegn5X27A"/>
- <styles xmi:type="notation:SortingStyle" xmi:id="_6BzVBWyFEeKx9Kegn5X27A"/>
- <styles xmi:type="notation:FilteringStyle" xmi:id="_6BzVBmyFEeKx9Kegn5X27A"/>
- <layoutConstraint xmi:type="notation:Bounds" xmi:id="_6BzVB2yFEeKx9Kegn5X27A"/>
- </children>
- <children xmi:type="notation:DecorationNode" xmi:id="_Dd9EhlViEeWe8LyZrqaAug" type="8510">
- <layoutConstraint xmi:type="notation:Location" xmi:id="_Dd9Eh1ViEeWe8LyZrqaAug" y="5"/>
- </children>
- <element xmi:type="uml:Class" href="sashwindowsdi.uml#_Zx2ZYEJVEd6kIY39uis5Uw"/>
- <layoutConstraint xmi:type="notation:Bounds" xmi:id="_6BzU8WyFEeKx9Kegn5X27A" x="936" y="48"/>
- </children>
- <children xmi:type="notation:Shape" xmi:id="_6Ci70GyFEeKx9Kegn5X27A" type="2008" fontName="Segoe UI" lineColor="0">
- <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_6Ci70myFEeKx9Kegn5X27A" source="ShadowFigure">
- <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_6Ci702yFEeKx9Kegn5X27A" key="ShadowFigure_Value" value="false"/>
- </eAnnotations>
- <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_6Ci71GyFEeKx9Kegn5X27A" source="displayNameLabelIcon">
- <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_6Ci71WyFEeKx9Kegn5X27A" key="displayNameLabelIcon_value" value="false"/>
- </eAnnotations>
- <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_6Ci71myFEeKx9Kegn5X27A" source="QualifiedName">
- <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_6Ci712yFEeKx9Kegn5X27A" key="QualifiedNameDepth" value="1000"/>
- </eAnnotations>
- <children xmi:type="notation:DecorationNode" xmi:id="_6Ci72GyFEeKx9Kegn5X27A" type="5029"/>
- <children xmi:type="notation:BasicCompartment" xmi:id="_6Ci72WyFEeKx9Kegn5X27A" type="7017">
- <styles xmi:type="notation:TitleStyle" xmi:id="_6Ci72myFEeKx9Kegn5X27A"/>
- <styles xmi:type="notation:SortingStyle" xmi:id="_6Ci722yFEeKx9Kegn5X27A"/>
- <styles xmi:type="notation:FilteringStyle" xmi:id="_6Ci73GyFEeKx9Kegn5X27A"/>
- <layoutConstraint xmi:type="notation:Bounds" xmi:id="_6Ci73WyFEeKx9Kegn5X27A"/>
- </children>
- <children xmi:type="notation:BasicCompartment" xmi:id="_6Ci73myFEeKx9Kegn5X27A" type="7018">
- <styles xmi:type="notation:TitleStyle" xmi:id="_6Ci732yFEeKx9Kegn5X27A"/>
- <styles xmi:type="notation:SortingStyle" xmi:id="_6Ci74GyFEeKx9Kegn5X27A"/>
- <styles xmi:type="notation:FilteringStyle" xmi:id="_6Ci74WyFEeKx9Kegn5X27A"/>
- <layoutConstraint xmi:type="notation:Bounds" xmi:id="_6Ci74myFEeKx9Kegn5X27A"/>
- </children>
- <children xmi:type="notation:BasicCompartment" xmi:id="_6Ci742yFEeKx9Kegn5X27A" type="7019">
- <styles xmi:type="notation:TitleStyle" xmi:id="_6Ci75GyFEeKx9Kegn5X27A"/>
- <styles xmi:type="notation:SortingStyle" xmi:id="_6Ci75WyFEeKx9Kegn5X27A"/>
- <styles xmi:type="notation:FilteringStyle" xmi:id="_6Ci75myFEeKx9Kegn5X27A"/>
- <layoutConstraint xmi:type="notation:Bounds" xmi:id="_6Ci752yFEeKx9Kegn5X27A"/>
- </children>
- <children xmi:type="notation:DecorationNode" xmi:id="_Dd9EiFViEeWe8LyZrqaAug" type="8510">
- <layoutConstraint xmi:type="notation:Location" xmi:id="_Dd9EiVViEeWe8LyZrqaAug" y="5"/>
- </children>
- <element xmi:type="uml:Class" href="sashwindowsdi.uml#_86BAgEJWEd6kIY39uis5Uw"/>
- <layoutConstraint xmi:type="notation:Bounds" xmi:id="_6Ci70WyFEeKx9Kegn5X27A" x="726" y="48"/>
- </children>
- <children xmi:type="notation:Shape" xmi:id="_6knuIGyFEeKx9Kegn5X27A" type="2008" fontName="Segoe UI" lineColor="0">
- <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_6knuImyFEeKx9Kegn5X27A" source="ShadowFigure">
- <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_6knuI2yFEeKx9Kegn5X27A" key="ShadowFigure_Value" value="false"/>
- </eAnnotations>
- <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_6knuJGyFEeKx9Kegn5X27A" source="displayNameLabelIcon">
- <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_6knuJWyFEeKx9Kegn5X27A" key="displayNameLabelIcon_value" value="false"/>
- </eAnnotations>
- <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_6knuJmyFEeKx9Kegn5X27A" source="QualifiedName">
- <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_6knuJ2yFEeKx9Kegn5X27A" key="QualifiedNameDepth" value="1000"/>
- </eAnnotations>
- <children xmi:type="notation:DecorationNode" xmi:id="_6knuKGyFEeKx9Kegn5X27A" type="5029"/>
- <children xmi:type="notation:BasicCompartment" xmi:id="_6knuKWyFEeKx9Kegn5X27A" type="7017">
- <children xmi:type="notation:Shape" xmi:id="_RHjtwFViEeWe8LyZrqaAug" type="3012">
- <element xmi:type="uml:Property" href="sashwindowsdi.uml#_RGhL8FViEeWe8LyZrqaAug"/>
- <layoutConstraint xmi:type="notation:Location" xmi:id="_RHjtwVViEeWe8LyZrqaAug"/>
- </children>
- <styles xmi:type="notation:TitleStyle" xmi:id="_6knuKmyFEeKx9Kegn5X27A"/>
- <styles xmi:type="notation:SortingStyle" xmi:id="_6knuK2yFEeKx9Kegn5X27A"/>
- <styles xmi:type="notation:FilteringStyle" xmi:id="_6knuLGyFEeKx9Kegn5X27A"/>
- <layoutConstraint xmi:type="notation:Bounds" xmi:id="_6knuLWyFEeKx9Kegn5X27A"/>
- </children>
- <children xmi:type="notation:BasicCompartment" xmi:id="_6knuLmyFEeKx9Kegn5X27A" type="7018">
- <styles xmi:type="notation:TitleStyle" xmi:id="_6knuL2yFEeKx9Kegn5X27A"/>
- <styles xmi:type="notation:SortingStyle" xmi:id="_6knuMGyFEeKx9Kegn5X27A"/>
- <styles xmi:type="notation:FilteringStyle" xmi:id="_6knuMWyFEeKx9Kegn5X27A"/>
- <layoutConstraint xmi:type="notation:Bounds" xmi:id="_6knuMmyFEeKx9Kegn5X27A"/>
- </children>
- <children xmi:type="notation:BasicCompartment" xmi:id="_6knuM2yFEeKx9Kegn5X27A" type="7019">
- <styles xmi:type="notation:TitleStyle" xmi:id="_6knuNGyFEeKx9Kegn5X27A"/>
- <styles xmi:type="notation:SortingStyle" xmi:id="_6knuNWyFEeKx9Kegn5X27A"/>
- <styles xmi:type="notation:FilteringStyle" xmi:id="_6knuNmyFEeKx9Kegn5X27A"/>
- <layoutConstraint xmi:type="notation:Bounds" xmi:id="_6knuN2yFEeKx9Kegn5X27A"/>
- </children>
- <children xmi:type="notation:DecorationNode" xmi:id="_Dd9EilViEeWe8LyZrqaAug" type="8510">
- <layoutConstraint xmi:type="notation:Location" xmi:id="_Dd9Ei1ViEeWe8LyZrqaAug" y="5"/>
- </children>
- <element xmi:type="uml:Class" href="sashwindowsdi.uml#_h_HVwEJVEd6kIY39uis5Uw"/>
- <layoutConstraint xmi:type="notation:Bounds" xmi:id="_6knuIWyFEeKx9Kegn5X27A" x="909" y="522"/>
- </children>
- <children xmi:type="notation:Shape" xmi:id="_CZQIEGyGEeKx9Kegn5X27A" type="2008" fontName="Segoe UI" lineColor="0">
- <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_CZQIEmyGEeKx9Kegn5X27A" source="ShadowFigure">
- <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_CZQIE2yGEeKx9Kegn5X27A" key="ShadowFigure_Value" value="false"/>
- </eAnnotations>
- <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_CZQIFGyGEeKx9Kegn5X27A" source="displayNameLabelIcon">
- <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_CZQIFWyGEeKx9Kegn5X27A" key="displayNameLabelIcon_value" value="false"/>
- </eAnnotations>
- <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_CZQIFmyGEeKx9Kegn5X27A" source="QualifiedName">
- <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_CZQIF2yGEeKx9Kegn5X27A" key="QualifiedNameDepth" value="1000"/>
- </eAnnotations>
- <children xmi:type="notation:DecorationNode" xmi:id="_CZQIGGyGEeKx9Kegn5X27A" type="5029"/>
- <children xmi:type="notation:BasicCompartment" xmi:id="_CZQIGWyGEeKx9Kegn5X27A" type="7017">
- <styles xmi:type="notation:TitleStyle" xmi:id="_CZQIGmyGEeKx9Kegn5X27A"/>
- <styles xmi:type="notation:SortingStyle" xmi:id="_CZQIG2yGEeKx9Kegn5X27A"/>
- <styles xmi:type="notation:FilteringStyle" xmi:id="_CZQIHGyGEeKx9Kegn5X27A"/>
- <layoutConstraint xmi:type="notation:Bounds" xmi:id="_CZQIHWyGEeKx9Kegn5X27A"/>
- </children>
- <children xmi:type="notation:BasicCompartment" xmi:id="_CZQIHmyGEeKx9Kegn5X27A" type="7018">
- <styles xmi:type="notation:TitleStyle" xmi:id="_CZQIH2yGEeKx9Kegn5X27A"/>
- <styles xmi:type="notation:SortingStyle" xmi:id="_CZQIIGyGEeKx9Kegn5X27A"/>
- <styles xmi:type="notation:FilteringStyle" xmi:id="_CZQIIWyGEeKx9Kegn5X27A"/>
- <layoutConstraint xmi:type="notation:Bounds" xmi:id="_CZQIImyGEeKx9Kegn5X27A"/>
- </children>
- <children xmi:type="notation:BasicCompartment" xmi:id="_CZQII2yGEeKx9Kegn5X27A" type="7019">
- <styles xmi:type="notation:TitleStyle" xmi:id="_CZQIJGyGEeKx9Kegn5X27A"/>
- <styles xmi:type="notation:SortingStyle" xmi:id="_CZQIJWyGEeKx9Kegn5X27A"/>
- <styles xmi:type="notation:FilteringStyle" xmi:id="_CZQIJmyGEeKx9Kegn5X27A"/>
- <layoutConstraint xmi:type="notation:Bounds" xmi:id="_CZQIJ2yGEeKx9Kegn5X27A"/>
- </children>
- <children xmi:type="notation:DecorationNode" xmi:id="_Dd9EjFViEeWe8LyZrqaAug" type="8510">
- <layoutConstraint xmi:type="notation:Location" xmi:id="_Dd9EjVViEeWe8LyZrqaAug" y="5"/>
- </children>
- <element xmi:type="uml:Class" href="sashwindowsdi.uml#_eE7YIEJVEd6kIY39uis5Uw"/>
- <layoutConstraint xmi:type="notation:Bounds" xmi:id="_CZQIEWyGEeKx9Kegn5X27A" x="732" y="216"/>
- </children>
- <children xmi:type="notation:Shape" xmi:id="_QHBfoGyGEeKx9Kegn5X27A" type="2008" fontName="Segoe UI" lineColor="0">
- <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_QHBfomyGEeKx9Kegn5X27A" source="ShadowFigure">
- <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_QHBfo2yGEeKx9Kegn5X27A" key="ShadowFigure_Value" value="false"/>
- </eAnnotations>
- <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_QHBfpGyGEeKx9Kegn5X27A" source="displayNameLabelIcon">
- <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_QHBfpWyGEeKx9Kegn5X27A" key="displayNameLabelIcon_value" value="false"/>
- </eAnnotations>
- <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_QHBfpmyGEeKx9Kegn5X27A" source="QualifiedName">
- <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_QHBfp2yGEeKx9Kegn5X27A" key="QualifiedNameDepth" value="1000"/>
- </eAnnotations>
- <children xmi:type="notation:DecorationNode" xmi:id="_QHKpkGyGEeKx9Kegn5X27A" type="5029"/>
- <children xmi:type="notation:BasicCompartment" xmi:id="_QHKpkWyGEeKx9Kegn5X27A" type="7017">
- <styles xmi:type="notation:TitleStyle" xmi:id="_QHKpkmyGEeKx9Kegn5X27A"/>
- <styles xmi:type="notation:SortingStyle" xmi:id="_QHKpk2yGEeKx9Kegn5X27A"/>
- <styles xmi:type="notation:FilteringStyle" xmi:id="_QHKplGyGEeKx9Kegn5X27A"/>
- <layoutConstraint xmi:type="notation:Bounds" xmi:id="_QHKplWyGEeKx9Kegn5X27A"/>
- </children>
- <children xmi:type="notation:BasicCompartment" xmi:id="_QHKplmyGEeKx9Kegn5X27A" type="7018">
- <styles xmi:type="notation:TitleStyle" xmi:id="_QHKpl2yGEeKx9Kegn5X27A"/>
- <styles xmi:type="notation:SortingStyle" xmi:id="_QHKpmGyGEeKx9Kegn5X27A"/>
- <styles xmi:type="notation:FilteringStyle" xmi:id="_QHKpmWyGEeKx9Kegn5X27A"/>
- <layoutConstraint xmi:type="notation:Bounds" xmi:id="_QHKpmmyGEeKx9Kegn5X27A"/>
- </children>
- <children xmi:type="notation:BasicCompartment" xmi:id="_QHKpm2yGEeKx9Kegn5X27A" type="7019">
- <styles xmi:type="notation:TitleStyle" xmi:id="_QHKpnGyGEeKx9Kegn5X27A"/>
- <styles xmi:type="notation:SortingStyle" xmi:id="_QHKpnWyGEeKx9Kegn5X27A"/>
- <styles xmi:type="notation:FilteringStyle" xmi:id="_QHKpnmyGEeKx9Kegn5X27A"/>
- <layoutConstraint xmi:type="notation:Bounds" xmi:id="_QHKpn2yGEeKx9Kegn5X27A"/>
- </children>
- <children xmi:type="notation:DecorationNode" xmi:id="_Dd9EjlViEeWe8LyZrqaAug" type="8510">
- <layoutConstraint xmi:type="notation:Location" xmi:id="_Dd9Ej1ViEeWe8LyZrqaAug" y="5"/>
- </children>
- <element xmi:type="uml:Class" href="sashwindowsdi.uml#_b7a4cEMaEd6kIY39uis5Uw"/>
- <layoutConstraint xmi:type="notation:Bounds" xmi:id="_QHBfoWyGEeKx9Kegn5X27A" x="294" y="516"/>
- </children>
- <children xmi:type="notation:Shape" xmi:id="_eHZDEGyGEeKx9Kegn5X27A" type="2008" fontName="Segoe UI" lineColor="0">
- <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_eHZDEmyGEeKx9Kegn5X27A" source="ShadowFigure">
- <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_eHZDE2yGEeKx9Kegn5X27A" key="ShadowFigure_Value" value="false"/>
- </eAnnotations>
- <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_eHZDFGyGEeKx9Kegn5X27A" source="displayNameLabelIcon">
- <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_eHZDFWyGEeKx9Kegn5X27A" key="displayNameLabelIcon_value" value="false"/>
- </eAnnotations>
- <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_eHZDFmyGEeKx9Kegn5X27A" source="QualifiedName">
- <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_eHZDF2yGEeKx9Kegn5X27A" key="QualifiedNameDepth" value="1000"/>
- </eAnnotations>
- <children xmi:type="notation:DecorationNode" xmi:id="_eHZDGGyGEeKx9Kegn5X27A" type="5029"/>
- <children xmi:type="notation:BasicCompartment" xmi:id="_eHZDGWyGEeKx9Kegn5X27A" type="7017">
- <styles xmi:type="notation:TitleStyle" xmi:id="_eHZDGmyGEeKx9Kegn5X27A"/>
- <styles xmi:type="notation:SortingStyle" xmi:id="_eHZDG2yGEeKx9Kegn5X27A"/>
- <styles xmi:type="notation:FilteringStyle" xmi:id="_eHZDHGyGEeKx9Kegn5X27A"/>
- <layoutConstraint xmi:type="notation:Bounds" xmi:id="_eHZDHWyGEeKx9Kegn5X27A"/>
- </children>
- <children xmi:type="notation:BasicCompartment" xmi:id="_eHZDHmyGEeKx9Kegn5X27A" type="7018">
- <styles xmi:type="notation:TitleStyle" xmi:id="_eHZDH2yGEeKx9Kegn5X27A"/>
- <styles xmi:type="notation:SortingStyle" xmi:id="_eHZDIGyGEeKx9Kegn5X27A"/>
- <styles xmi:type="notation:FilteringStyle" xmi:id="_eHZDIWyGEeKx9Kegn5X27A"/>
- <layoutConstraint xmi:type="notation:Bounds" xmi:id="_eHZDImyGEeKx9Kegn5X27A"/>
- </children>
- <children xmi:type="notation:BasicCompartment" xmi:id="_eHZDI2yGEeKx9Kegn5X27A" type="7019">
- <styles xmi:type="notation:TitleStyle" xmi:id="_eHZDJGyGEeKx9Kegn5X27A"/>
- <styles xmi:type="notation:SortingStyle" xmi:id="_eHZDJWyGEeKx9Kegn5X27A"/>
- <styles xmi:type="notation:FilteringStyle" xmi:id="_eHZDJmyGEeKx9Kegn5X27A"/>
- <layoutConstraint xmi:type="notation:Bounds" xmi:id="_eHZDJ2yGEeKx9Kegn5X27A"/>
- </children>
- <children xmi:type="notation:DecorationNode" xmi:id="_Dd9EkFViEeWe8LyZrqaAug" type="8510">
- <layoutConstraint xmi:type="notation:Location" xmi:id="_Dd9EkVViEeWe8LyZrqaAug" y="5"/>
- </children>
- <element xmi:type="uml:Class" href="sashwindowsdi.uml#_-9vywEMaEd6kIY39uis5Uw"/>
- <layoutConstraint xmi:type="notation:Bounds" xmi:id="_eHZDEWyGEeKx9Kegn5X27A" x="24" y="222"/>
- </children>
- <children xmi:type="notation:Shape" xmi:id="__nlxYGyIEeKx9Kegn5X27A" type="2008" fontName="Segoe UI" lineColor="0">
- <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="__nlxYmyIEeKx9Kegn5X27A" source="ShadowFigure">
- <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="__nlxY2yIEeKx9Kegn5X27A" key="ShadowFigure_Value" value="false"/>
- </eAnnotations>
- <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="__nlxZGyIEeKx9Kegn5X27A" source="displayNameLabelIcon">
- <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="__nlxZWyIEeKx9Kegn5X27A" key="displayNameLabelIcon_value" value="false"/>
- </eAnnotations>
- <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="__nlxZmyIEeKx9Kegn5X27A" source="QualifiedName">
- <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="__nlxZ2yIEeKx9Kegn5X27A" key="QualifiedNameDepth" value="1000"/>
- </eAnnotations>
- <children xmi:type="notation:DecorationNode" xmi:id="__nlxaGyIEeKx9Kegn5X27A" type="5029"/>
- <children xmi:type="notation:BasicCompartment" xmi:id="__nlxaWyIEeKx9Kegn5X27A" type="7017">
- <styles xmi:type="notation:TitleStyle" xmi:id="__nlxamyIEeKx9Kegn5X27A"/>
- <styles xmi:type="notation:SortingStyle" xmi:id="__nlxa2yIEeKx9Kegn5X27A"/>
- <styles xmi:type="notation:FilteringStyle" xmi:id="__nlxbGyIEeKx9Kegn5X27A"/>
- <layoutConstraint xmi:type="notation:Bounds" xmi:id="__nlxbWyIEeKx9Kegn5X27A"/>
- </children>
- <children xmi:type="notation:BasicCompartment" xmi:id="__nlxbmyIEeKx9Kegn5X27A" type="7018">
- <styles xmi:type="notation:TitleStyle" xmi:id="__nlxb2yIEeKx9Kegn5X27A"/>
- <styles xmi:type="notation:SortingStyle" xmi:id="__nlxcGyIEeKx9Kegn5X27A"/>
- <styles xmi:type="notation:FilteringStyle" xmi:id="__nlxcWyIEeKx9Kegn5X27A"/>
- <layoutConstraint xmi:type="notation:Bounds" xmi:id="__nlxcmyIEeKx9Kegn5X27A"/>
- </children>
- <children xmi:type="notation:BasicCompartment" xmi:id="__nlxc2yIEeKx9Kegn5X27A" type="7019">
- <styles xmi:type="notation:TitleStyle" xmi:id="__nlxdGyIEeKx9Kegn5X27A"/>
- <styles xmi:type="notation:SortingStyle" xmi:id="__nlxdWyIEeKx9Kegn5X27A"/>
- <styles xmi:type="notation:FilteringStyle" xmi:id="__nlxdmyIEeKx9Kegn5X27A"/>
- <layoutConstraint xmi:type="notation:Bounds" xmi:id="__nlxd2yIEeKx9Kegn5X27A"/>
- </children>
- <children xmi:type="notation:DecorationNode" xmi:id="_Dd9EklViEeWe8LyZrqaAug" type="8510">
- <layoutConstraint xmi:type="notation:Location" xmi:id="_Dd9Ek1ViEeWe8LyZrqaAug" y="5"/>
- </children>
- <element xmi:type="uml:Class" href="pathmap://UML_METAMODELS/Ecore.metamodel.uml#EObject"/>
- <layoutConstraint xmi:type="notation:Bounds" xmi:id="__nlxYWyIEeKx9Kegn5X27A" x="1216" y="522"/>
- </children>
- <children xmi:type="notation:Shape" xmi:id="_D03IoFViEeWe8LyZrqaAug" type="StereotypeComment">
- <styles xmi:type="notation:TitleStyle" xmi:id="_D03IoVViEeWe8LyZrqaAug" showTitle="true"/>
- <styles xmi:type="notation:EObjectValueStyle" xmi:id="_D03Io1ViEeWe8LyZrqaAug" name="BASE_ELEMENT">
- <eObjectValue xmi:type="uml:Class" href="pathmap://UML_METAMODELS/Ecore.metamodel.uml#EObject"/>
- </styles>
- <element xsi:nil="true"/>
- <layoutConstraint xmi:type="notation:Bounds" xmi:id="_D03IolViEeWe8LyZrqaAug" x="1334" y="522"/>
- </children>
- <styles xmi:type="notation:DiagramStyle" xmi:id="_xRNpEWyFEeKx9Kegn5X27A"/>
- <styles xmi:type="notation:StringValueStyle" xmi:id="_Dd9ElFViEeWe8LyZrqaAug" name="diagram_compatibility_version" stringValue="1.1.0"/>
- <element xmi:type="uml:Model" href="sashwindowsdi.uml#_NuHhwEJVEd6kIY39uis5Uw"/>
- <edges xmi:type="notation:Connector" xmi:id="_z3ZoMGyFEeKx9Kegn5X27A" type="4001" source="_z0HqsGyFEeKx9Kegn5X27A" target="_z1T9gGyFEeKx9Kegn5X27A" lineColor="0">
- <children xmi:type="notation:DecorationNode" xmi:id="_z3iyIGyFEeKx9Kegn5X27A" type="6001">
- <layoutConstraint xmi:type="notation:Location" xmi:id="_z3iyIWyFEeKx9Kegn5X27A" y="-20"/>
- </children>
- <children xmi:type="notation:DecorationNode" xmi:id="_z3iyImyFEeKx9Kegn5X27A" visible="false" type="6002">
- <layoutConstraint xmi:type="notation:Location" xmi:id="_z3iyI2yFEeKx9Kegn5X27A" y="20"/>
- </children>
- <children xmi:type="notation:DecorationNode" xmi:id="_z3iyJGyFEeKx9Kegn5X27A" type="6003">
- <layoutConstraint xmi:type="notation:Location" xmi:id="_z3iyJWyFEeKx9Kegn5X27A" x="22" y="-20"/>
- </children>
- <children xmi:type="notation:DecorationNode" xmi:id="_z3iyJmyFEeKx9Kegn5X27A" visible="false" type="6005">
- <layoutConstraint xmi:type="notation:Location" xmi:id="_z3iyJ2yFEeKx9Kegn5X27A" y="20"/>
- </children>
- <children xmi:type="notation:DecorationNode" xmi:id="_z3iyKGyFEeKx9Kegn5X27A" type="6033">
- <layoutConstraint xmi:type="notation:Location" xmi:id="_z3iyKWyFEeKx9Kegn5X27A" y="20"/>
- </children>
- <children xmi:type="notation:DecorationNode" xmi:id="_z3iyKmyFEeKx9Kegn5X27A" type="6034">
- <layoutConstraint xmi:type="notation:Location" xmi:id="_z3iyK2yFEeKx9Kegn5X27A" y="-20"/>
- </children>
- <styles xmi:type="notation:FontStyle" xmi:id="_z3ZoMWyFEeKx9Kegn5X27A" fontName="Segoe UI"/>
- <element xmi:type="uml:Association" href="sashwindowsdi.uml#_9JomUEJVEd6kIY39uis5Uw"/>
- <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_z3ZoMmyFEeKx9Kegn5X27A" points="[0, 0, 0, 0]$[0, 0, 0, 0]"/>
- </edges>
- <edges xmi:type="notation:Connector" xmi:id="_4cfkAGyFEeKx9Kegn5X27A" type="4001" source="_4bTRMGyFEeKx9Kegn5X27A" target="_z1T9gGyFEeKx9Kegn5X27A" lineColor="0">
- <children xmi:type="notation:DecorationNode" xmi:id="_4cfkA2yFEeKx9Kegn5X27A" type="6001">
- <layoutConstraint xmi:type="notation:Location" xmi:id="_4cfkBGyFEeKx9Kegn5X27A" y="-20"/>
- </children>
- <children xmi:type="notation:DecorationNode" xmi:id="_4cfkBWyFEeKx9Kegn5X27A" visible="false" type="6002">
- <layoutConstraint xmi:type="notation:Location" xmi:id="_4cfkBmyFEeKx9Kegn5X27A" y="20"/>
- </children>
- <children xmi:type="notation:DecorationNode" xmi:id="_4cfkB2yFEeKx9Kegn5X27A" type="6003">
- <layoutConstraint xmi:type="notation:Location" xmi:id="_4cfkCGyFEeKx9Kegn5X27A" x="-28" y="-48"/>
- </children>
- <children xmi:type="notation:DecorationNode" xmi:id="_4cfkCWyFEeKx9Kegn5X27A" visible="false" type="6005">
- <layoutConstraint xmi:type="notation:Location" xmi:id="_4cfkCmyFEeKx9Kegn5X27A" y="20"/>
- </children>
- <children xmi:type="notation:DecorationNode" xmi:id="_4cfkC2yFEeKx9Kegn5X27A" type="6033">
- <layoutConstraint xmi:type="notation:Location" xmi:id="_4cfkDGyFEeKx9Kegn5X27A" y="20"/>
- </children>
- <children xmi:type="notation:DecorationNode" xmi:id="_4cfkDWyFEeKx9Kegn5X27A" type="6034">
- <layoutConstraint xmi:type="notation:Location" xmi:id="_4cfkDmyFEeKx9Kegn5X27A" y="-20"/>
- </children>
- <styles xmi:type="notation:FontStyle" xmi:id="_4cfkAWyFEeKx9Kegn5X27A" fontName="Segoe UI"/>
- <element xmi:type="uml:Association" href="sashwindowsdi.uml#_mT2jkEJkEd6kIY39uis5Uw"/>
- <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_4cfkAmyFEeKx9Kegn5X27A" points="[-50, 34, 610, 40]$[-194, 133, 466, 139]$[-655, 133, 5, 139]$[-655, 44, 5, 50]"/>
- </edges>
- <edges xmi:type="notation:Connector" xmi:id="_6DldoGyFEeKx9Kegn5X27A" type="4001" source="_6BzU8GyFEeKx9Kegn5X27A" target="_6Ci70GyFEeKx9Kegn5X27A" lineColor="0">
- <children xmi:type="notation:DecorationNode" xmi:id="_6DvOoGyFEeKx9Kegn5X27A" type="6001">
- <layoutConstraint xmi:type="notation:Location" xmi:id="_6DvOoWyFEeKx9Kegn5X27A" y="-20"/>
- </children>
- <children xmi:type="notation:DecorationNode" xmi:id="_6DvOomyFEeKx9Kegn5X27A" visible="false" type="6002">
- <layoutConstraint xmi:type="notation:Location" xmi:id="_6DvOo2yFEeKx9Kegn5X27A" y="20"/>
- </children>
- <children xmi:type="notation:DecorationNode" xmi:id="_6DvOpGyFEeKx9Kegn5X27A" type="6003">
- <layoutConstraint xmi:type="notation:Location" xmi:id="_6DvOpWyFEeKx9Kegn5X27A" x="25" y="-20"/>
- </children>
- <children xmi:type="notation:DecorationNode" xmi:id="_6DvOpmyFEeKx9Kegn5X27A" type="6005">
- <layoutConstraint xmi:type="notation:Location" xmi:id="_6DvOp2yFEeKx9Kegn5X27A" y="20"/>
- </children>
- <children xmi:type="notation:DecorationNode" xmi:id="_6DvOqGyFEeKx9Kegn5X27A" type="6033">
- <layoutConstraint xmi:type="notation:Location" xmi:id="_6DvOqWyFEeKx9Kegn5X27A" y="20"/>
- </children>
- <children xmi:type="notation:DecorationNode" xmi:id="_6DvOqmyFEeKx9Kegn5X27A" type="6034">
- <layoutConstraint xmi:type="notation:Location" xmi:id="_6DvOq2yFEeKx9Kegn5X27A" y="-20"/>
- </children>
- <styles xmi:type="notation:FontStyle" xmi:id="_6DldoWyFEeKx9Kegn5X27A" fontName="Segoe UI"/>
- <element xmi:type="uml:Association" href="sashwindowsdi.uml#__CVNUEJVEd6kIY39uis5Uw"/>
- <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_6DldomyFEeKx9Kegn5X27A" points="[0, 0, 0, 0]$[0, 0, 0, 0]"/>
- </edges>
- <edges xmi:type="notation:Connector" xmi:id="_6lXVAGyFEeKx9Kegn5X27A" type="4001" source="_6knuIGyFEeKx9Kegn5X27A" target="_4bTRMGyFEeKx9Kegn5X27A" lineColor="0">
- <children xmi:type="notation:DecorationNode" xmi:id="_6lXVA2yFEeKx9Kegn5X27A" type="6001">
- <layoutConstraint xmi:type="notation:Location" xmi:id="_6lXVBGyFEeKx9Kegn5X27A" y="-20"/>
- </children>
- <children xmi:type="notation:DecorationNode" xmi:id="_6lXVBWyFEeKx9Kegn5X27A" visible="false" type="6002">
- <layoutConstraint xmi:type="notation:Location" xmi:id="_6lXVBmyFEeKx9Kegn5X27A" y="20"/>
- </children>
- <children xmi:type="notation:DecorationNode" xmi:id="_6lXVB2yFEeKx9Kegn5X27A" type="6003">
- <layoutConstraint xmi:type="notation:Location" xmi:id="_6lXVCGyFEeKx9Kegn5X27A" x="-16" y="-50"/>
- </children>
- <children xmi:type="notation:DecorationNode" xmi:id="_6lXVCWyFEeKx9Kegn5X27A" type="6005">
- <layoutConstraint xmi:type="notation:Location" xmi:id="_6lXVCmyFEeKx9Kegn5X27A" x="12" y="47"/>
- </children>
- <children xmi:type="notation:DecorationNode" xmi:id="_6lXVC2yFEeKx9Kegn5X27A" type="6033">
- <layoutConstraint xmi:type="notation:Location" xmi:id="_6lXVDGyFEeKx9Kegn5X27A" y="20"/>
- </children>
- <children xmi:type="notation:DecorationNode" xmi:id="_6lXVDWyFEeKx9Kegn5X27A" type="6034">
- <layoutConstraint xmi:type="notation:Location" xmi:id="_6lXVDmyFEeKx9Kegn5X27A" x="6" y="-30"/>
- </children>
- <styles xmi:type="notation:FontStyle" xmi:id="_6lXVAWyFEeKx9Kegn5X27A" fontName="Segoe UI"/>
- <element xmi:type="uml:Association" href="sashwindowsdi.uml#_AM_CkEJWEd6kIY39uis5Uw"/>
- <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_6lXVAmyFEeKx9Kegn5X27A" points="[4, -50, -20, 250]$[20, -250, -4, 50]"/>
- <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_bn3q0FViEeWe8LyZrqaAug" id="(0.4583333333333333,0.0)"/>
- <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_bn3q0VViEeWe8LyZrqaAug" id="(0.5,1.0)"/>
- </edges>
- <edges xmi:type="notation:Connector" xmi:id="_-YK4QGyFEeKx9Kegn5X27A" type="4002" source="_z0HqsGyFEeKx9Kegn5X27A" target="_6Ci70GyFEeKx9Kegn5X27A" lineColor="0">
- <children xmi:type="notation:DecorationNode" xmi:id="_-YK4Q2yFEeKx9Kegn5X27A" type="6007">
- <layoutConstraint xmi:type="notation:Location" xmi:id="_-YK4RGyFEeKx9Kegn5X27A" y="40"/>
- </children>
- <styles xmi:type="notation:FontStyle" xmi:id="_-YK4QWyFEeKx9Kegn5X27A" fontName="Segoe UI"/>
- <element xmi:type="uml:Generalization" href="sashwindowsdi.uml#_95DboEJWEd6kIY39uis5Uw"/>
- <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_-YK4QmyFEeKx9Kegn5X27A" points="[50, 12, -365, -90]$[365, 89, -50, -13]"/>
- </edges>
- <edges xmi:type="notation:Connector" xmi:id="_CaI44GyGEeKx9Kegn5X27A" type="4002" source="_CZQIEGyGEeKx9Kegn5X27A" target="_6BzU8GyFEeKx9Kegn5X27A" lineColor="0">
- <children xmi:type="notation:DecorationNode" xmi:id="_CaI442yGEeKx9Kegn5X27A" type="6007">
- <layoutConstraint xmi:type="notation:Location" xmi:id="_CaI45GyGEeKx9Kegn5X27A" y="40"/>
- </children>
- <styles xmi:type="notation:FontStyle" xmi:id="_CaI44WyGEeKx9Kegn5X27A" fontName="Segoe UI"/>
- <element xmi:type="uml:Generalization" href="sashwindowsdi.uml#_7VZokEJVEd6kIY39uis5Uw"/>
- <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_CaI44myGEeKx9Kegn5X27A" points="[0, 0, -753, -562]$[703, 524, -50, -38]"/>
- </edges>
- <edges xmi:type="notation:Connector" xmi:id="_C8qXIGyGEeKx9Kegn5X27A" type="4002" source="_CZQIEGyGEeKx9Kegn5X27A" target="_6Ci70GyFEeKx9Kegn5X27A" lineColor="0">
- <children xmi:type="notation:DecorationNode" xmi:id="_C8qXI2yGEeKx9Kegn5X27A" type="6007">
- <layoutConstraint xmi:type="notation:Location" xmi:id="_C8qXJGyGEeKx9Kegn5X27A" y="40"/>
- </children>
- <styles xmi:type="notation:FontStyle" xmi:id="_C8qXIWyGEeKx9Kegn5X27A" fontName="Segoe UI"/>
- <element xmi:type="uml:Generalization" href="sashwindowsdi.uml#_UH6OsEsDEd6MxdnlcgT3eA"/>
- <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_C8qXImyGEeKx9Kegn5X27A" points="[36, -50, -315, 432]$[314, -432, -37, 50]"/>
- </edges>
- <edges xmi:type="notation:Connector" xmi:id="_HSH7gGyGEeKx9Kegn5X27A" type="4002" source="_4bTRMGyFEeKx9Kegn5X27A" target="_6BzU8GyFEeKx9Kegn5X27A" lineColor="0">
- <children xmi:type="notation:DecorationNode" xmi:id="_HSRFcGyGEeKx9Kegn5X27A" type="6007">
- <layoutConstraint xmi:type="notation:Location" xmi:id="_HSRFcWyGEeKx9Kegn5X27A" y="40"/>
- </children>
- <styles xmi:type="notation:FontStyle" xmi:id="_HSH7gWyGEeKx9Kegn5X27A" fontName="Segoe UI"/>
- <element xmi:type="uml:Generalization" href="sashwindowsdi.uml#_71vVgEJVEd6kIY39uis5Uw"/>
- <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HSH7gmyGEeKx9Kegn5X27A" points="[26, -50, -166, 310]$[165, -310, -27, 50]"/>
- </edges>
- <edges xmi:type="notation:Connector" xmi:id="_QH6QcGyGEeKx9Kegn5X27A" type="4001" source="_6knuIGyFEeKx9Kegn5X27A" target="_QHBfoGyGEeKx9Kegn5X27A" lineColor="0">
- <children xmi:type="notation:DecorationNode" xmi:id="_QH6Qc2yGEeKx9Kegn5X27A" type="6001">
- <layoutConstraint xmi:type="notation:Location" xmi:id="_QH6QdGyGEeKx9Kegn5X27A" y="-20"/>
- </children>
- <children xmi:type="notation:DecorationNode" xmi:id="_QH6QdWyGEeKx9Kegn5X27A" visible="false" type="6002">
- <layoutConstraint xmi:type="notation:Location" xmi:id="_QH6QdmyGEeKx9Kegn5X27A" y="20"/>
- </children>
- <children xmi:type="notation:DecorationNode" xmi:id="_QH6Qd2yGEeKx9Kegn5X27A" type="6003">
- <layoutConstraint xmi:type="notation:Location" xmi:id="_QH6QeGyGEeKx9Kegn5X27A" y="-20"/>
- </children>
- <children xmi:type="notation:DecorationNode" xmi:id="_QH6QeWyGEeKx9Kegn5X27A" type="6005">
- <layoutConstraint xmi:type="notation:Location" xmi:id="_QH6QemyGEeKx9Kegn5X27A" y="20"/>
- </children>
- <children xmi:type="notation:DecorationNode" xmi:id="_QH6Qe2yGEeKx9Kegn5X27A" type="6033">
- <layoutConstraint xmi:type="notation:Location" xmi:id="_QH6QfGyGEeKx9Kegn5X27A" y="20"/>
- </children>
- <children xmi:type="notation:DecorationNode" xmi:id="_QH6QfWyGEeKx9Kegn5X27A" type="6034">
- <layoutConstraint xmi:type="notation:Location" xmi:id="_QH6QfmyGEeKx9Kegn5X27A" y="-20"/>
- </children>
- <styles xmi:type="notation:FontStyle" xmi:id="_QH6QcWyGEeKx9Kegn5X27A" fontName="Segoe UI"/>
- <element xmi:type="uml:Association" href="sashwindowsdi.uml#_viyZUEJZEd6kIY39uis5Uw"/>
- <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_QH6QcmyGEeKx9Kegn5X27A" points="[-50, -45, 600, 533]$[-650, -578, 0, 0]"/>
- <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_bn3q0lViEeWe8LyZrqaAug" id="(0.0,0.44)"/>
- <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_bn3q01ViEeWe8LyZrqaAug" id="(1.0,0.5)"/>
- </edges>
- <edges xmi:type="notation:Connector" xmi:id="_eIIp8GyGEeKx9Kegn5X27A" type="4001" source="_QHBfoGyGEeKx9Kegn5X27A" target="_eHZDEGyGEeKx9Kegn5X27A" lineColor="0">
- <children xmi:type="notation:DecorationNode" xmi:id="_eIIp82yGEeKx9Kegn5X27A" type="6001">
- <layoutConstraint xmi:type="notation:Location" xmi:id="_eIIp9GyGEeKx9Kegn5X27A" y="-20"/>
- </children>
- <children xmi:type="notation:DecorationNode" xmi:id="_eIIp9WyGEeKx9Kegn5X27A" visible="false" type="6002">
- <layoutConstraint xmi:type="notation:Location" xmi:id="_eIIp9myGEeKx9Kegn5X27A" y="20"/>
- </children>
- <children xmi:type="notation:DecorationNode" xmi:id="_eIIp92yGEeKx9Kegn5X27A" type="6003">
- <layoutConstraint xmi:type="notation:Location" xmi:id="_eIIp-GyGEeKx9Kegn5X27A" x="-33" y="-26"/>
- </children>
- <children xmi:type="notation:DecorationNode" xmi:id="_eIIp-WyGEeKx9Kegn5X27A" visible="false" type="6005">
- <layoutConstraint xmi:type="notation:Location" xmi:id="_eIIp-myGEeKx9Kegn5X27A" x="56" y="72"/>
- </children>
- <children xmi:type="notation:DecorationNode" xmi:id="_eIIp-2yGEeKx9Kegn5X27A" type="6033">
- <layoutConstraint xmi:type="notation:Location" xmi:id="_eIIp_GyGEeKx9Kegn5X27A" y="20"/>
- </children>
- <children xmi:type="notation:DecorationNode" xmi:id="_eIIp_WyGEeKx9Kegn5X27A" type="6034">
- <layoutConstraint xmi:type="notation:Location" xmi:id="_eIIp_myGEeKx9Kegn5X27A" x="56" y="-31"/>
- </children>
- <styles xmi:type="notation:FontStyle" xmi:id="_eIIp8WyGEeKx9Kegn5X27A" fontName="Segoe UI"/>
- <element xmi:type="uml:Association" href="sashwindowsdi.uml#_9k0bgEMbEd6kIY39uis5Uw"/>
- <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_eIIp8myGEeKx9Kegn5X27A" points="[-50, 0, 207, 294]$[-248, 0, 9, 294]$[-248, -244, 9, 50]"/>
- </edges>
- <edges xmi:type="notation:Connector" xmi:id="_fLY2sGyGEeKx9Kegn5X27A" type="4001" source="_z1T9gGyFEeKx9Kegn5X27A" target="_eHZDEGyGEeKx9Kegn5X27A" lineColor="0">
- <children xmi:type="notation:DecorationNode" xmi:id="_fLY2s2yGEeKx9Kegn5X27A" type="6001">
- <layoutConstraint xmi:type="notation:Location" xmi:id="_fLY2tGyGEeKx9Kegn5X27A" y="-20"/>
- </children>
- <children xmi:type="notation:DecorationNode" xmi:id="_fLY2tWyGEeKx9Kegn5X27A" visible="false" type="6002">
- <layoutConstraint xmi:type="notation:Location" xmi:id="_fLY2tmyGEeKx9Kegn5X27A" y="20"/>
- </children>
- <children xmi:type="notation:DecorationNode" xmi:id="_fLY2t2yGEeKx9Kegn5X27A" type="6003">
- <layoutConstraint xmi:type="notation:Location" xmi:id="_fLY2uGyGEeKx9Kegn5X27A" x="33" y="22"/>
- </children>
- <children xmi:type="notation:DecorationNode" xmi:id="_fLY2uWyGEeKx9Kegn5X27A" visible="false" type="6005">
- <layoutConstraint xmi:type="notation:Location" xmi:id="_fLY2umyGEeKx9Kegn5X27A" y="20"/>
- </children>
- <children xmi:type="notation:DecorationNode" xmi:id="_fLY2u2yGEeKx9Kegn5X27A" type="6033">
- <layoutConstraint xmi:type="notation:Location" xmi:id="_fLY2vGyGEeKx9Kegn5X27A" y="20"/>
- </children>
- <children xmi:type="notation:DecorationNode" xmi:id="_fLiAoGyGEeKx9Kegn5X27A" type="6034">
- <layoutConstraint xmi:type="notation:Location" xmi:id="_fLiAoWyGEeKx9Kegn5X27A" y="-20"/>
- </children>
- <styles xmi:type="notation:FontStyle" xmi:id="_fLY2sWyGEeKx9Kegn5X27A" fontName="Segoe UI"/>
- <element xmi:type="uml:Association" href="sashwindowsdi.uml#_-EQwkEMbEd6kIY39uis5Uw"/>
- <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_fLY2smyGEeKx9Kegn5X27A" points="[-21, 50, 92, -220]$[-92, 220, 21, -50]"/>
- </edges>
- <edges xmi:type="notation:Connector" xmi:id="__ofJQGyIEeKx9Kegn5X27A" type="4001" source="__nlxYGyIEeKx9Kegn5X27A" target="_6knuIGyFEeKx9Kegn5X27A" lineColor="0">
- <children xmi:type="notation:DecorationNode" xmi:id="__ooTMGyIEeKx9Kegn5X27A" type="6001">
- <layoutConstraint xmi:type="notation:Location" xmi:id="__ooTMWyIEeKx9Kegn5X27A" y="-20"/>
- </children>
- <children xmi:type="notation:DecorationNode" xmi:id="__ooTMmyIEeKx9Kegn5X27A" visible="false" type="6002">
- <layoutConstraint xmi:type="notation:Location" xmi:id="__ooTM2yIEeKx9Kegn5X27A" y="20"/>
- </children>
- <children xmi:type="notation:DecorationNode" xmi:id="__ooTNGyIEeKx9Kegn5X27A" type="6003">
- <layoutConstraint xmi:type="notation:Location" xmi:id="__ooTNWyIEeKx9Kegn5X27A" y="-20"/>
- </children>
- <children xmi:type="notation:DecorationNode" xmi:id="__ooTNmyIEeKx9Kegn5X27A" visible="false" type="6005">
- <layoutConstraint xmi:type="notation:Location" xmi:id="__ooTN2yIEeKx9Kegn5X27A" y="20"/>
- </children>
- <children xmi:type="notation:DecorationNode" xmi:id="__ooTOGyIEeKx9Kegn5X27A" type="6033">
- <layoutConstraint xmi:type="notation:Location" xmi:id="__ooTOWyIEeKx9Kegn5X27A" y="20"/>
- </children>
- <children xmi:type="notation:DecorationNode" xmi:id="__ooTOmyIEeKx9Kegn5X27A" type="6034">
- <layoutConstraint xmi:type="notation:Location" xmi:id="__ooTO2yIEeKx9Kegn5X27A" y="-20"/>
- </children>
- <styles xmi:type="notation:FontStyle" xmi:id="__ofJQWyIEeKx9Kegn5X27A" fontName="Segoe UI"/>
- <element xmi:type="uml:Association" href="sashwindowsdi.uml#_b3enUEnjEd6ussMWxXGeXg"/>
- <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="__ofJQmyIEeKx9Kegn5X27A" points="[0, 0, -986, -572]$[936, 542, -50, -30]"/>
- <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_a3Xa8FViEeWe8LyZrqaAug" id="(0.0,0.4854368932038835)"/>
- <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_a3Xa8VViEeWe8LyZrqaAug" id="(1.0,0.5)"/>
- </edges>
- <edges xmi:type="notation:Connector" xmi:id="_D03IpFViEeWe8LyZrqaAug" type="StereotypeCommentLink" source="__nlxYGyIEeKx9Kegn5X27A" target="_D03IoFViEeWe8LyZrqaAug">
- <styles xmi:type="notation:FontStyle" xmi:id="_D03IpVViEeWe8LyZrqaAug"/>
- <styles xmi:type="notation:EObjectValueStyle" xmi:id="_D03IqVViEeWe8LyZrqaAug" name="BASE_ELEMENT">
- <eObjectValue xmi:type="uml:Class" href="pathmap://UML_METAMODELS/Ecore.metamodel.uml#EObject"/>
- </styles>
- <element xsi:nil="true"/>
- <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_D03IplViEeWe8LyZrqaAug" points="[0, 0, 0, 0]$[0, 0, 0, 0]"/>
- <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_D03Ip1ViEeWe8LyZrqaAug"/>
- <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_D03IqFViEeWe8LyZrqaAug"/>
- </edges>
- </notation:Diagram>
- <notation:Diagram xmi:id="_CCrlsGyHEeKx9Kegn5X27A" type="PapyrusUMLClassDiagram" name="ClassDiagram" measurementUnit="Pixel">
- <children xmi:type="notation:Shape" xmi:id="_CnIWkGyHEeKx9Kegn5X27A" type="2008" fontName="Segoe UI" lineColor="0">
- <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_CnIWkWyHEeKx9Kegn5X27A" source="ShadowFigure">
- <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_CnIWkmyHEeKx9Kegn5X27A" key="ShadowFigure_Value" value="false"/>
- </eAnnotations>
- <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_CnIWk2yHEeKx9Kegn5X27A" source="displayNameLabelIcon">
- <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_CnIWlGyHEeKx9Kegn5X27A" key="displayNameLabelIcon_value" value="false"/>
- </eAnnotations>
- <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_CnIWlWyHEeKx9Kegn5X27A" source="QualifiedName">
- <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_CnIWlmyHEeKx9Kegn5X27A" key="QualifiedNameDepth" value="1000"/>
- </eAnnotations>
- <children xmi:type="notation:DecorationNode" xmi:id="_CnIWl2yHEeKx9Kegn5X27A" type="5029"/>
- <children xmi:type="notation:BasicCompartment" xmi:id="_CnIWmGyHEeKx9Kegn5X27A" type="7017">
- <styles xmi:type="notation:TitleStyle" xmi:id="_CnIWmWyHEeKx9Kegn5X27A"/>
- <styles xmi:type="notation:SortingStyle" xmi:id="_CnIWmmyHEeKx9Kegn5X27A"/>
- <styles xmi:type="notation:FilteringStyle" xmi:id="_CnIWm2yHEeKx9Kegn5X27A"/>
- <layoutConstraint xmi:type="notation:Bounds" xmi:id="_CnIWnGyHEeKx9Kegn5X27A"/>
- </children>
- <children xmi:type="notation:BasicCompartment" xmi:id="_CnIWnWyHEeKx9Kegn5X27A" type="7018">
- <styles xmi:type="notation:TitleStyle" xmi:id="_CnIWnmyHEeKx9Kegn5X27A"/>
- <styles xmi:type="notation:SortingStyle" xmi:id="_CnIWn2yHEeKx9Kegn5X27A"/>
- <styles xmi:type="notation:FilteringStyle" xmi:id="_CnIWoGyHEeKx9Kegn5X27A"/>
- <layoutConstraint xmi:type="notation:Bounds" xmi:id="_CnIWoWyHEeKx9Kegn5X27A"/>
- </children>
- <children xmi:type="notation:BasicCompartment" xmi:id="_CnIWomyHEeKx9Kegn5X27A" type="7019">
- <styles xmi:type="notation:TitleStyle" xmi:id="_CnIWo2yHEeKx9Kegn5X27A"/>
- <styles xmi:type="notation:SortingStyle" xmi:id="_CnIWpGyHEeKx9Kegn5X27A"/>
- <styles xmi:type="notation:FilteringStyle" xmi:id="_CnIWpWyHEeKx9Kegn5X27A"/>
- <layoutConstraint xmi:type="notation:Bounds" xmi:id="_CnIWpmyHEeKx9Kegn5X27A"/>
- </children>
- <children xmi:type="notation:DecorationNode" xmi:id="_D-iCAFViEeWe8LyZrqaAug" type="8510">
- <layoutConstraint xmi:type="notation:Location" xmi:id="_D-iCAVViEeWe8LyZrqaAug" y="5"/>
- </children>
- <element xmi:type="uml:Class" href="sashwindowsdi.uml#_-9vywEMaEd6kIY39uis5Uw"/>
- <layoutConstraint xmi:type="notation:Bounds" xmi:id="_CnIWp2yHEeKx9Kegn5X27A" x="34" y="232"/>
- </children>
- <children xmi:type="notation:Shape" xmi:id="_CnSHmGyHEeKx9Kegn5X27A" type="2008" fontName="Segoe UI" lineColor="0">
- <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_CnSHmWyHEeKx9Kegn5X27A" source="ShadowFigure">
- <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_CnSHmmyHEeKx9Kegn5X27A" key="ShadowFigure_Value" value="false"/>
- </eAnnotations>
- <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_CnSHm2yHEeKx9Kegn5X27A" source="displayNameLabelIcon">
- <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_CnSHnGyHEeKx9Kegn5X27A" key="displayNameLabelIcon_value" value="false"/>
- </eAnnotations>
- <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_CnSHnWyHEeKx9Kegn5X27A" source="QualifiedName">
- <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_CnSHnmyHEeKx9Kegn5X27A" key="QualifiedNameDepth" value="1000"/>
- </eAnnotations>
- <children xmi:type="notation:DecorationNode" xmi:id="_CnSHn2yHEeKx9Kegn5X27A" type="5029"/>
- <children xmi:type="notation:BasicCompartment" xmi:id="_CnSHoGyHEeKx9Kegn5X27A" type="7017">
- <styles xmi:type="notation:TitleStyle" xmi:id="_CnSHoWyHEeKx9Kegn5X27A"/>
- <styles xmi:type="notation:SortingStyle" xmi:id="_CnSHomyHEeKx9Kegn5X27A"/>
- <styles xmi:type="notation:FilteringStyle" xmi:id="_CnSHo2yHEeKx9Kegn5X27A"/>
- <layoutConstraint xmi:type="notation:Bounds" xmi:id="_CnSHpGyHEeKx9Kegn5X27A"/>
- </children>
- <children xmi:type="notation:BasicCompartment" xmi:id="_CnSHpWyHEeKx9Kegn5X27A" type="7018">
- <children xmi:type="notation:Shape" xmi:id="_F9OIoGyHEeKx9Kegn5X27A" type="3013" fontName="Segoe UI" lineColor="0">
- <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_RjPwkGyHEeKx9Kegn5X27A" source="CustomAppearance_Annotation">
- <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_TjMPEGyHEeKx9Kegn5X27A" key="CustomAppearance_MaskValue" value="21258"/>
- </eAnnotations>
- <element xmi:type="uml:Operation" href="sashwindowsdi.uml#_wdFgUEV4Ed6g-YgfS2DHrA"/>
- <layoutConstraint xmi:type="notation:Location" xmi:id="_F9OIoWyHEeKx9Kegn5X27A" x="32" y="15"/>
- </children>
- <children xmi:type="notation:Shape" xmi:id="_F-G5cGyHEeKx9Kegn5X27A" type="3013" fontName="Segoe UI" lineColor="0">
- <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_RjZhkWyHEeKx9Kegn5X27A" source="CustomAppearance_Annotation">
- <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_TjMPEWyHEeKx9Kegn5X27A" key="CustomAppearance_MaskValue" value="21258"/>
- </eAnnotations>
- <element xmi:type="uml:Operation" href="sashwindowsdi.uml#_m7xPsEa4Ed6g-YgfS2DHrA"/>
- <layoutConstraint xmi:type="notation:Location" xmi:id="_F-G5cWyHEeKx9Kegn5X27A" x="32" y="15"/>
- </children>
- <children xmi:type="notation:Shape" xmi:id="_F-2gUGyHEeKx9Kegn5X27A" type="3013" fontName="Segoe UI" lineColor="0">
- <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_WgzPsGyHEeKx9Kegn5X27A" source="CustomAppearance_Annotation">
- <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_Xvt54GyHEeKx9Kegn5X27A" key="CustomAppearance_MaskValue" value="21258"/>
- </eAnnotations>
- <element xmi:type="uml:Operation" href="sashwindowsdi.uml#_e9ojYEbXEd6g-YgfS2DHrA"/>
- <layoutConstraint xmi:type="notation:Location" xmi:id="_F-2gUWyHEeKx9Kegn5X27A" x="32" y="15"/>
- </children>
- <children xmi:type="notation:Shape" xmi:id="_F_mHMGyHEeKx9Kegn5X27A" type="3013" fontName="Segoe UI" lineColor="0">
- <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_WgzPsmyHEeKx9Kegn5X27A" source="CustomAppearance_Annotation">
- <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_Xvt54WyHEeKx9Kegn5X27A" key="CustomAppearance_MaskValue" value="21258"/>
- </eAnnotations>
- <element xmi:type="uml:Operation" href="sashwindowsdi.uml#_q8zekEbsEd6g-YgfS2DHrA"/>
- <layoutConstraint xmi:type="notation:Location" xmi:id="_F_mHMWyHEeKx9Kegn5X27A" x="32" y="15"/>
- </children>
- <children xmi:type="notation:Shape" xmi:id="_GAffEGyHEeKx9Kegn5X27A" type="3013" fontName="Segoe UI" lineColor="0">
- <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_WgzPtGyHEeKx9Kegn5X27A" source="CustomAppearance_Annotation">
- <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_Xvt54myHEeKx9Kegn5X27A" key="CustomAppearance_MaskValue" value="21258"/>
- </eAnnotations>
- <element xmi:type="uml:Operation" href="sashwindowsdi.uml#_vnqNcEoIEd6ussMWxXGeXg"/>
- <layoutConstraint xmi:type="notation:Location" xmi:id="_GAffEWyHEeKx9Kegn5X27A" x="32" y="15"/>
- </children>
- <children xmi:type="notation:Shape" xmi:id="_GBYP4GyHEeKx9Kegn5X27A" type="3013" fontName="Segoe UI" lineColor="0">
- <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_WgzPtmyHEeKx9Kegn5X27A" source="CustomAppearance_Annotation">
- <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_Xvt542yHEeKx9Kegn5X27A" key="CustomAppearance_MaskValue" value="21258"/>
- </eAnnotations>
- <element xmi:type="uml:Operation" href="sashwindowsdi.uml#_Kvf9cEoJEd6ussMWxXGeXg"/>
- <layoutConstraint xmi:type="notation:Location" xmi:id="_GBYP4WyHEeKx9Kegn5X27A" x="32" y="15"/>
- </children>
- <children xmi:type="notation:Shape" xmi:id="_GCRnwGyHEeKx9Kegn5X27A" type="3013" fontName="Segoe UI" lineColor="0">
- <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_WgzPuGyHEeKx9Kegn5X27A" source="CustomAppearance_Annotation">
- <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_Xvt55GyHEeKx9Kegn5X27A" key="CustomAppearance_MaskValue" value="21258"/>
- </eAnnotations>
- <element xmi:type="uml:Operation" href="sashwindowsdi.uml#_OoMtUEoJEd6ussMWxXGeXg"/>
- <layoutConstraint xmi:type="notation:Location" xmi:id="_GCRnwWyHEeKx9Kegn5X27A" x="32" y="15"/>
- </children>
- <children xmi:type="notation:Shape" xmi:id="_GDBOoGyHEeKx9Kegn5X27A" type="3013" fontName="Segoe UI" lineColor="0">
- <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_WgzPumyHEeKx9Kegn5X27A" source="CustomAppearance_Annotation">
- <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_Xvt55WyHEeKx9Kegn5X27A" key="CustomAppearance_MaskValue" value="21258"/>
- </eAnnotations>
- <element xmi:type="uml:Operation" href="sashwindowsdi.uml#_vaMqoE4OEd-B2uXHu4qMXg"/>
- <layoutConstraint xmi:type="notation:Location" xmi:id="_GDBOoWyHEeKx9Kegn5X27A" x="32" y="15"/>
- </children>
- <children xmi:type="notation:Shape" xmi:id="_GDw1gGyHEeKx9Kegn5X27A" type="3013" fontName="Segoe UI" lineColor="0">
- <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_WgzPvGyHEeKx9Kegn5X27A" source="CustomAppearance_Annotation">
- <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_Xv3q4GyHEeKx9Kegn5X27A" key="CustomAppearance_MaskValue" value="21258"/>
- </eAnnotations>
- <element xmi:type="uml:Operation" href="sashwindowsdi.uml#_-TkSoE4OEd-B2uXHu4qMXg"/>
- <layoutConstraint xmi:type="notation:Location" xmi:id="_GDw1gWyHEeKx9Kegn5X27A" x="32" y="15"/>
- </children>
- <children xmi:type="notation:Shape" xmi:id="_GEgcYGyHEeKx9Kegn5X27A" type="3013" fontName="Segoe UI" lineColor="0">
- <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_WgzPvmyHEeKx9Kegn5X27A" source="CustomAppearance_Annotation">
- <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_Xv3q4WyHEeKx9Kegn5X27A" key="CustomAppearance_MaskValue" value="21258"/>
- </eAnnotations>
- <element xmi:type="uml:Operation" href="sashwindowsdi.uml#_1jUIgE4PEd-B2uXHu4qMXg"/>
- <layoutConstraint xmi:type="notation:Location" xmi:id="_GEgcYWyHEeKx9Kegn5X27A" x="32" y="15"/>
- </children>
- <children xmi:type="notation:Shape" xmi:id="_GFQDQGyHEeKx9Kegn5X27A" type="3013" fontName="Segoe UI" lineColor="0">
- <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_WgzPwGyHEeKx9Kegn5X27A" source="CustomAppearance_Annotation">
- <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_Xv3q4myHEeKx9Kegn5X27A" key="CustomAppearance_MaskValue" value="21258"/>
- </eAnnotations>
- <element xmi:type="uml:Operation" href="sashwindowsdi.uml#_4qi_ME4PEd-B2uXHu4qMXg"/>
- <layoutConstraint xmi:type="notation:Location" xmi:id="_GFQDQWyHEeKx9Kegn5X27A" x="32" y="15"/>
- </children>
- <children xmi:type="notation:Shape" xmi:id="_GGJbIGyHEeKx9Kegn5X27A" type="3013" fontName="Segoe UI" lineColor="0">
- <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_WgzPwmyHEeKx9Kegn5X27A" source="CustomAppearance_Annotation">
- <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_Xv3q42yHEeKx9Kegn5X27A" key="CustomAppearance_MaskValue" value="21258"/>
- </eAnnotations>
- <element xmi:type="uml:Operation" href="sashwindowsdi.uml#_fPvj8FgxEeGNKLzLkykmJw"/>
- <layoutConstraint xmi:type="notation:Location" xmi:id="_GGJbIWyHEeKx9Kegn5X27A" x="32" y="15"/>
- </children>
- <children xmi:type="notation:Shape" xmi:id="_zeIgsGySEeKx9Kegn5X27A" type="3013" fontName="Segoe UI" lineColor="0">
- <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_68TicGySEeKx9Kegn5X27A" source="CustomAppearance_Annotation">
- <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_7ttKMGySEeKx9Kegn5X27A" key="CustomAppearance_MaskValue" value="21258"/>
- </eAnnotations>
- <element xmi:type="uml:Operation" href="sashwindowsdi.uml#_zdr0wGySEeKx9Kegn5X27A"/>
- <layoutConstraint xmi:type="notation:Location" xmi:id="_zeIgsWySEeKx9Kegn5X27A"/>
- </children>
- <styles xmi:type="notation:TitleStyle" xmi:id="_CnSHpmyHEeKx9Kegn5X27A"/>
- <styles xmi:type="notation:SortingStyle" xmi:id="_CnSHp2yHEeKx9Kegn5X27A"/>
- <styles xmi:type="notation:FilteringStyle" xmi:id="_CnSHqGyHEeKx9Kegn5X27A"/>
- <layoutConstraint xmi:type="notation:Bounds" xmi:id="_CnSHqWyHEeKx9Kegn5X27A"/>
- </children>
- <children xmi:type="notation:BasicCompartment" xmi:id="_CnSHqmyHEeKx9Kegn5X27A" type="7019">
- <styles xmi:type="notation:TitleStyle" xmi:id="_CnSHq2yHEeKx9Kegn5X27A"/>
- <styles xmi:type="notation:SortingStyle" xmi:id="_CnSHrGyHEeKx9Kegn5X27A"/>
- <styles xmi:type="notation:FilteringStyle" xmi:id="_CnSHrWyHEeKx9Kegn5X27A"/>
- <layoutConstraint xmi:type="notation:Bounds" xmi:id="_CnSHrmyHEeKx9Kegn5X27A"/>
- </children>
- <children xmi:type="notation:DecorationNode" xmi:id="_D-iCAlViEeWe8LyZrqaAug" type="8510">
- <layoutConstraint xmi:type="notation:Location" xmi:id="_D-iCA1ViEeWe8LyZrqaAug" y="5"/>
- </children>
- <element xmi:type="uml:Class" href="sashwindowsdi.uml#_UiIMMEJVEd6kIY39uis5Uw"/>
- <layoutConstraint xmi:type="notation:Bounds" xmi:id="_CnSHr2yHEeKx9Kegn5X27A" x="288" y="150"/>
- </children>
- <children xmi:type="notation:Shape" xmi:id="_CnSH4WyHEeKx9Kegn5X27A" type="2008" fontName="Segoe UI" lineColor="0">
- <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_CnSH4myHEeKx9Kegn5X27A" source="ShadowFigure">
- <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_CnSH42yHEeKx9Kegn5X27A" key="ShadowFigure_Value" value="false"/>
- </eAnnotations>
- <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_CnSH5GyHEeKx9Kegn5X27A" source="displayNameLabelIcon">
- <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_CnSH5WyHEeKx9Kegn5X27A" key="displayNameLabelIcon_value" value="false"/>
- </eAnnotations>
- <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_CnSH5myHEeKx9Kegn5X27A" source="QualifiedName">
- <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_CnSH52yHEeKx9Kegn5X27A" key="QualifiedNameDepth" value="1000"/>
- </eAnnotations>
- <children xmi:type="notation:DecorationNode" xmi:id="_CnSH6GyHEeKx9Kegn5X27A" type="5029"/>
- <children xmi:type="notation:BasicCompartment" xmi:id="_CnSH6WyHEeKx9Kegn5X27A" type="7017">
- <styles xmi:type="notation:TitleStyle" xmi:id="_CnSH6myHEeKx9Kegn5X27A"/>
- <styles xmi:type="notation:SortingStyle" xmi:id="_CnSH62yHEeKx9Kegn5X27A"/>
- <styles xmi:type="notation:FilteringStyle" xmi:id="_CnSH7GyHEeKx9Kegn5X27A"/>
- <layoutConstraint xmi:type="notation:Bounds" xmi:id="_CnSH7WyHEeKx9Kegn5X27A"/>
- </children>
- <children xmi:type="notation:BasicCompartment" xmi:id="_CnSH7myHEeKx9Kegn5X27A" type="7018">
- <styles xmi:type="notation:TitleStyle" xmi:id="_CnSH72yHEeKx9Kegn5X27A"/>
- <styles xmi:type="notation:SortingStyle" xmi:id="_CnSH8GyHEeKx9Kegn5X27A"/>
- <styles xmi:type="notation:FilteringStyle" xmi:id="_CnSH8WyHEeKx9Kegn5X27A"/>
- <layoutConstraint xmi:type="notation:Bounds" xmi:id="_CnSH8myHEeKx9Kegn5X27A"/>
- </children>
- <children xmi:type="notation:BasicCompartment" xmi:id="_CnSH82yHEeKx9Kegn5X27A" type="7019">
- <styles xmi:type="notation:TitleStyle" xmi:id="_CnSH9GyHEeKx9Kegn5X27A"/>
- <styles xmi:type="notation:SortingStyle" xmi:id="_CnSH9WyHEeKx9Kegn5X27A"/>
- <styles xmi:type="notation:FilteringStyle" xmi:id="_CnSH9myHEeKx9Kegn5X27A"/>
- <layoutConstraint xmi:type="notation:Bounds" xmi:id="_CnSH92yHEeKx9Kegn5X27A"/>
- </children>
- <children xmi:type="notation:DecorationNode" xmi:id="_D-iCBFViEeWe8LyZrqaAug" type="8510">
- <layoutConstraint xmi:type="notation:Location" xmi:id="_D-iCBVViEeWe8LyZrqaAug" y="5"/>
- </children>
- <element xmi:type="uml:Class" href="sashwindowsdi.uml#_h_HVwEJVEd6kIY39uis5Uw"/>
- <layoutConstraint xmi:type="notation:Bounds" xmi:id="_CnSH-GyHEeKx9Kegn5X27A" x="948" y="654"/>
- </children>
- <children xmi:type="notation:Shape" xmi:id="_CnbRv2yHEeKx9Kegn5X27A" type="2008" fontName="Segoe UI" lineColor="0">
- <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_CnbRwGyHEeKx9Kegn5X27A" source="ShadowFigure">
- <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_CnbRwWyHEeKx9Kegn5X27A" key="ShadowFigure_Value" value="false"/>
- </eAnnotations>
- <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_CnbRwmyHEeKx9Kegn5X27A" source="displayNameLabelIcon">
- <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_CnbRw2yHEeKx9Kegn5X27A" key="displayNameLabelIcon_value" value="false"/>
- </eAnnotations>
- <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_CnbRxGyHEeKx9Kegn5X27A" source="QualifiedName">
- <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_CnbRxWyHEeKx9Kegn5X27A" key="QualifiedNameDepth" value="1000"/>
- </eAnnotations>
- <children xmi:type="notation:DecorationNode" xmi:id="_CnbRxmyHEeKx9Kegn5X27A" type="5029"/>
- <children xmi:type="notation:BasicCompartment" xmi:id="_CnbRx2yHEeKx9Kegn5X27A" type="7017">
- <styles xmi:type="notation:TitleStyle" xmi:id="_CnbRyGyHEeKx9Kegn5X27A"/>
- <styles xmi:type="notation:SortingStyle" xmi:id="_CnbRyWyHEeKx9Kegn5X27A"/>
- <styles xmi:type="notation:FilteringStyle" xmi:id="_CnbRymyHEeKx9Kegn5X27A"/>
- <layoutConstraint xmi:type="notation:Bounds" xmi:id="_CnbRy2yHEeKx9Kegn5X27A"/>
- </children>
- <children xmi:type="notation:BasicCompartment" xmi:id="_CnbRzGyHEeKx9Kegn5X27A" type="7018">
- <styles xmi:type="notation:TitleStyle" xmi:id="_CnbRzWyHEeKx9Kegn5X27A"/>
- <styles xmi:type="notation:SortingStyle" xmi:id="_CnbRzmyHEeKx9Kegn5X27A"/>
- <styles xmi:type="notation:FilteringStyle" xmi:id="_CnbRz2yHEeKx9Kegn5X27A"/>
- <layoutConstraint xmi:type="notation:Bounds" xmi:id="_CnbR0GyHEeKx9Kegn5X27A"/>
- </children>
- <children xmi:type="notation:BasicCompartment" xmi:id="_CnbR0WyHEeKx9Kegn5X27A" type="7019">
- <styles xmi:type="notation:TitleStyle" xmi:id="_CnbR0myHEeKx9Kegn5X27A"/>
- <styles xmi:type="notation:SortingStyle" xmi:id="_CnbR02yHEeKx9Kegn5X27A"/>
- <styles xmi:type="notation:FilteringStyle" xmi:id="_CnbR1GyHEeKx9Kegn5X27A"/>
- <layoutConstraint xmi:type="notation:Bounds" xmi:id="_CnbR1WyHEeKx9Kegn5X27A"/>
- </children>
- <children xmi:type="notation:DecorationNode" xmi:id="_D-iCBlViEeWe8LyZrqaAug" type="8510">
- <layoutConstraint xmi:type="notation:Location" xmi:id="_D-iCB1ViEeWe8LyZrqaAug" y="5"/>
- </children>
- <element xmi:type="uml:Class" href="sashwindowsdi.uml#_b7a4cEMaEd6kIY39uis5Uw"/>
- <layoutConstraint xmi:type="notation:Bounds" xmi:id="_CnbR1myHEeKx9Kegn5X27A" x="306" y="648"/>
- </children>
- <children xmi:type="notation:Shape" xmi:id="_rFD98GyHEeKx9Kegn5X27A" type="2008" fontName="Segoe UI" lineColor="0">
- <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_rFD98myHEeKx9Kegn5X27A" source="ShadowFigure">
- <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_rFD982yHEeKx9Kegn5X27A" key="ShadowFigure_Value" value="false"/>
- </eAnnotations>
- <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_rFD99GyHEeKx9Kegn5X27A" source="displayNameLabelIcon">
- <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_rFD99WyHEeKx9Kegn5X27A" key="displayNameLabelIcon_value" value="false"/>
- </eAnnotations>
- <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_rFD99myHEeKx9Kegn5X27A" source="QualifiedName">
- <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_rFD992yHEeKx9Kegn5X27A" key="QualifiedNameDepth" value="1000"/>
- </eAnnotations>
- <children xmi:type="notation:DecorationNode" xmi:id="_rFD9-GyHEeKx9Kegn5X27A" type="5029"/>
- <children xmi:type="notation:BasicCompartment" xmi:id="_rFD9-WyHEeKx9Kegn5X27A" type="7017">
- <styles xmi:type="notation:TitleStyle" xmi:id="_rFD9-myHEeKx9Kegn5X27A"/>
- <styles xmi:type="notation:SortingStyle" xmi:id="_rFD9-2yHEeKx9Kegn5X27A"/>
- <styles xmi:type="notation:FilteringStyle" xmi:id="_rFD9_GyHEeKx9Kegn5X27A"/>
- <layoutConstraint xmi:type="notation:Bounds" xmi:id="_rFD9_WyHEeKx9Kegn5X27A"/>
- </children>
- <children xmi:type="notation:BasicCompartment" xmi:id="_rFD9_myHEeKx9Kegn5X27A" type="7018">
- <styles xmi:type="notation:TitleStyle" xmi:id="_rFD9_2yHEeKx9Kegn5X27A"/>
- <styles xmi:type="notation:SortingStyle" xmi:id="_rFD-AGyHEeKx9Kegn5X27A"/>
- <styles xmi:type="notation:FilteringStyle" xmi:id="_rFD-AWyHEeKx9Kegn5X27A"/>
- <layoutConstraint xmi:type="notation:Bounds" xmi:id="_rFD-AmyHEeKx9Kegn5X27A"/>
- </children>
- <children xmi:type="notation:BasicCompartment" xmi:id="_rFD-A2yHEeKx9Kegn5X27A" type="7019">
- <styles xmi:type="notation:TitleStyle" xmi:id="_rFD-BGyHEeKx9Kegn5X27A"/>
- <styles xmi:type="notation:SortingStyle" xmi:id="_rFD-BWyHEeKx9Kegn5X27A"/>
- <styles xmi:type="notation:FilteringStyle" xmi:id="_rFD-BmyHEeKx9Kegn5X27A"/>
- <layoutConstraint xmi:type="notation:Bounds" xmi:id="_rFD-B2yHEeKx9Kegn5X27A"/>
- </children>
- <children xmi:type="notation:DecorationNode" xmi:id="_D-iCCFViEeWe8LyZrqaAug" type="8510">
- <layoutConstraint xmi:type="notation:Location" xmi:id="_D-iCCVViEeWe8LyZrqaAug" y="5"/>
- </children>
- <element xmi:type="uml:Class" href="pathmap://UML_METAMODELS/Ecore.metamodel.uml#EObject"/>
- <layoutConstraint xmi:type="notation:Bounds" xmi:id="_rFD98WyHEeKx9Kegn5X27A" x="740" y="794"/>
- </children>
- <children xmi:type="notation:Shape" xmi:id="_0mKgwGyHEeKx9Kegn5X27A" type="2008" fontName="Segoe UI" lineColor="0">
- <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_0mKgwmyHEeKx9Kegn5X27A" source="ShadowFigure">
- <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_0mKgw2yHEeKx9Kegn5X27A" key="ShadowFigure_Value" value="false"/>
- </eAnnotations>
- <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_0mKgxGyHEeKx9Kegn5X27A" source="displayNameLabelIcon">
- <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_0mKgxWyHEeKx9Kegn5X27A" key="displayNameLabelIcon_value" value="false"/>
- </eAnnotations>
- <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_0mKgxmyHEeKx9Kegn5X27A" source="QualifiedName">
- <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_0mKgx2yHEeKx9Kegn5X27A" key="QualifiedNameDepth" value="1000"/>
- </eAnnotations>
- <children xmi:type="notation:DecorationNode" xmi:id="_0mKgyGyHEeKx9Kegn5X27A" type="5029"/>
- <children xmi:type="notation:BasicCompartment" xmi:id="_0mKgyWyHEeKx9Kegn5X27A" type="7017">
- <styles xmi:type="notation:TitleStyle" xmi:id="_0mKgymyHEeKx9Kegn5X27A"/>
- <styles xmi:type="notation:SortingStyle" xmi:id="_0mKgy2yHEeKx9Kegn5X27A"/>
- <styles xmi:type="notation:FilteringStyle" xmi:id="_0mKgzGyHEeKx9Kegn5X27A"/>
- <layoutConstraint xmi:type="notation:Bounds" xmi:id="_0mKgzWyHEeKx9Kegn5X27A"/>
- </children>
- <children xmi:type="notation:BasicCompartment" xmi:id="_0mKgzmyHEeKx9Kegn5X27A" type="7018">
- <styles xmi:type="notation:TitleStyle" xmi:id="_0mKgz2yHEeKx9Kegn5X27A"/>
- <styles xmi:type="notation:SortingStyle" xmi:id="_0mKg0GyHEeKx9Kegn5X27A"/>
- <styles xmi:type="notation:FilteringStyle" xmi:id="_0mKg0WyHEeKx9Kegn5X27A"/>
- <layoutConstraint xmi:type="notation:Bounds" xmi:id="_0mKg0myHEeKx9Kegn5X27A"/>
- </children>
- <children xmi:type="notation:BasicCompartment" xmi:id="_0mKg02yHEeKx9Kegn5X27A" type="7019">
- <styles xmi:type="notation:TitleStyle" xmi:id="_0mKg1GyHEeKx9Kegn5X27A"/>
- <styles xmi:type="notation:SortingStyle" xmi:id="_0mKg1WyHEeKx9Kegn5X27A"/>
- <styles xmi:type="notation:FilteringStyle" xmi:id="_0mKg1myHEeKx9Kegn5X27A"/>
- <layoutConstraint xmi:type="notation:Bounds" xmi:id="_0mKg12yHEeKx9Kegn5X27A"/>
- </children>
- <children xmi:type="notation:DecorationNode" xmi:id="_D-iCClViEeWe8LyZrqaAug" type="8510">
- <layoutConstraint xmi:type="notation:Location" xmi:id="_D-iCC1ViEeWe8LyZrqaAug" y="5"/>
- </children>
- <element xmi:type="uml:Class" href="sashwindowsdi.uml#_fbWYgEJVEd6kIY39uis5Uw"/>
- <layoutConstraint xmi:type="notation:Bounds" xmi:id="_0mKgwWyHEeKx9Kegn5X27A" x="780" y="534"/>
- </children>
- <children xmi:type="notation:Shape" xmi:id="_ED5DIFViEeWe8LyZrqaAug" type="StereotypeComment">
- <styles xmi:type="notation:TitleStyle" xmi:id="_ED5DIVViEeWe8LyZrqaAug" showTitle="true"/>
- <styles xmi:type="notation:EObjectValueStyle" xmi:id="_ED5DI1ViEeWe8LyZrqaAug" name="BASE_ELEMENT">
- <eObjectValue xmi:type="uml:Class" href="pathmap://UML_METAMODELS/Ecore.metamodel.uml#EObject"/>
- </styles>
- <element xsi:nil="true"/>
- <layoutConstraint xmi:type="notation:Bounds" xmi:id="_ED5DIlViEeWe8LyZrqaAug" x="940" y="794"/>
- </children>
- <styles xmi:type="notation:DiagramStyle" xmi:id="_CCrlsWyHEeKx9Kegn5X27A"/>
- <styles xmi:type="notation:StringValueStyle" xmi:id="_D-iCDFViEeWe8LyZrqaAug" name="diagram_compatibility_version" stringValue="1.1.0"/>
- <element xmi:type="uml:Model" href="sashwindowsdi.uml#_NuHhwEJVEd6kIY39uis5Uw"/>
- <edges xmi:type="notation:Connector" xmi:id="_CnIWt2yHEeKx9Kegn5X27A" type="4001" source="_CnSHmGyHEeKx9Kegn5X27A" target="_CnIWkGyHEeKx9Kegn5X27A" lineColor="0">
- <children xmi:type="notation:DecorationNode" xmi:id="_CnIWuGyHEeKx9Kegn5X27A" type="6001">
- <layoutConstraint xmi:type="notation:Location" xmi:id="_CnIWuWyHEeKx9Kegn5X27A" y="-20"/>
- </children>
- <children xmi:type="notation:DecorationNode" xmi:id="_CnIWumyHEeKx9Kegn5X27A" visible="false" type="6002">
- <layoutConstraint xmi:type="notation:Location" xmi:id="_CnIWu2yHEeKx9Kegn5X27A" y="20"/>
- </children>
- <children xmi:type="notation:DecorationNode" xmi:id="_CnIWvGyHEeKx9Kegn5X27A" type="6003">
- <layoutConstraint xmi:type="notation:Location" xmi:id="_CnIWvWyHEeKx9Kegn5X27A" x="33" y="22"/>
- </children>
- <children xmi:type="notation:DecorationNode" xmi:id="_CnIWvmyHEeKx9Kegn5X27A" visible="false" type="6005">
- <layoutConstraint xmi:type="notation:Location" xmi:id="_CnIWv2yHEeKx9Kegn5X27A" y="20"/>
- </children>
- <children xmi:type="notation:DecorationNode" xmi:id="_CnIWwGyHEeKx9Kegn5X27A" type="6033">
- <layoutConstraint xmi:type="notation:Location" xmi:id="_CnIWwWyHEeKx9Kegn5X27A" y="20"/>
- </children>
- <children xmi:type="notation:DecorationNode" xmi:id="_CnIWwmyHEeKx9Kegn5X27A" type="6034">
- <layoutConstraint xmi:type="notation:Location" xmi:id="_CnIWw2yHEeKx9Kegn5X27A" y="-20"/>
- </children>
- <styles xmi:type="notation:FontStyle" xmi:id="_CnIWxGyHEeKx9Kegn5X27A" fontName="Segoe UI"/>
- <element xmi:type="uml:Association" href="sashwindowsdi.uml#_-EQwkEMbEd6kIY39uis5Uw"/>
- <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_CnIWxWyHEeKx9Kegn5X27A" points="[-21, 50, 92, -220]$[-92, 220, 21, -50]"/>
- </edges>
- <edges xmi:type="notation:Connector" xmi:id="_CnIWxmyHEeKx9Kegn5X27A" type="4001" source="_CnbRv2yHEeKx9Kegn5X27A" target="_CnIWkGyHEeKx9Kegn5X27A" lineColor="0">
- <children xmi:type="notation:DecorationNode" xmi:id="_CnIWx2yHEeKx9Kegn5X27A" type="6001">
- <layoutConstraint xmi:type="notation:Location" xmi:id="_CnIWyGyHEeKx9Kegn5X27A" y="-20"/>
- </children>
- <children xmi:type="notation:DecorationNode" xmi:id="_CnIWyWyHEeKx9Kegn5X27A" visible="false" type="6002">
- <layoutConstraint xmi:type="notation:Location" xmi:id="_CnIWymyHEeKx9Kegn5X27A" y="20"/>
- </children>
- <children xmi:type="notation:DecorationNode" xmi:id="_CnIWy2yHEeKx9Kegn5X27A" type="6003">
- <layoutConstraint xmi:type="notation:Location" xmi:id="_CnIWzGyHEeKx9Kegn5X27A" x="-33" y="-26"/>
- </children>
- <children xmi:type="notation:DecorationNode" xmi:id="_CnIWzWyHEeKx9Kegn5X27A" visible="false" type="6005">
- <layoutConstraint xmi:type="notation:Location" xmi:id="_CnIWzmyHEeKx9Kegn5X27A" x="56" y="72"/>
- </children>
- <children xmi:type="notation:DecorationNode" xmi:id="_CnIWz2yHEeKx9Kegn5X27A" type="6033">
- <layoutConstraint xmi:type="notation:Location" xmi:id="_CnIW0GyHEeKx9Kegn5X27A" y="20"/>
- </children>
- <children xmi:type="notation:DecorationNode" xmi:id="_CnIW0WyHEeKx9Kegn5X27A" type="6034">
- <layoutConstraint xmi:type="notation:Location" xmi:id="_CnIW0myHEeKx9Kegn5X27A" x="56" y="-31"/>
- </children>
- <styles xmi:type="notation:FontStyle" xmi:id="_CnIW02yHEeKx9Kegn5X27A" fontName="Segoe UI"/>
- <element xmi:type="uml:Association" href="sashwindowsdi.uml#_9k0bgEMbEd6kIY39uis5Uw"/>
- <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_CnIW1GyHEeKx9Kegn5X27A" points="[-50, 0, 207, 294]$[-248, 0, 9, 294]$[-248, -244, 9, 50]"/>
- </edges>
- <edges xmi:type="notation:Connector" xmi:id="_CnSIDWyHEeKx9Kegn5X27A" type="4001" source="_CnSH4WyHEeKx9Kegn5X27A" target="_CnbRv2yHEeKx9Kegn5X27A" lineColor="0">
- <children xmi:type="notation:DecorationNode" xmi:id="_CnSIDmyHEeKx9Kegn5X27A" type="6001">
- <layoutConstraint xmi:type="notation:Location" xmi:id="_CnSID2yHEeKx9Kegn5X27A" y="-20"/>
- </children>
- <children xmi:type="notation:DecorationNode" xmi:id="_CnSIEGyHEeKx9Kegn5X27A" visible="false" type="6002">
- <layoutConstraint xmi:type="notation:Location" xmi:id="_CnSIEWyHEeKx9Kegn5X27A" y="20"/>
- </children>
- <children xmi:type="notation:DecorationNode" xmi:id="_CnSIEmyHEeKx9Kegn5X27A" type="6003">
- <layoutConstraint xmi:type="notation:Location" xmi:id="_CnSIE2yHEeKx9Kegn5X27A" y="-20"/>
- </children>
- <children xmi:type="notation:DecorationNode" xmi:id="_CnSIFGyHEeKx9Kegn5X27A" type="6005">
- <layoutConstraint xmi:type="notation:Location" xmi:id="_CnSIFWyHEeKx9Kegn5X27A" y="20"/>
- </children>
- <children xmi:type="notation:DecorationNode" xmi:id="_CnSIFmyHEeKx9Kegn5X27A" type="6033">
- <layoutConstraint xmi:type="notation:Location" xmi:id="_CnSIF2yHEeKx9Kegn5X27A" y="20"/>
- </children>
- <children xmi:type="notation:DecorationNode" xmi:id="_CnSIGGyHEeKx9Kegn5X27A" type="6034">
- <layoutConstraint xmi:type="notation:Location" xmi:id="_CnSIGWyHEeKx9Kegn5X27A" y="-20"/>
- </children>
- <styles xmi:type="notation:FontStyle" xmi:id="_CnSIGmyHEeKx9Kegn5X27A" fontName="Segoe UI"/>
- <element xmi:type="uml:Association" href="sashwindowsdi.uml#_viyZUEJZEd6kIY39uis5Uw"/>
- <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_CnSIG2yHEeKx9Kegn5X27A" points="[-50, -45, 600, 533]$[-650, -578, 0, 0]"/>
- </edges>
- <edges xmi:type="notation:Connector" xmi:id="_rGHG0GyHEeKx9Kegn5X27A" type="4001" source="_rFD98GyHEeKx9Kegn5X27A" target="_CnSH4WyHEeKx9Kegn5X27A" lineColor="0">
- <children xmi:type="notation:DecorationNode" xmi:id="_rGHG02yHEeKx9Kegn5X27A" type="6001">
- <layoutConstraint xmi:type="notation:Location" xmi:id="_rGHG1GyHEeKx9Kegn5X27A" y="-20"/>
- </children>
- <children xmi:type="notation:DecorationNode" xmi:id="_rGHG1WyHEeKx9Kegn5X27A" visible="false" type="6002">
- <layoutConstraint xmi:type="notation:Location" xmi:id="_rGHG1myHEeKx9Kegn5X27A" y="20"/>
- </children>
- <children xmi:type="notation:DecorationNode" xmi:id="_rGHG12yHEeKx9Kegn5X27A" type="6003">
- <layoutConstraint xmi:type="notation:Location" xmi:id="_rGHG2GyHEeKx9Kegn5X27A" y="-20"/>
- </children>
- <children xmi:type="notation:DecorationNode" xmi:id="_rGHG2WyHEeKx9Kegn5X27A" type="6005">
- <layoutConstraint xmi:type="notation:Location" xmi:id="_rGHG2myHEeKx9Kegn5X27A" y="20"/>
- </children>
- <children xmi:type="notation:DecorationNode" xmi:id="_rGHG22yHEeKx9Kegn5X27A" type="6033">
- <layoutConstraint xmi:type="notation:Location" xmi:id="_rGHG3GyHEeKx9Kegn5X27A" y="20"/>
- </children>
- <children xmi:type="notation:DecorationNode" xmi:id="_rGHG3WyHEeKx9Kegn5X27A" type="6034">
- <layoutConstraint xmi:type="notation:Location" xmi:id="_rGHG3myHEeKx9Kegn5X27A" y="-20"/>
- </children>
- <styles xmi:type="notation:FontStyle" xmi:id="_rGHG0WyHEeKx9Kegn5X27A" fontName="Segoe UI"/>
- <element xmi:type="uml:Association" href="sashwindowsdi.uml#_b3enUEnjEd6ussMWxXGeXg"/>
- <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_rGHG0myHEeKx9Kegn5X27A" points="[0, 0, -996, -582]$[946, 552, -50, -30]"/>
- </edges>
- <edges xmi:type="notation:Connector" xmi:id="_0mwWoGyHEeKx9Kegn5X27A" type="4001" source="_0mKgwGyHEeKx9Kegn5X27A" target="_CnSHmGyHEeKx9Kegn5X27A" lineColor="0">
- <children xmi:type="notation:DecorationNode" xmi:id="_0mwWo2yHEeKx9Kegn5X27A" type="6001">
- <layoutConstraint xmi:type="notation:Location" xmi:id="_0mwWpGyHEeKx9Kegn5X27A" y="-20"/>
- </children>
- <children xmi:type="notation:DecorationNode" xmi:id="_0mwWpWyHEeKx9Kegn5X27A" visible="false" type="6002">
- <layoutConstraint xmi:type="notation:Location" xmi:id="_0mwWpmyHEeKx9Kegn5X27A" y="20"/>
- </children>
- <children xmi:type="notation:DecorationNode" xmi:id="_0mwWp2yHEeKx9Kegn5X27A" type="6003">
- <layoutConstraint xmi:type="notation:Location" xmi:id="_0mwWqGyHEeKx9Kegn5X27A" x="-30" y="70"/>
- </children>
- <children xmi:type="notation:DecorationNode" xmi:id="_0mwWqWyHEeKx9Kegn5X27A" visible="false" type="6005">
- <layoutConstraint xmi:type="notation:Location" xmi:id="_0mwWqmyHEeKx9Kegn5X27A" x="26" y="-82"/>
- </children>
- <children xmi:type="notation:DecorationNode" xmi:id="_0mwWq2yHEeKx9Kegn5X27A" type="6033">
- <layoutConstraint xmi:type="notation:Location" xmi:id="_0mwWrGyHEeKx9Kegn5X27A" y="20"/>
- </children>
- <children xmi:type="notation:DecorationNode" xmi:id="_0mwWrWyHEeKx9Kegn5X27A" visible="false" type="6034">
- <layoutConstraint xmi:type="notation:Location" xmi:id="_0mwWrmyHEeKx9Kegn5X27A" y="-20"/>
- </children>
- <styles xmi:type="notation:FontStyle" xmi:id="_0mwWoWyHEeKx9Kegn5X27A" fontName="Segoe UI"/>
- <element xmi:type="uml:Association" href="sashwindowsdi.uml#_mT2jkEJkEd6kIY39uis5Uw"/>
- <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_0mwWomyHEeKx9Kegn5X27A" points="[0, 0, -694, -312]$[333, 150, -361, -162]"/>
- </edges>
- <edges xmi:type="notation:Connector" xmi:id="_ED5DJFViEeWe8LyZrqaAug" type="StereotypeCommentLink" source="_rFD98GyHEeKx9Kegn5X27A" target="_ED5DIFViEeWe8LyZrqaAug">
- <styles xmi:type="notation:FontStyle" xmi:id="_ED5DJVViEeWe8LyZrqaAug"/>
- <styles xmi:type="notation:EObjectValueStyle" xmi:id="_ED5DKVViEeWe8LyZrqaAug" name="BASE_ELEMENT">
- <eObjectValue xmi:type="uml:Class" href="pathmap://UML_METAMODELS/Ecore.metamodel.uml#EObject"/>
- </styles>
- <element xsi:nil="true"/>
- <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_ED5DJlViEeWe8LyZrqaAug" points="[0, 0, 0, 0]$[0, 0, 0, 0]"/>
- <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_ED5DJ1ViEeWe8LyZrqaAug"/>
- <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_ED5DKFViEeWe8LyZrqaAug"/>
- </edges>
- </notation:Diagram>
- <notation:Diagram xmi:id="_0m_xwGyIEeKx9Kegn5X27A" type="PapyrusUMLClassDiagram" name="datatypes" measurementUnit="Pixel">
- <children xmi:type="notation:Shape" xmi:id="_2JyaMGyIEeKx9Kegn5X27A" type="2009" fontName="Segoe UI" lineColor="0">
- <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_2JyaMmyIEeKx9Kegn5X27A" source="ShadowFigure">
- <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_2JyaM2yIEeKx9Kegn5X27A" key="ShadowFigure_Value" value="false"/>
- </eAnnotations>
- <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_2JyaNGyIEeKx9Kegn5X27A" source="displayNameLabelIcon">
- <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_2JyaNWyIEeKx9Kegn5X27A" key="displayNameLabelIcon_value" value="false"/>
- </eAnnotations>
- <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_2JyaNmyIEeKx9Kegn5X27A" source="QualifiedName">
- <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_2JyaN2yIEeKx9Kegn5X27A" key="QualifiedNameDepth" value="1000"/>
- </eAnnotations>
- <children xmi:type="notation:DecorationNode" xmi:id="_2JyaOGyIEeKx9Kegn5X27A" type="5032"/>
- <children xmi:type="notation:DecorationNode" xmi:id="_D69wolViEeWe8LyZrqaAug" type="8511">
- <layoutConstraint xmi:type="notation:Location" xmi:id="_D69wo1ViEeWe8LyZrqaAug" y="5"/>
- </children>
- <element xmi:type="uml:PrimitiveType" href="sashwindowsdi.uml#_Hkk78EVbEd6g-YgfS2DHrA"/>
- <layoutConstraint xmi:type="notation:Bounds" xmi:id="_2JyaMWyIEeKx9Kegn5X27A" x="120" y="196"/>
- </children>
- <children xmi:type="notation:Shape" xmi:id="_2ldCgGyIEeKx9Kegn5X27A" type="2009" fontName="Segoe UI" lineColor="0">
- <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_2ldCgmyIEeKx9Kegn5X27A" source="ShadowFigure">
- <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_2ldCg2yIEeKx9Kegn5X27A" key="ShadowFigure_Value" value="false"/>
- </eAnnotations>
- <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_2ldChGyIEeKx9Kegn5X27A" source="displayNameLabelIcon">
- <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_2ldChWyIEeKx9Kegn5X27A" key="displayNameLabelIcon_value" value="false"/>
- </eAnnotations>
- <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_2ldChmyIEeKx9Kegn5X27A" source="QualifiedName">
- <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_2ldCh2yIEeKx9Kegn5X27A" key="QualifiedNameDepth" value="1000"/>
- </eAnnotations>
- <children xmi:type="notation:DecorationNode" xmi:id="_2ldCiGyIEeKx9Kegn5X27A" type="5032"/>
- <children xmi:type="notation:DecorationNode" xmi:id="_D69wpFViEeWe8LyZrqaAug" type="8511">
- <layoutConstraint xmi:type="notation:Location" xmi:id="_D69wpVViEeWe8LyZrqaAug" y="5"/>
- </children>
- <element xmi:type="uml:PrimitiveType" href="sashwindowsdi.uml#_A-BP8EVhEd6g-YgfS2DHrA"/>
- <layoutConstraint xmi:type="notation:Bounds" xmi:id="_2ldCgWyIEeKx9Kegn5X27A" x="342" y="192"/>
- </children>
- <children xmi:type="notation:Shape" xmi:id="_28g3oGyIEeKx9Kegn5X27A" type="2009" fontName="Segoe UI" lineColor="0">
- <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_28g3omyIEeKx9Kegn5X27A" source="ShadowFigure">
- <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_28g3o2yIEeKx9Kegn5X27A" key="ShadowFigure_Value" value="false"/>
- </eAnnotations>
- <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_28g3pGyIEeKx9Kegn5X27A" source="displayNameLabelIcon">
- <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_28g3pWyIEeKx9Kegn5X27A" key="displayNameLabelIcon_value" value="false"/>
- </eAnnotations>
- <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_28g3pmyIEeKx9Kegn5X27A" source="QualifiedName">
- <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_28g3p2yIEeKx9Kegn5X27A" key="QualifiedNameDepth" value="1000"/>
- </eAnnotations>
- <children xmi:type="notation:DecorationNode" xmi:id="_28g3qGyIEeKx9Kegn5X27A" type="5032"/>
- <children xmi:type="notation:DecorationNode" xmi:id="_D69wplViEeWe8LyZrqaAug" type="8511">
- <layoutConstraint xmi:type="notation:Location" xmi:id="_D69wp1ViEeWe8LyZrqaAug" y="5"/>
- </children>
- <element xmi:type="uml:PrimitiveType" href="sashwindowsdi.uml#_IEBx4EV4Ed6g-YgfS2DHrA"/>
- <layoutConstraint xmi:type="notation:Bounds" xmi:id="_28g3oWyIEeKx9Kegn5X27A" x="120" y="324"/>
- </children>
- <children xmi:type="notation:Shape" xmi:id="_3hRKgGyIEeKx9Kegn5X27A" type="2009" fontName="Segoe UI" lineColor="0">
- <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_3hRKgmyIEeKx9Kegn5X27A" source="ShadowFigure">
- <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_3hRKg2yIEeKx9Kegn5X27A" key="ShadowFigure_Value" value="false"/>
- </eAnnotations>
- <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_3hRKhGyIEeKx9Kegn5X27A" source="displayNameLabelIcon">
- <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_3hRKhWyIEeKx9Kegn5X27A" key="displayNameLabelIcon_value" value="false"/>
- </eAnnotations>
- <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_3hRKhmyIEeKx9Kegn5X27A" source="QualifiedName">
- <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_3hRKh2yIEeKx9Kegn5X27A" key="QualifiedNameDepth" value="1000"/>
- </eAnnotations>
- <children xmi:type="notation:DecorationNode" xmi:id="_3hRKiGyIEeKx9Kegn5X27A" type="5032"/>
- <children xmi:type="notation:DecorationNode" xmi:id="_D69wqFViEeWe8LyZrqaAug" type="8511">
- <layoutConstraint xmi:type="notation:Location" xmi:id="_D69wqVViEeWe8LyZrqaAug" y="5"/>
- </children>
- <element xmi:type="uml:PrimitiveType" href="sashwindowsdi.uml#_SNSWAEbaEd6g-YgfS2DHrA"/>
- <layoutConstraint xmi:type="notation:Bounds" xmi:id="_3hRKgWyIEeKx9Kegn5X27A" x="344" y="328"/>
- </children>
- <children xmi:type="notation:Shape" xmi:id="_D8v5WVViEeWe8LyZrqaAug" type="StereotypeComment">
- <styles xmi:type="notation:TitleStyle" xmi:id="_D8v5WlViEeWe8LyZrqaAug" showTitle="true"/>
- <styles xmi:type="notation:EObjectValueStyle" xmi:id="_D8v5XFViEeWe8LyZrqaAug" name="BASE_ELEMENT">
- <eObjectValue xmi:type="uml:PrimitiveType" href="sashwindowsdi.uml#_Hkk78EVbEd6g-YgfS2DHrA"/>
- </styles>
- <element xsi:nil="true"/>
- <layoutConstraint xmi:type="notation:Bounds" xmi:id="_D8v5W1ViEeWe8LyZrqaAug" x="320" y="196"/>
- </children>
- <children xmi:type="notation:Shape" xmi:id="_D9MlS1ViEeWe8LyZrqaAug" type="StereotypeComment">
- <styles xmi:type="notation:TitleStyle" xmi:id="_D9MlTFViEeWe8LyZrqaAug" showTitle="true"/>
- <styles xmi:type="notation:EObjectValueStyle" xmi:id="_D9MlTlViEeWe8LyZrqaAug" name="BASE_ELEMENT">
- <eObjectValue xmi:type="uml:PrimitiveType" href="sashwindowsdi.uml#_A-BP8EVhEd6g-YgfS2DHrA"/>
- </styles>
- <element xsi:nil="true"/>
- <layoutConstraint xmi:type="notation:Bounds" xmi:id="_D9MlTVViEeWe8LyZrqaAug" x="542" y="192"/>
- </children>
- <children xmi:type="notation:Shape" xmi:id="_D9fgP1ViEeWe8LyZrqaAug" type="StereotypeComment">
- <styles xmi:type="notation:TitleStyle" xmi:id="_D9fgQFViEeWe8LyZrqaAug" showTitle="true"/>
- <styles xmi:type="notation:EObjectValueStyle" xmi:id="_D9fgQlViEeWe8LyZrqaAug" name="BASE_ELEMENT">
- <eObjectValue xmi:type="uml:PrimitiveType" href="sashwindowsdi.uml#_IEBx4EV4Ed6g-YgfS2DHrA"/>
- </styles>
- <element xsi:nil="true"/>
- <layoutConstraint xmi:type="notation:Bounds" xmi:id="_D9fgQVViEeWe8LyZrqaAug" x="320" y="324"/>
- </children>
- <children xmi:type="notation:Shape" xmi:id="_D-PHE1ViEeWe8LyZrqaAug" type="StereotypeComment">
- <styles xmi:type="notation:TitleStyle" xmi:id="_D-PHFFViEeWe8LyZrqaAug" showTitle="true"/>
- <styles xmi:type="notation:EObjectValueStyle" xmi:id="_D-PHFlViEeWe8LyZrqaAug" name="BASE_ELEMENT">
- <eObjectValue xmi:type="uml:PrimitiveType" href="sashwindowsdi.uml#_SNSWAEbaEd6g-YgfS2DHrA"/>
- </styles>
- <element xsi:nil="true"/>
- <layoutConstraint xmi:type="notation:Bounds" xmi:id="_D-PHFVViEeWe8LyZrqaAug" x="544" y="328"/>
- </children>
- <styles xmi:type="notation:DiagramStyle" xmi:id="_0m_xwWyIEeKx9Kegn5X27A"/>
- <styles xmi:type="notation:StringValueStyle" xmi:id="_D69wqlViEeWe8LyZrqaAug" name="diagram_compatibility_version" stringValue="1.1.0"/>
- <element xmi:type="uml:Model" href="sashwindowsdi.uml#_NuHhwEJVEd6kIY39uis5Uw"/>
- <edges xmi:type="notation:Connector" xmi:id="_D8v5XVViEeWe8LyZrqaAug" type="StereotypeCommentLink" source="_2JyaMGyIEeKx9Kegn5X27A" target="_D8v5WVViEeWe8LyZrqaAug">
- <styles xmi:type="notation:FontStyle" xmi:id="_D8v5XlViEeWe8LyZrqaAug"/>
- <styles xmi:type="notation:EObjectValueStyle" xmi:id="_D8v5YlViEeWe8LyZrqaAug" name="BASE_ELEMENT">
- <eObjectValue xmi:type="uml:PrimitiveType" href="sashwindowsdi.uml#_Hkk78EVbEd6g-YgfS2DHrA"/>
- </styles>
- <element xsi:nil="true"/>
- <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_D8v5X1ViEeWe8LyZrqaAug" points="[0, 0, 0, 0]$[0, 0, 0, 0]"/>
- <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_D8v5YFViEeWe8LyZrqaAug"/>
- <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_D8v5YVViEeWe8LyZrqaAug"/>
- </edges>
- <edges xmi:type="notation:Connector" xmi:id="_D9MlT1ViEeWe8LyZrqaAug" type="StereotypeCommentLink" source="_2ldCgGyIEeKx9Kegn5X27A" target="_D9MlS1ViEeWe8LyZrqaAug">
- <styles xmi:type="notation:FontStyle" xmi:id="_D9MlUFViEeWe8LyZrqaAug"/>
- <styles xmi:type="notation:EObjectValueStyle" xmi:id="_D9MlVFViEeWe8LyZrqaAug" name="BASE_ELEMENT">
- <eObjectValue xmi:type="uml:PrimitiveType" href="sashwindowsdi.uml#_A-BP8EVhEd6g-YgfS2DHrA"/>
- </styles>
- <element xsi:nil="true"/>
- <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_D9MlUVViEeWe8LyZrqaAug" points="[0, 0, 0, 0]$[0, 0, 0, 0]"/>
- <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_D9MlUlViEeWe8LyZrqaAug"/>
- <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_D9MlU1ViEeWe8LyZrqaAug"/>
- </edges>
- <edges xmi:type="notation:Connector" xmi:id="_D9fgQ1ViEeWe8LyZrqaAug" type="StereotypeCommentLink" source="_28g3oGyIEeKx9Kegn5X27A" target="_D9fgP1ViEeWe8LyZrqaAug">
- <styles xmi:type="notation:FontStyle" xmi:id="_D9fgRFViEeWe8LyZrqaAug"/>
- <styles xmi:type="notation:EObjectValueStyle" xmi:id="_D9fgSFViEeWe8LyZrqaAug" name="BASE_ELEMENT">
- <eObjectValue xmi:type="uml:PrimitiveType" href="sashwindowsdi.uml#_IEBx4EV4Ed6g-YgfS2DHrA"/>
- </styles>
- <element xsi:nil="true"/>
- <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_D9fgRVViEeWe8LyZrqaAug" points="[0, 0, 0, 0]$[0, 0, 0, 0]"/>
- <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_D9fgRlViEeWe8LyZrqaAug"/>
- <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_D9fgR1ViEeWe8LyZrqaAug"/>
- </edges>
- <edges xmi:type="notation:Connector" xmi:id="_D-PHF1ViEeWe8LyZrqaAug" type="StereotypeCommentLink" source="_3hRKgGyIEeKx9Kegn5X27A" target="_D-PHE1ViEeWe8LyZrqaAug">
- <styles xmi:type="notation:FontStyle" xmi:id="_D-PHGFViEeWe8LyZrqaAug"/>
- <styles xmi:type="notation:EObjectValueStyle" xmi:id="_D-PHHFViEeWe8LyZrqaAug" name="BASE_ELEMENT">
- <eObjectValue xmi:type="uml:PrimitiveType" href="sashwindowsdi.uml#_SNSWAEbaEd6g-YgfS2DHrA"/>
- </styles>
- <element xsi:nil="true"/>
- <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_D-PHGVViEeWe8LyZrqaAug" points="[0, 0, 0, 0]$[0, 0, 0, 0]"/>
- <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_D-PHGlViEeWe8LyZrqaAug"/>
- <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_D-PHG1ViEeWe8LyZrqaAug"/>
- </edges>
- </notation:Diagram>
- <notation:Diagram xmi:id="_lk72EG8gEeKx9Kegn5X27A" type="PapyrusUMLClassDiagram" name="ClassDiagram" measurementUnit="Pixel">
- <styles xmi:type="notation:DiagramStyle" xmi:id="_lk72EW8gEeKx9Kegn5X27A"/>
- <styles xmi:type="notation:StringValueStyle" xmi:id="_D57O0FViEeWe8LyZrqaAug" name="diagram_compatibility_version" stringValue="1.1.0"/>
- <element xmi:type="uml:Model" href="sashwindowsdi.uml#_NuHhwEJVEd6kIY39uis5Uw"/>
- </notation:Diagram>
-</xmi:XMI>
+<?xml version="1.0" encoding="UTF-8"?>
+<xmi:XMI xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" xmlns:notation="http://www.eclipse.org/gmf/runtime/1.0.2/notation" xmlns:uml="http://www.eclipse.org/uml2/5.0.0/UML">
+ <notation:Diagram xmi:id="_xRNpEGyFEeKx9Kegn5X27A" type="PapyrusUMLClassDiagram" name="overview" measurementUnit="Pixel">
+ <children xmi:type="notation:Shape" xmi:id="_z0HqsGyFEeKx9Kegn5X27A" type="2008" fontName="Segoe UI" lineColor="0">
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_z0RbsGyFEeKx9Kegn5X27A" source="ShadowFigure">
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_z0RbsWyFEeKx9Kegn5X27A" key="ShadowFigure_Value" value="false"/>
+ </eAnnotations>
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_z0RbsmyFEeKx9Kegn5X27A" source="displayNameLabelIcon">
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_z0Rbs2yFEeKx9Kegn5X27A" key="displayNameLabelIcon_value" value="false"/>
+ </eAnnotations>
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_z0RbtGyFEeKx9Kegn5X27A" source="QualifiedName">
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_z0RbtWyFEeKx9Kegn5X27A" key="QualifiedNameDepth" value="1000"/>
+ </eAnnotations>
+ <children xmi:type="notation:DecorationNode" xmi:id="_z0RbtmyFEeKx9Kegn5X27A" type="5029"/>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_z0Rbt2yFEeKx9Kegn5X27A" type="7017">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_z0RbuGyFEeKx9Kegn5X27A"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_z0RbuWyFEeKx9Kegn5X27A"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_z0RbumyFEeKx9Kegn5X27A"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_z0Rbu2yFEeKx9Kegn5X27A"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_z0RbvGyFEeKx9Kegn5X27A" type="7018">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_z0RbvWyFEeKx9Kegn5X27A"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_z0RbvmyFEeKx9Kegn5X27A"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_z0Rbv2yFEeKx9Kegn5X27A"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_z0RbwGyFEeKx9Kegn5X27A"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_z0RbwWyFEeKx9Kegn5X27A" type="7019">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_z0RbwmyFEeKx9Kegn5X27A"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_z0Rbw2yFEeKx9Kegn5X27A"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_z0RbxGyFEeKx9Kegn5X27A"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_z0RbxWyFEeKx9Kegn5X27A"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_Dd9EgFViEeWe8LyZrqaAug" type="8510">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_Dd9EgVViEeWe8LyZrqaAug" y="5"/>
+ </children>
+ <element xmi:type="uml:Class" href="sashwindowsdi.uml#_Xa5wIEJVEd6kIY39uis5Uw"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_z0HqsWyFEeKx9Kegn5X27A" x="498" y="216"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_z1T9gGyFEeKx9Kegn5X27A" type="2008" fontName="Segoe UI" lineColor="0">
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_z1T9gmyFEeKx9Kegn5X27A" source="ShadowFigure">
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_z1T9g2yFEeKx9Kegn5X27A" key="ShadowFigure_Value" value="false"/>
+ </eAnnotations>
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_z1T9hGyFEeKx9Kegn5X27A" source="displayNameLabelIcon">
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_z1T9hWyFEeKx9Kegn5X27A" key="displayNameLabelIcon_value" value="false"/>
+ </eAnnotations>
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_z1T9hmyFEeKx9Kegn5X27A" source="QualifiedName">
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_z1T9h2yFEeKx9Kegn5X27A" key="QualifiedNameDepth" value="1000"/>
+ </eAnnotations>
+ <children xmi:type="notation:DecorationNode" xmi:id="_z1T9iGyFEeKx9Kegn5X27A" type="5029"/>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_z1T9iWyFEeKx9Kegn5X27A" type="7017">
+ <children xmi:type="notation:Shape" xmi:id="_eGgOoJUXEeWeT68xCjxnSQ" type="3012">
+ <element xmi:type="uml:Property" href="sashwindowsdi.uml#_eF-DIJUXEeWeT68xCjxnSQ"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_eGgOoZUXEeWeT68xCjxnSQ"/>
+ </children>
+ <styles xmi:type="notation:TitleStyle" xmi:id="_z1T9imyFEeKx9Kegn5X27A"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_z1T9i2yFEeKx9Kegn5X27A"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_z1T9jGyFEeKx9Kegn5X27A"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_z1T9jWyFEeKx9Kegn5X27A"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_z1T9jmyFEeKx9Kegn5X27A" type="7018">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_z1T9j2yFEeKx9Kegn5X27A"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_z1T9kGyFEeKx9Kegn5X27A"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_z1T9kWyFEeKx9Kegn5X27A"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_z1T9kmyFEeKx9Kegn5X27A"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_z1T9k2yFEeKx9Kegn5X27A" type="7019">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_z1T9lGyFEeKx9Kegn5X27A"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_z1T9lWyFEeKx9Kegn5X27A"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_z1T9lmyFEeKx9Kegn5X27A"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_z1T9l2yFEeKx9Kegn5X27A"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_Dd9EglViEeWe8LyZrqaAug" type="8510">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_Dd9Eg1ViEeWe8LyZrqaAug" y="5"/>
+ </children>
+ <element xmi:type="uml:Class" href="sashwindowsdi.uml#_UiIMMEJVEd6kIY39uis5Uw"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_z1T9gWyFEeKx9Kegn5X27A" x="229" y="215"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_4bTRMGyFEeKx9Kegn5X27A" type="2008" fontName="Segoe UI" lineColor="0">
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_4bTRMmyFEeKx9Kegn5X27A" source="ShadowFigure">
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_4bTRM2yFEeKx9Kegn5X27A" key="ShadowFigure_Value" value="false"/>
+ </eAnnotations>
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_4bcbIGyFEeKx9Kegn5X27A" source="displayNameLabelIcon">
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_4bcbIWyFEeKx9Kegn5X27A" key="displayNameLabelIcon_value" value="false"/>
+ </eAnnotations>
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_4bcbImyFEeKx9Kegn5X27A" source="QualifiedName">
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_4bcbI2yFEeKx9Kegn5X27A" key="QualifiedNameDepth" value="1000"/>
+ </eAnnotations>
+ <children xmi:type="notation:DecorationNode" xmi:id="_4bcbJGyFEeKx9Kegn5X27A" type="5029"/>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_4bcbJWyFEeKx9Kegn5X27A" type="7017">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_4bcbJmyFEeKx9Kegn5X27A"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_4bcbJ2yFEeKx9Kegn5X27A"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_4bcbKGyFEeKx9Kegn5X27A"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_4bcbKWyFEeKx9Kegn5X27A"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_4bcbKmyFEeKx9Kegn5X27A" type="7018">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_4bcbK2yFEeKx9Kegn5X27A"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_4bcbLGyFEeKx9Kegn5X27A"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_4bcbLWyFEeKx9Kegn5X27A"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_4bcbLmyFEeKx9Kegn5X27A"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_4bcbL2yFEeKx9Kegn5X27A" type="7019">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_4bcbMGyFEeKx9Kegn5X27A"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_4bcbMWyFEeKx9Kegn5X27A"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_4bcbMmyFEeKx9Kegn5X27A"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_4bcbM2yFEeKx9Kegn5X27A"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_Dd9EhFViEeWe8LyZrqaAug" type="8510">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_Dd9EhVViEeWe8LyZrqaAug" y="5"/>
+ </children>
+ <element xmi:type="uml:Class" href="sashwindowsdi.uml#_fbWYgEJVEd6kIY39uis5Uw"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_4bTRMWyFEeKx9Kegn5X27A" x="936" y="222"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_6BzU8GyFEeKx9Kegn5X27A" type="2008" fontName="Segoe UI" lineColor="0">
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_6BzU8myFEeKx9Kegn5X27A" source="ShadowFigure">
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_6BzU82yFEeKx9Kegn5X27A" key="ShadowFigure_Value" value="false"/>
+ </eAnnotations>
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_6BzU9GyFEeKx9Kegn5X27A" source="displayNameLabelIcon">
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_6BzU9WyFEeKx9Kegn5X27A" key="displayNameLabelIcon_value" value="false"/>
+ </eAnnotations>
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_6BzU9myFEeKx9Kegn5X27A" source="QualifiedName">
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_6BzU92yFEeKx9Kegn5X27A" key="QualifiedNameDepth" value="1000"/>
+ </eAnnotations>
+ <children xmi:type="notation:DecorationNode" xmi:id="_6BzU-GyFEeKx9Kegn5X27A" type="5029"/>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_6BzU-WyFEeKx9Kegn5X27A" type="7017">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_6BzU-myFEeKx9Kegn5X27A"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_6BzU-2yFEeKx9Kegn5X27A"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_6BzU_GyFEeKx9Kegn5X27A"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_6BzU_WyFEeKx9Kegn5X27A"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_6BzU_myFEeKx9Kegn5X27A" type="7018">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_6BzU_2yFEeKx9Kegn5X27A"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_6BzVAGyFEeKx9Kegn5X27A"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_6BzVAWyFEeKx9Kegn5X27A"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_6BzVAmyFEeKx9Kegn5X27A"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_6BzVA2yFEeKx9Kegn5X27A" type="7019">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_6BzVBGyFEeKx9Kegn5X27A"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_6BzVBWyFEeKx9Kegn5X27A"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_6BzVBmyFEeKx9Kegn5X27A"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_6BzVB2yFEeKx9Kegn5X27A"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_Dd9EhlViEeWe8LyZrqaAug" type="8510">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_Dd9Eh1ViEeWe8LyZrqaAug" y="5"/>
+ </children>
+ <element xmi:type="uml:Class" href="sashwindowsdi.uml#_Zx2ZYEJVEd6kIY39uis5Uw"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_6BzU8WyFEeKx9Kegn5X27A" x="936" y="48"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_6Ci70GyFEeKx9Kegn5X27A" type="2008" fontName="Segoe UI" lineColor="0">
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_6Ci70myFEeKx9Kegn5X27A" source="ShadowFigure">
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_6Ci702yFEeKx9Kegn5X27A" key="ShadowFigure_Value" value="false"/>
+ </eAnnotations>
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_6Ci71GyFEeKx9Kegn5X27A" source="displayNameLabelIcon">
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_6Ci71WyFEeKx9Kegn5X27A" key="displayNameLabelIcon_value" value="false"/>
+ </eAnnotations>
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_6Ci71myFEeKx9Kegn5X27A" source="QualifiedName">
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_6Ci712yFEeKx9Kegn5X27A" key="QualifiedNameDepth" value="1000"/>
+ </eAnnotations>
+ <children xmi:type="notation:DecorationNode" xmi:id="_6Ci72GyFEeKx9Kegn5X27A" type="5029"/>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_6Ci72WyFEeKx9Kegn5X27A" type="7017">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_6Ci72myFEeKx9Kegn5X27A"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_6Ci722yFEeKx9Kegn5X27A"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_6Ci73GyFEeKx9Kegn5X27A"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_6Ci73WyFEeKx9Kegn5X27A"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_6Ci73myFEeKx9Kegn5X27A" type="7018">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_6Ci732yFEeKx9Kegn5X27A"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_6Ci74GyFEeKx9Kegn5X27A"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_6Ci74WyFEeKx9Kegn5X27A"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_6Ci74myFEeKx9Kegn5X27A"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_6Ci742yFEeKx9Kegn5X27A" type="7019">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_6Ci75GyFEeKx9Kegn5X27A"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_6Ci75WyFEeKx9Kegn5X27A"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_6Ci75myFEeKx9Kegn5X27A"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_6Ci752yFEeKx9Kegn5X27A"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_Dd9EiFViEeWe8LyZrqaAug" type="8510">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_Dd9EiVViEeWe8LyZrqaAug" y="5"/>
+ </children>
+ <element xmi:type="uml:Class" href="sashwindowsdi.uml#_86BAgEJWEd6kIY39uis5Uw"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_6Ci70WyFEeKx9Kegn5X27A" x="726" y="48"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_6knuIGyFEeKx9Kegn5X27A" type="2008" fontName="Segoe UI" lineColor="0">
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_6knuImyFEeKx9Kegn5X27A" source="ShadowFigure">
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_6knuI2yFEeKx9Kegn5X27A" key="ShadowFigure_Value" value="false"/>
+ </eAnnotations>
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_6knuJGyFEeKx9Kegn5X27A" source="displayNameLabelIcon">
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_6knuJWyFEeKx9Kegn5X27A" key="displayNameLabelIcon_value" value="false"/>
+ </eAnnotations>
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_6knuJmyFEeKx9Kegn5X27A" source="QualifiedName">
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_6knuJ2yFEeKx9Kegn5X27A" key="QualifiedNameDepth" value="1000"/>
+ </eAnnotations>
+ <children xmi:type="notation:DecorationNode" xmi:id="_6knuKGyFEeKx9Kegn5X27A" type="5029"/>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_6knuKWyFEeKx9Kegn5X27A" type="7017">
+ <children xmi:type="notation:Shape" xmi:id="_RHjtwFViEeWe8LyZrqaAug" type="3012">
+ <element xmi:type="uml:Property" href="sashwindowsdi.uml#_RGhL8FViEeWe8LyZrqaAug"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_RHjtwVViEeWe8LyZrqaAug"/>
+ </children>
+ <styles xmi:type="notation:TitleStyle" xmi:id="_6knuKmyFEeKx9Kegn5X27A"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_6knuK2yFEeKx9Kegn5X27A"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_6knuLGyFEeKx9Kegn5X27A"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_6knuLWyFEeKx9Kegn5X27A"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_6knuLmyFEeKx9Kegn5X27A" type="7018">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_6knuL2yFEeKx9Kegn5X27A"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_6knuMGyFEeKx9Kegn5X27A"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_6knuMWyFEeKx9Kegn5X27A"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_6knuMmyFEeKx9Kegn5X27A"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_6knuM2yFEeKx9Kegn5X27A" type="7019">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_6knuNGyFEeKx9Kegn5X27A"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_6knuNWyFEeKx9Kegn5X27A"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_6knuNmyFEeKx9Kegn5X27A"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_6knuN2yFEeKx9Kegn5X27A"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_Dd9EilViEeWe8LyZrqaAug" type="8510">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_Dd9Ei1ViEeWe8LyZrqaAug" y="5"/>
+ </children>
+ <element xmi:type="uml:Class" href="sashwindowsdi.uml#_h_HVwEJVEd6kIY39uis5Uw"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_6knuIWyFEeKx9Kegn5X27A" x="909" y="522"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_CZQIEGyGEeKx9Kegn5X27A" type="2008" fontName="Segoe UI" lineColor="0">
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_CZQIEmyGEeKx9Kegn5X27A" source="ShadowFigure">
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_CZQIE2yGEeKx9Kegn5X27A" key="ShadowFigure_Value" value="false"/>
+ </eAnnotations>
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_CZQIFGyGEeKx9Kegn5X27A" source="displayNameLabelIcon">
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_CZQIFWyGEeKx9Kegn5X27A" key="displayNameLabelIcon_value" value="false"/>
+ </eAnnotations>
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_CZQIFmyGEeKx9Kegn5X27A" source="QualifiedName">
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_CZQIF2yGEeKx9Kegn5X27A" key="QualifiedNameDepth" value="1000"/>
+ </eAnnotations>
+ <children xmi:type="notation:DecorationNode" xmi:id="_CZQIGGyGEeKx9Kegn5X27A" type="5029"/>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_CZQIGWyGEeKx9Kegn5X27A" type="7017">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_CZQIGmyGEeKx9Kegn5X27A"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_CZQIG2yGEeKx9Kegn5X27A"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_CZQIHGyGEeKx9Kegn5X27A"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_CZQIHWyGEeKx9Kegn5X27A"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_CZQIHmyGEeKx9Kegn5X27A" type="7018">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_CZQIH2yGEeKx9Kegn5X27A"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_CZQIIGyGEeKx9Kegn5X27A"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_CZQIIWyGEeKx9Kegn5X27A"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_CZQIImyGEeKx9Kegn5X27A"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_CZQII2yGEeKx9Kegn5X27A" type="7019">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_CZQIJGyGEeKx9Kegn5X27A"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_CZQIJWyGEeKx9Kegn5X27A"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_CZQIJmyGEeKx9Kegn5X27A"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_CZQIJ2yGEeKx9Kegn5X27A"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_Dd9EjFViEeWe8LyZrqaAug" type="8510">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_Dd9EjVViEeWe8LyZrqaAug" y="5"/>
+ </children>
+ <element xmi:type="uml:Class" href="sashwindowsdi.uml#_eE7YIEJVEd6kIY39uis5Uw"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_CZQIEWyGEeKx9Kegn5X27A" x="732" y="216"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_QHBfoGyGEeKx9Kegn5X27A" type="2008" fontName="Segoe UI" lineColor="0">
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_QHBfomyGEeKx9Kegn5X27A" source="ShadowFigure">
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_QHBfo2yGEeKx9Kegn5X27A" key="ShadowFigure_Value" value="false"/>
+ </eAnnotations>
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_QHBfpGyGEeKx9Kegn5X27A" source="displayNameLabelIcon">
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_QHBfpWyGEeKx9Kegn5X27A" key="displayNameLabelIcon_value" value="false"/>
+ </eAnnotations>
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_QHBfpmyGEeKx9Kegn5X27A" source="QualifiedName">
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_QHBfp2yGEeKx9Kegn5X27A" key="QualifiedNameDepth" value="1000"/>
+ </eAnnotations>
+ <children xmi:type="notation:DecorationNode" xmi:id="_QHKpkGyGEeKx9Kegn5X27A" type="5029"/>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_QHKpkWyGEeKx9Kegn5X27A" type="7017">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_QHKpkmyGEeKx9Kegn5X27A"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_QHKpk2yGEeKx9Kegn5X27A"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_QHKplGyGEeKx9Kegn5X27A"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_QHKplWyGEeKx9Kegn5X27A"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_QHKplmyGEeKx9Kegn5X27A" type="7018">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_QHKpl2yGEeKx9Kegn5X27A"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_QHKpmGyGEeKx9Kegn5X27A"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_QHKpmWyGEeKx9Kegn5X27A"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_QHKpmmyGEeKx9Kegn5X27A"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_QHKpm2yGEeKx9Kegn5X27A" type="7019">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_QHKpnGyGEeKx9Kegn5X27A"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_QHKpnWyGEeKx9Kegn5X27A"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_QHKpnmyGEeKx9Kegn5X27A"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_QHKpn2yGEeKx9Kegn5X27A"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_Dd9EjlViEeWe8LyZrqaAug" type="8510">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_Dd9Ej1ViEeWe8LyZrqaAug" y="5"/>
+ </children>
+ <element xmi:type="uml:Class" href="sashwindowsdi.uml#_b7a4cEMaEd6kIY39uis5Uw"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_QHBfoWyGEeKx9Kegn5X27A" x="294" y="516"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_eHZDEGyGEeKx9Kegn5X27A" type="2008" fontName="Segoe UI" lineColor="0">
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_eHZDEmyGEeKx9Kegn5X27A" source="ShadowFigure">
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_eHZDE2yGEeKx9Kegn5X27A" key="ShadowFigure_Value" value="false"/>
+ </eAnnotations>
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_eHZDFGyGEeKx9Kegn5X27A" source="displayNameLabelIcon">
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_eHZDFWyGEeKx9Kegn5X27A" key="displayNameLabelIcon_value" value="false"/>
+ </eAnnotations>
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_eHZDFmyGEeKx9Kegn5X27A" source="QualifiedName">
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_eHZDF2yGEeKx9Kegn5X27A" key="QualifiedNameDepth" value="1000"/>
+ </eAnnotations>
+ <children xmi:type="notation:DecorationNode" xmi:id="_eHZDGGyGEeKx9Kegn5X27A" type="5029"/>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_eHZDGWyGEeKx9Kegn5X27A" type="7017">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_eHZDGmyGEeKx9Kegn5X27A"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_eHZDG2yGEeKx9Kegn5X27A"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_eHZDHGyGEeKx9Kegn5X27A"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_eHZDHWyGEeKx9Kegn5X27A"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_eHZDHmyGEeKx9Kegn5X27A" type="7018">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_eHZDH2yGEeKx9Kegn5X27A"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_eHZDIGyGEeKx9Kegn5X27A"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_eHZDIWyGEeKx9Kegn5X27A"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_eHZDImyGEeKx9Kegn5X27A"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_eHZDI2yGEeKx9Kegn5X27A" type="7019">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_eHZDJGyGEeKx9Kegn5X27A"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_eHZDJWyGEeKx9Kegn5X27A"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_eHZDJmyGEeKx9Kegn5X27A"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_eHZDJ2yGEeKx9Kegn5X27A"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_Dd9EkFViEeWe8LyZrqaAug" type="8510">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_Dd9EkVViEeWe8LyZrqaAug" y="5"/>
+ </children>
+ <element xmi:type="uml:Class" href="sashwindowsdi.uml#_-9vywEMaEd6kIY39uis5Uw"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_eHZDEWyGEeKx9Kegn5X27A" x="24" y="222"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="__nlxYGyIEeKx9Kegn5X27A" type="2008" fontName="Segoe UI" lineColor="0">
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="__nlxYmyIEeKx9Kegn5X27A" source="ShadowFigure">
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="__nlxY2yIEeKx9Kegn5X27A" key="ShadowFigure_Value" value="false"/>
+ </eAnnotations>
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="__nlxZGyIEeKx9Kegn5X27A" source="displayNameLabelIcon">
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="__nlxZWyIEeKx9Kegn5X27A" key="displayNameLabelIcon_value" value="false"/>
+ </eAnnotations>
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="__nlxZmyIEeKx9Kegn5X27A" source="QualifiedName">
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="__nlxZ2yIEeKx9Kegn5X27A" key="QualifiedNameDepth" value="1000"/>
+ </eAnnotations>
+ <children xmi:type="notation:DecorationNode" xmi:id="__nlxaGyIEeKx9Kegn5X27A" type="5029"/>
+ <children xmi:type="notation:BasicCompartment" xmi:id="__nlxaWyIEeKx9Kegn5X27A" type="7017">
+ <styles xmi:type="notation:TitleStyle" xmi:id="__nlxamyIEeKx9Kegn5X27A"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="__nlxa2yIEeKx9Kegn5X27A"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="__nlxbGyIEeKx9Kegn5X27A"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="__nlxbWyIEeKx9Kegn5X27A"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="__nlxbmyIEeKx9Kegn5X27A" type="7018">
+ <styles xmi:type="notation:TitleStyle" xmi:id="__nlxb2yIEeKx9Kegn5X27A"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="__nlxcGyIEeKx9Kegn5X27A"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="__nlxcWyIEeKx9Kegn5X27A"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="__nlxcmyIEeKx9Kegn5X27A"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="__nlxc2yIEeKx9Kegn5X27A" type="7019">
+ <styles xmi:type="notation:TitleStyle" xmi:id="__nlxdGyIEeKx9Kegn5X27A"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="__nlxdWyIEeKx9Kegn5X27A"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="__nlxdmyIEeKx9Kegn5X27A"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="__nlxd2yIEeKx9Kegn5X27A"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_Dd9EklViEeWe8LyZrqaAug" type="8510">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_Dd9Ek1ViEeWe8LyZrqaAug" y="5"/>
+ </children>
+ <element xmi:type="uml:Class" href="pathmap://UML_METAMODELS/Ecore.metamodel.uml#EObject"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="__nlxYWyIEeKx9Kegn5X27A" x="1216" y="522"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_D03IoFViEeWe8LyZrqaAug" type="StereotypeComment">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_D03IoVViEeWe8LyZrqaAug" showTitle="true"/>
+ <styles xmi:type="notation:EObjectValueStyle" xmi:id="_D03Io1ViEeWe8LyZrqaAug" name="BASE_ELEMENT">
+ <eObjectValue xmi:type="uml:Class" href="pathmap://UML_METAMODELS/Ecore.metamodel.uml#EObject"/>
+ </styles>
+ <element xsi:nil="true"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_D03IolViEeWe8LyZrqaAug" x="1334" y="522"/>
+ </children>
+ <styles xmi:type="notation:DiagramStyle" xmi:id="_xRNpEWyFEeKx9Kegn5X27A"/>
+ <styles xmi:type="notation:StringValueStyle" xmi:id="_Dd9ElFViEeWe8LyZrqaAug" name="diagram_compatibility_version" stringValue="1.1.0"/>
+ <element xmi:type="uml:Model" href="sashwindowsdi.uml#_NuHhwEJVEd6kIY39uis5Uw"/>
+ <edges xmi:type="notation:Connector" xmi:id="_z3ZoMGyFEeKx9Kegn5X27A" type="4001" source="_z0HqsGyFEeKx9Kegn5X27A" target="_z1T9gGyFEeKx9Kegn5X27A" lineColor="0">
+ <children xmi:type="notation:DecorationNode" xmi:id="_z3iyIGyFEeKx9Kegn5X27A" type="6001">
+ <styles xmi:type="notation:BooleanValueStyle" xmi:id="_mMjvwJUXEeWeT68xCjxnSQ" name="IS_UPDATED_POSITION" booleanValue="true"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_z3iyIWyFEeKx9Kegn5X27A" y="-20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_z3iyImyFEeKx9Kegn5X27A" visible="false" type="6002">
+ <styles xmi:type="notation:BooleanValueStyle" xmi:id="_mM340JUXEeWeT68xCjxnSQ" name="IS_UPDATED_POSITION" booleanValue="true"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_z3iyI2yFEeKx9Kegn5X27A" y="20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_z3iyJGyFEeKx9Kegn5X27A" type="6003">
+ <styles xmi:type="notation:BooleanValueStyle" xmi:id="_mNMo8JUXEeWeT68xCjxnSQ" name="IS_UPDATED_POSITION" booleanValue="true"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_z3iyJWyFEeKx9Kegn5X27A" x="28" y="-20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_z3iyJmyFEeKx9Kegn5X27A" visible="false" type="6005">
+ <styles xmi:type="notation:BooleanValueStyle" xmi:id="_mNhZEJUXEeWeT68xCjxnSQ" name="IS_UPDATED_POSITION" booleanValue="true"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_z3iyJ2yFEeKx9Kegn5X27A" x="-6" y="20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_z3iyKGyFEeKx9Kegn5X27A" type="6033">
+ <styles xmi:type="notation:BooleanValueStyle" xmi:id="_mN3XUJUXEeWeT68xCjxnSQ" name="IS_UPDATED_POSITION" booleanValue="true"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_z3iyKWyFEeKx9Kegn5X27A" x="6" y="20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_z3iyKmyFEeKx9Kegn5X27A" type="6034">
+ <styles xmi:type="notation:BooleanValueStyle" xmi:id="_mOMHcJUXEeWeT68xCjxnSQ" name="IS_UPDATED_POSITION" booleanValue="true"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_z3iyK2yFEeKx9Kegn5X27A" x="-15" y="18"/>
+ </children>
+ <styles xmi:type="notation:FontStyle" xmi:id="_z3ZoMWyFEeKx9Kegn5X27A" fontName="Segoe UI"/>
+ <element xmi:type="uml:Association" href="sashwindowsdi.uml#_9JomUEJVEd6kIY39uis5Uw"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_z3ZoMmyFEeKx9Kegn5X27A" points="[0, 0, 0, 0]$[0, 0, 0, 0]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_mQcKMZUXEeWeT68xCjxnSQ" id="(0.0,0.49)"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_mQcKMpUXEeWeT68xCjxnSQ" id="(1.0,0.5)"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_4cfkAGyFEeKx9Kegn5X27A" type="4001" source="_4bTRMGyFEeKx9Kegn5X27A" target="_z1T9gGyFEeKx9Kegn5X27A" lineColor="0">
+ <children xmi:type="notation:DecorationNode" xmi:id="_4cfkA2yFEeKx9Kegn5X27A" type="6001">
+ <styles xmi:type="notation:BooleanValueStyle" xmi:id="_mOgQgJUXEeWeT68xCjxnSQ" name="IS_UPDATED_POSITION" booleanValue="true"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_4cfkBGyFEeKx9Kegn5X27A" y="-20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_4cfkBWyFEeKx9Kegn5X27A" visible="false" type="6002">
+ <styles xmi:type="notation:BooleanValueStyle" xmi:id="_mO1nsJUXEeWeT68xCjxnSQ" name="IS_UPDATED_POSITION" booleanValue="true"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_4cfkBmyFEeKx9Kegn5X27A" y="20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_4cfkB2yFEeKx9Kegn5X27A" type="6003">
+ <styles xmi:type="notation:BooleanValueStyle" xmi:id="_mPJwwJUXEeWeT68xCjxnSQ" name="IS_UPDATED_POSITION" booleanValue="true"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_4cfkCGyFEeKx9Kegn5X27A" x="75" y="-47"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_4cfkCWyFEeKx9Kegn5X27A" visible="false" type="6005">
+ <styles xmi:type="notation:BooleanValueStyle" xmi:id="_mPcrsJUXEeWeT68xCjxnSQ" name="IS_UPDATED_POSITION" booleanValue="true"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_4cfkCmyFEeKx9Kegn5X27A" x="-16" y="-69"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_4cfkC2yFEeKx9Kegn5X27A" type="6033">
+ <styles xmi:type="notation:BooleanValueStyle" xmi:id="_mPtxcJUXEeWeT68xCjxnSQ" name="IS_UPDATED_POSITION" booleanValue="true"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_4cfkDGyFEeKx9Kegn5X27A" x="103" y="18"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_4cfkDWyFEeKx9Kegn5X27A" type="6034">
+ <styles xmi:type="notation:BooleanValueStyle" xmi:id="_mP-3MJUXEeWeT68xCjxnSQ" name="IS_UPDATED_POSITION" booleanValue="true"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_4cfkDmyFEeKx9Kegn5X27A" x="-16" y="-109"/>
+ </children>
+ <styles xmi:type="notation:FontStyle" xmi:id="_4cfkAWyFEeKx9Kegn5X27A" fontName="Segoe UI"/>
+ <element xmi:type="uml:Association" href="sashwindowsdi.uml#_mT2jkEJkEd6kIY39uis5Uw"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_4cfkAmyFEeKx9Kegn5X27A" points="[936, 306, -643984, -643984]$[758, 444, -643984, -643984]$[325, 444, -643984, -643984]$[321, 315, -643984, -643984]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_mQbjIJUXEeWeT68xCjxnSQ" id="(0.0,0.84)"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_mQcKMJUXEeWeT68xCjxnSQ" id="(0.5423728813559322,1.0)"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_6DldoGyFEeKx9Kegn5X27A" type="4001" source="_6BzU8GyFEeKx9Kegn5X27A" target="_6Ci70GyFEeKx9Kegn5X27A" lineColor="0">
+ <children xmi:type="notation:DecorationNode" xmi:id="_6DvOoGyFEeKx9Kegn5X27A" type="6001">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_6DvOoWyFEeKx9Kegn5X27A" y="-20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_6DvOomyFEeKx9Kegn5X27A" visible="false" type="6002">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_6DvOo2yFEeKx9Kegn5X27A" y="20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_6DvOpGyFEeKx9Kegn5X27A" type="6003">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_6DvOpWyFEeKx9Kegn5X27A" x="25" y="-20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_6DvOpmyFEeKx9Kegn5X27A" type="6005">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_6DvOp2yFEeKx9Kegn5X27A" y="20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_6DvOqGyFEeKx9Kegn5X27A" type="6033">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_6DvOqWyFEeKx9Kegn5X27A" y="20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_6DvOqmyFEeKx9Kegn5X27A" type="6034">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_6DvOq2yFEeKx9Kegn5X27A" y="-20"/>
+ </children>
+ <styles xmi:type="notation:FontStyle" xmi:id="_6DldoWyFEeKx9Kegn5X27A" fontName="Segoe UI"/>
+ <element xmi:type="uml:Association" href="sashwindowsdi.uml#__CVNUEJVEd6kIY39uis5Uw"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_6DldomyFEeKx9Kegn5X27A" points="[0, 0, 0, 0]$[0, 0, 0, 0]"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_6lXVAGyFEeKx9Kegn5X27A" type="4001" source="_6knuIGyFEeKx9Kegn5X27A" target="_4bTRMGyFEeKx9Kegn5X27A" routing="Rectilinear" lineColor="0">
+ <children xmi:type="notation:DecorationNode" xmi:id="_6lXVA2yFEeKx9Kegn5X27A" type="6001">
+ <styles xmi:type="notation:BooleanValueStyle" xmi:id="_y01toJUREeWeT68xCjxnSQ" name="IS_UPDATED_POSITION" booleanValue="true"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_6lXVBGyFEeKx9Kegn5X27A" y="-20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_6lXVBWyFEeKx9Kegn5X27A" visible="false" type="6002">
+ <styles xmi:type="notation:BooleanValueStyle" xmi:id="_y1IBgJUREeWeT68xCjxnSQ" name="IS_UPDATED_POSITION" booleanValue="true"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_6lXVBmyFEeKx9Kegn5X27A" y="20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_6lXVB2yFEeKx9Kegn5X27A" type="6003">
+ <styles xmi:type="notation:BooleanValueStyle" xmi:id="_y1cxoJUREeWeT68xCjxnSQ" name="IS_UPDATED_POSITION" booleanValue="true"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_6lXVCGyFEeKx9Kegn5X27A" x="22" y="-39"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_6lXVCWyFEeKx9Kegn5X27A" type="6005">
+ <styles xmi:type="notation:BooleanValueStyle" xmi:id="_y1xhwJUREeWeT68xCjxnSQ" name="IS_UPDATED_POSITION" booleanValue="true"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_6lXVCmyFEeKx9Kegn5X27A" x="-17" y="32"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_6lXVC2yFEeKx9Kegn5X27A" type="6033">
+ <styles xmi:type="notation:BooleanValueStyle" xmi:id="_y2HgAJUREeWeT68xCjxnSQ" name="IS_UPDATED_POSITION" booleanValue="true"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_6lXVDGyFEeKx9Kegn5X27A" x="31" y="20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_6lXVDWyFEeKx9Kegn5X27A" type="6034">
+ <styles xmi:type="notation:BooleanValueStyle" xmi:id="_y2bpEJUREeWeT68xCjxnSQ" name="IS_UPDATED_POSITION" booleanValue="true"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_6lXVDmyFEeKx9Kegn5X27A" x="-25" y="-30"/>
+ </children>
+ <styles xmi:type="notation:FontStyle" xmi:id="_6lXVAWyFEeKx9Kegn5X27A" fontName="Segoe UI"/>
+ <element xmi:type="uml:Association" href="sashwindowsdi.uml#_AM_CkEJWEd6kIY39uis5Uw"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_6lXVAmyFEeKx9Kegn5X27A" points="[966, 522, -643984, -643984]$[966, 422, -643984, -643984]$[959, 422, -643984, -643984]$[959, 322, -643984, -643984]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_bn3q0FViEeWe8LyZrqaAug" id="(0.3125,0.0)"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_bn3q0VViEeWe8LyZrqaAug" id="(0.23,1.0)"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_-YK4QGyFEeKx9Kegn5X27A" type="4002" source="_z0HqsGyFEeKx9Kegn5X27A" target="_6Ci70GyFEeKx9Kegn5X27A" lineColor="0">
+ <children xmi:type="notation:DecorationNode" xmi:id="_-YK4Q2yFEeKx9Kegn5X27A" type="6007">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_-YK4RGyFEeKx9Kegn5X27A" y="40"/>
+ </children>
+ <styles xmi:type="notation:FontStyle" xmi:id="_-YK4QWyFEeKx9Kegn5X27A" fontName="Segoe UI"/>
+ <element xmi:type="uml:Generalization" href="sashwindowsdi.uml#_95DboEJWEd6kIY39uis5Uw"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_-YK4QmyFEeKx9Kegn5X27A" points="[50, 12, -365, -90]$[365, 89, -50, -13]"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_CaI44GyGEeKx9Kegn5X27A" type="4002" source="_CZQIEGyGEeKx9Kegn5X27A" target="_6BzU8GyFEeKx9Kegn5X27A" lineColor="0">
+ <children xmi:type="notation:DecorationNode" xmi:id="_CaI442yGEeKx9Kegn5X27A" type="6007">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_CaI45GyGEeKx9Kegn5X27A" y="40"/>
+ </children>
+ <styles xmi:type="notation:FontStyle" xmi:id="_CaI44WyGEeKx9Kegn5X27A" fontName="Segoe UI"/>
+ <element xmi:type="uml:Generalization" href="sashwindowsdi.uml#_7VZokEJVEd6kIY39uis5Uw"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_CaI44myGEeKx9Kegn5X27A" points="[0, 0, -753, -562]$[703, 524, -50, -38]"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_C8qXIGyGEeKx9Kegn5X27A" type="4002" source="_CZQIEGyGEeKx9Kegn5X27A" target="_6Ci70GyFEeKx9Kegn5X27A" lineColor="0">
+ <children xmi:type="notation:DecorationNode" xmi:id="_C8qXI2yGEeKx9Kegn5X27A" type="6007">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_C8qXJGyGEeKx9Kegn5X27A" y="40"/>
+ </children>
+ <styles xmi:type="notation:FontStyle" xmi:id="_C8qXIWyGEeKx9Kegn5X27A" fontName="Segoe UI"/>
+ <element xmi:type="uml:Generalization" href="sashwindowsdi.uml#_UH6OsEsDEd6MxdnlcgT3eA"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_C8qXImyGEeKx9Kegn5X27A" points="[36, -50, -315, 432]$[314, -432, -37, 50]"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_HSH7gGyGEeKx9Kegn5X27A" type="4002" source="_4bTRMGyFEeKx9Kegn5X27A" target="_6BzU8GyFEeKx9Kegn5X27A" lineColor="0">
+ <children xmi:type="notation:DecorationNode" xmi:id="_HSRFcGyGEeKx9Kegn5X27A" type="6007">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_HSRFcWyGEeKx9Kegn5X27A" y="40"/>
+ </children>
+ <styles xmi:type="notation:FontStyle" xmi:id="_HSH7gWyGEeKx9Kegn5X27A" fontName="Segoe UI"/>
+ <element xmi:type="uml:Generalization" href="sashwindowsdi.uml#_71vVgEJVEd6kIY39uis5Uw"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_HSH7gmyGEeKx9Kegn5X27A" points="[26, -50, -166, 310]$[165, -310, -27, 50]"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_QH6QcGyGEeKx9Kegn5X27A" type="4001" source="_6knuIGyFEeKx9Kegn5X27A" target="_QHBfoGyGEeKx9Kegn5X27A" lineColor="0">
+ <children xmi:type="notation:DecorationNode" xmi:id="_QH6Qc2yGEeKx9Kegn5X27A" type="6001">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_QH6QdGyGEeKx9Kegn5X27A" y="-20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_QH6QdWyGEeKx9Kegn5X27A" visible="false" type="6002">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_QH6QdmyGEeKx9Kegn5X27A" y="20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_QH6Qd2yGEeKx9Kegn5X27A" type="6003">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_QH6QeGyGEeKx9Kegn5X27A" y="-20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_QH6QeWyGEeKx9Kegn5X27A" type="6005">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_QH6QemyGEeKx9Kegn5X27A" y="20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_QH6Qe2yGEeKx9Kegn5X27A" type="6033">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_QH6QfGyGEeKx9Kegn5X27A" y="20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_QH6QfWyGEeKx9Kegn5X27A" type="6034">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_QH6QfmyGEeKx9Kegn5X27A" y="-20"/>
+ </children>
+ <styles xmi:type="notation:FontStyle" xmi:id="_QH6QcWyGEeKx9Kegn5X27A" fontName="Segoe UI"/>
+ <element xmi:type="uml:Association" href="sashwindowsdi.uml#_viyZUEJZEd6kIY39uis5Uw"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_QH6QcmyGEeKx9Kegn5X27A" points="[-50, -45, 600, 533]$[-650, -578, 0, 0]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_bn3q0lViEeWe8LyZrqaAug" id="(0.0,0.44)"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_bn3q01ViEeWe8LyZrqaAug" id="(1.0,0.5)"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_eIIp8GyGEeKx9Kegn5X27A" type="4001" source="_QHBfoGyGEeKx9Kegn5X27A" target="_eHZDEGyGEeKx9Kegn5X27A" lineColor="0">
+ <children xmi:type="notation:DecorationNode" xmi:id="_eIIp82yGEeKx9Kegn5X27A" type="6001">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_eIIp9GyGEeKx9Kegn5X27A" y="-20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_eIIp9WyGEeKx9Kegn5X27A" visible="false" type="6002">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_eIIp9myGEeKx9Kegn5X27A" y="20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_eIIp92yGEeKx9Kegn5X27A" type="6003">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_eIIp-GyGEeKx9Kegn5X27A" x="-33" y="-26"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_eIIp-WyGEeKx9Kegn5X27A" visible="false" type="6005">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_eIIp-myGEeKx9Kegn5X27A" x="56" y="72"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_eIIp-2yGEeKx9Kegn5X27A" type="6033">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_eIIp_GyGEeKx9Kegn5X27A" y="20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_eIIp_WyGEeKx9Kegn5X27A" type="6034">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_eIIp_myGEeKx9Kegn5X27A" x="56" y="-31"/>
+ </children>
+ <styles xmi:type="notation:FontStyle" xmi:id="_eIIp8WyGEeKx9Kegn5X27A" fontName="Segoe UI"/>
+ <element xmi:type="uml:Association" href="sashwindowsdi.uml#_9k0bgEMbEd6kIY39uis5Uw"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_eIIp8myGEeKx9Kegn5X27A" points="[-50, 0, 207, 294]$[-248, 0, 9, 294]$[-248, -244, 9, 50]"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_fLY2sGyGEeKx9Kegn5X27A" type="4001" source="_z1T9gGyFEeKx9Kegn5X27A" target="_eHZDEGyGEeKx9Kegn5X27A" lineColor="0">
+ <children xmi:type="notation:DecorationNode" xmi:id="_fLY2s2yGEeKx9Kegn5X27A" type="6001">
+ <styles xmi:type="notation:BooleanValueStyle" xmi:id="_mK5i4JUXEeWeT68xCjxnSQ" name="IS_UPDATED_POSITION" booleanValue="true"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_fLY2tGyGEeKx9Kegn5X27A" y="-20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_fLY2tWyGEeKx9Kegn5X27A" visible="false" type="6002">
+ <styles xmi:type="notation:BooleanValueStyle" xmi:id="_mLKooJUXEeWeT68xCjxnSQ" name="IS_UPDATED_POSITION" booleanValue="true"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_fLY2tmyGEeKx9Kegn5X27A" y="20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_fLY2t2yGEeKx9Kegn5X27A" type="6003">
+ <styles xmi:type="notation:BooleanValueStyle" xmi:id="_mLbHUJUXEeWeT68xCjxnSQ" name="IS_UPDATED_POSITION" booleanValue="true"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_fLY2uGyGEeKx9Kegn5X27A" x="37" y="24"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_fLY2uWyGEeKx9Kegn5X27A" visible="false" type="6005">
+ <styles xmi:type="notation:BooleanValueStyle" xmi:id="_mLs0IJUXEeWeT68xCjxnSQ" name="IS_UPDATED_POSITION" booleanValue="true"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_fLY2umyGEeKx9Kegn5X27A" x="-23" y="20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_fLY2u2yGEeKx9Kegn5X27A" type="6033">
+ <styles xmi:type="notation:BooleanValueStyle" xmi:id="_mL_IAJUXEeWeT68xCjxnSQ" name="IS_UPDATED_POSITION" booleanValue="true"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_fLY2vGyGEeKx9Kegn5X27A" x="14" y="-21"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_fLiAoGyGEeKx9Kegn5X27A" type="6034">
+ <styles xmi:type="notation:BooleanValueStyle" xmi:id="_mMSqAJUXEeWeT68xCjxnSQ" name="IS_UPDATED_POSITION" booleanValue="true"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_fLiAoWyGEeKx9Kegn5X27A" x="-23" y="-20"/>
+ </children>
+ <styles xmi:type="notation:FontStyle" xmi:id="_fLY2sWyGEeKx9Kegn5X27A" fontName="Segoe UI"/>
+ <element xmi:type="uml:Association" href="sashwindowsdi.uml#_-EQwkEMbEd6kIY39uis5Uw"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_fLY2smyGEeKx9Kegn5X27A" points="[-21, 50, 92, -220]$[-92, 220, 21, -50]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_mQcKM5UXEeWeT68xCjxnSQ" id="(0.0,0.57)"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_mQcxQJUXEeWeT68xCjxnSQ" id="(1.0,0.5)"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="__ofJQGyIEeKx9Kegn5X27A" type="4001" source="__nlxYGyIEeKx9Kegn5X27A" target="_6knuIGyFEeKx9Kegn5X27A" lineColor="0">
+ <children xmi:type="notation:DecorationNode" xmi:id="__ooTMGyIEeKx9Kegn5X27A" type="6001">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="__ooTMWyIEeKx9Kegn5X27A" y="-20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="__ooTMmyIEeKx9Kegn5X27A" visible="false" type="6002">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="__ooTM2yIEeKx9Kegn5X27A" y="20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="__ooTNGyIEeKx9Kegn5X27A" type="6003">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="__ooTNWyIEeKx9Kegn5X27A" y="-20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="__ooTNmyIEeKx9Kegn5X27A" visible="false" type="6005">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="__ooTN2yIEeKx9Kegn5X27A" y="20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="__ooTOGyIEeKx9Kegn5X27A" type="6033">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="__ooTOWyIEeKx9Kegn5X27A" y="20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="__ooTOmyIEeKx9Kegn5X27A" type="6034">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="__ooTO2yIEeKx9Kegn5X27A" y="-20"/>
+ </children>
+ <styles xmi:type="notation:FontStyle" xmi:id="__ofJQWyIEeKx9Kegn5X27A" fontName="Segoe UI"/>
+ <element xmi:type="uml:Association" href="sashwindowsdi.uml#_b3enUEnjEd6ussMWxXGeXg"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="__ofJQmyIEeKx9Kegn5X27A" points="[0, 0, -986, -572]$[936, 542, -50, -30]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_a3Xa8FViEeWe8LyZrqaAug" id="(0.0,0.4854368932038835)"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_a3Xa8VViEeWe8LyZrqaAug" id="(1.0,0.5)"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_D03IpFViEeWe8LyZrqaAug" type="StereotypeCommentLink" source="__nlxYGyIEeKx9Kegn5X27A" target="_D03IoFViEeWe8LyZrqaAug">
+ <styles xmi:type="notation:FontStyle" xmi:id="_D03IpVViEeWe8LyZrqaAug"/>
+ <styles xmi:type="notation:EObjectValueStyle" xmi:id="_D03IqVViEeWe8LyZrqaAug" name="BASE_ELEMENT">
+ <eObjectValue xmi:type="uml:Class" href="pathmap://UML_METAMODELS/Ecore.metamodel.uml#EObject"/>
+ </styles>
+ <element xsi:nil="true"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_D03IplViEeWe8LyZrqaAug" points="[0, 0, 0, 0]$[0, 0, 0, 0]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_D03Ip1ViEeWe8LyZrqaAug"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_D03IqFViEeWe8LyZrqaAug"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_kigQcJUREeWeT68xCjxnSQ" type="4001" source="_4bTRMGyFEeKx9Kegn5X27A" target="_6knuIGyFEeKx9Kegn5X27A" routing="Rectilinear">
+ <children xmi:type="notation:DecorationNode" xmi:id="_kiiFoJUREeWeT68xCjxnSQ" type="6001">
+ <styles xmi:type="notation:BooleanValueStyle" xmi:id="_qBSNUJUREeWeT68xCjxnSQ" name="IS_UPDATED_POSITION" booleanValue="true"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_kiiFoZUREeWeT68xCjxnSQ" y="-19"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_kiissJUREeWeT68xCjxnSQ" type="6002">
+ <styles xmi:type="notation:BooleanValueStyle" xmi:id="_qBtEEJUREeWeT68xCjxnSQ" name="IS_UPDATED_POSITION" booleanValue="true"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_kiissZUREeWeT68xCjxnSQ" x="1" y="18"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_kiisspUREeWeT68xCjxnSQ" visible="false" type="6003">
+ <styles xmi:type="notation:BooleanValueStyle" xmi:id="_qCIh4JUREeWeT68xCjxnSQ" name="IS_UPDATED_POSITION" booleanValue="true"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_kiiss5UREeWeT68xCjxnSQ" x="34" y="25"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_kiistJUREeWeT68xCjxnSQ" type="6005">
+ <styles xmi:type="notation:BooleanValueStyle" xmi:id="_qCfuQJUREeWeT68xCjxnSQ" name="IS_UPDATED_POSITION" booleanValue="true"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_kiistZUREeWeT68xCjxnSQ" x="-29" y="-50"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_kiistpUREeWeT68xCjxnSQ" type="6033">
+ <styles xmi:type="notation:BooleanValueStyle" xmi:id="_qC26oJUREeWeT68xCjxnSQ" name="IS_UPDATED_POSITION" booleanValue="true"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_kiist5UREeWeT68xCjxnSQ" x="22" y="-16"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_kiisuJUREeWeT68xCjxnSQ" type="6034">
+ <styles xmi:type="notation:BooleanValueStyle" xmi:id="_qDLqwJUREeWeT68xCjxnSQ" name="IS_UPDATED_POSITION" booleanValue="true"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_kiisuZUREeWeT68xCjxnSQ" x="-29" y="21"/>
+ </children>
+ <styles xmi:type="notation:FontStyle" xmi:id="_kigQcZUREeWeT68xCjxnSQ"/>
+ <element xmi:type="uml:Association" href="sashwindowsdi.uml#_kgdpEJUREeWeT68xCjxnSQ"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_kigQcpUREeWeT68xCjxnSQ" points="[1036, 272, -643984, -643984]$[1055, 272, -643984, -643984]$[1055, 522, -643984, -643984]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_kjqHAJUREeWeT68xCjxnSQ" id="(1.0,0.5)"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_kjqHAZUREeWeT68xCjxnSQ" id="(0.91875,0.0)"/>
+ </edges>
+ </notation:Diagram>
+ <notation:Diagram xmi:id="_CCrlsGyHEeKx9Kegn5X27A" type="PapyrusUMLClassDiagram" name="ClassDiagram" measurementUnit="Pixel">
+ <children xmi:type="notation:Shape" xmi:id="_CnIWkGyHEeKx9Kegn5X27A" type="2008" fontName="Segoe UI" lineColor="0">
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_CnIWkWyHEeKx9Kegn5X27A" source="ShadowFigure">
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_CnIWkmyHEeKx9Kegn5X27A" key="ShadowFigure_Value" value="false"/>
+ </eAnnotations>
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_CnIWk2yHEeKx9Kegn5X27A" source="displayNameLabelIcon">
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_CnIWlGyHEeKx9Kegn5X27A" key="displayNameLabelIcon_value" value="false"/>
+ </eAnnotations>
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_CnIWlWyHEeKx9Kegn5X27A" source="QualifiedName">
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_CnIWlmyHEeKx9Kegn5X27A" key="QualifiedNameDepth" value="1000"/>
+ </eAnnotations>
+ <children xmi:type="notation:DecorationNode" xmi:id="_CnIWl2yHEeKx9Kegn5X27A" type="5029"/>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_CnIWmGyHEeKx9Kegn5X27A" type="7017">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_CnIWmWyHEeKx9Kegn5X27A"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_CnIWmmyHEeKx9Kegn5X27A"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_CnIWm2yHEeKx9Kegn5X27A"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_CnIWnGyHEeKx9Kegn5X27A"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_CnIWnWyHEeKx9Kegn5X27A" type="7018">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_CnIWnmyHEeKx9Kegn5X27A"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_CnIWn2yHEeKx9Kegn5X27A"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_CnIWoGyHEeKx9Kegn5X27A"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_CnIWoWyHEeKx9Kegn5X27A"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_CnIWomyHEeKx9Kegn5X27A" type="7019">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_CnIWo2yHEeKx9Kegn5X27A"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_CnIWpGyHEeKx9Kegn5X27A"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_CnIWpWyHEeKx9Kegn5X27A"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_CnIWpmyHEeKx9Kegn5X27A"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_D-iCAFViEeWe8LyZrqaAug" type="8510">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_D-iCAVViEeWe8LyZrqaAug" y="5"/>
+ </children>
+ <element xmi:type="uml:Class" href="sashwindowsdi.uml#_-9vywEMaEd6kIY39uis5Uw"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_CnIWp2yHEeKx9Kegn5X27A" x="34" y="232"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_CnSHmGyHEeKx9Kegn5X27A" type="2008" fontName="Segoe UI" lineColor="0">
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_CnSHmWyHEeKx9Kegn5X27A" source="ShadowFigure">
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_CnSHmmyHEeKx9Kegn5X27A" key="ShadowFigure_Value" value="false"/>
+ </eAnnotations>
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_CnSHm2yHEeKx9Kegn5X27A" source="displayNameLabelIcon">
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_CnSHnGyHEeKx9Kegn5X27A" key="displayNameLabelIcon_value" value="false"/>
+ </eAnnotations>
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_CnSHnWyHEeKx9Kegn5X27A" source="QualifiedName">
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_CnSHnmyHEeKx9Kegn5X27A" key="QualifiedNameDepth" value="1000"/>
+ </eAnnotations>
+ <children xmi:type="notation:DecorationNode" xmi:id="_CnSHn2yHEeKx9Kegn5X27A" type="5029"/>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_CnSHoGyHEeKx9Kegn5X27A" type="7017">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_CnSHoWyHEeKx9Kegn5X27A"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_CnSHomyHEeKx9Kegn5X27A"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_CnSHo2yHEeKx9Kegn5X27A"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_CnSHpGyHEeKx9Kegn5X27A"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_CnSHpWyHEeKx9Kegn5X27A" type="7018">
+ <children xmi:type="notation:Shape" xmi:id="_F9OIoGyHEeKx9Kegn5X27A" type="3013" fontName="Segoe UI" lineColor="0">
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_RjPwkGyHEeKx9Kegn5X27A" source="CustomAppearance_Annotation">
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_TjMPEGyHEeKx9Kegn5X27A" key="CustomAppearance_MaskValue" value="21258"/>
+ </eAnnotations>
+ <element xmi:type="uml:Operation" href="sashwindowsdi.uml#_wdFgUEV4Ed6g-YgfS2DHrA"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_F9OIoWyHEeKx9Kegn5X27A" x="32" y="15"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_F-G5cGyHEeKx9Kegn5X27A" type="3013" fontName="Segoe UI" lineColor="0">
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_RjZhkWyHEeKx9Kegn5X27A" source="CustomAppearance_Annotation">
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_TjMPEWyHEeKx9Kegn5X27A" key="CustomAppearance_MaskValue" value="21258"/>
+ </eAnnotations>
+ <element xmi:type="uml:Operation" href="sashwindowsdi.uml#_m7xPsEa4Ed6g-YgfS2DHrA"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_F-G5cWyHEeKx9Kegn5X27A" x="32" y="15"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_F-2gUGyHEeKx9Kegn5X27A" type="3013" fontName="Segoe UI" lineColor="0">
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_WgzPsGyHEeKx9Kegn5X27A" source="CustomAppearance_Annotation">
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_Xvt54GyHEeKx9Kegn5X27A" key="CustomAppearance_MaskValue" value="21258"/>
+ </eAnnotations>
+ <element xmi:type="uml:Operation" href="sashwindowsdi.uml#_e9ojYEbXEd6g-YgfS2DHrA"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_F-2gUWyHEeKx9Kegn5X27A" x="32" y="15"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_F_mHMGyHEeKx9Kegn5X27A" type="3013" fontName="Segoe UI" lineColor="0">
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_WgzPsmyHEeKx9Kegn5X27A" source="CustomAppearance_Annotation">
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_Xvt54WyHEeKx9Kegn5X27A" key="CustomAppearance_MaskValue" value="21258"/>
+ </eAnnotations>
+ <element xmi:type="uml:Operation" href="sashwindowsdi.uml#_q8zekEbsEd6g-YgfS2DHrA"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_F_mHMWyHEeKx9Kegn5X27A" x="32" y="15"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_GAffEGyHEeKx9Kegn5X27A" type="3013" fontName="Segoe UI" lineColor="0">
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_WgzPtGyHEeKx9Kegn5X27A" source="CustomAppearance_Annotation">
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_Xvt54myHEeKx9Kegn5X27A" key="CustomAppearance_MaskValue" value="21258"/>
+ </eAnnotations>
+ <element xmi:type="uml:Operation" href="sashwindowsdi.uml#_vnqNcEoIEd6ussMWxXGeXg"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_GAffEWyHEeKx9Kegn5X27A" x="32" y="15"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_GBYP4GyHEeKx9Kegn5X27A" type="3013" fontName="Segoe UI" lineColor="0">
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_WgzPtmyHEeKx9Kegn5X27A" source="CustomAppearance_Annotation">
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_Xvt542yHEeKx9Kegn5X27A" key="CustomAppearance_MaskValue" value="21258"/>
+ </eAnnotations>
+ <element xmi:type="uml:Operation" href="sashwindowsdi.uml#_Kvf9cEoJEd6ussMWxXGeXg"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_GBYP4WyHEeKx9Kegn5X27A" x="32" y="15"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_GCRnwGyHEeKx9Kegn5X27A" type="3013" fontName="Segoe UI" lineColor="0">
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_WgzPuGyHEeKx9Kegn5X27A" source="CustomAppearance_Annotation">
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_Xvt55GyHEeKx9Kegn5X27A" key="CustomAppearance_MaskValue" value="21258"/>
+ </eAnnotations>
+ <element xmi:type="uml:Operation" href="sashwindowsdi.uml#_OoMtUEoJEd6ussMWxXGeXg"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_GCRnwWyHEeKx9Kegn5X27A" x="32" y="15"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_GDBOoGyHEeKx9Kegn5X27A" type="3013" fontName="Segoe UI" lineColor="0">
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_WgzPumyHEeKx9Kegn5X27A" source="CustomAppearance_Annotation">
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_Xvt55WyHEeKx9Kegn5X27A" key="CustomAppearance_MaskValue" value="21258"/>
+ </eAnnotations>
+ <element xmi:type="uml:Operation" href="sashwindowsdi.uml#_vaMqoE4OEd-B2uXHu4qMXg"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_GDBOoWyHEeKx9Kegn5X27A" x="32" y="15"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_GDw1gGyHEeKx9Kegn5X27A" type="3013" fontName="Segoe UI" lineColor="0">
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_WgzPvGyHEeKx9Kegn5X27A" source="CustomAppearance_Annotation">
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_Xv3q4GyHEeKx9Kegn5X27A" key="CustomAppearance_MaskValue" value="21258"/>
+ </eAnnotations>
+ <element xmi:type="uml:Operation" href="sashwindowsdi.uml#_-TkSoE4OEd-B2uXHu4qMXg"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_GDw1gWyHEeKx9Kegn5X27A" x="32" y="15"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_GEgcYGyHEeKx9Kegn5X27A" type="3013" fontName="Segoe UI" lineColor="0">
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_WgzPvmyHEeKx9Kegn5X27A" source="CustomAppearance_Annotation">
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_Xv3q4WyHEeKx9Kegn5X27A" key="CustomAppearance_MaskValue" value="21258"/>
+ </eAnnotations>
+ <element xmi:type="uml:Operation" href="sashwindowsdi.uml#_1jUIgE4PEd-B2uXHu4qMXg"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_GEgcYWyHEeKx9Kegn5X27A" x="32" y="15"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_GFQDQGyHEeKx9Kegn5X27A" type="3013" fontName="Segoe UI" lineColor="0">
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_WgzPwGyHEeKx9Kegn5X27A" source="CustomAppearance_Annotation">
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_Xv3q4myHEeKx9Kegn5X27A" key="CustomAppearance_MaskValue" value="21258"/>
+ </eAnnotations>
+ <element xmi:type="uml:Operation" href="sashwindowsdi.uml#_4qi_ME4PEd-B2uXHu4qMXg"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_GFQDQWyHEeKx9Kegn5X27A" x="32" y="15"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_GGJbIGyHEeKx9Kegn5X27A" type="3013" fontName="Segoe UI" lineColor="0">
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_WgzPwmyHEeKx9Kegn5X27A" source="CustomAppearance_Annotation">
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_Xv3q42yHEeKx9Kegn5X27A" key="CustomAppearance_MaskValue" value="21258"/>
+ </eAnnotations>
+ <element xmi:type="uml:Operation" href="sashwindowsdi.uml#_fPvj8FgxEeGNKLzLkykmJw"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_GGJbIWyHEeKx9Kegn5X27A" x="32" y="15"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_zeIgsGySEeKx9Kegn5X27A" type="3013" fontName="Segoe UI" lineColor="0">
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_68TicGySEeKx9Kegn5X27A" source="CustomAppearance_Annotation">
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_7ttKMGySEeKx9Kegn5X27A" key="CustomAppearance_MaskValue" value="21258"/>
+ </eAnnotations>
+ <element xmi:type="uml:Operation" href="sashwindowsdi.uml#_zdr0wGySEeKx9Kegn5X27A"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_zeIgsWySEeKx9Kegn5X27A"/>
+ </children>
+ <styles xmi:type="notation:TitleStyle" xmi:id="_CnSHpmyHEeKx9Kegn5X27A"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_CnSHp2yHEeKx9Kegn5X27A"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_CnSHqGyHEeKx9Kegn5X27A"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_CnSHqWyHEeKx9Kegn5X27A"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_CnSHqmyHEeKx9Kegn5X27A" type="7019">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_CnSHq2yHEeKx9Kegn5X27A"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_CnSHrGyHEeKx9Kegn5X27A"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_CnSHrWyHEeKx9Kegn5X27A"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_CnSHrmyHEeKx9Kegn5X27A"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_D-iCAlViEeWe8LyZrqaAug" type="8510">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_D-iCA1ViEeWe8LyZrqaAug" y="5"/>
+ </children>
+ <element xmi:type="uml:Class" href="sashwindowsdi.uml#_UiIMMEJVEd6kIY39uis5Uw"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_CnSHr2yHEeKx9Kegn5X27A" x="288" y="150"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_CnSH4WyHEeKx9Kegn5X27A" type="2008" fontName="Segoe UI" lineColor="0">
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_CnSH4myHEeKx9Kegn5X27A" source="ShadowFigure">
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_CnSH42yHEeKx9Kegn5X27A" key="ShadowFigure_Value" value="false"/>
+ </eAnnotations>
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_CnSH5GyHEeKx9Kegn5X27A" source="displayNameLabelIcon">
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_CnSH5WyHEeKx9Kegn5X27A" key="displayNameLabelIcon_value" value="false"/>
+ </eAnnotations>
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_CnSH5myHEeKx9Kegn5X27A" source="QualifiedName">
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_CnSH52yHEeKx9Kegn5X27A" key="QualifiedNameDepth" value="1000"/>
+ </eAnnotations>
+ <children xmi:type="notation:DecorationNode" xmi:id="_CnSH6GyHEeKx9Kegn5X27A" type="5029"/>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_CnSH6WyHEeKx9Kegn5X27A" type="7017">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_CnSH6myHEeKx9Kegn5X27A"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_CnSH62yHEeKx9Kegn5X27A"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_CnSH7GyHEeKx9Kegn5X27A"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_CnSH7WyHEeKx9Kegn5X27A"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_CnSH7myHEeKx9Kegn5X27A" type="7018">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_CnSH72yHEeKx9Kegn5X27A"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_CnSH8GyHEeKx9Kegn5X27A"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_CnSH8WyHEeKx9Kegn5X27A"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_CnSH8myHEeKx9Kegn5X27A"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_CnSH82yHEeKx9Kegn5X27A" type="7019">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_CnSH9GyHEeKx9Kegn5X27A"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_CnSH9WyHEeKx9Kegn5X27A"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_CnSH9myHEeKx9Kegn5X27A"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_CnSH92yHEeKx9Kegn5X27A"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_D-iCBFViEeWe8LyZrqaAug" type="8510">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_D-iCBVViEeWe8LyZrqaAug" y="5"/>
+ </children>
+ <element xmi:type="uml:Class" href="sashwindowsdi.uml#_h_HVwEJVEd6kIY39uis5Uw"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_CnSH-GyHEeKx9Kegn5X27A" x="948" y="654"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_CnbRv2yHEeKx9Kegn5X27A" type="2008" fontName="Segoe UI" lineColor="0">
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_CnbRwGyHEeKx9Kegn5X27A" source="ShadowFigure">
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_CnbRwWyHEeKx9Kegn5X27A" key="ShadowFigure_Value" value="false"/>
+ </eAnnotations>
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_CnbRwmyHEeKx9Kegn5X27A" source="displayNameLabelIcon">
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_CnbRw2yHEeKx9Kegn5X27A" key="displayNameLabelIcon_value" value="false"/>
+ </eAnnotations>
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_CnbRxGyHEeKx9Kegn5X27A" source="QualifiedName">
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_CnbRxWyHEeKx9Kegn5X27A" key="QualifiedNameDepth" value="1000"/>
+ </eAnnotations>
+ <children xmi:type="notation:DecorationNode" xmi:id="_CnbRxmyHEeKx9Kegn5X27A" type="5029"/>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_CnbRx2yHEeKx9Kegn5X27A" type="7017">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_CnbRyGyHEeKx9Kegn5X27A"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_CnbRyWyHEeKx9Kegn5X27A"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_CnbRymyHEeKx9Kegn5X27A"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_CnbRy2yHEeKx9Kegn5X27A"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_CnbRzGyHEeKx9Kegn5X27A" type="7018">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_CnbRzWyHEeKx9Kegn5X27A"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_CnbRzmyHEeKx9Kegn5X27A"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_CnbRz2yHEeKx9Kegn5X27A"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_CnbR0GyHEeKx9Kegn5X27A"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_CnbR0WyHEeKx9Kegn5X27A" type="7019">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_CnbR0myHEeKx9Kegn5X27A"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_CnbR02yHEeKx9Kegn5X27A"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_CnbR1GyHEeKx9Kegn5X27A"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_CnbR1WyHEeKx9Kegn5X27A"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_D-iCBlViEeWe8LyZrqaAug" type="8510">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_D-iCB1ViEeWe8LyZrqaAug" y="5"/>
+ </children>
+ <element xmi:type="uml:Class" href="sashwindowsdi.uml#_b7a4cEMaEd6kIY39uis5Uw"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_CnbR1myHEeKx9Kegn5X27A" x="306" y="648"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_rFD98GyHEeKx9Kegn5X27A" type="2008" fontName="Segoe UI" lineColor="0">
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_rFD98myHEeKx9Kegn5X27A" source="ShadowFigure">
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_rFD982yHEeKx9Kegn5X27A" key="ShadowFigure_Value" value="false"/>
+ </eAnnotations>
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_rFD99GyHEeKx9Kegn5X27A" source="displayNameLabelIcon">
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_rFD99WyHEeKx9Kegn5X27A" key="displayNameLabelIcon_value" value="false"/>
+ </eAnnotations>
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_rFD99myHEeKx9Kegn5X27A" source="QualifiedName">
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_rFD992yHEeKx9Kegn5X27A" key="QualifiedNameDepth" value="1000"/>
+ </eAnnotations>
+ <children xmi:type="notation:DecorationNode" xmi:id="_rFD9-GyHEeKx9Kegn5X27A" type="5029"/>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_rFD9-WyHEeKx9Kegn5X27A" type="7017">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_rFD9-myHEeKx9Kegn5X27A"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_rFD9-2yHEeKx9Kegn5X27A"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_rFD9_GyHEeKx9Kegn5X27A"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_rFD9_WyHEeKx9Kegn5X27A"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_rFD9_myHEeKx9Kegn5X27A" type="7018">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_rFD9_2yHEeKx9Kegn5X27A"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_rFD-AGyHEeKx9Kegn5X27A"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_rFD-AWyHEeKx9Kegn5X27A"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_rFD-AmyHEeKx9Kegn5X27A"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_rFD-A2yHEeKx9Kegn5X27A" type="7019">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_rFD-BGyHEeKx9Kegn5X27A"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_rFD-BWyHEeKx9Kegn5X27A"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_rFD-BmyHEeKx9Kegn5X27A"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_rFD-B2yHEeKx9Kegn5X27A"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_D-iCCFViEeWe8LyZrqaAug" type="8510">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_D-iCCVViEeWe8LyZrqaAug" y="5"/>
+ </children>
+ <element xmi:type="uml:Class" href="pathmap://UML_METAMODELS/Ecore.metamodel.uml#EObject"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_rFD98WyHEeKx9Kegn5X27A" x="740" y="794"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_0mKgwGyHEeKx9Kegn5X27A" type="2008" fontName="Segoe UI" lineColor="0">
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_0mKgwmyHEeKx9Kegn5X27A" source="ShadowFigure">
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_0mKgw2yHEeKx9Kegn5X27A" key="ShadowFigure_Value" value="false"/>
+ </eAnnotations>
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_0mKgxGyHEeKx9Kegn5X27A" source="displayNameLabelIcon">
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_0mKgxWyHEeKx9Kegn5X27A" key="displayNameLabelIcon_value" value="false"/>
+ </eAnnotations>
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_0mKgxmyHEeKx9Kegn5X27A" source="QualifiedName">
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_0mKgx2yHEeKx9Kegn5X27A" key="QualifiedNameDepth" value="1000"/>
+ </eAnnotations>
+ <children xmi:type="notation:DecorationNode" xmi:id="_0mKgyGyHEeKx9Kegn5X27A" type="5029"/>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_0mKgyWyHEeKx9Kegn5X27A" type="7017">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_0mKgymyHEeKx9Kegn5X27A"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_0mKgy2yHEeKx9Kegn5X27A"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_0mKgzGyHEeKx9Kegn5X27A"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_0mKgzWyHEeKx9Kegn5X27A"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_0mKgzmyHEeKx9Kegn5X27A" type="7018">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_0mKgz2yHEeKx9Kegn5X27A"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_0mKg0GyHEeKx9Kegn5X27A"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_0mKg0WyHEeKx9Kegn5X27A"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_0mKg0myHEeKx9Kegn5X27A"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_0mKg02yHEeKx9Kegn5X27A" type="7019">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_0mKg1GyHEeKx9Kegn5X27A"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_0mKg1WyHEeKx9Kegn5X27A"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_0mKg1myHEeKx9Kegn5X27A"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_0mKg12yHEeKx9Kegn5X27A"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_D-iCClViEeWe8LyZrqaAug" type="8510">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_D-iCC1ViEeWe8LyZrqaAug" y="5"/>
+ </children>
+ <element xmi:type="uml:Class" href="sashwindowsdi.uml#_fbWYgEJVEd6kIY39uis5Uw"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_0mKgwWyHEeKx9Kegn5X27A" x="780" y="534"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_ED5DIFViEeWe8LyZrqaAug" type="StereotypeComment">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_ED5DIVViEeWe8LyZrqaAug" showTitle="true"/>
+ <styles xmi:type="notation:EObjectValueStyle" xmi:id="_ED5DI1ViEeWe8LyZrqaAug" name="BASE_ELEMENT">
+ <eObjectValue xmi:type="uml:Class" href="pathmap://UML_METAMODELS/Ecore.metamodel.uml#EObject"/>
+ </styles>
+ <element xsi:nil="true"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_ED5DIlViEeWe8LyZrqaAug" x="940" y="794"/>
+ </children>
+ <styles xmi:type="notation:DiagramStyle" xmi:id="_CCrlsWyHEeKx9Kegn5X27A"/>
+ <styles xmi:type="notation:StringValueStyle" xmi:id="_D-iCDFViEeWe8LyZrqaAug" name="diagram_compatibility_version" stringValue="1.1.0"/>
+ <element xmi:type="uml:Model" href="sashwindowsdi.uml#_NuHhwEJVEd6kIY39uis5Uw"/>
+ <edges xmi:type="notation:Connector" xmi:id="_CnIWt2yHEeKx9Kegn5X27A" type="4001" source="_CnSHmGyHEeKx9Kegn5X27A" target="_CnIWkGyHEeKx9Kegn5X27A" lineColor="0">
+ <children xmi:type="notation:DecorationNode" xmi:id="_CnIWuGyHEeKx9Kegn5X27A" type="6001">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_CnIWuWyHEeKx9Kegn5X27A" y="-20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_CnIWumyHEeKx9Kegn5X27A" visible="false" type="6002">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_CnIWu2yHEeKx9Kegn5X27A" y="20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_CnIWvGyHEeKx9Kegn5X27A" type="6003">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_CnIWvWyHEeKx9Kegn5X27A" x="33" y="22"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_CnIWvmyHEeKx9Kegn5X27A" visible="false" type="6005">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_CnIWv2yHEeKx9Kegn5X27A" y="20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_CnIWwGyHEeKx9Kegn5X27A" type="6033">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_CnIWwWyHEeKx9Kegn5X27A" y="20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_CnIWwmyHEeKx9Kegn5X27A" type="6034">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_CnIWw2yHEeKx9Kegn5X27A" y="-20"/>
+ </children>
+ <styles xmi:type="notation:FontStyle" xmi:id="_CnIWxGyHEeKx9Kegn5X27A" fontName="Segoe UI"/>
+ <element xmi:type="uml:Association" href="sashwindowsdi.uml#_-EQwkEMbEd6kIY39uis5Uw"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_CnIWxWyHEeKx9Kegn5X27A" points="[-21, 50, 92, -220]$[-92, 220, 21, -50]"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_CnIWxmyHEeKx9Kegn5X27A" type="4001" source="_CnbRv2yHEeKx9Kegn5X27A" target="_CnIWkGyHEeKx9Kegn5X27A" lineColor="0">
+ <children xmi:type="notation:DecorationNode" xmi:id="_CnIWx2yHEeKx9Kegn5X27A" type="6001">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_CnIWyGyHEeKx9Kegn5X27A" y="-20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_CnIWyWyHEeKx9Kegn5X27A" visible="false" type="6002">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_CnIWymyHEeKx9Kegn5X27A" y="20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_CnIWy2yHEeKx9Kegn5X27A" type="6003">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_CnIWzGyHEeKx9Kegn5X27A" x="-33" y="-26"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_CnIWzWyHEeKx9Kegn5X27A" visible="false" type="6005">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_CnIWzmyHEeKx9Kegn5X27A" x="56" y="72"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_CnIWz2yHEeKx9Kegn5X27A" type="6033">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_CnIW0GyHEeKx9Kegn5X27A" y="20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_CnIW0WyHEeKx9Kegn5X27A" type="6034">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_CnIW0myHEeKx9Kegn5X27A" x="56" y="-31"/>
+ </children>
+ <styles xmi:type="notation:FontStyle" xmi:id="_CnIW02yHEeKx9Kegn5X27A" fontName="Segoe UI"/>
+ <element xmi:type="uml:Association" href="sashwindowsdi.uml#_9k0bgEMbEd6kIY39uis5Uw"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_CnIW1GyHEeKx9Kegn5X27A" points="[-50, 0, 207, 294]$[-248, 0, 9, 294]$[-248, -244, 9, 50]"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_CnSIDWyHEeKx9Kegn5X27A" type="4001" source="_CnSH4WyHEeKx9Kegn5X27A" target="_CnbRv2yHEeKx9Kegn5X27A" lineColor="0">
+ <children xmi:type="notation:DecorationNode" xmi:id="_CnSIDmyHEeKx9Kegn5X27A" type="6001">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_CnSID2yHEeKx9Kegn5X27A" y="-20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_CnSIEGyHEeKx9Kegn5X27A" visible="false" type="6002">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_CnSIEWyHEeKx9Kegn5X27A" y="20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_CnSIEmyHEeKx9Kegn5X27A" type="6003">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_CnSIE2yHEeKx9Kegn5X27A" y="-20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_CnSIFGyHEeKx9Kegn5X27A" type="6005">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_CnSIFWyHEeKx9Kegn5X27A" y="20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_CnSIFmyHEeKx9Kegn5X27A" type="6033">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_CnSIF2yHEeKx9Kegn5X27A" y="20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_CnSIGGyHEeKx9Kegn5X27A" type="6034">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_CnSIGWyHEeKx9Kegn5X27A" y="-20"/>
+ </children>
+ <styles xmi:type="notation:FontStyle" xmi:id="_CnSIGmyHEeKx9Kegn5X27A" fontName="Segoe UI"/>
+ <element xmi:type="uml:Association" href="sashwindowsdi.uml#_viyZUEJZEd6kIY39uis5Uw"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_CnSIG2yHEeKx9Kegn5X27A" points="[-50, -45, 600, 533]$[-650, -578, 0, 0]"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_rGHG0GyHEeKx9Kegn5X27A" type="4001" source="_rFD98GyHEeKx9Kegn5X27A" target="_CnSH4WyHEeKx9Kegn5X27A" lineColor="0">
+ <children xmi:type="notation:DecorationNode" xmi:id="_rGHG02yHEeKx9Kegn5X27A" type="6001">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_rGHG1GyHEeKx9Kegn5X27A" y="-20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_rGHG1WyHEeKx9Kegn5X27A" visible="false" type="6002">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_rGHG1myHEeKx9Kegn5X27A" y="20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_rGHG12yHEeKx9Kegn5X27A" type="6003">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_rGHG2GyHEeKx9Kegn5X27A" y="-20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_rGHG2WyHEeKx9Kegn5X27A" type="6005">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_rGHG2myHEeKx9Kegn5X27A" y="20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_rGHG22yHEeKx9Kegn5X27A" type="6033">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_rGHG3GyHEeKx9Kegn5X27A" y="20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_rGHG3WyHEeKx9Kegn5X27A" type="6034">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_rGHG3myHEeKx9Kegn5X27A" y="-20"/>
+ </children>
+ <styles xmi:type="notation:FontStyle" xmi:id="_rGHG0WyHEeKx9Kegn5X27A" fontName="Segoe UI"/>
+ <element xmi:type="uml:Association" href="sashwindowsdi.uml#_b3enUEnjEd6ussMWxXGeXg"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_rGHG0myHEeKx9Kegn5X27A" points="[0, 0, -996, -582]$[946, 552, -50, -30]"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_0mwWoGyHEeKx9Kegn5X27A" type="4001" source="_0mKgwGyHEeKx9Kegn5X27A" target="_CnSHmGyHEeKx9Kegn5X27A" lineColor="0">
+ <children xmi:type="notation:DecorationNode" xmi:id="_0mwWo2yHEeKx9Kegn5X27A" type="6001">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_0mwWpGyHEeKx9Kegn5X27A" y="-20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_0mwWpWyHEeKx9Kegn5X27A" visible="false" type="6002">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_0mwWpmyHEeKx9Kegn5X27A" y="20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_0mwWp2yHEeKx9Kegn5X27A" type="6003">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_0mwWqGyHEeKx9Kegn5X27A" x="-30" y="70"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_0mwWqWyHEeKx9Kegn5X27A" visible="false" type="6005">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_0mwWqmyHEeKx9Kegn5X27A" x="26" y="-82"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_0mwWq2yHEeKx9Kegn5X27A" type="6033">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_0mwWrGyHEeKx9Kegn5X27A" y="20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_0mwWrWyHEeKx9Kegn5X27A" visible="false" type="6034">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_0mwWrmyHEeKx9Kegn5X27A" y="-20"/>
+ </children>
+ <styles xmi:type="notation:FontStyle" xmi:id="_0mwWoWyHEeKx9Kegn5X27A" fontName="Segoe UI"/>
+ <element xmi:type="uml:Association" href="sashwindowsdi.uml#_mT2jkEJkEd6kIY39uis5Uw"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_0mwWomyHEeKx9Kegn5X27A" points="[0, 0, -694, -312]$[333, 150, -361, -162]"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_ED5DJFViEeWe8LyZrqaAug" type="StereotypeCommentLink" source="_rFD98GyHEeKx9Kegn5X27A" target="_ED5DIFViEeWe8LyZrqaAug">
+ <styles xmi:type="notation:FontStyle" xmi:id="_ED5DJVViEeWe8LyZrqaAug"/>
+ <styles xmi:type="notation:EObjectValueStyle" xmi:id="_ED5DKVViEeWe8LyZrqaAug" name="BASE_ELEMENT">
+ <eObjectValue xmi:type="uml:Class" href="pathmap://UML_METAMODELS/Ecore.metamodel.uml#EObject"/>
+ </styles>
+ <element xsi:nil="true"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_ED5DJlViEeWe8LyZrqaAug" points="[0, 0, 0, 0]$[0, 0, 0, 0]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_ED5DJ1ViEeWe8LyZrqaAug"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_ED5DKFViEeWe8LyZrqaAug"/>
+ </edges>
+ </notation:Diagram>
+ <notation:Diagram xmi:id="_0m_xwGyIEeKx9Kegn5X27A" type="PapyrusUMLClassDiagram" name="datatypes" measurementUnit="Pixel">
+ <children xmi:type="notation:Shape" xmi:id="_2JyaMGyIEeKx9Kegn5X27A" type="2009" fontName="Segoe UI" lineColor="0">
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_2JyaMmyIEeKx9Kegn5X27A" source="ShadowFigure">
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_2JyaM2yIEeKx9Kegn5X27A" key="ShadowFigure_Value" value="false"/>
+ </eAnnotations>
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_2JyaNGyIEeKx9Kegn5X27A" source="displayNameLabelIcon">
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_2JyaNWyIEeKx9Kegn5X27A" key="displayNameLabelIcon_value" value="false"/>
+ </eAnnotations>
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_2JyaNmyIEeKx9Kegn5X27A" source="QualifiedName">
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_2JyaN2yIEeKx9Kegn5X27A" key="QualifiedNameDepth" value="1000"/>
+ </eAnnotations>
+ <children xmi:type="notation:DecorationNode" xmi:id="_2JyaOGyIEeKx9Kegn5X27A" type="5032"/>
+ <children xmi:type="notation:DecorationNode" xmi:id="_D69wolViEeWe8LyZrqaAug" type="8511">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_D69wo1ViEeWe8LyZrqaAug" y="5"/>
+ </children>
+ <element xmi:type="uml:PrimitiveType" href="sashwindowsdi.uml#_Hkk78EVbEd6g-YgfS2DHrA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_2JyaMWyIEeKx9Kegn5X27A" x="120" y="196"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_2ldCgGyIEeKx9Kegn5X27A" type="2009" fontName="Segoe UI" lineColor="0">
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_2ldCgmyIEeKx9Kegn5X27A" source="ShadowFigure">
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_2ldCg2yIEeKx9Kegn5X27A" key="ShadowFigure_Value" value="false"/>
+ </eAnnotations>
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_2ldChGyIEeKx9Kegn5X27A" source="displayNameLabelIcon">
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_2ldChWyIEeKx9Kegn5X27A" key="displayNameLabelIcon_value" value="false"/>
+ </eAnnotations>
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_2ldChmyIEeKx9Kegn5X27A" source="QualifiedName">
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_2ldCh2yIEeKx9Kegn5X27A" key="QualifiedNameDepth" value="1000"/>
+ </eAnnotations>
+ <children xmi:type="notation:DecorationNode" xmi:id="_2ldCiGyIEeKx9Kegn5X27A" type="5032"/>
+ <children xmi:type="notation:DecorationNode" xmi:id="_D69wpFViEeWe8LyZrqaAug" type="8511">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_D69wpVViEeWe8LyZrqaAug" y="5"/>
+ </children>
+ <element xmi:type="uml:PrimitiveType" href="sashwindowsdi.uml#_A-BP8EVhEd6g-YgfS2DHrA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_2ldCgWyIEeKx9Kegn5X27A" x="342" y="192"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_28g3oGyIEeKx9Kegn5X27A" type="2009" fontName="Segoe UI" lineColor="0">
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_28g3omyIEeKx9Kegn5X27A" source="ShadowFigure">
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_28g3o2yIEeKx9Kegn5X27A" key="ShadowFigure_Value" value="false"/>
+ </eAnnotations>
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_28g3pGyIEeKx9Kegn5X27A" source="displayNameLabelIcon">
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_28g3pWyIEeKx9Kegn5X27A" key="displayNameLabelIcon_value" value="false"/>
+ </eAnnotations>
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_28g3pmyIEeKx9Kegn5X27A" source="QualifiedName">
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_28g3p2yIEeKx9Kegn5X27A" key="QualifiedNameDepth" value="1000"/>
+ </eAnnotations>
+ <children xmi:type="notation:DecorationNode" xmi:id="_28g3qGyIEeKx9Kegn5X27A" type="5032"/>
+ <children xmi:type="notation:DecorationNode" xmi:id="_D69wplViEeWe8LyZrqaAug" type="8511">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_D69wp1ViEeWe8LyZrqaAug" y="5"/>
+ </children>
+ <element xmi:type="uml:PrimitiveType" href="sashwindowsdi.uml#_IEBx4EV4Ed6g-YgfS2DHrA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_28g3oWyIEeKx9Kegn5X27A" x="120" y="324"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_3hRKgGyIEeKx9Kegn5X27A" type="2009" fontName="Segoe UI" lineColor="0">
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_3hRKgmyIEeKx9Kegn5X27A" source="ShadowFigure">
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_3hRKg2yIEeKx9Kegn5X27A" key="ShadowFigure_Value" value="false"/>
+ </eAnnotations>
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_3hRKhGyIEeKx9Kegn5X27A" source="displayNameLabelIcon">
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_3hRKhWyIEeKx9Kegn5X27A" key="displayNameLabelIcon_value" value="false"/>
+ </eAnnotations>
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_3hRKhmyIEeKx9Kegn5X27A" source="QualifiedName">
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_3hRKh2yIEeKx9Kegn5X27A" key="QualifiedNameDepth" value="1000"/>
+ </eAnnotations>
+ <children xmi:type="notation:DecorationNode" xmi:id="_3hRKiGyIEeKx9Kegn5X27A" type="5032"/>
+ <children xmi:type="notation:DecorationNode" xmi:id="_D69wqFViEeWe8LyZrqaAug" type="8511">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_D69wqVViEeWe8LyZrqaAug" y="5"/>
+ </children>
+ <element xmi:type="uml:PrimitiveType" href="sashwindowsdi.uml#_SNSWAEbaEd6g-YgfS2DHrA"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_3hRKgWyIEeKx9Kegn5X27A" x="344" y="328"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_D8v5WVViEeWe8LyZrqaAug" type="StereotypeComment">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_D8v5WlViEeWe8LyZrqaAug" showTitle="true"/>
+ <styles xmi:type="notation:EObjectValueStyle" xmi:id="_D8v5XFViEeWe8LyZrqaAug" name="BASE_ELEMENT">
+ <eObjectValue xmi:type="uml:PrimitiveType" href="sashwindowsdi.uml#_Hkk78EVbEd6g-YgfS2DHrA"/>
+ </styles>
+ <element xsi:nil="true"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_D8v5W1ViEeWe8LyZrqaAug" x="320" y="196"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_D9MlS1ViEeWe8LyZrqaAug" type="StereotypeComment">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_D9MlTFViEeWe8LyZrqaAug" showTitle="true"/>
+ <styles xmi:type="notation:EObjectValueStyle" xmi:id="_D9MlTlViEeWe8LyZrqaAug" name="BASE_ELEMENT">
+ <eObjectValue xmi:type="uml:PrimitiveType" href="sashwindowsdi.uml#_A-BP8EVhEd6g-YgfS2DHrA"/>
+ </styles>
+ <element xsi:nil="true"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_D9MlTVViEeWe8LyZrqaAug" x="542" y="192"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_D9fgP1ViEeWe8LyZrqaAug" type="StereotypeComment">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_D9fgQFViEeWe8LyZrqaAug" showTitle="true"/>
+ <styles xmi:type="notation:EObjectValueStyle" xmi:id="_D9fgQlViEeWe8LyZrqaAug" name="BASE_ELEMENT">
+ <eObjectValue xmi:type="uml:PrimitiveType" href="sashwindowsdi.uml#_IEBx4EV4Ed6g-YgfS2DHrA"/>
+ </styles>
+ <element xsi:nil="true"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_D9fgQVViEeWe8LyZrqaAug" x="320" y="324"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_D-PHE1ViEeWe8LyZrqaAug" type="StereotypeComment">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_D-PHFFViEeWe8LyZrqaAug" showTitle="true"/>
+ <styles xmi:type="notation:EObjectValueStyle" xmi:id="_D-PHFlViEeWe8LyZrqaAug" name="BASE_ELEMENT">
+ <eObjectValue xmi:type="uml:PrimitiveType" href="sashwindowsdi.uml#_SNSWAEbaEd6g-YgfS2DHrA"/>
+ </styles>
+ <element xsi:nil="true"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_D-PHFVViEeWe8LyZrqaAug" x="544" y="328"/>
+ </children>
+ <styles xmi:type="notation:DiagramStyle" xmi:id="_0m_xwWyIEeKx9Kegn5X27A"/>
+ <styles xmi:type="notation:StringValueStyle" xmi:id="_D69wqlViEeWe8LyZrqaAug" name="diagram_compatibility_version" stringValue="1.1.0"/>
+ <element xmi:type="uml:Model" href="sashwindowsdi.uml#_NuHhwEJVEd6kIY39uis5Uw"/>
+ <edges xmi:type="notation:Connector" xmi:id="_D8v5XVViEeWe8LyZrqaAug" type="StereotypeCommentLink" source="_2JyaMGyIEeKx9Kegn5X27A" target="_D8v5WVViEeWe8LyZrqaAug">
+ <styles xmi:type="notation:FontStyle" xmi:id="_D8v5XlViEeWe8LyZrqaAug"/>
+ <styles xmi:type="notation:EObjectValueStyle" xmi:id="_D8v5YlViEeWe8LyZrqaAug" name="BASE_ELEMENT">
+ <eObjectValue xmi:type="uml:PrimitiveType" href="sashwindowsdi.uml#_Hkk78EVbEd6g-YgfS2DHrA"/>
+ </styles>
+ <element xsi:nil="true"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_D8v5X1ViEeWe8LyZrqaAug" points="[0, 0, 0, 0]$[0, 0, 0, 0]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_D8v5YFViEeWe8LyZrqaAug"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_D8v5YVViEeWe8LyZrqaAug"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_D9MlT1ViEeWe8LyZrqaAug" type="StereotypeCommentLink" source="_2ldCgGyIEeKx9Kegn5X27A" target="_D9MlS1ViEeWe8LyZrqaAug">
+ <styles xmi:type="notation:FontStyle" xmi:id="_D9MlUFViEeWe8LyZrqaAug"/>
+ <styles xmi:type="notation:EObjectValueStyle" xmi:id="_D9MlVFViEeWe8LyZrqaAug" name="BASE_ELEMENT">
+ <eObjectValue xmi:type="uml:PrimitiveType" href="sashwindowsdi.uml#_A-BP8EVhEd6g-YgfS2DHrA"/>
+ </styles>
+ <element xsi:nil="true"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_D9MlUVViEeWe8LyZrqaAug" points="[0, 0, 0, 0]$[0, 0, 0, 0]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_D9MlUlViEeWe8LyZrqaAug"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_D9MlU1ViEeWe8LyZrqaAug"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_D9fgQ1ViEeWe8LyZrqaAug" type="StereotypeCommentLink" source="_28g3oGyIEeKx9Kegn5X27A" target="_D9fgP1ViEeWe8LyZrqaAug">
+ <styles xmi:type="notation:FontStyle" xmi:id="_D9fgRFViEeWe8LyZrqaAug"/>
+ <styles xmi:type="notation:EObjectValueStyle" xmi:id="_D9fgSFViEeWe8LyZrqaAug" name="BASE_ELEMENT">
+ <eObjectValue xmi:type="uml:PrimitiveType" href="sashwindowsdi.uml#_IEBx4EV4Ed6g-YgfS2DHrA"/>
+ </styles>
+ <element xsi:nil="true"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_D9fgRVViEeWe8LyZrqaAug" points="[0, 0, 0, 0]$[0, 0, 0, 0]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_D9fgRlViEeWe8LyZrqaAug"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_D9fgR1ViEeWe8LyZrqaAug"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_D-PHF1ViEeWe8LyZrqaAug" type="StereotypeCommentLink" source="_3hRKgGyIEeKx9Kegn5X27A" target="_D-PHE1ViEeWe8LyZrqaAug">
+ <styles xmi:type="notation:FontStyle" xmi:id="_D-PHGFViEeWe8LyZrqaAug"/>
+ <styles xmi:type="notation:EObjectValueStyle" xmi:id="_D-PHHFViEeWe8LyZrqaAug" name="BASE_ELEMENT">
+ <eObjectValue xmi:type="uml:PrimitiveType" href="sashwindowsdi.uml#_SNSWAEbaEd6g-YgfS2DHrA"/>
+ </styles>
+ <element xsi:nil="true"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_D-PHGVViEeWe8LyZrqaAug" points="[0, 0, 0, 0]$[0, 0, 0, 0]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_D-PHGlViEeWe8LyZrqaAug"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_D-PHG1ViEeWe8LyZrqaAug"/>
+ </edges>
+ </notation:Diagram>
+ <notation:Diagram xmi:id="_lk72EG8gEeKx9Kegn5X27A" type="PapyrusUMLClassDiagram" name="ClassDiagram" measurementUnit="Pixel">
+ <styles xmi:type="notation:DiagramStyle" xmi:id="_lk72EW8gEeKx9Kegn5X27A"/>
+ <styles xmi:type="notation:StringValueStyle" xmi:id="_D57O0FViEeWe8LyZrqaAug" name="diagram_compatibility_version" stringValue="1.1.0"/>
+ <element xmi:type="uml:Model" href="sashwindowsdi.uml#_NuHhwEJVEd6kIY39uis5Uw"/>
+ </notation:Diagram>
+</xmi:XMI>
diff --git a/plugins/infra/core/org.eclipse.papyrus.infra.core.sasheditor.di/model/sashwindowsdi.uml b/plugins/infra/core/org.eclipse.papyrus.infra.core.sasheditor.di/model/sashwindowsdi.uml
index a155501dda8..5d8586393bd 100644
--- a/plugins/infra/core/org.eclipse.papyrus.infra.core.sasheditor.di/model/sashwindowsdi.uml
+++ b/plugins/infra/core/org.eclipse.papyrus.infra.core.sasheditor.di/model/sashwindowsdi.uml
@@ -1,598 +1,612 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<xmi:XMI xmi:version="20131001" xmlns:xmi="http://www.omg.org/spec/XMI/20131001" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:Ecore="http://www.eclipse.org/uml2/schemas/Ecore/5" xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" xmlns:uml="http://www.eclipse.org/uml2/5.0.0/UML" xsi:schemaLocation="http://www.eclipse.org/uml2/schemas/Ecore/5 pathmap://UML_PROFILES/Ecore.profile.uml#_z1OFcHjqEdy8S4Cr8Rc_NA">
- <uml:Model xmi:id="_NuHhwEJVEd6kIY39uis5Uw" name="di" URI="http://www.eclipse.org/papyrus/0.7.0/sashdi">
- <packageImport xmi:type="uml:PackageImport" xmi:id="_F0PskN5qEd2dfviKlv9PXw">
- <importedPackage xmi:type="uml:Model" href="pathmap://UML_METAMODELS/Ecore.metamodel.uml#_0"/>
- </packageImport>
- <packagedElement xmi:type="uml:Class" xmi:id="_UiIMMEJVEd6kIY39uis5Uw" name="SashModel">
- <ownedComment xmi:type="uml:Comment" xmi:id="_UyqHoEUrEd6g-YgfS2DHrA" annotatedElement="_UiIMMEJVEd6kIY39uis5Uw">
- <body>Root node of the model describing the sash windows, panels and pages.&#xD;
-A SashModel can have several windows containing panels separated by sashes. Such panels can be folders &#xD;
-containing pages.</body>
- </ownedComment>
- <ownedAttribute xmi:type="uml:Property" xmi:id="_9KYNMEJVEd6kIY39uis5Uw" name="windows" type="_Xa5wIEJVEd6kIY39uis5Uw" aggregation="composite" association="_9JomUEJVEd6kIY39uis5Uw">
- <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_9KYNMUJVEd6kIY39uis5Uw"/>
- <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_9KYNMkJVEd6kIY39uis5Uw" value="*"/>
- </ownedAttribute>
- <ownedAttribute xmi:type="uml:Property" xmi:id="_mW0_EEJkEd6kIY39uis5Uw" name="currentSelection" type="_fbWYgEJVEd6kIY39uis5Uw" isUnique="false" association="_mT2jkEJkEd6kIY39uis5Uw">
- <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_mW0_EUJkEd6kIY39uis5Uw" value="1"/>
- <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_mW0_EkJkEd6kIY39uis5Uw" value="1"/>
- </ownedAttribute>
- <ownedOperation xmi:type="uml:Operation" xmi:id="_wdFgUEV4Ed6g-YgfS2DHrA" name="addPage">
- <ownedParameter xmi:type="uml:Parameter" xmi:id="_yMF_0EV4Ed6g-YgfS2DHrA" name="pageIdentifier" type="_A-BP8EVhEd6g-YgfS2DHrA">
- <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_1N0EYEV4Ed6g-YgfS2DHrA" value="1"/>
- <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_1N0EYUV4Ed6g-YgfS2DHrA" value="1"/>
- <defaultValue xmi:type="uml:LiteralString" xmi:id="_1N0EYkV4Ed6g-YgfS2DHrA">
- <value xsi:nil="true"/>
- </defaultValue>
- </ownedParameter>
- </ownedOperation>
- <ownedOperation xmi:type="uml:Operation" xmi:id="_m7xPsEa4Ed6g-YgfS2DHrA" name="removePage">
- <ownedParameter xmi:type="uml:Parameter" xmi:id="_m7xPsUa4Ed6g-YgfS2DHrA" name="pageIdentifier" type="_A-BP8EVhEd6g-YgfS2DHrA">
- <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_m7xPs0a4Ed6g-YgfS2DHrA" value="1"/>
- <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_m7xPska4Ed6g-YgfS2DHrA" value="1"/>
- <defaultValue xmi:type="uml:LiteralString" xmi:id="_m7xPtEa4Ed6g-YgfS2DHrA">
- <value xsi:nil="true"/>
- </defaultValue>
- </ownedParameter>
- </ownedOperation>
- <ownedOperation xmi:type="uml:Operation" xmi:id="_e9ojYEbXEd6g-YgfS2DHrA" name="lookupPage">
- <ownedComment xmi:type="uml:Comment" xmi:id="_hi4uYEbXEd6g-YgfS2DHrA" annotatedElement="_e9ojYEbXEd6g-YgfS2DHrA">
- <body>Lookup the pageRef identified by the pageIdentifier.&#xD;
-Return the pageRef or null if not found.&#xD;
-Lookup in the entire SashModel structure.</body>
- </ownedComment>
- <ownedParameter xmi:type="uml:Parameter" xmi:id="_e9ojYUbXEd6g-YgfS2DHrA" name="pageIdentifier" type="_A-BP8EVhEd6g-YgfS2DHrA">
- <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_e9ojY0bXEd6g-YgfS2DHrA" value="1"/>
- <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_e9ojYkbXEd6g-YgfS2DHrA" value="1"/>
- <defaultValue xmi:type="uml:LiteralString" xmi:id="_e9ojZEbXEd6g-YgfS2DHrA">
- <value xsi:nil="true"/>
- </defaultValue>
- </ownedParameter>
- <ownedParameter xmi:type="uml:Parameter" xmi:id="_UTCMcEbYEd6g-YgfS2DHrA" name="return" type="_h_HVwEJVEd6kIY39uis5Uw" direction="return">
- <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_WgwBMEbYEd6g-YgfS2DHrA" value="1"/>
- <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_Wg5LIEbYEd6g-YgfS2DHrA" value="1"/>
- <defaultValue xmi:type="uml:LiteralString" xmi:id="_Wg5LIUbYEd6g-YgfS2DHrA">
- <value xsi:nil="true"/>
- </defaultValue>
- </ownedParameter>
- </ownedOperation>
- <ownedOperation xmi:type="uml:Operation" xmi:id="_q8zekEbsEd6g-YgfS2DHrA" name="movePage">
- <ownedParameter xmi:type="uml:Parameter" xmi:id="_sQ_qUEbsEd6g-YgfS2DHrA" name="srcParentFolder" type="_fbWYgEJVEd6kIY39uis5Uw">
- <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_wdNzIEbsEd6g-YgfS2DHrA" value="1"/>
- <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_wdW9EEbsEd6g-YgfS2DHrA" value="1"/>
- <defaultValue xmi:type="uml:LiteralString" xmi:id="_wdW9EUbsEd6g-YgfS2DHrA">
- <value xsi:nil="true"/>
- </defaultValue>
- </ownedParameter>
- <ownedParameter xmi:type="uml:Parameter" xmi:id="_q8zekUbsEd6g-YgfS2DHrA" name="srcIndex" type="_Hkk78EVbEd6g-YgfS2DHrA">
- <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_q8zek0bsEd6g-YgfS2DHrA" value="1"/>
- <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_q8zekkbsEd6g-YgfS2DHrA" value="1"/>
- <defaultValue xmi:type="uml:LiteralString" xmi:id="_q8zelEbsEd6g-YgfS2DHrA">
- <value xsi:nil="true"/>
- </defaultValue>
- </ownedParameter>
- <ownedParameter xmi:type="uml:Parameter" xmi:id="_wqxuAEbsEd6g-YgfS2DHrA" name="targetParentFolder" type="_fbWYgEJVEd6kIY39uis5Uw">
- <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_y6twUEbsEd6g-YgfS2DHrA" value="1"/>
- <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_y6twUUbsEd6g-YgfS2DHrA" value="1"/>
- <defaultValue xmi:type="uml:LiteralString" xmi:id="_y6twUkbsEd6g-YgfS2DHrA">
- <value xsi:nil="true"/>
- </defaultValue>
- </ownedParameter>
- <ownedParameter xmi:type="uml:Parameter" xmi:id="_q8zelUbsEd6g-YgfS2DHrA" name="targetIndex" type="_Hkk78EVbEd6g-YgfS2DHrA">
- <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_q8zel0bsEd6g-YgfS2DHrA" value="1"/>
- <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_q8zelkbsEd6g-YgfS2DHrA" value="1"/>
- <defaultValue xmi:type="uml:LiteralString" xmi:id="_q8zemEbsEd6g-YgfS2DHrA">
- <value xsi:nil="true"/>
- </defaultValue>
- </ownedParameter>
- </ownedOperation>
- <ownedOperation xmi:type="uml:Operation" xmi:id="_vnqNcEoIEd6ussMWxXGeXg" name="insertFolder">
- <ownedParameter xmi:type="uml:Parameter" xmi:id="_vnqNcUoIEd6ussMWxXGeXg" name="folderToInsert" type="_fbWYgEJVEd6kIY39uis5Uw">
- <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_vnqNc0oIEd6ussMWxXGeXg" value="1"/>
- <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_vnqNckoIEd6ussMWxXGeXg" value="1"/>
- <defaultValue xmi:type="uml:LiteralString" xmi:id="_vnqNdEoIEd6ussMWxXGeXg">
- <value xsi:nil="true"/>
- </defaultValue>
- </ownedParameter>
- <ownedParameter xmi:type="uml:Parameter" xmi:id="_vnqNeUoIEd6ussMWxXGeXg" name="refFolder" type="_fbWYgEJVEd6kIY39uis5Uw">
- <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_vnqNe0oIEd6ussMWxXGeXg" value="1"/>
- <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_vnqNekoIEd6ussMWxXGeXg" value="1"/>
- <defaultValue xmi:type="uml:LiteralString" xmi:id="_vnqNfEoIEd6ussMWxXGeXg">
- <value xsi:nil="true"/>
- </defaultValue>
- </ownedParameter>
- <ownedParameter xmi:type="uml:Parameter" xmi:id="_vnqNfUoIEd6ussMWxXGeXg" name="refFolderSide" type="_Hkk78EVbEd6g-YgfS2DHrA">
- <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_vnqNf0oIEd6ussMWxXGeXg" value="1"/>
- <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_vnqNfkoIEd6ussMWxXGeXg" value="1"/>
- <defaultValue xmi:type="uml:LiteralString" xmi:id="_vnqNgEoIEd6ussMWxXGeXg">
- <value xsi:nil="true"/>
- </defaultValue>
- </ownedParameter>
- </ownedOperation>
- <ownedOperation xmi:type="uml:Operation" xmi:id="_Kvf9cEoJEd6ussMWxXGeXg" name="movePage">
- <ownedParameter xmi:type="uml:Parameter" xmi:id="_Kvf9cUoJEd6ussMWxXGeXg" name="srcParentFolder" type="_fbWYgEJVEd6kIY39uis5Uw">
- <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_Kvf9c0oJEd6ussMWxXGeXg" value="1"/>
- <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_Kvf9ckoJEd6ussMWxXGeXg" value="1"/>
- <defaultValue xmi:type="uml:LiteralString" xmi:id="_Kvf9dEoJEd6ussMWxXGeXg">
- <value xsi:nil="true"/>
- </defaultValue>
- </ownedParameter>
- <ownedParameter xmi:type="uml:Parameter" xmi:id="_Kvf9dUoJEd6ussMWxXGeXg" name="srcIndex" type="_Hkk78EVbEd6g-YgfS2DHrA">
- <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_Kvf9d0oJEd6ussMWxXGeXg" value="1"/>
- <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_Kvf9dkoJEd6ussMWxXGeXg" value="1"/>
- <defaultValue xmi:type="uml:LiteralString" xmi:id="_Kvf9eEoJEd6ussMWxXGeXg">
- <value xsi:nil="true"/>
- </defaultValue>
- </ownedParameter>
- <ownedParameter xmi:type="uml:Parameter" xmi:id="_Kvf9eUoJEd6ussMWxXGeXg" name="targetParentFolder" type="_fbWYgEJVEd6kIY39uis5Uw">
- <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_Kvf9e0oJEd6ussMWxXGeXg" value="1"/>
- <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_Kvf9ekoJEd6ussMWxXGeXg" value="1"/>
- <defaultValue xmi:type="uml:LiteralString" xmi:id="_Kvf9fEoJEd6ussMWxXGeXg">
- <value xsi:nil="true"/>
- </defaultValue>
- </ownedParameter>
- </ownedOperation>
- <ownedOperation xmi:type="uml:Operation" xmi:id="_OoMtUEoJEd6ussMWxXGeXg" name="removeEmptyFolder">
- <ownedParameter xmi:type="uml:Parameter" xmi:id="_OoMtUUoJEd6ussMWxXGeXg" name="folder" type="_fbWYgEJVEd6kIY39uis5Uw">
- <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_OoMtU0oJEd6ussMWxXGeXg" value="1"/>
- <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_OoMtUkoJEd6ussMWxXGeXg" value="1"/>
- <defaultValue xmi:type="uml:LiteralString" xmi:id="_OoMtVEoJEd6ussMWxXGeXg">
- <value xsi:nil="true"/>
- </defaultValue>
- </ownedParameter>
- </ownedOperation>
- <ownedOperation xmi:type="uml:Operation" xmi:id="_vaMqoE4OEd-B2uXHu4qMXg" name="removeAllPages">
- <ownedComment xmi:type="uml:Comment" xmi:id="_yKxU0E4OEd-B2uXHu4qMXg" annotatedElement="_vaMqoE4OEd-B2uXHu4qMXg">
- <body>Remove all pages from the model. Only left one empty top level folder.</body>
- </ownedComment>
- </ownedOperation>
- <ownedOperation xmi:type="uml:Operation" xmi:id="_-TkSoE4OEd-B2uXHu4qMXg" name="removeOtherPages">
- <ownedComment xmi:type="uml:Comment" xmi:id="_Ar2_sE4PEd-B2uXHu4qMXg" annotatedElement="_-TkSoE4OEd-B2uXHu4qMXg">
- <body>Remove pages other than the one specified from the model. Intermediate folders are also removed.</body>
- </ownedComment>
- <ownedParameter xmi:type="uml:Parameter" xmi:id="_-TkSoU4OEd-B2uXHu4qMXg" name="pageIdentifier" type="_A-BP8EVhEd6g-YgfS2DHrA">
- <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_-TkSo04OEd-B2uXHu4qMXg" value="1"/>
- <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_-TkSok4OEd-B2uXHu4qMXg" value="1"/>
- <defaultValue xmi:type="uml:LiteralString" xmi:id="_-TkSpE4OEd-B2uXHu4qMXg">
- <value xsi:nil="true"/>
- </defaultValue>
- </ownedParameter>
- </ownedOperation>
- <ownedOperation xmi:type="uml:Operation" xmi:id="_1jUIgE4PEd-B2uXHu4qMXg" name="lookupFirstWindow">
- <ownedComment xmi:type="uml:Comment" xmi:id="_JhGFkE4QEd-B2uXHu4qMXg" annotatedElement="_1jUIgE4PEd-B2uXHu4qMXg">
- <body>Get the first available window.</body>
- </ownedComment>
- <ownedParameter xmi:type="uml:Parameter" xmi:id="_9JGOIE4PEd-B2uXHu4qMXg" name="window" type="_Xa5wIEJVEd6kIY39uis5Uw" direction="return">
- <lowerValue xmi:type="uml:LiteralInteger" xmi:id="__PD1EE4PEd-B2uXHu4qMXg" value="1"/>
- <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="__PD1EU4PEd-B2uXHu4qMXg" value="1"/>
- <defaultValue xmi:type="uml:LiteralString" xmi:id="__PD1Ek4PEd-B2uXHu4qMXg">
- <value xsi:nil="true"/>
- </defaultValue>
- </ownedParameter>
- </ownedOperation>
- <ownedOperation xmi:type="uml:Operation" xmi:id="_4qi_ME4PEd-B2uXHu4qMXg" name="lookupFirstFolder">
- <ownedComment xmi:type="uml:Comment" xmi:id="_MKOD8E4QEd-B2uXHu4qMXg" annotatedElement="_4qi_ME4PEd-B2uXHu4qMXg">
- <body>Lookup the first available folder.</body>
- </ownedComment>
- <ownedParameter xmi:type="uml:Parameter" xmi:id="__o-w8E4PEd-B2uXHu4qMXg" name="folder" type="_fbWYgEJVEd6kIY39uis5Uw" direction="return">
- <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_BOwb8E4QEd-B2uXHu4qMXg" value="1"/>
- <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_BO6M8E4QEd-B2uXHu4qMXg" value="1"/>
- <defaultValue xmi:type="uml:LiteralString" xmi:id="_BO6M8U4QEd-B2uXHu4qMXg">
- <value xsi:nil="true"/>
- </defaultValue>
- </ownedParameter>
- </ownedOperation>
- <ownedOperation xmi:type="uml:Operation" xmi:id="_fPvj8FgxEeGNKLzLkykmJw" name="removePageAndEmptyFolder">
- <ownedParameter xmi:type="uml:Parameter" xmi:id="_fPvj8VgxEeGNKLzLkykmJw" name="pageIdentifier" type="_A-BP8EVhEd6g-YgfS2DHrA">
- <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_fPvj8lgxEeGNKLzLkykmJw" value="1"/>
- <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_fPvj81gxEeGNKLzLkykmJw" value="1"/>
- <defaultValue xmi:type="uml:LiteralString" xmi:id="_fPvj9FgxEeGNKLzLkykmJw">
- <value xsi:nil="true"/>
- </defaultValue>
- </ownedParameter>
- </ownedOperation>
- <ownedOperation xmi:type="uml:Operation" xmi:id="_zdr0wGySEeKx9Kegn5X27A" name="setCurrentSelectionSilently">
- <ownedComment xmi:type="uml:Comment" xmi:id="_CMVagGyTEeKx9Kegn5X27A">
- <body>Set the current selection without firing a changedEvent.</body>
- </ownedComment>
- <ownedParameter xmi:type="uml:Parameter" xmi:id="_5Z9l8GySEeKx9Kegn5X27A" name="selection" type="_fbWYgEJVEd6kIY39uis5Uw"/>
- </ownedOperation>
- <ownedOperation xmi:type="uml:Operation" xmi:id="_HtBbEFVkEeWe8LyZrqaAug" name="addPage">
- <ownedParameter xmi:type="uml:Parameter" xmi:id="_KIfX8FVkEeWe8LyZrqaAug" name="folder" type="_fbWYgEJVEd6kIY39uis5Uw"/>
- <ownedParameter xmi:type="uml:Parameter" xmi:id="_HtBbEVVkEeWe8LyZrqaAug" name="pageIdentifier" type="_A-BP8EVhEd6g-YgfS2DHrA">
- <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_HtBbElVkEeWe8LyZrqaAug" value="1"/>
- <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_HtBbE1VkEeWe8LyZrqaAug" value="1"/>
- <defaultValue xmi:type="uml:LiteralString" xmi:id="_HtBbFFVkEeWe8LyZrqaAug">
- <value xsi:nil="true"/>
- </defaultValue>
- </ownedParameter>
- </ownedOperation>
- <ownedOperation xmi:type="uml:Operation" xmi:id="_vv4NwFYZEeWe8LyZrqaAug" name="addPage">
- <ownedParameter xmi:type="uml:Parameter" xmi:id="_vv4NwVYZEeWe8LyZrqaAug" name="folder" type="_fbWYgEJVEd6kIY39uis5Uw"/>
- <ownedParameter xmi:type="uml:Parameter" xmi:id="_vv4NwlYZEeWe8LyZrqaAug" name="pageRef" type="_h_HVwEJVEd6kIY39uis5Uw">
- <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_vv4Nw1YZEeWe8LyZrqaAug" value="1"/>
- <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_vv4NxFYZEeWe8LyZrqaAug" value="1"/>
- <defaultValue xmi:type="uml:LiteralString" xmi:id="_vv4NxVYZEeWe8LyZrqaAug">
- <value xsi:nil="true"/>
- </defaultValue>
- </ownedParameter>
- </ownedOperation>
- </packagedElement>
- <packagedElement xmi:type="uml:Class" xmi:id="_Xa5wIEJVEd6kIY39uis5Uw" name="Window">
- <generalization xmi:type="uml:Generalization" xmi:id="_95DboEJWEd6kIY39uis5Uw" general="_86BAgEJWEd6kIY39uis5Uw"/>
- <ownedAttribute xmi:type="uml:Property" xmi:id="_yWfIQESDEd6kIY39uis5Uw" name="position" visibility="public" type="_jc9vQESDEd6kIY39uis5Uw" isUnique="false">
- <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_zpoyMESDEd6kIY39uis5Uw" value="1"/>
- <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_zpoyMUSDEd6kIY39uis5Uw" value="1"/>
- <defaultValue xmi:type="uml:LiteralString" xmi:id="_zpx8IESDEd6kIY39uis5Uw">
- <value xsi:nil="true"/>
- </defaultValue>
- </ownedAttribute>
- <ownedAttribute xmi:type="uml:Property" xmi:id="_z0glcESDEd6kIY39uis5Uw" name="size" visibility="public" type="_lh4NUESDEd6kIY39uis5Uw" isUnique="false">
- <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_1ItYQESDEd6kIY39uis5Uw" value="1"/>
- <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_1I2iMESDEd6kIY39uis5Uw" value="1"/>
- <defaultValue xmi:type="uml:LiteralString" xmi:id="_1I2iMUSDEd6kIY39uis5Uw">
- <value xsi:nil="true"/>
- </defaultValue>
- </ownedAttribute>
- <ownedAttribute xmi:type="uml:Property" xmi:id="_lnNFMEsFEd6MxdnlcgT3eA" name="panel" type="_Zx2ZYEJVEd6kIY39uis5Uw" isUnique="false" isDerived="true" association="_li3-0EsFEd6MxdnlcgT3eA">
- <ownedComment xmi:type="uml:Comment" xmi:id="_xQZ88EsFEd6MxdnlcgT3eA" annotatedElement="_lnNFMEsFEd6MxdnlcgT3eA">
- <body>Redefine children.</body>
- </ownedComment>
- <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_9GbvwEsFEd6MxdnlcgT3eA" value="1"/>
- <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_9Gk5sEsFEd6MxdnlcgT3eA" value="1"/>
- </ownedAttribute>
- </packagedElement>
- <packagedElement xmi:type="uml:Class" xmi:id="_Zx2ZYEJVEd6kIY39uis5Uw" name="AbstractPanel" isAbstract="true">
- <ownedAttribute xmi:type="uml:Property" xmi:id="__CoIQEJVEd6kIY39uis5Uw" name="parent" type="_86BAgEJWEd6kIY39uis5Uw" isUnique="false" association="__CVNUEJVEd6kIY39uis5Uw">
- <lowerValue xmi:type="uml:LiteralInteger" xmi:id="__CoIQkJVEd6kIY39uis5Uw" value="1"/>
- <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="__CoIQUJVEd6kIY39uis5Uw" value="1"/>
- </ownedAttribute>
- </packagedElement>
- <packagedElement xmi:type="uml:Class" xmi:id="_eE7YIEJVEd6kIY39uis5Uw" name="SashPanel">
- <generalization xmi:type="uml:Generalization" xmi:id="_7VZokEJVEd6kIY39uis5Uw" general="_Zx2ZYEJVEd6kIY39uis5Uw"/>
- <generalization xmi:type="uml:Generalization" xmi:id="_UH6OsEsDEd6MxdnlcgT3eA" general="_86BAgEJWEd6kIY39uis5Uw"/>
- <ownedAttribute xmi:type="uml:Property" xmi:id="_8rplQESDEd6kIY39uis5Uw" name="sashPosition" visibility="public" type="_IEBx4EV4Ed6g-YgfS2DHrA" isUnique="false">
- <ownedComment xmi:type="uml:Comment" xmi:id="_AWCzYESEEd6kIY39uis5Uw" annotatedElement="_8rplQESDEd6kIY39uis5Uw">
- <body>Position of the sash in the panel. The position is in percent. The value should be between 0 and 100.</body>
- </ownedComment>
- <lowerValue xmi:type="uml:LiteralInteger" xmi:id="__l6W8ESDEd6kIY39uis5Uw" value="1"/>
- <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="__mEH8ESDEd6kIY39uis5Uw" value="1"/>
- <defaultValue xmi:type="uml:LiteralString" xmi:id="__mEH8USDEd6kIY39uis5Uw">
- <value xsi:nil="true"/>
- </defaultValue>
- </ownedAttribute>
- <ownedAttribute xmi:type="uml:Property" xmi:id="_1nx64EbpEd6g-YgfS2DHrA" name="direction" visibility="public" type="_Hkk78EVbEd6g-YgfS2DHrA" isUnique="false">
- <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_4GxF0EbpEd6g-YgfS2DHrA" value="1"/>
- <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_4G620EbpEd6g-YgfS2DHrA" value="1"/>
- <defaultValue xmi:type="uml:LiteralString" xmi:id="_4G620UbpEd6g-YgfS2DHrA">
- <value xsi:nil="true"/>
- </defaultValue>
- </ownedAttribute>
- <ownedOperation xmi:type="uml:Operation" xmi:id="_eGcSEEoLEd6ussMWxXGeXg" name="setChildren">
- <ownedParameter xmi:type="uml:Parameter" xmi:id="_f_4f8EoLEd6ussMWxXGeXg" name="leftChild" type="_Zx2ZYEJVEd6kIY39uis5Uw">
- <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_jqlQEEoLEd6ussMWxXGeXg" value="1"/>
- <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_jquaAEoLEd6ussMWxXGeXg" value="1"/>
- <defaultValue xmi:type="uml:LiteralString" xmi:id="_jquaAUoLEd6ussMWxXGeXg">
- <value xsi:nil="true"/>
- </defaultValue>
- </ownedParameter>
- <ownedParameter xmi:type="uml:Parameter" xmi:id="_j57ToEoLEd6ussMWxXGeXg" name="rightChild" type="_Zx2ZYEJVEd6kIY39uis5Uw">
- <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_l5xrgEoLEd6ussMWxXGeXg" value="1"/>
- <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_l57cgEoLEd6ussMWxXGeXg" value="1"/>
- <defaultValue xmi:type="uml:LiteralString" xmi:id="_l57cgUoLEd6ussMWxXGeXg">
- <value xsi:nil="true"/>
- </defaultValue>
- </ownedParameter>
- <ownedParameter xmi:type="uml:Parameter" xmi:id="_mVfXIEoLEd6ussMWxXGeXg" name="direction" type="_Hkk78EVbEd6g-YgfS2DHrA">
- <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_oo3vAEoLEd6ussMWxXGeXg" value="1"/>
- <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_oo3vAUoLEd6ussMWxXGeXg" value="1"/>
- <defaultValue xmi:type="uml:LiteralString" xmi:id="_oo3vAkoLEd6ussMWxXGeXg">
- <value xsi:nil="true"/>
- </defaultValue>
- </ownedParameter>
- </ownedOperation>
- <ownedOperation xmi:type="uml:Operation" xmi:id="_tzrhgEuAEd6kcPOdk0bn7w" name="delete">
- <ownedParameter xmi:type="uml:Parameter" xmi:id="_yPQU8EuAEd6kcPOdk0bn7w" name="childToDelete" type="_Zx2ZYEJVEd6kIY39uis5Uw">
- <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_2M3aAEuAEd6kcPOdk0bn7w" value="1"/>
- <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_2M3aAUuAEd6kcPOdk0bn7w" value="1"/>
- <defaultValue xmi:type="uml:LiteralString" xmi:id="_2M3aAkuAEd6kcPOdk0bn7w">
- <value xsi:nil="true"/>
- </defaultValue>
- </ownedParameter>
- </ownedOperation>
- </packagedElement>
- <packagedElement xmi:type="uml:Class" xmi:id="_fbWYgEJVEd6kIY39uis5Uw" name="TabFolder">
- <generalization xmi:type="uml:Generalization" xmi:id="_71vVgEJVEd6kIY39uis5Uw" general="_Zx2ZYEJVEd6kIY39uis5Uw"/>
- <ownedAttribute xmi:type="uml:Property" xmi:id="_ANIzkEJWEd6kIY39uis5Uw" name="children" type="_h_HVwEJVEd6kIY39uis5Uw" aggregation="composite" association="_AM_CkEJWEd6kIY39uis5Uw">
- <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_ANIzkUJWEd6kIY39uis5Uw"/>
- <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_ANIzkkJWEd6kIY39uis5Uw" value="*"/>
- </ownedAttribute>
- <ownedOperation xmi:type="uml:Operation" xmi:id="_Cqh_oEViEd6g-YgfS2DHrA" name="movePage">
- <ownedParameter xmi:type="uml:Parameter" xmi:id="_ETI8MEViEd6g-YgfS2DHrA" name="oldIndex" type="_Hkk78EVbEd6g-YgfS2DHrA">
- <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_G2wIcEViEd6g-YgfS2DHrA" value="1"/>
- <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_G2wIcUViEd6g-YgfS2DHrA" value="1"/>
- <defaultValue xmi:type="uml:LiteralString" xmi:id="_G2wIckViEd6g-YgfS2DHrA">
- <value xsi:nil="true"/>
- </defaultValue>
- </ownedParameter>
- <ownedParameter xmi:type="uml:Parameter" xmi:id="_X27C4EV4Ed6g-YgfS2DHrA" name="newIndex" type="_Hkk78EVbEd6g-YgfS2DHrA">
- <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_amdyUEV4Ed6g-YgfS2DHrA" value="1"/>
- <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_amdyUUV4Ed6g-YgfS2DHrA" value="1"/>
- <defaultValue xmi:type="uml:LiteralString" xmi:id="_amdyUkV4Ed6g-YgfS2DHrA">
- <value xsi:nil="true"/>
- </defaultValue>
- </ownedParameter>
- </ownedOperation>
- <ownedOperation xmi:type="uml:Operation" xmi:id="_oZu3cEWEEd6g-YgfS2DHrA" name="addPage">
- <ownedParameter xmi:type="uml:Parameter" xmi:id="_oZu3cUWEEd6g-YgfS2DHrA" name="pageIdentifier" type="_A-BP8EVhEd6g-YgfS2DHrA">
- <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_oZu3c0WEEd6g-YgfS2DHrA" value="1"/>
- <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_oZu3ckWEEd6g-YgfS2DHrA" value="1"/>
- <defaultValue xmi:type="uml:LiteralString" xmi:id="_oZu3dEWEEd6g-YgfS2DHrA">
- <value xsi:nil="true"/>
- </defaultValue>
- </ownedParameter>
- </ownedOperation>
- <ownedOperation xmi:type="uml:Operation" xmi:id="_oEQBQEblEd6g-YgfS2DHrA" name="removePage">
- <ownedParameter xmi:type="uml:Parameter" xmi:id="_oEQBQUblEd6g-YgfS2DHrA" name="pageIndex" type="_Hkk78EVbEd6g-YgfS2DHrA">
- <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_oEQBQ0blEd6g-YgfS2DHrA" value="1"/>
- <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_oEQBQkblEd6g-YgfS2DHrA" value="1"/>
- <defaultValue xmi:type="uml:LiteralString" xmi:id="_oEQBREblEd6g-YgfS2DHrA">
- <value xsi:nil="true"/>
- </defaultValue>
- </ownedParameter>
- </ownedOperation>
- <ownedOperation xmi:type="uml:Operation" xmi:id="_byei4FVjEeWe8LyZrqaAug" name="addPage">
- <ownedParameter xmi:type="uml:Parameter" xmi:id="_fr-kAFVjEeWe8LyZrqaAug" name="index">
- <type xmi:type="uml:PrimitiveType" href="pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer"/>
- </ownedParameter>
- <ownedParameter xmi:type="uml:Parameter" xmi:id="_byei4VVjEeWe8LyZrqaAug" name="pageIdentifier" type="_A-BP8EVhEd6g-YgfS2DHrA">
- <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_byei4lVjEeWe8LyZrqaAug" value="1"/>
- <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_byei41VjEeWe8LyZrqaAug" value="1"/>
- <defaultValue xmi:type="uml:LiteralString" xmi:id="_byei5FVjEeWe8LyZrqaAug">
- <value xsi:nil="true"/>
- </defaultValue>
- </ownedParameter>
- </ownedOperation>
- <ownedOperation xmi:type="uml:Operation" xmi:id="_1teNkFYZEeWe8LyZrqaAug" name="addPage">
- <ownedParameter xmi:type="uml:Parameter" xmi:id="_1teNkVYZEeWe8LyZrqaAug" name="pageRef" type="_h_HVwEJVEd6kIY39uis5Uw">
- <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_1teNklYZEeWe8LyZrqaAug" value="1"/>
- <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_1teNk1YZEeWe8LyZrqaAug" value="1"/>
- <defaultValue xmi:type="uml:LiteralString" xmi:id="_1teNlFYZEeWe8LyZrqaAug">
- <value xsi:nil="true"/>
- </defaultValue>
- </ownedParameter>
- </ownedOperation>
- </packagedElement>
- <packagedElement xmi:type="uml:Class" xmi:id="_h_HVwEJVEd6kIY39uis5Uw" name="PageRef">
- <ownedAttribute xmi:type="uml:Property" xmi:id="_ANIzk0JWEd6kIY39uis5Uw" name="parent" type="_fbWYgEJVEd6kIY39uis5Uw" isUnique="false" association="_AM_CkEJWEd6kIY39uis5Uw">
- <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_ANIzlUJWEd6kIY39uis5Uw"/>
- <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_ANIzlEJWEd6kIY39uis5Uw" value="1"/>
- </ownedAttribute>
- <ownedAttribute xmi:type="uml:Property" xmi:id="_b94xUEnjEd6ussMWxXGeXg" name="emfPageIdentifier" visibility="private" isUnique="false" association="_b3enUEnjEd6ussMWxXGeXg">
- <type xmi:type="uml:Class" href="pathmap://UML_METAMODELS/Ecore.metamodel.uml#EObject"/>
- <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_b-CiUEnjEd6ussMWxXGeXg" value="1"/>
- <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_b-CiUUnjEd6ussMWxXGeXg" value="1"/>
- </ownedAttribute>
- <ownedAttribute xmi:type="uml:Property" xmi:id="_GrqUYEnkEd6ussMWxXGeXg" name="pageIdentifier" visibility="public" isLeaf="true" type="_A-BP8EVhEd6g-YgfS2DHrA" isUnique="false" isDerived="true">
- <ownedComment xmi:type="uml:Comment" xmi:id="_YfXUoEnmEd6ussMWxXGeXg" annotatedElement="_GrqUYEnkEd6ussMWxXGeXg">
- <body>pageIdentifier can be a plain JavaObject or an EObject.&#xD;
-They are not stored in the same place.</body>
- </ownedComment>
- <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_W-rvkEnnEd6ussMWxXGeXg" value="1"/>
- <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_W-1gkEnnEd6ussMWxXGeXg" value="1"/>
- <defaultValue xmi:type="uml:LiteralString" xmi:id="_W-1gkUnnEd6ussMWxXGeXg">
- <value xsi:nil="true"/>
- </defaultValue>
- </ownedAttribute>
- <ownedAttribute xmi:type="uml:Property" xmi:id="_RkM5UEnmEd6ussMWxXGeXg" name="objectPageIdentifier" visibility="private" type="_A-BP8EVhEd6g-YgfS2DHrA" isUnique="false">
- <ownedComment xmi:type="uml:Comment" xmi:id="_UZ2QwEnmEd6ussMWxXGeXg" annotatedElement="_RkM5UEnmEd6ussMWxXGeXg">
- <body>Storage to store Identifier that are not EObject.</body>
- </ownedComment>
- <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_DXj_AEnnEd6ussMWxXGeXg" value="1"/>
- <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_DXj_AUnnEd6ussMWxXGeXg" value="1"/>
- <defaultValue xmi:type="uml:LiteralString" xmi:id="_DXtI8EnnEd6ussMWxXGeXg">
- <value xsi:nil="true"/>
- </defaultValue>
- </ownedAttribute>
- <ownedAttribute xmi:type="uml:Property" xmi:id="_RGhL8FViEeWe8LyZrqaAug" name="favoriteEditor" visibility="public">
- <type xmi:type="uml:PrimitiveType" href="pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#String"/>
- <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_eaPr0FViEeWe8LyZrqaAug"/>
- <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_eaZc0FViEeWe8LyZrqaAug" value="1"/>
- </ownedAttribute>
- <ownedOperation xmi:type="uml:Operation" xmi:id="_BxkKcEbaEd6g-YgfS2DHrA" name="isForIdentifier">
- <ownedParameter xmi:type="uml:Parameter" xmi:id="_BxkKcUbaEd6g-YgfS2DHrA" name="pageIdentifier" type="_A-BP8EVhEd6g-YgfS2DHrA">
- <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_BxkKc0baEd6g-YgfS2DHrA" value="1"/>
- <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_BxkKckbaEd6g-YgfS2DHrA" value="1"/>
- <defaultValue xmi:type="uml:LiteralString" xmi:id="_BxkKdEbaEd6g-YgfS2DHrA">
- <value xsi:nil="true"/>
- </defaultValue>
- </ownedParameter>
- <ownedParameter xmi:type="uml:Parameter" xmi:id="_D0_awEbaEd6g-YgfS2DHrA" name="return" type="_SNSWAEbaEd6g-YgfS2DHrA" direction="return">
- <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_GFO_EEbaEd6g-YgfS2DHrA" value="1"/>
- <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_GFO_EUbaEd6g-YgfS2DHrA" value="1"/>
- <defaultValue xmi:type="uml:LiteralString" xmi:id="_GFO_EkbaEd6g-YgfS2DHrA">
- <value xsi:nil="true"/>
- </defaultValue>
- </ownedParameter>
- </ownedOperation>
- </packagedElement>
- <packagedElement xmi:type="uml:Class" xmi:id="_zd5g0EJVEd6kIY39uis5Uw" name="AbstractPage">
- <ownedAttribute xmi:type="uml:Property" xmi:id="_rLVHwEa1Ed6g-YgfS2DHrA" name="pageIdentifier" visibility="public" type="_A-BP8EVhEd6g-YgfS2DHrA" isUnique="false">
- <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_rLVHwka1Ed6g-YgfS2DHrA" value="1"/>
- <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_rLVHwUa1Ed6g-YgfS2DHrA" value="1"/>
- <defaultValue xmi:type="uml:LiteralString" xmi:id="_rLVHw0a1Ed6g-YgfS2DHrA">
- <value xsi:nil="true"/>
- </defaultValue>
- </ownedAttribute>
- </packagedElement>
- <packagedElement xmi:type="uml:Association" xmi:id="_9JomUEJVEd6kIY39uis5Uw" name="A_SashWindowsRoot_Window" memberEnd="_9KYNMEJVEd6kIY39uis5Uw _9Kh-MEJVEd6kIY39uis5Uw">
- <ownedEnd xmi:type="uml:Property" xmi:id="_9Kh-MEJVEd6kIY39uis5Uw" name="sashWindowsRoot" type="_UiIMMEJVEd6kIY39uis5Uw" isUnique="false" association="_9JomUEJVEd6kIY39uis5Uw">
- <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_9Kh-MkJVEd6kIY39uis5Uw"/>
- <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_9Kh-MUJVEd6kIY39uis5Uw" value="1"/>
- </ownedEnd>
- </packagedElement>
- <packagedElement xmi:type="uml:Association" xmi:id="__CVNUEJVEd6kIY39uis5Uw" name="A_PanelParent_AbstractPanel" memberEnd="__Ce-UEJVEd6kIY39uis5Uw __CoIQEJVEd6kIY39uis5Uw"/>
- <packagedElement xmi:type="uml:Association" xmi:id="_AM_CkEJWEd6kIY39uis5Uw" name="A_TabFolder_AbstractPageRef" memberEnd="_ANIzkEJWEd6kIY39uis5Uw _ANIzk0JWEd6kIY39uis5Uw"/>
- <packagedElement xmi:type="uml:Class" xmi:id="_86BAgEJWEd6kIY39uis5Uw" name="PanelParent" isAbstract="true">
- <ownedAttribute xmi:type="uml:Property" xmi:id="__Ce-UEJVEd6kIY39uis5Uw" name="children" type="_Zx2ZYEJVEd6kIY39uis5Uw" aggregation="composite" association="__CVNUEJVEd6kIY39uis5Uw">
- <lowerValue xmi:type="uml:LiteralInteger" xmi:id="__Ce-UUJVEd6kIY39uis5Uw" value="2"/>
- <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="__Ce-UkJVEd6kIY39uis5Uw" value="2"/>
- </ownedAttribute>
- <ownedOperation xmi:type="uml:Operation" xmi:id="_yG3I4EoKEd6ussMWxXGeXg" name="replaceChild">
- <ownedComment xmi:type="uml:Comment" xmi:id="_AxysQEoLEd6ussMWxXGeXg" annotatedElement="_yG3I4EoKEd6ussMWxXGeXg">
- <body>Replace the specified child by the new value.&#xD;
-Don't need to be implemented in TabFolder.&#xD;
-Used to insert a new SashPanel.</body>
- </ownedComment>
- <ownedParameter xmi:type="uml:Parameter" xmi:id="_zqjwQEoKEd6ussMWxXGeXg" name="oldChild" type="_Zx2ZYEJVEd6kIY39uis5Uw">
- <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_3Q7aAEoKEd6ussMWxXGeXg" value="1"/>
- <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_3Q7aAUoKEd6ussMWxXGeXg" value="1"/>
- <defaultValue xmi:type="uml:LiteralString" xmi:id="_3Q7aAkoKEd6ussMWxXGeXg">
- <value xsi:nil="true"/>
- </defaultValue>
- </ownedParameter>
- <ownedParameter xmi:type="uml:Parameter" xmi:id="_3dJREEoKEd6ussMWxXGeXg" name="newChild" type="_Zx2ZYEJVEd6kIY39uis5Uw">
- <lowerValue xmi:type="uml:LiteralInteger" xmi:id="__gbLAEoKEd6ussMWxXGeXg" value="1"/>
- <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="__gbLAUoKEd6ussMWxXGeXg" value="1"/>
- <defaultValue xmi:type="uml:LiteralString" xmi:id="__gbLAkoKEd6ussMWxXGeXg">
- <value xsi:nil="true"/>
- </defaultValue>
- </ownedParameter>
- </ownedOperation>
- </packagedElement>
- <packagedElement xmi:type="uml:Association" xmi:id="_viyZUEJZEd6kIY39uis5Uw" name="A_PageList_PageRef" memberEnd="_vjFUQEJZEd6kIY39uis5Uw _vjYPMkJZEd6kIY39uis5Uw">
- <ownedEnd xmi:type="uml:Property" xmi:id="_vjYPMkJZEd6kIY39uis5Uw" name="sashWindowsRoot" type="_b7a4cEMaEd6kIY39uis5Uw" isUnique="false" association="_viyZUEJZEd6kIY39uis5Uw">
- <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_vjiAMUJZEd6kIY39uis5Uw"/>
- <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_vjiAMEJZEd6kIY39uis5Uw" value="1"/>
- </ownedEnd>
- </packagedElement>
- <packagedElement xmi:type="uml:Association" xmi:id="_mT2jkEJkEd6kIY39uis5Uw" name="A_SashWindowsRoot_TabFolder" memberEnd="_mW0_EEJkEd6kIY39uis5Uw _mW0_E0JkEd6kIY39uis5Uw">
- <ownedEnd xmi:type="uml:Property" xmi:id="_mW0_E0JkEd6kIY39uis5Uw" name="sashWindowsRoot" type="_UiIMMEJVEd6kIY39uis5Uw" isUnique="false" association="_mT2jkEJkEd6kIY39uis5Uw">
- <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_mW-wEUJkEd6kIY39uis5Uw"/>
- <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_mW-wEEJkEd6kIY39uis5Uw" value="*"/>
- </ownedEnd>
- </packagedElement>
- <packagedElement xmi:type="uml:Class" xmi:id="_b7a4cEMaEd6kIY39uis5Uw" name="PageList">
- <ownedAttribute xmi:type="uml:Property" xmi:id="_vjFUQEJZEd6kIY39uis5Uw" name="availablePage" type="_h_HVwEJVEd6kIY39uis5Uw" aggregation="composite" association="_viyZUEJZEd6kIY39uis5Uw">
- <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_vjYPMEJZEd6kIY39uis5Uw"/>
- <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_vjYPMUJZEd6kIY39uis5Uw" value="*"/>
- </ownedAttribute>
- <ownedOperation xmi:type="uml:Operation" xmi:id="_i92ooEa4Ed6g-YgfS2DHrA" name="addPage">
- <ownedParameter xmi:type="uml:Parameter" xmi:id="_i92ooUa4Ed6g-YgfS2DHrA" name="pageIdentifier" type="_A-BP8EVhEd6g-YgfS2DHrA">
- <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_i92oo0a4Ed6g-YgfS2DHrA" value="1"/>
- <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_i92ooka4Ed6g-YgfS2DHrA" value="1"/>
- <defaultValue xmi:type="uml:LiteralString" xmi:id="_i92opEa4Ed6g-YgfS2DHrA">
- <value xsi:nil="true"/>
- </defaultValue>
- </ownedParameter>
- </ownedOperation>
- <ownedOperation xmi:type="uml:Operation" xmi:id="_ocolgEa4Ed6g-YgfS2DHrA" name="removePage">
- <ownedParameter xmi:type="uml:Parameter" xmi:id="_ocolgUa4Ed6g-YgfS2DHrA" name="pageIdentifier" type="_A-BP8EVhEd6g-YgfS2DHrA">
- <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_ocolg0a4Ed6g-YgfS2DHrA" value="1"/>
- <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_ocolgka4Ed6g-YgfS2DHrA" value="1"/>
- <defaultValue xmi:type="uml:LiteralString" xmi:id="_ocolhEa4Ed6g-YgfS2DHrA">
- <value xsi:nil="true"/>
- </defaultValue>
- </ownedParameter>
- </ownedOperation>
- </packagedElement>
- <packagedElement xmi:type="uml:Class" xmi:id="_-9vywEMaEd6kIY39uis5Uw" name="SashWindowsMngr">
- <ownedAttribute xmi:type="uml:Property" xmi:id="_9osO4EMbEd6kIY39uis5Uw" name="pageList" type="_b7a4cEMaEd6kIY39uis5Uw" isUnique="false" aggregation="composite" association="_9k0bgEMbEd6kIY39uis5Uw">
- <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_9osO4UMbEd6kIY39uis5Uw" value="1"/>
- <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_9osO4kMbEd6kIY39uis5Uw" value="1"/>
- </ownedAttribute>
- <ownedAttribute xmi:type="uml:Property" xmi:id="_-JenwEMbEd6kIY39uis5Uw" name="sashModel" type="_UiIMMEJVEd6kIY39uis5Uw" isUnique="false" aggregation="composite" association="_-EQwkEMbEd6kIY39uis5Uw">
- <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_-JnxsEMbEd6kIY39uis5Uw" value="1"/>
- <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_-JnxsUMbEd6kIY39uis5Uw" value="1"/>
- </ownedAttribute>
- </packagedElement>
- <packagedElement xmi:type="uml:Association" xmi:id="_9k0bgEMbEd6kIY39uis5Uw" name="A_MultiPageEditor_PageList" memberEnd="_9osO4EMbEd6kIY39uis5Uw _9osO40MbEd6kIY39uis5Uw">
- <ownedEnd xmi:type="uml:Property" xmi:id="_9osO40MbEd6kIY39uis5Uw" name="multiPageEditor" type="_-9vywEMaEd6kIY39uis5Uw" isUnique="false" association="_9k0bgEMbEd6kIY39uis5Uw">
- <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_9o1_4UMbEd6kIY39uis5Uw"/>
- <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_9o1_4EMbEd6kIY39uis5Uw" value="1"/>
- </ownedEnd>
- </packagedElement>
- <packagedElement xmi:type="uml:Association" xmi:id="_-EQwkEMbEd6kIY39uis5Uw" name="A_MultiPageEditor_SashWindowsLayout" memberEnd="_-JenwEMbEd6kIY39uis5Uw _-JnxskMbEd6kIY39uis5Uw">
- <ownedEnd xmi:type="uml:Property" xmi:id="_-JnxskMbEd6kIY39uis5Uw" name="multiPageEditor" type="_-9vywEMaEd6kIY39uis5Uw" isUnique="false" association="_-EQwkEMbEd6kIY39uis5Uw">
- <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_-JnxtEMbEd6kIY39uis5Uw"/>
- <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_-Jnxs0MbEd6kIY39uis5Uw" value="1"/>
- </ownedEnd>
- </packagedElement>
- <packagedElement xmi:type="uml:Class" xmi:id="_jc9vQESDEd6kIY39uis5Uw" name="Position">
- <ownedAttribute xmi:type="uml:Property" xmi:id="_m9q14ESDEd6kIY39uis5Uw" name="x" visibility="public" type="_Hkk78EVbEd6g-YgfS2DHrA" isUnique="false">
- <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_pZ1WUESDEd6kIY39uis5Uw" value="1"/>
- <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_pZ1WUUSDEd6kIY39uis5Uw" value="1"/>
- <defaultValue xmi:type="uml:LiteralString" xmi:id="_paIRQESDEd6kIY39uis5Uw">
- <value xsi:nil="true"/>
- </defaultValue>
- </ownedAttribute>
- <ownedAttribute xmi:type="uml:Property" xmi:id="_pmDNYESDEd6kIY39uis5Uw" name="y" visibility="public" type="_Hkk78EVbEd6g-YgfS2DHrA" isUnique="false">
- <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_q458YESDEd6kIY39uis5Uw" value="1"/>
- <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_q5DtYESDEd6kIY39uis5Uw" value="1"/>
- <defaultValue xmi:type="uml:LiteralString" xmi:id="_q5DtYUSDEd6kIY39uis5Uw">
- <value xsi:nil="true"/>
- </defaultValue>
- </ownedAttribute>
- </packagedElement>
- <packagedElement xmi:type="uml:Class" xmi:id="_lh4NUESDEd6kIY39uis5Uw" name="Size">
- <ownedAttribute xmi:type="uml:Property" xmi:id="_s1CR4ESDEd6kIY39uis5Uw" name="width" visibility="public" type="_Hkk78EVbEd6g-YgfS2DHrA" isUnique="false">
- <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_u5DYEESDEd6kIY39uis5Uw" value="1"/>
- <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_u5NJEESDEd6kIY39uis5Uw" value="1"/>
- <defaultValue xmi:type="uml:LiteralString" xmi:id="_u5NJEUSDEd6kIY39uis5Uw">
- <value xsi:nil="true"/>
- </defaultValue>
- </ownedAttribute>
- <ownedAttribute xmi:type="uml:Property" xmi:id="_vnZr0ESDEd6kIY39uis5Uw" name="length" visibility="public" type="_Hkk78EVbEd6g-YgfS2DHrA" isUnique="false">
- <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_w_T58ESDEd6kIY39uis5Uw" value="1"/>
- <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_w_dq8ESDEd6kIY39uis5Uw" value="1"/>
- <defaultValue xmi:type="uml:LiteralString" xmi:id="_w_dq8USDEd6kIY39uis5Uw">
- <value xsi:nil="true"/>
- </defaultValue>
- </ownedAttribute>
- </packagedElement>
- <packagedElement xmi:type="uml:PrimitiveType" xmi:id="_Hkk78EVbEd6g-YgfS2DHrA" name="Integer"/>
- <packagedElement xmi:type="uml:PrimitiveType" xmi:id="_A-BP8EVhEd6g-YgfS2DHrA" name="JavaObject"/>
- <packagedElement xmi:type="uml:PrimitiveType" xmi:id="_IEBx4EV4Ed6g-YgfS2DHrA" name="Float"/>
- <packagedElement xmi:type="uml:PrimitiveType" xmi:id="_SNSWAEbaEd6g-YgfS2DHrA" name="boolean"/>
- <packagedElement xmi:type="uml:Association" xmi:id="_b3enUEnjEd6ussMWxXGeXg" name="A_PageRef_EObject" memberEnd="_b94xUEnjEd6ussMWxXGeXg _b-CiUknjEd6ussMWxXGeXg">
- <ownedEnd xmi:type="uml:Property" xmi:id="_b-CiUknjEd6ussMWxXGeXg" name="pageRef" visibility="public" type="_h_HVwEJVEd6kIY39uis5Uw" isUnique="false" association="_b3enUEnjEd6ussMWxXGeXg">
- <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_b-MTUUnjEd6ussMWxXGeXg"/>
- <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_b-MTUEnjEd6ussMWxXGeXg" value="*"/>
- </ownedEnd>
- </packagedElement>
- <packagedElement xmi:type="uml:Association" xmi:id="_li3-0EsFEd6MxdnlcgT3eA" name="A_Window_AbstractPanel" memberEnd="_lnNFMEsFEd6MxdnlcgT3eA _lnWPIksFEd6MxdnlcgT3eA">
- <ownedEnd xmi:type="uml:Property" xmi:id="_lnWPIksFEd6MxdnlcgT3eA" name="window" type="_Xa5wIEJVEd6kIY39uis5Uw" isUnique="false" association="_li3-0EsFEd6MxdnlcgT3eA">
- <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_lnWPJEsFEd6MxdnlcgT3eA"/>
- <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_lnWPI0sFEd6MxdnlcgT3eA" value="*"/>
- </ownedEnd>
- </packagedElement>
- <profileApplication xmi:type="uml:ProfileApplication" xmi:id="_NuHhwkJVEd6kIY39uis5Uw">
- <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_NuHhw0JVEd6kIY39uis5Uw" source="http://www.eclipse.org/uml2/2.0.0/UML">
- <references xmi:type="ecore:EPackage" href="http://www.eclipse.org/uml2/5.0.0/UML/Profile/Standard#/"/>
- </eAnnotations>
- <appliedProfile xmi:type="uml:Profile" href="pathmap://UML_PROFILES/StandardL2.profile.uml#_0"/>
- </profileApplication>
- <profileApplication xmi:type="uml:ProfileApplication" xmi:id="_wpAy0EJfEd6kIY39uis5Uw">
- <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_wpJ8wEJfEd6kIY39uis5Uw" source="http://www.eclipse.org/uml2/2.0.0/UML">
- <references xmi:type="ecore:EPackage" href="pathmap://UML_PROFILES/Ecore.profile.uml#_z1OFcHjqEdy8S4Cr8Rc_NA"/>
- </eAnnotations>
- <appliedProfile xmi:type="uml:Profile" href="pathmap://UML_PROFILES/Ecore.profile.uml#_0"/>
- </profileApplication>
- <profileApplication xmi:type="uml:ProfileApplication" xmi:id="_T73od1ViEeWe8LyZrqaAug">
- <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_T73oeFViEeWe8LyZrqaAug" source="http://www.eclipse.org/uml2/2.0.0/UML">
- <references xmi:type="ecore:EPackage" href="pathmap://PAPYRUS_ACTIONLANGUAGE_PROFILE/ActionLanguage-Profile.profile.uml#_Kv8EIKFXEeS_KNX0nfvIVQ"/>
- </eAnnotations>
- <appliedProfile xmi:type="uml:Profile" href="pathmap://PAPYRUS_ACTIONLANGUAGE_PROFILE/ActionLanguage-Profile.profile.uml#ActionLanguage"/>
- </profileApplication>
- </uml:Model>
- <Ecore:EPackage xmi:id="_mo48QEJgEd6kIY39uis5Uw" base_Package="_NuHhwEJVEd6kIY39uis5Uw" nsPrefix="di" nsURI="http://www.eclipse.org/papyrus/0.7.0/sashdi" basePackage="org.eclipse.papyrus.infra.core.sashwindows" prefix="Di">
- <annotation>resource=XMI</annotation>
- </Ecore:EPackage>
- <Ecore:EDataType xmi:id="_6EWpcEVgEd6g-YgfS2DHrA" instanceClassName="int" base_PrimitiveType="_Hkk78EVbEd6g-YgfS2DHrA" dataTypeName="int"/>
- <Ecore:EDataType xmi:id="_DLSYwEVhEd6g-YgfS2DHrA" instanceClassName="java.lang.Object" base_PrimitiveType="_A-BP8EVhEd6g-YgfS2DHrA"/>
- <Ecore:EDataType xmi:id="_MeaSgEV4Ed6g-YgfS2DHrA" instanceClassName="float" base_PrimitiveType="_IEBx4EV4Ed6g-YgfS2DHrA"/>
- <Ecore:EDataType xmi:id="_UtLf4EbaEd6g-YgfS2DHrA" instanceClassName="boolean" base_PrimitiveType="_SNSWAEbaEd6g-YgfS2DHrA"/>
- <Ecore:EAttribute xmi:id="_UVaAMEnnEd6ussMWxXGeXg" isTransient="true" base_Property="_GrqUYEnkEd6ussMWxXGeXg"/>
- <Ecore:EReference xmi:id="_uX7T8EsFEd6MxdnlcgT3eA" isTransient="true" isVolatile="true" base_Property="_lnNFMEsFEd6MxdnlcgT3eA"/>
-</xmi:XMI>
+<?xml version="1.0" encoding="UTF-8"?>
+<xmi:XMI xmi:version="20131001" xmlns:xmi="http://www.omg.org/spec/XMI/20131001" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:Ecore="http://www.eclipse.org/uml2/schemas/Ecore/5" xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" xmlns:uml="http://www.eclipse.org/uml2/5.0.0/UML" xsi:schemaLocation="http://www.eclipse.org/uml2/schemas/Ecore/5 pathmap://UML_PROFILES/Ecore.profile.uml#_z1OFcHjqEdy8S4Cr8Rc_NA">
+ <uml:Model xmi:id="_NuHhwEJVEd6kIY39uis5Uw" name="di" URI="http://www.eclipse.org/papyrus/0.7.0/sashdi">
+ <packageImport xmi:type="uml:PackageImport" xmi:id="_F0PskN5qEd2dfviKlv9PXw">
+ <importedPackage xmi:type="uml:Model" href="pathmap://UML_METAMODELS/Ecore.metamodel.uml#_0"/>
+ </packageImport>
+ <packagedElement xmi:type="uml:Class" xmi:id="_UiIMMEJVEd6kIY39uis5Uw" name="SashModel">
+ <ownedComment xmi:type="uml:Comment" xmi:id="_UyqHoEUrEd6g-YgfS2DHrA" annotatedElement="_UiIMMEJVEd6kIY39uis5Uw">
+ <body>Root node of the model describing the sash windows, panels and pages.&#xD;
+A SashModel can have several windows containing panels separated by sashes. Such panels can be folders &#xD;
+containing pages.</body>
+ </ownedComment>
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_9KYNMEJVEd6kIY39uis5Uw" name="windows" type="_Xa5wIEJVEd6kIY39uis5Uw" aggregation="composite" association="_9JomUEJVEd6kIY39uis5Uw">
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_9KYNMUJVEd6kIY39uis5Uw"/>
+ <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_9KYNMkJVEd6kIY39uis5Uw" value="*"/>
+ </ownedAttribute>
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_mW0_EEJkEd6kIY39uis5Uw" name="currentSelection" type="_fbWYgEJVEd6kIY39uis5Uw" isUnique="false" association="_mT2jkEJkEd6kIY39uis5Uw">
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_mW0_EUJkEd6kIY39uis5Uw" value="1"/>
+ <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_mW0_EkJkEd6kIY39uis5Uw" value="1"/>
+ </ownedAttribute>
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_eF-DIJUXEeWeT68xCjxnSQ" name="restoreActivePage" type="_SNSWAEbaEd6g-YgfS2DHrA"/>
+ <ownedOperation xmi:type="uml:Operation" xmi:id="_wdFgUEV4Ed6g-YgfS2DHrA" name="addPage">
+ <ownedParameter xmi:type="uml:Parameter" xmi:id="_yMF_0EV4Ed6g-YgfS2DHrA" name="pageIdentifier" type="_A-BP8EVhEd6g-YgfS2DHrA">
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_1N0EYEV4Ed6g-YgfS2DHrA" value="1"/>
+ <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_1N0EYUV4Ed6g-YgfS2DHrA" value="1"/>
+ <defaultValue xmi:type="uml:LiteralString" xmi:id="_1N0EYkV4Ed6g-YgfS2DHrA">
+ <value xsi:nil="true"/>
+ </defaultValue>
+ </ownedParameter>
+ </ownedOperation>
+ <ownedOperation xmi:type="uml:Operation" xmi:id="_m7xPsEa4Ed6g-YgfS2DHrA" name="removePage">
+ <ownedParameter xmi:type="uml:Parameter" xmi:id="_m7xPsUa4Ed6g-YgfS2DHrA" name="pageIdentifier" type="_A-BP8EVhEd6g-YgfS2DHrA">
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_m7xPs0a4Ed6g-YgfS2DHrA" value="1"/>
+ <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_m7xPska4Ed6g-YgfS2DHrA" value="1"/>
+ <defaultValue xmi:type="uml:LiteralString" xmi:id="_m7xPtEa4Ed6g-YgfS2DHrA">
+ <value xsi:nil="true"/>
+ </defaultValue>
+ </ownedParameter>
+ </ownedOperation>
+ <ownedOperation xmi:type="uml:Operation" xmi:id="_e9ojYEbXEd6g-YgfS2DHrA" name="lookupPage">
+ <ownedComment xmi:type="uml:Comment" xmi:id="_hi4uYEbXEd6g-YgfS2DHrA" annotatedElement="_e9ojYEbXEd6g-YgfS2DHrA">
+ <body>Lookup the pageRef identified by the pageIdentifier.&#xD;
+Return the pageRef or null if not found.&#xD;
+Lookup in the entire SashModel structure.</body>
+ </ownedComment>
+ <ownedParameter xmi:type="uml:Parameter" xmi:id="_e9ojYUbXEd6g-YgfS2DHrA" name="pageIdentifier" type="_A-BP8EVhEd6g-YgfS2DHrA">
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_e9ojY0bXEd6g-YgfS2DHrA" value="1"/>
+ <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_e9ojYkbXEd6g-YgfS2DHrA" value="1"/>
+ <defaultValue xmi:type="uml:LiteralString" xmi:id="_e9ojZEbXEd6g-YgfS2DHrA">
+ <value xsi:nil="true"/>
+ </defaultValue>
+ </ownedParameter>
+ <ownedParameter xmi:type="uml:Parameter" xmi:id="_UTCMcEbYEd6g-YgfS2DHrA" name="return" type="_h_HVwEJVEd6kIY39uis5Uw" direction="return">
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_WgwBMEbYEd6g-YgfS2DHrA" value="1"/>
+ <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_Wg5LIEbYEd6g-YgfS2DHrA" value="1"/>
+ <defaultValue xmi:type="uml:LiteralString" xmi:id="_Wg5LIUbYEd6g-YgfS2DHrA">
+ <value xsi:nil="true"/>
+ </defaultValue>
+ </ownedParameter>
+ </ownedOperation>
+ <ownedOperation xmi:type="uml:Operation" xmi:id="_q8zekEbsEd6g-YgfS2DHrA" name="movePage">
+ <ownedParameter xmi:type="uml:Parameter" xmi:id="_sQ_qUEbsEd6g-YgfS2DHrA" name="srcParentFolder" type="_fbWYgEJVEd6kIY39uis5Uw">
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_wdNzIEbsEd6g-YgfS2DHrA" value="1"/>
+ <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_wdW9EEbsEd6g-YgfS2DHrA" value="1"/>
+ <defaultValue xmi:type="uml:LiteralString" xmi:id="_wdW9EUbsEd6g-YgfS2DHrA">
+ <value xsi:nil="true"/>
+ </defaultValue>
+ </ownedParameter>
+ <ownedParameter xmi:type="uml:Parameter" xmi:id="_q8zekUbsEd6g-YgfS2DHrA" name="srcIndex" type="_Hkk78EVbEd6g-YgfS2DHrA">
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_q8zek0bsEd6g-YgfS2DHrA" value="1"/>
+ <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_q8zekkbsEd6g-YgfS2DHrA" value="1"/>
+ <defaultValue xmi:type="uml:LiteralString" xmi:id="_q8zelEbsEd6g-YgfS2DHrA">
+ <value xsi:nil="true"/>
+ </defaultValue>
+ </ownedParameter>
+ <ownedParameter xmi:type="uml:Parameter" xmi:id="_wqxuAEbsEd6g-YgfS2DHrA" name="targetParentFolder" type="_fbWYgEJVEd6kIY39uis5Uw">
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_y6twUEbsEd6g-YgfS2DHrA" value="1"/>
+ <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_y6twUUbsEd6g-YgfS2DHrA" value="1"/>
+ <defaultValue xmi:type="uml:LiteralString" xmi:id="_y6twUkbsEd6g-YgfS2DHrA">
+ <value xsi:nil="true"/>
+ </defaultValue>
+ </ownedParameter>
+ <ownedParameter xmi:type="uml:Parameter" xmi:id="_q8zelUbsEd6g-YgfS2DHrA" name="targetIndex" type="_Hkk78EVbEd6g-YgfS2DHrA">
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_q8zel0bsEd6g-YgfS2DHrA" value="1"/>
+ <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_q8zelkbsEd6g-YgfS2DHrA" value="1"/>
+ <defaultValue xmi:type="uml:LiteralString" xmi:id="_q8zemEbsEd6g-YgfS2DHrA">
+ <value xsi:nil="true"/>
+ </defaultValue>
+ </ownedParameter>
+ </ownedOperation>
+ <ownedOperation xmi:type="uml:Operation" xmi:id="_vnqNcEoIEd6ussMWxXGeXg" name="insertFolder">
+ <ownedParameter xmi:type="uml:Parameter" xmi:id="_vnqNcUoIEd6ussMWxXGeXg" name="folderToInsert" type="_fbWYgEJVEd6kIY39uis5Uw">
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_vnqNc0oIEd6ussMWxXGeXg" value="1"/>
+ <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_vnqNckoIEd6ussMWxXGeXg" value="1"/>
+ <defaultValue xmi:type="uml:LiteralString" xmi:id="_vnqNdEoIEd6ussMWxXGeXg">
+ <value xsi:nil="true"/>
+ </defaultValue>
+ </ownedParameter>
+ <ownedParameter xmi:type="uml:Parameter" xmi:id="_vnqNeUoIEd6ussMWxXGeXg" name="refFolder" type="_fbWYgEJVEd6kIY39uis5Uw">
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_vnqNe0oIEd6ussMWxXGeXg" value="1"/>
+ <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_vnqNekoIEd6ussMWxXGeXg" value="1"/>
+ <defaultValue xmi:type="uml:LiteralString" xmi:id="_vnqNfEoIEd6ussMWxXGeXg">
+ <value xsi:nil="true"/>
+ </defaultValue>
+ </ownedParameter>
+ <ownedParameter xmi:type="uml:Parameter" xmi:id="_vnqNfUoIEd6ussMWxXGeXg" name="refFolderSide" type="_Hkk78EVbEd6g-YgfS2DHrA">
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_vnqNf0oIEd6ussMWxXGeXg" value="1"/>
+ <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_vnqNfkoIEd6ussMWxXGeXg" value="1"/>
+ <defaultValue xmi:type="uml:LiteralString" xmi:id="_vnqNgEoIEd6ussMWxXGeXg">
+ <value xsi:nil="true"/>
+ </defaultValue>
+ </ownedParameter>
+ </ownedOperation>
+ <ownedOperation xmi:type="uml:Operation" xmi:id="_Kvf9cEoJEd6ussMWxXGeXg" name="movePage">
+ <ownedParameter xmi:type="uml:Parameter" xmi:id="_Kvf9cUoJEd6ussMWxXGeXg" name="srcParentFolder" type="_fbWYgEJVEd6kIY39uis5Uw">
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_Kvf9c0oJEd6ussMWxXGeXg" value="1"/>
+ <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_Kvf9ckoJEd6ussMWxXGeXg" value="1"/>
+ <defaultValue xmi:type="uml:LiteralString" xmi:id="_Kvf9dEoJEd6ussMWxXGeXg">
+ <value xsi:nil="true"/>
+ </defaultValue>
+ </ownedParameter>
+ <ownedParameter xmi:type="uml:Parameter" xmi:id="_Kvf9dUoJEd6ussMWxXGeXg" name="srcIndex" type="_Hkk78EVbEd6g-YgfS2DHrA">
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_Kvf9d0oJEd6ussMWxXGeXg" value="1"/>
+ <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_Kvf9dkoJEd6ussMWxXGeXg" value="1"/>
+ <defaultValue xmi:type="uml:LiteralString" xmi:id="_Kvf9eEoJEd6ussMWxXGeXg">
+ <value xsi:nil="true"/>
+ </defaultValue>
+ </ownedParameter>
+ <ownedParameter xmi:type="uml:Parameter" xmi:id="_Kvf9eUoJEd6ussMWxXGeXg" name="targetParentFolder" type="_fbWYgEJVEd6kIY39uis5Uw">
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_Kvf9e0oJEd6ussMWxXGeXg" value="1"/>
+ <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_Kvf9ekoJEd6ussMWxXGeXg" value="1"/>
+ <defaultValue xmi:type="uml:LiteralString" xmi:id="_Kvf9fEoJEd6ussMWxXGeXg">
+ <value xsi:nil="true"/>
+ </defaultValue>
+ </ownedParameter>
+ </ownedOperation>
+ <ownedOperation xmi:type="uml:Operation" xmi:id="_OoMtUEoJEd6ussMWxXGeXg" name="removeEmptyFolder">
+ <ownedParameter xmi:type="uml:Parameter" xmi:id="_OoMtUUoJEd6ussMWxXGeXg" name="folder" type="_fbWYgEJVEd6kIY39uis5Uw">
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_OoMtU0oJEd6ussMWxXGeXg" value="1"/>
+ <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_OoMtUkoJEd6ussMWxXGeXg" value="1"/>
+ <defaultValue xmi:type="uml:LiteralString" xmi:id="_OoMtVEoJEd6ussMWxXGeXg">
+ <value xsi:nil="true"/>
+ </defaultValue>
+ </ownedParameter>
+ </ownedOperation>
+ <ownedOperation xmi:type="uml:Operation" xmi:id="_vaMqoE4OEd-B2uXHu4qMXg" name="removeAllPages">
+ <ownedComment xmi:type="uml:Comment" xmi:id="_yKxU0E4OEd-B2uXHu4qMXg" annotatedElement="_vaMqoE4OEd-B2uXHu4qMXg">
+ <body>Remove all pages from the model. Only left one empty top level folder.</body>
+ </ownedComment>
+ </ownedOperation>
+ <ownedOperation xmi:type="uml:Operation" xmi:id="_-TkSoE4OEd-B2uXHu4qMXg" name="removeOtherPages">
+ <ownedComment xmi:type="uml:Comment" xmi:id="_Ar2_sE4PEd-B2uXHu4qMXg" annotatedElement="_-TkSoE4OEd-B2uXHu4qMXg">
+ <body>Remove pages other than the one specified from the model. Intermediate folders are also removed.</body>
+ </ownedComment>
+ <ownedParameter xmi:type="uml:Parameter" xmi:id="_-TkSoU4OEd-B2uXHu4qMXg" name="pageIdentifier" type="_A-BP8EVhEd6g-YgfS2DHrA">
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_-TkSo04OEd-B2uXHu4qMXg" value="1"/>
+ <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_-TkSok4OEd-B2uXHu4qMXg" value="1"/>
+ <defaultValue xmi:type="uml:LiteralString" xmi:id="_-TkSpE4OEd-B2uXHu4qMXg">
+ <value xsi:nil="true"/>
+ </defaultValue>
+ </ownedParameter>
+ </ownedOperation>
+ <ownedOperation xmi:type="uml:Operation" xmi:id="_1jUIgE4PEd-B2uXHu4qMXg" name="lookupFirstWindow">
+ <ownedComment xmi:type="uml:Comment" xmi:id="_JhGFkE4QEd-B2uXHu4qMXg" annotatedElement="_1jUIgE4PEd-B2uXHu4qMXg">
+ <body>Get the first available window.</body>
+ </ownedComment>
+ <ownedParameter xmi:type="uml:Parameter" xmi:id="_9JGOIE4PEd-B2uXHu4qMXg" name="window" type="_Xa5wIEJVEd6kIY39uis5Uw" direction="return">
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="__PD1EE4PEd-B2uXHu4qMXg" value="1"/>
+ <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="__PD1EU4PEd-B2uXHu4qMXg" value="1"/>
+ <defaultValue xmi:type="uml:LiteralString" xmi:id="__PD1Ek4PEd-B2uXHu4qMXg">
+ <value xsi:nil="true"/>
+ </defaultValue>
+ </ownedParameter>
+ </ownedOperation>
+ <ownedOperation xmi:type="uml:Operation" xmi:id="_4qi_ME4PEd-B2uXHu4qMXg" name="lookupFirstFolder">
+ <ownedComment xmi:type="uml:Comment" xmi:id="_MKOD8E4QEd-B2uXHu4qMXg" annotatedElement="_4qi_ME4PEd-B2uXHu4qMXg">
+ <body>Lookup the first available folder.</body>
+ </ownedComment>
+ <ownedParameter xmi:type="uml:Parameter" xmi:id="__o-w8E4PEd-B2uXHu4qMXg" name="folder" type="_fbWYgEJVEd6kIY39uis5Uw" direction="return">
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_BOwb8E4QEd-B2uXHu4qMXg" value="1"/>
+ <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_BO6M8E4QEd-B2uXHu4qMXg" value="1"/>
+ <defaultValue xmi:type="uml:LiteralString" xmi:id="_BO6M8U4QEd-B2uXHu4qMXg">
+ <value xsi:nil="true"/>
+ </defaultValue>
+ </ownedParameter>
+ </ownedOperation>
+ <ownedOperation xmi:type="uml:Operation" xmi:id="_fPvj8FgxEeGNKLzLkykmJw" name="removePageAndEmptyFolder">
+ <ownedParameter xmi:type="uml:Parameter" xmi:id="_fPvj8VgxEeGNKLzLkykmJw" name="pageIdentifier" type="_A-BP8EVhEd6g-YgfS2DHrA">
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_fPvj8lgxEeGNKLzLkykmJw" value="1"/>
+ <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_fPvj81gxEeGNKLzLkykmJw" value="1"/>
+ <defaultValue xmi:type="uml:LiteralString" xmi:id="_fPvj9FgxEeGNKLzLkykmJw">
+ <value xsi:nil="true"/>
+ </defaultValue>
+ </ownedParameter>
+ </ownedOperation>
+ <ownedOperation xmi:type="uml:Operation" xmi:id="_zdr0wGySEeKx9Kegn5X27A" name="setCurrentSelectionSilently">
+ <ownedComment xmi:type="uml:Comment" xmi:id="_CMVagGyTEeKx9Kegn5X27A">
+ <body>Set the current selection without firing a changedEvent.</body>
+ </ownedComment>
+ <ownedParameter xmi:type="uml:Parameter" xmi:id="_5Z9l8GySEeKx9Kegn5X27A" name="selection" type="_fbWYgEJVEd6kIY39uis5Uw"/>
+ </ownedOperation>
+ <ownedOperation xmi:type="uml:Operation" xmi:id="_HtBbEFVkEeWe8LyZrqaAug" name="addPage">
+ <ownedParameter xmi:type="uml:Parameter" xmi:id="_KIfX8FVkEeWe8LyZrqaAug" name="folder" type="_fbWYgEJVEd6kIY39uis5Uw"/>
+ <ownedParameter xmi:type="uml:Parameter" xmi:id="_HtBbEVVkEeWe8LyZrqaAug" name="pageIdentifier" type="_A-BP8EVhEd6g-YgfS2DHrA">
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_HtBbElVkEeWe8LyZrqaAug" value="1"/>
+ <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_HtBbE1VkEeWe8LyZrqaAug" value="1"/>
+ <defaultValue xmi:type="uml:LiteralString" xmi:id="_HtBbFFVkEeWe8LyZrqaAug">
+ <value xsi:nil="true"/>
+ </defaultValue>
+ </ownedParameter>
+ </ownedOperation>
+ <ownedOperation xmi:type="uml:Operation" xmi:id="_vv4NwFYZEeWe8LyZrqaAug" name="addPage">
+ <ownedParameter xmi:type="uml:Parameter" xmi:id="_vv4NwVYZEeWe8LyZrqaAug" name="folder" type="_fbWYgEJVEd6kIY39uis5Uw"/>
+ <ownedParameter xmi:type="uml:Parameter" xmi:id="_vv4NwlYZEeWe8LyZrqaAug" name="pageRef" type="_h_HVwEJVEd6kIY39uis5Uw">
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_vv4Nw1YZEeWe8LyZrqaAug" value="1"/>
+ <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_vv4NxFYZEeWe8LyZrqaAug" value="1"/>
+ <defaultValue xmi:type="uml:LiteralString" xmi:id="_vv4NxVYZEeWe8LyZrqaAug">
+ <value xsi:nil="true"/>
+ </defaultValue>
+ </ownedParameter>
+ </ownedOperation>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Class" xmi:id="_Xa5wIEJVEd6kIY39uis5Uw" name="Window">
+ <generalization xmi:type="uml:Generalization" xmi:id="_95DboEJWEd6kIY39uis5Uw" general="_86BAgEJWEd6kIY39uis5Uw"/>
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_yWfIQESDEd6kIY39uis5Uw" name="position" visibility="public" type="_jc9vQESDEd6kIY39uis5Uw" isUnique="false">
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_zpoyMESDEd6kIY39uis5Uw" value="1"/>
+ <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_zpoyMUSDEd6kIY39uis5Uw" value="1"/>
+ <defaultValue xmi:type="uml:LiteralString" xmi:id="_zpx8IESDEd6kIY39uis5Uw">
+ <value xsi:nil="true"/>
+ </defaultValue>
+ </ownedAttribute>
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_z0glcESDEd6kIY39uis5Uw" name="size" visibility="public" type="_lh4NUESDEd6kIY39uis5Uw" isUnique="false">
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_1ItYQESDEd6kIY39uis5Uw" value="1"/>
+ <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_1I2iMESDEd6kIY39uis5Uw" value="1"/>
+ <defaultValue xmi:type="uml:LiteralString" xmi:id="_1I2iMUSDEd6kIY39uis5Uw">
+ <value xsi:nil="true"/>
+ </defaultValue>
+ </ownedAttribute>
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_lnNFMEsFEd6MxdnlcgT3eA" name="panel" type="_Zx2ZYEJVEd6kIY39uis5Uw" isUnique="false" isDerived="true" association="_li3-0EsFEd6MxdnlcgT3eA">
+ <ownedComment xmi:type="uml:Comment" xmi:id="_xQZ88EsFEd6MxdnlcgT3eA" annotatedElement="_lnNFMEsFEd6MxdnlcgT3eA">
+ <body>Redefine children.</body>
+ </ownedComment>
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_9GbvwEsFEd6MxdnlcgT3eA" value="1"/>
+ <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_9Gk5sEsFEd6MxdnlcgT3eA" value="1"/>
+ </ownedAttribute>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Class" xmi:id="_Zx2ZYEJVEd6kIY39uis5Uw" name="AbstractPanel" isAbstract="true">
+ <ownedAttribute xmi:type="uml:Property" xmi:id="__CoIQEJVEd6kIY39uis5Uw" name="parent" type="_86BAgEJWEd6kIY39uis5Uw" isUnique="false" association="__CVNUEJVEd6kIY39uis5Uw">
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="__CoIQkJVEd6kIY39uis5Uw" value="1"/>
+ <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="__CoIQUJVEd6kIY39uis5Uw" value="1"/>
+ </ownedAttribute>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Class" xmi:id="_eE7YIEJVEd6kIY39uis5Uw" name="SashPanel">
+ <generalization xmi:type="uml:Generalization" xmi:id="_7VZokEJVEd6kIY39uis5Uw" general="_Zx2ZYEJVEd6kIY39uis5Uw"/>
+ <generalization xmi:type="uml:Generalization" xmi:id="_UH6OsEsDEd6MxdnlcgT3eA" general="_86BAgEJWEd6kIY39uis5Uw"/>
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_8rplQESDEd6kIY39uis5Uw" name="sashPosition" visibility="public" type="_IEBx4EV4Ed6g-YgfS2DHrA" isUnique="false">
+ <ownedComment xmi:type="uml:Comment" xmi:id="_AWCzYESEEd6kIY39uis5Uw" annotatedElement="_8rplQESDEd6kIY39uis5Uw">
+ <body>Position of the sash in the panel. The position is in percent. The value should be between 0 and 100.</body>
+ </ownedComment>
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="__l6W8ESDEd6kIY39uis5Uw" value="1"/>
+ <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="__mEH8ESDEd6kIY39uis5Uw" value="1"/>
+ <defaultValue xmi:type="uml:LiteralString" xmi:id="__mEH8USDEd6kIY39uis5Uw">
+ <value xsi:nil="true"/>
+ </defaultValue>
+ </ownedAttribute>
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_1nx64EbpEd6g-YgfS2DHrA" name="direction" visibility="public" type="_Hkk78EVbEd6g-YgfS2DHrA" isUnique="false">
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_4GxF0EbpEd6g-YgfS2DHrA" value="1"/>
+ <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_4G620EbpEd6g-YgfS2DHrA" value="1"/>
+ <defaultValue xmi:type="uml:LiteralString" xmi:id="_4G620UbpEd6g-YgfS2DHrA">
+ <value xsi:nil="true"/>
+ </defaultValue>
+ </ownedAttribute>
+ <ownedOperation xmi:type="uml:Operation" xmi:id="_eGcSEEoLEd6ussMWxXGeXg" name="setChildren">
+ <ownedParameter xmi:type="uml:Parameter" xmi:id="_f_4f8EoLEd6ussMWxXGeXg" name="leftChild" type="_Zx2ZYEJVEd6kIY39uis5Uw">
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_jqlQEEoLEd6ussMWxXGeXg" value="1"/>
+ <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_jquaAEoLEd6ussMWxXGeXg" value="1"/>
+ <defaultValue xmi:type="uml:LiteralString" xmi:id="_jquaAUoLEd6ussMWxXGeXg">
+ <value xsi:nil="true"/>
+ </defaultValue>
+ </ownedParameter>
+ <ownedParameter xmi:type="uml:Parameter" xmi:id="_j57ToEoLEd6ussMWxXGeXg" name="rightChild" type="_Zx2ZYEJVEd6kIY39uis5Uw">
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_l5xrgEoLEd6ussMWxXGeXg" value="1"/>
+ <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_l57cgEoLEd6ussMWxXGeXg" value="1"/>
+ <defaultValue xmi:type="uml:LiteralString" xmi:id="_l57cgUoLEd6ussMWxXGeXg">
+ <value xsi:nil="true"/>
+ </defaultValue>
+ </ownedParameter>
+ <ownedParameter xmi:type="uml:Parameter" xmi:id="_mVfXIEoLEd6ussMWxXGeXg" name="direction" type="_Hkk78EVbEd6g-YgfS2DHrA">
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_oo3vAEoLEd6ussMWxXGeXg" value="1"/>
+ <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_oo3vAUoLEd6ussMWxXGeXg" value="1"/>
+ <defaultValue xmi:type="uml:LiteralString" xmi:id="_oo3vAkoLEd6ussMWxXGeXg">
+ <value xsi:nil="true"/>
+ </defaultValue>
+ </ownedParameter>
+ </ownedOperation>
+ <ownedOperation xmi:type="uml:Operation" xmi:id="_tzrhgEuAEd6kcPOdk0bn7w" name="delete">
+ <ownedParameter xmi:type="uml:Parameter" xmi:id="_yPQU8EuAEd6kcPOdk0bn7w" name="childToDelete" type="_Zx2ZYEJVEd6kIY39uis5Uw">
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_2M3aAEuAEd6kcPOdk0bn7w" value="1"/>
+ <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_2M3aAUuAEd6kcPOdk0bn7w" value="1"/>
+ <defaultValue xmi:type="uml:LiteralString" xmi:id="_2M3aAkuAEd6kcPOdk0bn7w">
+ <value xsi:nil="true"/>
+ </defaultValue>
+ </ownedParameter>
+ </ownedOperation>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Class" xmi:id="_fbWYgEJVEd6kIY39uis5Uw" name="TabFolder">
+ <generalization xmi:type="uml:Generalization" xmi:id="_71vVgEJVEd6kIY39uis5Uw" general="_Zx2ZYEJVEd6kIY39uis5Uw"/>
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_ANIzkEJWEd6kIY39uis5Uw" name="children" type="_h_HVwEJVEd6kIY39uis5Uw" aggregation="composite" association="_AM_CkEJWEd6kIY39uis5Uw">
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_ANIzkUJWEd6kIY39uis5Uw"/>
+ <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_ANIzkkJWEd6kIY39uis5Uw" value="*"/>
+ </ownedAttribute>
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_kgs5oJUREeWeT68xCjxnSQ" name="currentSelection" type="_h_HVwEJVEd6kIY39uis5Uw" subsettedProperty="_ANIzkEJWEd6kIY39uis5Uw" association="_kgdpEJUREeWeT68xCjxnSQ">
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_vkeJEJUREeWeT68xCjxnSQ"/>
+ <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_vkhzcJUREeWeT68xCjxnSQ" value="1"/>
+ </ownedAttribute>
+ <ownedOperation xmi:type="uml:Operation" xmi:id="_Cqh_oEViEd6g-YgfS2DHrA" name="movePage">
+ <ownedParameter xmi:type="uml:Parameter" xmi:id="_ETI8MEViEd6g-YgfS2DHrA" name="oldIndex" type="_Hkk78EVbEd6g-YgfS2DHrA">
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_G2wIcEViEd6g-YgfS2DHrA" value="1"/>
+ <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_G2wIcUViEd6g-YgfS2DHrA" value="1"/>
+ <defaultValue xmi:type="uml:LiteralString" xmi:id="_G2wIckViEd6g-YgfS2DHrA">
+ <value xsi:nil="true"/>
+ </defaultValue>
+ </ownedParameter>
+ <ownedParameter xmi:type="uml:Parameter" xmi:id="_X27C4EV4Ed6g-YgfS2DHrA" name="newIndex" type="_Hkk78EVbEd6g-YgfS2DHrA">
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_amdyUEV4Ed6g-YgfS2DHrA" value="1"/>
+ <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_amdyUUV4Ed6g-YgfS2DHrA" value="1"/>
+ <defaultValue xmi:type="uml:LiteralString" xmi:id="_amdyUkV4Ed6g-YgfS2DHrA">
+ <value xsi:nil="true"/>
+ </defaultValue>
+ </ownedParameter>
+ </ownedOperation>
+ <ownedOperation xmi:type="uml:Operation" xmi:id="_oZu3cEWEEd6g-YgfS2DHrA" name="addPage">
+ <ownedParameter xmi:type="uml:Parameter" xmi:id="_oZu3cUWEEd6g-YgfS2DHrA" name="pageIdentifier" type="_A-BP8EVhEd6g-YgfS2DHrA">
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_oZu3c0WEEd6g-YgfS2DHrA" value="1"/>
+ <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_oZu3ckWEEd6g-YgfS2DHrA" value="1"/>
+ <defaultValue xmi:type="uml:LiteralString" xmi:id="_oZu3dEWEEd6g-YgfS2DHrA">
+ <value xsi:nil="true"/>
+ </defaultValue>
+ </ownedParameter>
+ </ownedOperation>
+ <ownedOperation xmi:type="uml:Operation" xmi:id="_oEQBQEblEd6g-YgfS2DHrA" name="removePage">
+ <ownedParameter xmi:type="uml:Parameter" xmi:id="_oEQBQUblEd6g-YgfS2DHrA" name="pageIndex" type="_Hkk78EVbEd6g-YgfS2DHrA">
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_oEQBQ0blEd6g-YgfS2DHrA" value="1"/>
+ <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_oEQBQkblEd6g-YgfS2DHrA" value="1"/>
+ <defaultValue xmi:type="uml:LiteralString" xmi:id="_oEQBREblEd6g-YgfS2DHrA">
+ <value xsi:nil="true"/>
+ </defaultValue>
+ </ownedParameter>
+ </ownedOperation>
+ <ownedOperation xmi:type="uml:Operation" xmi:id="_byei4FVjEeWe8LyZrqaAug" name="addPage">
+ <ownedParameter xmi:type="uml:Parameter" xmi:id="_fr-kAFVjEeWe8LyZrqaAug" name="index">
+ <type xmi:type="uml:PrimitiveType" href="pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Integer"/>
+ </ownedParameter>
+ <ownedParameter xmi:type="uml:Parameter" xmi:id="_byei4VVjEeWe8LyZrqaAug" name="pageIdentifier" type="_A-BP8EVhEd6g-YgfS2DHrA">
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_byei4lVjEeWe8LyZrqaAug" value="1"/>
+ <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_byei41VjEeWe8LyZrqaAug" value="1"/>
+ <defaultValue xmi:type="uml:LiteralString" xmi:id="_byei5FVjEeWe8LyZrqaAug">
+ <value xsi:nil="true"/>
+ </defaultValue>
+ </ownedParameter>
+ </ownedOperation>
+ <ownedOperation xmi:type="uml:Operation" xmi:id="_1teNkFYZEeWe8LyZrqaAug" name="addPage">
+ <ownedParameter xmi:type="uml:Parameter" xmi:id="_1teNkVYZEeWe8LyZrqaAug" name="pageRef" type="_h_HVwEJVEd6kIY39uis5Uw">
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_1teNklYZEeWe8LyZrqaAug" value="1"/>
+ <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_1teNk1YZEeWe8LyZrqaAug" value="1"/>
+ <defaultValue xmi:type="uml:LiteralString" xmi:id="_1teNlFYZEeWe8LyZrqaAug">
+ <value xsi:nil="true"/>
+ </defaultValue>
+ </ownedParameter>
+ </ownedOperation>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Class" xmi:id="_h_HVwEJVEd6kIY39uis5Uw" name="PageRef">
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_ANIzk0JWEd6kIY39uis5Uw" name="parent" type="_fbWYgEJVEd6kIY39uis5Uw" isUnique="false" association="_AM_CkEJWEd6kIY39uis5Uw">
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_ANIzlUJWEd6kIY39uis5Uw"/>
+ <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_ANIzlEJWEd6kIY39uis5Uw" value="1"/>
+ </ownedAttribute>
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_b94xUEnjEd6ussMWxXGeXg" name="emfPageIdentifier" visibility="private" isUnique="false" association="_b3enUEnjEd6ussMWxXGeXg">
+ <type xmi:type="uml:Class" href="pathmap://UML_METAMODELS/Ecore.metamodel.uml#EObject"/>
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_b-CiUEnjEd6ussMWxXGeXg" value="1"/>
+ <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_b-CiUUnjEd6ussMWxXGeXg" value="1"/>
+ </ownedAttribute>
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_GrqUYEnkEd6ussMWxXGeXg" name="pageIdentifier" visibility="public" isLeaf="true" type="_A-BP8EVhEd6g-YgfS2DHrA" isUnique="false" isDerived="true">
+ <ownedComment xmi:type="uml:Comment" xmi:id="_YfXUoEnmEd6ussMWxXGeXg" annotatedElement="_GrqUYEnkEd6ussMWxXGeXg">
+ <body>pageIdentifier can be a plain JavaObject or an EObject.&#xD;
+They are not stored in the same place.</body>
+ </ownedComment>
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_W-rvkEnnEd6ussMWxXGeXg" value="1"/>
+ <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_W-1gkEnnEd6ussMWxXGeXg" value="1"/>
+ <defaultValue xmi:type="uml:LiteralString" xmi:id="_W-1gkUnnEd6ussMWxXGeXg">
+ <value xsi:nil="true"/>
+ </defaultValue>
+ </ownedAttribute>
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_RkM5UEnmEd6ussMWxXGeXg" name="objectPageIdentifier" visibility="private" type="_A-BP8EVhEd6g-YgfS2DHrA" isUnique="false">
+ <ownedComment xmi:type="uml:Comment" xmi:id="_UZ2QwEnmEd6ussMWxXGeXg" annotatedElement="_RkM5UEnmEd6ussMWxXGeXg">
+ <body>Storage to store Identifier that are not EObject.</body>
+ </ownedComment>
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_DXj_AEnnEd6ussMWxXGeXg" value="1"/>
+ <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_DXj_AUnnEd6ussMWxXGeXg" value="1"/>
+ <defaultValue xmi:type="uml:LiteralString" xmi:id="_DXtI8EnnEd6ussMWxXGeXg">
+ <value xsi:nil="true"/>
+ </defaultValue>
+ </ownedAttribute>
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_RGhL8FViEeWe8LyZrqaAug" name="favoriteEditor" visibility="public">
+ <type xmi:type="uml:PrimitiveType" href="pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#String"/>
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_eaPr0FViEeWe8LyZrqaAug"/>
+ <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_eaZc0FViEeWe8LyZrqaAug" value="1"/>
+ </ownedAttribute>
+ <ownedOperation xmi:type="uml:Operation" xmi:id="_BxkKcEbaEd6g-YgfS2DHrA" name="isForIdentifier">
+ <ownedParameter xmi:type="uml:Parameter" xmi:id="_BxkKcUbaEd6g-YgfS2DHrA" name="pageIdentifier" type="_A-BP8EVhEd6g-YgfS2DHrA">
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_BxkKc0baEd6g-YgfS2DHrA" value="1"/>
+ <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_BxkKckbaEd6g-YgfS2DHrA" value="1"/>
+ <defaultValue xmi:type="uml:LiteralString" xmi:id="_BxkKdEbaEd6g-YgfS2DHrA">
+ <value xsi:nil="true"/>
+ </defaultValue>
+ </ownedParameter>
+ <ownedParameter xmi:type="uml:Parameter" xmi:id="_D0_awEbaEd6g-YgfS2DHrA" name="return" type="_SNSWAEbaEd6g-YgfS2DHrA" direction="return">
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_GFO_EEbaEd6g-YgfS2DHrA" value="1"/>
+ <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_GFO_EUbaEd6g-YgfS2DHrA" value="1"/>
+ <defaultValue xmi:type="uml:LiteralString" xmi:id="_GFO_EkbaEd6g-YgfS2DHrA">
+ <value xsi:nil="true"/>
+ </defaultValue>
+ </ownedParameter>
+ </ownedOperation>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Class" xmi:id="_zd5g0EJVEd6kIY39uis5Uw" name="AbstractPage">
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_rLVHwEa1Ed6g-YgfS2DHrA" name="pageIdentifier" visibility="public" type="_A-BP8EVhEd6g-YgfS2DHrA" isUnique="false">
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_rLVHwka1Ed6g-YgfS2DHrA" value="1"/>
+ <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_rLVHwUa1Ed6g-YgfS2DHrA" value="1"/>
+ <defaultValue xmi:type="uml:LiteralString" xmi:id="_rLVHw0a1Ed6g-YgfS2DHrA">
+ <value xsi:nil="true"/>
+ </defaultValue>
+ </ownedAttribute>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Association" xmi:id="_9JomUEJVEd6kIY39uis5Uw" name="A_SashWindowsRoot_Window" memberEnd="_9KYNMEJVEd6kIY39uis5Uw _9Kh-MEJVEd6kIY39uis5Uw">
+ <ownedEnd xmi:type="uml:Property" xmi:id="_9Kh-MEJVEd6kIY39uis5Uw" name="sashWindowsRoot" type="_UiIMMEJVEd6kIY39uis5Uw" isUnique="false" association="_9JomUEJVEd6kIY39uis5Uw">
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_9Kh-MkJVEd6kIY39uis5Uw"/>
+ <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_9Kh-MUJVEd6kIY39uis5Uw" value="1"/>
+ </ownedEnd>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Association" xmi:id="__CVNUEJVEd6kIY39uis5Uw" name="A_PanelParent_AbstractPanel" memberEnd="__Ce-UEJVEd6kIY39uis5Uw __CoIQEJVEd6kIY39uis5Uw"/>
+ <packagedElement xmi:type="uml:Association" xmi:id="_AM_CkEJWEd6kIY39uis5Uw" name="A_TabFolder_AbstractPageRef" memberEnd="_ANIzkEJWEd6kIY39uis5Uw _ANIzk0JWEd6kIY39uis5Uw"/>
+ <packagedElement xmi:type="uml:Class" xmi:id="_86BAgEJWEd6kIY39uis5Uw" name="PanelParent" isAbstract="true">
+ <ownedAttribute xmi:type="uml:Property" xmi:id="__Ce-UEJVEd6kIY39uis5Uw" name="children" type="_Zx2ZYEJVEd6kIY39uis5Uw" aggregation="composite" association="__CVNUEJVEd6kIY39uis5Uw">
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="__Ce-UUJVEd6kIY39uis5Uw" value="2"/>
+ <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="__Ce-UkJVEd6kIY39uis5Uw" value="2"/>
+ </ownedAttribute>
+ <ownedOperation xmi:type="uml:Operation" xmi:id="_yG3I4EoKEd6ussMWxXGeXg" name="replaceChild">
+ <ownedComment xmi:type="uml:Comment" xmi:id="_AxysQEoLEd6ussMWxXGeXg" annotatedElement="_yG3I4EoKEd6ussMWxXGeXg">
+ <body>Replace the specified child by the new value.&#xD;
+Don't need to be implemented in TabFolder.&#xD;
+Used to insert a new SashPanel.</body>
+ </ownedComment>
+ <ownedParameter xmi:type="uml:Parameter" xmi:id="_zqjwQEoKEd6ussMWxXGeXg" name="oldChild" type="_Zx2ZYEJVEd6kIY39uis5Uw">
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_3Q7aAEoKEd6ussMWxXGeXg" value="1"/>
+ <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_3Q7aAUoKEd6ussMWxXGeXg" value="1"/>
+ <defaultValue xmi:type="uml:LiteralString" xmi:id="_3Q7aAkoKEd6ussMWxXGeXg">
+ <value xsi:nil="true"/>
+ </defaultValue>
+ </ownedParameter>
+ <ownedParameter xmi:type="uml:Parameter" xmi:id="_3dJREEoKEd6ussMWxXGeXg" name="newChild" type="_Zx2ZYEJVEd6kIY39uis5Uw">
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="__gbLAEoKEd6ussMWxXGeXg" value="1"/>
+ <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="__gbLAUoKEd6ussMWxXGeXg" value="1"/>
+ <defaultValue xmi:type="uml:LiteralString" xmi:id="__gbLAkoKEd6ussMWxXGeXg">
+ <value xsi:nil="true"/>
+ </defaultValue>
+ </ownedParameter>
+ </ownedOperation>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Association" xmi:id="_viyZUEJZEd6kIY39uis5Uw" name="A_PageList_PageRef" memberEnd="_vjFUQEJZEd6kIY39uis5Uw _vjYPMkJZEd6kIY39uis5Uw">
+ <ownedEnd xmi:type="uml:Property" xmi:id="_vjYPMkJZEd6kIY39uis5Uw" name="sashWindowsRoot" type="_b7a4cEMaEd6kIY39uis5Uw" isUnique="false" association="_viyZUEJZEd6kIY39uis5Uw">
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_vjiAMUJZEd6kIY39uis5Uw"/>
+ <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_vjiAMEJZEd6kIY39uis5Uw" value="1"/>
+ </ownedEnd>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Association" xmi:id="_mT2jkEJkEd6kIY39uis5Uw" name="A_SashWindowsRoot_TabFolder" memberEnd="_mW0_EEJkEd6kIY39uis5Uw _mW0_E0JkEd6kIY39uis5Uw">
+ <ownedEnd xmi:type="uml:Property" xmi:id="_mW0_E0JkEd6kIY39uis5Uw" name="sashWindowsRoot" type="_UiIMMEJVEd6kIY39uis5Uw" isUnique="false" association="_mT2jkEJkEd6kIY39uis5Uw">
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_mW-wEUJkEd6kIY39uis5Uw"/>
+ <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_mW-wEEJkEd6kIY39uis5Uw" value="*"/>
+ </ownedEnd>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Class" xmi:id="_b7a4cEMaEd6kIY39uis5Uw" name="PageList">
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_vjFUQEJZEd6kIY39uis5Uw" name="availablePage" type="_h_HVwEJVEd6kIY39uis5Uw" aggregation="composite" association="_viyZUEJZEd6kIY39uis5Uw">
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_vjYPMEJZEd6kIY39uis5Uw"/>
+ <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_vjYPMUJZEd6kIY39uis5Uw" value="*"/>
+ </ownedAttribute>
+ <ownedOperation xmi:type="uml:Operation" xmi:id="_i92ooEa4Ed6g-YgfS2DHrA" name="addPage">
+ <ownedParameter xmi:type="uml:Parameter" xmi:id="_i92ooUa4Ed6g-YgfS2DHrA" name="pageIdentifier" type="_A-BP8EVhEd6g-YgfS2DHrA">
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_i92oo0a4Ed6g-YgfS2DHrA" value="1"/>
+ <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_i92ooka4Ed6g-YgfS2DHrA" value="1"/>
+ <defaultValue xmi:type="uml:LiteralString" xmi:id="_i92opEa4Ed6g-YgfS2DHrA">
+ <value xsi:nil="true"/>
+ </defaultValue>
+ </ownedParameter>
+ </ownedOperation>
+ <ownedOperation xmi:type="uml:Operation" xmi:id="_ocolgEa4Ed6g-YgfS2DHrA" name="removePage">
+ <ownedParameter xmi:type="uml:Parameter" xmi:id="_ocolgUa4Ed6g-YgfS2DHrA" name="pageIdentifier" type="_A-BP8EVhEd6g-YgfS2DHrA">
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_ocolg0a4Ed6g-YgfS2DHrA" value="1"/>
+ <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_ocolgka4Ed6g-YgfS2DHrA" value="1"/>
+ <defaultValue xmi:type="uml:LiteralString" xmi:id="_ocolhEa4Ed6g-YgfS2DHrA">
+ <value xsi:nil="true"/>
+ </defaultValue>
+ </ownedParameter>
+ </ownedOperation>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Class" xmi:id="_-9vywEMaEd6kIY39uis5Uw" name="SashWindowsMngr">
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_9osO4EMbEd6kIY39uis5Uw" name="pageList" type="_b7a4cEMaEd6kIY39uis5Uw" isUnique="false" aggregation="composite" association="_9k0bgEMbEd6kIY39uis5Uw">
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_9osO4UMbEd6kIY39uis5Uw" value="1"/>
+ <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_9osO4kMbEd6kIY39uis5Uw" value="1"/>
+ </ownedAttribute>
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_-JenwEMbEd6kIY39uis5Uw" name="sashModel" type="_UiIMMEJVEd6kIY39uis5Uw" isUnique="false" aggregation="composite" association="_-EQwkEMbEd6kIY39uis5Uw">
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_-JnxsEMbEd6kIY39uis5Uw" value="1"/>
+ <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_-JnxsUMbEd6kIY39uis5Uw" value="1"/>
+ </ownedAttribute>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Association" xmi:id="_9k0bgEMbEd6kIY39uis5Uw" name="A_MultiPageEditor_PageList" memberEnd="_9osO4EMbEd6kIY39uis5Uw _9osO40MbEd6kIY39uis5Uw">
+ <ownedEnd xmi:type="uml:Property" xmi:id="_9osO40MbEd6kIY39uis5Uw" name="multiPageEditor" type="_-9vywEMaEd6kIY39uis5Uw" isUnique="false" association="_9k0bgEMbEd6kIY39uis5Uw">
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_9o1_4UMbEd6kIY39uis5Uw"/>
+ <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_9o1_4EMbEd6kIY39uis5Uw" value="1"/>
+ </ownedEnd>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Association" xmi:id="_-EQwkEMbEd6kIY39uis5Uw" name="A_MultiPageEditor_SashWindowsLayout" memberEnd="_-JenwEMbEd6kIY39uis5Uw _-JnxskMbEd6kIY39uis5Uw">
+ <ownedEnd xmi:type="uml:Property" xmi:id="_-JnxskMbEd6kIY39uis5Uw" name="multiPageEditor" type="_-9vywEMaEd6kIY39uis5Uw" isUnique="false" association="_-EQwkEMbEd6kIY39uis5Uw">
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_-JnxtEMbEd6kIY39uis5Uw"/>
+ <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_-Jnxs0MbEd6kIY39uis5Uw" value="1"/>
+ </ownedEnd>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Class" xmi:id="_jc9vQESDEd6kIY39uis5Uw" name="Position">
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_m9q14ESDEd6kIY39uis5Uw" name="x" visibility="public" type="_Hkk78EVbEd6g-YgfS2DHrA" isUnique="false">
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_pZ1WUESDEd6kIY39uis5Uw" value="1"/>
+ <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_pZ1WUUSDEd6kIY39uis5Uw" value="1"/>
+ <defaultValue xmi:type="uml:LiteralString" xmi:id="_paIRQESDEd6kIY39uis5Uw">
+ <value xsi:nil="true"/>
+ </defaultValue>
+ </ownedAttribute>
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_pmDNYESDEd6kIY39uis5Uw" name="y" visibility="public" type="_Hkk78EVbEd6g-YgfS2DHrA" isUnique="false">
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_q458YESDEd6kIY39uis5Uw" value="1"/>
+ <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_q5DtYESDEd6kIY39uis5Uw" value="1"/>
+ <defaultValue xmi:type="uml:LiteralString" xmi:id="_q5DtYUSDEd6kIY39uis5Uw">
+ <value xsi:nil="true"/>
+ </defaultValue>
+ </ownedAttribute>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Class" xmi:id="_lh4NUESDEd6kIY39uis5Uw" name="Size">
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_s1CR4ESDEd6kIY39uis5Uw" name="width" visibility="public" type="_Hkk78EVbEd6g-YgfS2DHrA" isUnique="false">
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_u5DYEESDEd6kIY39uis5Uw" value="1"/>
+ <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_u5NJEESDEd6kIY39uis5Uw" value="1"/>
+ <defaultValue xmi:type="uml:LiteralString" xmi:id="_u5NJEUSDEd6kIY39uis5Uw">
+ <value xsi:nil="true"/>
+ </defaultValue>
+ </ownedAttribute>
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_vnZr0ESDEd6kIY39uis5Uw" name="length" visibility="public" type="_Hkk78EVbEd6g-YgfS2DHrA" isUnique="false">
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_w_T58ESDEd6kIY39uis5Uw" value="1"/>
+ <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_w_dq8ESDEd6kIY39uis5Uw" value="1"/>
+ <defaultValue xmi:type="uml:LiteralString" xmi:id="_w_dq8USDEd6kIY39uis5Uw">
+ <value xsi:nil="true"/>
+ </defaultValue>
+ </ownedAttribute>
+ </packagedElement>
+ <packagedElement xmi:type="uml:PrimitiveType" xmi:id="_Hkk78EVbEd6g-YgfS2DHrA" name="Integer"/>
+ <packagedElement xmi:type="uml:PrimitiveType" xmi:id="_A-BP8EVhEd6g-YgfS2DHrA" name="JavaObject"/>
+ <packagedElement xmi:type="uml:PrimitiveType" xmi:id="_IEBx4EV4Ed6g-YgfS2DHrA" name="Float"/>
+ <packagedElement xmi:type="uml:PrimitiveType" xmi:id="_SNSWAEbaEd6g-YgfS2DHrA" name="boolean"/>
+ <packagedElement xmi:type="uml:Association" xmi:id="_b3enUEnjEd6ussMWxXGeXg" name="A_PageRef_EObject" memberEnd="_b94xUEnjEd6ussMWxXGeXg _b-CiUknjEd6ussMWxXGeXg">
+ <ownedEnd xmi:type="uml:Property" xmi:id="_b-CiUknjEd6ussMWxXGeXg" name="pageRef" visibility="public" type="_h_HVwEJVEd6kIY39uis5Uw" isUnique="false" association="_b3enUEnjEd6ussMWxXGeXg">
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_b-MTUUnjEd6ussMWxXGeXg"/>
+ <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_b-MTUEnjEd6ussMWxXGeXg" value="*"/>
+ </ownedEnd>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Association" xmi:id="_li3-0EsFEd6MxdnlcgT3eA" name="A_Window_AbstractPanel" memberEnd="_lnNFMEsFEd6MxdnlcgT3eA _lnWPIksFEd6MxdnlcgT3eA">
+ <ownedEnd xmi:type="uml:Property" xmi:id="_lnWPIksFEd6MxdnlcgT3eA" name="window" type="_Xa5wIEJVEd6kIY39uis5Uw" isUnique="false" association="_li3-0EsFEd6MxdnlcgT3eA">
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_lnWPJEsFEd6MxdnlcgT3eA"/>
+ <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_lnWPI0sFEd6MxdnlcgT3eA" value="*"/>
+ </ownedEnd>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Association" xmi:id="_kgdpEJUREeWeT68xCjxnSQ" memberEnd="_kgs5oJUREeWeT68xCjxnSQ _kgtgsJUREeWeT68xCjxnSQ">
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_kgrEcJUREeWeT68xCjxnSQ" source="org.eclipse.papyrus">
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_kgrrgJUREeWeT68xCjxnSQ" key="nature" value="UML_Nature"/>
+ </eAnnotations>
+ <ownedEnd xmi:type="uml:Property" xmi:id="_kgtgsJUREeWeT68xCjxnSQ" type="_fbWYgEJVEd6kIY39uis5Uw" association="_kgdpEJUREeWeT68xCjxnSQ">
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_8ejZ4JUREeWeT68xCjxnSQ"/>
+ <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_8ekA8JUREeWeT68xCjxnSQ" value="1"/>
+ </ownedEnd>
+ </packagedElement>
+ <profileApplication xmi:type="uml:ProfileApplication" xmi:id="_NuHhwkJVEd6kIY39uis5Uw">
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_NuHhw0JVEd6kIY39uis5Uw" source="http://www.eclipse.org/uml2/2.0.0/UML">
+ <references xmi:type="ecore:EPackage" href="http://www.eclipse.org/uml2/5.0.0/UML/Profile/Standard#/"/>
+ </eAnnotations>
+ <appliedProfile xmi:type="uml:Profile" href="pathmap://UML_PROFILES/StandardL2.profile.uml#_0"/>
+ </profileApplication>
+ <profileApplication xmi:type="uml:ProfileApplication" xmi:id="_wpAy0EJfEd6kIY39uis5Uw">
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_wpJ8wEJfEd6kIY39uis5Uw" source="http://www.eclipse.org/uml2/2.0.0/UML">
+ <references xmi:type="ecore:EPackage" href="pathmap://UML_PROFILES/Ecore.profile.uml#_z1OFcHjqEdy8S4Cr8Rc_NA"/>
+ </eAnnotations>
+ <appliedProfile xmi:type="uml:Profile" href="pathmap://UML_PROFILES/Ecore.profile.uml#_0"/>
+ </profileApplication>
+ <profileApplication xmi:type="uml:ProfileApplication" xmi:id="_T73od1ViEeWe8LyZrqaAug">
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_T73oeFViEeWe8LyZrqaAug" source="http://www.eclipse.org/uml2/2.0.0/UML">
+ <references xmi:type="ecore:EPackage" href="pathmap://PAPYRUS_ACTIONLANGUAGE_PROFILE/ActionLanguage-Profile.profile.uml#_Kv8EIKFXEeS_KNX0nfvIVQ"/>
+ </eAnnotations>
+ <appliedProfile xmi:type="uml:Profile" href="pathmap://PAPYRUS_ACTIONLANGUAGE_PROFILE/ActionLanguage-Profile.profile.uml#ActionLanguage"/>
+ </profileApplication>
+ </uml:Model>
+ <Ecore:EPackage xmi:id="_mo48QEJgEd6kIY39uis5Uw" base_Package="_NuHhwEJVEd6kIY39uis5Uw" nsPrefix="di" nsURI="http://www.eclipse.org/papyrus/0.7.0/sashdi" basePackage="org.eclipse.papyrus.infra.core.sashwindows" prefix="Di">
+ <annotation>resource=XMI</annotation>
+ </Ecore:EPackage>
+ <Ecore:EDataType xmi:id="_6EWpcEVgEd6g-YgfS2DHrA" instanceClassName="int" base_PrimitiveType="_Hkk78EVbEd6g-YgfS2DHrA" dataTypeName="int"/>
+ <Ecore:EDataType xmi:id="_DLSYwEVhEd6g-YgfS2DHrA" instanceClassName="java.lang.Object" base_PrimitiveType="_A-BP8EVhEd6g-YgfS2DHrA"/>
+ <Ecore:EDataType xmi:id="_MeaSgEV4Ed6g-YgfS2DHrA" instanceClassName="float" base_PrimitiveType="_IEBx4EV4Ed6g-YgfS2DHrA"/>
+ <Ecore:EDataType xmi:id="_UtLf4EbaEd6g-YgfS2DHrA" instanceClassName="boolean" base_PrimitiveType="_SNSWAEbaEd6g-YgfS2DHrA"/>
+ <Ecore:EAttribute xmi:id="_UVaAMEnnEd6ussMWxXGeXg" isTransient="true" base_Property="_GrqUYEnkEd6ussMWxXGeXg"/>
+ <Ecore:EReference xmi:id="_uX7T8EsFEd6MxdnlcgT3eA" isTransient="true" isVolatile="true" base_Property="_lnNFMEsFEd6MxdnlcgT3eA"/>
+</xmi:XMI>
diff --git a/plugins/infra/core/org.eclipse.papyrus.infra.core.sasheditor.di/src/org/eclipse/papyrus/infra/core/sashwindows/di/DiPackage.java b/plugins/infra/core/org.eclipse.papyrus.infra.core.sasheditor.di/src/org/eclipse/papyrus/infra/core/sashwindows/di/DiPackage.java
index 67bc8ed7932..3bfd9bb55d3 100644
--- a/plugins/infra/core/org.eclipse.papyrus.infra.core.sasheditor.di/src/org/eclipse/papyrus/infra/core/sashwindows/di/DiPackage.java
+++ b/plugins/infra/core/org.eclipse.papyrus.infra.core.sasheditor.di/src/org/eclipse/papyrus/infra/core/sashwindows/di/DiPackage.java
@@ -1,9 +1,16 @@
-/**
- * <copyright>
- * </copyright>
+/*****************************************************************************
+ * Copyright (c) 2011, 2015 LIFL, CEA LIST, Christian W. Damus, and others.
*
- * $Id$
- */
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * LIFL - Initial API and implementation
+ * Christian W. Damus - bug 469188
+ *
+ *****************************************************************************/
package org.eclipse.papyrus.infra.core.sashwindows.di;
import org.eclipse.emf.ecore.EAttribute;
@@ -98,6 +105,16 @@ public interface DiPackage extends EPackage {
int SASH_MODEL__CURRENT_SELECTION = 1;
/**
+ * The feature id for the '<em><b>Restore Active Page</b></em>' attribute.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ *
+ * @generated
+ * @ordered
+ */
+ int SASH_MODEL__RESTORE_ACTIVE_PAGE = 2;
+
+ /**
* The number of structural features of the '<em>Sash Model</em>' class.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
@@ -105,7 +122,7 @@ public interface DiPackage extends EPackage {
* @generated
* @ordered
*/
- int SASH_MODEL_FEATURE_COUNT = 2;
+ int SASH_MODEL_FEATURE_COUNT = 3;
/**
* The meta object id for the '{@link org.eclipse.papyrus.infra.core.sashwindows.di.impl.PanelParentImpl <em>Panel Parent</em>}' class.
@@ -344,6 +361,16 @@ public interface DiPackage extends EPackage {
int TAB_FOLDER__CHILDREN = ABSTRACT_PANEL_FEATURE_COUNT + 0;
/**
+ * The feature id for the '<em><b>Current Selection</b></em>' reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ *
+ * @generated
+ * @ordered
+ */
+ int TAB_FOLDER__CURRENT_SELECTION = ABSTRACT_PANEL_FEATURE_COUNT + 1;
+
+ /**
* The number of structural features of the '<em>Tab Folder</em>' class.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
@@ -351,7 +378,7 @@ public interface DiPackage extends EPackage {
* @generated
* @ordered
*/
- int TAB_FOLDER_FEATURE_COUNT = ABSTRACT_PANEL_FEATURE_COUNT + 1;
+ int TAB_FOLDER_FEATURE_COUNT = ABSTRACT_PANEL_FEATURE_COUNT + 2;
/**
* The meta object id for the '{@link org.eclipse.papyrus.infra.core.sashwindows.di.impl.PageRefImpl <em>Page Ref</em>}' class.
@@ -668,6 +695,18 @@ public interface DiPackage extends EPackage {
EReference getSashModel_CurrentSelection();
/**
+ * Returns the meta object for the attribute '{@link org.eclipse.papyrus.infra.core.sashwindows.di.SashModel#isRestoreActivePage <em>Restore Active Page</em>}'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ *
+ * @return the meta object for the attribute '<em>Restore Active Page</em>'.
+ * @see org.eclipse.papyrus.infra.core.sashwindows.di.SashModel#isRestoreActivePage()
+ * @see #getSashModel()
+ * @generated
+ */
+ EAttribute getSashModel_RestoreActivePage();
+
+ /**
* Returns the meta object for class '{@link org.eclipse.papyrus.infra.core.sashwindows.di.Window <em>Window</em>}'.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
@@ -854,6 +893,18 @@ public interface DiPackage extends EPackage {
EReference getTabFolder_Children();
/**
+ * Returns the meta object for the reference '{@link org.eclipse.papyrus.infra.core.sashwindows.di.TabFolder#getCurrentSelection <em>Current Selection</em>}'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ *
+ * @return the meta object for the reference '<em>Current Selection</em>'.
+ * @see org.eclipse.papyrus.infra.core.sashwindows.di.TabFolder#getCurrentSelection()
+ * @see #getTabFolder()
+ * @generated
+ */
+ EReference getTabFolder_CurrentSelection();
+
+ /**
* Returns the meta object for class '{@link org.eclipse.papyrus.infra.core.sashwindows.di.PageRef <em>Page Ref</em>}'.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
@@ -1144,6 +1195,15 @@ public interface DiPackage extends EPackage {
EReference SASH_MODEL__CURRENT_SELECTION = eINSTANCE.getSashModel_CurrentSelection();
/**
+ * The meta object literal for the '<em><b>Restore Active Page</b></em>' attribute feature.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ *
+ * @generated
+ */
+ EAttribute SASH_MODEL__RESTORE_ACTIVE_PAGE = eINSTANCE.getSashModel_RestoreActivePage();
+
+ /**
* The meta object literal for the '{@link org.eclipse.papyrus.infra.core.sashwindows.di.impl.WindowImpl <em>Window</em>}' class.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
@@ -1300,6 +1360,15 @@ public interface DiPackage extends EPackage {
EReference TAB_FOLDER__CHILDREN = eINSTANCE.getTabFolder_Children();
/**
+ * The meta object literal for the '<em><b>Current Selection</b></em>' reference feature.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ *
+ * @generated
+ */
+ EReference TAB_FOLDER__CURRENT_SELECTION = eINSTANCE.getTabFolder_CurrentSelection();
+
+ /**
* The meta object literal for the '{@link org.eclipse.papyrus.infra.core.sashwindows.di.impl.PageRefImpl <em>Page Ref</em>}' class.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
diff --git a/plugins/infra/core/org.eclipse.papyrus.infra.core.sasheditor.di/src/org/eclipse/papyrus/infra/core/sashwindows/di/SashModel.java b/plugins/infra/core/org.eclipse.papyrus.infra.core.sasheditor.di/src/org/eclipse/papyrus/infra/core/sashwindows/di/SashModel.java
index 1369aae63b5..70f43ba2066 100644
--- a/plugins/infra/core/org.eclipse.papyrus.infra.core.sasheditor.di/src/org/eclipse/papyrus/infra/core/sashwindows/di/SashModel.java
+++ b/plugins/infra/core/org.eclipse.papyrus.infra.core.sasheditor.di/src/org/eclipse/papyrus/infra/core/sashwindows/di/SashModel.java
@@ -1,9 +1,16 @@
-/**
- * <copyright>
- * </copyright>
+/*****************************************************************************
+ * Copyright (c) 2011, 2015 LIFL, CEA LIST, Christian W. Damus, and others.
*
- * $Id$
- */
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * LIFL - Initial API and implementation
+ * Christian W. Damus - bug 469188
+ *
+ *****************************************************************************/
package org.eclipse.papyrus.infra.core.sashwindows.di;
import org.eclipse.emf.common.util.EList;
@@ -26,6 +33,7 @@ import org.eclipse.emf.ecore.EObject;
* <ul>
* <li>{@link org.eclipse.papyrus.infra.core.sashwindows.di.SashModel#getWindows <em>Windows</em>}</li>
* <li>{@link org.eclipse.papyrus.infra.core.sashwindows.di.SashModel#getCurrentSelection <em>Current Selection</em>}</li>
+ * <li>{@link org.eclipse.papyrus.infra.core.sashwindows.di.SashModel#isRestoreActivePage <em>Restore Active Page</em>}</li>
* </ul>
*
* @see org.eclipse.papyrus.infra.core.sashwindows.di.DiPackage#getSashModel()
@@ -79,6 +87,35 @@ public interface SashModel extends EObject {
void setCurrentSelection(TabFolder value);
/**
+ * Returns the value of the '<em><b>Restore Active Page</b></em>' attribute.
+ * <!-- begin-user-doc -->
+ * <p>
+ * If the meaning of the '<em>Restore Active Page</em>' attribute isn't clear,
+ * there really should be more of a description here...
+ * </p>
+ * <!-- end-user-doc -->
+ *
+ * @return the value of the '<em>Restore Active Page</em>' attribute.
+ * @see #setRestoreActivePage(boolean)
+ * @see org.eclipse.papyrus.infra.core.sashwindows.di.DiPackage#getSashModel_RestoreActivePage()
+ * @model dataType="org.eclipse.papyrus.infra.core.sashwindows.di.boolean" required="true" ordered="false"
+ * @generated
+ */
+ boolean isRestoreActivePage();
+
+ /**
+ * Sets the value of the '{@link org.eclipse.papyrus.infra.core.sashwindows.di.SashModel#isRestoreActivePage <em>Restore Active Page</em>}' attribute.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ *
+ * @param value
+ * the new value of the '<em>Restore Active Page</em>' attribute.
+ * @see #isRestoreActivePage()
+ * @generated
+ */
+ void setRestoreActivePage(boolean value);
+
+ /**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
*
diff --git a/plugins/infra/core/org.eclipse.papyrus.infra.core.sasheditor.di/src/org/eclipse/papyrus/infra/core/sashwindows/di/TabFolder.java b/plugins/infra/core/org.eclipse.papyrus.infra.core.sasheditor.di/src/org/eclipse/papyrus/infra/core/sashwindows/di/TabFolder.java
index a3ad5e3294e..14add487fed 100644
--- a/plugins/infra/core/org.eclipse.papyrus.infra.core.sasheditor.di/src/org/eclipse/papyrus/infra/core/sashwindows/di/TabFolder.java
+++ b/plugins/infra/core/org.eclipse.papyrus.infra.core.sasheditor.di/src/org/eclipse/papyrus/infra/core/sashwindows/di/TabFolder.java
@@ -1,9 +1,16 @@
-/**
- * <copyright>
- * </copyright>
+/*****************************************************************************
+ * Copyright (c) 2011, 2015 LIFL, CEA LIST, Christian W. Damus, and others.
*
- * $Id$
- */
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * LIFL - Initial API and implementation
+ * Christian W. Damus - bug 469188
+ *
+ *****************************************************************************/
package org.eclipse.papyrus.infra.core.sashwindows.di;
import org.eclipse.emf.common.util.EList;
@@ -18,6 +25,7 @@ import org.eclipse.emf.common.util.EList;
* </p>
* <ul>
* <li>{@link org.eclipse.papyrus.infra.core.sashwindows.di.TabFolder#getChildren <em>Children</em>}</li>
+ * <li>{@link org.eclipse.papyrus.infra.core.sashwindows.di.TabFolder#getCurrentSelection <em>Current Selection</em>}</li>
* </ul>
*
* @see org.eclipse.papyrus.infra.core.sashwindows.di.DiPackage#getTabFolder()
@@ -45,6 +53,41 @@ public interface TabFolder extends AbstractPanel {
EList<PageRef> getChildren();
/**
+ * Returns the value of the '<em><b>Current Selection</b></em>' reference.
+ * <p>
+ * This feature subsets the following features:
+ * </p>
+ * <ul>
+ * <li>'{@link org.eclipse.papyrus.infra.core.sashwindows.di.TabFolder#getChildren() <em>Children</em>}'</li>
+ * </ul>
+ * <!-- begin-user-doc -->
+ * <p>
+ * If the meaning of the '<em>Current Selection</em>' reference isn't clear,
+ * there really should be more of a description here...
+ * </p>
+ * <!-- end-user-doc -->
+ *
+ * @return the value of the '<em>Current Selection</em>' reference.
+ * @see #setCurrentSelection(PageRef)
+ * @see org.eclipse.papyrus.infra.core.sashwindows.di.DiPackage#getTabFolder_CurrentSelection()
+ * @model ordered="false"
+ * @generated
+ */
+ PageRef getCurrentSelection();
+
+ /**
+ * Sets the value of the '{@link org.eclipse.papyrus.infra.core.sashwindows.di.TabFolder#getCurrentSelection <em>Current Selection</em>}' reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ *
+ * @param value
+ * the new value of the '<em>Current Selection</em>' reference.
+ * @see #getCurrentSelection()
+ * @generated
+ */
+ void setCurrentSelection(PageRef value);
+
+ /**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
*
diff --git a/plugins/infra/core/org.eclipse.papyrus.infra.core.sasheditor.di/src/org/eclipse/papyrus/infra/core/sashwindows/di/impl/DiFactoryImpl.java b/plugins/infra/core/org.eclipse.papyrus.infra.core.sasheditor.di/src/org/eclipse/papyrus/infra/core/sashwindows/di/impl/DiFactoryImpl.java
index 44f9fe0910e..4adfc55f84b 100644
--- a/plugins/infra/core/org.eclipse.papyrus.infra.core.sasheditor.di/src/org/eclipse/papyrus/infra/core/sashwindows/di/impl/DiFactoryImpl.java
+++ b/plugins/infra/core/org.eclipse.papyrus.infra.core.sasheditor.di/src/org/eclipse/papyrus/infra/core/sashwindows/di/impl/DiFactoryImpl.java
@@ -1,9 +1,17 @@
-/**
- * <copyright>
- * </copyright>
+/*****************************************************************************
+ * Copyright (c) 2009, 2015 LIFL, CEA LIST, Christian W. Damus, and others.
*
- * $Id$
- */
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Cedric Dumoulin Cedric.dumoulin@lifl.fr - Initial API and implementation (assumed)
+ * Christian W. Damus - bug 469188
+ *
+ *****************************************************************************/
+
package org.eclipse.papyrus.infra.core.sashwindows.di.impl;
import org.eclipse.emf.ecore.EClass;
@@ -286,10 +294,21 @@ public class DiFactoryImpl extends EFactoryImpl implements DiFactory {
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
*
- * @generated
+ * @generated NOT
*/
public Object createJavaObjectFromString(EDataType eDataType, String initialValue) {
- return super.createFromString(eDataType, initialValue);
+ Object result = null;
+
+ try {
+ result = super.createFromString(eDataType, initialValue);
+ } catch (IllegalArgumentException e) {
+ // Not deserialized as a Java object? Then just return the string value (or null)
+ if (initialValue != null) {
+ result = initialValue.intern();
+ }
+ }
+
+ return result;
}
/**
diff --git a/plugins/infra/core/org.eclipse.papyrus.infra.core.sasheditor.di/src/org/eclipse/papyrus/infra/core/sashwindows/di/impl/DiPackageImpl.java b/plugins/infra/core/org.eclipse.papyrus.infra.core.sasheditor.di/src/org/eclipse/papyrus/infra/core/sashwindows/di/impl/DiPackageImpl.java
index ace97ed4a19..edd144b0e7f 100644
--- a/plugins/infra/core/org.eclipse.papyrus.infra.core.sasheditor.di/src/org/eclipse/papyrus/infra/core/sashwindows/di/impl/DiPackageImpl.java
+++ b/plugins/infra/core/org.eclipse.papyrus.infra.core.sasheditor.di/src/org/eclipse/papyrus/infra/core/sashwindows/di/impl/DiPackageImpl.java
@@ -1,11 +1,19 @@
-/**
- * <copyright>
- * </copyright>
+/*****************************************************************************
+ * Copyright (c) 2011, 2015 LIFL, CEA LIST, Christian W. Damus, and others.
*
- * $Id$
- */
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * LIFL - Initial API and implementation
+ * Christian W. Damus - bug 469188
+ *
+ *****************************************************************************/
package org.eclipse.papyrus.infra.core.sashwindows.di.impl;
+import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EAttribute;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EDataType;
@@ -277,6 +285,17 @@ public class DiPackageImpl extends EPackageImpl implements DiPackage {
* @generated
*/
@Override
+ public EAttribute getSashModel_RestoreActivePage() {
+ return (EAttribute) sashModelEClass.getEStructuralFeatures().get(2);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ *
+ * @generated
+ */
+ @Override
public EClass getWindow() {
return windowEClass;
}
@@ -453,6 +472,17 @@ public class DiPackageImpl extends EPackageImpl implements DiPackage {
* @generated
*/
@Override
+ public EReference getTabFolder_CurrentSelection() {
+ return (EReference) tabFolderEClass.getEStructuralFeatures().get(1);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ *
+ * @generated
+ */
+ @Override
public EClass getPageRef() {
return pageRefEClass;
}
@@ -703,6 +733,7 @@ public class DiPackageImpl extends EPackageImpl implements DiPackage {
sashModelEClass = createEClass(SASH_MODEL);
createEReference(sashModelEClass, SASH_MODEL__WINDOWS);
createEReference(sashModelEClass, SASH_MODEL__CURRENT_SELECTION);
+ createEAttribute(sashModelEClass, SASH_MODEL__RESTORE_ACTIVE_PAGE);
windowEClass = createEClass(WINDOW);
createEReference(windowEClass, WINDOW__POSITION);
@@ -725,6 +756,7 @@ public class DiPackageImpl extends EPackageImpl implements DiPackage {
tabFolderEClass = createEClass(TAB_FOLDER);
createEReference(tabFolderEClass, TAB_FOLDER__CHILDREN);
+ createEReference(tabFolderEClass, TAB_FOLDER__CURRENT_SELECTION);
pageRefEClass = createEClass(PAGE_REF);
createEReference(pageRefEClass, PAGE_REF__EMF_PAGE_IDENTIFIER);
@@ -800,6 +832,7 @@ public class DiPackageImpl extends EPackageImpl implements DiPackage {
initEReference(getSashModel_Windows(), this.getWindow(), null, "windows", null, 0, -1, SashModel.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED);
initEReference(getSashModel_CurrentSelection(), this.getTabFolder(), null, "currentSelection", null, 1, 1, SashModel.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, !IS_UNIQUE, !IS_DERIVED,
!IS_ORDERED);
+ initEAttribute(getSashModel_RestoreActivePage(), this.getboolean(), "restoreActivePage", null, 1, 1, SashModel.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED);
EOperation op = addEOperation(sashModelEClass, null, "addPage", 1, 1, IS_UNIQUE, !IS_ORDERED);
addEParameter(op, this.getJavaObject(), "pageIdentifier", 1, 1, IS_UNIQUE, !IS_ORDERED);
@@ -880,6 +913,8 @@ public class DiPackageImpl extends EPackageImpl implements DiPackage {
initEClass(tabFolderEClass, TabFolder.class, "TabFolder", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
initEReference(getTabFolder_Children(), this.getPageRef(), this.getPageRef_Parent(), "children", null, 0, -1, TabFolder.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED,
!IS_ORDERED);
+ initEReference(getTabFolder_CurrentSelection(), this.getPageRef(), null, "currentSelection", null, 0, 1, TabFolder.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED,
+ !IS_ORDERED);
op = addEOperation(tabFolderEClass, null, "movePage", 1, 1, IS_UNIQUE, !IS_ORDERED);
addEParameter(op, this.getint(), "oldIndex", 1, 1, IS_UNIQUE, !IS_ORDERED);
@@ -953,6 +988,8 @@ public class DiPackageImpl extends EPackageImpl implements DiPackage {
createResourceXMIAnnotations();
// http://www.eclipse.org/uml2/2.0.0/UML
createUMLAnnotations();
+ // subsets
+ createSubsetsAnnotations();
}
/**
@@ -986,4 +1023,22 @@ public class DiPackageImpl extends EPackageImpl implements DiPackage {
});
}
+ /**
+ * Initializes the annotations for <b>subsets</b>.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ *
+ * @generated
+ */
+ protected void createSubsetsAnnotations() {
+ String source = "subsets";
+ addAnnotation(getTabFolder_CurrentSelection(),
+ source,
+ new String[] {
+ },
+ new URI[] {
+ URI.createURI(eNS_URI).appendFragment("//TabFolder/children")
+ });
+ }
+
} // DiPackageImpl
diff --git a/plugins/infra/core/org.eclipse.papyrus.infra.core.sasheditor.di/src/org/eclipse/papyrus/infra/core/sashwindows/di/impl/SashModelImpl.java b/plugins/infra/core/org.eclipse.papyrus.infra.core.sasheditor.di/src/org/eclipse/papyrus/infra/core/sashwindows/di/impl/SashModelImpl.java
index 7db11d90472..4d9ea04f50d 100644
--- a/plugins/infra/core/org.eclipse.papyrus.infra.core.sasheditor.di/src/org/eclipse/papyrus/infra/core/sashwindows/di/impl/SashModelImpl.java
+++ b/plugins/infra/core/org.eclipse.papyrus.infra.core.sasheditor.di/src/org/eclipse/papyrus/infra/core/sashwindows/di/impl/SashModelImpl.java
@@ -1,9 +1,16 @@
-/**
- * <copyright>
- * </copyright>
+/*****************************************************************************
+ * Copyright (c) 2011, 2015 LIFL, CEA LIST, Christian W. Damus, and others.
*
- * $Id$
- */
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * LIFL - Initial API and implementation
+ * Christian W. Damus - bug 469188
+ *
+ *****************************************************************************/
package org.eclipse.papyrus.infra.core.sashwindows.di.impl;
import java.util.Collection;
@@ -40,6 +47,7 @@ import org.eclipse.swt.SWT;
* <ul>
* <li>{@link org.eclipse.papyrus.infra.core.sashwindows.di.impl.SashModelImpl#getWindows <em>Windows</em>}</li>
* <li>{@link org.eclipse.papyrus.infra.core.sashwindows.di.impl.SashModelImpl#getCurrentSelection <em>Current Selection</em>}</li>
+ * <li>{@link org.eclipse.papyrus.infra.core.sashwindows.di.impl.SashModelImpl#isRestoreActivePage <em>Restore Active Page</em>}</li>
* </ul>
*
* @generated
@@ -69,6 +77,28 @@ public class SashModelImpl extends EObjectImpl implements SashModel {
protected TabFolder currentSelection;
/**
+ * The default value of the '{@link #isRestoreActivePage() <em>Restore Active Page</em>}' attribute.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ *
+ * @see #isRestoreActivePage()
+ * @generated
+ * @ordered
+ */
+ protected static final boolean RESTORE_ACTIVE_PAGE_EDEFAULT = false;
+
+ /**
+ * The cached value of the '{@link #isRestoreActivePage() <em>Restore Active Page</em>}' attribute.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ *
+ * @see #isRestoreActivePage()
+ * @generated
+ * @ordered
+ */
+ protected boolean restoreActivePage = RESTORE_ACTIVE_PAGE_EDEFAULT;
+
+ /**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
*
@@ -152,6 +182,32 @@ public class SashModelImpl extends EObjectImpl implements SashModel {
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
*
+ * @generated
+ */
+ @Override
+ public boolean isRestoreActivePage() {
+ return restoreActivePage;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ *
+ * @generated
+ */
+ @Override
+ public void setRestoreActivePage(boolean newRestoreActivePage) {
+ boolean oldRestoreActivePage = restoreActivePage;
+ restoreActivePage = newRestoreActivePage;
+ if (eNotificationRequired()) {
+ eNotify(new ENotificationImpl(this, Notification.SET, DiPackage.SASH_MODEL__RESTORE_ACTIVE_PAGE, oldRestoreActivePage, restoreActivePage));
+ }
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ *
* @generated NOT
*/
@Override
@@ -678,6 +734,8 @@ public class SashModelImpl extends EObjectImpl implements SashModel {
return getCurrentSelection();
}
return basicGetCurrentSelection();
+ case DiPackage.SASH_MODEL__RESTORE_ACTIVE_PAGE:
+ return isRestoreActivePage();
}
return super.eGet(featureID, resolve, coreType);
}
@@ -699,6 +757,9 @@ public class SashModelImpl extends EObjectImpl implements SashModel {
case DiPackage.SASH_MODEL__CURRENT_SELECTION:
setCurrentSelection((TabFolder) newValue);
return;
+ case DiPackage.SASH_MODEL__RESTORE_ACTIVE_PAGE:
+ setRestoreActivePage((Boolean) newValue);
+ return;
}
super.eSet(featureID, newValue);
}
@@ -718,6 +779,9 @@ public class SashModelImpl extends EObjectImpl implements SashModel {
case DiPackage.SASH_MODEL__CURRENT_SELECTION:
setCurrentSelection((TabFolder) null);
return;
+ case DiPackage.SASH_MODEL__RESTORE_ACTIVE_PAGE:
+ setRestoreActivePage(RESTORE_ACTIVE_PAGE_EDEFAULT);
+ return;
}
super.eUnset(featureID);
}
@@ -735,8 +799,29 @@ public class SashModelImpl extends EObjectImpl implements SashModel {
return windows != null && !windows.isEmpty();
case DiPackage.SASH_MODEL__CURRENT_SELECTION:
return currentSelection != null;
+ case DiPackage.SASH_MODEL__RESTORE_ACTIVE_PAGE:
+ return restoreActivePage != RESTORE_ACTIVE_PAGE_EDEFAULT;
}
return super.eIsSet(featureID);
}
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ *
+ * @generated
+ */
+ @Override
+ public String toString() {
+ if (eIsProxy()) {
+ return super.toString();
+ }
+
+ StringBuffer result = new StringBuffer(super.toString());
+ result.append(" (restoreActivePage: ");
+ result.append(restoreActivePage);
+ result.append(')');
+ return result.toString();
+ }
+
} // SashModelImpl
diff --git a/plugins/infra/core/org.eclipse.papyrus.infra.core.sasheditor.di/src/org/eclipse/papyrus/infra/core/sashwindows/di/impl/TabFolderImpl.java b/plugins/infra/core/org.eclipse.papyrus.infra.core.sasheditor.di/src/org/eclipse/papyrus/infra/core/sashwindows/di/impl/TabFolderImpl.java
index 0aaea3fedac..f7ee51e8a5f 100644
--- a/plugins/infra/core/org.eclipse.papyrus.infra.core.sasheditor.di/src/org/eclipse/papyrus/infra/core/sashwindows/di/impl/TabFolderImpl.java
+++ b/plugins/infra/core/org.eclipse.papyrus.infra.core.sasheditor.di/src/org/eclipse/papyrus/infra/core/sashwindows/di/impl/TabFolderImpl.java
@@ -1,23 +1,33 @@
-/**
- * <copyright>
- * </copyright>
+/*****************************************************************************
+ * Copyright (c) 2011, 2015 LIFL, CEA LIST, Christian W. Damus, and others.
*
- * $Id$
- */
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * LIFL - Initial API and implementation
+ * Christian W. Damus - bug 469188
+ *
+ *****************************************************************************/
package org.eclipse.papyrus.infra.core.sashwindows.di.impl;
import java.util.Collection;
+import org.eclipse.emf.common.notify.Notification;
import org.eclipse.emf.common.notify.NotificationChain;
import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.util.EObjectContainmentWithInverseEList;
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.util.InternalEList;
import org.eclipse.papyrus.infra.core.sashwindows.di.DiFactory;
import org.eclipse.papyrus.infra.core.sashwindows.di.DiPackage;
import org.eclipse.papyrus.infra.core.sashwindows.di.PageRef;
import org.eclipse.papyrus.infra.core.sashwindows.di.TabFolder;
+import org.eclipse.uml2.common.util.SubsetSupersetEObjectContainmentWithInverseEList;
/**
* <!-- begin-user-doc -->
@@ -28,6 +38,7 @@ import org.eclipse.papyrus.infra.core.sashwindows.di.TabFolder;
* </p>
* <ul>
* <li>{@link org.eclipse.papyrus.infra.core.sashwindows.di.impl.TabFolderImpl#getChildren <em>Children</em>}</li>
+ * <li>{@link org.eclipse.papyrus.infra.core.sashwindows.di.impl.TabFolderImpl#getCurrentSelection <em>Current Selection</em>}</li>
* </ul>
*
* @generated
@@ -46,6 +57,17 @@ public class TabFolderImpl extends AbstractPanelImpl implements TabFolder {
protected EList<PageRef> children;
/**
+ * The cached value of the '{@link #getCurrentSelection() <em>Current Selection</em>}' reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ *
+ * @see #getCurrentSelection()
+ * @generated
+ * @ordered
+ */
+ protected PageRef currentSelection;
+
+ /**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
*
@@ -75,12 +97,77 @@ public class TabFolderImpl extends AbstractPanelImpl implements TabFolder {
@Override
public EList<PageRef> getChildren() {
if (children == null) {
- children = new EObjectContainmentWithInverseEList<PageRef>(PageRef.class, this, DiPackage.TAB_FOLDER__CHILDREN, DiPackage.PAGE_REF__PARENT);
+ children = new SubsetSupersetEObjectContainmentWithInverseEList<PageRef>(PageRef.class, this, DiPackage.TAB_FOLDER__CHILDREN, null, CHILDREN_ESUBSETS, DiPackage.PAGE_REF__PARENT);
}
return children;
}
/**
+ * The array of subset feature identifiers for the '{@link #getChildren() <em>Children</em>}' containment reference list.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ *
+ * @see #getChildren()
+ * @generated
+ * @ordered
+ */
+ protected static final int[] CHILDREN_ESUBSETS = new int[] { DiPackage.TAB_FOLDER__CURRENT_SELECTION };
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ *
+ * @generated
+ */
+ @Override
+ public PageRef getCurrentSelection() {
+ if (currentSelection != null && currentSelection.eIsProxy()) {
+ InternalEObject oldCurrentSelection = (InternalEObject) currentSelection;
+ currentSelection = (PageRef) eResolveProxy(oldCurrentSelection);
+ if (currentSelection != oldCurrentSelection) {
+ if (eNotificationRequired()) {
+ eNotify(new ENotificationImpl(this, Notification.RESOLVE, DiPackage.TAB_FOLDER__CURRENT_SELECTION, oldCurrentSelection, currentSelection));
+ }
+ }
+ }
+ return currentSelection;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ *
+ * @generated
+ */
+ public PageRef basicGetCurrentSelection() {
+ return currentSelection;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ *
+ * @generated
+ */
+ @Override
+ public void setCurrentSelection(PageRef newCurrentSelection) {
+ PageRef oldCurrentSelection = currentSelection;
+ currentSelection = newCurrentSelection;
+ if (eNotificationRequired()) {
+ eNotify(new ENotificationImpl(this, Notification.SET, DiPackage.TAB_FOLDER__CURRENT_SELECTION, oldCurrentSelection, currentSelection));
+ }
+ Resource.Internal eInternalResource = eInternalResource();
+ if (eInternalResource == null || !eInternalResource.isLoading()) {
+ if (newCurrentSelection != null) {
+ EList<PageRef> children = getChildren();
+ if (!children.contains(newCurrentSelection)) {
+ children.add(newCurrentSelection);
+ }
+ }
+ }
+ }
+
+ /**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
*
@@ -170,6 +257,11 @@ public class TabFolderImpl extends AbstractPanelImpl implements TabFolder {
switch (featureID) {
case DiPackage.TAB_FOLDER__CHILDREN:
return getChildren();
+ case DiPackage.TAB_FOLDER__CURRENT_SELECTION:
+ if (resolve) {
+ return getCurrentSelection();
+ }
+ return basicGetCurrentSelection();
}
return super.eGet(featureID, resolve, coreType);
}
@@ -188,6 +280,9 @@ public class TabFolderImpl extends AbstractPanelImpl implements TabFolder {
getChildren().clear();
getChildren().addAll((Collection<? extends PageRef>) newValue);
return;
+ case DiPackage.TAB_FOLDER__CURRENT_SELECTION:
+ setCurrentSelection((PageRef) newValue);
+ return;
}
super.eSet(featureID, newValue);
}
@@ -204,6 +299,9 @@ public class TabFolderImpl extends AbstractPanelImpl implements TabFolder {
case DiPackage.TAB_FOLDER__CHILDREN:
getChildren().clear();
return;
+ case DiPackage.TAB_FOLDER__CURRENT_SELECTION:
+ setCurrentSelection((PageRef) null);
+ return;
}
super.eUnset(featureID);
}
@@ -219,6 +317,8 @@ public class TabFolderImpl extends AbstractPanelImpl implements TabFolder {
switch (featureID) {
case DiPackage.TAB_FOLDER__CHILDREN:
return children != null && !children.isEmpty();
+ case DiPackage.TAB_FOLDER__CURRENT_SELECTION:
+ return currentSelection != null;
}
return super.eIsSet(featureID);
}
diff --git a/plugins/infra/core/org.eclipse.papyrus.infra.core.sasheditor/src/org/eclipse/papyrus/infra/core/sasheditor/editor/ICloseablePart.java b/plugins/infra/core/org.eclipse.papyrus.infra.core.sasheditor/src/org/eclipse/papyrus/infra/core/sasheditor/editor/ICloseablePart.java
new file mode 100644
index 00000000000..9431a6dc30e
--- /dev/null
+++ b/plugins/infra/core/org.eclipse.papyrus.infra.core.sasheditor/src/org/eclipse/papyrus/infra/core/sasheditor/editor/ICloseablePart.java
@@ -0,0 +1,60 @@
+/*****************************************************************************
+ * Copyright (c) 2015 Christian W. Damus and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Christian W. Damus - Initial API and implementation
+ *
+ *****************************************************************************/
+
+package org.eclipse.papyrus.infra.core.sasheditor.editor;
+
+import org.eclipse.ui.IPropertyListener;
+import org.eclipse.ui.IWorkbenchPart;
+
+/**
+ * A mixin interface, analogous to the Eclipse UI's {@link IWorkbenchPart}, that
+ * defines the protocol for editors and other parts nested within the
+ * {@linkplain IMultiPageEditorPart multi-page editor} that are conditionally
+ * closeable. That is, parts that may not always be permitted to be closed by the
+ * user.
+ */
+public interface ICloseablePart {
+ /**
+ * The Eclipse-style constant for the workbench property listener protocol,
+ * signalling changes in the {@link #canClose() canClose} property.
+ */
+ int PROP_CAN_CLOSE = 0x100001;
+
+ /**
+ * Queries whether I may be closed.
+ *
+ * @return whether I may be closed
+ */
+ boolean canClose();
+
+ /**
+ * Adds a property listener to me, such as for observation of the
+ * {@link #PROP_CAN_CLOSE canClose} property.
+ *
+ * @param listener
+ * the listener to add
+ *
+ * @see IWorkbenchPart#addPropertyListener(IPropertyListener)
+ */
+ void addPropertyListener(IPropertyListener listener);
+
+ /**
+ * Removes a property listener from me.
+ *
+ * @param listener
+ * the listener to remove
+ *
+ * @see IWorkbenchPart#removePropertyListener(IPropertyListener)
+ */
+ void removePropertyListener(IPropertyListener listener);
+}
diff --git a/plugins/infra/core/org.eclipse.papyrus.infra.core.sasheditor/src/org/eclipse/papyrus/infra/core/sasheditor/internal/ComponentPart.java b/plugins/infra/core/org.eclipse.papyrus.infra.core.sasheditor/src/org/eclipse/papyrus/infra/core/sasheditor/internal/ComponentPart.java
index af61a90a5fc..b79c1a7e1de 100644
--- a/plugins/infra/core/org.eclipse.papyrus.infra.core.sasheditor/src/org/eclipse/papyrus/infra/core/sasheditor/internal/ComponentPart.java
+++ b/plugins/infra/core/org.eclipse.papyrus.infra.core.sasheditor/src/org/eclipse/papyrus/infra/core/sasheditor/internal/ComponentPart.java
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (c) 2009 CEA LIST & LIFL
+ * Copyright (c) 2009, 2015 CEA LIST & LIFL, Christian W. Damus, and others
*
*
* All rights reserved. This program and the accompanying materials
@@ -9,6 +9,7 @@
*
* Contributors:
* Cedric Dumoulin Cedric.dumoulin@lifl.fr - Initial API and implementation
+ * Christian W. Damus - bug 469188
*
*****************************************************************************/
package org.eclipse.papyrus.infra.core.sasheditor.internal;
@@ -18,7 +19,7 @@ import org.eclipse.core.runtime.Status;
import org.eclipse.papyrus.infra.core.sasheditor.Activator;
import org.eclipse.papyrus.infra.core.sasheditor.contentprovider.IComponentModel;
import org.eclipse.papyrus.infra.core.sasheditor.editor.IComponentPage;
-import org.eclipse.papyrus.infra.core.sasheditor.internal.AbstractPart.GarbageState;
+import org.eclipse.papyrus.infra.tools.util.PlatformHelper;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.Point;
@@ -59,6 +60,11 @@ public class ComponentPart extends PagePart implements IComponentPage {
this.partModel = partModel;
}
+ @Override
+ public <T> T getAdapter(Class<T> adapter) {
+ return PlatformHelper.getAdapter(partModel, adapter, () -> super.getAdapter(adapter));
+ }
+
/**
* Create the control of this Part, and children's controls.
*
diff --git a/plugins/infra/core/org.eclipse.papyrus.infra.core.sasheditor/src/org/eclipse/papyrus/infra/core/sasheditor/internal/EditorPart.java b/plugins/infra/core/org.eclipse.papyrus.infra.core.sasheditor/src/org/eclipse/papyrus/infra/core/sasheditor/internal/EditorPart.java
index e431710afc2..1abf8c91d38 100644
--- a/plugins/infra/core/org.eclipse.papyrus.infra.core.sasheditor/src/org/eclipse/papyrus/infra/core/sasheditor/internal/EditorPart.java
+++ b/plugins/infra/core/org.eclipse.papyrus.infra.core.sasheditor/src/org/eclipse/papyrus/infra/core/sasheditor/internal/EditorPart.java
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (c) 2009 CEA LIST & LIFL
+ * Copyright (c) 2009, 2015 CEA LIST & LIFL, Christian W. Damus, and others
*
*
* All rights reserved. This program and the accompanying materials
@@ -9,6 +9,7 @@
*
* Contributors:
* Cedric Dumoulin Cedric.dumoulin@lifl.fr - Initial API and implementation
+ * Christian W. Damus - bug 469188
*
*****************************************************************************/
package org.eclipse.papyrus.infra.core.sasheditor.internal;
@@ -24,9 +25,9 @@ import org.eclipse.jface.window.Window;
import org.eclipse.papyrus.infra.core.sasheditor.Activator;
import org.eclipse.papyrus.infra.core.sasheditor.contentprovider.IEditorModel;
import org.eclipse.papyrus.infra.core.sasheditor.editor.IEditorPage;
-import org.eclipse.papyrus.infra.core.sasheditor.internal.AbstractPart.GarbageState;
import org.eclipse.papyrus.infra.core.sasheditor.internal.eclipsecopy.IMultiPageEditorSite;
import org.eclipse.papyrus.infra.core.sasheditor.internal.eclipsecopy.MultiPageEditorSite;
+import org.eclipse.papyrus.infra.tools.util.PlatformHelper;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;
@@ -169,19 +170,12 @@ public class EditorPart extends PagePart implements IEditorPage {
this.multiEditorManager = multiEditorManager;
}
-
- /**
- * Create the control of this part.
- * For a this implementations, also create the children's controls.
- * This method forward to {@link createPartControl(Composite)}.
- *
- * @param parent
- * TODO remove ?
- */
- // public void createControl(Composite parent) {
- // createPartControl(parent);
- // }
-
+ @Override
+ public <T> T getAdapter(Class<T> adapter) {
+ return PlatformHelper.getAdapter(editorPart, adapter, ()//
+ -> PlatformHelper.getAdapter(editorModel, adapter, ()//
+ -> super.getAdapter(adapter)));
+ }
/**
* Create the control of this Part, and children's controls.
@@ -379,7 +373,7 @@ public class EditorPart extends PagePart implements IEditorPage {
// cedric : old fashion, deprecated ?
getSashWindowContainer().firePropertyChange(propertyId);
// relay the event to the page lifecycle event notifier
- getSashWindowContainer().getLifeCycleEventProvider().firePageFirePropertyChangeEvent(this, propertyId);
+ getSashWindowContainer().getLifeCycleEventProvider().firePageFirePropertyChangeEvent(this, propertyId);
}
/**
@@ -582,7 +576,6 @@ public class EditorPart extends PagePart implements IEditorPage {
* TODO: change the interface.
*
* @param draggedObject
- * @param sourcePart
* @param position
* @return
*/
diff --git a/plugins/infra/core/org.eclipse.papyrus.infra.core.sasheditor/src/org/eclipse/papyrus/infra/core/sasheditor/internal/PTabFolder.java b/plugins/infra/core/org.eclipse.papyrus.infra.core.sasheditor/src/org/eclipse/papyrus/infra/core/sasheditor/internal/PTabFolder.java
index 5bd3de9f10f..808a6568e20 100644
--- a/plugins/infra/core/org.eclipse.papyrus.infra.core.sasheditor/src/org/eclipse/papyrus/infra/core/sasheditor/internal/PTabFolder.java
+++ b/plugins/infra/core/org.eclipse.papyrus.infra.core.sasheditor/src/org/eclipse/papyrus/infra/core/sasheditor/internal/PTabFolder.java
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (c) 2008 CEA LIST.
+ * Copyright (c) 2008, 2015 CEA LIST, Christian W. Damus, and others.
*
*
* All rights reserved. This program and the accompanying materials
@@ -9,6 +9,7 @@
*
* Contributors:
* Cedric Dumoulin Cedric.dumoulin@lifl.fr - Initial API and implementation
+ * Christian W. Damus - bug 469188
*
*****************************************************************************/
package org.eclipse.papyrus.infra.core.sasheditor.internal;
@@ -144,9 +145,10 @@ public class PTabFolder {
*/
private CTabFolder createContainer(Composite parent) {
// use SWT.FLAT style so that an extra 1 pixel border is not reserved
- // inside the folder
+ // inside the folder. Don't use SWT.CLOSE style because each tab determines
+ // whether it is closeable or not
parent.setLayout(new FillLayout());
- final CTabFolder newContainer = new CTabFolder(parent, SWT.BOTTOM | SWT.FLAT | SWT.CLOSE);
+ final CTabFolder newContainer = new CTabFolder(parent, SWT.BOTTOM | SWT.FLAT);
// TODO Move listener init in appropriate method.
newContainer.addSelectionListener(new SelectionAdapter() {
diff --git a/plugins/infra/core/org.eclipse.papyrus.infra.core.sasheditor/src/org/eclipse/papyrus/infra/core/sasheditor/internal/PagePart.java b/plugins/infra/core/org.eclipse.papyrus.infra.core.sasheditor/src/org/eclipse/papyrus/infra/core/sasheditor/internal/PagePart.java
index 3da44a185d3..85a1bb84394 100644
--- a/plugins/infra/core/org.eclipse.papyrus.infra.core.sasheditor/src/org/eclipse/papyrus/infra/core/sasheditor/internal/PagePart.java
+++ b/plugins/infra/core/org.eclipse.papyrus.infra.core.sasheditor/src/org/eclipse/papyrus/infra/core/sasheditor/internal/PagePart.java
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (c) 2009 CEA LIST & LIFL
+ * Copyright (c) 2009, 2015 CEA LIST & LIFL, Christian W. Damus, and others
*
*
* All rights reserved. This program and the accompanying materials
@@ -9,12 +9,15 @@
*
* Contributors:
* Cedric Dumoulin Cedric.dumoulin@lifl.fr - Initial API and implementation
+ * Christian W. Damus - bug 469188
*
*****************************************************************************/
package org.eclipse.papyrus.infra.core.sasheditor.internal;
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.papyrus.infra.core.sasheditor.editor.ICloseablePart;
import org.eclipse.papyrus.infra.core.sasheditor.editor.IPage;
-import org.eclipse.papyrus.infra.core.sasheditor.internal.AbstractPart.GarbageState;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.widgets.Composite;
@@ -26,7 +29,7 @@ import org.eclipse.swt.widgets.Widget;
*
* @author dumoulin
*/
-public abstract class PagePart extends AbstractPart implements IPage {
+public abstract class PagePart extends AbstractPart implements IPage, IAdaptable {
/** Raw model associated to this part. We store it because the PartModel do not provide it */
protected Object rawModel;
@@ -46,6 +49,10 @@ public abstract class PagePart extends AbstractPart implements IPage {
this.rawModel = rawModel;
}
+ @Override
+ public <T> T getAdapter(Class<T> adapter) {
+ return Platform.getAdapterManager().getAdapter(this, adapter);
+ }
/**
* @return the parent
@@ -212,6 +219,18 @@ public abstract class PagePart extends AbstractPart implements IPage {
}
/**
+ * Queries whether I should be permitted to be closed.
+ *
+ * @return whether my containing tab should show the close widget
+ */
+ public boolean canClose() {
+ ICloseablePart closeable = getAdapter(ICloseablePart.class);
+ return (closeable == null)
+ || (closeable == this) // Avoid unbounded re-entry into this method!
+ || closeable.canClose();
+ }
+
+ /**
* Set focus on the SWT control associated to this PagePart.
* Used by the ActivePageTracker.
*/
diff --git a/plugins/infra/core/org.eclipse.papyrus.infra.core.sasheditor/src/org/eclipse/papyrus/infra/core/sasheditor/internal/TabFolderPart.java b/plugins/infra/core/org.eclipse.papyrus.infra.core.sasheditor/src/org/eclipse/papyrus/infra/core/sasheditor/internal/TabFolderPart.java
index 61eccba6915..1ab3a6c04ac 100644
--- a/plugins/infra/core/org.eclipse.papyrus.infra.core.sasheditor/src/org/eclipse/papyrus/infra/core/sasheditor/internal/TabFolderPart.java
+++ b/plugins/infra/core/org.eclipse.papyrus.infra.core.sasheditor/src/org/eclipse/papyrus/infra/core/sasheditor/internal/TabFolderPart.java
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (c) 2008, 2014 CEA LIST and others.
+ * Copyright (c) 2008, 2015 CEA LIST, Christian W. Damus, and others.
*
*
* All rights reserved. This program and the accompanying materials
@@ -10,6 +10,7 @@
* Contributors:
* Cedric Dumoulin Cedric.dumoulin@lifl.fr - Initial API and implementation
* Christian W. Damus (CEA) - bug 392301
+ * Christian W. Damus - bug 469188
*
*****************************************************************************/
package org.eclipse.papyrus.infra.core.sasheditor.internal;
@@ -22,8 +23,10 @@ import org.eclipse.jface.util.Geometry;
import org.eclipse.papyrus.infra.core.sasheditor.Activator;
import org.eclipse.papyrus.infra.core.sasheditor.contentprovider.IPageModel;
import org.eclipse.papyrus.infra.core.sasheditor.contentprovider.ITabFolderModel;
+import org.eclipse.papyrus.infra.core.sasheditor.editor.ICloseablePart;
import org.eclipse.papyrus.infra.core.sasheditor.editor.IFolder;
import org.eclipse.papyrus.infra.core.sasheditor.internal.eclipsecopy.AbstractTabFolderPart;
+import org.eclipse.papyrus.infra.tools.util.PlatformHelper;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.CTabFolder;
import org.eclipse.swt.custom.CTabFolderEvent;
@@ -41,6 +44,7 @@ import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Menu;
+import org.eclipse.ui.IPropertyListener;
import org.eclipse.ui.internal.DragCursors;
import org.eclipse.ui.internal.dnd.DragUtil;
import org.eclipse.ui.internal.dnd.IDragOverListener;
@@ -1078,6 +1082,12 @@ public class TabFolderPart extends AbstractTabFolderPart implements IFolder {
// No part control? Dispose the model, now
partModel.dispose();
}
+
+ ICloseablePart closeable = PlatformHelper.getAdapter(newPart, ICloseablePart.class);
+ if (closeable != null) {
+ attachListeners(closeable, newPart);
+ }
+
return newPart;
}
@@ -1085,6 +1095,22 @@ public class TabFolderPart extends AbstractTabFolderPart implements IFolder {
return createErrorPage();
}
+ private void attachListeners(ICloseablePart closeable, PagePart part) {
+ closeable.addPropertyListener(new IPropertyListener() {
+
+ @Override
+ public void propertyChanged(Object source, int propId) {
+ switch (propId) {
+ case ICloseablePart.PROP_CAN_CLOSE:
+ // Update the presentation of the close widget, if necessary
+ refreshPageTab(part);
+ break;
+ }
+ }
+ });
+
+ }
+
/**
* Creates an ErrorComponentPart which displays an error message to the user.
* Avoid returning null, which might later lead to NPEs
diff --git a/plugins/infra/core/org.eclipse.papyrus.infra.core.sasheditor/src/org/eclipse/papyrus/infra/core/sasheditor/internal/TabItemPart.java b/plugins/infra/core/org.eclipse.papyrus.infra.core.sasheditor/src/org/eclipse/papyrus/infra/core/sasheditor/internal/TabItemPart.java
index 3cb9a279ff1..8e7ffe91c6e 100644
--- a/plugins/infra/core/org.eclipse.papyrus.infra.core.sasheditor/src/org/eclipse/papyrus/infra/core/sasheditor/internal/TabItemPart.java
+++ b/plugins/infra/core/org.eclipse.papyrus.infra.core.sasheditor/src/org/eclipse/papyrus/infra/core/sasheditor/internal/TabItemPart.java
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (c) 2009 CEA LIST & LIFL
+ * Copyright (c) 2009, 2015 CEA LIST & LIFL, Christian W. Damus, and others
*
*
* All rights reserved. This program and the accompanying materials
@@ -9,6 +9,7 @@
*
* Contributors:
* Cedric Dumoulin Cedric.dumoulin@lifl.fr - Initial API and implementation
+ * Christian W. Damus - bug 469188
*
*****************************************************************************/
package org.eclipse.papyrus.infra.core.sasheditor.internal;
@@ -93,6 +94,7 @@ public class TabItemPart {
public void refreshTabDecorations() {
setTabText(childPart.getPageTitle());
setTabImage(childPart.getPageIcon());
+ control.setShowClose(childPart.canClose());
}
/**
diff --git a/plugins/infra/core/org.eclipse.papyrus.infra.core/src/org/eclipse/papyrus/infra/core/editor/CoreMultiDiagramEditor.java b/plugins/infra/core/org.eclipse.papyrus.infra.core/src/org/eclipse/papyrus/infra/core/editor/CoreMultiDiagramEditor.java
index ef429d9aaaa..24a15bd5e20 100644
--- a/plugins/infra/core/org.eclipse.papyrus.infra.core/src/org/eclipse/papyrus/infra/core/editor/CoreMultiDiagramEditor.java
+++ b/plugins/infra/core/org.eclipse.papyrus.infra.core/src/org/eclipse/papyrus/infra/core/editor/CoreMultiDiagramEditor.java
@@ -13,6 +13,7 @@
* Christian W. Damus (CEA) - bug 431953 (pre-requisite refactoring of ModelSet service start-up)
* Christian W. Damus (CEA) - bug 437217
* Christian W. Damus - bug 469464
+ * Christian W. Damus - bug 469188
*
*****************************************************************************/
@@ -493,6 +494,10 @@ public class CoreMultiDiagramEditor extends AbstractMultiPageSashEditor implemen
public void createPartControl(Composite parent) {
super.createPartControl(parent);
+ // Fire the PreDisplay event synchronously, so that listeners can continue
+ // setting up the UI before the contents are actually rendered fully
+ getLifecycleManager().firePreDisplay(this);
+
// Fire the PostDisplay event asynchronously, to leave time to the Eclipse
// framework to actually display the contents of the editor
Display.getDefault().asyncExec(new Runnable() {
diff --git a/plugins/infra/core/org.eclipse.papyrus.infra.core/src/org/eclipse/papyrus/infra/core/editor/MultiDiagramPropertySheetPage.java b/plugins/infra/core/org.eclipse.papyrus.infra.core/src/org/eclipse/papyrus/infra/core/editor/MultiDiagramPropertySheetPage.java
index 1056bef8835..75f4962b214 100644
--- a/plugins/infra/core/org.eclipse.papyrus.infra.core/src/org/eclipse/papyrus/infra/core/editor/MultiDiagramPropertySheetPage.java
+++ b/plugins/infra/core/org.eclipse.papyrus.infra.core/src/org/eclipse/papyrus/infra/core/editor/MultiDiagramPropertySheetPage.java
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (c) 2014 CEA LIST and others.
+ * Copyright (c) 2014, 2015 CEA LIST, Christian W. Damus, and others.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
@@ -8,20 +8,30 @@
*
* Contributors:
* CEA LIST - Initial API and implementation
+ * Christian W. Damus - bug 469188
*
*****************************************************************************/
package org.eclipse.papyrus.infra.core.editor;
import org.eclipse.core.commands.operations.IUndoContext;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.emf.common.ui.URIEditorInput;
+import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ISelectionProvider;
+import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.papyrus.infra.core.editor.reload.EditorReloadEvent;
import org.eclipse.papyrus.infra.core.editor.reload.IEditorReloadListener;
import org.eclipse.papyrus.infra.core.operation.DelegatingUndoContext;
-import org.eclipse.papyrus.infra.core.utils.AdapterUtils;
+import org.eclipse.papyrus.infra.core.sasheditor.editor.ISashWindowsContainer;
+import org.eclipse.papyrus.infra.tools.util.PlatformHelper;
import org.eclipse.ui.IActionBars;
+import org.eclipse.ui.IEditorInput;
+import org.eclipse.ui.IFileEditorInput;
import org.eclipse.ui.IPartListener;
import org.eclipse.ui.ISelectionListener;
+import org.eclipse.ui.IStorageEditorInput;
+import org.eclipse.ui.IURIEditorInput;
import org.eclipse.ui.IViewPart;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.actions.ActionFactory;
@@ -67,6 +77,46 @@ class MultiDiagramPropertySheetPage extends TabbedPropertySheetPage implements I
}
@Override
+ public void selectionChanged(IWorkbenchPart part, ISelection selection) {
+ if (selection.isEmpty() && (part instanceof IMultiDiagramEditor)) {
+ // Perhaps the user selected a page such as the Welcome Page that
+ // isn't an editor and so doesn't have a selection
+ IMultiDiagramEditor editor = (IMultiDiagramEditor) part;
+ ISashWindowsContainer sash = editor.getAdapter(ISashWindowsContainer.class);
+ if (sash != null) {
+ if ((sash.getActiveEditor() == null) && (sash.getActiveSashWindowsPage() != null)) {
+ // Yep, that's the case, here. So show the properties of the input
+ // resource (usually a DI file)
+ IEditorInput input = editor.getEditorInput();
+ Object newSelection;
+ if (input instanceof IFileEditorInput) {
+ newSelection = ((IFileEditorInput) input).getFile();
+ } else if (input instanceof IStorageEditorInput) {
+ IStorageEditorInput storageInput = (IStorageEditorInput) input;
+ try {
+ newSelection = storageInput.getStorage();
+ } catch (CoreException e) {
+ newSelection = storageInput;
+ }
+ } else if (input instanceof IURIEditorInput) {
+ newSelection = ((IURIEditorInput) input).getURI();
+ } else if (input instanceof URIEditorInput) {
+ newSelection = ((URIEditorInput) input).getURI();
+ } else {
+ newSelection = null;
+ }
+
+ if (newSelection != null) {
+ selection = new StructuredSelection(newSelection);
+ }
+ }
+ }
+ }
+
+ super.selectionChanged(part, selection);
+ }
+
+ @Override
public void editorAboutToReload(EditorReloadEvent event) {
Object propertySheet = getSite().getService(IViewPart.class);
if (propertySheet instanceof IShowInSource) {
@@ -106,7 +156,7 @@ class MultiDiagramPropertySheetPage extends TabbedPropertySheetPage implements I
// The editor will have a new undo context (because it will have a new editing domain)
if (undoContext != null) {
- undoContext.setDelegate(AdapterUtils.adapt(multiDiagramEditor, IUndoContext.class, null));
+ undoContext.setDelegate(PlatformHelper.getAdapter(multiDiagramEditor, IUndoContext.class));
}
}
@@ -115,7 +165,7 @@ class MultiDiagramPropertySheetPage extends TabbedPropertySheetPage implements I
super.setActionBars(actionBars);
undoContext = new DelegatingUndoContext();
- undoContext.setDelegate(AdapterUtils.adapt(multiDiagramEditor, IUndoContext.class, null));
+ undoContext.setDelegate(PlatformHelper.getAdapter(multiDiagramEditor, IUndoContext.class));
undo = new UndoActionHandler(multiDiagramEditor.getSite(), undoContext);
redo = new RedoActionHandler(multiDiagramEditor.getSite(), undoContext);
diff --git a/plugins/infra/core/org.eclipse.papyrus.infra.core/src/org/eclipse/papyrus/infra/core/internal/commands/PageLayoutStorageState.java b/plugins/infra/core/org.eclipse.papyrus.infra.core/src/org/eclipse/papyrus/infra/core/internal/commands/PageLayoutStorageState.java
index 876c75a8651..1218162eb1c 100644
--- a/plugins/infra/core/org.eclipse.papyrus.infra.core/src/org/eclipse/papyrus/infra/core/internal/commands/PageLayoutStorageState.java
+++ b/plugins/infra/core/org.eclipse.papyrus.infra.core/src/org/eclipse/papyrus/infra/core/internal/commands/PageLayoutStorageState.java
@@ -13,6 +13,8 @@
package org.eclipse.papyrus.infra.core.internal.commands;
+import java.beans.PropertyChangeEvent;
+import java.beans.PropertyChangeListener;
import java.lang.ref.Reference;
import java.lang.ref.WeakReference;
@@ -31,7 +33,7 @@ import org.eclipse.ui.PlatformUI;
/**
* The boolean toggle state of the private page layout storage menu item.
*/
-public class PageLayoutStorageState extends ToggleState implements IPartListener {
+public class PageLayoutStorageState extends ToggleState implements IPartListener, PropertyChangeListener {
private IPartService partService = null;
@@ -76,6 +78,8 @@ public class PageLayoutStorageState extends ToggleState implements IPartListener
// Default state is private storage
boolean state = true;
+ unhookSashModelListener();
+
activeEditor = null;
if (part instanceof IMultiDiagramEditor) {
@@ -84,6 +88,8 @@ public class PageLayoutStorageState extends ToggleState implements IPartListener
state = isPrivateLayout(editor);
}
+ hookSashModelListener();
+
// Fires notification if changed from previous state
setValue(state);
}
@@ -117,4 +123,42 @@ public class PageLayoutStorageState extends ToggleState implements IPartListener
public void partOpened(IWorkbenchPart part) {
// Pass
}
+
+ @Override
+ public void propertyChange(PropertyChangeEvent evt) {
+ if (evt.getSource() instanceof SashModel) {
+ switch (evt.getPropertyName()) {
+ case SashModel.PROPERTY_LEGACY_MODE:
+ setValue(!(Boolean) evt.getNewValue());
+ break;
+ }
+ }
+ }
+
+ private SashModel getSashModel() {
+ SashModel result = null;
+
+ if (activeEditor != null) {
+ IMultiDiagramEditor editor = activeEditor.get();
+ if (editor != null) {
+ result = SashModelUtils.getSashModel(editor.getServicesRegistry());
+ }
+ }
+
+ return result;
+ }
+
+ private void unhookSashModelListener() {
+ SashModel sash = getSashModel();
+ if (sash != null) {
+ sash.removePropertyChangeListener(SashModel.PROPERTY_LEGACY_MODE, this);
+ }
+ }
+
+ private void hookSashModelListener() {
+ SashModel sash = getSashModel();
+ if (sash != null) {
+ sash.addPropertyChangeListener(SashModel.PROPERTY_LEGACY_MODE, this);
+ }
+ }
}
diff --git a/plugins/infra/core/org.eclipse.papyrus.infra.core/src/org/eclipse/papyrus/infra/core/resource/sasheditor/SashLayoutCommandFactory.java b/plugins/infra/core/org.eclipse.papyrus.infra.core/src/org/eclipse/papyrus/infra/core/resource/sasheditor/SashLayoutCommandFactory.java
index bbd6b52c8c1..facbe085f31 100644
--- a/plugins/infra/core/org.eclipse.papyrus.infra.core/src/org/eclipse/papyrus/infra/core/resource/sasheditor/SashLayoutCommandFactory.java
+++ b/plugins/infra/core/org.eclipse.papyrus.infra.core/src/org/eclipse/papyrus/infra/core/resource/sasheditor/SashLayoutCommandFactory.java
@@ -13,16 +13,23 @@
package org.eclipse.papyrus.infra.core.resource.sasheditor;
+import java.util.ArrayList;
+
import org.eclipse.emf.common.command.AbstractCommand;
import org.eclipse.emf.common.command.Command;
import org.eclipse.emf.common.command.UnexecutableCommand;
import org.eclipse.emf.common.util.URI;
+import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.util.EcoreUtil;
import org.eclipse.emf.edit.domain.EditingDomain;
import org.eclipse.papyrus.infra.core.editor.IMultiDiagramEditor;
import org.eclipse.papyrus.infra.core.resource.ModelSet;
+import org.eclipse.papyrus.infra.core.sasheditor.editor.ISashWindowsContainer;
+import org.eclipse.papyrus.infra.core.sashwindows.di.PageRef;
+import org.eclipse.papyrus.infra.core.sashwindows.di.SashModel;
import org.eclipse.papyrus.infra.core.sashwindows.di.SashWindowsMngr;
+import org.eclipse.papyrus.infra.core.sashwindows.di.TabFolder;
import org.eclipse.papyrus.infra.core.sashwindows.di.util.DiUtils;
/**
@@ -50,9 +57,27 @@ public class SashLayoutCommandFactory {
org.eclipse.papyrus.infra.core.resource.sasheditor.SashModel sashModel = SashModelUtils.getSashModel(modelSet);
if (sashModel != null) {
result = new AbstractToggleCommand("Toggle Private Editor Layout") {
+ private Command toggleRestoreActivePage;
+
+ {
+ // If we are toggling off private mode, make sure that we stop
+ // tracking the active page selection if we were tracking it.
+ // And remember that for undo
+ if (!sashModel.isLegacyMode()) {
+ SashWindowsMngr sash = DiUtils.lookupSashWindowsMngr(sashModel.getResource());
+ if ((sash != null) && (sash.getSashModel() != null) && sash.getSashModel().isRestoreActivePage()) {
+ toggleRestoreActivePage = createToggleRestoreActivePageCommand();
+ }
+ }
+ }
@Override
public void execute() {
+ // First, if we need to toggle restoring the active page, do that
+ if ((toggleRestoreActivePage != null) && toggleRestoreActivePage.canExecute()) {
+ toggleRestoreActivePage.execute();
+ }
+
SashWindowsMngr toMove = DiUtils.lookupSashWindowsMngr(sashModel.getResource());
// We don't record changes in the sash model for undo/redo,
@@ -66,12 +91,7 @@ public class SashLayoutCommandFactory {
// give up because something is seriously wrong in that case
Resource diResource = modelSet.getResource(sharedURI, false);
if ((diResource != null) && diResource.isLoaded()) {
- SashWindowsMngr toReplace = DiUtils.lookupSashWindowsMngr(diResource);
- if (toReplace != null) {
- EcoreUtil.replace(toReplace, toMove);
- } else {
- diResource.getContents().add(0, toMove);
- }
+ moveContents(sashResource, diResource);
if (sashResource.getContents().isEmpty()) {
// Schedule deletion on save
@@ -93,12 +113,8 @@ public class SashLayoutCommandFactory {
// In case we had marked it for deletion, earlier
modelSet.getResourcesToDeleteOnSave().remove(privateURI);
- SashWindowsMngr toReplace = DiUtils.lookupSashWindowsMngr(sashResource);
- if (toReplace != null) {
- EcoreUtil.replace(toReplace, toMove);
- } else {
- sashResource.getContents().add(0, toMove);
- }
+ Resource diResource = toMove.eResource();
+ moveContents(diResource, sashResource);
}
// Re-load from the new resource. Snippets might find this odd, but
@@ -111,6 +127,74 @@ public class SashLayoutCommandFactory {
return result;
}
+ void moveContents(Resource fromResource, Resource toResource) {
+ // Safe copy to allow concurrent modifications
+ for (EObject root : new ArrayList<>(fromResource.getContents())) {
+ EObject toReplace = (EObject) EcoreUtil.getObjectByType(toResource.getContents(), root.eClass());
+ if (toReplace != null) {
+ EcoreUtil.replace(toReplace, root);
+ } else {
+ if (root instanceof SashWindowsMngr) {
+ // This one is expected always to be first
+ toResource.getContents().add(0, root);
+ } else {
+ toResource.getContents().add(root);
+ }
+ }
+ }
+
+ }
+
+ /**
+ * Creates a command that toggles whether the sash model records the currently
+ * active page to restore it on next opening.
+ *
+ * @return a toggle command for the restore-active-page behaviour
+ */
+ public Command createToggleRestoreActivePageCommand() {
+ Command result = UnexecutableCommand.INSTANCE;
+
+ ModelSet modelSet = (ModelSet) editor.getAdapter(EditingDomain.class).getResourceSet();
+ SashWindowsMngr sashWindows = SashModelUtils.getSashWindowsMngr(modelSet);
+ ISashWindowsContainer container = editor.getAdapter(ISashWindowsContainer.class);
+
+ SashModel sashModel = sashWindows.getSashModel();
+ if (sashModel != null) {
+ // We don't record the tracking of the active page for undo/redo,
+ // so we cannot assume that any changes to the current page selections
+ // are undoable in the usual way
+ result = new AbstractToggleCommand("Toggle Restore Active Page") {
+
+ @Override
+ public void execute() {
+ boolean oldValue = sashModel.isRestoreActivePage();
+
+ if (oldValue) {
+ // Clear each tab folder's selection
+ container.getIFolderList().stream()
+ .map(f -> f.getRawModel())
+ .filter(TabFolder.class::isInstance).map(TabFolder.class::cast)
+ .filter(f -> f.getCurrentSelection() != null)
+ .forEach(f -> f.setCurrentSelection(null));
+ } else {
+ // Set each tab folder's selection.
+ // The 'visible pages' are the current selection in each folder
+ container.getVisiblePages().stream()
+ .map(p -> p.getRawModel())
+ .filter(PageRef.class::isInstance).map(PageRef.class::cast)
+ .filter(p -> p.getParent().getCurrentSelection() != p)
+ .forEach(p -> p.getParent().setCurrentSelection(p));
+ }
+
+ // The basic toggle
+ sashModel.setRestoreActivePage(!oldValue);
+ }
+ };
+ }
+
+ return result;
+ }
+
//
// Nested types
//
diff --git a/plugins/infra/core/org.eclipse.papyrus.infra.core/src/org/eclipse/papyrus/infra/core/resource/sasheditor/SashModel.java b/plugins/infra/core/org.eclipse.papyrus.infra.core/src/org/eclipse/papyrus/infra/core/resource/sasheditor/SashModel.java
index 479066b57c6..08b531676b3 100644
--- a/plugins/infra/core/org.eclipse.papyrus.infra.core/src/org/eclipse/papyrus/infra/core/resource/sasheditor/SashModel.java
+++ b/plugins/infra/core/org.eclipse.papyrus.infra.core/src/org/eclipse/papyrus/infra/core/resource/sasheditor/SashModel.java
@@ -12,13 +12,19 @@
* Christian W. Damus (CEA) - bug 429242
* Christian W. Damus (CEA) - bug 436468
* Christian W. Damus - bug 434983
+ * Christian W. Damus - bug 469188
*
*****************************************************************************/
package org.eclipse.papyrus.infra.core.resource.sasheditor;
+import java.beans.PropertyChangeListener;
+import java.beans.PropertyChangeSupport;
import java.util.Collections;
import java.util.Map;
+import org.eclipse.emf.common.notify.Adapter;
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.notify.impl.AdapterImpl;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.resource.URIConverter;
@@ -33,10 +39,21 @@ import org.eclipse.papyrus.infra.core.sashwindows.di.util.DiUtils;
import com.google.common.base.Objects;
/**
+ * <p>
* Model for the sash system.
- *
+ * </p>
+ * <p>
* It may be stored in the *.di file (Legacy mode) or in a *.sash file in the user
* preference space (~workspace/.metadata/.plugins/org.eclipse.papyrus.infra.core/)
+ * </p>
+ * <p>
+ * The following properties are observable via Java Beans {@linkplain #addPropertyChangeListener(String, PropertyChangeListener) listeners}:
+ * </p>
+ * <ul>
+ * <li>{@link #isLegacyMode() legacyMode}</li>
+ * <li>{@link #getPrivateResourceURI() privateResourceURI}</li>
+ * <li>{@link #getSharedResourceURI() sharedResourceURI}</li>
+ * </ul>
*
* @author Cedric Dumoulin
* @author Camille Letavernier
@@ -44,8 +61,18 @@ import com.google.common.base.Objects;
*/
public class SashModel extends EMFLogicalModel implements IModel {
+ public static final String PROPERTY_PRIVATE_RESOURCE_URI = "privateResourceURI"; //$NON-NLS-1$
+ public static final String PROPERTY_SHARED_RESOURCE_URI = "sharedResourceURI"; //$NON-NLS-1$
+ public static final String PROPERTY_LEGACY_MODE = "legacyMode"; //$NON-NLS-1$
+
+ private final PropertyChangeSupport bean = new PropertyChangeSupport(this);
+
private SashModelProviderManager providerManager;
+ private Adapter sashModelStorageAdapter;
+
+ private volatile Boolean legacyMode;
+
/**
* File extension.
*
@@ -70,7 +97,20 @@ public class SashModel extends EMFLogicalModel implements IModel {
*
*/
public SashModel() {
-
+ super();
+
+ sashModelStorageAdapter = new AdapterImpl() {
+ @Override
+ public void notifyChanged(Notification msg) {
+ if (getResources().contains(msg.getNotifier())) {
+ switch (msg.getFeatureID(Resource.class)) {
+ case Resource.RESOURCE__CONTENTS:
+ invalidateLegacyMode();
+ break;
+ }
+ }
+ }
+ };
}
/**
@@ -103,6 +143,8 @@ public class SashModel extends EMFLogicalModel implements IModel {
providerManager = null;
}
+ getResources().forEach(res -> res.eAdapters().remove(sashModelStorageAdapter));
+
super.unload();
}
@@ -114,7 +156,7 @@ public class SashModel extends EMFLogicalModel implements IModel {
// We only handle the main Sash resource. Imported *.sash are not relevant
if (resource == getResource()) {
result = true;
- } else if (getModelManager().getURIWithoutExtension() != null) {
+ } else {
// We can only calculate these related URIs if the ModelSet is initialized
result = resource.getURI().equals(getPrivateResourceURI()) || resource.getURI().equals(getSharedResourceURI());
}
@@ -123,6 +165,15 @@ public class SashModel extends EMFLogicalModel implements IModel {
return result;
}
+ @Override
+ protected void configureResource(Resource resourceToConfigure) {
+ super.configureResource(resourceToConfigure);
+
+ if (resourceToConfigure != null) {
+ resourceToConfigure.eAdapters().add(sashModelStorageAdapter);
+ }
+ }
+
/**
* Get the identifier used to register this model.
*
@@ -164,6 +215,9 @@ public class SashModel extends EMFLogicalModel implements IModel {
@Override
public void setModelURI(URI uriWithoutExtension) {
+ URI oldPrivateURI = getPrivateResourceURI();
+ URI oldSharedURI = getSharedResourceURI();
+
URI newURI;
if ((resourceURI != null) && isLegacy(resourceURI.trimFileExtension())) {
newURI = getLegacyURI(uriWithoutExtension);
@@ -172,6 +226,9 @@ public class SashModel extends EMFLogicalModel implements IModel {
}
super.setModelURI(newURI.trimFileExtension());
+
+ bean.firePropertyChange(PROPERTY_PRIVATE_RESOURCE_URI, oldPrivateURI, getPrivateResourceURI());
+ bean.firePropertyChange(PROPERTY_SHARED_RESOURCE_URI, oldSharedURI, getSharedResourceURI());
}
protected boolean isLegacy(URI uriWithoutExtension) {
@@ -236,7 +293,34 @@ public class SashModel extends EMFLogicalModel implements IModel {
}
public boolean isLegacyMode() {
- return isLegacy(getURI().trimFileExtension());
+ if (legacyMode == null) {
+ legacyMode = false; // Assume not
+
+ // Does the shared DI resource contain the sash layout?
+ URI sharedURI = getSharedResourceURI();
+ if (sharedURI != null) {
+ for (Resource next : getResources()) {
+ if (sharedURI.equals(next.getURI())) {
+ legacyMode = DiUtils.lookupSashWindowsMngr(next) != null;
+ break;
+ }
+ }
+ }
+ }
+
+ return legacyMode;
+ }
+
+ void invalidateLegacyMode() {
+ boolean oldValue = isLegacyMode();
+
+ legacyMode = null;
+
+ boolean newValue = isLegacyMode();
+
+ if (oldValue != newValue) {
+ bean.firePropertyChange(PROPERTY_LEGACY_MODE, oldValue, newValue);
+ }
}
/**
@@ -246,7 +330,8 @@ public class SashModel extends EMFLogicalModel implements IModel {
* @return the private sash-model resource URI
*/
public URI getPrivateResourceURI() {
- return getSashModelStoreURI(getModelManager().getURIWithoutExtension());
+ URI modelURI = (getModelManager() == null) ? null : getModelManager().getURIWithoutExtension();
+ return (modelURI == null) ? null : getSashModelStoreURI(modelURI);
}
/**
@@ -257,6 +342,27 @@ public class SashModel extends EMFLogicalModel implements IModel {
* @return the shared sash-model resource URI
*/
public URI getSharedResourceURI() {
- return getModelManager().getURIWithoutExtension().appendFileExtension(DiModel.MODEL_FILE_EXTENSION);
+ URI modelURI = (getModelManager() == null) ? null : getModelManager().getURIWithoutExtension();
+ return (modelURI == null) ? null : modelURI.appendFileExtension(DiModel.MODEL_FILE_EXTENSION);
+ }
+
+ //
+ // Bean API
+ //
+
+ public void addPropertyChangeListener(PropertyChangeListener listener) {
+ bean.addPropertyChangeListener(listener);
+ }
+
+ public void removePropertyChangeListener(PropertyChangeListener listener) {
+ bean.removePropertyChangeListener(listener);
+ }
+
+ public void addPropertyChangeListener(String propertyName, PropertyChangeListener listener) {
+ bean.addPropertyChangeListener(propertyName, listener);
+ }
+
+ public void removePropertyChangeListener(String propertyName, PropertyChangeListener listener) {
+ bean.removePropertyChangeListener(propertyName, listener);
}
}
diff --git a/plugins/infra/core/org.eclipse.papyrus.infra.core/src/org/eclipse/papyrus/infra/core/services/EditorLifecycleEventListener.java b/plugins/infra/core/org.eclipse.papyrus.infra.core/src/org/eclipse/papyrus/infra/core/services/EditorLifecycleEventListener.java
index 97145447636..4615f48e9d9 100644
--- a/plugins/infra/core/org.eclipse.papyrus.infra.core/src/org/eclipse/papyrus/infra/core/services/EditorLifecycleEventListener.java
+++ b/plugins/infra/core/org.eclipse.papyrus.infra.core/src/org/eclipse/papyrus/infra/core/services/EditorLifecycleEventListener.java
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (c) 2013 CEA LIST.
+ * Copyright (c) 2013, 2015 CEA LIST, Christian W. Damus, and others.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
@@ -8,6 +8,7 @@
*
* Contributors:
* Camille Letavernier (CEA LIST) camille.letavernier@cea.fr - Initial API and implementation
+ * Christian W. Damus - bug 469188
*****************************************************************************/
package org.eclipse.papyrus.infra.core.services;
@@ -29,6 +30,15 @@ public interface EditorLifecycleEventListener {
public void postInit(IMultiDiagramEditor editor);
/**
+ * All the editors are constructed, but not yet displayed
+ *
+ * @param editor
+ */
+ public default void preDisplay(IMultiDiagramEditor editor) {
+ // Pass
+ }
+
+ /**
* All the editors are displayed
*
* @param editor
diff --git a/plugins/infra/core/org.eclipse.papyrus.infra.core/src/org/eclipse/papyrus/infra/core/services/internal/EditorLifecycleManagerImpl.java b/plugins/infra/core/org.eclipse.papyrus.infra.core/src/org/eclipse/papyrus/infra/core/services/internal/EditorLifecycleManagerImpl.java
index 7c588c4f626..3c37096f881 100644
--- a/plugins/infra/core/org.eclipse.papyrus.infra.core/src/org/eclipse/papyrus/infra/core/services/internal/EditorLifecycleManagerImpl.java
+++ b/plugins/infra/core/org.eclipse.papyrus.infra.core/src/org/eclipse/papyrus/infra/core/services/internal/EditorLifecycleManagerImpl.java
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (c) 2013 CEA LIST.
+ * Copyright (c) 2013, 2015 CEA LIST, Christian W. Damus, and others.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
@@ -8,6 +8,7 @@
*
* Contributors:
* Camille Letavernier (CEA LIST) camille.letavernier@cea.fr - Initial API and implementation
+ * Christian W. Damus - bug 469188
*****************************************************************************/
package org.eclipse.papyrus.infra.core.services.internal;
@@ -71,6 +72,24 @@ public class EditorLifecycleManagerImpl implements EditorLifecycleManager, Inter
}
@Override
+ public void firePreDisplay(final IMultiDiagramEditor editor) {
+ for (final EditorLifecycleEventListener listener : listeners) {
+ SafeRunner.run(new ISafeRunnable() {
+
+ @Override
+ public void run() throws Exception {
+ listener.preDisplay(editor);
+ }
+
+ @Override
+ public void handleException(Throwable exception) {
+ // Already logged by the SafeRunner
+ }
+ });
+ }
+ }
+
+ @Override
public void firePostDisplay(final IMultiDiagramEditor editor) {
for (final EditorLifecycleEventListener listener : listeners) {
SafeRunner.run(new ISafeRunnable() {
diff --git a/plugins/infra/core/org.eclipse.papyrus.infra.core/src/org/eclipse/papyrus/infra/core/services/internal/InternalEditorLifecycleManager.java b/plugins/infra/core/org.eclipse.papyrus.infra.core/src/org/eclipse/papyrus/infra/core/services/internal/InternalEditorLifecycleManager.java
index 70fd10a6fe4..eab2e1272ea 100644
--- a/plugins/infra/core/org.eclipse.papyrus.infra.core/src/org/eclipse/papyrus/infra/core/services/internal/InternalEditorLifecycleManager.java
+++ b/plugins/infra/core/org.eclipse.papyrus.infra.core/src/org/eclipse/papyrus/infra/core/services/internal/InternalEditorLifecycleManager.java
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (c) 2013 CEA LIST.
+ * Copyright (c) 2013, 2015 CEA LIST, Christian W. Damus, and others.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
@@ -8,6 +8,7 @@
*
* Contributors:
* Camille Letavernier (CEA LIST) camille.letavernier@cea.fr - Initial API and implementation
+ * Christian W. Damus - bug 469188
*****************************************************************************/
package org.eclipse.papyrus.infra.core.services.internal;
@@ -25,6 +26,13 @@ public interface InternalEditorLifecycleManager extends IService {
void firePostInit(IMultiDiagramEditor editor);
/**
+ * Sets the preDisplay notification for this editor
+ *
+ * @param editor
+ */
+ void firePreDisplay(IMultiDiagramEditor editor);
+
+ /**
* Sends the postDisplay notification for this editor
*
* @param editor
diff --git a/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome.nattable/.classpath b/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome.nattable/.classpath
new file mode 100644
index 00000000000..eca7bdba8f0
--- /dev/null
+++ b/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome.nattable/.classpath
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>
+ <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+ <classpathentry kind="src" path="src"/>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome.nattable/.project b/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome.nattable/.project
new file mode 100644
index 00000000000..7759ae463d1
--- /dev/null
+++ b/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome.nattable/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.papyrus.infra.editor.welcome.nattable</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.ManifestBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.SchemaBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.pde.PluginNature</nature>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ </natures>
+</projectDescription>
diff --git a/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome.nattable/.settings/org.eclipse.jdt.core.prefs b/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome.nattable/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 00000000000..8ddd9a88d57
--- /dev/null
+++ b/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome.nattable/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,296 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=1.8
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.8
+org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation=0
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_assignment=0
+org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
+org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80
+org.eclipse.jdt.core.formatter.alignment_for_enum_constants=0
+org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16
+org.eclipse.jdt.core.formatter.alignment_for_method_declaration=0
+org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_resources_in_try=80
+org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=16
+org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_union_type_in_multicatch=16
+org.eclipse.jdt.core.formatter.blank_lines_after_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_after_package=1
+org.eclipse.jdt.core.formatter.blank_lines_before_field=0
+org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0
+org.eclipse.jdt.core.formatter.blank_lines_before_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1
+org.eclipse.jdt.core.formatter.blank_lines_before_method=1
+org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1
+org.eclipse.jdt.core.formatter.blank_lines_before_package=0
+org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1
+org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1
+org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_lambda_body=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_switch=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=false
+org.eclipse.jdt.core.formatter.comment.format_block_comments=true
+org.eclipse.jdt.core.formatter.comment.format_header=false
+org.eclipse.jdt.core.formatter.comment.format_html=true
+org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true
+org.eclipse.jdt.core.formatter.comment.format_line_comments=true
+org.eclipse.jdt.core.formatter.comment.format_source_code=true
+org.eclipse.jdt.core.formatter.comment.indent_parameter_description=true
+org.eclipse.jdt.core.formatter.comment.indent_root_tags=true
+org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert
+org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=insert
+org.eclipse.jdt.core.formatter.comment.line_length=260
+org.eclipse.jdt.core.formatter.comment.new_lines_at_block_boundaries=true
+org.eclipse.jdt.core.formatter.comment.new_lines_at_javadoc_boundaries=true
+org.eclipse.jdt.core.formatter.comment.preserve_white_space_between_code_and_line_comments=false
+org.eclipse.jdt.core.formatter.compact_else_if=true
+org.eclipse.jdt.core.formatter.continuation_indentation=2
+org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2
+org.eclipse.jdt.core.formatter.disabling_tag=@formatter\:off
+org.eclipse.jdt.core.formatter.enabling_tag=@formatter\:on
+org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false
+org.eclipse.jdt.core.formatter.format_line_comment_starting_on_first_column=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true
+org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_empty_lines=false
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false
+org.eclipse.jdt.core.formatter.indentation.size=4
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_label=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_type_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert
+org.eclipse.jdt.core.formatter.insert_space_after_lambda_arrow=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_try=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_try_resources=insert
+org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_try=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_lambda_arrow=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_try=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert
+org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_try_resources=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.join_lines_in_comments=false
+org.eclipse.jdt.core.formatter.join_wrapped_lines=false
+org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.lineSplit=260
+org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=false
+org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=false
+org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0
+org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=5
+org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true
+org.eclipse.jdt.core.formatter.tabulation.char=tab
+org.eclipse.jdt.core.formatter.tabulation.size=4
+org.eclipse.jdt.core.formatter.use_on_off_tags=false
+org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
+org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_or_operator_multicatch=true
+org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested=true
diff --git a/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome.nattable/.settings/org.eclipse.jdt.ui.prefs b/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome.nattable/.settings/org.eclipse.jdt.ui.prefs
new file mode 100644
index 00000000000..954281dbc31
--- /dev/null
+++ b/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome.nattable/.settings/org.eclipse.jdt.ui.prefs
@@ -0,0 +1,68 @@
+cleanup.add_default_serial_version_id=true
+cleanup.add_generated_serial_version_id=false
+cleanup.add_missing_annotations=true
+cleanup.add_missing_deprecated_annotations=true
+cleanup.add_missing_methods=false
+cleanup.add_missing_nls_tags=false
+cleanup.add_missing_override_annotations=true
+cleanup.add_missing_override_annotations_interface_methods=true
+cleanup.add_serial_version_id=false
+cleanup.always_use_blocks=true
+cleanup.always_use_parentheses_in_expressions=false
+cleanup.always_use_this_for_non_static_field_access=false
+cleanup.always_use_this_for_non_static_method_access=false
+cleanup.convert_functional_interfaces=false
+cleanup.convert_to_enhanced_for_loop=false
+cleanup.correct_indentation=false
+cleanup.format_source_code=false
+cleanup.format_source_code_changes_only=false
+cleanup.insert_inferred_type_arguments=false
+cleanup.make_local_variable_final=true
+cleanup.make_parameters_final=false
+cleanup.make_private_fields_final=true
+cleanup.make_type_abstract_if_missing_method=false
+cleanup.make_variable_declarations_final=false
+cleanup.never_use_blocks=false
+cleanup.never_use_parentheses_in_expressions=true
+cleanup.organize_imports=false
+cleanup.qualify_static_field_accesses_with_declaring_class=false
+cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
+cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
+cleanup.qualify_static_member_accesses_with_declaring_class=true
+cleanup.qualify_static_method_accesses_with_declaring_class=false
+cleanup.remove_private_constructors=true
+cleanup.remove_redundant_type_arguments=true
+cleanup.remove_trailing_whitespaces=true
+cleanup.remove_trailing_whitespaces_all=true
+cleanup.remove_trailing_whitespaces_ignore_empty=false
+cleanup.remove_unnecessary_casts=true
+cleanup.remove_unnecessary_nls_tags=true
+cleanup.remove_unused_imports=true
+cleanup.remove_unused_local_variables=false
+cleanup.remove_unused_private_fields=true
+cleanup.remove_unused_private_members=false
+cleanup.remove_unused_private_methods=true
+cleanup.remove_unused_private_types=true
+cleanup.sort_members=false
+cleanup.sort_members_all=false
+cleanup.use_anonymous_class_creation=false
+cleanup.use_blocks=true
+cleanup.use_blocks_only_for_return_and_throw=false
+cleanup.use_lambda=true
+cleanup.use_parentheses_in_expressions=false
+cleanup.use_this_for_non_static_field_access=false
+cleanup.use_this_for_non_static_field_access_only_if_necessary=true
+cleanup.use_this_for_non_static_method_access=false
+cleanup.use_this_for_non_static_method_access_only_if_necessary=true
+cleanup.use_type_arguments=false
+cleanup_profile=_Papyrus
+cleanup_settings_version=2
+eclipse.preferences.version=1
+formatter_profile=_Papyrus
+formatter_settings_version=12
+org.eclipse.jdt.ui.ignorelowercasenames=true
+org.eclipse.jdt.ui.importorder=java;javax;org;com;
+org.eclipse.jdt.ui.javadoc=true
+org.eclipse.jdt.ui.ondemandthreshold=99
+org.eclipse.jdt.ui.staticondemandthreshold=99
+org.eclipse.jdt.ui.text.custom_code_templates=<?xml version\="1.0" encoding\="UTF-8" standalone\="no"?><templates><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\n * @return the ${bare_field_name}\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\n * @param ${param} the ${bare_field_name} to set\n */</template><template autoinsert\="false" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\n * Constructor.\n *\n * ${tags}\n */</template><template autoinsert\="false" context\="filecomment_context" deleted\="false" description\="Comment for created Java files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.filecomment" name\="filecomment">/*****************************************************************************\n * Copyright (c) ${year} CEA LIST and others.\n * \n * All rights reserved. This program and the accompanying materials\n * are made available under the terms of the Eclipse Public License v1.0\n * which accompanies this distribution, and is available at\n * http\://www.eclipse.org/legal/epl-v10.html\n *\n * Contributors\:\n * CEA LIST - Initial API and implementation\n * \n *****************************************************************************/\n</template><template autoinsert\="true" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\n * @author ${user}\n *\n * ${tags}\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for fields" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\n * \n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\n * ${tags}\n */</template><template autoinsert\="false" context\="overridecomment_context" deleted\="false" description\="Comment for overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.overridecomment" name\="overridecomment">/**\n * ${see_to_overridden}\n *\n * ${tags}\n */</template><template autoinsert\="false" context\="delegatecomment_context" deleted\="false" description\="Comment for delegate methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.delegatecomment" name\="delegatecomment">/**\n * ${see_to_target}\n *\n * ${tags}\n */</template><template autoinsert\="true" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.newtype" name\="newtype">${filecomment}\n${package_declaration}\n\n${typecomment}\n${type_declaration}</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.classbody" name\="classbody">\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.enumbody" name\="enumbody">\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\n</template><template autoinsert\="true" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\n${exception_var}.printStackTrace();</template><template autoinsert\="true" context\="methodbody_context" deleted\="false" description\="Code in created method stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodbody" name\="methodbody">// ${todo} Auto-generated method stub\n${body_statement}</template><template autoinsert\="true" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\n// ${todo} Auto-generated constructor stub</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template></templates>
diff --git a/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome.nattable/META-INF/MANIFEST.MF b/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome.nattable/META-INF/MANIFEST.MF
new file mode 100644
index 00000000000..6b18e9e45a1
--- /dev/null
+++ b/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome.nattable/META-INF/MANIFEST.MF
@@ -0,0 +1,32 @@
+Manifest-Version: 1.0
+Export-Package: org.eclipse.papyrus.infra.editor.welcome.nattable,
+ org.eclipse.papyrus.infra.editor.welcome.nattable.hyperlink,
+ org.eclipse.papyrus.infra.editor.welcome.nattable.internal;x-internal:=true,
+ org.eclipse.papyrus.infra.editor.welcome.nattable.internal.widgets;x-internal:=true,
+ org.eclipse.papyrus.infra.editor.welcome.nattable.painter,
+ org.eclipse.papyrus.infra.editor.welcome.nattable.sorting,
+ org.eclipse.papyrus.infra.editor.welcome.nattable.widgets
+Require-Bundle: org.eclipse.core.runtime;bundle-version="3.12.0",
+ org.eclipse.emf.ecore;visibility:=reexport,
+ org.eclipse.papyrus.infra.core;bundle-version="1.2.0",
+ org.eclipse.papyrus.infra.core.log;bundle-version="1.2.0",
+ org.eclipse.ui;bundle-version="3.100.0",
+ org.eclipse.core.databinding;bundle-version="1.6.0",
+ org.eclipse.nebula.widgets.nattable.core;bundle-version="1.3.0",
+ org.eclipse.nebula.widgets.nattable.extension.glazedlists;bundle-version="1.3.0",
+ ca.odell.glazedlists;bundle-version="1.9.0",
+ org.eclipse.papyrus.infra.services.labelprovider;bundle-version="1.2.0",
+ org.eclipse.papyrus.infra.services.navigation;bundle-version="1.2.0",
+ org.eclipse.papyrus.infra.emf;bundle-version="1.2.0",
+ org.eclipse.papyrus.views.properties;bundle-version="1.2.0",
+ org.eclipse.papyrus.infra.editor.welcome;bundle-version="1.2.0"
+Bundle-Vendor: %providerName
+Bundle-ActivationPolicy: lazy
+Bundle-Version: 1.2.0.qualifier
+Bundle-ClassPath: .
+Bundle-Localization: plugin
+Bundle-Name: %pluginName
+Bundle-Activator: org.eclipse.papyrus.infra.editor.welcome.nattable.internal.Activator
+Bundle-ManifestVersion: 2
+Bundle-SymbolicName: org.eclipse.papyrus.infra.editor.welcome.nattable;singleton:=true
+Bundle-RequiredExecutionEnvironment: JavaSE-1.8
diff --git a/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome.nattable/about.html b/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome.nattable/about.html
new file mode 100644
index 00000000000..dd3c089a94c
--- /dev/null
+++ b/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome.nattable/about.html
@@ -0,0 +1,28 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
+<title>About</title>
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+
+<p>November 14, 2008</p>
+<h3>License</h3>
+
+<p>The Eclipse Foundation makes available all content in this plug-in (&quot;Content&quot;). Unless otherwise
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 1.0 (&quot;EPL&quot;). A copy of the EPL is available
+at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
+
+<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is
+being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
+apply to your use of any object code in the Content. Check the Redistributor's license that was
+provided with the Content. If no such license exists, contact the Redistributor. Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <a href="http://www.eclipse.org">http://www.eclipse.org</a>.</p>
+
+</body>
+</html> \ No newline at end of file
diff --git a/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome.nattable/build.properties b/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome.nattable/build.properties
new file mode 100644
index 00000000000..631423469dc
--- /dev/null
+++ b/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome.nattable/build.properties
@@ -0,0 +1,22 @@
+#
+# Copyright (c) 2015 Christian W. Damus and others.
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License v1.0
+# which accompanies this distribution, and is available at
+# http://www.eclipse.org/legal/epl-v10.html
+#
+# Contributors:
+# Christian W. Damus - Initial API and implementation
+#
+
+bin.includes = META-INF/,\
+ .,\
+ about.html,\
+ plugin.properties,\
+ model/,\
+ plugin.xml
+output.. = bin/
+src.includes = about.html
+source.. = src/
+bin.. = bin/
diff --git a/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome.nattable/model/environment.xmi b/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome.nattable/model/environment.xmi
new file mode 100644
index 00000000000..a936faf13bf
--- /dev/null
+++ b/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome.nattable/model/environment.xmi
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="ASCII"?>
+<environment:Environment
+ xmi:version="2.0"
+ xmlns:xmi="http://www.omg.org/XMI"
+ xmlns:environment="http://www.eclipse.org/papyrus/properties/environment/0.9">
+ <namespaces
+ name="ppew"
+ value="org.eclipse.papyrus.infra.editor.welcome.nattable.internal.widgets"/>
+</environment:Environment>
diff --git a/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome.nattable/model/general/languages.ctx b/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome.nattable/model/general/languages.ctx
new file mode 100644
index 00000000000..cbfd9f71eb7
--- /dev/null
+++ b/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome.nattable/model/general/languages.ctx
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="ASCII"?>
+<contexts:Context xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:constraints="http://www.eclipse.org/papyrus/constraints/0.9" xmlns:contexts="http://www.eclipse.org/papyrus/properties/contexts/0.9" xmi:id="_MPALcI7eEeWNa5T2Agi7uA" name="welcome-languages" label="Modeling Languages">
+ <tabs xmi:id="_SsfbQcElEeS_u7hIvAIReA" label="General" id="general" category="org.eclipse.papyrus" priority="70">
+ <sections xmi:id="_SsgCV8ElEeS_u7hIvAIReA" name="Single Languages" sectionFile="ui/SingleLanguages.xwt">
+ <widget href="ui/SingleLanguages.xwt#/"/>
+ </sections>
+ </tabs>
+ <views xmi:id="_Ssiem8ElEeS_u7hIvAIReA" name="Single Languages" sections="_SsgCV8ElEeS_u7hIvAIReA" automaticContext="true" datacontexts="_SsmJGsElEeS_u7hIvAIReA">
+ <constraints xsi:type="constraints:SimpleConstraint" xmi:id="_SskT2cElEeS_u7hIvAIReA" name="isWelcomeElement">
+ <constraintType href="ppe:/environment/org.eclipse.papyrus.infra.editor.welcome/model/environment.xmi#//@constraintTypes.0"/>
+ <properties xsi:type="constraints:ValueProperty" xmi:id="_SskT2sElEeS_u7hIvAIReA" name="metaclassName" value="Welcome"/>
+ </constraints>
+ </views>
+ <dataContexts xmi:id="_SsmI-cElEeS_u7hIvAIReA" name="welcomeLanguages" label="Welcome">
+ <elements xmi:id="_SsmJGsElEeS_u7hIvAIReA" name="Languages">
+ <properties xmi:id="_SsmJG8ElEeS_u7hIvAIReA" name="languages" label="Languages" type="Reference" multiplicity="-1" description="Modeling languages instantiated in the model"/>
+ </elements>
+ <modelElementFactory href="ppe:/environment/org.eclipse.papyrus.infra.editor.welcome/model/environment.xmi#//@modelElementFactories.0"/>
+ </dataContexts>
+</contexts:Context>
diff --git a/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome.nattable/model/general/ui/SingleLanguages.xwt b/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome.nattable/model/general/ui/SingleLanguages.xwt
new file mode 100644
index 00000000000..bc24cfadfc6
--- /dev/null
+++ b/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome.nattable/model/general/ui/SingleLanguages.xwt
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Composite
+ xmlns:ppel="clr-namespace:org.eclipse.papyrus.views.properties.widgets.layout"
+ xmlns:ppe="clr-namespace:org.eclipse.papyrus.views.properties.widgets"
+ xmlns:x="http://www.eclipse.org/xwt"
+ xmlns:ppew="clr-namespace:org.eclipse.papyrus.infra.editor.welcome.nattable.internal.widgets"
+ xmlns="http://www.eclipse.org/xwt/presentation" xmlns:j="clr-namespace:java.lang">
+ <Composite.layout>
+ <ppel:PropertiesLayout></ppel:PropertiesLayout>
+ </Composite.layout>
+ <ppew:LanguagesTable input="{Binding}" property="welcomeLanguages:Languages:languages"></ppew:LanguagesTable>
+</Composite> \ No newline at end of file
diff --git a/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome.nattable/plugin.properties b/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome.nattable/plugin.properties
new file mode 100644
index 00000000000..befe5b938ce
--- /dev/null
+++ b/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome.nattable/plugin.properties
@@ -0,0 +1,13 @@
+#
+# Copyright (c) 2015 Christian W. Damus and others.
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License v1.0
+# which accompanies this distribution, and is available at
+# http://www.eclipse.org/legal/epl-v10.html
+#
+# Contributors:
+# Christian W. Damus - Initial API and implementation
+#
+pluginName=Papyrus NatTable for Editor Welcome Page
+providerName=Eclipse Modeling Project
diff --git a/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome.nattable/plugin.xml b/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome.nattable/plugin.xml
new file mode 100644
index 00000000000..360b78fc654
--- /dev/null
+++ b/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome.nattable/plugin.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.2"?>
+<!--
+ Copyright (c) 2015 Christian W. Damus and others.
+
+ All rights reserved. This program and the accompanying materials
+ are made available under the terms of the Eclipse Public License v1.0
+ which accompanies this distribution, and is available at
+ http://www.eclipse.org/legal/epl-v10.html
+
+ Contributors:
+ Christian W. Damus - Initial API and implementation
+-->
+<plugin>
+ <extension
+ point="org.eclipse.papyrus.views.properties.context">
+ <context
+ contextModel="model/general/languages.ctx">
+ </context>
+ <preferencePageBinding
+ context="welcome-languages"
+ page="org.eclipse.papyrus.infra.editor.welcome.content">
+ </preferencePageBinding>
+ </extension>
+ <extension
+ point="org.eclipse.papyrus.views.properties.environment">
+ <environment
+ environmentModel="model/environment.xmi">
+ </environment>
+ </extension>
+</plugin>
diff --git a/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome.nattable/pom.xml b/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome.nattable/pom.xml
new file mode 100644
index 00000000000..e4cc773674d
--- /dev/null
+++ b/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome.nattable/pom.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project>
+ <modelVersion>4.0.0</modelVersion>
+ <parent>
+ <artifactId>org.eclipse.papyrus.releng</artifactId>
+ <groupId>org.eclipse.papyrus</groupId>
+ <version>1.2.0-SNAPSHOT</version>
+ <relativePath>../../../../releng/main</relativePath>
+ </parent>
+ <artifactId>org.eclipse.papyrus.infra.editor.welcome.nattable</artifactId>
+ <groupId>org.eclipse.papyrus</groupId>
+ <version>1.2.0-SNAPSHOT</version>
+ <packaging>eclipse-plugin</packaging>
+</project> \ No newline at end of file
diff --git a/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome.nattable/src/org/eclipse/papyrus/infra/editor/welcome/nattable/ServiceConfigAttributes.java b/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome.nattable/src/org/eclipse/papyrus/infra/editor/welcome/nattable/ServiceConfigAttributes.java
new file mode 100644
index 00000000000..f9255e4d342
--- /dev/null
+++ b/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome.nattable/src/org/eclipse/papyrus/infra/editor/welcome/nattable/ServiceConfigAttributes.java
@@ -0,0 +1,132 @@
+/*****************************************************************************
+ * Copyright (c) 2015 Christian W. Damus and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Christian W. Damus - Initial API and implementation
+ *
+ *****************************************************************************/
+
+package org.eclipse.papyrus.infra.editor.welcome.nattable;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.function.Function;
+
+import org.eclipse.nebula.widgets.nattable.config.IConfigRegistry;
+import org.eclipse.nebula.widgets.nattable.layer.LabelStack;
+import org.eclipse.nebula.widgets.nattable.layer.cell.ILayerCell;
+import org.eclipse.nebula.widgets.nattable.style.ConfigAttribute;
+
+/**
+ * A factory for unique NatTable configuration attributes for Papyrus services.
+ */
+public class ServiceConfigAttributes {
+ private static Map<Class<?>, ConfigAttribute<?>> configAttributes = new HashMap<>();
+
+ private ServiceConfigAttributes() {
+ super();
+ }
+
+ /**
+ * Obtains the (unique) configuration attribute for the given service type.
+ *
+ * @param serviceType
+ * a service type
+ *
+ * @return the corresponding configuration attribute
+ */
+ @SuppressWarnings("unchecked")
+ public static <T> ConfigAttribute<T> get(Class<T> serviceType) {
+ return (ConfigAttribute<T>) configAttributes.computeIfAbsent(serviceType, key -> new ConfigAttribute<T>());
+ }
+
+ /**
+ * Obtains a builder-like configurator object that uses the given service accessor to obtain
+ * services to register.
+ *
+ * @param registry
+ * the NatTable configuration registry
+ * @param serviceAccessor
+ * a service accessor function
+ *
+ * @return the configurator
+ */
+ public static Configurator with(IConfigRegistry registry, Function<? super Class<?>, ?> serviceAccessor) {
+ return new Configurator(registry, serviceAccessor);
+ }
+
+ public static <T> void registerService(Class<T> serviceType, IConfigRegistry configRegistry, T service) {
+ configRegistry.registerConfigAttribute(get(serviceType), service);
+ }
+
+ public static <T> void registerService(Class<T> serviceType, IConfigRegistry configRegistry, T service, String targetDisplayMode) {
+ configRegistry.registerConfigAttribute(get(serviceType), service, targetDisplayMode);
+ }
+
+ public static <T> void registerService(Class<T> serviceType, IConfigRegistry configRegistry, T service, String targetDisplayMode, String label) {
+ configRegistry.registerConfigAttribute(get(serviceType), service, targetDisplayMode, label);
+ }
+
+ public static <T> T getService(Class<T> serviceType, IConfigRegistry config, String targetDisplayMode, String... labels) {
+ return config.getConfigAttribute(get(serviceType), targetDisplayMode, labels);
+ }
+
+ public static <T> T getService(Class<T> serviceType, IConfigRegistry config, String targetDisplayMode, List<String> labels) {
+ return config.getConfigAttribute(get(serviceType), targetDisplayMode, labels);
+ }
+
+ public static <T> T getService(Class<T> serviceType, IConfigRegistry config, String targetDisplayMode, LabelStack labels) {
+ return getService(serviceType, config, targetDisplayMode, labels.getLabels());
+ }
+
+ public static <T> T getService(Class<T> serviceType, IConfigRegistry config, ILayerCell cell) {
+ return getService(serviceType, config, cell.getDisplayMode(), cell.getConfigLabels().getLabels());
+ }
+
+ //
+ // Nested types
+ //
+
+ /**
+ * A builder-like configurator object that automatically registers services in a particular
+ * NatTable configuration registry.
+ */
+ public static class Configurator {
+ private final IConfigRegistry configRegistry;
+ private final Function<? super Class<?>, ?> serviceAccessor;
+
+ Configurator(IConfigRegistry configRegistry, Function<? super Class<?>, ?> serviceAccessor) {
+ super();
+
+ this.configRegistry = configRegistry;
+ this.serviceAccessor = serviceAccessor;
+ }
+
+ <T> T getService(Class<T> serviceType) {
+ @SuppressWarnings("unchecked")
+ Function<? super Class<T>, T> accessor = (Function<? super Class<T>, T>) serviceAccessor;
+ return accessor.apply(serviceType);
+ }
+
+ public <T> Configurator register(Class<T> serviceType) {
+ registerService(serviceType, configRegistry, getService(serviceType));
+ return this;
+ }
+
+ public <T> Configurator register(Class<T> serviceType, String targetDisplayMode) {
+ registerService(serviceType, configRegistry, getService(serviceType), targetDisplayMode);
+ return this;
+ }
+
+ public <T> Configurator register(Class<T> serviceType, String targetDisplayMode, String label) {
+ registerService(serviceType, configRegistry, getService(serviceType), targetDisplayMode, label);
+ return this;
+ }
+ }
+}
diff --git a/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome.nattable/src/org/eclipse/papyrus/infra/editor/welcome/nattable/hyperlink/HyperlinkNavigationAction.java b/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome.nattable/src/org/eclipse/papyrus/infra/editor/welcome/nattable/hyperlink/HyperlinkNavigationAction.java
new file mode 100644
index 00000000000..b5236901c8d
--- /dev/null
+++ b/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome.nattable/src/org/eclipse/papyrus/infra/editor/welcome/nattable/hyperlink/HyperlinkNavigationAction.java
@@ -0,0 +1,62 @@
+/*****************************************************************************
+ * Copyright (c) 2015 Christian W. Damus and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Christian W. Damus - Initial API and implementation
+ *
+ *****************************************************************************/
+
+package org.eclipse.papyrus.infra.editor.welcome.nattable.hyperlink;
+
+import org.eclipse.core.databinding.observable.value.IObservableValue;
+import org.eclipse.jface.viewers.ISelectionProvider;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.nebula.widgets.nattable.NatTable;
+import org.eclipse.nebula.widgets.nattable.selection.action.AbstractMouseSelectionAction;
+import org.eclipse.nebula.widgets.nattable.style.DisplayMode;
+import org.eclipse.papyrus.infra.core.sasheditor.contentprovider.IPageManager;
+import org.eclipse.papyrus.infra.editor.welcome.nattable.ServiceConfigAttributes;
+import org.eclipse.papyrus.infra.services.navigation.service.NavigationService;
+import org.eclipse.swt.events.MouseEvent;
+
+/**
+ * A NatTable action for navigation of a hyperlink cell.
+ */
+public class HyperlinkNavigationAction extends AbstractMouseSelectionAction {
+
+ public HyperlinkNavigationAction() {
+ super();
+ }
+
+ <T> T getService(NatTable natTable, Class<T> serviceType) {
+ return ServiceConfigAttributes.getService(serviceType, natTable.getConfigRegistry(), DisplayMode.NORMAL);
+ }
+
+ @Override
+ public void run(NatTable natTable, MouseEvent event) {
+ super.run(natTable, event);
+
+ Object data = natTable.getDataValueByPosition(getGridColumnPosition(), getGridRowPosition());
+ if (data instanceof IObservableValue<?>) {
+ data = ((IObservableValue<?>) data).getValue();
+ }
+
+ IPageManager pages = getService(natTable, IPageManager.class);
+ if (pages.allPages().contains(data)) {
+ if (pages.isOpen(data)) {
+ pages.selectPage(data);
+ } else {
+ pages.openPage(data);
+ }
+ } else if (data != null) {
+ getService(natTable, NavigationService.class).navigate(data);
+ getService(natTable, ISelectionProvider.class).setSelection(new StructuredSelection(data));
+ }
+ }
+
+}
diff --git a/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome.nattable/src/org/eclipse/papyrus/infra/editor/welcome/nattable/hyperlink/HyperlinkNavigationConfiguration.java b/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome.nattable/src/org/eclipse/papyrus/infra/editor/welcome/nattable/hyperlink/HyperlinkNavigationConfiguration.java
new file mode 100644
index 00000000000..3c795edc3aa
--- /dev/null
+++ b/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome.nattable/src/org/eclipse/papyrus/infra/editor/welcome/nattable/hyperlink/HyperlinkNavigationConfiguration.java
@@ -0,0 +1,160 @@
+/*****************************************************************************
+ * Copyright (c) 2015 Christian W. Damus and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Christian W. Damus - Initial API and implementation
+ *
+ *****************************************************************************/
+
+package org.eclipse.papyrus.infra.editor.welcome.nattable.hyperlink;
+
+import java.util.function.Predicate;
+
+import org.eclipse.nebula.widgets.nattable.NatTable;
+import org.eclipse.nebula.widgets.nattable.config.AbstractUiBindingConfiguration;
+import org.eclipse.nebula.widgets.nattable.layer.LabelStack;
+import org.eclipse.nebula.widgets.nattable.layer.cell.ILayerCell;
+import org.eclipse.nebula.widgets.nattable.painter.cell.ICellPainter;
+import org.eclipse.nebula.widgets.nattable.ui.binding.UiBindingRegistry;
+import org.eclipse.nebula.widgets.nattable.ui.matcher.IMouseEventMatcher;
+import org.eclipse.nebula.widgets.nattable.ui.matcher.MouseEventMatcher;
+import org.eclipse.papyrus.infra.editor.welcome.nattable.painter.LabelPainter;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.MouseEvent;
+import org.eclipse.swt.graphics.Cursor;
+import org.eclipse.swt.graphics.GC;
+import org.eclipse.swt.graphics.Rectangle;
+import org.eclipse.swt.widgets.Control;
+
+/**
+ * A NatTable configuration that installs hyperlink navigation cursor feed-back and
+ * actions on the cells of a table that have hyperlinks.
+ */
+public class HyperlinkNavigationConfiguration<E> extends AbstractUiBindingConfiguration {
+ private final Class<? extends E> elementType;
+ private final Predicate<? super E> isActiveHyperlink;
+
+ private Cursor defaultCursor;
+ private Cursor handCursor;
+
+ private int currentColumn = -1;
+ private int currentRow = -1;
+ private Rectangle currentCellTextBounds;
+
+ /**
+ * Initializes me.
+ *
+ * @param owner
+ * the control that owns the {@link NatTable} that I will configure
+ * @param elementType
+ * the type of object that is a potential hyperlink
+ * @param isActiveHyperlink
+ * a predicate matching valid, navigable hyperlink elements
+ */
+ public HyperlinkNavigationConfiguration(Control owner, Class<? extends E> elementType, Predicate<? super E> isActiveHyperlink) {
+ super();
+
+ this.elementType = elementType;
+ this.isActiveHyperlink = isActiveHyperlink;
+
+ this.defaultCursor = owner.getCursor();
+ this.handCursor = new Cursor(owner.getDisplay(), SWT.CURSOR_HAND);
+
+ owner.addDisposeListener(event -> handCursor.dispose());
+ }
+
+ @Override
+ public void configureUiBindings(UiBindingRegistry uiBindingRegistry) {
+ uiBindingRegistry.registerSingleClickBinding(
+ MouseEventMatcher.bodyLeftClick(SWT.NONE),
+ new HyperlinkNavigationAction());
+
+ // On moving the mouse into the body area, show a navigation cursor
+ uiBindingRegistry.registerFirstMouseMoveBinding(
+ new IMouseEventMatcher() {
+ @Override
+ public boolean matches(NatTable natTable, MouseEvent event, LabelStack regionLabels) {
+ int col = natTable.getColumnPositionByX(event.x);
+ int row = natTable.getRowPositionByY(event.y);
+
+ return (col >= 0) && (row >= 0);
+ }
+
+ }, this::updateCursor);
+
+ // On moving the mouse out of the body area, restore the usual cursor
+ uiBindingRegistry.registerMouseMoveBinding(new IMouseEventMatcher() {
+ @Override
+ public boolean matches(NatTable natTable, MouseEvent event, LabelStack regionLabels) {
+ return (natTable != null && regionLabels == null);
+ }
+
+ }, this::reset);
+
+ // And same if it is moved out of the table altogether
+ uiBindingRegistry.registerMouseExitBinding(new IMouseEventMatcher() {
+ @Override
+ public boolean matches(NatTable natTable, MouseEvent event, LabelStack regionLabels) {
+ return true;
+ }
+
+ }, this::reset);
+ }
+
+ void updateCursor(NatTable table, MouseEvent event) {
+ int col = table.getColumnPositionByX(event.x);
+ int row = table.getRowPositionByY(event.y);
+ Object data = (col >= 0) && (row >= 0) ? table.getDataValueByPosition(col, row) : null;
+
+ if (!elementType.isInstance(data) || !isActiveHyperlink.test(elementType.cast(data))) {
+ // not a havigable hyperlink
+ table.setCursor(defaultCursor);
+ } else {
+ // are we over text?
+ if ((currentCellTextBounds == null) || (col != currentColumn) || (row != currentRow)) {
+ updateCellTextBounds(table, col, row);
+ }
+
+ if (currentCellTextBounds != null && currentCellTextBounds.contains(event.x, event.y)) {
+ table.setCursor(handCursor);
+ } else {
+ table.setCursor(defaultCursor);
+ }
+ }
+ }
+
+ void reset(NatTable table, MouseEvent event) {
+ currentColumn = -1;
+ currentRow = -1;
+ currentCellTextBounds = null;
+
+ table.setCursor(defaultCursor);
+ }
+
+ void updateCellTextBounds(NatTable table, int column, int row) {
+ currentColumn = column;
+ currentRow = row;
+ currentCellTextBounds = null;
+
+ ILayerCell cell = table.getCellByPosition(column, row);
+ if (cell != null) {
+ ICellPainter painter = table.getCellPainter(column, row, cell, table.getConfigRegistry());
+ if (painter instanceof LabelPainter) {
+ GC gc = new GC(table.getDisplay());
+ try {
+ currentCellTextBounds = ((LabelPainter) painter).getTextBounds(cell, gc, table.getConfigRegistry());
+ } finally {
+ gc.dispose();
+ }
+ } else {
+ // Assume the whole cell is text, then
+ currentCellTextBounds = cell.getBounds();
+ }
+ }
+ }
+}
diff --git a/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome.nattable/src/org/eclipse/papyrus/infra/editor/welcome/nattable/internal/Activator.java b/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome.nattable/src/org/eclipse/papyrus/infra/editor/welcome/nattable/internal/Activator.java
new file mode 100644
index 00000000000..be2ea27bebf
--- /dev/null
+++ b/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome.nattable/src/org/eclipse/papyrus/infra/editor/welcome/nattable/internal/Activator.java
@@ -0,0 +1,60 @@
+/*****************************************************************************
+ * Copyright (c) 2015 Christian W. Damus and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Christian W. Damus - Initial API and implementation
+ *
+ *****************************************************************************/
+package org.eclipse.papyrus.infra.editor.welcome.nattable.internal;
+
+import org.eclipse.papyrus.infra.core.log.LogHelper;
+import org.eclipse.ui.plugin.AbstractUIPlugin;
+import org.osgi.framework.BundleContext;
+
+/**
+ * The activator class controls the plug-in life cycle
+ */
+public class Activator extends AbstractUIPlugin {
+
+ // The plug-in ID
+ public static final String PLUGIN_ID = "org.eclipse.papyrus.infra.editor.welcome.nattable"; //$NON-NLS-1$
+
+ // The shared instance
+ private static Activator plugin;
+
+ public static LogHelper log;
+
+ /**
+ * The constructor
+ */
+ public Activator() {
+ }
+
+ @Override
+ public void start(BundleContext context) throws Exception {
+ super.start(context);
+ plugin = this;
+ log = new LogHelper(this);
+ }
+
+ @Override
+ public void stop(BundleContext context) throws Exception {
+ plugin = null;
+ super.stop(context);
+ }
+
+ /**
+ * Returns the shared instance
+ *
+ * @return the shared instance
+ */
+ public static Activator getDefault() {
+ return plugin;
+ }
+
+}
diff --git a/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome.nattable/src/org/eclipse/papyrus/infra/editor/welcome/nattable/internal/widgets/LanguagesTable.java b/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome.nattable/src/org/eclipse/papyrus/infra/editor/welcome/nattable/internal/widgets/LanguagesTable.java
new file mode 100644
index 00000000000..9b677ba672b
--- /dev/null
+++ b/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome.nattable/src/org/eclipse/papyrus/infra/editor/welcome/nattable/internal/widgets/LanguagesTable.java
@@ -0,0 +1,91 @@
+/*****************************************************************************
+ * Copyright (c) 2015 Christian W. Damus and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Christian W. Damus - Initial API and implementation
+ *
+ *****************************************************************************/
+
+package org.eclipse.papyrus.infra.editor.welcome.nattable.internal.widgets;
+
+import org.eclipse.nebula.widgets.nattable.data.IColumnPropertyAccessor;
+import org.eclipse.papyrus.infra.editor.welcome.internal.modelelements.LanguageObservable;
+import org.eclipse.papyrus.infra.editor.welcome.nattable.widgets.FormTable;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * A table widget presenting languages in two columns for name and version.
+ */
+public class LanguagesTable extends FormTable<LanguageObservable> {
+
+ public LanguagesTable(Composite parent, int style) {
+ // No hyperlinks
+ super(parent, style, "Languages:", new LanguagesColumnAccessor(), "Name", "Version");
+ }
+
+ //
+ // Nested types
+ //
+
+ static class LanguagesColumnAccessor implements IColumnPropertyAccessor<LanguageObservable> {
+ static final String NAME = "name"; //$NON-NLS-1$
+ static final String VERSION = "version"; //$NON-NLS-1$
+
+ @Override
+ public int getColumnCount() {
+ return 2;
+ }
+
+ @Override
+ public Object getDataValue(LanguageObservable rowObject, int columnIndex) {
+ Object result;
+
+ switch (columnIndex) {
+ case 0:
+ result = rowObject.getName();
+ break;
+ case 1:
+ result = rowObject.getVersion();
+ break;
+ default:
+ throw new IndexOutOfBoundsException(Integer.toString(columnIndex));
+ }
+
+ return result;
+ }
+
+ @Override
+ public void setDataValue(LanguageObservable rowObject, int columnIndex, Object newValue) {
+ throw new IllegalStateException("not editable"); //$NON-NLS-1$
+ }
+
+ @Override
+ public String getColumnProperty(int columnIndex) {
+ switch (columnIndex) {
+ case 0:
+ return NAME;
+ case 1:
+ return VERSION;
+ default:
+ throw new IndexOutOfBoundsException(Integer.toString(columnIndex));
+ }
+ }
+
+ @Override
+ public int getColumnIndex(String propertyName) {
+ switch (propertyName) {
+ case NAME:
+ return 0;
+ case VERSION:
+ return 1;
+ default:
+ throw new IllegalArgumentException(propertyName);
+ }
+ }
+ }
+}
diff --git a/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome.nattable/src/org/eclipse/papyrus/infra/editor/welcome/nattable/painter/LabelPainter.java b/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome.nattable/src/org/eclipse/papyrus/infra/editor/welcome/nattable/painter/LabelPainter.java
new file mode 100644
index 00000000000..cdc86d17ed0
--- /dev/null
+++ b/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome.nattable/src/org/eclipse/papyrus/infra/editor/welcome/nattable/painter/LabelPainter.java
@@ -0,0 +1,119 @@
+/*****************************************************************************
+ * Copyright (c) 2015 Christian W. Damus and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Christian W. Damus - Initial API and implementation
+ *
+ *****************************************************************************/
+
+package org.eclipse.papyrus.infra.editor.welcome.nattable.painter;
+
+import org.eclipse.nebula.widgets.nattable.config.IConfigRegistry;
+import org.eclipse.nebula.widgets.nattable.layer.cell.ILayerCell;
+import org.eclipse.nebula.widgets.nattable.painter.cell.ICellPainter;
+import org.eclipse.nebula.widgets.nattable.painter.cell.decorator.CellPainterDecorator;
+import org.eclipse.nebula.widgets.nattable.ui.util.CellEdgeEnum;
+import org.eclipse.swt.graphics.GC;
+import org.eclipse.swt.graphics.Rectangle;
+
+/**
+ * @author damus
+ *
+ */
+public class LabelPainter extends CellPainterDecorator {
+
+ public LabelPainter(CellEdgeEnum cellEdge) {
+ this(new LabelProviderTextPainter(), cellEdge, new LabelProviderImagePainter());
+ }
+
+ public LabelPainter(ICellPainter textPainter, CellEdgeEnum cellEdge) {
+ this(textPainter, cellEdge, new LabelProviderImagePainter());
+ }
+
+ public LabelPainter(CellEdgeEnum cellEdge, ICellPainter imagePainter) {
+ this(new LabelProviderTextPainter(), cellEdge, imagePainter);
+ }
+
+ public LabelPainter(ICellPainter textPainter, CellEdgeEnum cellEdge, ICellPainter imagePainter) {
+ super(textPainter, cellEdge, imagePainter);
+ }
+
+ public LabelPainter(ICellPainter textPainter, CellEdgeEnum cellEdge, ICellPainter imagePainter, boolean paintDecorationDependent) {
+ super(textPainter, cellEdge, imagePainter, paintDecorationDependent);
+ }
+
+ public LabelPainter(ICellPainter textPainter, CellEdgeEnum cellEdge, int spacing, ICellPainter imagePainter) {
+ super(textPainter, cellEdge, spacing, imagePainter);
+ }
+
+ public LabelPainter(ICellPainter textPainter, CellEdgeEnum cellEdge, int spacing, ICellPainter imagePainter, boolean paintDecorationDependent) {
+ super(textPainter, cellEdge, spacing, imagePainter, paintDecorationDependent);
+ }
+
+ public LabelPainter(ICellPainter textPainter, CellEdgeEnum cellEdge, int spacing, ICellPainter imagePainter, boolean paintDecorationDependent, boolean paintBg) {
+ super(textPainter, cellEdge, spacing, imagePainter, paintDecorationDependent, paintBg);
+ }
+
+ public Rectangle getTextBounds(ILayerCell cell, GC gc, IConfigRegistry configRegistry) {
+ Rectangle cellBounds = cell.getBounds();
+
+ int imageWidth = getDecoratorCellPainter().getPreferredWidth(cell, gc, configRegistry);
+ int imageHeight = getDecoratorCellPainter().getPreferredHeight(cell, gc, configRegistry);
+
+ // grab any extra space:
+ int preferredWidth = getBaseCellPainter().getPreferredWidth(cell, gc, configRegistry);
+ int preferredHeight = getBaseCellPainter().getPreferredHeight(cell, gc, configRegistry);
+
+ Rectangle result = null;
+
+ switch (getCellEdge()) {
+ case LEFT:
+ result = new Rectangle(cellBounds.x + imageWidth + getSpacing(),
+ cellBounds.y, preferredWidth, cellBounds.height);
+ break;
+ case RIGHT:
+ result = new Rectangle(cellBounds.x, cellBounds.y, preferredWidth, cellBounds.height);
+ break;
+ case TOP:
+ result = new Rectangle(cellBounds.x,
+ cellBounds.y + imageHeight + getSpacing(),
+ cellBounds.width, preferredHeight);
+ break;
+ case BOTTOM:
+ result = new Rectangle(cellBounds.x, cellBounds.y, cellBounds.width, preferredHeight);
+ break;
+ case TOP_LEFT:
+ result = new Rectangle(cellBounds.x + imageWidth + getSpacing(),
+ cellBounds.y + imageHeight + getSpacing(),
+ preferredWidth, preferredHeight);
+ break;
+ case TOP_RIGHT:
+ result = new Rectangle(cellBounds.x,
+ cellBounds.y + imageHeight + getSpacing(),
+ preferredWidth, preferredHeight);
+ break;
+ case BOTTOM_LEFT:
+ result = new Rectangle(cellBounds.x + imageWidth + getSpacing(),
+ cellBounds.y, preferredWidth, preferredHeight);
+ break;
+ case BOTTOM_RIGHT:
+ result = new Rectangle(cellBounds.x, cellBounds.y, preferredWidth, preferredHeight);
+ break;
+ case NONE:
+ break;
+ }
+
+ if (result != null) {
+ // Crop to the actual cell bounds
+ result = result.intersection(cellBounds);
+ }
+
+ return result;
+ }
+
+}
diff --git a/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome.nattable/src/org/eclipse/papyrus/infra/editor/welcome/nattable/painter/LabelProviderImagePainter.java b/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome.nattable/src/org/eclipse/papyrus/infra/editor/welcome/nattable/painter/LabelProviderImagePainter.java
new file mode 100644
index 00000000000..048820b9b29
--- /dev/null
+++ b/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome.nattable/src/org/eclipse/papyrus/infra/editor/welcome/nattable/painter/LabelProviderImagePainter.java
@@ -0,0 +1,52 @@
+/*****************************************************************************
+ * Copyright (c) 2015 Christian W. Damus and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Christian W. Damus - Initial API and implementation
+ *
+ *****************************************************************************/
+
+package org.eclipse.papyrus.infra.editor.welcome.nattable.painter;
+
+import org.eclipse.core.databinding.observable.value.IObservableValue;
+import org.eclipse.jface.viewers.ILabelProvider;
+import org.eclipse.nebula.widgets.nattable.config.IConfigRegistry;
+import org.eclipse.nebula.widgets.nattable.layer.cell.ILayerCell;
+import org.eclipse.nebula.widgets.nattable.painter.cell.ImagePainter;
+import org.eclipse.papyrus.infra.editor.welcome.nattable.ServiceConfigAttributes;
+import org.eclipse.papyrus.infra.services.labelprovider.service.LabelProviderService;
+import org.eclipse.swt.graphics.Image;
+
+/**
+ * An image painter that obtains images from the {@link LabelProviderService} registered
+ * in the NatTable configuration registry.
+ */
+public class LabelProviderImagePainter extends ImagePainter {
+
+ public LabelProviderImagePainter() {
+ super();
+ }
+
+ public LabelProviderImagePainter(boolean paintBg) {
+ super(null, paintBg);
+ }
+
+ @Override
+ protected Image getImage(ILayerCell cell, IConfigRegistry configRegistry) {
+ Object dataValue = cell.getDataValue();
+
+ if (dataValue instanceof IObservableValue<?>) {
+ dataValue = ((IObservableValue<?>) dataValue).getValue();
+ }
+
+ LabelProviderService labelService = ServiceConfigAttributes.getService(LabelProviderService.class, configRegistry, cell);
+ ILabelProvider labelProvider = (dataValue == null) ? labelService.getLabelProvider() : labelService.getLabelProvider(dataValue);
+
+ return labelProvider.getImage(dataValue);
+ }
+}
diff --git a/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome.nattable/src/org/eclipse/papyrus/infra/editor/welcome/nattable/painter/LabelProviderTextPainter.java b/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome.nattable/src/org/eclipse/papyrus/infra/editor/welcome/nattable/painter/LabelProviderTextPainter.java
new file mode 100644
index 00000000000..671337988b4
--- /dev/null
+++ b/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome.nattable/src/org/eclipse/papyrus/infra/editor/welcome/nattable/painter/LabelProviderTextPainter.java
@@ -0,0 +1,77 @@
+/*****************************************************************************
+ * Copyright (c) 2015 Christian W. Damus and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Christian W. Damus - Initial API and implementation
+ *
+ *****************************************************************************/
+
+package org.eclipse.papyrus.infra.editor.welcome.nattable.painter;
+
+import org.eclipse.core.databinding.observable.value.IObservableValue;
+import org.eclipse.jface.viewers.ILabelProvider;
+import org.eclipse.nebula.widgets.nattable.config.IConfigRegistry;
+import org.eclipse.nebula.widgets.nattable.layer.cell.ILayerCell;
+import org.eclipse.nebula.widgets.nattable.painter.cell.TextPainter;
+import org.eclipse.papyrus.infra.editor.welcome.nattable.ServiceConfigAttributes;
+import org.eclipse.papyrus.infra.services.labelprovider.service.LabelProviderService;
+
+/**
+ * A text painter that obtains text labels from the {@link LabelProviderService} registered
+ * in the NatTable configuration registry.
+ */
+public class LabelProviderTextPainter extends TextPainter {
+
+ public LabelProviderTextPainter() {
+ super();
+ }
+
+ public LabelProviderTextPainter(boolean wrapText, boolean paintBg, boolean calculateByTextLength, boolean calculateByTextHeight) {
+ super(wrapText, paintBg, calculateByTextLength, calculateByTextHeight);
+ }
+
+ public LabelProviderTextPainter(boolean wrapText, boolean paintBg, boolean calculate) {
+ super(wrapText, paintBg, calculate);
+ }
+
+ public LabelProviderTextPainter(boolean wrapText, boolean paintBg, int spacing, boolean calculateByTextLength, boolean calculateByTextHeight) {
+ super(wrapText, paintBg, spacing, calculateByTextLength, calculateByTextHeight);
+ }
+
+ public LabelProviderTextPainter(boolean wrapText, boolean paintBg, int spacing, boolean calculate) {
+ super(wrapText, paintBg, spacing, calculate);
+ }
+
+ public LabelProviderTextPainter(boolean wrapText, boolean paintBg, int spacing) {
+ super(wrapText, paintBg, spacing);
+ }
+
+ public LabelProviderTextPainter(boolean wrapText, boolean paintBg) {
+ super(wrapText, paintBg);
+ }
+
+ @Override
+ protected String convertDataType(ILayerCell cell, IConfigRegistry configRegistry) {
+ String result;
+ Object dataValue = cell.getDataValue();
+ if (dataValue instanceof String) {
+ result = (String) dataValue;
+ } else {
+ if (dataValue instanceof IObservableValue<?>) {
+ dataValue = ((IObservableValue<?>) dataValue).getValue();
+ }
+
+ LabelProviderService labelService = ServiceConfigAttributes.getService(LabelProviderService.class, configRegistry, cell);
+ ILabelProvider labelProvider = (dataValue == null) ? labelService.getLabelProvider() : labelService.getLabelProvider(dataValue);
+
+ result = labelProvider.getText(dataValue);
+ }
+
+ return result;
+ }
+}
diff --git a/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome.nattable/src/org/eclipse/papyrus/infra/editor/welcome/nattable/sorting/ColumnHeaderHelper.java b/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome.nattable/src/org/eclipse/papyrus/infra/editor/welcome/nattable/sorting/ColumnHeaderHelper.java
new file mode 100644
index 00000000000..6f6072be724
--- /dev/null
+++ b/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome.nattable/src/org/eclipse/papyrus/infra/editor/welcome/nattable/sorting/ColumnHeaderHelper.java
@@ -0,0 +1,157 @@
+/*****************************************************************************
+ * Copyright (c) 2015 Christian W. Damus and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Christian W. Damus - Initial API and implementation
+ *
+ *****************************************************************************/
+
+package org.eclipse.papyrus.infra.editor.welcome.nattable.sorting;
+
+import java.text.Collator;
+import java.util.Comparator;
+
+import org.eclipse.core.databinding.observable.value.IObservableValue;
+import org.eclipse.jface.viewers.ILabelProvider;
+import org.eclipse.nebula.widgets.nattable.config.CellConfigAttributes;
+import org.eclipse.nebula.widgets.nattable.config.IConfigRegistry;
+import org.eclipse.nebula.widgets.nattable.data.IColumnPropertyAccessor;
+import org.eclipse.nebula.widgets.nattable.data.IDataProvider;
+import org.eclipse.nebula.widgets.nattable.extension.glazedlists.GlazedListsSortModel;
+import org.eclipse.nebula.widgets.nattable.grid.GridRegion;
+import org.eclipse.nebula.widgets.nattable.grid.data.DefaultColumnHeaderDataProvider;
+import org.eclipse.nebula.widgets.nattable.grid.layer.ColumnHeaderLayer;
+import org.eclipse.nebula.widgets.nattable.layer.DataLayer;
+import org.eclipse.nebula.widgets.nattable.layer.ILayer;
+import org.eclipse.nebula.widgets.nattable.layer.cell.ColumnOverrideLabelAccumulator;
+import org.eclipse.nebula.widgets.nattable.painter.cell.ICellPainter;
+import org.eclipse.nebula.widgets.nattable.selection.SelectionLayer;
+import org.eclipse.nebula.widgets.nattable.sort.ISortModel;
+import org.eclipse.nebula.widgets.nattable.sort.SortConfigAttributes;
+import org.eclipse.nebula.widgets.nattable.sort.SortHeaderLayer;
+import org.eclipse.nebula.widgets.nattable.sort.config.SingleClickSortConfiguration;
+import org.eclipse.nebula.widgets.nattable.sort.painter.SortableHeaderTextPainter;
+import org.eclipse.nebula.widgets.nattable.style.DisplayMode;
+import org.eclipse.nebula.widgets.nattable.style.IStyle;
+import org.eclipse.nebula.widgets.nattable.ui.util.CellEdgeEnum;
+import org.eclipse.papyrus.infra.editor.welcome.nattable.ServiceConfigAttributes;
+import org.eclipse.papyrus.infra.services.labelprovider.service.LabelProviderService;
+
+import ca.odell.glazedlists.SortedList;
+
+/**
+ * A helper utility for the configuration of sorting a NatTable that renders a
+ * SWT Forms-compatible flat presentation.
+ */
+public class ColumnHeaderHelper<T> {
+ private final IConfigRegistry configRegistry;
+
+ private final ILayer viewportLayer;
+ private final SelectionLayer selectionLayer;
+
+ private IColumnPropertyAccessor<T> columnAccessor;
+ private DataLayer headerData;
+ private SortHeaderLayer<T> sortHeaders;
+
+ /**
+ * Initializes me.
+ *
+ * @param configRegistry
+ * the NatTable configuration registry
+ * @param viewportLayer
+ * the viewport layer to track for positioning of header cells
+ * @param selectionLayer
+ * the selection layer in the table body
+ */
+ public ColumnHeaderHelper(IConfigRegistry configRegistry, ILayer viewportLayer, SelectionLayer selectionLayer) {
+ super();
+
+ this.configRegistry = configRegistry;
+ this.viewportLayer = viewportLayer;
+ this.selectionLayer = selectionLayer;
+ }
+
+ /**
+ * Creates the header layer. <b>Note</b> that this must be done exactly once, as the returned
+ * layer and other parts of it are retained for follow-up work.
+ *
+ * @param data
+ * the sorted Glazed-list backing store of the table
+ * @param columnAccessor
+ * the column accessor describing the columns to be presented
+ * @param columnHeadings
+ * the localized heading titles corresponding to each column
+ *
+ * @return the column header layer
+ */
+ public ILayer createHeaderLayer(SortedList<T> data, IColumnPropertyAccessor<T> columnAccessor, String... columnHeadings) {
+ this.columnAccessor = columnAccessor;
+ IDataProvider headerProvider = new DefaultColumnHeaderDataProvider(columnHeadings);
+ headerData = new DataLayer(headerProvider);
+ ColumnHeaderLayer headers = new ColumnHeaderLayer(headerData, viewportLayer, selectionLayer);
+ ISortModel sortModel = new GlazedListsSortModel<>(data, columnAccessor, configRegistry, headerData);
+ sortHeaders = new SortHeaderLayer<>(headers, sortModel, false);
+ return sortHeaders;
+ }
+
+ /**
+ * Configures the header layer {@linkplain #createHeaderLayer previously created} for sorting
+ * control behavior.
+ *
+ * @see #createHeaderLayer(SortedList, IColumnPropertyAccessor, String...)
+ */
+ public void configureSorting() {
+ ColumnOverrideLabelAccumulator labelAccumulator = new ColumnOverrideLabelAccumulator(headerData);
+ headerData.setConfigLabelAccumulator(labelAccumulator);
+
+ for (int i = 0; i < columnAccessor.getColumnCount(); i++) {
+ String label = sortLabel(i);
+ labelAccumulator.registerColumnOverrides(i, label);
+ configRegistry.registerConfigAttribute(SortConfigAttributes.SORT_COMPARATOR, getByLabelOrdering(), DisplayMode.NORMAL, label);
+ }
+ }
+
+ /**
+ * Configures the visual styling of the header layer {@linkplain #createHeaderLayer previously created}
+ * for presentation in a SWT Forms UI with a flat appearance.
+ *
+ * @see #createHeaderLayer(SortedList, IColumnPropertyAccessor, String...)
+ */
+ public void configureHeaders(ICellPainter cellPainter, IStyle style) {
+ sortHeaders.addConfiguration(new SingleClickSortConfiguration(new SortableHeaderTextPainter(cellPainter, CellEdgeEnum.LEFT, true, 3, true)));
+ configRegistry.registerConfigAttribute(CellConfigAttributes.CELL_PAINTER, cellPainter, DisplayMode.NORMAL, GridRegion.COLUMN_HEADER);
+ configRegistry.registerConfigAttribute(CellConfigAttributes.CELL_STYLE, style, DisplayMode.NORMAL, GridRegion.COLUMN_HEADER);
+ for (int i = 0; i < columnAccessor.getColumnCount(); i++) {
+ String label = sortLabel(i);
+ configRegistry.registerConfigAttribute(CellConfigAttributes.CELL_PAINTER, cellPainter, DisplayMode.NORMAL, label);
+ configRegistry.registerConfigAttribute(CellConfigAttributes.CELL_STYLE, style, DisplayMode.NORMAL, label);
+ }
+ }
+
+ String sortLabel(int columnIndex) {
+ return sortLabel(columnAccessor.getColumnProperty(columnIndex));
+ }
+
+ static String sortLabel(String propertyName) {
+ return "sortBy:" + propertyName;
+ }
+
+ private Comparator<IObservableValue<?>> getByLabelOrdering() {
+ Collator collator = Collator.getInstance();
+ collator.setStrength(Collator.PRIMARY);
+ return (a, b) -> collator.compare(getLabel(a), getLabel(b));
+ }
+
+ private String getLabel(IObservableValue<?> observable) {
+ LabelProviderService labels = ServiceConfigAttributes.getService(LabelProviderService.class, configRegistry, DisplayMode.NORMAL);
+ Object value = (observable == null) ? null : observable.getValue();
+ ILabelProvider labelProvider = (value == null) ? null : labels.getLabelProvider(observable);
+ return (labelProvider == null) ? null : labelProvider.getText(value);
+ }
+
+}
diff --git a/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome.nattable/src/org/eclipse/papyrus/infra/editor/welcome/nattable/sorting/EventListObservableAdapter.java b/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome.nattable/src/org/eclipse/papyrus/infra/editor/welcome/nattable/sorting/EventListObservableAdapter.java
new file mode 100644
index 00000000000..5145cb4aeba
--- /dev/null
+++ b/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome.nattable/src/org/eclipse/papyrus/infra/editor/welcome/nattable/sorting/EventListObservableAdapter.java
@@ -0,0 +1,198 @@
+/*****************************************************************************
+ * Copyright (c) 2015 Christian W. Damus and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Christian W. Damus - Initial API and implementation
+ *
+ *****************************************************************************/
+
+package org.eclipse.papyrus.infra.editor.welcome.nattable.sorting;
+
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.stream.Stream;
+
+import org.eclipse.core.databinding.observable.ChangeEvent;
+import org.eclipse.core.databinding.observable.IChangeListener;
+import org.eclipse.core.databinding.observable.IObservable;
+import org.eclipse.core.databinding.observable.list.IListChangeListener;
+import org.eclipse.core.databinding.observable.list.IObservableList;
+import org.eclipse.core.databinding.observable.list.ListChangeEvent;
+
+import ca.odell.glazedlists.AbstractEventList;
+import ca.odell.glazedlists.event.ListEventPublisher;
+import ca.odell.glazedlists.util.concurrent.LockFactory;
+
+/**
+ * @author damus
+ *
+ */
+public class EventListObservableAdapter<E> extends AbstractEventList<E> {
+ private final IChangeListener elementListener;
+ private final IListChangeListener<E> listener;
+ private IObservableList<E> delegate;
+
+ public EventListObservableAdapter() {
+ this(null);
+ }
+
+ public EventListObservableAdapter(ListEventPublisher publisher) {
+ super(publisher);
+
+ this.readWriteLock = LockFactory.DEFAULT.createReadWriteLock();
+
+ this.listener = new IListChangeListener<E>() {
+ @Override
+ public void handleListChange(ListChangeEvent<? extends E> event) {
+ readWriteLock.readLock().lock();
+ try {
+ updates.beginEvent();
+ try {
+ Stream.of(event.diff.getDifferences()).forEach(entry -> {
+ if (entry.isAddition()) {
+ updates.elementInserted(entry.getPosition(), entry.getElement());
+ connect(entry.getElement());
+ } else {
+ disconnect(entry.getElement());
+ updates.elementDeleted(entry.getPosition(), entry.getElement());
+ }
+ });
+ } finally {
+ updates.commitEvent();
+ }
+ } finally {
+ readWriteLock.readLock().unlock();
+ }
+ }
+ };
+
+ this.elementListener = new IChangeListener() {
+
+ @Override
+ public void handleChange(ChangeEvent event) {
+ readWriteLock.readLock().lock();
+ try {
+ updates.beginEvent();
+ try {
+ @SuppressWarnings("unchecked")
+ E element = (E) event.getObservable();
+ updates.elementUpdated(indexOf(element), element, element);
+ } finally {
+ updates.commitEvent();
+ }
+ } finally {
+ readWriteLock.readLock().unlock();
+ }
+ }
+ };
+ }
+
+ public synchronized void setDelegate(IObservableList<E> newDelegate) {
+ IObservableList<E> oldDelegate = this.delegate;
+ this.delegate = newDelegate;
+
+ if (oldDelegate != null) {
+ oldDelegate.removeListChangeListener(listener);
+ }
+ if (newDelegate != null) {
+ newDelegate.addListChangeListener(listener);
+ }
+
+ readWriteLock.readLock().lock();
+ try {
+ updates.beginEvent();
+ try {
+ AtomicInteger i = new AtomicInteger();
+ if (oldDelegate != null) {
+ // Report updates for elements that have correspondents in the new list
+ oldDelegate.subList(0, (newDelegate == null) ? 0 : newDelegate.size()).forEach(e -> {
+ E newE = newDelegate.get(i.get());
+ disconnect(e);
+ updates.elementUpdated(i.getAndIncrement(), e, newE);
+ connect(newE);
+ });
+
+ // Report deletions for any further elements
+ if (oldDelegate.size() < i.get()) {
+ oldDelegate.forEach(e -> {
+ disconnect(e);
+ updates.elementDeleted(i.getAndIncrement(), e);
+ });
+ }
+ }
+
+ if (newDelegate != null) {
+ if ((newDelegate.size() > i.get())) {
+ // Report insertions for any further new elements
+ newDelegate.listIterator(i.get()).forEachRemaining(e -> {
+ updates.elementInserted(i.getAndIncrement(), e);
+ connect(e);
+ });
+ }
+ }
+ } finally {
+ updates.commitEvent();
+ }
+ } finally {
+ readWriteLock.readLock().unlock();
+ }
+ }
+
+ @Override
+ public void dispose() {
+ if (delegate != null) {
+ delegate.removeListChangeListener(listener);
+ }
+ }
+
+ @Override
+ public int size() {
+ return (delegate == null) ? 0 : delegate.size();
+ }
+
+ @Override
+ public E get(int index) {
+ checkDelegate();
+ return delegate.get(index);
+ }
+
+ private void checkDelegate() {
+ if (delegate == null) {
+ throw new IndexOutOfBoundsException();
+ }
+ }
+
+ @Override
+ public void add(int index, E value) {
+ checkDelegate();
+ delegate.add(index, value);
+ }
+
+ @Override
+ public E set(int index, E value) {
+ checkDelegate();
+ return delegate.set(index, value);
+ }
+
+ @Override
+ public E remove(int index) {
+ checkDelegate();
+ return delegate.remove(index);
+ }
+
+ private void connect(E newElement) {
+ if (newElement instanceof IObservable) {
+ ((IObservable) newElement).addChangeListener(elementListener);
+ }
+ }
+
+ private void disconnect(E newElement) {
+ if (newElement instanceof IObservable) {
+ ((IObservable) newElement).removeChangeListener(elementListener);
+ }
+ }
+}
diff --git a/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome.nattable/src/org/eclipse/papyrus/infra/editor/welcome/nattable/sorting/PapyrusGlazedListEventsLayer.java b/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome.nattable/src/org/eclipse/papyrus/infra/editor/welcome/nattable/sorting/PapyrusGlazedListEventsLayer.java
new file mode 100644
index 00000000000..a8bb13c1439
--- /dev/null
+++ b/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome.nattable/src/org/eclipse/papyrus/infra/editor/welcome/nattable/sorting/PapyrusGlazedListEventsLayer.java
@@ -0,0 +1,159 @@
+/*****************************************************************************
+ * Copyright (c) 2015 Christian W. Damus and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Christian W. Damus - Initial API and implementation
+ *
+ *****************************************************************************/
+
+package org.eclipse.papyrus.infra.editor.welcome.nattable.sorting;
+
+import org.eclipse.nebula.widgets.nattable.extension.glazedlists.GlazedListsEventLayer;
+import org.eclipse.nebula.widgets.nattable.layer.AbstractLayerTransform;
+import org.eclipse.nebula.widgets.nattable.layer.IUniqueIndexLayer;
+import org.eclipse.nebula.widgets.nattable.layer.event.RowStructuralRefreshEvent;
+import org.eclipse.nebula.widgets.nattable.layer.event.VisualRefreshEvent;
+import org.eclipse.swt.widgets.Display;
+
+import ca.odell.glazedlists.EventList;
+import ca.odell.glazedlists.event.ListEvent;
+import ca.odell.glazedlists.event.ListEventListener;
+
+/**
+ * An alternative to the {@link GlazedListsEventLayer} that doesn't run a thread
+ * continuously checking for updates every 100 milliseconds, but instead posts
+ * 100-millisecond deferred updates that coalesce events in the interim.
+ */
+public class PapyrusGlazedListEventsLayer<E> extends AbstractLayerTransform implements IUniqueIndexLayer, ListEventListener<E> {
+
+ private final IUniqueIndexLayer underlyingLayer;
+ private EventList<? extends E> eventList;
+
+ private volatile boolean active;
+ private volatile Update pendingUpdate;
+
+ /**
+ * Initializes me.
+ *
+ * @param underlyingLayer
+ * the layer to which I post refresh events
+ * @param eventList
+ * the event list from which the {@code underlyingLayer} obtains its data
+ */
+ public PapyrusGlazedListEventsLayer(IUniqueIndexLayer underlyingLayer, EventList<? extends E> eventList) {
+ super(underlyingLayer);
+ this.underlyingLayer = underlyingLayer;
+ this.eventList = eventList;
+
+ this.eventList.addListEventListener(this);
+ }
+
+ @Override
+ public void dispose() {
+ super.dispose();
+
+ if (eventList != null) {
+ eventList.removeListEventListener(this);
+ eventList = null;
+ }
+ }
+
+ /**
+ * Queries whether I am currently reactiving to changes in the list that I am observing.
+ *
+ * @return whether I am active
+ */
+ public boolean isActive() {
+ return active;
+ }
+
+ /**
+ * Sets I am currently reactiving to changes in the list that I am observing.
+ * It is useful to deactivate me when initiating bulk operations on the list
+ * to avoid useless work when a full table refresh will follow, anyways.
+ *
+ * @param active
+ * whether I am active
+ */
+ public void setActive(boolean active) {
+ this.active = active;
+ }
+
+ //
+ // Event handling
+ //
+
+ @Override
+ public void listChanged(ListEvent<E> event) {
+ // Check whether we even want to process anything
+ if (!isActive()) {
+ return;
+ }
+
+ boolean structure = false;
+
+ out: while (event.next()) {
+ int eventType = event.getType();
+ switch (eventType) {
+ case ListEvent.DELETE:
+ case ListEvent.INSERT:
+ structure = true;
+ Update update = pendingUpdate;
+ if (update != null) {
+ update.structuralUpdate = structure;
+ }
+ break out;
+ }
+ }
+
+ if (pendingUpdate == null) {
+ // May have missed the boat
+ pendingUpdate = new Update();
+ pendingUpdate.structuralUpdate = structure;
+ Display.getDefault().timerExec(100, pendingUpdate);
+ }
+ }
+
+ //
+ // IUniqueIndexLayer protocol
+ //
+
+ @Override
+ public int getColumnPositionByIndex(int columnIndex) {
+ return this.underlyingLayer.getColumnPositionByIndex(columnIndex);
+ }
+
+ @Override
+ public int getRowPositionByIndex(int rowIndex) {
+ return this.underlyingLayer.getRowPositionByIndex(rowIndex);
+ }
+
+ //
+ // Nested types
+ //
+
+ private class Update implements Runnable {
+ volatile boolean structuralUpdate;
+
+ @Override
+ public void run() {
+ if (pendingUpdate == this) {
+ pendingUpdate = null;
+
+ // Check that we haven't been disposed since posting the update
+ if (eventList != null) {
+ if (structuralUpdate) {
+ fireLayerEvent(new RowStructuralRefreshEvent(getUnderlyingLayer()));
+ } else {
+ fireLayerEvent(new VisualRefreshEvent(getUnderlyingLayer()));
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome.nattable/src/org/eclipse/papyrus/infra/editor/welcome/nattable/widgets/FormTable.java b/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome.nattable/src/org/eclipse/papyrus/infra/editor/welcome/nattable/widgets/FormTable.java
new file mode 100644
index 00000000000..615f360c423
--- /dev/null
+++ b/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome.nattable/src/org/eclipse/papyrus/infra/editor/welcome/nattable/widgets/FormTable.java
@@ -0,0 +1,230 @@
+/*****************************************************************************
+ * Copyright (c) 2015 Christian W. Damus and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Christian W. Damus - Initial API and implementation
+ *
+ *****************************************************************************/
+
+package org.eclipse.papyrus.infra.editor.welcome.nattable.widgets;
+
+import org.eclipse.core.databinding.observable.list.IObservableList;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.jface.layout.GridDataFactory;
+import org.eclipse.jface.resource.JFaceResources;
+import org.eclipse.jface.viewers.ISelectionProvider;
+import org.eclipse.nebula.widgets.nattable.NatTable;
+import org.eclipse.nebula.widgets.nattable.config.CellConfigAttributes;
+import org.eclipse.nebula.widgets.nattable.config.ConfigRegistry;
+import org.eclipse.nebula.widgets.nattable.config.DefaultNatTableStyleConfiguration;
+import org.eclipse.nebula.widgets.nattable.config.IConfigRegistry;
+import org.eclipse.nebula.widgets.nattable.data.IColumnPropertyAccessor;
+import org.eclipse.nebula.widgets.nattable.data.IDataProvider;
+import org.eclipse.nebula.widgets.nattable.extension.glazedlists.GlazedListsDataProvider;
+import org.eclipse.nebula.widgets.nattable.grid.GridRegion;
+import org.eclipse.nebula.widgets.nattable.layer.CompositeLayer;
+import org.eclipse.nebula.widgets.nattable.layer.DataLayer;
+import org.eclipse.nebula.widgets.nattable.layer.ILayer;
+import org.eclipse.nebula.widgets.nattable.painter.cell.ICellPainter;
+import org.eclipse.nebula.widgets.nattable.selection.SelectionLayer;
+import org.eclipse.nebula.widgets.nattable.style.CellStyleAttributes;
+import org.eclipse.nebula.widgets.nattable.style.DisplayMode;
+import org.eclipse.nebula.widgets.nattable.style.HorizontalAlignmentEnum;
+import org.eclipse.nebula.widgets.nattable.style.Style;
+import org.eclipse.nebula.widgets.nattable.ui.util.CellEdgeEnum;
+import org.eclipse.nebula.widgets.nattable.viewport.ViewportLayer;
+import org.eclipse.papyrus.infra.core.editor.IMultiDiagramEditor;
+import org.eclipse.papyrus.infra.core.sasheditor.contentprovider.IPageManager;
+import org.eclipse.papyrus.infra.core.services.ServiceException;
+import org.eclipse.papyrus.infra.editor.welcome.nattable.ServiceConfigAttributes;
+import org.eclipse.papyrus.infra.editor.welcome.nattable.painter.LabelPainter;
+import org.eclipse.papyrus.infra.editor.welcome.nattable.painter.LabelProviderImagePainter;
+import org.eclipse.papyrus.infra.editor.welcome.nattable.painter.LabelProviderTextPainter;
+import org.eclipse.papyrus.infra.editor.welcome.nattable.sorting.ColumnHeaderHelper;
+import org.eclipse.papyrus.infra.editor.welcome.nattable.sorting.EventListObservableAdapter;
+import org.eclipse.papyrus.infra.editor.welcome.nattable.sorting.PapyrusGlazedListEventsLayer;
+import org.eclipse.papyrus.infra.emf.utils.EMFHelper;
+import org.eclipse.papyrus.infra.emf.utils.ServiceUtilsForEObject;
+import org.eclipse.papyrus.infra.services.labelprovider.service.LabelProviderService;
+import org.eclipse.papyrus.infra.services.navigation.service.NavigationService;
+import org.eclipse.papyrus.views.properties.modelelement.DataSource;
+import org.eclipse.papyrus.views.properties.modelelement.ModelElement;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Label;
+
+import ca.odell.glazedlists.SortedList;
+
+/**
+ * A {@link NatTable} composite with a "flat" presentation suitable for use in an SWT Forms context.
+ */
+public abstract class FormTable<E> extends Composite {
+ private final IConfigRegistry configRegistry;
+ private final NatTable table;
+ private final EventListObservableAdapter<E> backingList;
+ private final PapyrusGlazedListEventsLayer<E> eventLayer;
+
+ private String propertyPath;
+ private DataSource input;
+
+ public FormTable(Composite parent, int style, IColumnPropertyAccessor<E> columnAccessor, String... columnTitle) {
+ this(parent, style, null, columnAccessor, columnTitle);
+ }
+
+ public FormTable(Composite parent, int style, String label, IColumnPropertyAccessor<E> columnAccessor, String... columnTitle) {
+ super(parent, style);
+
+ setBackground(parent.getBackground());
+ setBackgroundMode(SWT.INHERIT_DEFAULT);
+
+ setLayout(new GridLayout());
+
+ configRegistry = new ConfigRegistry();
+
+ // Optional label for the table
+ if ((label != null) && !label.isEmpty()) {
+ Label _label = new Label(parent, SWT.LEFT);
+ _label.setText(label);
+ }
+
+ // Body of the table
+ backingList = new EventListObservableAdapter<>();
+ SortedList<E> sortedDiagrams = new SortedList<>(backingList, null);
+ IDataProvider dataProvider = new GlazedListsDataProvider<>(sortedDiagrams, columnAccessor);
+ DataLayer bodyDataLayer = new DataLayer(dataProvider);
+ eventLayer = new PapyrusGlazedListEventsLayer<>(bodyDataLayer, backingList);
+ SelectionLayer selectionLayer = new SelectionLayer(eventLayer, false);
+ addConfigurations(selectionLayer);
+ ViewportLayer viewportLayer = new ViewportLayer(selectionLayer);
+ viewportLayer.setRegionName(GridRegion.BODY);
+
+ // Column headers
+ ColumnHeaderHelper<E> headerHelper = new ColumnHeaderHelper<>(configRegistry, viewportLayer, selectionLayer);
+ ILayer headers = headerHelper.createHeaderLayer(sortedDiagrams, columnAccessor, columnTitle);
+
+ // Arrange the headers and body together
+ CompositeLayer composition = new CompositeLayer(1, 2);
+ composition.setChildLayer(GridRegion.COLUMN_HEADER, headers, 0, 0);
+ composition.setChildLayer(GridRegion.BODY, viewportLayer, 0, 1);
+
+ // Sorting configuration
+ headerHelper.configureSorting();
+
+ //
+ // Presentation configuration
+ //
+ ICellPainter commonPainter = new LabelProviderTextPainter(false, true, 3, true);
+ ICellPainter iconAndTextPainter = new LabelPainter(commonPainter, CellEdgeEnum.LEFT, new LabelProviderImagePainter());
+
+ // Headers
+ Style headerStyle = new Style();
+ headerStyle.setAttributeValue(CellStyleAttributes.BACKGROUND_COLOR, parent.getBackground());
+ headerStyle.setAttributeValue(CellStyleAttributes.HORIZONTAL_ALIGNMENT, HorizontalAlignmentEnum.LEFT);
+ headerStyle.setAttributeValue(CellStyleAttributes.FONT, JFaceResources.getFont(JFaceResources.BANNER_FONT));
+ headerHelper.configureHeaders(commonPainter, headerStyle);
+
+ // Body
+ configRegistry.registerConfigAttribute(CellConfigAttributes.CELL_PAINTER, iconAndTextPainter, DisplayMode.NORMAL, GridRegion.BODY);
+ Style bodyStyle = new Style();
+ bodyStyle.setAttributeValue(CellStyleAttributes.BACKGROUND_COLOR, parent.getBackground());
+ bodyStyle.setAttributeValue(CellStyleAttributes.HORIZONTAL_ALIGNMENT, HorizontalAlignmentEnum.LEFT);
+ configureBodyStyle(bodyStyle);
+ configRegistry.registerConfigAttribute(CellConfigAttributes.CELL_STYLE, bodyStyle, DisplayMode.NORMAL, GridRegion.BODY);
+ configRegistry.registerConfigAttribute(CellConfigAttributes.RENDER_GRID_LINES, false);
+
+ table = new NatTable(parent, composition, false);
+ GridDataFactory.fillDefaults().grab(true, true).applyTo(table);
+ table.setConfigRegistry(configRegistry);
+ table.setBackground(parent.getBackground());
+ table.addConfiguration(new DefaultNatTableStyleConfiguration());
+ table.configure();
+ }
+
+ protected void addConfigurations(SelectionLayer selectionLayer) {
+ // Pass
+ }
+
+ protected void configureBodyStyle(Style bodyStyle) {
+ // Pass
+ }
+
+ /**
+ * Sets the qualified property name (including model element path) of the
+ * {@linkplain DataSource data-source} property to access. The referenced
+ * property must be an {@linkplain IObservableList observable list}.
+ *
+ * @param propertyPath
+ * the property path
+ */
+ public void setProperty(String propertyPath) {
+ this.propertyPath = propertyPath;
+ checkInput();
+ }
+
+ public String getProperty() {
+ return propertyPath;
+ }
+
+ /**
+ * Sets the input DataSource for this Property editor.
+ *
+ * @param input
+ */
+ public void setInput(DataSource input) {
+ this.input = input;
+ checkInput();
+ }
+
+ protected void checkInput() {
+ String propertyPath = getProperty();
+
+ if ((input != null) && (propertyPath != null)) {
+ String elementPath = propertyPath.substring(0, propertyPath.lastIndexOf(':'));
+ String propertyName = propertyPath.substring(elementPath.length() + 1);
+
+ ModelElement element = input.getModelElement(elementPath);
+
+ ServiceConfigAttributes.with(configRegistry, this::getService)
+ .register(LabelProviderService.class)
+ .register(NavigationService.class)
+ .register(IPageManager.class);
+ ServiceConfigAttributes.registerService(ISelectionProvider.class, configRegistry,
+ getService(IMultiDiagramEditor.class).getEditorSite().getSelectionProvider());
+
+ eventLayer.setActive(false);
+ try {
+ @SuppressWarnings("unchecked")
+ IObservableList<E> diagrams = (IObservableList<E>) element.getObservable(propertyName);
+ this.backingList.setDelegate(diagrams);
+ } finally {
+ eventLayer.setActive(true);
+ table.refresh();
+ }
+ }
+ }
+
+ /**
+ * @return the input DataSource for this Property editor
+ */
+ public DataSource getInput() {
+ return input;
+ }
+
+ protected EObject getModelElement() {
+ return EMFHelper.getEObject(input.getSelection().getFirstElement());
+ }
+
+ protected <S> S getService(Class<? extends S> serviceType) {
+ try {
+ return ServiceUtilsForEObject.getInstance().getService(serviceType, getModelElement());
+ } catch (ServiceException e) {
+ throw new IllegalStateException(e);
+ }
+ }
+}
diff --git a/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome.nattable/src/org/eclipse/papyrus/infra/editor/welcome/nattable/widgets/HyperlinkTable.java b/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome.nattable/src/org/eclipse/papyrus/infra/editor/welcome/nattable/widgets/HyperlinkTable.java
new file mode 100644
index 00000000000..f268f4d4495
--- /dev/null
+++ b/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome.nattable/src/org/eclipse/papyrus/infra/editor/welcome/nattable/widgets/HyperlinkTable.java
@@ -0,0 +1,53 @@
+/*****************************************************************************
+ * Copyright (c) 2015 Christian W. Damus and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Christian W. Damus - Initial API and implementation
+ *
+ *****************************************************************************/
+
+package org.eclipse.papyrus.infra.editor.welcome.nattable.widgets;
+
+import org.eclipse.core.databinding.observable.value.IObservableValue;
+import org.eclipse.nebula.widgets.nattable.data.IColumnPropertyAccessor;
+import org.eclipse.nebula.widgets.nattable.selection.SelectionLayer;
+import org.eclipse.nebula.widgets.nattable.style.CellStyleAttributes;
+import org.eclipse.nebula.widgets.nattable.style.Style;
+import org.eclipse.nebula.widgets.nattable.style.TextDecorationEnum;
+import org.eclipse.nebula.widgets.nattable.util.GUIHelper;
+import org.eclipse.papyrus.infra.editor.welcome.nattable.hyperlink.HyperlinkNavigationConfiguration;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * A table of hyperlinks for objects. One or more columns may render as hyperlinks to
+ * diagrams, views, etc. Label-based sorting of columns is provided.
+ */
+public abstract class HyperlinkTable<E> extends FormTable<E> {
+ public HyperlinkTable(Composite parent, int style, IColumnPropertyAccessor<E> columnAccessor, String... columnTitle) {
+ this(parent, style, null, columnAccessor, columnTitle);
+ }
+
+ public HyperlinkTable(Composite parent, int style, String label, IColumnPropertyAccessor<E> columnAccessor, String... columnTitle) {
+ super(parent, style, label, columnAccessor, columnTitle);
+ }
+
+ @Override
+ protected void addConfigurations(SelectionLayer selectionLayer) {
+ selectionLayer.addConfiguration(new HyperlinkNavigationConfiguration<>(getParent(), IObservableValue.class, this::isActiveHyperlink));
+ }
+
+ @Override
+ protected void configureBodyStyle(Style bodyStyle) {
+ bodyStyle.setAttributeValue(CellStyleAttributes.FOREGROUND_COLOR, GUIHelper.COLOR_BLUE);
+ bodyStyle.setAttributeValue(CellStyleAttributes.TEXT_DECORATION, TextDecorationEnum.UNDERLINE);
+ }
+
+ protected boolean isActiveHyperlink(IObservableValue<?> value) {
+ return (value != null) && (value.getValue() != null);
+ }
+}
diff --git a/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/.classpath b/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/.classpath
new file mode 100644
index 00000000000..50aae142c50
--- /dev/null
+++ b/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/.classpath
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>
+ <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+ <classpathentry kind="src" path="src-gen"/>
+ <classpathentry kind="src" path="src"/>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/.project b/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/.project
new file mode 100644
index 00000000000..df264f6400e
--- /dev/null
+++ b/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.papyrus.infra.editor.welcome</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.ManifestBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.SchemaBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.pde.PluginNature</nature>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ </natures>
+</projectDescription>
diff --git a/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/.settings/org.eclipse.jdt.core.prefs b/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 00000000000..8ddd9a88d57
--- /dev/null
+++ b/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,296 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=1.8
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.8
+org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation=0
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_assignment=0
+org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
+org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80
+org.eclipse.jdt.core.formatter.alignment_for_enum_constants=0
+org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16
+org.eclipse.jdt.core.formatter.alignment_for_method_declaration=0
+org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_resources_in_try=80
+org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=16
+org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_union_type_in_multicatch=16
+org.eclipse.jdt.core.formatter.blank_lines_after_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_after_package=1
+org.eclipse.jdt.core.formatter.blank_lines_before_field=0
+org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0
+org.eclipse.jdt.core.formatter.blank_lines_before_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1
+org.eclipse.jdt.core.formatter.blank_lines_before_method=1
+org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1
+org.eclipse.jdt.core.formatter.blank_lines_before_package=0
+org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1
+org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1
+org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_lambda_body=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_switch=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=false
+org.eclipse.jdt.core.formatter.comment.format_block_comments=true
+org.eclipse.jdt.core.formatter.comment.format_header=false
+org.eclipse.jdt.core.formatter.comment.format_html=true
+org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true
+org.eclipse.jdt.core.formatter.comment.format_line_comments=true
+org.eclipse.jdt.core.formatter.comment.format_source_code=true
+org.eclipse.jdt.core.formatter.comment.indent_parameter_description=true
+org.eclipse.jdt.core.formatter.comment.indent_root_tags=true
+org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert
+org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=insert
+org.eclipse.jdt.core.formatter.comment.line_length=260
+org.eclipse.jdt.core.formatter.comment.new_lines_at_block_boundaries=true
+org.eclipse.jdt.core.formatter.comment.new_lines_at_javadoc_boundaries=true
+org.eclipse.jdt.core.formatter.comment.preserve_white_space_between_code_and_line_comments=false
+org.eclipse.jdt.core.formatter.compact_else_if=true
+org.eclipse.jdt.core.formatter.continuation_indentation=2
+org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2
+org.eclipse.jdt.core.formatter.disabling_tag=@formatter\:off
+org.eclipse.jdt.core.formatter.enabling_tag=@formatter\:on
+org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false
+org.eclipse.jdt.core.formatter.format_line_comment_starting_on_first_column=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true
+org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_empty_lines=false
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false
+org.eclipse.jdt.core.formatter.indentation.size=4
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_label=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_type_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert
+org.eclipse.jdt.core.formatter.insert_space_after_lambda_arrow=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_try=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_try_resources=insert
+org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_try=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_lambda_arrow=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_try=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert
+org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_try_resources=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.join_lines_in_comments=false
+org.eclipse.jdt.core.formatter.join_wrapped_lines=false
+org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.lineSplit=260
+org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=false
+org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=false
+org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0
+org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=5
+org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true
+org.eclipse.jdt.core.formatter.tabulation.char=tab
+org.eclipse.jdt.core.formatter.tabulation.size=4
+org.eclipse.jdt.core.formatter.use_on_off_tags=false
+org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
+org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_or_operator_multicatch=true
+org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested=true
diff --git a/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/.settings/org.eclipse.jdt.ui.prefs b/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/.settings/org.eclipse.jdt.ui.prefs
new file mode 100644
index 00000000000..954281dbc31
--- /dev/null
+++ b/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/.settings/org.eclipse.jdt.ui.prefs
@@ -0,0 +1,68 @@
+cleanup.add_default_serial_version_id=true
+cleanup.add_generated_serial_version_id=false
+cleanup.add_missing_annotations=true
+cleanup.add_missing_deprecated_annotations=true
+cleanup.add_missing_methods=false
+cleanup.add_missing_nls_tags=false
+cleanup.add_missing_override_annotations=true
+cleanup.add_missing_override_annotations_interface_methods=true
+cleanup.add_serial_version_id=false
+cleanup.always_use_blocks=true
+cleanup.always_use_parentheses_in_expressions=false
+cleanup.always_use_this_for_non_static_field_access=false
+cleanup.always_use_this_for_non_static_method_access=false
+cleanup.convert_functional_interfaces=false
+cleanup.convert_to_enhanced_for_loop=false
+cleanup.correct_indentation=false
+cleanup.format_source_code=false
+cleanup.format_source_code_changes_only=false
+cleanup.insert_inferred_type_arguments=false
+cleanup.make_local_variable_final=true
+cleanup.make_parameters_final=false
+cleanup.make_private_fields_final=true
+cleanup.make_type_abstract_if_missing_method=false
+cleanup.make_variable_declarations_final=false
+cleanup.never_use_blocks=false
+cleanup.never_use_parentheses_in_expressions=true
+cleanup.organize_imports=false
+cleanup.qualify_static_field_accesses_with_declaring_class=false
+cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
+cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
+cleanup.qualify_static_member_accesses_with_declaring_class=true
+cleanup.qualify_static_method_accesses_with_declaring_class=false
+cleanup.remove_private_constructors=true
+cleanup.remove_redundant_type_arguments=true
+cleanup.remove_trailing_whitespaces=true
+cleanup.remove_trailing_whitespaces_all=true
+cleanup.remove_trailing_whitespaces_ignore_empty=false
+cleanup.remove_unnecessary_casts=true
+cleanup.remove_unnecessary_nls_tags=true
+cleanup.remove_unused_imports=true
+cleanup.remove_unused_local_variables=false
+cleanup.remove_unused_private_fields=true
+cleanup.remove_unused_private_members=false
+cleanup.remove_unused_private_methods=true
+cleanup.remove_unused_private_types=true
+cleanup.sort_members=false
+cleanup.sort_members_all=false
+cleanup.use_anonymous_class_creation=false
+cleanup.use_blocks=true
+cleanup.use_blocks_only_for_return_and_throw=false
+cleanup.use_lambda=true
+cleanup.use_parentheses_in_expressions=false
+cleanup.use_this_for_non_static_field_access=false
+cleanup.use_this_for_non_static_field_access_only_if_necessary=true
+cleanup.use_this_for_non_static_method_access=false
+cleanup.use_this_for_non_static_method_access_only_if_necessary=true
+cleanup.use_type_arguments=false
+cleanup_profile=_Papyrus
+cleanup_settings_version=2
+eclipse.preferences.version=1
+formatter_profile=_Papyrus
+formatter_settings_version=12
+org.eclipse.jdt.ui.ignorelowercasenames=true
+org.eclipse.jdt.ui.importorder=java;javax;org;com;
+org.eclipse.jdt.ui.javadoc=true
+org.eclipse.jdt.ui.ondemandthreshold=99
+org.eclipse.jdt.ui.staticondemandthreshold=99
+org.eclipse.jdt.ui.text.custom_code_templates=<?xml version\="1.0" encoding\="UTF-8" standalone\="no"?><templates><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\n * @return the ${bare_field_name}\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\n * @param ${param} the ${bare_field_name} to set\n */</template><template autoinsert\="false" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\n * Constructor.\n *\n * ${tags}\n */</template><template autoinsert\="false" context\="filecomment_context" deleted\="false" description\="Comment for created Java files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.filecomment" name\="filecomment">/*****************************************************************************\n * Copyright (c) ${year} CEA LIST and others.\n * \n * All rights reserved. This program and the accompanying materials\n * are made available under the terms of the Eclipse Public License v1.0\n * which accompanies this distribution, and is available at\n * http\://www.eclipse.org/legal/epl-v10.html\n *\n * Contributors\:\n * CEA LIST - Initial API and implementation\n * \n *****************************************************************************/\n</template><template autoinsert\="true" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\n * @author ${user}\n *\n * ${tags}\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for fields" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\n * \n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\n * ${tags}\n */</template><template autoinsert\="false" context\="overridecomment_context" deleted\="false" description\="Comment for overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.overridecomment" name\="overridecomment">/**\n * ${see_to_overridden}\n *\n * ${tags}\n */</template><template autoinsert\="false" context\="delegatecomment_context" deleted\="false" description\="Comment for delegate methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.delegatecomment" name\="delegatecomment">/**\n * ${see_to_target}\n *\n * ${tags}\n */</template><template autoinsert\="true" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.newtype" name\="newtype">${filecomment}\n${package_declaration}\n\n${typecomment}\n${type_declaration}</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.classbody" name\="classbody">\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.enumbody" name\="enumbody">\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\n</template><template autoinsert\="true" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\n${exception_var}.printStackTrace();</template><template autoinsert\="true" context\="methodbody_context" deleted\="false" description\="Code in created method stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodbody" name\="methodbody">// ${todo} Auto-generated method stub\n${body_statement}</template><template autoinsert\="true" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\n// ${todo} Auto-generated constructor stub</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template></templates>
diff --git a/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/META-INF/MANIFEST.MF b/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/META-INF/MANIFEST.MF
new file mode 100644
index 00000000000..32798bbebe3
--- /dev/null
+++ b/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/META-INF/MANIFEST.MF
@@ -0,0 +1,38 @@
+Manifest-Version: 1.0
+Export-Package: org.eclipse.papyrus.infra.editor.welcome,
+ org.eclipse.papyrus.infra.editor.welcome.internal;x-internal:=true,
+ org.eclipse.papyrus.infra.editor.welcome.internal.commands;x-internal:=true,
+ org.eclipse.papyrus.infra.editor.welcome.internal.constraints;x-internal:=true,
+ org.eclipse.papyrus.infra.editor.welcome.internal.impl;x-internal:=true,
+ org.eclipse.papyrus.infra.editor.welcome.internal.operations,
+ org.eclipse.papyrus.infra.editor.welcome.internal.modelelements;
+ x-friends:="org.eclipse.papyrus.infra.editor.welcome.nattable",
+ org.eclipse.papyrus.infra.editor.welcome.internal.widgets;x-internal:=true,
+ org.eclipse.papyrus.infra.editor.welcome.util
+Require-Bundle: org.eclipse.core.runtime;bundle-version="3.12.0",
+ org.eclipse.emf.ecore;visibility:=reexport,
+ org.eclipse.uml2.types;visibility:=reexport,
+ org.eclipse.uml2.common;visibility:=reexport,
+ org.eclipse.papyrus.infra.core;bundle-version="1.2.0",
+ org.eclipse.papyrus.infra.core.sasheditor;bundle-version="1.2.0",
+ org.eclipse.papyrus.infra.core.log;bundle-version="1.2.0",
+ org.eclipse.ui;bundle-version="3.100.0",
+ org.eclipse.ui.forms;bundle-version="3.7.0",
+ org.eclipse.papyrus.views.properties;bundle-version="1.2.0",
+ org.eclipse.papyrus.infra.constraints;bundle-version="1.2.0",
+ org.eclipse.papyrus.views.properties.model;bundle-version="1.2.0",
+ org.eclipse.ui.views.properties.tabbed;bundle-version="3.6.0",
+ org.eclipse.core.databinding;bundle-version="1.6.0",
+ org.eclipse.papyrus.infra.emf;bundle-version="1.2.0",
+ org.eclipse.emf.transaction;bundle-version="1.9.0",
+ org.eclipse.papyrus.infra.widgets;bundle-version="1.2.0"
+Bundle-Vendor: %providerName
+Bundle-ActivationPolicy: lazy
+Bundle-Version: 1.2.0.qualifier
+Bundle-ClassPath: .
+Bundle-Localization: plugin
+Bundle-Name: %pluginName
+Bundle-Activator: org.eclipse.papyrus.infra.editor.welcome.internal.Activator
+Bundle-ManifestVersion: 2
+Bundle-SymbolicName: org.eclipse.papyrus.infra.editor.welcome;singleton:=true
+Bundle-RequiredExecutionEnvironment: JavaSE-1.8
diff --git a/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/about.html b/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/about.html
new file mode 100644
index 00000000000..dd3c089a94c
--- /dev/null
+++ b/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/about.html
@@ -0,0 +1,28 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
+<title>About</title>
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+
+<p>November 14, 2008</p>
+<h3>License</h3>
+
+<p>The Eclipse Foundation makes available all content in this plug-in (&quot;Content&quot;). Unless otherwise
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 1.0 (&quot;EPL&quot;). A copy of the EPL is available
+at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
+
+<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is
+being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
+apply to your use of any object code in the Content. Check the Redistributor's license that was
+provided with the Content. If no such license exists, contact the Redistributor. Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <a href="http://www.eclipse.org">http://www.eclipse.org</a>.</p>
+
+</body>
+</html> \ No newline at end of file
diff --git a/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/build.properties b/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/build.properties
new file mode 100644
index 00000000000..63eb6d0f978
--- /dev/null
+++ b/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/build.properties
@@ -0,0 +1,24 @@
+#
+# Copyright (c) 2015 Christian W. Damus and others.
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License v1.0
+# which accompanies this distribution, and is available at
+# http://www.eclipse.org/legal/epl-v10.html
+#
+# Contributors:
+# Christian W. Damus - Initial API and implementation
+#
+
+bin.includes = META-INF/,\
+ .,\
+ plugin.xml,\
+ icons/,\
+ about.html,\
+ plugin.properties,\
+ model/
+output.. = bin/
+src.includes = about.html
+source.. = src/,\
+ src-gen/
+bin.. = bin/
diff --git a/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/icons/full/editor16/welcome16.gif b/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/icons/full/editor16/welcome16.gif
new file mode 100644
index 00000000000..b20cc784ae3
--- /dev/null
+++ b/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/icons/full/editor16/welcome16.gif
Binary files differ
diff --git a/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/icons/full/obj16/layout.png b/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/icons/full/obj16/layout.png
new file mode 100644
index 00000000000..4c50765e3d3
--- /dev/null
+++ b/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/icons/full/obj16/layout.png
Binary files differ
diff --git a/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/model/environment.xmi b/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/model/environment.xmi
new file mode 100644
index 00000000000..cc6650ddaab
--- /dev/null
+++ b/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/model/environment.xmi
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="ASCII"?>
+<environment:Environment
+ xmi:version="2.0"
+ xmlns:xmi="http://www.omg.org/XMI"
+ xmlns:environment="http://www.eclipse.org/papyrus/properties/environment/0.9">
+ <constraintTypes
+ label="IsWelcomeElement"
+ constraintClass="org.eclipse.papyrus.infra.editor.welcome.internal.constraints.IsWelcomeElement"/>
+ <modelElementFactories
+ name="Welcome Factory"
+ factoryClass="org.eclipse.papyrus.infra.editor.welcome.internal.modelelements.WelcomeModelElementFactory"/>
+ <widgetTypes
+ label="Open View"
+ widgetClass="OpenViewLink"
+ namespace="//@namespaces.0"/>
+ <namespaces
+ name="ppew"
+ value="org.eclipse.papyrus.infra.editor.welcome.internal.widgets"/>
+</environment:Environment>
diff --git a/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/model/general/general.ctx b/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/model/general/general.ctx
new file mode 100644
index 00000000000..217abd2a84d
--- /dev/null
+++ b/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/model/general/general.ctx
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="ASCII"?>
+<contexts:Context xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:constraints="http://www.eclipse.org/papyrus/constraints/0.9" xmlns:contexts="http://www.eclipse.org/papyrus/properties/contexts/0.9" xmi:id="_MPALcI7eEeWNa5T2Agi7uA" name="welcome-general" label="General Editor Settings">
+ <tabs xmi:id="_SsfbQcElEeS_u7hIvAIReA" label="General" id="general" category="org.eclipse.papyrus" priority="75">
+ <sections xmi:id="_SsgCV8ElEeS_u7hIvAIReA" name="Single Page Layout" sectionFile="ui/SinglePageLayout.xwt">
+ <widget href="ui/SinglePageLayout.xwt#/"/>
+ </sections>
+ </tabs>
+ <tabs xmi:id="_R74MUJhuEeWbjrnVcTzZFw" label="Related Views" id="view-links" category="org.eclipse.papyrus" afterTab="_SsfbQcElEeS_u7hIvAIReA" priority="75">
+ <sections xmi:id="_SsgCV9ElEeS_u7hIvAIReA" name="Single View Links" sectionFile="ui/SingleViewLinks.xwt">
+ <widget href="ui/SingleViewLinks.xwt#/"/>
+ </sections>
+ </tabs>
+ <views xmi:id="_Ssiem8ElEeS_u7hIvAIReA" name="Single Page Layout" sections="_SsgCV8ElEeS_u7hIvAIReA" automaticContext="true" datacontexts="_SsmJGsElEeS_u7hIvAIReA">
+ <constraints xsi:type="constraints:SimpleConstraint" xmi:id="_SskT2cElEeS_u7hIvAIReA" name="isWelcomeElement">
+ <constraintType href="ppe:/environment/org.eclipse.papyrus.infra.editor.welcome/model/environment.xmi#//@constraintTypes.0"/>
+ <properties xsi:type="constraints:ValueProperty" xmi:id="_SskT2sElEeS_u7hIvAIReA" name="metaclassName" value="Welcome"/>
+ </constraints>
+ </views>
+ <views xmi:id="_Mz4-0JhuEeWbjrnVcTzZFw" name="Single View Links" sections="_SsgCV9ElEeS_u7hIvAIReA" automaticContext="true" datacontexts="_SsmJGsElEeS_u7hIvAIReA">
+ <constraints xsi:type="constraints:SimpleConstraint" xmi:id="_Mz4-0ZhuEeWbjrnVcTzZFw" name="isWelcomeElement">
+ <constraintType href="ppe:/environment/org.eclipse.papyrus.infra.editor.welcome/model/environment.xmi#//@constraintTypes.0"/>
+ <properties xsi:type="constraints:ValueProperty" xmi:id="_Mz4-0phuEeWbjrnVcTzZFw" name="metaclassName" value="Welcome"/>
+ </constraints>
+ </views>
+ <dataContexts xmi:id="_SsmI-cElEeS_u7hIvAIReA" name="welcomeGeneral" label="Welcome">
+ <elements xmi:id="_SsmJGsElEeS_u7hIvAIReA" name="PageLayout">
+ <properties xmi:id="_SsmJG8ElEeS_u7hIvAIReA" name="privateLayout" label="Private editor page layout" type="Boolean" multiplicity="1" description="Do not share the layout of editor pages in the *.di file"/>
+ <properties xmi:id="_SsmJG9ElEeS_u7hIvAIReA" name="restoreActivePage" label="Remember last active page" type="Boolean" multiplicity="1" description="Remember the last active editor page to restore it when the editor is next opened"/>
+ </elements>
+ <modelElementFactory href="ppe:/environment/org.eclipse.papyrus.infra.editor.welcome/model/environment.xmi#//@modelElementFactories.0"/>
+ </dataContexts>
+</contexts:Context>
diff --git a/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/model/general/ui/SinglePageLayout.xwt b/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/model/general/ui/SinglePageLayout.xwt
new file mode 100644
index 00000000000..1962afdc7c2
--- /dev/null
+++ b/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/model/general/ui/SinglePageLayout.xwt
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Composite
+ xmlns:ppel="clr-namespace:org.eclipse.papyrus.views.properties.widgets.layout"
+ xmlns:ppe="clr-namespace:org.eclipse.papyrus.views.properties.widgets"
+ xmlns:x="http://www.eclipse.org/xwt"
+ xmlns="http://www.eclipse.org/xwt/presentation" xmlns:j="clr-namespace:java.lang">
+ <Composite.layout>
+ <ppel:PropertiesLayout></ppel:PropertiesLayout>
+ </Composite.layout>
+ <ppe:BooleanCheckbox input="{Binding}" property="welcomeGeneral:PageLayout:privateLayout"></ppe:BooleanCheckbox>
+ <ppe:BooleanCheckbox input="{Binding}" property="welcomeGeneral:PageLayout:restoreActivePage"></ppe:BooleanCheckbox>
+</Composite> \ No newline at end of file
diff --git a/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/model/general/ui/SingleViewLinks.xwt b/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/model/general/ui/SingleViewLinks.xwt
new file mode 100644
index 00000000000..b1c595802be
--- /dev/null
+++ b/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/model/general/ui/SingleViewLinks.xwt
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Composite xmlns:ppe="clr-namespace:org.eclipse.papyrus.views.properties.widgets"
+ xmlns:ppel="clr-namespace:org.eclipse.papyrus.views.properties.widgets.layout"
+ xmlns:ppew="clr-namespace:org.eclipse.papyrus.infra.editor.welcome.internal.widgets"
+ xmlns:j="clr-namespace:java.lang" xmlns:x="http://www.eclipse.org/xwt"
+ xmlns="http://www.eclipse.org/xwt/presentation">
+ <Composite.layout>
+ <ppel:PropertiesLayout></ppel:PropertiesLayout>
+ </Composite.layout>
+ <ppew:OpenViewLink label="Properties View" viewID="org.eclipse.ui.views.PropertySheet"></ppew:OpenViewLink>
+ <ppew:OpenViewLink label="Model Explorer" viewID="org.eclipse.papyrus.views.modelexplorer.modelexplorer"></ppew:OpenViewLink>
+ <ppew:OpenViewLink label="Model Validation" viewID="org.eclipse.papyrus.views.validation.ModelValidationView"></ppew:OpenViewLink>
+</Composite> \ No newline at end of file
diff --git a/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/model/welcome.di b/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/model/welcome.di
new file mode 100644
index 00000000000..bf9abab340f
--- /dev/null
+++ b/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/model/welcome.di
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xmi:XMI xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI"/>
diff --git a/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/model/welcome.ecore b/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/model/welcome.ecore
new file mode 100644
index 00000000000..1754c6f7f89
--- /dev/null
+++ b/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/model/welcome.ecore
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ecore:EPackage xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" name="welcome" nsURI="http://www.eclipse.org/Papyrus/2015/editor/welcome"
+ nsPrefix="welcome">
+ <eClassifiers xsi:type="ecore:EClass" name="Welcome">
+ <eStructuralFeatures xsi:type="ecore:EReference" name="welcomePage" ordered="false"
+ eType="#//WelcomePage" containment="true"/>
+ </eClassifiers>
+ <eClassifiers xsi:type="ecore:EClass" name="WelcomePage">
+ <eOperations name="getVisibleSections" ordered="false" upperBound="-1" eType="#//WelcomeSection">
+ <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
+ <details key="suppressedVisibility" value="true"/>
+ </eAnnotations>
+ </eOperations>
+ <eOperations name="getSection" ordered="false" eType="#//WelcomeSection">
+ <eParameters name="identifier" ordered="false" lowerBound="1" eType="ecore:EDataType ../../org.eclipse.uml2.types/model/Types.ecore#//String"/>
+ </eOperations>
+ <eStructuralFeatures xsi:type="ecore:EReference" name="section" upperBound="-1"
+ eType="#//WelcomeSection" containment="true" eOpposite="#//WelcomeSection/page"/>
+ <eStructuralFeatures xsi:type="ecore:EReference" name="visibleSection" upperBound="-1"
+ eType="#//WelcomeSection" volatile="true" transient="true" derived="true">
+ <eAnnotations source="subsets" references="#//WelcomePage/section"/>
+ </eStructuralFeatures>
+ </eClassifiers>
+ <eClassifiers xsi:type="ecore:EClass" name="WelcomeSection">
+ <eOperations name="isIdentifiedBy" ordered="false" lowerBound="1" eType="ecore:EDataType ../../org.eclipse.uml2.types/model/Types.ecore#//Boolean">
+ <eParameters name="identifier" ordered="false" lowerBound="1" eType="ecore:EDataType ../../org.eclipse.uml2.types/model/Types.ecore#//String"/>
+ </eOperations>
+ <eStructuralFeatures xsi:type="ecore:EAttribute" name="identifier" ordered="false"
+ lowerBound="1" upperBound="-1" eType="ecore:EDataType ../../org.eclipse.uml2.types/model/Types.ecore#//String"/>
+ <eStructuralFeatures xsi:type="ecore:EAttribute" name="hidden" ordered="false"
+ lowerBound="1" eType="ecore:EDataType ../../org.eclipse.uml2.types/model/Types.ecore#//Boolean"/>
+ <eStructuralFeatures xsi:type="ecore:EReference" name="page" ordered="false" lowerBound="1"
+ eType="#//WelcomePage" eOpposite="#//WelcomePage/section"/>
+ </eClassifiers>
+</ecore:EPackage>
diff --git a/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/model/welcome.genmodel b/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/model/welcome.genmodel
new file mode 100644
index 00000000000..f16431e3048
--- /dev/null
+++ b/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/model/welcome.genmodel
@@ -0,0 +1,66 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<genmodel:GenModel xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" xmlns:genmodel="http://www.eclipse.org/uml2/2.2.0/GenModel"
+ copyrightText="Copyright (c) 2015 Christian W. Damus and others.&#xA;&#xA;All rights reserved. This program and the accompanying materials&#xA;are made available under the terms of the Eclipse Public License v1.0&#xA;which accompanies this distribution, and is available at&#xA;http://www.eclipse.org/legal/epl-v10.html&#xA;&#xA;Contributors:&#xA; Christian W. Damus - Initial API and implementation&#xA;"
+ modelDirectory="/org.eclipse.papyrus.infra.editor.welcome/src-gen" editDirectory="/org.eclipse.papyrus.infra.editor.welcome.edit/src-gen"
+ editorDirectory="/org.eclipse.papyrus.infra.editor.welcome.editor/src-gen" modelPluginID="org.eclipse.papyrus.infra.editor.welcome"
+ modelName="Welcome" nonNLSMarkers="true" rootExtendsClass="org.eclipse.emf.ecore.impl.MinimalEObjectImpl$Container"
+ codeFormatting="true" commentFormatting="true" testsDirectory="/org.eclipse.papyrus.infra.editor.welcome.tests/src-gen"
+ importerID="org.eclipse.uml2.uml.ecore.importer" complianceLevel="8.0" copyrightFields="false"
+ usedGenPackages="../../org.eclipse.uml2.types/model/Types.genmodel#//types" operationReflection="true"
+ importOrganizing="true" cleanup="true" factoryMethods="true" pluralizedGetters="true"
+ cacheAdapterSupport="true" invariantPrefix="">
+ <genAnnotations source="http://www.eclipse.org/emf/2002/GenModel/importer/org.eclipse.uml2.uml.ecore.importer">
+ <details key="OPPOSITE_ROLE_NAMES" value="IGNORE"/>
+ <details key="DUPLICATE_FEATURES" value="DISCARD"/>
+ <details key="ANNOTATION_DETAILS" value="PROCESS"/>
+ <details key="PROPERTY_DEFAULT_EXPRESSIONS" value="IGNORE"/>
+ <details key="DUPLICATE_FEATURE_INHERITANCE" value="DISCARD"/>
+ <details key="COMMENTS" value="PROCESS"/>
+ <details key="DERIVED_FEATURES" value="PROCESS"/>
+ <details key="SUPER_CLASS_ORDER" value="PROCESS"/>
+ <details key="DUPLICATE_OPERATION_INHERITANCE" value="DISCARD"/>
+ <details key="REDEFINING_OPERATIONS" value="PROCESS"/>
+ <details key="INVARIANT_CONSTRAINTS" value="PROCESS"/>
+ <details key="UNION_PROPERTIES" value="PROCESS"/>
+ <details key="DUPLICATE_OPERATIONS" value="DISCARD"/>
+ <details key="NON_API_INVARIANTS" value="IGNORE"/>
+ <details key="CAMEL_CASE_NAMES" value="IGNORE"/>
+ <details key="SUBSETTING_PROPERTIES" value="PROCESS"/>
+ <details key="OPERATION_BODIES" value="IGNORE"/>
+ <details key="ECORE_TAGGED_VALUES" value="PROCESS"/>
+ <details key="UNTYPED_PROPERTIES" value="REPORT"/>
+ <details key="REDEFINING_PROPERTIES" value="PROCESS"/>
+ <details key="INVOCATION_DELEGATES" value="IGNORE"/>
+ <details key="VALIDATION_DELEGATES" value="IGNORE"/>
+ </genAnnotations>
+ <foreignModel>welcome.uml</foreignModel>
+ <genPackages xsi:type="genmodel:GenPackage" prefix="Welcome" basePackage="org.eclipse.papyrus.infra.editor"
+ disposableProviderFactory="true" classPackageSuffix="internal.impl" generateExampleClass="false"
+ ecorePackage="welcome.ecore#/" operationsPackage="org.eclipse.papyrus.infra.editor.welcome.internal.operations">
+ <genClasses xsi:type="genmodel:GenClass" ecoreClass="welcome.ecore#//Welcome">
+ <genFeatures xsi:type="genmodel:GenFeature" property="None" children="true"
+ createChild="true" ecoreFeature="ecore:EReference welcome.ecore#//Welcome/welcomePage"/>
+ </genClasses>
+ <genClasses xsi:type="genmodel:GenClass" ecoreClass="welcome.ecore#//WelcomePage">
+ <genFeatures xsi:type="genmodel:GenFeature" property="None" children="true"
+ createChild="true" ecoreFeature="ecore:EReference welcome.ecore#//WelcomePage/section"/>
+ <genFeatures xsi:type="genmodel:GenFeature" createChild="true" propertySortChoices="true"
+ ecoreFeature="ecore:EReference welcome.ecore#//WelcomePage/visibleSection"/>
+ <genOperations xsi:type="genmodel:GenOperation" ecoreOperation="welcome.ecore#//WelcomePage/getVisibleSections"
+ cacheAdapterScope="Resource"/>
+ <genOperations xsi:type="genmodel:GenOperation" ecoreOperation="welcome.ecore#//WelcomePage/getSection">
+ <genParameters xsi:type="genmodel:GenParameter" ecoreParameter="welcome.ecore#//WelcomePage/getSection/identifier"/>
+ </genOperations>
+ </genClasses>
+ <genClasses xsi:type="genmodel:GenClass" ecoreClass="welcome.ecore#//WelcomeSection">
+ <genFeatures xsi:type="genmodel:GenFeature" createChild="false" ecoreFeature="ecore:EAttribute welcome.ecore#//WelcomeSection/identifier"/>
+ <genFeatures xsi:type="genmodel:GenFeature" createChild="false" ecoreFeature="ecore:EAttribute welcome.ecore#//WelcomeSection/hidden"/>
+ <genFeatures xsi:type="genmodel:GenFeature" property="None" notify="false" createChild="false"
+ ecoreFeature="ecore:EReference welcome.ecore#//WelcomeSection/page"/>
+ <genOperations xsi:type="genmodel:GenOperation" ecoreOperation="welcome.ecore#//WelcomeSection/isIdentifiedBy">
+ <genParameters xsi:type="genmodel:GenParameter" ecoreParameter="welcome.ecore#//WelcomeSection/isIdentifiedBy/identifier"/>
+ </genOperations>
+ </genClasses>
+ </genPackages>
+</genmodel:GenModel>
diff --git a/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/model/welcome.notation b/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/model/welcome.notation
new file mode 100644
index 00000000000..d1d4d0cc8bd
--- /dev/null
+++ b/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/model/welcome.notation
@@ -0,0 +1,218 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<notation:Diagram xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:notation="http://www.eclipse.org/gmf/runtime/1.0.2/notation" xmlns:style="http://www.eclipse.org/papyrus/infra/viewpoints/policy/style" xmlns:uml="http://www.eclipse.org/uml2/5.0.0/UML" xmi:id="_fPcrkI0zEeWQ4s2Ri_ucLw" type="PapyrusUMLClassDiagram" name="classes" measurementUnit="Pixel">
+ <children xmi:type="notation:Shape" xmi:id="_g3Y5wI0zEeWQ4s2Ri_ucLw" type="2008">
+ <children xmi:type="notation:DecorationNode" xmi:id="_g3iqwI0zEeWQ4s2Ri_ucLw" type="5029"/>
+ <children xmi:type="notation:DecorationNode" xmi:id="_g3iqwY0zEeWQ4s2Ri_ucLw" type="8510">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_g3iqwo0zEeWQ4s2Ri_ucLw" y="5"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_g3m8MI0zEeWQ4s2Ri_ucLw" type="7017">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_g3m8MY0zEeWQ4s2Ri_ucLw"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_g3m8Mo0zEeWQ4s2Ri_ucLw"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_g3m8M40zEeWQ4s2Ri_ucLw"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_g3m8NI0zEeWQ4s2Ri_ucLw"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_g3m8NY0zEeWQ4s2Ri_ucLw" type="7018">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_g3m8No0zEeWQ4s2Ri_ucLw"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_g3m8N40zEeWQ4s2Ri_ucLw"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_g3m8OI0zEeWQ4s2Ri_ucLw"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_g3m8OY0zEeWQ4s2Ri_ucLw"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_g3m8Oo0zEeWQ4s2Ri_ucLw" type="7019">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_g3m8O40zEeWQ4s2Ri_ucLw"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_g3m8PI0zEeWQ4s2Ri_ucLw"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_g3m8PY0zEeWQ4s2Ri_ucLw"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_g3m8Po0zEeWQ4s2Ri_ucLw"/>
+ </children>
+ <element xmi:type="uml:Class" href="welcome.uml#_g3K3UI0zEeWQ4s2Ri_ucLw"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_g3Y5wY0zEeWQ4s2Ri_ucLw" x="75" y="97"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_6D_FEI0zEeWQ4s2Ri_ucLw" type="StereotypeComment">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_6D_FEY0zEeWQ4s2Ri_ucLw" showTitle="true"/>
+ <styles xmi:type="notation:EObjectValueStyle" xmi:id="_6D_sII0zEeWQ4s2Ri_ucLw" name="BASE_ELEMENT">
+ <eObjectValue xmi:type="uml:Class" href="welcome.uml#_g3K3UI0zEeWQ4s2Ri_ucLw"/>
+ </styles>
+ <element xsi:nil="true"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_6D_FEo0zEeWQ4s2Ri_ucLw" x="279" y="104"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_MhN18JnYEeWGtMqIodd43w" type="2008">
+ <children xmi:type="notation:DecorationNode" xmi:id="_MhPrIJnYEeWGtMqIodd43w" type="5029"/>
+ <children xmi:type="notation:DecorationNode" xmi:id="_MhQSMJnYEeWGtMqIodd43w" type="8510">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_MhQSMZnYEeWGtMqIodd43w" y="5"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_MhQSMpnYEeWGtMqIodd43w" type="7017">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_MhQSM5nYEeWGtMqIodd43w"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_MhQSNJnYEeWGtMqIodd43w"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_MhQSNZnYEeWGtMqIodd43w"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_MhQSNpnYEeWGtMqIodd43w"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_MhQSN5nYEeWGtMqIodd43w" type="7018">
+ <children xmi:type="notation:Shape" xmi:id="_MgoqUJncEeWGtMqIodd43w" type="3013">
+ <element xmi:type="uml:Operation" href="welcome.uml#_MgdEIJncEeWGtMqIodd43w"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_MgoqUZncEeWGtMqIodd43w"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_T87OAJniEeWGtMqIodd43w" type="3013">
+ <element xmi:type="uml:Operation" href="welcome.uml#_T8vAwJniEeWGtMqIodd43w"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_T87OAZniEeWGtMqIodd43w"/>
+ </children>
+ <styles xmi:type="notation:TitleStyle" xmi:id="_MhQSOJnYEeWGtMqIodd43w"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_MhQSOZnYEeWGtMqIodd43w"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_MhQSOpnYEeWGtMqIodd43w"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_MhQSO5nYEeWGtMqIodd43w"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_MhQ5QJnYEeWGtMqIodd43w" type="7019">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_MhQ5QZnYEeWGtMqIodd43w"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_MhQ5QpnYEeWGtMqIodd43w"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_MhQ5Q5nYEeWGtMqIodd43w"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_MhQ5RJnYEeWGtMqIodd43w"/>
+ </children>
+ <element xmi:type="uml:Class" href="welcome.uml#_MfwdYJnYEeWGtMqIodd43w"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_MhN18ZnYEeWGtMqIodd43w" x="294" y="102"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_cYIEQJnYEeWGtMqIodd43w" type="2008">
+ <children xmi:type="notation:DecorationNode" xmi:id="_cYIrUZnYEeWGtMqIodd43w" type="5029"/>
+ <children xmi:type="notation:DecorationNode" xmi:id="_cYIrUpnYEeWGtMqIodd43w" type="8510">
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_cYIrU5nYEeWGtMqIodd43w" y="5"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_cYIrVJnYEeWGtMqIodd43w" type="7017">
+ <children xmi:type="notation:Shape" xmi:id="_q1z10JnYEeWGtMqIodd43w" type="3012">
+ <element xmi:type="uml:Property" href="welcome.uml#_q1qE0JnYEeWGtMqIodd43w"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_q1z10ZnYEeWGtMqIodd43w"/>
+ </children>
+ <children xmi:type="notation:Shape" xmi:id="_yTDDcJnYEeWGtMqIodd43w" type="3012">
+ <element xmi:type="uml:Property" href="welcome.uml#_yS4EUJnYEeWGtMqIodd43w"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_yTDDcZnYEeWGtMqIodd43w"/>
+ </children>
+ <styles xmi:type="notation:TitleStyle" xmi:id="_cYJSYJnYEeWGtMqIodd43w"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_cYJSYZnYEeWGtMqIodd43w"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_cYJSYpnYEeWGtMqIodd43w"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_cYJSY5nYEeWGtMqIodd43w"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_cYJSZJnYEeWGtMqIodd43w" type="7018">
+ <children xmi:type="notation:Shape" xmi:id="_g8Ce4JnZEeWGtMqIodd43w" type="3013">
+ <element xmi:type="uml:Operation" href="welcome.uml#_g73fwJnZEeWGtMqIodd43w"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_g8Ce4ZnZEeWGtMqIodd43w"/>
+ </children>
+ <styles xmi:type="notation:TitleStyle" xmi:id="_cYJSZZnYEeWGtMqIodd43w"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_cYJSZpnYEeWGtMqIodd43w"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_cYJSZ5nYEeWGtMqIodd43w"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_cYJSaJnYEeWGtMqIodd43w"/>
+ </children>
+ <children xmi:type="notation:BasicCompartment" xmi:id="_cYJSaZnYEeWGtMqIodd43w" type="7019">
+ <styles xmi:type="notation:TitleStyle" xmi:id="_cYJSapnYEeWGtMqIodd43w"/>
+ <styles xmi:type="notation:SortingStyle" xmi:id="_cYJSa5nYEeWGtMqIodd43w"/>
+ <styles xmi:type="notation:FilteringStyle" xmi:id="_cYJSbJnYEeWGtMqIodd43w"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_cYJSbZnYEeWGtMqIodd43w"/>
+ </children>
+ <element xmi:type="uml:Class" href="welcome.uml#_cX-6UJnYEeWGtMqIodd43w"/>
+ <layoutConstraint xmi:type="notation:Bounds" xmi:id="_cYIrUJnYEeWGtMqIodd43w" x="298" y="294"/>
+ </children>
+ <styles xmi:type="notation:StringValueStyle" xmi:id="_fPcrkY0zEeWQ4s2Ri_ucLw" name="diagram_compatibility_version" stringValue="1.1.0"/>
+ <styles xmi:type="notation:DiagramStyle" xmi:id="_fPcrko0zEeWQ4s2Ri_ucLw"/>
+ <styles xmi:type="style:PapyrusViewStyle" xmi:id="_fPcrk40zEeWQ4s2Ri_ucLw">
+ <owner xmi:type="uml:Model" href="welcome.uml#_fNSvcI0zEeWQ4s2Ri_ucLw"/>
+ </styles>
+ <element xmi:type="uml:Model" href="welcome.uml#_fNSvcI0zEeWQ4s2Ri_ucLw"/>
+ <edges xmi:type="notation:Connector" xmi:id="_6EEkoI0zEeWQ4s2Ri_ucLw" type="StereotypeCommentLink" source="_g3Y5wI0zEeWQ4s2Ri_ucLw" target="_6D_FEI0zEeWQ4s2Ri_ucLw">
+ <styles xmi:type="notation:FontStyle" xmi:id="_6EFLsI0zEeWQ4s2Ri_ucLw"/>
+ <styles xmi:type="notation:EObjectValueStyle" xmi:id="_6EFywo0zEeWQ4s2Ri_ucLw" name="BASE_ELEMENT">
+ <eObjectValue xmi:type="uml:Class" href="welcome.uml#_g3K3UI0zEeWQ4s2Ri_ucLw"/>
+ </styles>
+ <element xsi:nil="true"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_6EFLsY0zEeWQ4s2Ri_ucLw" points="[0, 0, 0, 0]$[0, 0, 0, 0]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_6EFywI0zEeWQ4s2Ri_ucLw"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_6EFywY0zEeWQ4s2Ri_ucLw"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_gTuXIJnYEeWGtMqIodd43w" type="4001" source="_MhN18JnYEeWGtMqIodd43w" target="_cYIEQJnYEeWGtMqIodd43w" routing="Rectilinear">
+ <children xmi:type="notation:DecorationNode" xmi:id="_gTuXI5nYEeWGtMqIodd43w" type="6001">
+ <styles xmi:type="notation:BooleanValueStyle" xmi:id="_1oTvEJnYEeWGtMqIodd43w" name="IS_UPDATED_POSITION" booleanValue="true"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_gTuXJJnYEeWGtMqIodd43w" x="1" y="-18"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_gTuXJZnYEeWGtMqIodd43w" type="6002">
+ <styles xmi:type="notation:BooleanValueStyle" xmi:id="_1ocR8JnYEeWGtMqIodd43w" name="IS_UPDATED_POSITION" booleanValue="true"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_gTuXJpnYEeWGtMqIodd43w" y="19"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_gTuXJ5nYEeWGtMqIodd43w" type="6003">
+ <styles xmi:type="notation:BooleanValueStyle" xmi:id="_1okNwJnYEeWGtMqIodd43w" name="IS_UPDATED_POSITION" booleanValue="true"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_gTuXKJnYEeWGtMqIodd43w" x="17" y="-36"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_gTu-MJnYEeWGtMqIodd43w" type="6005">
+ <styles xmi:type="notation:BooleanValueStyle" xmi:id="_1osJkJnYEeWGtMqIodd43w" name="IS_UPDATED_POSITION" booleanValue="true"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_gTu-MZnYEeWGtMqIodd43w" x="-16" y="32"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_gTu-MpnYEeWGtMqIodd43w" type="6033">
+ <styles xmi:type="notation:BooleanValueStyle" xmi:id="_1o0FYJnYEeWGtMqIodd43w" name="IS_UPDATED_POSITION" booleanValue="true"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_gTu-M5nYEeWGtMqIodd43w" x="15" y="19"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_gTu-NJnYEeWGtMqIodd43w" type="6034">
+ <styles xmi:type="notation:BooleanValueStyle" xmi:id="_1o7aIJnYEeWGtMqIodd43w" name="IS_UPDATED_POSITION" booleanValue="true"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_gTu-NZnYEeWGtMqIodd43w" x="-15" y="-19"/>
+ </children>
+ <styles xmi:type="notation:FontStyle" xmi:id="_gTuXIZnYEeWGtMqIodd43w"/>
+ <element xmi:type="uml:Association" href="welcome.uml#_gTUugJnYEeWGtMqIodd43w"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_gTuXIpnYEeWGtMqIodd43w" points="[352, 202, -643984, -643984]$[352, 294, -643984, -643984]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_gVc1cJnYEeWGtMqIodd43w" id="(0.20588235294117646,1.0)"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_gVc1cZnYEeWGtMqIodd43w" id="(0.22033898305084745,0.0)"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_4GLfsJnYEeWGtMqIodd43w" type="4001" source="_g3Y5wI0zEeWQ4s2Ri_ucLw" target="_MhN18JnYEeWGtMqIodd43w">
+ <children xmi:type="notation:DecorationNode" xmi:id="_4GLfs5nYEeWGtMqIodd43w" type="6001">
+ <styles xmi:type="notation:BooleanValueStyle" xmi:id="_-jux8JnYEeWGtMqIodd43w" name="IS_UPDATED_POSITION" booleanValue="true"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_4GLftJnYEeWGtMqIodd43w" x="1" y="-18"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_4GLftZnYEeWGtMqIodd43w" type="6002">
+ <styles xmi:type="notation:BooleanValueStyle" xmi:id="_-j2twJnYEeWGtMqIodd43w" name="IS_UPDATED_POSITION" booleanValue="true"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_4GLftpnYEeWGtMqIodd43w" y="19"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_4GLft5nYEeWGtMqIodd43w" type="6003">
+ <styles xmi:type="notation:BooleanValueStyle" xmi:id="_-j9bcJnYEeWGtMqIodd43w" name="IS_UPDATED_POSITION" booleanValue="true"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_4GMGwJnYEeWGtMqIodd43w" x="28" y="-21"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_4GMGwZnYEeWGtMqIodd43w" type="6005">
+ <styles xmi:type="notation:BooleanValueStyle" xmi:id="_-kEwMJnYEeWGtMqIodd43w" name="IS_UPDATED_POSITION" booleanValue="true"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_4GMGwpnYEeWGtMqIodd43w" x="-41" y="18"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_4GMGw5nYEeWGtMqIodd43w" type="6033">
+ <styles xmi:type="notation:BooleanValueStyle" xmi:id="_-kMsAJnYEeWGtMqIodd43w" name="IS_UPDATED_POSITION" booleanValue="true"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_4GMGxJnYEeWGtMqIodd43w" x="16" y="20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_4GMGxZnYEeWGtMqIodd43w" type="6034">
+ <styles xmi:type="notation:BooleanValueStyle" xmi:id="_-kUAwJnYEeWGtMqIodd43w" name="IS_UPDATED_POSITION" booleanValue="true"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_4GMGxpnYEeWGtMqIodd43w" x="-17" y="-19"/>
+ </children>
+ <styles xmi:type="notation:FontStyle" xmi:id="_4GLfsZnYEeWGtMqIodd43w"/>
+ <element xmi:type="uml:Association" href="welcome.uml#_4GAgkJnYEeWGtMqIodd43w"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_4GLfspnYEeWGtMqIodd43w" points="[179, 149, -643984, -643984]$[294, 146, -643984, -643984]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_4Ghd8JnYEeWGtMqIodd43w" id="(1.0,0.45)"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_4Ghd8ZnYEeWGtMqIodd43w" id="(0.0,0.4)"/>
+ </edges>
+ <edges xmi:type="notation:Connector" xmi:id="_LwegEJnZEeWGtMqIodd43w" type="4001" source="_MhN18JnYEeWGtMqIodd43w" target="_cYIEQJnYEeWGtMqIodd43w" routing="Rectilinear">
+ <children xmi:type="notation:DecorationNode" xmi:id="_LwegE5nZEeWGtMqIodd43w" type="6001">
+ <styles xmi:type="notation:BooleanValueStyle" xmi:id="_MxAwAJnZEeWGtMqIodd43w" name="IS_UPDATED_POSITION" booleanValue="true"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_LwegFJnZEeWGtMqIodd43w" y="-20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_LwegFZnZEeWGtMqIodd43w" type="6002">
+ <styles xmi:type="notation:BooleanValueStyle" xmi:id="_MxJS4JnZEeWGtMqIodd43w" name="IS_UPDATED_POSITION" booleanValue="true"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_LwegFpnZEeWGtMqIodd43w" y="20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_LwegF5nZEeWGtMqIodd43w" visible="false" type="6003">
+ <styles xmi:type="notation:BooleanValueStyle" xmi:id="_MxROsJnZEeWGtMqIodd43w" name="IS_UPDATED_POSITION" booleanValue="true"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_LwegGJnZEeWGtMqIodd43w" x="42" y="-20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_LwfHIJnZEeWGtMqIodd43w" type="6005">
+ <styles xmi:type="notation:BooleanValueStyle" xmi:id="_MxZKgJnZEeWGtMqIodd43w" name="IS_UPDATED_POSITION" booleanValue="true"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_LwfHIZnZEeWGtMqIodd43w" x="-19" y="-50"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_LwfHIpnZEeWGtMqIodd43w" visible="false" type="6033">
+ <styles xmi:type="notation:BooleanValueStyle" xmi:id="_MxhGUJnZEeWGtMqIodd43w" name="IS_UPDATED_POSITION" booleanValue="true"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_LwfHI5nZEeWGtMqIodd43w" x="42" y="20"/>
+ </children>
+ <children xmi:type="notation:DecorationNode" xmi:id="_LwfHJJnZEeWGtMqIodd43w" type="6034">
+ <styles xmi:type="notation:BooleanValueStyle" xmi:id="_MxpCIJnZEeWGtMqIodd43w" name="IS_UPDATED_POSITION" booleanValue="true"/>
+ <layoutConstraint xmi:type="notation:Location" xmi:id="_LwfHJZnZEeWGtMqIodd43w" x="-17" y="17"/>
+ </children>
+ <styles xmi:type="notation:FontStyle" xmi:id="_LwegEZnZEeWGtMqIodd43w"/>
+ <element xmi:type="uml:Association" href="welcome.uml#_LwREsJnZEeWGtMqIodd43w"/>
+ <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_LwegEpnZEeWGtMqIodd43w" points="[502, 202, -643984, -643984]$[502, 294, -643984, -643984]"/>
+ <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_Lw26kJnZEeWGtMqIodd43w" id="(0.7647058823529411,1.0)"/>
+ <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_Lw26kZnZEeWGtMqIodd43w" id="(0.864406779661017,0.0)"/>
+ </edges>
+</notation:Diagram>
diff --git a/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/model/welcome.uml b/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/model/welcome.uml
new file mode 100644
index 00000000000..b0b2bad4c98
--- /dev/null
+++ b/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/model/welcome.uml
@@ -0,0 +1,90 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xmi:XMI xmi:version="20131001" xmlns:xmi="http://www.omg.org/spec/XMI/20131001" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:Ecore="http://www.eclipse.org/uml2/schemas/Ecore/5" xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" xmlns:uml="http://www.eclipse.org/uml2/5.0.0/UML" xsi:schemaLocation="http://www.eclipse.org/uml2/schemas/Ecore/5 pathmap://UML_PROFILES/Ecore.profile.uml#_z1OFcHjqEdy8S4Cr8Rc_NA">
+ <uml:Model xmi:id="_fNSvcI0zEeWQ4s2Ri_ucLw" name="welcome" URI="http://www.eclipse.org/Papyrus/2015/editor/welcome">
+ <packageImport xmi:type="uml:PackageImport" xmi:id="_fjMuAI0zEeWQ4s2Ri_ucLw">
+ <importedPackage xmi:type="uml:Model" href="pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#_0"/>
+ </packageImport>
+ <packagedElement xmi:type="uml:Class" xmi:id="_g3K3UI0zEeWQ4s2Ri_ucLw" name="Welcome">
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_4GBHopnYEeWGtMqIodd43w" name="welcomePage" type="_MfwdYJnYEeWGtMqIodd43w" aggregation="composite" association="_4GAgkJnYEeWGtMqIodd43w">
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_8kZXcJnYEeWGtMqIodd43w"/>
+ <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_8kalkJnYEeWGtMqIodd43w" value="1"/>
+ </ownedAttribute>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Class" xmi:id="_MfwdYJnYEeWGtMqIodd43w" name="WelcomePage">
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_gTbcMJnYEeWGtMqIodd43w" name="section" type="_cX-6UJnYEeWGtMqIodd43w" isOrdered="true" aggregation="composite" association="_gTUugJnYEeWGtMqIodd43w">
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_kuqRYJnYEeWGtMqIodd43w"/>
+ <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_kuvw8JnYEeWGtMqIodd43w" value="*"/>
+ </ownedAttribute>
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_LwSS0JnZEeWGtMqIodd43w" name="visibleSection" type="_cX-6UJnYEeWGtMqIodd43w" isOrdered="true" isDerived="true" subsettedProperty="_gTbcMJnYEeWGtMqIodd43w" association="_LwREsJnZEeWGtMqIodd43w">
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_VinvkJnZEeWGtMqIodd43w"/>
+ <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_Vio9sJnZEeWGtMqIodd43w" value="*"/>
+ </ownedAttribute>
+ <ownedOperation xmi:type="uml:Operation" xmi:id="_MgdEIJncEeWGtMqIodd43w" name="getVisibleSections" visibility="protected">
+ <ownedParameter xmi:type="uml:Parameter" xmi:id="_UWM4YJncEeWGtMqIodd43w" type="_cX-6UJnYEeWGtMqIodd43w" direction="return">
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_WB0ssJncEeWGtMqIodd43w"/>
+ <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_WB160JncEeWGtMqIodd43w" value="*"/>
+ </ownedParameter>
+ </ownedOperation>
+ <ownedOperation xmi:type="uml:Operation" xmi:id="_T8vAwJniEeWGtMqIodd43w" name="getSection">
+ <ownedParameter xmi:type="uml:Parameter" xmi:id="_Z-UvwJniEeWGtMqIodd43w" name="identifier" effect="read">
+ <type xmi:type="uml:PrimitiveType" href="pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#String"/>
+ </ownedParameter>
+ <ownedParameter xmi:type="uml:Parameter" xmi:id="_dygzEJniEeWGtMqIodd43w" type="_cX-6UJnYEeWGtMqIodd43w" direction="return" effect="read">
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_ffi8oJniEeWGtMqIodd43w"/>
+ <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_ffkKwJniEeWGtMqIodd43w" value="1"/>
+ </ownedParameter>
+ </ownedOperation>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Class" xmi:id="_cX-6UJnYEeWGtMqIodd43w" name="WelcomeSection">
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_gTcDQJnYEeWGtMqIodd43w" name="page" type="_MfwdYJnYEeWGtMqIodd43w" association="_gTUugJnYEeWGtMqIodd43w"/>
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_q1qE0JnYEeWGtMqIodd43w" name="identifier" visibility="public">
+ <type xmi:type="uml:PrimitiveType" href="pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#String"/>
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="_K2WksJnaEeWGtMqIodd43w" value="1"/>
+ <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="_K2YZ4JnaEeWGtMqIodd43w" value="*"/>
+ </ownedAttribute>
+ <ownedAttribute xmi:type="uml:Property" xmi:id="_yS4EUJnYEeWGtMqIodd43w" name="hidden" visibility="public">
+ <type xmi:type="uml:PrimitiveType" href="pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean"/>
+ </ownedAttribute>
+ <ownedOperation xmi:type="uml:Operation" xmi:id="_g73fwJnZEeWGtMqIodd43w" name="isIdentifiedBy">
+ <ownedParameter xmi:type="uml:Parameter" xmi:id="_maCYoJnZEeWGtMqIodd43w" name="identifier" effect="read">
+ <type xmi:type="uml:PrimitiveType" href="pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#String"/>
+ </ownedParameter>
+ <ownedParameter xmi:type="uml:Parameter" xmi:id="_pPeUsJnZEeWGtMqIodd43w" direction="return">
+ <type xmi:type="uml:PrimitiveType" href="pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#Boolean"/>
+ </ownedParameter>
+ </ownedOperation>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Association" xmi:id="_gTUugJnYEeWGtMqIodd43w" memberEnd="_gTbcMJnYEeWGtMqIodd43w _gTcDQJnYEeWGtMqIodd43w">
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_gTaOEJnYEeWGtMqIodd43w" source="org.eclipse.papyrus">
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_gTaOEZnYEeWGtMqIodd43w" key="nature" value="UML_Nature"/>
+ </eAnnotations>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Association" xmi:id="_4GAgkJnYEeWGtMqIodd43w" memberEnd="_4GBHopnYEeWGtMqIodd43w _4GBusJnYEeWGtMqIodd43w">
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_4GBHoJnYEeWGtMqIodd43w" source="org.eclipse.papyrus">
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_4GBHoZnYEeWGtMqIodd43w" key="nature" value="UML_Nature"/>
+ </eAnnotations>
+ <ownedEnd xmi:type="uml:Property" xmi:id="_4GBusJnYEeWGtMqIodd43w" name="welcome" type="_g3K3UI0zEeWQ4s2Ri_ucLw" association="_4GAgkJnYEeWGtMqIodd43w"/>
+ </packagedElement>
+ <packagedElement xmi:type="uml:Association" xmi:id="_LwREsJnZEeWGtMqIodd43w" memberEnd="_LwSS0JnZEeWGtMqIodd43w _LwSS0ZnZEeWGtMqIodd43w">
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_LwRrwJnZEeWGtMqIodd43w" source="org.eclipse.papyrus">
+ <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_LwRrwZnZEeWGtMqIodd43w" key="nature" value="UML_Nature"/>
+ </eAnnotations>
+ <ownedEnd xmi:type="uml:Property" xmi:id="_LwSS0ZnZEeWGtMqIodd43w" type="_MfwdYJnYEeWGtMqIodd43w" association="_LwREsJnZEeWGtMqIodd43w"/>
+ </packagedElement>
+ <profileApplication xmi:type="uml:ProfileApplication" xmi:id="_fUBCgI0zEeWQ4s2Ri_ucLw">
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_fUC3sI0zEeWQ4s2Ri_ucLw" source="http://www.eclipse.org/uml2/2.0.0/UML">
+ <references xmi:type="ecore:EPackage" href="pathmap://UML_PROFILES/Ecore.profile.uml#_z1OFcHjqEdy8S4Cr8Rc_NA"/>
+ </eAnnotations>
+ <appliedProfile xmi:type="uml:Profile" href="pathmap://UML_PROFILES/Ecore.profile.uml#_0"/>
+ </profileApplication>
+ <profileApplication xmi:type="uml:ProfileApplication" xmi:id="_vltTcJnYEeWGtMqIodd43w">
+ <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_vlvIoJnYEeWGtMqIodd43w" source="http://www.eclipse.org/uml2/2.0.0/UML">
+ <references xmi:type="ecore:EPackage" href="pathmap://PAPYRUS_ACTIONLANGUAGE_PROFILE/ActionLanguage-Profile.profile.uml#_Kv8EIKFXEeS_KNX0nfvIVQ"/>
+ </eAnnotations>
+ <appliedProfile xmi:type="uml:Profile" href="pathmap://PAPYRUS_ACTIONLANGUAGE_PROFILE/ActionLanguage-Profile.profile.uml#ActionLanguage"/>
+ </profileApplication>
+ </uml:Model>
+ <Ecore:EPackage xmi:id="_vYgZ0I0zEeWQ4s2Ri_ucLw" base_Package="_fNSvcI0zEeWQ4s2Ri_ucLw" nsPrefix="welcome" basePackage="org.eclipse.papyrus.infra.editor" prefix="Welcome"/>
+ <Ecore:EClass xmi:id="_6DadUI0zEeWQ4s2Ri_ucLw" base_Class="_g3K3UI0zEeWQ4s2Ri_ucLw"/>
+ <Ecore:EOperation xmi:id="_aKd9EJncEeWGtMqIodd43w" base_Operation="_MgdEIJncEeWGtMqIodd43w" visibility="None"/>
+</xmi:XMI>
diff --git a/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/plugin.properties b/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/plugin.properties
new file mode 100644
index 00000000000..7a6fd800447
--- /dev/null
+++ b/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/plugin.properties
@@ -0,0 +1,21 @@
+#
+# Copyright (c) 2015 Christian W. Damus and others.
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License v1.0
+# which accompanies this distribution, and is available at
+# http://www.eclipse.org/legal/epl-v10.html
+#
+# Contributors:
+# Christian W. Damus - Initial API and implementation
+#
+pluginName=Papyrus Editor Welcome Page
+providerName=Eclipse Modeling Project
+
+cmd.showWelcome.desc = Shows the Papyrus Editor's overview welcome page
+cmd.showWelcome.name = Show Welcome Page
+cmd.showWelcome.tip = Open the overview (welcome) page
+cmd.resetWelcome.desc = Resets the arrangement of the welcome page
+cmd.resetWelcome.name = Reset Welcome Page
+cmd.resetWelcome.tip = Resets the arrangement of the welcome page
+prefpage.welcome.name = Editor Welcome Page
diff --git a/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/plugin.xml b/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/plugin.xml
new file mode 100644
index 00000000000..a7e1ef425ba
--- /dev/null
+++ b/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/plugin.xml
@@ -0,0 +1,163 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.2"?>
+<!--
+ Copyright (c) 2015 Christian W. Damus and others.
+
+ All rights reserved. This program and the accompanying materials
+ are made available under the terms of the Eclipse Public License v1.0
+ which accompanies this distribution, and is available at
+ http://www.eclipse.org/legal/epl-v10.html
+
+ Contributors:
+ Christian W. Damus - Initial API and implementation
+-->
+<plugin>
+ <extension
+ point="org.eclipse.papyrus.infra.core.service">
+ <service
+ classname="org.eclipse.papyrus.infra.editor.welcome.internal.WelcomePageService"
+ description="The Papyrus Editor&apos;s welcome page management service."
+ id="org.eclipse.papyrus.infra.editor.welcome.IWelcomePageService"
+ priority="50"
+ startKind="startup">
+ <dependsOn
+ serviceKeyRef="org.eclipse.papyrus.infra.core.resource.ModelSet">
+ </dependsOn>
+ <dependsOn
+ serviceKeyRef="org.eclipse.papyrus.infra.core.sasheditor.contentprovider.IPageManager">
+ </dependsOn>
+ <dependsOn
+ serviceKeyRef="org.eclipse.papyrus.infra.core.services.EditorLifecycleManager">
+ </dependsOn>
+ </service>
+ </extension>
+ <extension
+ point="org.eclipse.papyrus.infra.core.papyrusDiagram">
+ <editorDiagram
+ factoryClass="org.eclipse.papyrus.infra.editor.welcome.internal.WelcomePageFactory"
+ icon="icons/full/editor16/welcome16.gif"
+ order="50">
+ </editorDiagram>
+ </extension>
+ <extension
+ point="org.eclipse.ui.commands">
+ <command
+ defaultHandler="org.eclipse.papyrus.infra.editor.welcome.internal.commands.ShowWelcomePageHandler"
+ description="%cmd.showWelcome.desc"
+ id="org.eclipse.papyrus.infra.editor.welcome.showWelcomePage"
+ name="%cmd.showWelcome.name">
+ </command>
+ <command
+ defaultHandler="org.eclipse.papyrus.infra.editor.welcome.internal.commands.ResetWelcomePageHandler"
+ description="%cmd.resetWelcome.desc"
+ id="org.eclipse.papyrus.infra.editor.welcome.resetWelcomePage"
+ name="%cmd.resetWelcome.name">
+ </command>
+ </extension>
+ <extension
+ point="org.eclipse.ui.menus">
+ <menuContribution
+ locationURI="popup:org.eclipse.papyrus.infra.core.editor.ui.tabmenu?before=additions">
+ <separator
+ name="welcome-group"
+ visible="true">
+ </separator>
+ </menuContribution>
+ <menuContribution
+ locationURI="popup:org.eclipse.papyrus.infra.core.editor.ui.tabmenu?after=welcome-group">
+ <command
+ commandId="org.eclipse.papyrus.infra.editor.welcome.showWelcomePage"
+ style="push"
+ tooltip="%cmd.showWelcome.tip">
+ <visibleWhen>
+ <with
+ variable="activeEditorId">
+ <equals
+ value="org.eclipse.papyrus.infra.core.papyrusEditor">
+ </equals>
+ </with>
+ </visibleWhen>
+ </command>
+ <command
+ commandId="org.eclipse.papyrus.infra.editor.welcome.resetWelcomePage"
+ style="push"
+ tooltip="%cmd.resetWelcome.tip">
+ <visibleWhen checkEnabled="true"/>
+ </command>
+ </menuContribution>
+ <menuContribution
+ locationURI="menu:org.eclipse.papyrus.infra.core.commands.dropdowncommand?before=additions">
+ <separator
+ name="welcome-group"
+ visible="true">
+ </separator>
+ </menuContribution>
+ <menuContribution
+ allPopups="false"
+ locationURI="menu:org.eclipse.papyrus.infra.core.commands.dropdowncommand?after=welcome-group">
+ <command
+ commandId="org.eclipse.papyrus.infra.editor.welcome.showWelcomePage"
+ style="push"
+ tooltip="%cmd.showWelcome.tip">
+ <visibleWhen>
+ <with
+ variable="activeEditorId">
+ <equals
+ value="org.eclipse.papyrus.infra.core.papyrusEditor">
+ </equals>
+ </with>
+ </visibleWhen>
+ </command>
+ <command
+ commandId="org.eclipse.papyrus.infra.editor.welcome.resetWelcomePage"
+ style="push"
+ tooltip="%cmd.resetWelcome.tip">
+ <visibleWhen checkEnabled="true"/>
+ </command>
+ </menuContribution>
+ </extension>
+ <extension
+ point="org.eclipse.core.runtime.adapters">
+ <factory
+ adaptableType="org.eclipse.papyrus.infra.editor.welcome.Welcome"
+ class="org.eclipse.papyrus.infra.editor.welcome.internal.WelcomeAdapterFactory">
+ <adapter
+ type="org.eclipse.papyrus.infra.core.sasheditor.di.contentprovider.IOpenable">
+ </adapter>
+ </factory>
+ </extension>
+ <extension
+ point="org.eclipse.ui.preferencePages">
+ <page
+ category="org.eclipse.papyrus.infra.core.sasheditor.preferences.generalcategory"
+ class="org.eclipse.papyrus.views.properties/org.eclipse.papyrus.views.properties.preferences.Preferences"
+ id="org.eclipse.papyrus.infra.editor.welcome.content"
+ name="%prefpage.welcome.name">
+ </page>
+ </extension>
+ <extension
+ point="org.eclipse.papyrus.views.properties.context">
+ <context
+ contextModel="model/general/general.ctx">
+ </context>
+ <preferencePageBinding
+ context="welcome-general"
+ page="org.eclipse.papyrus.infra.editor.welcome.content">
+ </preferencePageBinding>
+ </extension>
+ <extension
+ point="org.eclipse.papyrus.views.properties.environment">
+ <environment
+ environmentModel="model/environment.xmi">
+ </environment>
+ </extension>
+
+ <extension point="org.eclipse.emf.ecore.generated_package">
+ <!-- @generated welcome -->
+ <package
+ uri="http://www.eclipse.org/Papyrus/2015/editor/welcome"
+ class="org.eclipse.papyrus.infra.editor.welcome.WelcomePackage"
+ genModel="model/welcome.genmodel"/>
+ </extension>
+
+</plugin>
diff --git a/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/pom.xml b/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/pom.xml
new file mode 100644
index 00000000000..8ad03b63171
--- /dev/null
+++ b/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/pom.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project>
+ <modelVersion>4.0.0</modelVersion>
+ <parent>
+ <artifactId>org.eclipse.papyrus.releng</artifactId>
+ <groupId>org.eclipse.papyrus</groupId>
+ <version>1.2.0-SNAPSHOT</version>
+ <relativePath>../../../../releng/main</relativePath>
+ </parent>
+ <artifactId>org.eclipse.papyrus.infra.editor.welcome</artifactId>
+ <groupId>org.eclipse.papyrus</groupId>
+ <version>1.2.0-SNAPSHOT</version>
+ <packaging>eclipse-plugin</packaging>
+</project> \ No newline at end of file
diff --git a/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/src-gen/org/eclipse/papyrus/infra/editor/welcome/Welcome.java b/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/src-gen/org/eclipse/papyrus/infra/editor/welcome/Welcome.java
new file mode 100644
index 00000000000..cc4ab1b9823
--- /dev/null
+++ b/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/src-gen/org/eclipse/papyrus/infra/editor/welcome/Welcome.java
@@ -0,0 +1,74 @@
+/**
+ * Copyright (c) 2015 Christian W. Damus and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Christian W. Damus - Initial API and implementation
+ *
+ */
+package org.eclipse.papyrus.infra.editor.welcome;
+
+import org.eclipse.emf.ecore.EObject;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Welcome</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ * <li>{@link org.eclipse.papyrus.infra.editor.welcome.Welcome#getWelcomePage <em>Welcome Page</em>}</li>
+ * </ul>
+ *
+ * @see org.eclipse.papyrus.infra.editor.welcome.WelcomePackage#getWelcome()
+ * @model
+ * @generated
+ */
+public interface Welcome extends EObject {
+
+ /**
+ * Returns the value of the '<em><b>Welcome Page</b></em>' containment reference.
+ * <!-- begin-user-doc -->
+ * <p>
+ * If the meaning of the '<em>Welcome Page</em>' containment reference isn't clear,
+ * there really should be more of a description here...
+ * </p>
+ * <!-- end-user-doc -->
+ *
+ * @return the value of the '<em>Welcome Page</em>' containment reference.
+ * @see #setWelcomePage(WelcomePage)
+ * @see org.eclipse.papyrus.infra.editor.welcome.WelcomePackage#getWelcome_WelcomePage()
+ * @model containment="true" ordered="false"
+ * @generated
+ */
+ WelcomePage getWelcomePage();
+
+ /**
+ * Sets the value of the '{@link org.eclipse.papyrus.infra.editor.welcome.Welcome#getWelcomePage <em>Welcome Page</em>}' containment reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ *
+ * @param value
+ * the new value of the '<em>Welcome Page</em>' containment reference.
+ * @see #getWelcomePage()
+ * @generated
+ */
+ void setWelcomePage(WelcomePage value);
+
+ /**
+ * Creates a new {@link org.eclipse.papyrus.infra.editor.welcome.WelcomePage} and sets the '<em><b>Welcome Page</b></em>' containment reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ *
+ * @return The new {@link org.eclipse.papyrus.infra.editor.welcome.WelcomePage}.
+ * @see #getWelcomePage()
+ * @generated
+ */
+ WelcomePage createWelcomePage();
+} // Welcome
diff --git a/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/src-gen/org/eclipse/papyrus/infra/editor/welcome/WelcomeFactory.java b/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/src-gen/org/eclipse/papyrus/infra/editor/welcome/WelcomeFactory.java
new file mode 100644
index 00000000000..bf3f0ca49d9
--- /dev/null
+++ b/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/src-gen/org/eclipse/papyrus/infra/editor/welcome/WelcomeFactory.java
@@ -0,0 +1,76 @@
+/**
+ * Copyright (c) 2015 Christian W. Damus and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Christian W. Damus - Initial API and implementation
+ *
+ */
+package org.eclipse.papyrus.infra.editor.welcome;
+
+import org.eclipse.emf.ecore.EFactory;
+
+/**
+ * <!-- begin-user-doc -->
+ * The <b>Factory</b> for the model.
+ * It provides a create method for each non-abstract class of the model.
+ * <!-- end-user-doc -->
+ *
+ * @see org.eclipse.papyrus.infra.editor.welcome.WelcomePackage
+ * @generated
+ */
+public interface WelcomeFactory extends EFactory {
+ /**
+ * The singleton instance of the factory.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ *
+ * @generated
+ */
+ WelcomeFactory eINSTANCE = org.eclipse.papyrus.infra.editor.welcome.internal.impl.WelcomeFactoryImpl.init();
+
+ /**
+ * Returns a new object of class '<em>Welcome</em>'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ *
+ * @return a new object of class '<em>Welcome</em>'.
+ * @generated
+ */
+ Welcome createWelcome();
+
+ /**
+ * Returns a new object of class '<em>Page</em>'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ *
+ * @return a new object of class '<em>Page</em>'.
+ * @generated
+ */
+ WelcomePage createWelcomePage();
+
+ /**
+ * Returns a new object of class '<em>Section</em>'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ *
+ * @return a new object of class '<em>Section</em>'.
+ * @generated
+ */
+ WelcomeSection createWelcomeSection();
+
+ /**
+ * Returns the package supported by this factory.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ *
+ * @return the package supported by this factory.
+ * @generated
+ */
+ WelcomePackage getWelcomePackage();
+
+} // WelcomeFactory
diff --git a/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/src-gen/org/eclipse/papyrus/infra/editor/welcome/WelcomePackage.java b/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/src-gen/org/eclipse/papyrus/infra/editor/welcome/WelcomePackage.java
new file mode 100644
index 00000000000..1cb0e97eab8
--- /dev/null
+++ b/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/src-gen/org/eclipse/papyrus/infra/editor/welcome/WelcomePackage.java
@@ -0,0 +1,528 @@
+/**
+ * Copyright (c) 2015 Christian W. Damus and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Christian W. Damus - Initial API and implementation
+ *
+ */
+package org.eclipse.papyrus.infra.editor.welcome;
+
+import org.eclipse.emf.ecore.EAttribute;
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.EOperation;
+import org.eclipse.emf.ecore.EPackage;
+import org.eclipse.emf.ecore.EReference;
+
+/**
+ * <!-- begin-user-doc -->
+ * The <b>Package</b> for the model.
+ * It contains accessors for the meta objects to represent
+ * <ul>
+ * <li>each class,</li>
+ * <li>each feature of each class,</li>
+ * <li>each operation of each class,</li>
+ * <li>each enum,</li>
+ * <li>and each data type</li>
+ * </ul>
+ * <!-- end-user-doc -->
+ *
+ * @see org.eclipse.papyrus.infra.editor.welcome.WelcomeFactory
+ * @model kind="package"
+ * @generated
+ */
+public interface WelcomePackage extends EPackage {
+ /**
+ * The package name.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ *
+ * @generated
+ */
+ String eNAME = "welcome"; //$NON-NLS-1$
+
+ /**
+ * The package namespace URI.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ *
+ * @generated
+ */
+ String eNS_URI = "http://www.eclipse.org/Papyrus/2015/editor/welcome"; //$NON-NLS-1$
+
+ /**
+ * The package namespace name.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ *
+ * @generated
+ */
+ String eNS_PREFIX = "welcome"; //$NON-NLS-1$
+
+ /**
+ * The singleton instance of the package.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ *
+ * @generated
+ */
+ WelcomePackage eINSTANCE = org.eclipse.papyrus.infra.editor.welcome.internal.impl.WelcomePackageImpl.init();
+
+ /**
+ * The meta object id for the '{@link org.eclipse.papyrus.infra.editor.welcome.internal.impl.WelcomeImpl <em>Welcome</em>}' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ *
+ * @see org.eclipse.papyrus.infra.editor.welcome.internal.impl.WelcomeImpl
+ * @see org.eclipse.papyrus.infra.editor.welcome.internal.impl.WelcomePackageImpl#getWelcome()
+ * @generated
+ */
+ int WELCOME = 0;
+
+ /**
+ * The feature id for the '<em><b>Welcome Page</b></em>' containment reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ *
+ * @generated
+ * @ordered
+ */
+ int WELCOME__WELCOME_PAGE = 0;
+
+ /**
+ * The number of structural features of the '<em>Welcome</em>' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ *
+ * @generated
+ * @ordered
+ */
+ int WELCOME_FEATURE_COUNT = 1;
+
+ /**
+ * The number of operations of the '<em>Welcome</em>' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ *
+ * @generated
+ * @ordered
+ */
+ int WELCOME_OPERATION_COUNT = 0;
+
+
+ /**
+ * The meta object id for the '{@link org.eclipse.papyrus.infra.editor.welcome.internal.impl.WelcomePageImpl <em>Page</em>}' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ *
+ * @see org.eclipse.papyrus.infra.editor.welcome.internal.impl.WelcomePageImpl
+ * @see org.eclipse.papyrus.infra.editor.welcome.internal.impl.WelcomePackageImpl#getWelcomePage()
+ * @generated
+ */
+ int WELCOME_PAGE = 1;
+
+ /**
+ * The feature id for the '<em><b>Section</b></em>' containment reference list.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ *
+ * @generated
+ * @ordered
+ */
+ int WELCOME_PAGE__SECTION = 0;
+
+ /**
+ * The feature id for the '<em><b>Visible Section</b></em>' reference list.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ *
+ * @generated
+ * @ordered
+ */
+ int WELCOME_PAGE__VISIBLE_SECTION = 1;
+
+ /**
+ * The number of structural features of the '<em>Page</em>' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ *
+ * @generated
+ * @ordered
+ */
+ int WELCOME_PAGE_FEATURE_COUNT = 2;
+
+ /**
+ * The operation id for the '<em>Get Visible Sections</em>' operation.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ *
+ * @generated
+ * @ordered
+ */
+ int WELCOME_PAGE___GET_VISIBLE_SECTIONS = 0;
+
+ /**
+ * The operation id for the '<em>Get Section</em>' operation.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ *
+ * @generated
+ * @ordered
+ */
+ int WELCOME_PAGE___GET_SECTION__STRING = 1;
+
+ /**
+ * The number of operations of the '<em>Page</em>' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ *
+ * @generated
+ * @ordered
+ */
+ int WELCOME_PAGE_OPERATION_COUNT = 2;
+
+ /**
+ * The meta object id for the '{@link org.eclipse.papyrus.infra.editor.welcome.internal.impl.WelcomeSectionImpl <em>Section</em>}' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ *
+ * @see org.eclipse.papyrus.infra.editor.welcome.internal.impl.WelcomeSectionImpl
+ * @see org.eclipse.papyrus.infra.editor.welcome.internal.impl.WelcomePackageImpl#getWelcomeSection()
+ * @generated
+ */
+ int WELCOME_SECTION = 2;
+
+ /**
+ * The feature id for the '<em><b>Identifier</b></em>' attribute list.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ *
+ * @generated
+ * @ordered
+ */
+ int WELCOME_SECTION__IDENTIFIER = 0;
+
+ /**
+ * The feature id for the '<em><b>Hidden</b></em>' attribute.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ *
+ * @generated
+ * @ordered
+ */
+ int WELCOME_SECTION__HIDDEN = 1;
+
+ /**
+ * The feature id for the '<em><b>Page</b></em>' container reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ *
+ * @generated
+ * @ordered
+ */
+ int WELCOME_SECTION__PAGE = 2;
+
+ /**
+ * The number of structural features of the '<em>Section</em>' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ *
+ * @generated
+ * @ordered
+ */
+ int WELCOME_SECTION_FEATURE_COUNT = 3;
+
+ /**
+ * The operation id for the '<em>Is Identified By</em>' operation.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ *
+ * @generated
+ * @ordered
+ */
+ int WELCOME_SECTION___IS_IDENTIFIED_BY__STRING = 0;
+
+ /**
+ * The number of operations of the '<em>Section</em>' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ *
+ * @generated
+ * @ordered
+ */
+ int WELCOME_SECTION_OPERATION_COUNT = 1;
+
+
+ /**
+ * Returns the meta object for class '{@link org.eclipse.papyrus.infra.editor.welcome.Welcome <em>Welcome</em>}'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ *
+ * @return the meta object for class '<em>Welcome</em>'.
+ * @see org.eclipse.papyrus.infra.editor.welcome.Welcome
+ * @generated
+ */
+ EClass getWelcome();
+
+ /**
+ * Returns the meta object for the containment reference '{@link org.eclipse.papyrus.infra.editor.welcome.Welcome#getWelcomePage <em>Welcome Page</em>}'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ *
+ * @return the meta object for the containment reference '<em>Welcome Page</em>'.
+ * @see org.eclipse.papyrus.infra.editor.welcome.Welcome#getWelcomePage()
+ * @see #getWelcome()
+ * @generated
+ */
+ EReference getWelcome_WelcomePage();
+
+ /**
+ * Returns the meta object for class '{@link org.eclipse.papyrus.infra.editor.welcome.WelcomePage <em>Page</em>}'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ *
+ * @return the meta object for class '<em>Page</em>'.
+ * @see org.eclipse.papyrus.infra.editor.welcome.WelcomePage
+ * @generated
+ */
+ EClass getWelcomePage();
+
+ /**
+ * Returns the meta object for the containment reference list '{@link org.eclipse.papyrus.infra.editor.welcome.WelcomePage#getSections <em>Section</em>}'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ *
+ * @return the meta object for the containment reference list '<em>Section</em>'.
+ * @see org.eclipse.papyrus.infra.editor.welcome.WelcomePage#getSections()
+ * @see #getWelcomePage()
+ * @generated
+ */
+ EReference getWelcomePage_Section();
+
+ /**
+ * Returns the meta object for the reference list '{@link org.eclipse.papyrus.infra.editor.welcome.WelcomePage#getVisibleSections <em>Visible Section</em>}'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ *
+ * @return the meta object for the reference list '<em>Visible Section</em>'.
+ * @see org.eclipse.papyrus.infra.editor.welcome.WelcomePage#getVisibleSections()
+ * @see #getWelcomePage()
+ * @generated
+ */
+ EReference getWelcomePage_VisibleSection();
+
+ /**
+ * Returns the meta object for the '{@link org.eclipse.papyrus.infra.editor.welcome.WelcomePage#getVisibleSections() <em>Get Visible Sections</em>}' operation.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ *
+ * @return the meta object for the '<em>Get Visible Sections</em>' operation.
+ * @see org.eclipse.papyrus.infra.editor.welcome.WelcomePage#getVisibleSections()
+ * @generated
+ */
+ EOperation getWelcomePage__GetVisibleSections();
+
+ /**
+ * Returns the meta object for the '{@link org.eclipse.papyrus.infra.editor.welcome.WelcomePage#getSection(java.lang.String) <em>Get Section</em>}' operation.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ *
+ * @return the meta object for the '<em>Get Section</em>' operation.
+ * @see org.eclipse.papyrus.infra.editor.welcome.WelcomePage#getSection(java.lang.String)
+ * @generated
+ */
+ EOperation getWelcomePage__GetSection__String();
+
+ /**
+ * Returns the meta object for class '{@link org.eclipse.papyrus.infra.editor.welcome.WelcomeSection <em>Section</em>}'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ *
+ * @return the meta object for class '<em>Section</em>'.
+ * @see org.eclipse.papyrus.infra.editor.welcome.WelcomeSection
+ * @generated
+ */
+ EClass getWelcomeSection();
+
+ /**
+ * Returns the meta object for the attribute list '{@link org.eclipse.papyrus.infra.editor.welcome.WelcomeSection#getIdentifiers <em>Identifier</em>}'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ *
+ * @return the meta object for the attribute list '<em>Identifier</em>'.
+ * @see org.eclipse.papyrus.infra.editor.welcome.WelcomeSection#getIdentifiers()
+ * @see #getWelcomeSection()
+ * @generated
+ */
+ EAttribute getWelcomeSection_Identifier();
+
+ /**
+ * Returns the meta object for the attribute '{@link org.eclipse.papyrus.infra.editor.welcome.WelcomeSection#isHidden <em>Hidden</em>}'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ *
+ * @return the meta object for the attribute '<em>Hidden</em>'.
+ * @see org.eclipse.papyrus.infra.editor.welcome.WelcomeSection#isHidden()
+ * @see #getWelcomeSection()
+ * @generated
+ */
+ EAttribute getWelcomeSection_Hidden();
+
+ /**
+ * Returns the meta object for the container reference '{@link org.eclipse.papyrus.infra.editor.welcome.WelcomeSection#getPage <em>Page</em>}'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ *
+ * @return the meta object for the container reference '<em>Page</em>'.
+ * @see org.eclipse.papyrus.infra.editor.welcome.WelcomeSection#getPage()
+ * @see #getWelcomeSection()
+ * @generated
+ */
+ EReference getWelcomeSection_Page();
+
+ /**
+ * Returns the meta object for the '{@link org.eclipse.papyrus.infra.editor.welcome.WelcomeSection#isIdentifiedBy(java.lang.String) <em>Is Identified By</em>}' operation.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ *
+ * @return the meta object for the '<em>Is Identified By</em>' operation.
+ * @see org.eclipse.papyrus.infra.editor.welcome.WelcomeSection#isIdentifiedBy(java.lang.String)
+ * @generated
+ */
+ EOperation getWelcomeSection__IsIdentifiedBy__String();
+
+ /**
+ * Returns the factory that creates the instances of the model.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ *
+ * @return the factory that creates the instances of the model.
+ * @generated
+ */
+ WelcomeFactory getWelcomeFactory();
+
+ /**
+ * <!-- begin-user-doc -->
+ * Defines literals for the meta objects that represent
+ * <ul>
+ * <li>each class,</li>
+ * <li>each feature of each class,</li>
+ * <li>each operation of each class,</li>
+ * <li>each enum,</li>
+ * <li>and each data type</li>
+ * </ul>
+ * <!-- end-user-doc -->
+ *
+ * @generated
+ */
+ interface Literals {
+ /**
+ * The meta object literal for the '{@link org.eclipse.papyrus.infra.editor.welcome.internal.impl.WelcomeImpl <em>Welcome</em>}' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ *
+ * @see org.eclipse.papyrus.infra.editor.welcome.internal.impl.WelcomeImpl
+ * @see org.eclipse.papyrus.infra.editor.welcome.internal.impl.WelcomePackageImpl#getWelcome()
+ * @generated
+ */
+ EClass WELCOME = eINSTANCE.getWelcome();
+ /**
+ * The meta object literal for the '<em><b>Welcome Page</b></em>' containment reference feature.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ *
+ * @generated
+ */
+ EReference WELCOME__WELCOME_PAGE = eINSTANCE.getWelcome_WelcomePage();
+ /**
+ * The meta object literal for the '{@link org.eclipse.papyrus.infra.editor.welcome.internal.impl.WelcomePageImpl <em>Page</em>}' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ *
+ * @see org.eclipse.papyrus.infra.editor.welcome.internal.impl.WelcomePageImpl
+ * @see org.eclipse.papyrus.infra.editor.welcome.internal.impl.WelcomePackageImpl#getWelcomePage()
+ * @generated
+ */
+ EClass WELCOME_PAGE = eINSTANCE.getWelcomePage();
+ /**
+ * The meta object literal for the '<em><b>Section</b></em>' containment reference list feature.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ *
+ * @generated
+ */
+ EReference WELCOME_PAGE__SECTION = eINSTANCE.getWelcomePage_Section();
+ /**
+ * The meta object literal for the '<em><b>Visible Section</b></em>' reference list feature.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ *
+ * @generated
+ */
+ EReference WELCOME_PAGE__VISIBLE_SECTION = eINSTANCE.getWelcomePage_VisibleSection();
+ /**
+ * The meta object literal for the '<em><b>Get Visible Sections</b></em>' operation.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ *
+ * @generated
+ */
+ EOperation WELCOME_PAGE___GET_VISIBLE_SECTIONS = eINSTANCE.getWelcomePage__GetVisibleSections();
+ /**
+ * The meta object literal for the '<em><b>Get Section</b></em>' operation.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ *
+ * @generated
+ */
+ EOperation WELCOME_PAGE___GET_SECTION__STRING = eINSTANCE.getWelcomePage__GetSection__String();
+ /**
+ * The meta object literal for the '{@link org.eclipse.papyrus.infra.editor.welcome.internal.impl.WelcomeSectionImpl <em>Section</em>}' class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ *
+ * @see org.eclipse.papyrus.infra.editor.welcome.internal.impl.WelcomeSectionImpl
+ * @see org.eclipse.papyrus.infra.editor.welcome.internal.impl.WelcomePackageImpl#getWelcomeSection()
+ * @generated
+ */
+ EClass WELCOME_SECTION = eINSTANCE.getWelcomeSection();
+ /**
+ * The meta object literal for the '<em><b>Identifier</b></em>' attribute list feature.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ *
+ * @generated
+ */
+ EAttribute WELCOME_SECTION__IDENTIFIER = eINSTANCE.getWelcomeSection_Identifier();
+ /**
+ * The meta object literal for the '<em><b>Hidden</b></em>' attribute feature.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ *
+ * @generated
+ */
+ EAttribute WELCOME_SECTION__HIDDEN = eINSTANCE.getWelcomeSection_Hidden();
+ /**
+ * The meta object literal for the '<em><b>Page</b></em>' container reference feature.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ *
+ * @generated
+ */
+ EReference WELCOME_SECTION__PAGE = eINSTANCE.getWelcomeSection_Page();
+ /**
+ * The meta object literal for the '<em><b>Is Identified By</b></em>' operation.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ *
+ * @generated
+ */
+ EOperation WELCOME_SECTION___IS_IDENTIFIED_BY__STRING = eINSTANCE.getWelcomeSection__IsIdentifiedBy__String();
+
+ }
+
+} // WelcomePackage
diff --git a/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/src-gen/org/eclipse/papyrus/infra/editor/welcome/WelcomePage.java b/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/src-gen/org/eclipse/papyrus/infra/editor/welcome/WelcomePage.java
new file mode 100644
index 00000000000..9b33d119517
--- /dev/null
+++ b/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/src-gen/org/eclipse/papyrus/infra/editor/welcome/WelcomePage.java
@@ -0,0 +1,110 @@
+/**
+ * Copyright (c) 2015 Christian W. Damus and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Christian W. Damus - Initial API and implementation
+ *
+ */
+package org.eclipse.papyrus.infra.editor.welcome;
+
+import org.eclipse.emf.common.util.EList;
+
+import org.eclipse.emf.ecore.EObject;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Page</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ * <li>{@link org.eclipse.papyrus.infra.editor.welcome.WelcomePage#getSections <em>Section</em>}</li>
+ * <li>{@link org.eclipse.papyrus.infra.editor.welcome.WelcomePage#getVisibleSections <em>Visible Section</em>}</li>
+ * </ul>
+ *
+ * @see org.eclipse.papyrus.infra.editor.welcome.WelcomePackage#getWelcomePage()
+ * @model
+ * @generated
+ */
+public interface WelcomePage extends EObject {
+ /**
+ * Returns the value of the '<em><b>Section</b></em>' containment reference list.
+ * The list contents are of type {@link org.eclipse.papyrus.infra.editor.welcome.WelcomeSection}.
+ * It is bidirectional and its opposite is '{@link org.eclipse.papyrus.infra.editor.welcome.WelcomeSection#getPage <em>Page</em>}'.
+ * <!-- begin-user-doc -->
+ * <p>
+ * If the meaning of the '<em>Section</em>' containment reference list isn't clear,
+ * there really should be more of a description here...
+ * </p>
+ * <!-- end-user-doc -->
+ *
+ * @return the value of the '<em>Section</em>' containment reference list.
+ * @see org.eclipse.papyrus.infra.editor.welcome.WelcomePackage#getWelcomePage_Section()
+ * @see org.eclipse.papyrus.infra.editor.welcome.WelcomeSection#getPage
+ * @model opposite="page" containment="true"
+ * @generated
+ */
+ EList<WelcomeSection> getSections();
+
+ /**
+ * Creates a new {@link org.eclipse.papyrus.infra.editor.welcome.WelcomeSection} and appends it to the '<em><b>Section</b></em>' containment reference list.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ *
+ * @return The new {@link org.eclipse.papyrus.infra.editor.welcome.WelcomeSection}.
+ * @see #getSections()
+ * @generated
+ */
+ WelcomeSection createSection();
+
+ /**
+ * Returns the value of the '<em><b>Visible Section</b></em>' reference list.
+ * The list contents are of type {@link org.eclipse.papyrus.infra.editor.welcome.WelcomeSection}.
+ * <p>
+ * This feature subsets the following features:
+ * </p>
+ * <ul>
+ * <li>'{@link org.eclipse.papyrus.infra.editor.welcome.WelcomePage#getSections() <em>Section</em>}'</li>
+ * </ul>
+ * <!-- begin-user-doc -->
+ * <p>
+ * If the meaning of the '<em>Visible Section</em>' reference list isn't clear,
+ * there really should be more of a description here...
+ * </p>
+ * <!-- end-user-doc -->
+ *
+ * @return the value of the '<em>Visible Section</em>' reference list.
+ * @see org.eclipse.papyrus.infra.editor.welcome.WelcomePackage#getWelcomePage_VisibleSection()
+ * @model transient="true" volatile="true" derived="true"
+ * @generated
+ */
+ EList<WelcomeSection> getVisibleSections();
+
+ /**
+ * Creates a new {@link org.eclipse.papyrus.infra.editor.welcome.WelcomeSection} and appends it to the '<em><b>Visible Section</b></em>' reference list.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ *
+ * @return The new {@link org.eclipse.papyrus.infra.editor.welcome.WelcomeSection}.
+ * @see #getVisibleSections()
+ * @generated
+ */
+ WelcomeSection createVisibleSection();
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ *
+ * @model ordered="false" identifierDataType="org.eclipse.uml2.types.String" identifierRequired="true" identifierOrdered="false"
+ * @generated
+ */
+ WelcomeSection getSection(String identifier);
+
+} // WelcomePage
diff --git a/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/src-gen/org/eclipse/papyrus/infra/editor/welcome/WelcomeSection.java b/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/src-gen/org/eclipse/papyrus/infra/editor/welcome/WelcomeSection.java
new file mode 100644
index 00000000000..1bbe976e912
--- /dev/null
+++ b/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/src-gen/org/eclipse/papyrus/infra/editor/welcome/WelcomeSection.java
@@ -0,0 +1,123 @@
+/**
+ * Copyright (c) 2015 Christian W. Damus and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Christian W. Damus - Initial API and implementation
+ *
+ */
+package org.eclipse.papyrus.infra.editor.welcome;
+
+import org.eclipse.emf.common.util.EList;
+import org.eclipse.emf.ecore.EObject;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Section</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ * <li>{@link org.eclipse.papyrus.infra.editor.welcome.WelcomeSection#getIdentifiers <em>Identifier</em>}</li>
+ * <li>{@link org.eclipse.papyrus.infra.editor.welcome.WelcomeSection#isHidden <em>Hidden</em>}</li>
+ * <li>{@link org.eclipse.papyrus.infra.editor.welcome.WelcomeSection#getPage <em>Page</em>}</li>
+ * </ul>
+ *
+ * @see org.eclipse.papyrus.infra.editor.welcome.WelcomePackage#getWelcomeSection()
+ * @model
+ * @generated
+ */
+public interface WelcomeSection extends EObject {
+ /**
+ * Returns the value of the '<em><b>Identifier</b></em>' attribute list.
+ * The list contents are of type {@link java.lang.String}.
+ * <!-- begin-user-doc -->
+ * <p>
+ * If the meaning of the '<em>Identifier</em>' attribute list isn't clear,
+ * there really should be more of a description here...
+ * </p>
+ * <!-- end-user-doc -->
+ *
+ * @return the value of the '<em>Identifier</em>' attribute list.
+ * @see org.eclipse.papyrus.infra.editor.welcome.WelcomePackage#getWelcomeSection_Identifier()
+ * @model dataType="org.eclipse.uml2.types.String" required="true" ordered="false"
+ * @generated
+ */
+ EList<String> getIdentifiers();
+
+ /**
+ * Returns the value of the '<em><b>Hidden</b></em>' attribute.
+ * <!-- begin-user-doc -->
+ * <p>
+ * If the meaning of the '<em>Hidden</em>' attribute isn't clear,
+ * there really should be more of a description here...
+ * </p>
+ * <!-- end-user-doc -->
+ *
+ * @return the value of the '<em>Hidden</em>' attribute.
+ * @see #setHidden(boolean)
+ * @see org.eclipse.papyrus.infra.editor.welcome.WelcomePackage#getWelcomeSection_Hidden()
+ * @model dataType="org.eclipse.uml2.types.Boolean" required="true" ordered="false"
+ * @generated
+ */
+ boolean isHidden();
+
+ /**
+ * Sets the value of the '{@link org.eclipse.papyrus.infra.editor.welcome.WelcomeSection#isHidden <em>Hidden</em>}' attribute.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ *
+ * @param value
+ * the new value of the '<em>Hidden</em>' attribute.
+ * @see #isHidden()
+ * @generated
+ */
+ void setHidden(boolean value);
+
+ /**
+ * Returns the value of the '<em><b>Page</b></em>' container reference.
+ * It is bidirectional and its opposite is '{@link org.eclipse.papyrus.infra.editor.welcome.WelcomePage#getSections <em>Section</em>}'.
+ * <!-- begin-user-doc -->
+ * <p>
+ * If the meaning of the '<em>Page</em>' container reference isn't clear,
+ * there really should be more of a description here...
+ * </p>
+ * <!-- end-user-doc -->
+ *
+ * @return the value of the '<em>Page</em>' container reference.
+ * @see #setPage(WelcomePage)
+ * @see org.eclipse.papyrus.infra.editor.welcome.WelcomePackage#getWelcomeSection_Page()
+ * @see org.eclipse.papyrus.infra.editor.welcome.WelcomePage#getSections
+ * @model opposite="section" required="true" transient="false" ordered="false"
+ * @generated
+ */
+ WelcomePage getPage();
+
+ /**
+ * Sets the value of the '{@link org.eclipse.papyrus.infra.editor.welcome.WelcomeSection#getPage <em>Page</em>}' container reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ *
+ * @param value
+ * the new value of the '<em>Page</em>' container reference.
+ * @see #getPage()
+ * @generated
+ */
+ void setPage(WelcomePage value);
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ *
+ * @model dataType="org.eclipse.uml2.types.Boolean" required="true" ordered="false" identifierDataType="org.eclipse.uml2.types.String" identifierRequired="true" identifierOrdered="false"
+ * @generated
+ */
+ boolean isIdentifiedBy(String identifier);
+
+} // WelcomeSection
diff --git a/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/src-gen/org/eclipse/papyrus/infra/editor/welcome/internal/impl/WelcomeFactoryImpl.java b/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/src-gen/org/eclipse/papyrus/infra/editor/welcome/internal/impl/WelcomeFactoryImpl.java
new file mode 100644
index 00000000000..fcf7a70f42a
--- /dev/null
+++ b/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/src-gen/org/eclipse/papyrus/infra/editor/welcome/internal/impl/WelcomeFactoryImpl.java
@@ -0,0 +1,142 @@
+/**
+ * Copyright (c) 2015 Christian W. Damus and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Christian W. Damus - Initial API and implementation
+ *
+ */
+package org.eclipse.papyrus.infra.editor.welcome.internal.impl;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.EPackage;
+
+import org.eclipse.emf.ecore.impl.EFactoryImpl;
+
+import org.eclipse.emf.ecore.plugin.EcorePlugin;
+
+import org.eclipse.papyrus.infra.editor.welcome.*;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model <b>Factory</b>.
+ * <!-- end-user-doc -->
+ *
+ * @generated
+ */
+public class WelcomeFactoryImpl extends EFactoryImpl implements WelcomeFactory {
+ /**
+ * Creates the default factory implementation.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ *
+ * @generated
+ */
+ public static WelcomeFactory init() {
+ try {
+ WelcomeFactory theWelcomeFactory = (WelcomeFactory) EPackage.Registry.INSTANCE.getEFactory(WelcomePackage.eNS_URI);
+ if (theWelcomeFactory != null) {
+ return theWelcomeFactory;
+ }
+ } catch (Exception exception) {
+ EcorePlugin.INSTANCE.log(exception);
+ }
+ return new WelcomeFactoryImpl();
+ }
+
+ /**
+ * Creates an instance of the factory.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ *
+ * @generated
+ */
+ public WelcomeFactoryImpl() {
+ super();
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ *
+ * @generated
+ */
+ @Override
+ public EObject create(EClass eClass) {
+ switch (eClass.getClassifierID()) {
+ case WelcomePackage.WELCOME:
+ return createWelcome();
+ case WelcomePackage.WELCOME_PAGE:
+ return createWelcomePage();
+ case WelcomePackage.WELCOME_SECTION:
+ return createWelcomeSection();
+ default:
+ throw new IllegalArgumentException("The class '" + eClass.getName() + "' is not a valid classifier"); //$NON-NLS-1$ //$NON-NLS-2$
+ }
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ *
+ * @generated
+ */
+ @Override
+ public Welcome createWelcome() {
+ WelcomeImpl welcome = new WelcomeImpl();
+ return welcome;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ *
+ * @generated
+ */
+ @Override
+ public WelcomePage createWelcomePage() {
+ WelcomePageImpl welcomePage = new WelcomePageImpl();
+ return welcomePage;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ *
+ * @generated
+ */
+ @Override
+ public WelcomeSection createWelcomeSection() {
+ WelcomeSectionImpl welcomeSection = new WelcomeSectionImpl();
+ return welcomeSection;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ *
+ * @generated
+ */
+ @Override
+ public WelcomePackage getWelcomePackage() {
+ return (WelcomePackage) getEPackage();
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ *
+ * @deprecated
+ * @generated
+ */
+ @Deprecated
+ public static WelcomePackage getPackage() {
+ return WelcomePackage.eINSTANCE;
+ }
+
+} // WelcomeFactoryImpl
diff --git a/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/src-gen/org/eclipse/papyrus/infra/editor/welcome/internal/impl/WelcomeImpl.java b/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/src-gen/org/eclipse/papyrus/infra/editor/welcome/internal/impl/WelcomeImpl.java
new file mode 100644
index 00000000000..c545f535099
--- /dev/null
+++ b/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/src-gen/org/eclipse/papyrus/infra/editor/welcome/internal/impl/WelcomeImpl.java
@@ -0,0 +1,250 @@
+/**
+ * Copyright (c) 2015 Christian W. Damus and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Christian W. Damus - Initial API and implementation
+ *
+ */
+package org.eclipse.papyrus.infra.editor.welcome.internal.impl;
+
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.notify.NotificationChain;
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.EObject;
+
+import org.eclipse.emf.ecore.InternalEObject;
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+import org.eclipse.emf.ecore.impl.MinimalEObjectImpl;
+
+import org.eclipse.emf.ecore.util.EcoreUtil;
+
+import org.eclipse.papyrus.infra.editor.welcome.Welcome;
+import org.eclipse.papyrus.infra.editor.welcome.WelcomePackage;
+
+import org.eclipse.papyrus.infra.editor.welcome.WelcomePage;
+import org.eclipse.uml2.common.util.CacheAdapter;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Welcome</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ * <li>{@link org.eclipse.papyrus.infra.editor.welcome.internal.impl.WelcomeImpl#getWelcomePage <em>Welcome Page</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class WelcomeImpl extends MinimalEObjectImpl.Container implements Welcome {
+ /**
+ * The cached value of the '{@link #getWelcomePage() <em>Welcome Page</em>}' containment reference.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ *
+ * @see #getWelcomePage()
+ * @generated
+ * @ordered
+ */
+ protected WelcomePage welcomePage;
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ *
+ * @generated
+ */
+ protected WelcomeImpl() {
+ super();
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ *
+ * @generated
+ */
+ @Override
+ protected EClass eStaticClass() {
+ return WelcomePackage.Literals.WELCOME;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ *
+ * @generated
+ */
+ @Override
+ public WelcomePage getWelcomePage() {
+ return welcomePage;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ *
+ * @generated
+ */
+ public NotificationChain basicSetWelcomePage(WelcomePage newWelcomePage, NotificationChain msgs) {
+ WelcomePage oldWelcomePage = welcomePage;
+ welcomePage = newWelcomePage;
+ if (eNotificationRequired()) {
+ ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, WelcomePackage.WELCOME__WELCOME_PAGE, oldWelcomePage, newWelcomePage);
+ if (msgs == null) {
+ msgs = notification;
+ } else {
+ msgs.add(notification);
+ }
+ }
+ return msgs;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ *
+ * @generated
+ */
+ @Override
+ public void setWelcomePage(WelcomePage newWelcomePage) {
+ if (newWelcomePage != welcomePage) {
+ NotificationChain msgs = null;
+ if (welcomePage != null) {
+ msgs = ((InternalEObject) welcomePage).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - WelcomePackage.WELCOME__WELCOME_PAGE, null, msgs);
+ }
+ if (newWelcomePage != null) {
+ msgs = ((InternalEObject) newWelcomePage).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - WelcomePackage.WELCOME__WELCOME_PAGE, null, msgs);
+ }
+ msgs = basicSetWelcomePage(newWelcomePage, msgs);
+ if (msgs != null) {
+ msgs.dispatch();
+ }
+ } else if (eNotificationRequired()) {
+ eNotify(new ENotificationImpl(this, Notification.SET, WelcomePackage.WELCOME__WELCOME_PAGE, newWelcomePage, newWelcomePage));
+ }
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ *
+ * @generated
+ */
+ @Override
+ public WelcomePage createWelcomePage() {
+ WelcomePage newWelcomePage = (WelcomePage) create(WelcomePackage.Literals.WELCOME_PAGE);
+ setWelcomePage(newWelcomePage);
+ return newWelcomePage;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ *
+ * @generated
+ */
+ @Override
+ public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
+ switch (featureID) {
+ case WelcomePackage.WELCOME__WELCOME_PAGE:
+ return basicSetWelcomePage(null, msgs);
+ }
+ return super.eInverseRemove(otherEnd, featureID, msgs);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ *
+ * @generated
+ */
+ @Override
+ public Object eGet(int featureID, boolean resolve, boolean coreType) {
+ switch (featureID) {
+ case WelcomePackage.WELCOME__WELCOME_PAGE:
+ return getWelcomePage();
+ }
+ return super.eGet(featureID, resolve, coreType);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ *
+ * @generated
+ */
+ @Override
+ public void eSet(int featureID, Object newValue) {
+ switch (featureID) {
+ case WelcomePackage.WELCOME__WELCOME_PAGE:
+ setWelcomePage((WelcomePage) newValue);
+ return;
+ }
+ super.eSet(featureID, newValue);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ *
+ * @generated
+ */
+ @Override
+ public void eUnset(int featureID) {
+ switch (featureID) {
+ case WelcomePackage.WELCOME__WELCOME_PAGE:
+ setWelcomePage((WelcomePage) null);
+ return;
+ }
+ super.eUnset(featureID);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ *
+ * @generated
+ */
+ @Override
+ public boolean eIsSet(int featureID) {
+ switch (featureID) {
+ case WelcomePackage.WELCOME__WELCOME_PAGE:
+ return welcomePage != null;
+ }
+ return super.eIsSet(featureID);
+ }
+
+ /**
+ * Creates a new instance of the specified Ecore class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ *
+ * @param eClass
+ * The Ecore class of the instance to create.
+ * @return The new instance.
+ * @generated
+ */
+ protected EObject create(EClass eClass) {
+ return EcoreUtil.create(eClass);
+ }
+
+ /**
+ * Retrieves the cache adapter for this '<em><b>Welcome</b></em>'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ *
+ * @return The cache adapter for this '<em><b>Welcome</b></em>'.
+ * @generated
+ */
+ protected CacheAdapter getCacheAdapter() {
+ return CacheAdapter.getCacheAdapter(this);
+ }
+
+} // WelcomeImpl
diff --git a/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/src-gen/org/eclipse/papyrus/infra/editor/welcome/internal/impl/WelcomePackageImpl.java b/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/src-gen/org/eclipse/papyrus/infra/editor/welcome/internal/impl/WelcomePackageImpl.java
new file mode 100644
index 00000000000..4c974a00096
--- /dev/null
+++ b/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/src-gen/org/eclipse/papyrus/infra/editor/welcome/internal/impl/WelcomePackageImpl.java
@@ -0,0 +1,401 @@
+/**
+ * Copyright (c) 2015 Christian W. Damus and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Christian W. Damus - Initial API and implementation
+ *
+ */
+package org.eclipse.papyrus.infra.editor.welcome.internal.impl;
+
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.emf.ecore.EAttribute;
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.EOperation;
+import org.eclipse.emf.ecore.EPackage;
+
+import org.eclipse.emf.ecore.EReference;
+import org.eclipse.emf.ecore.impl.EPackageImpl;
+
+import org.eclipse.papyrus.infra.editor.welcome.Welcome;
+import org.eclipse.papyrus.infra.editor.welcome.WelcomeFactory;
+import org.eclipse.papyrus.infra.editor.welcome.WelcomePackage;
+import org.eclipse.papyrus.infra.editor.welcome.WelcomePage;
+import org.eclipse.papyrus.infra.editor.welcome.WelcomeSection;
+import org.eclipse.uml2.types.TypesPackage;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model <b>Package</b>.
+ * <!-- end-user-doc -->
+ *
+ * @generated
+ */
+public class WelcomePackageImpl extends EPackageImpl implements WelcomePackage {
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ *
+ * @generated
+ */
+ private EClass welcomeEClass = null;
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ *
+ * @generated
+ */
+ private EClass welcomePageEClass = null;
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ *
+ * @generated
+ */
+ private EClass welcomeSectionEClass = null;
+
+ /**
+ * Creates an instance of the model <b>Package</b>, registered with
+ * {@link org.eclipse.emf.ecore.EPackage.Registry EPackage.Registry} by the package
+ * package URI value.
+ * <p>
+ * Note: the correct way to create the package is via the static
+ * factory method {@link #init init()}, which also performs
+ * initialization of the package, or returns the registered package,
+ * if one already exists.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ *
+ * @see org.eclipse.emf.ecore.EPackage.Registry
+ * @see org.eclipse.papyrus.infra.editor.welcome.WelcomePackage#eNS_URI
+ * @see #init()
+ * @generated
+ */
+ private WelcomePackageImpl() {
+ super(eNS_URI, WelcomeFactory.eINSTANCE);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ *
+ * @generated
+ */
+ private static boolean isInited = false;
+
+ /**
+ * Creates, registers, and initializes the <b>Package</b> for this model, and for any others upon which it depends.
+ *
+ * <p>
+ * This method is used to initialize {@link WelcomePackage#eINSTANCE} when that field is accessed.
+ * Clients should not invoke it directly. Instead, they should simply access that field to obtain the package.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ *
+ * @see #eNS_URI
+ * @see #createPackageContents()
+ * @see #initializePackageContents()
+ * @generated
+ */
+ public static WelcomePackage init() {
+ if (isInited) {
+ return (WelcomePackage) EPackage.Registry.INSTANCE.getEPackage(WelcomePackage.eNS_URI);
+ }
+
+ // Obtain or create and register package
+ WelcomePackageImpl theWelcomePackage = (WelcomePackageImpl) (EPackage.Registry.INSTANCE.get(eNS_URI) instanceof WelcomePackageImpl ? EPackage.Registry.INSTANCE.get(eNS_URI) : new WelcomePackageImpl());
+
+ isInited = true;
+
+ // Initialize simple dependencies
+ TypesPackage.eINSTANCE.eClass();
+
+ // Create package meta-data objects
+ theWelcomePackage.createPackageContents();
+
+ // Initialize created meta-data
+ theWelcomePackage.initializePackageContents();
+
+ // Mark meta-data to indicate it can't be changed
+ theWelcomePackage.freeze();
+
+
+ // Update the registry and return the package
+ EPackage.Registry.INSTANCE.put(WelcomePackage.eNS_URI, theWelcomePackage);
+ return theWelcomePackage;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ *
+ * @generated
+ */
+ @Override
+ public EClass getWelcome() {
+ return welcomeEClass;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ *
+ * @generated
+ */
+ @Override
+ public EReference getWelcome_WelcomePage() {
+ return (EReference) welcomeEClass.getEStructuralFeatures().get(0);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ *
+ * @generated
+ */
+ @Override
+ public EClass getWelcomePage() {
+ return welcomePageEClass;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ *
+ * @generated
+ */
+ @Override
+ public EReference getWelcomePage_Section() {
+ return (EReference) welcomePageEClass.getEStructuralFeatures().get(0);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ *
+ * @generated
+ */
+ @Override
+ public EReference getWelcomePage_VisibleSection() {
+ return (EReference) welcomePageEClass.getEStructuralFeatures().get(1);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ *
+ * @generated
+ */
+ @Override
+ public EOperation getWelcomePage__GetVisibleSections() {
+ return welcomePageEClass.getEOperations().get(0);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ *
+ * @generated
+ */
+ @Override
+ public EOperation getWelcomePage__GetSection__String() {
+ return welcomePageEClass.getEOperations().get(1);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ *
+ * @generated
+ */
+ @Override
+ public EClass getWelcomeSection() {
+ return welcomeSectionEClass;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ *
+ * @generated
+ */
+ @Override
+ public EAttribute getWelcomeSection_Identifier() {
+ return (EAttribute) welcomeSectionEClass.getEStructuralFeatures().get(0);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ *
+ * @generated
+ */
+ @Override
+ public EAttribute getWelcomeSection_Hidden() {
+ return (EAttribute) welcomeSectionEClass.getEStructuralFeatures().get(1);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ *
+ * @generated
+ */
+ @Override
+ public EReference getWelcomeSection_Page() {
+ return (EReference) welcomeSectionEClass.getEStructuralFeatures().get(2);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ *
+ * @generated
+ */
+ @Override
+ public EOperation getWelcomeSection__IsIdentifiedBy__String() {
+ return welcomeSectionEClass.getEOperations().get(0);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ *
+ * @generated
+ */
+ @Override
+ public WelcomeFactory getWelcomeFactory() {
+ return (WelcomeFactory) getEFactoryInstance();
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ *
+ * @generated
+ */
+ private boolean isCreated = false;
+
+ /**
+ * Creates the meta-model objects for the package. This method is
+ * guarded to have no affect on any invocation but its first.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ *
+ * @generated
+ */
+ public void createPackageContents() {
+ if (isCreated) {
+ return;
+ }
+ isCreated = true;
+
+ // Create classes and their features
+ welcomeEClass = createEClass(WELCOME);
+ createEReference(welcomeEClass, WELCOME__WELCOME_PAGE);
+
+ welcomePageEClass = createEClass(WELCOME_PAGE);
+ createEReference(welcomePageEClass, WELCOME_PAGE__SECTION);
+ createEReference(welcomePageEClass, WELCOME_PAGE__VISIBLE_SECTION);
+ createEOperation(welcomePageEClass, WELCOME_PAGE___GET_VISIBLE_SECTIONS);
+ createEOperation(welcomePageEClass, WELCOME_PAGE___GET_SECTION__STRING);
+
+ welcomeSectionEClass = createEClass(WELCOME_SECTION);
+ createEAttribute(welcomeSectionEClass, WELCOME_SECTION__IDENTIFIER);
+ createEAttribute(welcomeSectionEClass, WELCOME_SECTION__HIDDEN);
+ createEReference(welcomeSectionEClass, WELCOME_SECTION__PAGE);
+ createEOperation(welcomeSectionEClass, WELCOME_SECTION___IS_IDENTIFIED_BY__STRING);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ *
+ * @generated
+ */
+ private boolean isInitialized = false;
+
+ /**
+ * Complete the initialization of the package and its meta-model. This
+ * method is guarded to have no affect on any invocation but its first.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ *
+ * @generated
+ */
+ public void initializePackageContents() {
+ if (isInitialized) {
+ return;
+ }
+ isInitialized = true;
+
+ // Initialize package
+ setName(eNAME);
+ setNsPrefix(eNS_PREFIX);
+ setNsURI(eNS_URI);
+
+ // Obtain other dependent packages
+ TypesPackage theTypesPackage = (TypesPackage) EPackage.Registry.INSTANCE.getEPackage(TypesPackage.eNS_URI);
+
+ // Create type parameters
+
+ // Set bounds for type parameters
+
+ // Add supertypes to classes
+
+ // Initialize classes, features, and operations; add parameters
+ initEClass(welcomeEClass, Welcome.class, "Welcome", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
+ initEReference(getWelcome_WelcomePage(), this.getWelcomePage(), null, "welcomePage", null, 0, 1, Welcome.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED); //$NON-NLS-1$
+
+ initEClass(welcomePageEClass, WelcomePage.class, "WelcomePage", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
+ initEReference(getWelcomePage_Section(), this.getWelcomeSection(), this.getWelcomeSection_Page(), "section", null, 0, -1, WelcomePage.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, //$NON-NLS-1$
+ !IS_DERIVED, IS_ORDERED);
+ initEReference(getWelcomePage_VisibleSection(), this.getWelcomeSection(), null, "visibleSection", null, 0, -1, WelcomePage.class, IS_TRANSIENT, IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, IS_DERIVED, //$NON-NLS-1$
+ IS_ORDERED);
+
+ initEOperation(getWelcomePage__GetVisibleSections(), this.getWelcomeSection(), "getVisibleSections", 0, -1, IS_UNIQUE, !IS_ORDERED); //$NON-NLS-1$
+
+ EOperation op = initEOperation(getWelcomePage__GetSection__String(), this.getWelcomeSection(), "getSection", 0, 1, IS_UNIQUE, !IS_ORDERED); //$NON-NLS-1$
+ addEParameter(op, theTypesPackage.getString(), "identifier", 1, 1, IS_UNIQUE, !IS_ORDERED); //$NON-NLS-1$
+
+ initEClass(welcomeSectionEClass, WelcomeSection.class, "WelcomeSection", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
+ initEAttribute(getWelcomeSection_Identifier(), theTypesPackage.getString(), "identifier", null, 1, -1, WelcomeSection.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED); //$NON-NLS-1$
+ initEAttribute(getWelcomeSection_Hidden(), theTypesPackage.getBoolean(), "hidden", null, 1, 1, WelcomeSection.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED); //$NON-NLS-1$
+ initEReference(getWelcomeSection_Page(), this.getWelcomePage(), this.getWelcomePage_Section(), "page", null, 1, 1, WelcomeSection.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, //$NON-NLS-1$
+ !IS_DERIVED, !IS_ORDERED);
+
+ op = initEOperation(getWelcomeSection__IsIdentifiedBy__String(), theTypesPackage.getBoolean(), "isIdentifiedBy", 1, 1, IS_UNIQUE, !IS_ORDERED); //$NON-NLS-1$
+ addEParameter(op, theTypesPackage.getString(), "identifier", 1, 1, IS_UNIQUE, !IS_ORDERED); //$NON-NLS-1$
+
+ // Create resource
+ createResource(eNS_URI);
+
+ // Create annotations
+ // subsets
+ createSubsetsAnnotations();
+ }
+
+ /**
+ * Initializes the annotations for <b>subsets</b>.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ *
+ * @generated
+ */
+ protected void createSubsetsAnnotations() {
+ String source = "subsets"; //$NON-NLS-1$
+ addAnnotation(getWelcomePage_VisibleSection(),
+ source,
+ new String[] {
+ },
+ new URI[] {
+ URI.createURI(eNS_URI).appendFragment("//WelcomePage/section") //$NON-NLS-1$
+ });
+ }
+
+} // WelcomePackageImpl
diff --git a/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/src-gen/org/eclipse/papyrus/infra/editor/welcome/internal/impl/WelcomePageImpl.java b/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/src-gen/org/eclipse/papyrus/infra/editor/welcome/internal/impl/WelcomePageImpl.java
new file mode 100644
index 00000000000..a907c265a26
--- /dev/null
+++ b/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/src-gen/org/eclipse/papyrus/infra/editor/welcome/internal/impl/WelcomePageImpl.java
@@ -0,0 +1,315 @@
+/**
+ * Copyright (c) 2015 Christian W. Damus and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Christian W. Damus - Initial API and implementation
+ *
+ */
+package org.eclipse.papyrus.infra.editor.welcome.internal.impl;
+
+import java.lang.reflect.InvocationTargetException;
+import java.util.Collection;
+
+import org.eclipse.emf.common.notify.NotificationChain;
+
+import org.eclipse.emf.common.util.EList;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.MinimalEObjectImpl;
+
+import org.eclipse.emf.ecore.util.EObjectContainmentWithInverseEList;
+import org.eclipse.emf.ecore.util.EcoreUtil;
+import org.eclipse.emf.ecore.util.InternalEList;
+
+import org.eclipse.papyrus.infra.editor.welcome.WelcomePackage;
+import org.eclipse.papyrus.infra.editor.welcome.WelcomePage;
+import org.eclipse.papyrus.infra.editor.welcome.WelcomeSection;
+
+import org.eclipse.papyrus.infra.editor.welcome.internal.operations.WelcomePageOperations;
+import org.eclipse.uml2.common.util.CacheAdapter;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Page</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ * <li>{@link org.eclipse.papyrus.infra.editor.welcome.internal.impl.WelcomePageImpl#getSections <em>Section</em>}</li>
+ * <li>{@link org.eclipse.papyrus.infra.editor.welcome.internal.impl.WelcomePageImpl#getVisibleSections <em>Visible Section</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class WelcomePageImpl extends MinimalEObjectImpl.Container implements WelcomePage {
+ /**
+ * The cached value of the '{@link #getSections() <em>Section</em>}' containment reference list.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ *
+ * @see #getSections()
+ * @generated
+ * @ordered
+ */
+ protected EList<WelcomeSection> sections;
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ *
+ * @generated
+ */
+ protected WelcomePageImpl() {
+ super();
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ *
+ * @generated
+ */
+ @Override
+ protected EClass eStaticClass() {
+ return WelcomePackage.Literals.WELCOME_PAGE;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ *
+ * @generated
+ */
+ @Override
+ public EList<WelcomeSection> getSections() {
+ if (sections == null) {
+ sections = new EObjectContainmentWithInverseEList<WelcomeSection>(WelcomeSection.class, this, WelcomePackage.WELCOME_PAGE__SECTION, WelcomePackage.WELCOME_SECTION__PAGE);
+ }
+ return sections;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ *
+ * @generated
+ */
+ @Override
+ public WelcomeSection createSection() {
+ WelcomeSection newSection = (WelcomeSection) create(WelcomePackage.Literals.WELCOME_SECTION);
+ getSections().add(newSection);
+ return newSection;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ *
+ * @generated
+ */
+ @Override
+ public EList<WelcomeSection> getVisibleSections() {
+ CacheAdapter cache = getCacheAdapter();
+ if (cache != null) {
+ @SuppressWarnings("unchecked")
+ EList<WelcomeSection> result = (EList<WelcomeSection>) cache.get(eResource(), this, WelcomePackage.Literals.WELCOME_PAGE__VISIBLE_SECTION);
+ if (result == null) {
+ cache.put(eResource(), this, WelcomePackage.Literals.WELCOME_PAGE__VISIBLE_SECTION, result = WelcomePageOperations.getVisibleSections(this));
+ }
+ return result;
+ }
+ return WelcomePageOperations.getVisibleSections(this);
+ }
+
+ /**
+ * The array of superset feature identifiers for the '{@link #getVisibleSections() <em>Visible Section</em>}' reference list.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ *
+ * @see #getVisibleSections()
+ * @generated
+ * @ordered
+ */
+ protected static final int[] VISIBLE_SECTION_ESUPERSETS = new int[] { WelcomePackage.WELCOME_PAGE__SECTION };
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ *
+ * @generated
+ */
+ @Override
+ public WelcomeSection createVisibleSection() {
+ WelcomeSection newVisibleSection = (WelcomeSection) create(WelcomePackage.Literals.WELCOME_SECTION);
+ getVisibleSections().add(newVisibleSection);
+ return newVisibleSection;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ *
+ * @generated
+ */
+ @Override
+ public WelcomeSection getSection(String identifier) {
+ return WelcomePageOperations.getSection(this, identifier);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ *
+ * @generated
+ */
+ @SuppressWarnings("unchecked")
+ @Override
+ public NotificationChain eInverseAdd(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
+ switch (featureID) {
+ case WelcomePackage.WELCOME_PAGE__SECTION:
+ return ((InternalEList<InternalEObject>) (InternalEList<?>) getSections()).basicAdd(otherEnd, msgs);
+ }
+ return super.eInverseAdd(otherEnd, featureID, msgs);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ *
+ * @generated
+ */
+ @Override
+ public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
+ switch (featureID) {
+ case WelcomePackage.WELCOME_PAGE__SECTION:
+ return ((InternalEList<?>) getSections()).basicRemove(otherEnd, msgs);
+ }
+ return super.eInverseRemove(otherEnd, featureID, msgs);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ *
+ * @generated
+ */
+ @Override
+ public Object eGet(int featureID, boolean resolve, boolean coreType) {
+ switch (featureID) {
+ case WelcomePackage.WELCOME_PAGE__SECTION:
+ return getSections();
+ case WelcomePackage.WELCOME_PAGE__VISIBLE_SECTION:
+ return getVisibleSections();
+ }
+ return super.eGet(featureID, resolve, coreType);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ *
+ * @generated
+ */
+ @SuppressWarnings("unchecked")
+ @Override
+ public void eSet(int featureID, Object newValue) {
+ switch (featureID) {
+ case WelcomePackage.WELCOME_PAGE__SECTION:
+ getSections().clear();
+ getSections().addAll((Collection<? extends WelcomeSection>) newValue);
+ return;
+ case WelcomePackage.WELCOME_PAGE__VISIBLE_SECTION:
+ getVisibleSections().clear();
+ getVisibleSections().addAll((Collection<? extends WelcomeSection>) newValue);
+ return;
+ }
+ super.eSet(featureID, newValue);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ *
+ * @generated
+ */
+ @Override
+ public void eUnset(int featureID) {
+ switch (featureID) {
+ case WelcomePackage.WELCOME_PAGE__SECTION:
+ getSections().clear();
+ return;
+ case WelcomePackage.WELCOME_PAGE__VISIBLE_SECTION:
+ getVisibleSections().clear();
+ return;
+ }
+ super.eUnset(featureID);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ *
+ * @generated
+ */
+ @Override
+ public boolean eIsSet(int featureID) {
+ switch (featureID) {
+ case WelcomePackage.WELCOME_PAGE__SECTION:
+ return sections != null && !sections.isEmpty();
+ case WelcomePackage.WELCOME_PAGE__VISIBLE_SECTION:
+ return !getVisibleSections().isEmpty();
+ }
+ return super.eIsSet(featureID);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ *
+ * @generated
+ */
+ @Override
+ public Object eInvoke(int operationID, EList<?> arguments) throws InvocationTargetException {
+ switch (operationID) {
+ case WelcomePackage.WELCOME_PAGE___GET_SECTION__STRING:
+ return getSection((String) arguments.get(0));
+ }
+ return super.eInvoke(operationID, arguments);
+ }
+
+ /**
+ * Creates a new instance of the specified Ecore class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ *
+ * @param eClass
+ * The Ecore class of the instance to create.
+ * @return The new instance.
+ * @generated
+ */
+ protected EObject create(EClass eClass) {
+ return EcoreUtil.create(eClass);
+ }
+
+ /**
+ * Retrieves the cache adapter for this '<em><b>Page</b></em>'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ *
+ * @return The cache adapter for this '<em><b>Page</b></em>'.
+ * @generated
+ */
+ protected CacheAdapter getCacheAdapter() {
+ return CacheAdapter.getCacheAdapter(this);
+ }
+
+} // WelcomePageImpl
diff --git a/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/src-gen/org/eclipse/papyrus/infra/editor/welcome/internal/impl/WelcomeSectionImpl.java b/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/src-gen/org/eclipse/papyrus/infra/editor/welcome/internal/impl/WelcomeSectionImpl.java
new file mode 100644
index 00000000000..a7bacaaaa21
--- /dev/null
+++ b/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/src-gen/org/eclipse/papyrus/infra/editor/welcome/internal/impl/WelcomeSectionImpl.java
@@ -0,0 +1,410 @@
+/**
+ * Copyright (c) 2015 Christian W. Damus and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Christian W. Damus - Initial API and implementation
+ *
+ */
+package org.eclipse.papyrus.infra.editor.welcome.internal.impl;
+
+import java.lang.reflect.InvocationTargetException;
+
+import java.util.Collection;
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.notify.NotificationChain;
+
+import org.eclipse.emf.common.util.EList;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+import org.eclipse.emf.ecore.impl.MinimalEObjectImpl;
+
+import org.eclipse.emf.ecore.util.EDataTypeUniqueEList;
+import org.eclipse.emf.ecore.util.EcoreUtil;
+
+import org.eclipse.papyrus.infra.editor.welcome.WelcomePackage;
+import org.eclipse.papyrus.infra.editor.welcome.WelcomePage;
+import org.eclipse.papyrus.infra.editor.welcome.WelcomeSection;
+
+import org.eclipse.papyrus.infra.editor.welcome.internal.operations.WelcomeSectionOperations;
+
+import org.eclipse.uml2.common.util.CacheAdapter;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Section</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ * <li>{@link org.eclipse.papyrus.infra.editor.welcome.internal.impl.WelcomeSectionImpl#getIdentifiers <em>Identifier</em>}</li>
+ * <li>{@link org.eclipse.papyrus.infra.editor.welcome.internal.impl.WelcomeSectionImpl#isHidden <em>Hidden</em>}</li>
+ * <li>{@link org.eclipse.papyrus.infra.editor.welcome.internal.impl.WelcomeSectionImpl#getPage <em>Page</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class WelcomeSectionImpl extends MinimalEObjectImpl.Container implements WelcomeSection {
+ /**
+ * The cached value of the '{@link #getIdentifiers() <em>Identifier</em>}' attribute list.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ *
+ * @see #getIdentifiers()
+ * @generated
+ * @ordered
+ */
+ protected EList<String> identifiers;
+
+ /**
+ * The default value of the '{@link #isHidden() <em>Hidden</em>}' attribute.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ *
+ * @see #isHidden()
+ * @generated
+ * @ordered
+ */
+ protected static final boolean HIDDEN_EDEFAULT = false;
+
+ /**
+ * The cached value of the '{@link #isHidden() <em>Hidden</em>}' attribute.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ *
+ * @see #isHidden()
+ * @generated
+ * @ordered
+ */
+ protected boolean hidden = HIDDEN_EDEFAULT;
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ *
+ * @generated
+ */
+ protected WelcomeSectionImpl() {
+ super();
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ *
+ * @generated
+ */
+ @Override
+ protected EClass eStaticClass() {
+ return WelcomePackage.Literals.WELCOME_SECTION;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ *
+ * @generated
+ */
+ @Override
+ public EList<String> getIdentifiers() {
+ if (identifiers == null) {
+ identifiers = new EDataTypeUniqueEList<String>(String.class, this, WelcomePackage.WELCOME_SECTION__IDENTIFIER);
+ }
+ return identifiers;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ *
+ * @generated
+ */
+ @Override
+ public boolean isHidden() {
+ return hidden;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ *
+ * @generated
+ */
+ @Override
+ public void setHidden(boolean newHidden) {
+ boolean oldHidden = hidden;
+ hidden = newHidden;
+ if (eNotificationRequired()) {
+ eNotify(new ENotificationImpl(this, Notification.SET, WelcomePackage.WELCOME_SECTION__HIDDEN, oldHidden, hidden));
+ }
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ *
+ * @generated
+ */
+ @Override
+ public WelcomePage getPage() {
+ if (eContainerFeatureID() != WelcomePackage.WELCOME_SECTION__PAGE) {
+ return null;
+ }
+ return (WelcomePage) eInternalContainer();
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ *
+ * @generated
+ */
+ public NotificationChain basicSetPage(WelcomePage newPage, NotificationChain msgs) {
+ msgs = eBasicSetContainer((InternalEObject) newPage, WelcomePackage.WELCOME_SECTION__PAGE, msgs);
+ return msgs;
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ *
+ * @generated
+ */
+ @Override
+ public void setPage(WelcomePage newPage) {
+ if (newPage != eInternalContainer() || (eContainerFeatureID() != WelcomePackage.WELCOME_SECTION__PAGE && newPage != null)) {
+ if (EcoreUtil.isAncestor(this, newPage))
+ {
+ throw new IllegalArgumentException("Recursive containment not allowed for " + toString()); //$NON-NLS-1$
+ }
+ NotificationChain msgs = null;
+ if (eInternalContainer() != null) {
+ msgs = eBasicRemoveFromContainer(msgs);
+ }
+ if (newPage != null) {
+ msgs = ((InternalEObject) newPage).eInverseAdd(this, WelcomePackage.WELCOME_PAGE__SECTION, WelcomePage.class, msgs);
+ }
+ msgs = basicSetPage(newPage, msgs);
+ if (msgs != null) {
+ msgs.dispatch();
+ }
+ } else if (eNotificationRequired()) {
+ eNotify(new ENotificationImpl(this, Notification.SET, WelcomePackage.WELCOME_SECTION__PAGE, newPage, newPage));
+ }
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ *
+ * @generated
+ */
+ @Override
+ public boolean isIdentifiedBy(String identifier) {
+ return WelcomeSectionOperations.isIdentifiedBy(this, identifier);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ *
+ * @generated
+ */
+ @Override
+ public NotificationChain eInverseAdd(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
+ switch (featureID) {
+ case WelcomePackage.WELCOME_SECTION__PAGE:
+ if (eInternalContainer() != null) {
+ msgs = eBasicRemoveFromContainer(msgs);
+ }
+ return basicSetPage((WelcomePage) otherEnd, msgs);
+ }
+ return super.eInverseAdd(otherEnd, featureID, msgs);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ *
+ * @generated
+ */
+ @Override
+ public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
+ switch (featureID) {
+ case WelcomePackage.WELCOME_SECTION__PAGE:
+ return basicSetPage(null, msgs);
+ }
+ return super.eInverseRemove(otherEnd, featureID, msgs);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ *
+ * @generated
+ */
+ @Override
+ public NotificationChain eBasicRemoveFromContainerFeature(NotificationChain msgs) {
+ switch (eContainerFeatureID()) {
+ case WelcomePackage.WELCOME_SECTION__PAGE:
+ return eInternalContainer().eInverseRemove(this, WelcomePackage.WELCOME_PAGE__SECTION, WelcomePage.class, msgs);
+ }
+ return super.eBasicRemoveFromContainerFeature(msgs);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ *
+ * @generated
+ */
+ @Override
+ public Object eGet(int featureID, boolean resolve, boolean coreType) {
+ switch (featureID) {
+ case WelcomePackage.WELCOME_SECTION__IDENTIFIER:
+ return getIdentifiers();
+ case WelcomePackage.WELCOME_SECTION__HIDDEN:
+ return isHidden();
+ case WelcomePackage.WELCOME_SECTION__PAGE:
+ return getPage();
+ }
+ return super.eGet(featureID, resolve, coreType);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ *
+ * @generated
+ */
+ @SuppressWarnings("unchecked")
+ @Override
+ public void eSet(int featureID, Object newValue) {
+ switch (featureID) {
+ case WelcomePackage.WELCOME_SECTION__IDENTIFIER:
+ getIdentifiers().clear();
+ getIdentifiers().addAll((Collection<? extends String>) newValue);
+ return;
+ case WelcomePackage.WELCOME_SECTION__HIDDEN:
+ setHidden((Boolean) newValue);
+ return;
+ case WelcomePackage.WELCOME_SECTION__PAGE:
+ setPage((WelcomePage) newValue);
+ return;
+ }
+ super.eSet(featureID, newValue);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ *
+ * @generated
+ */
+ @Override
+ public void eUnset(int featureID) {
+ switch (featureID) {
+ case WelcomePackage.WELCOME_SECTION__IDENTIFIER:
+ getIdentifiers().clear();
+ return;
+ case WelcomePackage.WELCOME_SECTION__HIDDEN:
+ setHidden(HIDDEN_EDEFAULT);
+ return;
+ case WelcomePackage.WELCOME_SECTION__PAGE:
+ setPage((WelcomePage) null);
+ return;
+ }
+ super.eUnset(featureID);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ *
+ * @generated
+ */
+ @Override
+ public boolean eIsSet(int featureID) {
+ switch (featureID) {
+ case WelcomePackage.WELCOME_SECTION__IDENTIFIER:
+ return identifiers != null && !identifiers.isEmpty();
+ case WelcomePackage.WELCOME_SECTION__HIDDEN:
+ return hidden != HIDDEN_EDEFAULT;
+ case WelcomePackage.WELCOME_SECTION__PAGE:
+ return getPage() != null;
+ }
+ return super.eIsSet(featureID);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ *
+ * @generated
+ */
+ @Override
+ public Object eInvoke(int operationID, EList<?> arguments) throws InvocationTargetException {
+ switch (operationID) {
+ case WelcomePackage.WELCOME_SECTION___IS_IDENTIFIED_BY__STRING:
+ return isIdentifiedBy((String) arguments.get(0));
+ }
+ return super.eInvoke(operationID, arguments);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ *
+ * @generated
+ */
+ @Override
+ public String toString() {
+ if (eIsProxy()) {
+ return super.toString();
+ }
+
+ StringBuffer result = new StringBuffer(super.toString());
+ result.append(" (identifier: "); //$NON-NLS-1$
+ result.append(identifiers);
+ result.append(", hidden: "); //$NON-NLS-1$
+ result.append(hidden);
+ result.append(')');
+ return result.toString();
+ }
+
+ /**
+ * Creates a new instance of the specified Ecore class.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ *
+ * @param eClass
+ * The Ecore class of the instance to create.
+ * @return The new instance.
+ * @generated
+ */
+ protected EObject create(EClass eClass) {
+ return EcoreUtil.create(eClass);
+ }
+
+ /**
+ * Retrieves the cache adapter for this '<em><b>Section</b></em>'.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ *
+ * @return The cache adapter for this '<em><b>Section</b></em>'.
+ * @generated
+ */
+ protected CacheAdapter getCacheAdapter() {
+ return CacheAdapter.getCacheAdapter(this);
+ }
+
+} // WelcomeSectionImpl
diff --git a/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/src-gen/org/eclipse/papyrus/infra/editor/welcome/internal/operations/WelcomePageOperations.java b/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/src-gen/org/eclipse/papyrus/infra/editor/welcome/internal/operations/WelcomePageOperations.java
new file mode 100644
index 00000000000..373416a9aac
--- /dev/null
+++ b/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/src-gen/org/eclipse/papyrus/infra/editor/welcome/internal/operations/WelcomePageOperations.java
@@ -0,0 +1,120 @@
+/**
+ * Copyright (c) 2015 Christian W. Damus and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Christian W. Damus - Initial API and implementation
+ *
+ */
+package org.eclipse.papyrus.infra.editor.welcome.internal.operations;
+
+import java.util.List;
+import java.util.ListIterator;
+
+import org.eclipse.emf.common.util.EList;
+import org.eclipse.emf.ecore.InternalEObject;
+import org.eclipse.papyrus.infra.editor.welcome.WelcomePackage;
+import org.eclipse.papyrus.infra.editor.welcome.WelcomePage;
+import org.eclipse.papyrus.infra.editor.welcome.WelcomeSection;
+import org.eclipse.uml2.common.util.DerivedSubsetEObjectEList;
+
+/**
+ * <!-- begin-user-doc -->
+ * A static utility class that provides operations related to '<em><b>Page</b></em>' model objects.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following operations are supported:
+ * </p>
+ * <ul>
+ * <li>{@link org.eclipse.papyrus.infra.editor.welcome.WelcomePage#getVisibleSections() <em>Get Visible Sections</em>}</li>
+ * <li>{@link org.eclipse.papyrus.infra.editor.welcome.WelcomePage#getSection(java.lang.String) <em>Get Section</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class WelcomePageOperations {
+ /**
+ * This must be updated whenever the corresponding constant in the
+ * WelcomePageImpl class is regenerated.
+ */
+ protected static final int[] VISIBLE_SECTION_ESUPERSETS = new int[] { WelcomePackage.WELCOME_PAGE__SECTION };
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ *
+ * @generated
+ */
+ protected WelcomePageOperations() {
+ super();
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ *
+ * @generated NOT
+ */
+ public static EList<WelcomeSection> getVisibleSections(WelcomePage welcomePage) {
+ return new VisibleSectionsList((InternalEObject) welcomePage,
+ WelcomePackage.WELCOME_PAGE__VISIBLE_SECTION, VISIBLE_SECTION_ESUPERSETS);
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ *
+ * @generated NOT
+ */
+ public static WelcomeSection getSection(WelcomePage welcomePage, String identifier) {
+ return welcomePage.getSections().stream()
+ .filter(s -> s.isIdentifiedBy(identifier))
+ .findFirst()
+ .orElse(null);
+ }
+
+ //
+ // Nested types
+ //
+
+ private static class VisibleSectionsList extends DerivedSubsetEObjectEList<WelcomeSection> {
+
+ protected VisibleSectionsList(InternalEObject owner, int featureID, int[] sourceFeatureIDs) {
+ super(WelcomeSection.class, owner, featureID, sourceFeatureIDs);
+ }
+
+ @Override
+ public List<WelcomeSection> basicList() {
+ return new VisibleSectionsList(owner, featureID, sourceFeatureIDs) {
+
+ @Override
+ public ListIterator<WelcomeSection> listIterator(int index) {
+ return basicListIterator(index);
+ }
+ };
+ }
+
+ @Override
+ protected boolean isIncluded(Object object) {
+ return super.isIncluded(object) && !((WelcomeSection) object).isHidden();
+ }
+
+ @Override
+ protected WelcomeSection validate(int index, WelcomeSection object) {
+ WelcomeSection result = super.validate(index, object);
+
+ if (object.isHidden()) {
+ throw new IllegalArgumentException(String.valueOf(object));
+ }
+
+ return result;
+ }
+
+ }
+
+} // WelcomePageOperations
diff --git a/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/src-gen/org/eclipse/papyrus/infra/editor/welcome/internal/operations/WelcomeSectionOperations.java b/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/src-gen/org/eclipse/papyrus/infra/editor/welcome/internal/operations/WelcomeSectionOperations.java
new file mode 100644
index 00000000000..8c1890d783f
--- /dev/null
+++ b/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/src-gen/org/eclipse/papyrus/infra/editor/welcome/internal/operations/WelcomeSectionOperations.java
@@ -0,0 +1,52 @@
+/**
+ * Copyright (c) 2015 Christian W. Damus and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Christian W. Damus - Initial API and implementation
+ *
+ */
+package org.eclipse.papyrus.infra.editor.welcome.internal.operations;
+
+import org.eclipse.papyrus.infra.editor.welcome.WelcomeSection;
+
+/**
+ * <!-- begin-user-doc -->
+ * A static utility class that provides operations related to '<em><b>Section</b></em>' model objects.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following operations are supported:
+ * </p>
+ * <ul>
+ * <li>{@link org.eclipse.papyrus.infra.editor.welcome.WelcomeSection#isIdentifiedBy(java.lang.String) <em>Is Identified By</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class WelcomeSectionOperations {
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ *
+ * @generated
+ */
+ protected WelcomeSectionOperations() {
+ super();
+ }
+
+ /**
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ *
+ * @generated NOT
+ */
+ public static boolean isIdentifiedBy(WelcomeSection welcomeSection, String identifier) {
+ return welcomeSection.getIdentifiers().contains(identifier);
+ }
+
+} // WelcomeSectionOperations
diff --git a/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/src-gen/org/eclipse/papyrus/infra/editor/welcome/util/WelcomeAdapterFactory.java b/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/src-gen/org/eclipse/papyrus/infra/editor/welcome/util/WelcomeAdapterFactory.java
new file mode 100644
index 00000000000..6320711b0c7
--- /dev/null
+++ b/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/src-gen/org/eclipse/papyrus/infra/editor/welcome/util/WelcomeAdapterFactory.java
@@ -0,0 +1,179 @@
+/**
+ * Copyright (c) 2015 Christian W. Damus and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Christian W. Damus - Initial API and implementation
+ *
+ */
+package org.eclipse.papyrus.infra.editor.welcome.util;
+
+import org.eclipse.emf.common.notify.Adapter;
+import org.eclipse.emf.common.notify.Notifier;
+
+import org.eclipse.emf.common.notify.impl.AdapterFactoryImpl;
+
+import org.eclipse.emf.ecore.EObject;
+
+import org.eclipse.papyrus.infra.editor.welcome.*;
+
+/**
+ * <!-- begin-user-doc -->
+ * The <b>Adapter Factory</b> for the model.
+ * It provides an adapter <code>createXXX</code> method for each class of the model.
+ * <!-- end-user-doc -->
+ *
+ * @see org.eclipse.papyrus.infra.editor.welcome.WelcomePackage
+ * @generated
+ */
+public class WelcomeAdapterFactory extends AdapterFactoryImpl {
+ /**
+ * The cached model package.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ *
+ * @generated
+ */
+ protected static WelcomePackage modelPackage;
+
+ /**
+ * Creates an instance of the adapter factory.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ *
+ * @generated
+ */
+ public WelcomeAdapterFactory() {
+ if (modelPackage == null) {
+ modelPackage = WelcomePackage.eINSTANCE;
+ }
+ }
+
+ /**
+ * Returns whether this factory is applicable for the type of the object.
+ * <!-- begin-user-doc -->
+ * This implementation returns <code>true</code> if the object is either the model's package or is an instance object of the model.
+ * <!-- end-user-doc -->
+ *
+ * @return whether this factory is applicable for the type of the object.
+ * @generated
+ */
+ @Override
+ public boolean isFactoryForType(Object object) {
+ if (object == modelPackage) {
+ return true;
+ }
+ if (object instanceof EObject) {
+ return ((EObject) object).eClass().getEPackage() == modelPackage;
+ }
+ return false;
+ }
+
+ /**
+ * The switch that delegates to the <code>createXXX</code> methods.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ *
+ * @generated
+ */
+ protected WelcomeSwitch<Adapter> modelSwitch = new WelcomeSwitch<Adapter>() {
+ @Override
+ public Adapter caseWelcome(Welcome object) {
+ return createWelcomeAdapter();
+ }
+
+ @Override
+ public Adapter caseWelcomePage(WelcomePage object) {
+ return createWelcomePageAdapter();
+ }
+
+ @Override
+ public Adapter caseWelcomeSection(WelcomeSection object) {
+ return createWelcomeSectionAdapter();
+ }
+
+ @Override
+ public Adapter defaultCase(EObject object) {
+ return createEObjectAdapter();
+ }
+ };
+
+ /**
+ * Creates an adapter for the <code>target</code>.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ *
+ * @param target
+ * the object to adapt.
+ * @return the adapter for the <code>target</code>.
+ * @generated
+ */
+ @Override
+ public Adapter createAdapter(Notifier target) {
+ return modelSwitch.doSwitch((EObject) target);
+ }
+
+
+ /**
+ * Creates a new adapter for an object of class '{@link org.eclipse.papyrus.infra.editor.welcome.Welcome <em>Welcome</em>}'.
+ * <!-- begin-user-doc -->
+ * This default implementation returns null so that we can easily ignore cases;
+ * it's useful to ignore a case when inheritance will catch all the cases anyway.
+ * <!-- end-user-doc -->
+ *
+ * @return the new adapter.
+ * @see org.eclipse.papyrus.infra.editor.welcome.Welcome
+ * @generated
+ */
+ public Adapter createWelcomeAdapter() {
+ return null;
+ }
+
+ /**
+ * Creates a new adapter for an object of class '{@link org.eclipse.papyrus.infra.editor.welcome.WelcomePage <em>Page</em>}'.
+ * <!-- begin-user-doc -->
+ * This default implementation returns null so that we can easily ignore cases;
+ * it's useful to ignore a case when inheritance will catch all the cases anyway.
+ * <!-- end-user-doc -->
+ *
+ * @return the new adapter.
+ * @see org.eclipse.papyrus.infra.editor.welcome.WelcomePage
+ * @generated
+ */
+ public Adapter createWelcomePageAdapter() {
+ return null;
+ }
+
+ /**
+ * Creates a new adapter for an object of class '{@link org.eclipse.papyrus.infra.editor.welcome.WelcomeSection <em>Section</em>}'.
+ * <!-- begin-user-doc -->
+ * This default implementation returns null so that we can easily ignore cases;
+ * it's useful to ignore a case when inheritance will catch all the cases anyway.
+ * <!-- end-user-doc -->
+ *
+ * @return the new adapter.
+ * @see org.eclipse.papyrus.infra.editor.welcome.WelcomeSection
+ * @generated
+ */
+ public Adapter createWelcomeSectionAdapter() {
+ return null;
+ }
+
+ /**
+ * Creates a new adapter for the default case.
+ * <!-- begin-user-doc -->
+ * This default implementation returns null.
+ * <!-- end-user-doc -->
+ *
+ * @return the new adapter.
+ * @generated
+ */
+ public Adapter createEObjectAdapter() {
+ return null;
+ }
+
+} // WelcomeAdapterFactory
diff --git a/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/src-gen/org/eclipse/papyrus/infra/editor/welcome/util/WelcomeSwitch.java b/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/src-gen/org/eclipse/papyrus/infra/editor/welcome/util/WelcomeSwitch.java
new file mode 100644
index 00000000000..645299659de
--- /dev/null
+++ b/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/src-gen/org/eclipse/papyrus/infra/editor/welcome/util/WelcomeSwitch.java
@@ -0,0 +1,183 @@
+/**
+ * Copyright (c) 2015 Christian W. Damus and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Christian W. Damus - Initial API and implementation
+ *
+ */
+package org.eclipse.papyrus.infra.editor.welcome.util;
+
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.EPackage;
+
+import org.eclipse.emf.ecore.util.Switch;
+
+import org.eclipse.papyrus.infra.editor.welcome.*;
+
+/**
+ * <!-- begin-user-doc -->
+ * The <b>Switch</b> for the model's inheritance hierarchy.
+ * It supports the call {@link #doSwitch(EObject) doSwitch(object)}
+ * to invoke the <code>caseXXX</code> method for each class of the model,
+ * starting with the actual class of the object
+ * and proceeding up the inheritance hierarchy
+ * until a non-null result is returned,
+ * which is the result of the switch.
+ * <!-- end-user-doc -->
+ *
+ * @see org.eclipse.papyrus.infra.editor.welcome.WelcomePackage
+ * @generated
+ */
+public class WelcomeSwitch<T> extends Switch<T> {
+ /**
+ * The cached model package
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ *
+ * @generated
+ */
+ protected static WelcomePackage modelPackage;
+
+ /**
+ * Creates an instance of the switch.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ *
+ * @generated
+ */
+ public WelcomeSwitch() {
+ if (modelPackage == null) {
+ modelPackage = WelcomePackage.eINSTANCE;
+ }
+ }
+
+ /**
+ * Checks whether this is a switch for the given package.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ *
+ * @param ePackage
+ * the package in question.
+ * @return whether this is a switch for the given package.
+ * @generated
+ */
+ @Override
+ protected boolean isSwitchFor(EPackage ePackage) {
+ return ePackage == modelPackage;
+ }
+
+ /**
+ * Calls <code>caseXXX</code> for each class of the model until one returns a non null result; it yields that result.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ *
+ * @return the first non-null result returned by a <code>caseXXX</code> call.
+ * @generated
+ */
+ @Override
+ protected T doSwitch(int classifierID, EObject theEObject) {
+ switch (classifierID) {
+ case WelcomePackage.WELCOME: {
+ Welcome welcome = (Welcome) theEObject;
+ T result = caseWelcome(welcome);
+ if (result == null) {
+ result = defaultCase(theEObject);
+ }
+ return result;
+ }
+ case WelcomePackage.WELCOME_PAGE: {
+ WelcomePage welcomePage = (WelcomePage) theEObject;
+ T result = caseWelcomePage(welcomePage);
+ if (result == null) {
+ result = defaultCase(theEObject);
+ }
+ return result;
+ }
+ case WelcomePackage.WELCOME_SECTION: {
+ WelcomeSection welcomeSection = (WelcomeSection) theEObject;
+ T result = caseWelcomeSection(welcomeSection);
+ if (result == null) {
+ result = defaultCase(theEObject);
+ }
+ return result;
+ }
+ default:
+ return defaultCase(theEObject);
+ }
+ }
+
+ /**
+ * Returns the result of interpreting the object as an instance of '<em>Welcome</em>'.
+ * <!-- begin-user-doc -->
+ * This implementation returns null;
+ * returning a non-null result will terminate the switch.
+ * <!-- end-user-doc -->
+ *
+ * @param object
+ * the target of the switch.
+ * @return the result of interpreting the object as an instance of '<em>Welcome</em>'.
+ * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+ * @generated
+ */
+ public T caseWelcome(Welcome object) {
+ return null;
+ }
+
+ /**
+ * Returns the result of interpreting the object as an instance of '<em>Page</em>'.
+ * <!-- begin-user-doc -->
+ * This implementation returns null;
+ * returning a non-null result will terminate the switch.
+ * <!-- end-user-doc -->
+ *
+ * @param object
+ * the target of the switch.
+ * @return the result of interpreting the object as an instance of '<em>Page</em>'.
+ * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+ * @generated
+ */
+ public T caseWelcomePage(WelcomePage object) {
+ return null;
+ }
+
+ /**
+ * Returns the result of interpreting the object as an instance of '<em>Section</em>'.
+ * <!-- begin-user-doc -->
+ * This implementation returns null;
+ * returning a non-null result will terminate the switch.
+ * <!-- end-user-doc -->
+ *
+ * @param object
+ * the target of the switch.
+ * @return the result of interpreting the object as an instance of '<em>Section</em>'.
+ * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+ * @generated
+ */
+ public T caseWelcomeSection(WelcomeSection object) {
+ return null;
+ }
+
+ /**
+ * Returns the result of interpreting the object as an instance of '<em>EObject</em>'.
+ * <!-- begin-user-doc -->
+ * This implementation returns null;
+ * returning a non-null result will terminate the switch, but this is the last case anyway.
+ * <!-- end-user-doc -->
+ *
+ * @param object
+ * the target of the switch.
+ * @return the result of interpreting the object as an instance of '<em>EObject</em>'.
+ * @see #doSwitch(org.eclipse.emf.ecore.EObject)
+ * @generated
+ */
+ @Override
+ public T defaultCase(EObject object) {
+ return null;
+ }
+
+} // WelcomeSwitch
diff --git a/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/src/org/eclipse/papyrus/infra/editor/welcome/IWelcomePageService.java b/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/src/org/eclipse/papyrus/infra/editor/welcome/IWelcomePageService.java
new file mode 100644
index 00000000000..bad7c025be4
--- /dev/null
+++ b/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/src/org/eclipse/papyrus/infra/editor/welcome/IWelcomePageService.java
@@ -0,0 +1,54 @@
+/*****************************************************************************
+ * Copyright (c) 2015 Christian W. Damus and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Christian W. Damus - Initial API and implementation
+ *
+ *****************************************************************************/
+
+package org.eclipse.papyrus.infra.editor.welcome;
+
+import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.papyrus.infra.core.services.IService;
+import org.eclipse.papyrus.infra.core.services.ServicesRegistry;
+
+/**
+ * The Papyrus Editor's <em>Welcome Page</em> management service.
+ */
+public interface IWelcomePageService extends IService {
+
+ /**
+ * Obtains the service registry that owns me.
+ *
+ * @return my registry
+ */
+ ServicesRegistry getOwner();
+
+ /**
+ * Queries whether the welcome page can be closed at this instant.
+ *
+ * @return whether the welcome page may be closed by the user
+ */
+ boolean canCloseWelcomePage();
+
+ /**
+ * Ensures that the welcome page is open. If it is not open, then it is
+ * opened and activated. Otherwise, if it is not active, it is activated.
+ */
+ void openWelcomePage();
+
+ /**
+ * Resets the layout of the Welcome Page to the defaults, undoing any
+ * custom re-organization that the user may have done.
+ */
+ void resetWelcomePage();
+
+ Resource getWelcomeResource();
+
+ Welcome getWelcome();
+}
diff --git a/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/src/org/eclipse/papyrus/infra/editor/welcome/internal/Activator.java b/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/src/org/eclipse/papyrus/infra/editor/welcome/internal/Activator.java
new file mode 100644
index 00000000000..96256781ca1
--- /dev/null
+++ b/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/src/org/eclipse/papyrus/infra/editor/welcome/internal/Activator.java
@@ -0,0 +1,80 @@
+/*****************************************************************************
+ * Copyright (c) 2015 Christian W. Damus and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Christian W. Damus - Initial API and implementation
+ *
+ *****************************************************************************/
+package org.eclipse.papyrus.infra.editor.welcome.internal;
+
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.jface.resource.ImageRegistry;
+import org.eclipse.papyrus.infra.core.log.LogHelper;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.ui.plugin.AbstractUIPlugin;
+import org.osgi.framework.BundleContext;
+
+/**
+ * The activator class controls the plug-in life cycle
+ */
+public class Activator extends AbstractUIPlugin {
+
+ // The plug-in ID
+ public static final String PLUGIN_ID = "org.eclipse.papyrus.infra.editor.welcome"; //$NON-NLS-1$
+
+ public static final String IMG_LAYOUT = "obj:layout"; //$NON-NLS-1$
+
+ // The shared instance
+ private static Activator plugin;
+
+ public static LogHelper log;
+
+ /**
+ * The constructor
+ */
+ public Activator() {
+ }
+
+ @Override
+ public void start(BundleContext context) throws Exception {
+ super.start(context);
+ plugin = this;
+ log = new LogHelper(this);
+ }
+
+ @Override
+ public void stop(BundleContext context) throws Exception {
+ plugin = null;
+ super.stop(context);
+ }
+
+ /**
+ * Returns the shared instance
+ *
+ * @return the shared instance
+ */
+ public static Activator getDefault() {
+ return plugin;
+ }
+
+
+ public static Image getIcon(String key) {
+ return getDefault().getImageRegistry().get(key);
+ }
+
+ @Override
+ protected void initializeImageRegistry(ImageRegistry reg) {
+ super.initializeImageRegistry(reg);
+
+ reg.put(IMG_LAYOUT, getImageDescriptor("icons/full/obj16/layout.png")); //$NON-NLS-1$
+ }
+
+ protected ImageDescriptor getImageDescriptor(String path) {
+ return imageDescriptorFromPlugin(PLUGIN_ID, path);
+ }
+}
diff --git a/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/src/org/eclipse/papyrus/infra/editor/welcome/internal/WelcomeAdapterFactory.java b/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/src/org/eclipse/papyrus/infra/editor/welcome/internal/WelcomeAdapterFactory.java
new file mode 100644
index 00000000000..cc0490197fb
--- /dev/null
+++ b/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/src/org/eclipse/papyrus/infra/editor/welcome/internal/WelcomeAdapterFactory.java
@@ -0,0 +1,48 @@
+/*****************************************************************************
+ * Copyright (c) 2015 Christian W. Damus and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Christian W. Damus - Initial API and implementation
+ *
+ *****************************************************************************/
+
+package org.eclipse.papyrus.infra.editor.welcome.internal;
+
+import org.eclipse.core.runtime.IAdapterFactory;
+import org.eclipse.papyrus.infra.core.sasheditor.di.contentprovider.IOpenable;
+import org.eclipse.papyrus.infra.editor.welcome.Welcome;
+import org.eclipse.papyrus.infra.editor.welcome.WelcomePackage;
+
+/**
+ * Eclipse platform adapter factory for the {@linkplain WelcomePackage welcome model}.
+ */
+public class WelcomeAdapterFactory implements IAdapterFactory {
+
+ public WelcomeAdapterFactory() {
+ super();
+ }
+
+ @Override
+ public <T> T getAdapter(Object adaptable, Class<T> adapterType) {
+ T result = null;
+
+ if (adaptable instanceof Welcome) {
+ if (adapterType == IOpenable.class) {
+ result = adapterType.cast(new IOpenable.Openable(adaptable));
+ }
+ }
+
+ return result;
+ }
+
+ @Override
+ public Class<?>[] getAdapterList() {
+ return new Class[] { IOpenable.class };
+ }
+
+}
diff --git a/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/src/org/eclipse/papyrus/infra/editor/welcome/internal/WelcomeLayout.java b/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/src/org/eclipse/papyrus/infra/editor/welcome/internal/WelcomeLayout.java
new file mode 100644
index 00000000000..faecf8f30f4
--- /dev/null
+++ b/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/src/org/eclipse/papyrus/infra/editor/welcome/internal/WelcomeLayout.java
@@ -0,0 +1,366 @@
+/*****************************************************************************
+ * Copyright (c) 2015 Christian W. Damus and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Christian W. Damus - Initial API and implementation
+ *
+ *****************************************************************************/
+
+package org.eclipse.papyrus.infra.editor.welcome.internal;
+
+import java.lang.reflect.Field;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.function.Function;
+
+import org.eclipse.emf.common.util.ECollections;
+import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.papyrus.infra.core.resource.sasheditor.SashModel;
+import org.eclipse.papyrus.infra.core.resource.sasheditor.SashModelUtils;
+import org.eclipse.papyrus.infra.core.sasheditor.di.contentprovider.utils.TransactionHelper;
+import org.eclipse.papyrus.infra.editor.welcome.IWelcomePageService;
+import org.eclipse.papyrus.infra.editor.welcome.Welcome;
+import org.eclipse.papyrus.infra.editor.welcome.WelcomeFactory;
+import org.eclipse.papyrus.infra.editor.welcome.WelcomePage;
+import org.eclipse.papyrus.infra.editor.welcome.WelcomeSection;
+import org.eclipse.papyrus.infra.editor.welcome.internal.dnd.WelcomeSectionTransfer;
+import org.eclipse.papyrus.infra.emf.utils.EMFHelper;
+import org.eclipse.papyrus.views.properties.contexts.Tab;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.dnd.DND;
+import org.eclipse.swt.dnd.DragSource;
+import org.eclipse.swt.dnd.DragSourceAdapter;
+import org.eclipse.swt.dnd.DragSourceEvent;
+import org.eclipse.swt.dnd.DragSourceListener;
+import org.eclipse.swt.dnd.DropTarget;
+import org.eclipse.swt.dnd.DropTargetAdapter;
+import org.eclipse.swt.dnd.DropTargetEvent;
+import org.eclipse.swt.dnd.DropTargetListener;
+import org.eclipse.swt.dnd.Transfer;
+import org.eclipse.swt.layout.FormAttachment;
+import org.eclipse.swt.layout.FormData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.ui.dialogs.PreferencesUtil;
+import org.eclipse.ui.forms.events.HyperlinkAdapter;
+import org.eclipse.ui.forms.events.HyperlinkEvent;
+import org.eclipse.ui.forms.widgets.ExpandableComposite;
+import org.eclipse.ui.forms.widgets.FormToolkit;
+import org.eclipse.ui.forms.widgets.Hyperlink;
+import org.eclipse.uml2.common.util.UML2Util;
+
+/**
+ * @author damus
+ *
+ */
+class WelcomeLayout {
+ private static final String PREFERENCE_PAGE_ID = "org.eclipse.papyrus.infra.editor.welcome.content"; //$NON-NLS-1$
+
+ private static final int NUM_ROWS = 2;
+
+ private static final Function<Control, Control> textLabelAccessor = createTextLabelAccessor();
+
+ private final int rowCount = NUM_ROWS;
+
+ private final Composite parent;
+ private final FormToolkit toolkit;
+ private final IWelcomePageService welcomeService;
+
+ private Map<Tab, Composite> tabControls = new HashMap<>();
+
+ private List<WelcomeTab> tabs;
+ private Map<WelcomeTab, Composite> sections;
+
+ /**
+ * Constructor.
+ *
+ */
+ WelcomeLayout(Composite parent, FormToolkit toolkit, IWelcomePageService welcomeService) {
+ super();
+
+ this.parent = parent;
+ this.toolkit = toolkit;
+ this.welcomeService = welcomeService;
+ }
+
+ public void dispose() {
+ tabControls.values().forEach(body -> {
+ if (!body.isDisposed()) {
+ // The tab controls are the bodies of expandable composites
+ body.getParent().dispose();
+ }
+ });
+ tabControls.clear();
+
+ tabs = null;
+ sections = null;
+ }
+
+ void createSections(List<WelcomeTab> tabs) {
+ sort(tabs);
+
+ this.tabs = tabs;
+ this.sections = new HashMap<>();
+
+ for (int i = 0; i < tabs.size(); i++) {
+ WelcomeTab tab = tabs.get(i);
+ ExpandableComposite control = toolkit.createSection(parent, ExpandableComposite.TITLE_BAR);
+ Composite body = toolkit.createComposite(control);
+ body.setLayout(new GridLayout()); // XWTSection expects to fill a grid layout
+ control.setClient(body);
+ tab.register(body, tabControls);
+ control.setData(tab);
+ sections.put(tab, control);
+
+ Transfer[] transfers = { WelcomeSectionTransfer.getInstance() };
+ addDragSourceAdapter(control, transfers, new DragSourceAdapter() {
+
+ @Override
+ public void dragSetData(DragSourceEvent event) {
+ event.data = control;
+ }
+ });
+ addDropTargetAdapter(control, transfers, new DropTargetAdapter() {
+
+ @Override
+ public void drop(DropTargetEvent event) {
+ if (event.data != control) {
+ Composite target = (Composite) event.data;
+ swapSections(tab, (WelcomeTab) target.getData());
+ }
+ }
+ });
+
+ control.setText(tab.getLabel());
+ // TODO: tab images?
+ }
+
+ layoutTabSections();
+
+ if (tabControls.isEmpty()) {
+ // We didn't have any contributions
+ ExpandableComposite messages = toolkit.createSection(parent, ExpandableComposite.NO_TITLE);
+ Composite blank = toolkit.createComposite(messages);
+ messages.setClient(blank);
+ blank.setLayout(new GridLayout());
+ toolkit.createLabel(blank, "No welcome content is configured in this workspace.");
+ Hyperlink hyperlink = toolkit.createHyperlink(blank, "Open Welcome Preferences", SWT.WRAP);
+ tabControls.put(null, blank); // So it can be destroyed on re-build
+
+ hyperlink.addHyperlinkListener(new HyperlinkAdapter() {
+ @Override
+ public void linkActivated(HyperlinkEvent e) {
+ PreferencesUtil.createPreferenceDialogOn(hyperlink.getShell(), PREFERENCE_PAGE_ID, null, null).open();
+ }
+ });
+ }
+ }
+
+ private void sort(List<WelcomeTab> tabs) {
+ // Do we have a user-defined sort order?
+ Welcome welcome = welcomeService.getWelcome();
+ if (welcome.getWelcomePage() != null) {
+ Collections.sort(tabs, userDefinedOrdering(welcome.getWelcomePage()));
+ } else {
+ Collections.sort(tabs);
+ }
+ }
+
+ private Comparator<WelcomeTab> userDefinedOrdering(WelcomePage welcomePage) {
+ return (tab1, tab2) -> {
+ int result;
+
+ WelcomeSection section1 = welcomePage.getSection(tab1.getID());
+ WelcomeSection section2 = welcomePage.getSection(tab2.getID());
+ int index1 = welcomePage.getSections().indexOf(section1);
+ int index2 = welcomePage.getSections().indexOf(section2);
+
+ if ((index1 >= 0) && (index2 >= 0)) {
+ // There is a user-defined ordering for these
+ result = index1 - index2;
+ } else {
+ // We have only the intrinsic ordering
+ result = tab1.compareTo(tab2);
+ }
+
+ return result;
+ };
+ }
+
+ private void layoutTabSections() {
+ final int rows = this.rowCount;
+ final int columns = Math.max(2, (tabs.size() + (tabs.size() % rows)) / rows);
+
+ Control prev = null;
+ Control prevCol = null;
+ for (int i = 0; i < tabs.size(); i++) {
+ Control section = sections.get(tabs.get(i));
+ FormData fd = new FormData();
+ if (i == 0) {
+ fd.left = new FormAttachment(0);
+ fd.right = new FormAttachment(100 / columns);
+ fd.top = new FormAttachment(0);
+ fd.bottom = new FormAttachment(100 / rows);
+ } else {
+ if (prevCol == null) {
+ fd.left = new FormAttachment(0);
+ } else {
+ fd.left = new FormAttachment(prevCol, 5, SWT.RIGHT);
+ }
+ fd.right = new FormAttachment((100 * ((i / rows) + 1)) / columns);
+ if (prev == null) {
+ fd.top = new FormAttachment(0);
+ fd.bottom = new FormAttachment(100 / rows);
+ } else {
+ fd.top = new FormAttachment(prev, 5, SWT.BOTTOM);
+ fd.bottom = new FormAttachment((100 * ((i % rows) + 1)) / rows);
+ }
+ }
+
+ section.setLayoutData(fd);
+
+ if (((i + 1) % rows) == 0) {
+ prevCol = section;
+ prev = null;
+ } else {
+ prev = section;
+ }
+ }
+ }
+
+ void swapSections(WelcomeTab tab1, WelcomeTab tab2) {
+ Collections.swap(tabs, tabs.indexOf(tab1), tabs.indexOf(tab2));
+ updateWelcomeLayoutModel();
+ layoutTabSections();
+ parent.layout();
+ }
+
+ Composite getTabControl(Tab tab) {
+ return tabControls.get(tab);
+ }
+
+ private void addDragSourceAdapter(Control control, Transfer[] transferTypes, DragSourceListener listener) {
+ Control textLabel = textLabelAccessor.apply(control);
+ DragSource drag = new DragSource(textLabel, DND.DROP_MOVE);
+ drag.addDragListener(new DragSourceAdapter() {
+ @Override
+ public void dragStart(DragSourceEvent event) {
+ event.image = Activator.getIcon(Activator.IMG_LAYOUT);
+ }
+ });
+ drag.setTransfer(transferTypes);
+ drag.addDragListener(listener);
+ textLabel.addDisposeListener(event -> drag.dispose());
+ }
+
+ private void addDropTargetAdapter(Control control, Transfer[] transferTypes, DropTargetListener listener) {
+ DropTarget drop = new DropTarget(control, DND.DROP_MOVE);
+ drop.setTransfer(transferTypes);
+ drop.addDropListener(listener);
+ control.addDisposeListener(event -> drop.dispose());
+ }
+
+ private void updateWelcomeLayoutModel() {
+ SashModel sashModel = SashModelUtils.getSashModel(welcomeService.getOwner());
+ Resource res = sashModel.getResource();
+ if (res != null) {
+ Welcome welcome = welcomeService.getWelcome();
+ try {
+ TransactionHelper.run(EMFHelper.resolveEditingDomain(welcome), () -> {
+ if (welcome.eResource() != res) {
+ // Move it
+ res.getContents().add(welcome);
+ }
+
+ WelcomePage page = welcome.getWelcomePage();
+ if (page == null) {
+ page = welcome.createWelcomePage();
+ }
+
+ // TODO: Hidden tab sections
+
+ List<WelcomeSection> newSections = new ArrayList<>(tabs.size());
+ for (WelcomeTab tab : tabs) {
+ WelcomeSection section = page.getSection(tab.getID());
+ if (section == null) {
+ section = WelcomeFactory.eINSTANCE.createWelcomeSection();
+ section.getIdentifiers().addAll(tab.getAllTabIDs());
+ }
+ newSections.add(section);
+ }
+ ECollections.setEList(page.getSections(), newSections);
+ });
+ } catch (Exception e) {
+ Activator.log.error("Failed to update welcome page layout", e); //$NON-NLS-1$
+ }
+ }
+ }
+
+ void resetLayoutModel() {
+ Welcome welcome = welcomeService.getWelcome();
+ Resource res = welcomeService.getWelcomeResource();
+ boolean[] recompute = { false };
+
+ try {
+ TransactionHelper.run(EMFHelper.resolveEditingDomain(welcome), () -> {
+ if (welcome.eResource() != res) {
+ // Move it
+ res.getContents().add(welcome);
+ }
+
+ WelcomePage page = welcome.getWelcomePage();
+ if (page != null) {
+ new UML2Util() {
+ {
+ destroy(page);
+ recompute[0] = true;
+ }
+ };
+ }
+ });
+ } catch (Exception e) {
+ Activator.log.error("Failed to reset new welcome page layout", e); //$NON-NLS-1$
+ }
+
+ if (recompute[0]) {
+ sort(tabs);
+ layoutTabSections();
+ parent.layout();
+ }
+ }
+
+ //
+ // Reflection hacks
+ //
+
+ private static Function<Control, Control> createTextLabelAccessor() {
+ Function<Control, Control> result;
+
+ try {
+ // It's protected API, so it really should be there
+ Field textLabelField = ExpandableComposite.class.getDeclaredField("textLabel"); //$NON-NLS-1$
+ textLabelField.setAccessible(true);
+ result = section -> {
+ try {
+ return (Control) textLabelField.get(section);
+ } catch (Exception e) {
+ return section;
+ }
+ };
+ } catch (Exception e) {
+ result = control -> control;
+ }
+
+ return result;
+ }
+}
diff --git a/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/src/org/eclipse/papyrus/infra/editor/welcome/internal/WelcomePage.java b/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/src/org/eclipse/papyrus/infra/editor/welcome/internal/WelcomePage.java
new file mode 100644
index 00000000000..14d4055723c
--- /dev/null
+++ b/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/src/org/eclipse/papyrus/infra/editor/welcome/internal/WelcomePage.java
@@ -0,0 +1,218 @@
+/*****************************************************************************
+ * Copyright (c) 2015 Christian W. Damus and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Christian W. Damus - Initial API and implementation
+ *
+ *****************************************************************************/
+
+package org.eclipse.papyrus.infra.editor.welcome.internal;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.CopyOnWriteArrayList;
+
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.papyrus.infra.constraints.runtime.ConstraintEngineListener;
+import org.eclipse.papyrus.infra.core.sasheditor.editor.ICloseablePart;
+import org.eclipse.papyrus.infra.editor.welcome.IWelcomePageService;
+import org.eclipse.papyrus.views.properties.contexts.Section;
+import org.eclipse.papyrus.views.properties.contexts.View;
+import org.eclipse.papyrus.views.properties.runtime.ConfigurationManager;
+import org.eclipse.papyrus.views.properties.runtime.DefaultDisplayEngine;
+import org.eclipse.papyrus.views.properties.runtime.ViewConstraintEngine;
+import org.eclipse.papyrus.views.properties.xwt.XWTSection;
+import org.eclipse.swt.layout.FormLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.ui.IPropertyListener;
+import org.eclipse.ui.forms.widgets.FormToolkit;
+import org.eclipse.ui.forms.widgets.ScrolledForm;
+import org.eclipse.ui.views.properties.tabbed.ISection;
+
+/**
+ * The extensible <em>Welcome Page</em> of the Papyrus Editor.
+ */
+public class WelcomePage implements ICloseablePart {
+ private final IWelcomePageService service;
+
+ private final Object model;
+
+ private FormToolkit toolkit;
+ private ViewConstraintEngine constraintEngine;
+ private ConstraintEngineListener constraintsListener;
+ private DefaultDisplayEngine displayEngine;
+ private ScrolledForm form;
+ private Collection<ISection> sections;
+ private WelcomeLayout welcomeLayout;
+
+ private final CopyOnWriteArrayList<IPropertyListener> propertyListeners = new CopyOnWriteArrayList<>();
+
+ public WelcomePage(IWelcomePageService service, Object model) {
+ super();
+
+ this.service = service;
+ this.model = model;
+ }
+
+ public static WelcomePage getWelcomePage(Control control) {
+ WelcomePage result = null;
+
+ for (Control next = control; (result == null) && (next != null); next = next.getParent()) {
+ if (next.getData() instanceof WelcomePage) {
+ result = (WelcomePage) next.getData();
+ }
+ }
+
+ return result;
+ }
+
+ @Override
+ public boolean canClose() {
+ return service.canCloseWelcomePage();
+ }
+
+ void fireCanCloseChanged() {
+ propertyListeners.forEach(l -> {
+ try {
+ l.propertyChanged(WelcomePage.this, PROP_CAN_CLOSE);
+ } catch (Exception e) {
+ Activator.log.error("Uncaught exception in property listener", e); //$NON-NLS-1$
+ }
+ });
+ }
+
+ public Composite createControl(Composite parent) {
+ toolkit = new FormToolkit(parent.getDisplay());
+ constraintEngine = ConfigurationManager.getInstance().getConstraintEngine();
+ displayEngine = new DefaultDisplayEngine(false);
+ attachConstraintEngine(constraintEngine);
+
+ form = toolkit.createScrolledForm(parent);
+ form.setData(this);
+
+ FormLayout layout = new FormLayout();
+ layout.marginWidth = 5;
+ layout.marginHeight = 5;
+ layout.spacing = 5;
+ form.getBody().setLayout(layout);
+
+ createSections(form.getBody());
+
+ form.addDisposeListener(event -> dispose());
+
+ return form;
+ }
+
+ protected void attachConstraintEngine(ViewConstraintEngine engine) {
+ constraintsListener = event -> rebuildSections(form.getBody());
+ engine.addConstraintEngineListener(constraintsListener);
+ }
+
+ public void dispose() {
+ if (constraintsListener != null) {
+ constraintEngine.removeConstraintEngineListener(constraintsListener);
+ constraintsListener = null;
+ }
+
+ constraintEngine = null;
+ if (displayEngine != null) {
+ displayEngine.dispose();
+ displayEngine = null;
+ }
+
+ if (toolkit != null) {
+ toolkit.dispose();
+ toolkit = null;
+ }
+
+ sections.forEach(ISection::dispose);
+ sections.clear();
+
+ if (welcomeLayout != null) {
+ welcomeLayout.dispose();
+ welcomeLayout = null;
+ }
+
+ propertyListeners.clear();
+ }
+
+ protected void createSections(Composite parent) {
+ IStructuredSelection selection = new StructuredSelection(model);
+ Set<View> views = constraintEngine.getViews(selection);
+
+ // Get the unique tabs
+ Map<String, WelcomeTab> tabProxies = new HashMap<>();
+ views.stream()
+ .flatMap(v -> v.getSections().stream())
+ .map(s -> s.getTab())
+ .forEach(tab -> {
+ WelcomeTab existing = tabProxies.get(tab.getId());
+ if (existing != null) {
+ existing.merge(tab);
+ } else {
+ tabProxies.put(tab.getId(), new WelcomeTab(tab));
+ }
+ });
+
+ List<WelcomeTab> tabs = new ArrayList<>(tabProxies.values());
+ sections = new ArrayList<>();
+
+ welcomeLayout = new WelcomeLayout(parent, toolkit, service);
+ welcomeLayout.createSections(tabs);
+
+ // Now, filter the sections in each tab for only those referenced
+ // by the views that we want to present
+ for (WelcomeTab next : tabs) {
+ next.filterSections(views);
+ }
+
+ for (WelcomeTab tab : tabs) {
+ for (Section section : tab.getSections()) {
+ XWTSection xwtSection = new XWTSection(section, tab.getView(section), displayEngine);
+ sections.add(xwtSection);
+
+ xwtSection.createControls(welcomeLayout.getTabControl(section.getTab()), null);
+ xwtSection.setInput(null, selection);
+ xwtSection.refresh();
+ }
+ }
+ }
+
+ protected void rebuildSections(Composite parent) {
+ displayEngine.invalidate();
+
+ welcomeLayout.dispose();
+
+ sections.forEach(ISection::dispose);
+ sections.clear();
+
+ createSections(parent);
+ parent.layout();
+ }
+
+ void reset() {
+ welcomeLayout.resetLayoutModel();
+ }
+
+ @Override
+ public void addPropertyListener(IPropertyListener listener) {
+ propertyListeners.addIfAbsent(listener);
+ }
+
+ @Override
+ public void removePropertyListener(IPropertyListener listener) {
+ propertyListeners.remove(listener);
+ }
+
+}
diff --git a/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/src/org/eclipse/papyrus/infra/editor/welcome/internal/WelcomePageFactory.java b/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/src/org/eclipse/papyrus/infra/editor/welcome/internal/WelcomePageFactory.java
new file mode 100644
index 00000000000..3e92854ef8e
--- /dev/null
+++ b/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/src/org/eclipse/papyrus/infra/editor/welcome/internal/WelcomePageFactory.java
@@ -0,0 +1,135 @@
+/*****************************************************************************
+ * Copyright (c) 2015 Christian W. Damus and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Christian W. Damus - Initial API and implementation
+ *
+ *****************************************************************************/
+
+package org.eclipse.papyrus.infra.editor.welcome.internal;
+
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.papyrus.infra.core.extension.diagrameditor.EditorDescriptor;
+import org.eclipse.papyrus.infra.core.extension.diagrameditor.IPluggableEditorFactory;
+import org.eclipse.papyrus.infra.core.sasheditor.contentprovider.IComponentModel;
+import org.eclipse.papyrus.infra.core.sasheditor.contentprovider.IPageModel;
+import org.eclipse.papyrus.infra.core.sasheditor.editor.ICloseablePart;
+import org.eclipse.papyrus.infra.core.services.ServiceException;
+import org.eclipse.papyrus.infra.core.services.ServicesRegistry;
+import org.eclipse.papyrus.infra.editor.welcome.IWelcomePageService;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Display;
+
+/**
+ * Papyrus Editor editor factory for the welcome page.
+ */
+public class WelcomePageFactory implements IPluggableEditorFactory {
+
+ private ServicesRegistry services;
+
+ private ImageDescriptor icon;
+
+ public WelcomePageFactory() {
+ super();
+ }
+
+ @Override
+ public void init(ServicesRegistry serviceRegistry, EditorDescriptor editorDescriptor) {
+ this.services = serviceRegistry;
+ this.icon = editorDescriptor.getIcon();
+ }
+
+ @Override
+ public IPageModel createIPageModel(Object pageIdentifier) {
+ return new WelcomePageModel(pageIdentifier);
+ }
+
+ @Override
+ public boolean isPageModelFactoryFor(Object pageIdentifier) {
+ return WelcomePageService.isModel(pageIdentifier);
+ }
+
+ //
+ // Nested types
+ //
+
+ private class WelcomePageModel implements IComponentModel, IAdaptable {
+
+ private Object model;
+ private Image iconImage;
+
+ private WelcomePage welcome;
+
+ WelcomePageModel(Object model) {
+ super();
+
+ this.model = model;
+ }
+
+ @Override
+ public <T> T getAdapter(Class<T> adapter) {
+ T result = null;
+
+ if ((adapter == ICloseablePart.class) || (adapter == WelcomePage.class)) {
+ result = adapter.cast(welcome); // Cast is null-safe
+ }
+
+ if (result == null) {
+ result = Platform.getAdapterManager().getAdapter(this, adapter);
+ }
+
+ return result;
+ }
+
+ @Override
+ public String getTabTitle() {
+ return "Welcome";
+ }
+
+ @Override
+ public Image getTabIcon() {
+ if ((iconImage == null) && (icon != null)) {
+ iconImage = icon.createImage(Display.getCurrent());
+ }
+
+ return iconImage;
+ }
+
+ @Override
+ public Object getRawModel() {
+ return model;
+ }
+
+ @Override
+ public void dispose() {
+ if (iconImage != null) {
+ iconImage.dispose();
+ iconImage = null;
+ }
+ }
+
+ @Override
+ public Composite createPartControl(Composite parent) {
+ Composite result = null;
+
+ try {
+ IWelcomePageService service = services.getService(IWelcomePageService.class);
+ welcome = new WelcomePage(service, model);
+ result = welcome.createControl(parent);
+ } catch (ServiceException e) {
+ throw new IllegalStateException("Welcome-page service not available", e);
+ }
+
+ return result;
+ }
+
+ }
+}
diff --git a/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/src/org/eclipse/papyrus/infra/editor/welcome/internal/WelcomePageService.java b/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/src/org/eclipse/papyrus/infra/editor/welcome/internal/WelcomePageService.java
new file mode 100644
index 00000000000..b0fbe3a6100
--- /dev/null
+++ b/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/src/org/eclipse/papyrus/infra/editor/welcome/internal/WelcomePageService.java
@@ -0,0 +1,417 @@
+/*****************************************************************************
+ * Copyright (c) 2015 Christian W. Damus and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Christian W. Damus - Initial API and implementation
+ *
+ *****************************************************************************/
+
+package org.eclipse.papyrus.infra.editor.welcome.internal;
+
+import java.util.Map;
+
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.emf.common.notify.NotificationChain;
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.emf.ecore.resource.ResourceSet;
+import org.eclipse.emf.ecore.resource.URIConverter;
+import org.eclipse.emf.ecore.resource.impl.ResourceImpl;
+import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl.ResourceLocator;
+import org.eclipse.emf.ecore.util.EcoreUtil;
+import org.eclipse.emf.edit.domain.EditingDomain;
+import org.eclipse.papyrus.infra.core.editor.IMultiDiagramEditor;
+import org.eclipse.papyrus.infra.core.resource.ModelSet;
+import org.eclipse.papyrus.infra.core.resource.sasheditor.SashModelUtils;
+import org.eclipse.papyrus.infra.core.sasheditor.contentprovider.IPageManager;
+import org.eclipse.papyrus.infra.core.sasheditor.di.contentprovider.utils.IPageUtils;
+import org.eclipse.papyrus.infra.core.sasheditor.editor.DefaultPageLifeCycleEventListener;
+import org.eclipse.papyrus.infra.core.sasheditor.editor.IComponentPage;
+import org.eclipse.papyrus.infra.core.sasheditor.editor.IEditorPage;
+import org.eclipse.papyrus.infra.core.sasheditor.editor.IPage;
+import org.eclipse.papyrus.infra.core.sasheditor.editor.IPageLifeCycleEventsListener;
+import org.eclipse.papyrus.infra.core.sasheditor.editor.IPageVisitor;
+import org.eclipse.papyrus.infra.core.sasheditor.editor.ISashWindowsContainer;
+import org.eclipse.papyrus.infra.core.sashwindows.di.PageRef;
+import org.eclipse.papyrus.infra.core.sashwindows.di.SashModel;
+import org.eclipse.papyrus.infra.core.sashwindows.di.TabFolder;
+import org.eclipse.papyrus.infra.core.services.EditorLifecycleEventListener;
+import org.eclipse.papyrus.infra.core.services.EditorLifecycleManager;
+import org.eclipse.papyrus.infra.core.services.ServiceException;
+import org.eclipse.papyrus.infra.core.services.ServicesRegistry;
+import org.eclipse.papyrus.infra.core.utils.TransactionHelper;
+import org.eclipse.papyrus.infra.editor.welcome.IWelcomePageService;
+import org.eclipse.papyrus.infra.editor.welcome.Welcome;
+import org.eclipse.papyrus.infra.editor.welcome.WelcomeFactory;
+import org.eclipse.papyrus.infra.editor.welcome.WelcomePackage;
+import org.eclipse.papyrus.infra.emf.utils.EMFHelper;
+import org.eclipse.swt.widgets.Display;
+
+/**
+ * Default implementation of the <em>Welcome Page</em> service.
+ */
+public class WelcomePageService implements IWelcomePageService {
+
+ private ServicesRegistry services;
+ private ISashWindowsContainer sashContainer;
+ private IPageManager pageManager;
+ private EditorLifecycleManager editorManager;
+
+ private WelcomeLocator welcomeLocator;
+
+ private IPageLifeCycleEventsListener sashListener;
+ private EditorLifecycleEventListener editorListener;
+
+ private IPage welcomePage;
+
+ public WelcomePageService() {
+ super();
+ }
+
+ @Override
+ public void init(ServicesRegistry servicesRegistry) throws ServiceException {
+ this.services = servicesRegistry;
+ }
+
+ @Override
+ public final ServicesRegistry getOwner() {
+ return services;
+ }
+
+ @Override
+ public void startService() throws ServiceException {
+ welcomeLocator = new WelcomeLocator(services.getService(ModelSet.class));
+
+ pageManager = services.getService(IPageManager.class);
+
+ editorManager = services.getService(EditorLifecycleManager.class);
+ editorListener = new EditorListener();
+ editorManager.addEditorLifecycleEventsListener(editorListener);
+ }
+
+ @Override
+ public void disposeService() throws ServiceException {
+ if (welcomeLocator != null) {
+ welcomeLocator.dispose();
+ welcomeLocator = null;
+ }
+
+ pageManager = null;
+
+ if (editorManager != null) {
+ editorManager.removeEditorLifecycleEventsListener(editorListener);
+ editorManager = null;
+ }
+ }
+
+ @Override
+ public boolean canCloseWelcomePage() {
+ return (welcomePage != null) && (getOpenPageCount() > 1);
+ }
+
+ public int getOpenPageCount() {
+ class PageCounter implements IPageVisitor {
+ int count = 0;
+
+ @Override
+ public void accept(IEditorPage page) {
+ count++;
+ }
+
+ @Override
+ public void accept(IComponentPage page) {
+ count++;
+ }
+ }
+
+ PageCounter counter = new PageCounter();
+
+ sashContainer.visit(counter);
+
+ return counter.count;
+ }
+
+ @Override
+ public void openWelcomePage() {
+ if (pageManager != null) {
+ if (welcomePage == null) {
+ pageManager.openPage(getModel());
+ } else {
+ pageManager.selectPage(getModel());
+ }
+ }
+ }
+
+ @Override
+ public void resetWelcomePage() {
+ if (welcomePage instanceof IAdaptable) {
+ ((IAdaptable) welcomePage).getAdapter(WelcomePage.class).reset();
+ }
+ }
+
+ void checkWelcomePage() {
+ Display.getDefault().asyncExec(() -> {
+ // Check that the editor hasn't been disposed in the mean-time
+ if ((sashContainer != null) && !sashContainer.isDisposed()) {
+ if (getOpenPageCount() <= 0) {
+ openWelcomePage();
+ }
+
+ if (welcomePage instanceof IAdaptable) {
+ ((IAdaptable) welcomePage).getAdapter(WelcomePage.class).fireCanCloseChanged();
+ }
+ }
+ });
+ }
+
+ @Override
+ public Welcome getWelcome() {
+ return welcomeLocator.getWelcome();
+ }
+
+ @Override
+ public Resource getWelcomeResource() {
+ return welcomeLocator.getWelcomeResource();
+ }
+
+ Object getModel() {
+ return getWelcome();
+ }
+
+ static boolean isModel(Object object) {
+ return object instanceof Welcome;
+ }
+
+ boolean isWelcomePage(IPage page) {
+ return isModel(IPageUtils.getRawModel(page));
+ }
+
+ void trackActivePage(PageRef pageRef) {
+ TabFolder folder = pageRef.getParent();
+
+ if ((folder != null) && (folder.getCurrentSelection() != pageRef)) {
+ SashModel sashModel = EMFHelper.getContainer(folder, SashModel.class);
+ if ((sashModel != null) && sashModel.isRestoreActivePage()) {
+ // track the active page in this folder, but not as an undoable operation
+ EditingDomain domain = EMFHelper.resolveEditingDomain(sashModel);
+
+ try {
+ TransactionHelper.run(domain, () -> folder.setCurrentSelection(pageRef));
+ } catch (Exception e) {
+ Activator.log.error("Failed to track page selection", e); //$NON-NLS-1$
+ }
+ }
+ }
+ }
+
+ void initializeActivePages(PageRef welcomePage) {
+ SashModel sashModel = EMFHelper.getContainer(welcomePage, SashModel.class);
+ if ((sashModel != null) && sashModel.isRestoreActivePage()) {
+ // Select all of the remembered pages to make them active
+ sashContainer.getIFolderList().stream()
+ .filter(f -> f.getRawModel() instanceof TabFolder)
+ .forEach(f -> {
+ TabFolder tabFolder = (TabFolder) f.getRawModel();
+ if (tabFolder.getCurrentSelection() != null) {
+ IPage page = sashContainer.lookupModelPage(tabFolder.getCurrentSelection());
+ if (page != null) {
+ sashContainer.selectPage(page);
+ }
+ }
+ });
+ }
+ }
+
+ //
+ // Nested types
+ //
+
+ private class SashListener extends DefaultPageLifeCycleEventListener {
+
+ @Override
+ public void pageOpened(IPage page) {
+ if (isWelcomePage(page)) {
+ welcomePage = page;
+ }
+
+ checkWelcomePage();
+ }
+
+ @Override
+ public void pageClosed(IPage page) {
+ if (page == welcomePage) {
+ welcomePage = null;
+ }
+
+ checkWelcomePage();
+ }
+
+ @Override
+ public void pageActivated(IPage page) {
+ if (page.getRawModel() instanceof PageRef) {
+ PageRef pageRef = (PageRef) page.getRawModel();
+ trackActivePage(pageRef);
+ }
+ }
+ }
+
+ private class EditorListener implements EditorLifecycleEventListener {
+
+ @Override
+ public void postInit(IMultiDiagramEditor editor) {
+ // Pass
+ }
+
+ @Override
+ public void preDisplay(IMultiDiagramEditor editor) {
+ sashContainer = editor.getAdapter(ISashWindowsContainer.class);
+ sashListener = new SashListener();
+ sashContainer.addPageLifeCycleListener(sashListener);
+
+ welcomePage = IPageUtils.lookupModelPage(sashContainer, getModel());
+ checkWelcomePage();
+
+ if ((welcomePage != null) && (welcomePage.getRawModel() instanceof PageRef)) {
+ initializeActivePages((PageRef) welcomePage.getRawModel());
+ }
+ }
+
+ @Override
+ public void postDisplay(IMultiDiagramEditor editor) {
+ // Pass
+ }
+
+ @Override
+ public void beforeClose(IMultiDiagramEditor editor) {
+ // By this time, it's already too late to remove the page lifecycle listener, so
+ // don't bother (it isn't necessary, anyways, once the sash container is gone)
+ sashListener = null;
+ }
+
+ }
+
+ private static class WelcomeLocator extends ResourceLocator {
+ private final Resource welcomeResource;
+ private final Welcome welcome;
+
+ WelcomeLocator(ModelSet modelSet) {
+ super(modelSet);
+
+ // TODO: Store this resource in the workspace metadata area for custom default layout
+ welcomeResource = new ResourceImpl(URI.createURI("papyrus.welcome:dynamic")) {
+ @Override
+ public ResourceSet getResourceSet() {
+ // Yes, this is a violation of the opposite constraint
+ return modelSet;
+ }
+
+ @Override
+ public NotificationChain basicSetResourceSet(ResourceSet resourceSet, NotificationChain notifications) {
+ throw new UnsupportedOperationException("setResourceSet");
+ }
+ };
+
+ org.eclipse.papyrus.infra.core.resource.sasheditor.SashModel sashModel = SashModelUtils.getSashModel(modelSet);
+ Resource sashRes = (sashModel == null) ? null : sashModel.getResource();
+ Welcome sashWelcome = (sashRes == null) ? null : (Welcome) EcoreUtil.getObjectByType(sashRes.getContents(), WelcomePackage.Literals.WELCOME);
+
+ if (sashWelcome != null) {
+ // The user has customized this one
+ welcome = sashWelcome;
+ } else {
+ // Create the empty prototype
+ welcome = WelcomeFactory.eINSTANCE.createWelcome();
+ welcomeResource.getContents().add(welcome);
+ }
+ }
+
+ @Override
+ public Resource getResource(URI uri, boolean loadOnDemand) {
+ Resource result;
+
+ if (uri.equals(welcomeResource.getURI())) {
+ // The welcome resource is always implicitly loaded
+ result = welcomeResource;
+ } else {
+ result = basicGetResource(uri, loadOnDemand);
+ }
+
+ return result;
+ }
+
+ // More or less copied from EMF
+ @Override
+ protected Resource basicGetResource(URI uri, boolean loadOnDemand) {
+ Map<URI, Resource> map = resourceSet.getURIResourceMap();
+ if (map != null) {
+ Resource resource = map.get(uri);
+ if (resource != null) {
+ if (loadOnDemand && !resource.isLoaded()) {
+ demandLoadHelper(resource);
+ }
+ return resource;
+ }
+ }
+
+ URIConverter theURIConverter = resourceSet.getURIConverter();
+ URI normalizedURI = theURIConverter.normalize(uri);
+ for (Resource resource : resourceSet.getResources()) {
+ if (theURIConverter.normalize(resource.getURI()).equals(normalizedURI)) {
+ if (loadOnDemand && !resource.isLoaded()) {
+ demandLoadHelper(resource);
+ }
+
+ if (map != null) {
+ map.put(uri, resource);
+ }
+ return resource;
+ }
+ }
+
+ Resource delegatedResource = delegatedGetResource(uri, loadOnDemand);
+ if (delegatedResource != null) {
+ if (map != null) {
+ map.put(uri, delegatedResource);
+ }
+ return delegatedResource;
+ }
+
+ if (loadOnDemand) {
+ Resource resource = demandCreateResource(uri);
+ if (resource == null) {
+ throw new IllegalArgumentException(String.format("Cannot create a resource for '%s'; a registered resource factory is needed", uri));
+ }
+
+ demandLoadHelper(resource);
+
+ if (map != null) {
+ map.put(uri, resource);
+ }
+ return resource;
+ }
+
+ return null;
+
+ }
+
+ @Override
+ public void dispose() {
+ super.dispose();
+
+ welcomeResource.unload();
+ }
+
+ Welcome getWelcome() {
+ return welcome;
+ }
+
+ Resource getWelcomeResource() {
+ return welcomeResource;
+ }
+ }
+}
diff --git a/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/src/org/eclipse/papyrus/infra/editor/welcome/internal/WelcomeTab.java b/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/src/org/eclipse/papyrus/infra/editor/welcome/internal/WelcomeTab.java
new file mode 100644
index 00000000000..0ee3bf75786
--- /dev/null
+++ b/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/src/org/eclipse/papyrus/infra/editor/welcome/internal/WelcomeTab.java
@@ -0,0 +1,133 @@
+/*****************************************************************************
+ * Copyright (c) 2015 Christian W. Damus and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Christian W. Damus - Initial API and implementation
+ *
+ *****************************************************************************/
+
+package org.eclipse.papyrus.infra.editor.welcome.internal;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.LinkedHashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+import java.util.Set;
+
+import org.eclipse.papyrus.views.properties.contexts.Section;
+import org.eclipse.papyrus.views.properties.contexts.Tab;
+import org.eclipse.papyrus.views.properties.contexts.View;
+import org.eclipse.swt.widgets.Composite;
+
+class WelcomeTab implements Comparable<WelcomeTab> {
+ private String id;
+ private Set<String> allTabIDs;
+ private String label;
+
+ private Set<Tab> tabs = new HashSet<>();
+ private final List<Section> sections;
+ private final Map<Section, View> views;
+
+ private int priority;
+
+ WelcomeTab(Tab tab) {
+ super();
+
+ this.id = tab.getId();
+ this.allTabIDs = new LinkedHashSet<>(Collections.singleton(tab.getId()));
+ this.label = tab.getLabel();
+ this.sections = new ArrayList<>(tab.getSections());
+ this.views = new HashMap<>();
+
+ priority = tab.getPriority();
+
+ tabs.add(tab);
+ }
+
+ public String getID() {
+ return id;
+ }
+
+ public Set<String> getAllTabIDs() {
+ return allTabIDs;
+ }
+
+ public String getLabel() {
+ return label;
+ }
+
+ public List<Section> getSections() {
+ return sections;
+ }
+
+ void filterSections(Set<View> views) {
+ for (Iterator<Section> iter = sections.iterator(); iter.hasNext();) {
+ Section section = iter.next();
+ Optional<View> view = views.stream().filter(v -> v.getSections().contains(section)).findFirst();
+ if (view.isPresent()) {
+ this.views.put(section, view.get());
+ } else {
+ iter.remove();
+ }
+ }
+ }
+
+ View getView(Section section) {
+ return views.get(section);
+ }
+
+ /**
+ * Sort in priority order, from highest to lowest, and with
+ * precendents before antecedents as indicated by the aggregate
+ * 'afterTab' relationships.
+ */
+ @Override
+ public int compareTo(WelcomeTab o) {
+ int result = o.precedes(this) ? +1 : this.precedes(o) ? -1 : 0;
+
+ if (result == 0) {
+ result = o.priority - this.priority;
+ }
+
+ return result;
+ }
+
+ boolean precedes(WelcomeTab other) {
+ // I precede another tab-proxy if, in aggregate, more of its tabs are after my
+ // tabs that vice versa
+ long otherAntecedents = other.tabs.stream().filter(tab -> this.tabs.contains(tab.getAfterTab())).count();
+ long myAntecedents = this.tabs.stream().filter(tab -> other.tabs.contains(tab.getAfterTab())).count();
+ return otherAntecedents > myAntecedents;
+ }
+
+ void merge(Tab tab) {
+ if (tabs.add(tab)) {
+ allTabIDs.add(tab.getId());
+
+ if (tab.getPriority() > priority) {
+ priority = tab.getPriority();
+ id = tab.getId();
+
+ // Insert these at the head
+ sections.addAll(0, tab.getSections());
+ } else {
+ // Append these sections
+ sections.addAll(tab.getSections());
+ }
+ }
+ }
+
+ void register(Composite composite, Map<? super Tab, ? super Composite> tabControls) {
+ tabs.forEach(tab -> tabControls.put(tab, composite));
+ }
+}
diff --git a/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/src/org/eclipse/papyrus/infra/editor/welcome/internal/commands/ResetWelcomePageHandler.java b/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/src/org/eclipse/papyrus/infra/editor/welcome/internal/commands/ResetWelcomePageHandler.java
new file mode 100644
index 00000000000..dcca8434288
--- /dev/null
+++ b/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/src/org/eclipse/papyrus/infra/editor/welcome/internal/commands/ResetWelcomePageHandler.java
@@ -0,0 +1,71 @@
+/*****************************************************************************
+ * Copyright (c) 2015 Christian W. Damus and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Christian W. Damus - Initial API and implementation
+ *
+ *****************************************************************************/
+
+package org.eclipse.papyrus.infra.editor.welcome.internal.commands;
+
+import org.eclipse.core.commands.AbstractHandler;
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.papyrus.infra.core.editor.IMultiDiagramEditor;
+import org.eclipse.papyrus.infra.core.sasheditor.di.contentprovider.utils.IPageUtils;
+import org.eclipse.papyrus.infra.core.sasheditor.editor.IPage;
+import org.eclipse.papyrus.infra.core.sasheditor.editor.ISashWindowsContainer;
+import org.eclipse.papyrus.infra.core.services.ServiceException;
+import org.eclipse.papyrus.infra.editor.welcome.IWelcomePageService;
+import org.eclipse.papyrus.infra.editor.welcome.Welcome;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.ISources;
+import org.eclipse.ui.handlers.HandlerUtil;
+
+/**
+ * Handler for the <em>Reset Welcome Page</em> menu command.
+ */
+public class ResetWelcomePageHandler extends AbstractHandler {
+
+ public ResetWelcomePageHandler() {
+ super();
+ }
+
+ @Override
+ public Object execute(ExecutionEvent event) throws ExecutionException {
+ IEditorPart editor = HandlerUtil.getActiveEditor(event);
+
+ if (editor instanceof IMultiDiagramEditor) {
+ try {
+ IWelcomePageService welcomeService = ((IMultiDiagramEditor) editor).getServicesRegistry().getService(IWelcomePageService.class);
+ welcomeService.resetWelcomePage();
+ } catch (ServiceException e) {
+ throw new ExecutionException("Could not obtain the welcome-page service.", e); //$NON-NLS-1$
+ }
+ }
+
+ return null;
+ }
+
+ @Override
+ public void setEnabled(Object evaluationContext) {
+ boolean enable = false;
+
+ Object editor = HandlerUtil.getVariable(evaluationContext, ISources.ACTIVE_EDITOR_NAME);
+
+ if (editor instanceof IMultiDiagramEditor) {
+ ISashWindowsContainer sashContainer = ((IMultiDiagramEditor) editor).getAdapter(ISashWindowsContainer.class);
+ if ((sashContainer != null) && !sashContainer.isDisposed()) {
+ IPage activePage = sashContainer.getActiveSashWindowsPage();
+ enable = (activePage != null) && (IPageUtils.getRawModel(activePage) instanceof Welcome);
+ }
+ }
+
+ setBaseEnabled(enable);
+ }
+}
diff --git a/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/src/org/eclipse/papyrus/infra/editor/welcome/internal/commands/ShowWelcomePageHandler.java b/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/src/org/eclipse/papyrus/infra/editor/welcome/internal/commands/ShowWelcomePageHandler.java
new file mode 100644
index 00000000000..9b4fbf2c5bc
--- /dev/null
+++ b/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/src/org/eclipse/papyrus/infra/editor/welcome/internal/commands/ShowWelcomePageHandler.java
@@ -0,0 +1,71 @@
+/*****************************************************************************
+ * Copyright (c) 2015 Christian W. Damus and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Christian W. Damus - Initial API and implementation
+ *
+ *****************************************************************************/
+
+package org.eclipse.papyrus.infra.editor.welcome.internal.commands;
+
+import org.eclipse.core.commands.AbstractHandler;
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.papyrus.infra.core.editor.IMultiDiagramEditor;
+import org.eclipse.papyrus.infra.core.sasheditor.di.contentprovider.utils.IPageUtils;
+import org.eclipse.papyrus.infra.core.sasheditor.editor.IPage;
+import org.eclipse.papyrus.infra.core.sasheditor.editor.ISashWindowsContainer;
+import org.eclipse.papyrus.infra.core.services.ServiceException;
+import org.eclipse.papyrus.infra.editor.welcome.IWelcomePageService;
+import org.eclipse.papyrus.infra.editor.welcome.Welcome;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.ISources;
+import org.eclipse.ui.handlers.HandlerUtil;
+
+/**
+ * Handler for the <em>Show Welcome Page</em> menu command.
+ */
+public class ShowWelcomePageHandler extends AbstractHandler {
+
+ public ShowWelcomePageHandler() {
+ super();
+ }
+
+ @Override
+ public Object execute(ExecutionEvent event) throws ExecutionException {
+ IEditorPart editor = HandlerUtil.getActiveEditor(event);
+
+ if (editor instanceof IMultiDiagramEditor) {
+ try {
+ IWelcomePageService welcomeService = ((IMultiDiagramEditor) editor).getServicesRegistry().getService(IWelcomePageService.class);
+ welcomeService.openWelcomePage();
+ } catch (ServiceException e) {
+ throw new ExecutionException("Could not obtain the welcome-page service.", e); //$NON-NLS-1$
+ }
+ }
+
+ return null;
+ }
+
+ @Override
+ public void setEnabled(Object evaluationContext) {
+ boolean enable = true;
+
+ Object editor = HandlerUtil.getVariable(evaluationContext, ISources.ACTIVE_EDITOR_NAME);
+
+ if (editor instanceof IMultiDiagramEditor) {
+ ISashWindowsContainer sashContainer = ((IMultiDiagramEditor) editor).getAdapter(ISashWindowsContainer.class);
+ if ((sashContainer != null) && !sashContainer.isDisposed()) {
+ IPage activePage = sashContainer.getActiveSashWindowsPage();
+ enable = (activePage == null) || !(IPageUtils.getRawModel(activePage) instanceof Welcome);
+ }
+ }
+
+ setBaseEnabled(enable);
+ }
+}
diff --git a/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/src/org/eclipse/papyrus/infra/editor/welcome/internal/constraints/IsWelcomeElement.java b/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/src/org/eclipse/papyrus/infra/editor/welcome/internal/constraints/IsWelcomeElement.java
new file mode 100644
index 00000000000..845d8f48116
--- /dev/null
+++ b/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/src/org/eclipse/papyrus/infra/editor/welcome/internal/constraints/IsWelcomeElement.java
@@ -0,0 +1,50 @@
+/*****************************************************************************
+ * Copyright (c) 2015 Christian W. Damus and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Christian W. Damus - Initial API and implementation
+ *
+ *****************************************************************************/
+
+package org.eclipse.papyrus.infra.editor.welcome.internal.constraints;
+
+import org.eclipse.emf.ecore.EClassifier;
+import org.eclipse.papyrus.infra.constraints.SimpleConstraint;
+import org.eclipse.papyrus.infra.constraints.constraints.AbstractConstraint;
+import org.eclipse.papyrus.infra.constraints.constraints.Constraint;
+import org.eclipse.papyrus.infra.editor.welcome.WelcomePackage;
+
+/**
+ * @author damus
+ *
+ */
+public class IsWelcomeElement extends AbstractConstraint {
+
+ private EClassifier eclassifier;
+
+ public IsWelcomeElement() {
+ super();
+ }
+
+ @Override
+ protected void setDescriptor(SimpleConstraint descriptor) {
+ eclassifier = WelcomePackage.eINSTANCE.getEClassifier(getValue("metaclassName"));
+ }
+
+ @Override
+ protected boolean match(Object selection) {
+ return (eclassifier != null) && eclassifier.isInstance(selection);
+ }
+
+ @Override
+ protected boolean equivalent(Constraint other) {
+ return (other instanceof IsWelcomeElement)
+ && (((IsWelcomeElement) other).eclassifier == this.eclassifier);
+ }
+
+}
diff --git a/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/src/org/eclipse/papyrus/infra/editor/welcome/internal/dnd/WelcomeSectionTransfer.java b/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/src/org/eclipse/papyrus/infra/editor/welcome/internal/dnd/WelcomeSectionTransfer.java
new file mode 100644
index 00000000000..c098eb742e4
--- /dev/null
+++ b/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/src/org/eclipse/papyrus/infra/editor/welcome/internal/dnd/WelcomeSectionTransfer.java
@@ -0,0 +1,32 @@
+/*****************************************************************************
+ * Copyright (c) 2015 Christian W. Damus and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Christian W. Damus - Initial API and implementation
+ *
+ *****************************************************************************/
+
+package org.eclipse.papyrus.infra.editor.welcome.internal.dnd;
+
+import org.eclipse.papyrus.infra.tools.dnd.PapyrusTransfer;
+import org.eclipse.ui.forms.widgets.Section;
+
+/**
+ * A transfer type for sections dragged around in the welcome page (to rearrange them).
+ */
+public class WelcomeSectionTransfer extends PapyrusTransfer<Section> {
+ private static final WelcomeSectionTransfer INSTANCE = new WelcomeSectionTransfer();
+
+ private WelcomeSectionTransfer() {
+ super(Section.class);
+ }
+
+ public static WelcomeSectionTransfer getInstance() {
+ return INSTANCE;
+ }
+}
diff --git a/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/src/org/eclipse/papyrus/infra/editor/welcome/internal/modelelements/AbstractPageLayoutToggleValue.java b/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/src/org/eclipse/papyrus/infra/editor/welcome/internal/modelelements/AbstractPageLayoutToggleValue.java
new file mode 100644
index 00000000000..fb056e69e61
--- /dev/null
+++ b/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/src/org/eclipse/papyrus/infra/editor/welcome/internal/modelelements/AbstractPageLayoutToggleValue.java
@@ -0,0 +1,106 @@
+/*****************************************************************************
+ * Copyright (c) 2015 Christian W. Damus and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Christian W. Damus - Initial API and implementation
+ *
+ *****************************************************************************/
+
+package org.eclipse.papyrus.infra.editor.welcome.internal.modelelements;
+
+import java.util.Objects;
+
+import org.eclipse.core.databinding.observable.Diffs;
+import org.eclipse.core.databinding.observable.Realm;
+import org.eclipse.core.databinding.observable.value.AbstractObservableValue;
+import org.eclipse.emf.common.command.Command;
+import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.emf.edit.domain.EditingDomain;
+import org.eclipse.papyrus.infra.core.editor.IMultiDiagramEditor;
+import org.eclipse.papyrus.infra.core.resource.ModelSet;
+import org.eclipse.papyrus.infra.core.resource.sasheditor.SashLayoutCommandFactory;
+import org.eclipse.papyrus.infra.core.resource.sasheditor.SashModel;
+import org.eclipse.papyrus.infra.core.resource.sasheditor.SashModelUtils;
+import org.eclipse.papyrus.infra.core.sashwindows.di.SashWindowsMngr;
+import org.eclipse.papyrus.infra.core.sashwindows.di.util.DiUtils;
+import org.eclipse.papyrus.infra.core.services.SaveLayoutBeforeClose;
+import org.eclipse.papyrus.infra.core.services.ServiceException;
+import org.eclipse.papyrus.infra.core.utils.TransactionHelper;
+import org.eclipse.papyrus.infra.editor.welcome.internal.Activator;
+import org.eclipse.papyrus.infra.emf.utils.ServiceUtilsForResourceSet;
+
+/**
+ * Non-transactional boolean-valued observable properties of the page layout
+ * management for Papyrus Editors.
+ */
+public abstract class AbstractPageLayoutToggleValue extends AbstractObservableValue<Boolean> {
+
+ protected final EditingDomain domain;
+ protected final SashModel sashModel;
+
+ public AbstractPageLayoutToggleValue(WelcomeModelElement owner) {
+ this(Realm.getDefault(), owner);
+ }
+
+ public AbstractPageLayoutToggleValue(Realm realm, WelcomeModelElement owner) {
+ super(realm);
+
+ domain = owner.getDomain();
+ sashModel = SashModelUtils.getSashModel((ModelSet) domain.getResourceSet());
+ }
+
+ @Override
+ public Object getValueType() {
+ return Boolean.class;
+ }
+
+ protected SashWindowsMngr getSashWindowsMngr() {
+ return getSashWindowsMngr(sashModel.getResource());
+ }
+
+ protected SashWindowsMngr getSashWindowsMngr(Resource resource) {
+ return DiUtils.lookupSashWindowsMngr(resource);
+ }
+
+ protected abstract Command getToggleCommand(SashLayoutCommandFactory factory);
+
+ @Override
+ protected void doSetValue(Boolean value) {
+ Boolean oldValue = getValue();
+ if (!Objects.equals(oldValue, value)) {
+ IMultiDiagramEditor editor;
+
+ try {
+ editor = ServiceUtilsForResourceSet.getInstance().getService(IMultiDiagramEditor.class, domain.getResourceSet());
+ Command command = getToggleCommand(new SashLayoutCommandFactory(editor));
+ if (command.canExecute()) {
+ // Don't do this in an undoable command on the history
+ try {
+ TransactionHelper.run(domain, () -> command.execute());
+ fireValueChange(Diffs.createValueDiff(oldValue, value));
+ } catch (Exception e) {
+ Activator.log.error("Failed to toggle editor page layout option", e); //$NON-NLS-1$
+ }
+ }
+ } catch (ServiceException e) {
+ throw new IllegalStateException("No editor available in the service registry", e); //$NON-NLS-1$
+ }
+
+ try {
+ SaveLayoutBeforeClose saveLayout = editor.getServicesRegistry().getService(SaveLayoutBeforeClose.class);
+
+ // This won't actually save if the editor is dirty, to avoid inconsistencies
+ // (and saving the editor later will save the sash model, too)
+ saveLayout.saveBeforeClose(editor);
+ } catch (ServiceException e) {
+ // We'll get it later
+ Activator.log.error("Failed to save page layout", e); //$NON-NLS-1$
+ }
+ }
+ }
+}
diff --git a/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/src/org/eclipse/papyrus/infra/editor/welcome/internal/modelelements/LanguageObservable.java b/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/src/org/eclipse/papyrus/infra/editor/welcome/internal/modelelements/LanguageObservable.java
new file mode 100644
index 00000000000..e1738730640
--- /dev/null
+++ b/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/src/org/eclipse/papyrus/infra/editor/welcome/internal/modelelements/LanguageObservable.java
@@ -0,0 +1,82 @@
+/*****************************************************************************
+ * Copyright (c) 2015 Christian W. Damus and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Christian W. Damus - Initial API and implementation
+ *
+ *****************************************************************************/
+
+package org.eclipse.papyrus.infra.editor.welcome.internal.modelelements;
+
+import org.eclipse.core.databinding.observable.AbstractObservable;
+import org.eclipse.core.databinding.observable.ChangeEvent;
+import org.eclipse.core.databinding.observable.IChangeListener;
+import org.eclipse.core.databinding.observable.Realm;
+import org.eclipse.core.databinding.observable.value.IObservableValue;
+import org.eclipse.papyrus.infra.core.language.ILanguage;
+import org.eclipse.papyrus.infra.core.language.Version;
+import org.eclipse.papyrus.infra.tools.databinding.TouchableValue;
+
+/**
+ * An observable encapsulation of an {@link ILanguage}.
+ */
+public class LanguageObservable extends AbstractObservable {
+ private final ILanguage language;
+
+ private final TouchableValue<String> nameValue;
+ private final TouchableValue<Version> versionValue;
+
+ public LanguageObservable(ILanguage language) {
+ this(Realm.getDefault(), language);
+ }
+
+ public LanguageObservable(Realm realm, ILanguage language) {
+ super(realm);
+
+ this.language = language;
+
+ this.nameValue = new TouchableValue<String>(realm, String.class, language.getName());
+ this.versionValue = new TouchableValue<Version>(realm, Version.class, language.getVersion());
+
+ // Roll up changes to my elements as changes to me
+ IChangeListener rollup = new IChangeListener() {
+
+ @Override
+ public void handleChange(ChangeEvent event) {
+ LanguageObservable.this.fireChange();
+ }
+ };
+ nameValue.addChangeListener(rollup);
+ versionValue.addChangeListener(rollup);
+ }
+
+ @Override
+ public synchronized void dispose() {
+ nameValue.dispose();
+ versionValue.dispose();
+
+ super.dispose();
+ }
+
+ public IObservableValue<String> getName() {
+ return nameValue;
+ }
+
+ public IObservableValue<Version> getVersion() {
+ return versionValue;
+ }
+
+ @Override
+ public boolean isStale() {
+ return false;
+ }
+
+ ILanguage getLanguage() {
+ return language;
+ }
+}
diff --git a/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/src/org/eclipse/papyrus/infra/editor/welcome/internal/modelelements/LanguagesObservableList.java b/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/src/org/eclipse/papyrus/infra/editor/welcome/internal/modelelements/LanguagesObservableList.java
new file mode 100644
index 00000000000..3b051203ab3
--- /dev/null
+++ b/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/src/org/eclipse/papyrus/infra/editor/welcome/internal/modelelements/LanguagesObservableList.java
@@ -0,0 +1,81 @@
+/*****************************************************************************
+ * Copyright (c) 2015 Christian W. Damus and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Christian W. Damus - Initial API and implementation
+ *
+ *****************************************************************************/
+
+package org.eclipse.papyrus.infra.editor.welcome.internal.modelelements;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.stream.Collectors;
+
+import org.eclipse.papyrus.infra.core.Activator;
+import org.eclipse.papyrus.infra.core.language.ILanguage;
+import org.eclipse.papyrus.infra.core.language.ILanguageChangeListener;
+import org.eclipse.papyrus.infra.core.language.ILanguageService;
+import org.eclipse.papyrus.infra.core.language.LanguageChangeEvent;
+import org.eclipse.papyrus.infra.core.resource.ModelSet;
+import org.eclipse.papyrus.infra.core.services.ServiceException;
+import org.eclipse.papyrus.infra.emf.utils.ServiceUtilsForResourceSet;
+import org.eclipse.papyrus.infra.tools.databinding.WritableListWithIterator;
+
+/**
+ * An observable list of the {@code LanguageObservable}s encapsulating the
+ * {@link ILanguage}s instantiated in the model.
+ */
+public class LanguagesObservableList extends WritableListWithIterator<LanguageObservable> {
+ private ILanguageService languageService;
+ private ILanguageChangeListener languagesListener;
+
+
+ public LanguagesObservableList(WelcomeModelElement owner) {
+ super(new ArrayList<>(), LanguageObservable.class);
+
+ try {
+ this.languageService = ServiceUtilsForResourceSet.getInstance().getService(ILanguageService.class, owner.getDomain().getResourceSet());
+ hookLanguagesListener();
+ } catch (ServiceException e) {
+ Activator.log.error("Cannot obtain language service. Languages will not be shown.", e); //$NON-NLS-1$
+ }
+ }
+
+ @Override
+ public synchronized void dispose() {
+ if (languagesListener != null) {
+ languageService.removeLanguageChangeListener(languagesListener);
+ languagesListener = null;
+ languageService = null;
+ }
+
+ super.dispose();
+ }
+
+ void hookLanguagesListener() {
+ languagesListener = event -> {
+ switch (event.getType()) {
+ case LanguageChangeEvent.ADDED:
+ addAll(event.getLanguages().stream().map(LanguageObservable::new).collect(Collectors.toList()));
+ break;
+ case LanguageChangeEvent.REMOVED:
+ removeAll(getObservables(event.getLanguages()));
+ break;
+ }
+ };
+
+ ModelSet modelSet = languageService.getAdapter(ModelSet.class);
+ addAll(languageService.getLanguages(modelSet.getURIWithoutExtension(), false).stream().map(LanguageObservable::new).collect(Collectors.toList()));
+ languageService.addLanguageChangeListener(languagesListener);
+ }
+
+ Collection<LanguageObservable> getObservables(Collection<? extends ILanguage> languages) {
+ return stream().filter(o -> languages.contains(o.getLanguage())).collect(Collectors.toList());
+ }
+}
diff --git a/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/src/org/eclipse/papyrus/infra/editor/welcome/internal/modelelements/PrivateLayoutValue.java b/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/src/org/eclipse/papyrus/infra/editor/welcome/internal/modelelements/PrivateLayoutValue.java
new file mode 100644
index 00000000000..87fc82a0577
--- /dev/null
+++ b/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/src/org/eclipse/papyrus/infra/editor/welcome/internal/modelelements/PrivateLayoutValue.java
@@ -0,0 +1,78 @@
+/*****************************************************************************
+ * Copyright (c) 2015 Christian W. Damus and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Christian W. Damus - Initial API and implementation
+ *
+ *****************************************************************************/
+
+package org.eclipse.papyrus.infra.editor.welcome.internal.modelelements;
+
+import static org.eclipse.core.databinding.observable.Diffs.createValueDiff;
+
+import java.beans.PropertyChangeEvent;
+import java.beans.PropertyChangeListener;
+
+import org.eclipse.core.databinding.observable.Realm;
+import org.eclipse.emf.common.command.Command;
+import org.eclipse.papyrus.infra.core.resource.ModelSet;
+import org.eclipse.papyrus.infra.core.resource.sasheditor.SashLayoutCommandFactory;
+import org.eclipse.papyrus.infra.core.resource.sasheditor.SashModel;
+import org.eclipse.papyrus.infra.core.resource.sasheditor.SashModelUtils;
+
+/**
+ * Encapsulation of the "shared layout" property of the Papyrus Editor.
+ */
+public class PrivateLayoutValue extends AbstractPageLayoutToggleValue implements PropertyChangeListener {
+
+ private SashModel sashModel;
+
+ public PrivateLayoutValue(WelcomeModelElement owner) {
+ this(Realm.getDefault(), owner);
+ }
+
+ public PrivateLayoutValue(Realm realm, WelcomeModelElement owner) {
+ super(realm, owner);
+
+ sashModel = SashModelUtils.getSashModel((ModelSet) owner.getDomain().getResourceSet());
+ if (sashModel != null) {
+ sashModel.addPropertyChangeListener(SashModel.PROPERTY_LEGACY_MODE, this);
+ }
+ }
+
+ @Override
+ public synchronized void dispose() {
+ if (sashModel != null) {
+ sashModel.removePropertyChangeListener(SashModel.PROPERTY_LEGACY_MODE, this);
+ sashModel = null;
+ }
+
+ super.dispose();
+ }
+
+ @Override
+ protected Boolean doGetValue() {
+ return !sashModel.isLegacyMode();
+ }
+
+ @Override
+ protected Command getToggleCommand(SashLayoutCommandFactory factory) {
+ return factory.createTogglePrivateLayoutCommand();
+ }
+
+ @Override
+ public void propertyChange(PropertyChangeEvent evt) {
+ if (evt.getSource() == sashModel) {
+ switch (evt.getPropertyName()) {
+ case SashModel.PROPERTY_LEGACY_MODE:
+ fireValueChange(createValueDiff(!(Boolean) evt.getOldValue(), !(Boolean) evt.getNewValue()));
+ break;
+ }
+ }
+ }
+}
diff --git a/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/src/org/eclipse/papyrus/infra/editor/welcome/internal/modelelements/RestoreActivePageValue.java b/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/src/org/eclipse/papyrus/infra/editor/welcome/internal/modelelements/RestoreActivePageValue.java
new file mode 100644
index 00000000000..e7b2c42ae4a
--- /dev/null
+++ b/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/src/org/eclipse/papyrus/infra/editor/welcome/internal/modelelements/RestoreActivePageValue.java
@@ -0,0 +1,52 @@
+/*****************************************************************************
+ * Copyright (c) 2015 Christian W. Damus and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Christian W. Damus - Initial API and implementation
+ *
+ *****************************************************************************/
+
+package org.eclipse.papyrus.infra.editor.welcome.internal.modelelements;
+
+import org.eclipse.core.databinding.observable.Realm;
+import org.eclipse.emf.common.command.Command;
+import org.eclipse.papyrus.infra.core.resource.sasheditor.SashLayoutCommandFactory;
+import org.eclipse.papyrus.infra.core.sashwindows.di.SashModel;
+import org.eclipse.papyrus.infra.core.sashwindows.di.SashWindowsMngr;
+
+/**
+ * Encapsulation of the "restore active page" property of the Papyrus Editor.
+ */
+public class RestoreActivePageValue extends AbstractPageLayoutToggleValue {
+
+ public RestoreActivePageValue(WelcomeModelElement owner) {
+ super(owner);
+ }
+
+ public RestoreActivePageValue(Realm realm, WelcomeModelElement owner) {
+ super(realm, owner);
+ }
+
+ @Override
+ protected Boolean doGetValue() {
+ boolean result = false;
+
+ SashWindowsMngr sash = getSashWindowsMngr();
+ SashModel model = (sash == null) ? null : sash.getSashModel();
+ if (model != null) {
+ result = model.isRestoreActivePage();
+ }
+
+ return result;
+ }
+
+ @Override
+ protected Command getToggleCommand(SashLayoutCommandFactory factory) {
+ return factory.createToggleRestoreActivePageCommand();
+ }
+}
diff --git a/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/src/org/eclipse/papyrus/infra/editor/welcome/internal/modelelements/WelcomeModelElement.java b/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/src/org/eclipse/papyrus/infra/editor/welcome/internal/modelelements/WelcomeModelElement.java
new file mode 100644
index 00000000000..d0606db54e5
--- /dev/null
+++ b/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/src/org/eclipse/papyrus/infra/editor/welcome/internal/modelelements/WelcomeModelElement.java
@@ -0,0 +1,100 @@
+/*****************************************************************************
+ * Copyright (c) 2015 Christian W. Damus and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Christian W. Damus - Initial API and implementation
+ *
+ *****************************************************************************/
+
+package org.eclipse.papyrus.infra.editor.welcome.internal.modelelements;
+
+import org.eclipse.core.databinding.observable.IObservable;
+import org.eclipse.core.databinding.observable.value.IObservableValue;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.edit.domain.EditingDomain;
+import org.eclipse.papyrus.views.properties.modelelement.EMFModelElement;
+
+/**
+ * @author damus
+ *
+ */
+public class WelcomeModelElement extends EMFModelElement {
+ private final String PRIVATE_LAYOUT = "privateLayout"; //$NON-NLS-1$
+ private final String RESTORE_ACTIVE_PAGE = "restoreActivePage"; //$NON-NLS-1$
+ private final String LANGUAGES = "languages"; //$NON-NLS-1$
+
+ public WelcomeModelElement(EObject source, EditingDomain domain) {
+ super(source, domain);
+ }
+
+ @Override
+ protected IObservable doGetObservable(String propertyPath) {
+ IObservable result;
+
+ switch (propertyPath) {
+ case PRIVATE_LAYOUT:
+ result = new PrivateLayoutValue(this);
+ break;
+ case RESTORE_ACTIVE_PAGE:
+ result = new RestoreActivePageValue(this);
+ break;
+ case LANGUAGES:
+ result = new LanguagesObservableList(this);
+ break;
+ default:
+ result = super.doGetObservable(propertyPath);
+ break;
+ }
+
+ return result;
+ }
+
+ @Override
+ protected boolean isFeatureEditable(String propertyPath) {
+ boolean result;
+
+ switch (propertyPath) {
+ case PRIVATE_LAYOUT:
+ result = true;
+ break;
+ case RESTORE_ACTIVE_PAGE:
+ IObservableValue<?> privateLayout = (IObservableValue<?>) getObservable(PRIVATE_LAYOUT);
+ result = Boolean.TRUE.equals(privateLayout.getValue());
+ break;
+ case LANGUAGES:
+ result = true;
+ break;
+ default:
+ result = super.isEditable(propertyPath);
+ break;
+ }
+
+ return result;
+ }
+
+ @Override
+ protected boolean isElementEditable() {
+ return true;
+ }
+
+ @Override
+ public boolean forceRefresh(String propertyPath) {
+ boolean result;
+
+ switch (propertyPath) {
+ case RESTORE_ACTIVE_PAGE:
+ result = true;
+ break;
+ default:
+ result = super.forceRefresh(propertyPath);
+ break;
+ }
+
+ return result;
+ }
+}
diff --git a/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/src/org/eclipse/papyrus/infra/editor/welcome/internal/modelelements/WelcomeModelElementFactory.java b/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/src/org/eclipse/papyrus/infra/editor/welcome/internal/modelelements/WelcomeModelElementFactory.java
new file mode 100644
index 00000000000..3dd37ab9e15
--- /dev/null
+++ b/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/src/org/eclipse/papyrus/infra/editor/welcome/internal/modelelements/WelcomeModelElementFactory.java
@@ -0,0 +1,45 @@
+/*****************************************************************************
+ * Copyright (c) 2015 Christian W. Damus and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Christian W. Damus - Initial API and implementation
+ *
+ *****************************************************************************/
+
+package org.eclipse.papyrus.infra.editor.welcome.internal.modelelements;
+
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.edit.domain.EditingDomain;
+import org.eclipse.papyrus.infra.emf.utils.EMFHelper;
+import org.eclipse.papyrus.views.properties.Activator;
+import org.eclipse.papyrus.views.properties.contexts.DataContextElement;
+import org.eclipse.papyrus.views.properties.modelelement.AbstractEMFModelElementFactory;
+
+/**
+ * @author damus
+ *
+ */
+public class WelcomeModelElementFactory extends AbstractEMFModelElementFactory<WelcomeModelElement> {
+
+ public WelcomeModelElementFactory() {
+ super();
+ }
+
+ @Override
+ protected WelcomeModelElement doCreateFromSource(Object sourceElement, DataContextElement context) {
+ EObject source = EMFHelper.getEObject(sourceElement);
+ if (source == null) {
+ Activator.log.warn("Unable to resolve the selected element to an EObject"); //$NON-NLS-1$
+ return null;
+ }
+
+ EditingDomain domain = EMFHelper.resolveEditingDomain(source);
+ return new WelcomeModelElement(source, domain);
+ }
+
+}
diff --git a/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/src/org/eclipse/papyrus/infra/editor/welcome/internal/widgets/OpenViewLink.java b/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/src/org/eclipse/papyrus/infra/editor/welcome/internal/widgets/OpenViewLink.java
new file mode 100644
index 00000000000..12a89da58a5
--- /dev/null
+++ b/plugins/infra/editor/org.eclipse.papyrus.infra.editor.welcome/src/org/eclipse/papyrus/infra/editor/welcome/internal/widgets/OpenViewLink.java
@@ -0,0 +1,171 @@
+/*****************************************************************************
+ * Copyright (c) 2015 Christian W. Damus and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Christian W. Damus - Initial API and implementation
+ *
+ *****************************************************************************/
+
+package org.eclipse.papyrus.infra.editor.welcome.internal.widgets;
+
+import org.eclipse.jface.layout.GridLayoutFactory;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.ui.IWorkbench;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.PartInitException;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.forms.HyperlinkGroup;
+import org.eclipse.ui.forms.HyperlinkSettings;
+import org.eclipse.ui.forms.events.HyperlinkEvent;
+import org.eclipse.ui.forms.events.IHyperlinkListener;
+import org.eclipse.ui.forms.widgets.ImageHyperlink;
+import org.eclipse.ui.statushandlers.StatusManager;
+import org.eclipse.ui.views.IViewDescriptor;
+
+/**
+ * A composite that shows a hyperlink to a view to open, if that view exists.
+ */
+public class OpenViewLink extends Composite implements IHyperlinkListener {
+ private static final String KEY_HLINK_GROUP = "hlinkGroup"; //$NON-NLS-1$
+
+ private ImageHyperlink link;
+
+ private Image icon = null;
+
+ public OpenViewLink(Composite parent, int style) {
+ super(parent, style);
+
+ GridLayoutFactory.fillDefaults().applyTo(this);
+
+ link = new ImageHyperlink(this, SWT.WRAP);
+ getHyperlinkGroup(parent).add(link);
+ link.addHyperlinkListener(this);
+ }
+
+ @Override
+ public void dispose() {
+ super.dispose();
+
+ if (icon != null) {
+ icon.dispose();
+ icon = null;
+ }
+
+ link = null;
+ }
+
+ static HyperlinkGroup getHyperlinkGroup(Composite parent) {
+ HyperlinkGroup result = (HyperlinkGroup) parent.getData(KEY_HLINK_GROUP);
+
+ if (result == null) {
+ result = new HyperlinkGroup(parent.getDisplay());
+ result.setHyperlinkUnderlineMode(HyperlinkSettings.UNDERLINE_ALWAYS);
+ parent.setData(KEY_HLINK_GROUP, result);
+ }
+
+ return result;
+ }
+
+ public String getLabel() {
+ return link.getText();
+ }
+
+ public void setLabel(String label) {
+ if (label == null) {
+ label = "";
+ }
+
+ link.setText(label);
+
+ layout(true);
+ }
+
+ public String getViewID() {
+ return (String) link.getHref();
+ }
+
+ public void setViewID(String viewID) {
+ link.setHref(viewID);
+
+ if (icon != null) {
+ link.setImage(null);
+ icon.dispose();
+ }
+
+ // Look for a new icon
+ IViewDescriptor[] views = PlatformUI.getWorkbench().getViewRegistry().getViews();
+ for (IViewDescriptor view : views) {
+ if (viewID.equals(view.getId())) {
+ ImageDescriptor iconDesc = view.getImageDescriptor();
+ if (iconDesc != null) {
+ icon = iconDesc.createImage(getDisplay());
+ link.setImage(icon);
+ }
+ break;
+ }
+ }
+ }
+
+ private IWorkbenchPage getWorkbenchPage() {
+ IWorkbenchPage result = null;
+
+ IWorkbench bench = PlatformUI.getWorkbench();
+ IWorkbenchWindow window = bench.getActiveWorkbenchWindow();
+ if (window == null) {
+ if (bench.getWorkbenchWindowCount() > 0) {
+ window = bench.getWorkbenchWindows()[0];
+ }
+ }
+ if (window != null) {
+ result = window.getActivePage();
+ if (result == null) {
+ IWorkbenchPage[] pages = window.getPages();
+ if (pages.length > 0) {
+ result = pages[0];
+ }
+ }
+ }
+
+ return result;
+ }
+
+ //
+ // Hyperlink listener
+ //
+
+ @Override
+ public void linkActivated(HyperlinkEvent event) {
+ if (event.getSource() == link) {
+ String viewID = getViewID();
+ if (viewID != null) {
+ IWorkbenchPage page = getWorkbenchPage();
+ if (page != null) {
+ try {
+ page.showView(viewID);
+ } catch (PartInitException e) {
+ StatusManager.getManager().handle(e.getStatus(), StatusManager.SHOW);
+ }
+ }
+ }
+ }
+ }
+
+ @Override
+ public void linkEntered(HyperlinkEvent e) {
+ // Pass
+ }
+
+ @Override
+ public void linkExited(HyperlinkEvent e) {
+ // Pass
+ }
+}
diff --git a/plugins/infra/emf/org.eclipse.papyrus.infra.emf/src/org/eclipse/papyrus/infra/emf/utils/EMFHelper.java b/plugins/infra/emf/org.eclipse.papyrus.infra.emf/src/org/eclipse/papyrus/infra/emf/utils/EMFHelper.java
index 5642e88a547..3fedf630c3f 100644
--- a/plugins/infra/emf/org.eclipse.papyrus.infra.emf/src/org/eclipse/papyrus/infra/emf/utils/EMFHelper.java
+++ b/plugins/infra/emf/org.eclipse.papyrus.infra.emf/src/org/eclipse/papyrus/infra/emf/utils/EMFHelper.java
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (c) 2010, 2014 CEA LIST and others.
+ * Copyright (c) 2010, 2015 CEA LIST, Christian W. Damus, and others.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
@@ -15,6 +15,7 @@
* Christian W. Damus (CEA) - bug 408491
* Christian W. Damus (CEA) - bug 432813
* Christian W. Damus (CEA) - bug 422257
+ * Christian W. Damus - bug 469188
*
*****************************************************************************/
package org.eclipse.papyrus.infra.emf.utils;
@@ -80,7 +81,7 @@ public class EMFHelper {
* @param className
* The EClass' name
* @return
- * The EClass instance, or null if the EClass couldn't be found
+ * The EClass instance, or null if the EClass couldn't be found
*/
public static EClass getEClass(final String nsUri, final String className) {
EPackage ePackage = EPackage.Registry.INSTANCE.getEPackage(nsUri);
@@ -99,7 +100,7 @@ public class EMFHelper {
* @param className
* The EClass' name
* @return
- * The EClass instance, or null if the EClass couldn't be found
+ * The EClass instance, or null if the EClass couldn't be found
*/
public static EClass getEClass(final EPackage metamodel, final String className) {
EClassifier classifier = metamodel.getEClassifier(className);
@@ -125,7 +126,7 @@ public class EMFHelper {
* @param metamodel
* The EPackage owning the EClass
* @return
- * True if the EObject is an instance of the EClass, or of one of the EClass' subtypes
+ * True if the EObject is an instance of the EClass, or of one of the EClass' subtypes
*/
public static boolean isInstance(final EObject element, final String className, final EPackage metamodel) {
@@ -151,7 +152,7 @@ public class EMFHelper {
* @param metamodel
* The URI of the EPackage owning the EClass
* @return
- * True if the EObject is an instance of the EClass, or of one of the EClass' subtypes
+ * True if the EObject is an instance of the EClass, or of one of the EClass' subtypes
*/
public static boolean isInstance(EObject selectedItem, String className, String nsUri) {
EClass actualEClass = selectedItem.eClass();
@@ -180,7 +181,7 @@ public class EMFHelper {
*
* @param nsUri
* @return
- * True if the EClass' name is className and the EClass' EPackage's nsURI is nsUri
+ * True if the EClass' name is className and the EClass' EPackage's nsURI is nsUri
*/
private static boolean isExactMatch(EClass eClass, String className, String nsUri) {
return className.equals(eClass.getName()) && nsUri.equals(eClass.getEPackage().getNsURI());
@@ -193,7 +194,7 @@ public class EMFHelper {
* @param eClass
* @param fromClass
* @return
- * true if eClass is a subclass of fromClass
+ * true if eClass is a subclass of fromClass
*/
public static boolean isSubclass(final EClass eClass, final EClass fromClass) {
// Everything is an EObject
@@ -287,7 +288,7 @@ public class EMFHelper {
*
* @param source
* @return
- * The source object's editing domain, or null if it couldn't be found
+ * The source object's editing domain, or null if it couldn't be found
*/
public static EditingDomain resolveEditingDomain(final Object source) {
return resolveEditingDomain(getEObject(source));
@@ -298,7 +299,7 @@ public class EMFHelper {
*
* @param source
* @return
- * The source eObject's editing domain, or null if it couldn't be found
+ * The source eObject's editing domain, or null if it couldn't be found
*/
public static EditingDomain resolveEditingDomain(final EObject source) {
EditingDomain domain = AdapterFactoryEditingDomain.getEditingDomainFor(source);
@@ -320,7 +321,7 @@ public class EMFHelper {
* @param separator
* The separator used between each package name
* @return
- * The EClassifier' qualified name
+ * The EClassifier' qualified name
*/
public static String getQualifiedName(final EClassifier eClassifier, final String separator) {
return getQualifiedName(eClassifier.getEPackage(), separator) + separator + eClassifier.getName();
@@ -334,7 +335,7 @@ public class EMFHelper {
* @param separator
* The separator used between each package name
* @return
- * The EPackage's qualified name
+ * The EPackage's qualified name
*/
public static String getQualifiedName(final EPackage ePackage, final String separator) {
if (ePackage.getESuperPackage() == null) {
@@ -353,7 +354,7 @@ public class EMFHelper {
* @param uri
* The URI describing the location of the model to load
* @return
- * The first EObject located at the given URI
+ * The first EObject located at the given URI
* @throws IOException
* When the URI cannot be loaded
*/
@@ -417,7 +418,7 @@ public class EMFHelper {
*
* @param ePackage
* @return
- * The Root package
+ * The Root package
*/
public static EPackage getRootPackage(final EPackage ePackage) {
if (ePackage == null) {
@@ -430,6 +431,53 @@ public class EMFHelper {
return getRootPackage(ePackage.getESuperPackage());
}
+ /**
+ * Gets the object of a given {@code type} containing an {@code object}, or the
+ * {@code object} itself if it is of that {@code type}.
+ *
+ * @param object
+ * the object for which to search for a container
+ * @param type
+ * the type of container to find
+ *
+ * @return the container of the requested {@code type}, or {@code null} if none
+ */
+ public static <T extends EObject> T getContainer(EObject object, EClass type) {
+ T result = null;
+
+ for (EObject next = object; (next != null) && (result == null); next = next.eContainer()) {
+ if (type.isInstance(next)) {
+ @SuppressWarnings("unchecked")
+ T nextAsT = (T) next;
+ result = nextAsT;
+ }
+ }
+
+ return result;
+ }
+
+ /**
+ * Gets the object of a given {@code type} containing an {@code object}, or the
+ * {@code object} itself if it is of that {@code type}.
+ *
+ * @param object
+ * the object for which to search for a container
+ * @param type
+ * the type of container to find
+ *
+ * @return the container of the requested {@code type}, or {@code null} if none
+ */
+ public static <T extends EObject> T getContainer(EObject object, Class<T> type) {
+ T result = null;
+
+ for (EObject next = object; (next != null) && (result == null); next = next.eContainer()) {
+ if (type.isInstance(next)) {
+ result = type.cast(next);
+ }
+ }
+
+ return result;
+ }
/**
* Return the list of EClasses that are subtypes
@@ -439,7 +487,7 @@ public class EMFHelper {
* @param concreteClassesOnly
* If true, only Concrete EClasses will be returned. Abstract and Interface EClasses will be filtered
* @return
- * The list of EClasses implementing or extending the given EClass
+ * The list of EClasses implementing or extending the given EClass
*/
public static List<EClass> getSubclassesOf(final EClass type, final boolean concreteClassesOnly) {
Set<EClass> result = new LinkedHashSet<EClass>();
@@ -462,7 +510,7 @@ public class EMFHelper {
* @param packagesToBrowse
* The EPackages in which the EClasses should be retrieved
* @return
- * The list of EClasses implementing or extending the given EClass
+ * The list of EClasses implementing or extending the given EClass
*/
public static List<EClass> getSubclassesOf(final EClass type, final boolean concreteClassesOnly, Collection<EPackage> packagesToBrowse) {
Set<EClass> result = new LinkedHashSet<EClass>();
@@ -487,7 +535,7 @@ public class EMFHelper {
* If true, all registered EPackages will be navigated to retrieve the matching EClasses. Otherwise,
* only the current EPackage will be used.
* @return
- * The list of EClasses implementing or extending the given EClass
+ * The list of EClasses implementing or extending the given EClass
*/
public static List<EClass> getSubclassesOf(final EClass type, final boolean concreteClassesOnly, final boolean browseAllRegisteredPackages) {
// If the current package is a dynamic package, it may not be registered (?). Add it directly
@@ -531,7 +579,7 @@ public class EMFHelper {
*
* @param eObject
* @return
- * True if the EObject is read only on any axis
+ * True if the EObject is read only on any axis
* @see #isReadOnly(Set, EObject, EditingDomain)
*/
public static boolean isReadOnly(final EObject eObject) {
@@ -546,7 +594,7 @@ public class EMFHelper {
* a set if orthogonal axes of read-only-ness to consider. May be empty, but that would not be especially useful
* @param eObject
* @return
- * True if the EObject is read only on any of the given {@code axes}
+ * True if the EObject is read only on any of the given {@code axes}
*/
public static boolean isReadOnly(Set<ReadOnlyAxis> axes, final EObject eObject) {
EditingDomain domain = resolveEditingDomain(eObject);
@@ -560,7 +608,7 @@ public class EMFHelper {
* @param eObject
* @param domain
* @return
- * True if the EObject is read only on any axis
+ * True if the EObject is read only on any axis
*/
public static boolean isReadOnly(final EObject eObject, final EditingDomain domain) {
return isReadOnly(ReadOnlyAxis.anyAxis(), eObject, domain);
@@ -576,7 +624,7 @@ public class EMFHelper {
*
* @param domain
* @return
- * True if the EObject is read only
+ * True if the EObject is read only
*/
public static boolean isReadOnly(Set<ReadOnlyAxis> axes, final EObject eObject, final EditingDomain domain) {
if (domain != null) {
@@ -602,7 +650,7 @@ public class EMFHelper {
* @param resource
* @param domain
* @return
- * True if the Resource is read only on any axis
+ * True if the Resource is read only on any axis
*/
public static boolean isReadOnly(final Resource resource, final EditingDomain domain) {
return isReadOnly(ReadOnlyAxis.anyAxis(), resource, domain);
@@ -617,7 +665,7 @@ public class EMFHelper {
* @param resource
* @param domain
* @return
- * True if the Resource is read only on any of the given {@code axes}
+ * True if the Resource is read only on any of the given {@code axes}
*/
public static boolean isReadOnly(Set<ReadOnlyAxis> axes, final Resource resource, final EditingDomain domain) {
if (resource == null) {
@@ -657,7 +705,7 @@ public class EMFHelper {
* @param domain
* the editing domain context of the {@link eObject}
* @return
- * whether the {@code eObject} could be made writable
+ * whether the {@code eObject} could be made writable
*/
public static boolean canMakeWritable(final EObject eObject, final EditingDomain domain) {
return canMakeWritable(ReadOnlyAxis.anyAxis(), eObject, domain);
@@ -674,7 +722,7 @@ public class EMFHelper {
* @param domain
* the editing domain context of the {@link eObject}
* @return
- * whether the {@code eObject} could be made writable
+ * whether the {@code eObject} could be made writable
*/
public static boolean canMakeWritable(Set<ReadOnlyAxis> axes, final EObject eObject, final EditingDomain domain) {
if (domain != null) {
@@ -695,7 +743,7 @@ public class EMFHelper {
* @param domain
* the editing domain context of the {@link resource}
* @return
- * whether the {@code resource} could be made writable
+ * whether the {@code resource} could be made writable
*/
public static boolean canMakeWritable(final Resource resource, final EditingDomain domain) {
return canMakeWritable(ReadOnlyAxis.anyAxis(), resource, domain);
@@ -712,7 +760,7 @@ public class EMFHelper {
* @param domain
* the editing domain context of the {@link resource}
* @return
- * whether the {@code resource} could be made writable
+ * whether the {@code resource} could be made writable
*/
public static boolean canMakeWritable(Set<ReadOnlyAxis> axes, final Resource resource, final EditingDomain domain) {
if (domain != null) {
@@ -739,7 +787,7 @@ public class EMFHelper {
* @param feature
* the feature to test
* @return
- * true if the feature is required, false otherwise
+ * true if the feature is required, false otherwise
*/
public static boolean isRequired(final EStructuralFeature feature) {
EClassifier eType = feature.getEType();
@@ -835,7 +883,7 @@ public class EMFHelper {
* a resource
*
* @return
- * the list of the metamodels known by the resource
+ * the list of the metamodels known by the resource
*/
public static Set<EPackage> getMetamodels(final Resource resource) {
Set<EPackage> metamodels = new HashSet<EPackage>();
diff --git a/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.welcome/.classpath b/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.welcome/.classpath
new file mode 100644
index 00000000000..eca7bdba8f0
--- /dev/null
+++ b/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.welcome/.classpath
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>
+ <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+ <classpathentry kind="src" path="src"/>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.welcome/.project b/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.welcome/.project
new file mode 100644
index 00000000000..c8f1479375e
--- /dev/null
+++ b/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.welcome/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.papyrus.infra.gmfdiag.welcome</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.ManifestBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.SchemaBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.pde.PluginNature</nature>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ </natures>
+</projectDescription>
diff --git a/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.welcome/.settings/org.eclipse.jdt.core.prefs b/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.welcome/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 00000000000..8ddd9a88d57
--- /dev/null
+++ b/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.welcome/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,296 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=1.8
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.8
+org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation=0
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_assignment=0
+org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
+org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80
+org.eclipse.jdt.core.formatter.alignment_for_enum_constants=0
+org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16
+org.eclipse.jdt.core.formatter.alignment_for_method_declaration=0
+org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_resources_in_try=80
+org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=16
+org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_union_type_in_multicatch=16
+org.eclipse.jdt.core.formatter.blank_lines_after_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_after_package=1
+org.eclipse.jdt.core.formatter.blank_lines_before_field=0
+org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0
+org.eclipse.jdt.core.formatter.blank_lines_before_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1
+org.eclipse.jdt.core.formatter.blank_lines_before_method=1
+org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1
+org.eclipse.jdt.core.formatter.blank_lines_before_package=0
+org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1
+org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1
+org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_lambda_body=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_switch=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=false
+org.eclipse.jdt.core.formatter.comment.format_block_comments=true
+org.eclipse.jdt.core.formatter.comment.format_header=false
+org.eclipse.jdt.core.formatter.comment.format_html=true
+org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true
+org.eclipse.jdt.core.formatter.comment.format_line_comments=true
+org.eclipse.jdt.core.formatter.comment.format_source_code=true
+org.eclipse.jdt.core.formatter.comment.indent_parameter_description=true
+org.eclipse.jdt.core.formatter.comment.indent_root_tags=true
+org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert
+org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=insert
+org.eclipse.jdt.core.formatter.comment.line_length=260
+org.eclipse.jdt.core.formatter.comment.new_lines_at_block_boundaries=true
+org.eclipse.jdt.core.formatter.comment.new_lines_at_javadoc_boundaries=true
+org.eclipse.jdt.core.formatter.comment.preserve_white_space_between_code_and_line_comments=false
+org.eclipse.jdt.core.formatter.compact_else_if=true
+org.eclipse.jdt.core.formatter.continuation_indentation=2
+org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2
+org.eclipse.jdt.core.formatter.disabling_tag=@formatter\:off
+org.eclipse.jdt.core.formatter.enabling_tag=@formatter\:on
+org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false
+org.eclipse.jdt.core.formatter.format_line_comment_starting_on_first_column=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true
+org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_empty_lines=false
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false
+org.eclipse.jdt.core.formatter.indentation.size=4
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_label=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_type_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert
+org.eclipse.jdt.core.formatter.insert_space_after_lambda_arrow=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_try=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_try_resources=insert
+org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_try=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_lambda_arrow=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_try=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert
+org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_try_resources=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.join_lines_in_comments=false
+org.eclipse.jdt.core.formatter.join_wrapped_lines=false
+org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.lineSplit=260
+org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=false
+org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=false
+org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0
+org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=5
+org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true
+org.eclipse.jdt.core.formatter.tabulation.char=tab
+org.eclipse.jdt.core.formatter.tabulation.size=4
+org.eclipse.jdt.core.formatter.use_on_off_tags=false
+org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
+org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_or_operator_multicatch=true
+org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested=true
diff --git a/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.welcome/.settings/org.eclipse.jdt.ui.prefs b/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.welcome/.settings/org.eclipse.jdt.ui.prefs
new file mode 100644
index 00000000000..954281dbc31
--- /dev/null
+++ b/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.welcome/.settings/org.eclipse.jdt.ui.prefs
@@ -0,0 +1,68 @@
+cleanup.add_default_serial_version_id=true
+cleanup.add_generated_serial_version_id=false
+cleanup.add_missing_annotations=true
+cleanup.add_missing_deprecated_annotations=true
+cleanup.add_missing_methods=false
+cleanup.add_missing_nls_tags=false
+cleanup.add_missing_override_annotations=true
+cleanup.add_missing_override_annotations_interface_methods=true
+cleanup.add_serial_version_id=false
+cleanup.always_use_blocks=true
+cleanup.always_use_parentheses_in_expressions=false
+cleanup.always_use_this_for_non_static_field_access=false
+cleanup.always_use_this_for_non_static_method_access=false
+cleanup.convert_functional_interfaces=false
+cleanup.convert_to_enhanced_for_loop=false
+cleanup.correct_indentation=false
+cleanup.format_source_code=false
+cleanup.format_source_code_changes_only=false
+cleanup.insert_inferred_type_arguments=false
+cleanup.make_local_variable_final=true
+cleanup.make_parameters_final=false
+cleanup.make_private_fields_final=true
+cleanup.make_type_abstract_if_missing_method=false
+cleanup.make_variable_declarations_final=false
+cleanup.never_use_blocks=false
+cleanup.never_use_parentheses_in_expressions=true
+cleanup.organize_imports=false
+cleanup.qualify_static_field_accesses_with_declaring_class=false
+cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
+cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
+cleanup.qualify_static_member_accesses_with_declaring_class=true
+cleanup.qualify_static_method_accesses_with_declaring_class=false
+cleanup.remove_private_constructors=true
+cleanup.remove_redundant_type_arguments=true
+cleanup.remove_trailing_whitespaces=true
+cleanup.remove_trailing_whitespaces_all=true
+cleanup.remove_trailing_whitespaces_ignore_empty=false
+cleanup.remove_unnecessary_casts=true
+cleanup.remove_unnecessary_nls_tags=true
+cleanup.remove_unused_imports=true
+cleanup.remove_unused_local_variables=false
+cleanup.remove_unused_private_fields=true
+cleanup.remove_unused_private_members=false
+cleanup.remove_unused_private_methods=true
+cleanup.remove_unused_private_types=true
+cleanup.sort_members=false
+cleanup.sort_members_all=false
+cleanup.use_anonymous_class_creation=false
+cleanup.use_blocks=true
+cleanup.use_blocks_only_for_return_and_throw=false
+cleanup.use_lambda=true
+cleanup.use_parentheses_in_expressions=false
+cleanup.use_this_for_non_static_field_access=false
+cleanup.use_this_for_non_static_field_access_only_if_necessary=true
+cleanup.use_this_for_non_static_method_access=false
+cleanup.use_this_for_non_static_method_access_only_if_necessary=true
+cleanup.use_type_arguments=false
+cleanup_profile=_Papyrus
+cleanup_settings_version=2
+eclipse.preferences.version=1
+formatter_profile=_Papyrus
+formatter_settings_version=12
+org.eclipse.jdt.ui.ignorelowercasenames=true
+org.eclipse.jdt.ui.importorder=java;javax;org;com;
+org.eclipse.jdt.ui.javadoc=true
+org.eclipse.jdt.ui.ondemandthreshold=99
+org.eclipse.jdt.ui.staticondemandthreshold=99
+org.eclipse.jdt.ui.text.custom_code_templates=<?xml version\="1.0" encoding\="UTF-8" standalone\="no"?><templates><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\n * @return the ${bare_field_name}\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\n * @param ${param} the ${bare_field_name} to set\n */</template><template autoinsert\="false" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\n * Constructor.\n *\n * ${tags}\n */</template><template autoinsert\="false" context\="filecomment_context" deleted\="false" description\="Comment for created Java files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.filecomment" name\="filecomment">/*****************************************************************************\n * Copyright (c) ${year} CEA LIST and others.\n * \n * All rights reserved. This program and the accompanying materials\n * are made available under the terms of the Eclipse Public License v1.0\n * which accompanies this distribution, and is available at\n * http\://www.eclipse.org/legal/epl-v10.html\n *\n * Contributors\:\n * CEA LIST - Initial API and implementation\n * \n *****************************************************************************/\n</template><template autoinsert\="true" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\n * @author ${user}\n *\n * ${tags}\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for fields" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\n * \n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\n * ${tags}\n */</template><template autoinsert\="false" context\="overridecomment_context" deleted\="false" description\="Comment for overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.overridecomment" name\="overridecomment">/**\n * ${see_to_overridden}\n *\n * ${tags}\n */</template><template autoinsert\="false" context\="delegatecomment_context" deleted\="false" description\="Comment for delegate methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.delegatecomment" name\="delegatecomment">/**\n * ${see_to_target}\n *\n * ${tags}\n */</template><template autoinsert\="true" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.newtype" name\="newtype">${filecomment}\n${package_declaration}\n\n${typecomment}\n${type_declaration}</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.classbody" name\="classbody">\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.enumbody" name\="enumbody">\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\n</template><template autoinsert\="true" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\n${exception_var}.printStackTrace();</template><template autoinsert\="true" context\="methodbody_context" deleted\="false" description\="Code in created method stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodbody" name\="methodbody">// ${todo} Auto-generated method stub\n${body_statement}</template><template autoinsert\="true" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\n// ${todo} Auto-generated constructor stub</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template></templates>
diff --git a/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.welcome/META-INF/MANIFEST.MF b/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.welcome/META-INF/MANIFEST.MF
new file mode 100644
index 00000000000..7b99bc2ad5a
--- /dev/null
+++ b/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.welcome/META-INF/MANIFEST.MF
@@ -0,0 +1,40 @@
+Manifest-Version: 1.0
+Export-Package: org.eclipse.papyrus.infra.gmfdiag.welcome.internal;x-internal:=true,
+ org.eclipse.papyrus.infra.gmfdiag.welcome.internal.modelelements;x-internal:=true,
+ org.eclipse.papyrus.infra.gmfdiag.welcome.internal.widgets;x-internal:=true
+Require-Bundle: org.eclipse.core.runtime;bundle-version="3.12.0",
+ org.eclipse.papyrus.infra.core.log;bundle-version="1.2.0",
+ org.eclipse.papyrus.infra.core;bundle-version="1.2.0",
+ org.eclipse.ui;bundle-version="3.100.0",
+ org.eclipse.ui.forms;bundle-version="3.7.0",
+ org.eclipse.papyrus.infra.editor.welcome;bundle-version="1.2.0",
+ org.eclipse.gmf.runtime.notation;bundle-version="1.8.0",
+ org.eclipse.papyrus.infra.gmfdiag.common;bundle-version="1.2.0",
+ org.eclipse.papyrus.infra.services.labelprovider;bundle-version="1.2.0",
+ org.eclipse.papyrus.infra.services.navigation;bundle-version="1.2.0",
+ org.eclipse.papyrus.infra.widgets;bundle-version="1.2.0",
+ org.eclipse.papyrus.infra.emf;bundle-version="1.2.0",
+ org.eclipse.papyrus.infra.gmfdiag.commands;bundle-version="1.2.0",
+ org.eclipse.papyrus.emf.facet.custom.ui;bundle-version="1.2.0",
+ org.eclipse.papyrus.emf.facet.custom.metamodel;bundle-version="1.2.0",
+ org.eclipse.papyrus.emf.facet.custom.core;bundle-version="1.2.0",
+ org.eclipse.papyrus.infra.viewpoints.policy;bundle-version="1.2.0",
+ org.eclipse.papyrus.uml.tools;bundle-version="1.2.0",
+ org.eclipse.papyrus.views.properties;bundle-version="1.2.0",
+ org.eclipse.papyrus.views.properties.model;bundle-version="1.2.0",
+ org.eclipse.core.databinding;bundle-version="1.6.0",
+ org.eclipse.emf.databinding;bundle-version="1.3.0",
+ org.eclipse.jface.databinding;bundle-version="1.8.0",
+ org.eclipse.core.databinding.property;bundle-version="1.6.0",
+ org.eclipse.papyrus.infra.editor.welcome.nattable;bundle-version="1.2.0",
+ org.eclipse.nebula.widgets.nattable.core;bundle-version="1.3.0"
+Bundle-Vendor: %providerName
+Bundle-ActivationPolicy: lazy
+Bundle-Version: 1.2.0.qualifier
+Bundle-ClassPath: .
+Bundle-Localization: plugin
+Bundle-Name: %pluginName
+Bundle-Activator: org.eclipse.papyrus.infra.gmfdiag.welcome.internal.Activator
+Bundle-ManifestVersion: 2
+Bundle-SymbolicName: org.eclipse.papyrus.infra.gmfdiag.welcome;singleton:=true
+Bundle-RequiredExecutionEnvironment: JavaSE-1.8
diff --git a/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.welcome/about.html b/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.welcome/about.html
new file mode 100644
index 00000000000..dd3c089a94c
--- /dev/null
+++ b/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.welcome/about.html
@@ -0,0 +1,28 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
+<title>About</title>
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+
+<p>November 14, 2008</p>
+<h3>License</h3>
+
+<p>The Eclipse Foundation makes available all content in this plug-in (&quot;Content&quot;). Unless otherwise
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 1.0 (&quot;EPL&quot;). A copy of the EPL is available
+at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
+
+<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is
+being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
+apply to your use of any object code in the Content. Check the Redistributor's license that was
+provided with the Content. If no such license exists, contact the Redistributor. Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <a href="http://www.eclipse.org">http://www.eclipse.org</a>.</p>
+
+</body>
+</html> \ No newline at end of file
diff --git a/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.welcome/build.properties b/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.welcome/build.properties
new file mode 100644
index 00000000000..bb4312bfa23
--- /dev/null
+++ b/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.welcome/build.properties
@@ -0,0 +1,22 @@
+#
+# Copyright (c) 2015 Christian W. Damus and others.
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License v1.0
+# which accompanies this distribution, and is available at
+# http://www.eclipse.org/legal/epl-v10.html
+#
+# Contributors:
+# Christian W. Damus - Initial API and implementation
+#
+
+bin.includes = META-INF/,\
+ .,\
+ plugin.xml,\
+ about.html,\
+ plugin.properties,\
+ model/
+output.. = bin/
+src.includes = about.html
+source.. = src/
+bin.. = bin/
diff --git a/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.welcome/model/diagrams/diagrams.ctx b/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.welcome/model/diagrams/diagrams.ctx
new file mode 100644
index 00000000000..f3018630be1
--- /dev/null
+++ b/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.welcome/model/diagrams/diagrams.ctx
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="ASCII"?>
+<contexts:Context xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:constraints="http://www.eclipse.org/papyrus/constraints/0.9" xmlns:contexts="http://www.eclipse.org/papyrus/properties/contexts/0.9" xmi:id="_MPALcI7eEeWNa5T2Agi7uA" name="welcome-diagrams" label="List of Diagrams">
+ <tabs xmi:id="_SsfbQcElEeS_u7hIvAIReA" label="Diagrams" id="diagrams" category="org.eclipse.papyrus" priority="100">
+ <sections xmi:id="_SsgCV8ElEeS_u7hIvAIReA" name="Single Diagrams" sectionFile="ui/SingleDiagrams.xwt">
+ <widget href="ui/SingleDiagrams.xwt#/"/>
+ </sections>
+ </tabs>
+ <views xmi:id="_Ssiem8ElEeS_u7hIvAIReA" name="Single Diagrams" sections="_SsgCV8ElEeS_u7hIvAIReA" automaticContext="true" datacontexts="_SsmJGsElEeS_u7hIvAIReA">
+ <constraints xsi:type="constraints:SimpleConstraint" xmi:id="_SskT2cElEeS_u7hIvAIReA" name="isWelcomeElement">
+ <constraintType href="ppe:/environment/org.eclipse.papyrus.infra.editor.welcome/model/environment.xmi#//@constraintTypes.0"/>
+ <properties xsi:type="constraints:ValueProperty" xmi:id="_SskT2sElEeS_u7hIvAIReA" name="metaclassName" value="Welcome"/>
+ </constraints>
+ </views>
+ <dataContexts xmi:id="_SsmI-cElEeS_u7hIvAIReA" name="welcomeDiagrams" label="Welcome">
+ <elements xmi:id="_SsmJGsElEeS_u7hIvAIReA" name="Welcome">
+ <properties xmi:id="_SsmJG8ElEeS_u7hIvAIReA" name="diagrams" label="Diagrams" type="Reference" multiplicity="-1" description="All of the diagrams available in the model."/>
+ </elements>
+ <modelElementFactory href="ppe:/environment/org.eclipse.papyrus.infra.gmfdiag.welcome/model/environment.xmi#//@modelElementFactories.0"/>
+ </dataContexts>
+</contexts:Context>
diff --git a/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.welcome/model/diagrams/ui/SingleDiagrams.xwt b/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.welcome/model/diagrams/ui/SingleDiagrams.xwt
new file mode 100644
index 00000000000..15d663f3b48
--- /dev/null
+++ b/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.welcome/model/diagrams/ui/SingleDiagrams.xwt
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Composite
+ xmlns:ppel="clr-namespace:org.eclipse.papyrus.views.properties.widgets.layout"
+ xmlns:ppe="clr-namespace:org.eclipse.papyrus.views.properties.widgets"
+ xmlns:x="http://www.eclipse.org/xwt"
+ xmlns:ppew="clr-namespace:org.eclipse.papyrus.infra.gmfdiag.welcome.internal.widgets"
+ xmlns="http://www.eclipse.org/xwt/presentation" xmlns:j="clr-namespace:java.lang">
+ <Composite.layout>
+ <ppel:PropertiesLayout></ppel:PropertiesLayout>
+ </Composite.layout>
+ <ppew:DiagramsTable input="{Binding}" property="welcomeDiagrams:Welcome:diagrams"></ppew:DiagramsTable>
+ <ppew:CreateNewDiagramButton input="{Binding}"></ppew:CreateNewDiagramButton>
+</Composite> \ No newline at end of file
diff --git a/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.welcome/model/environment.xmi b/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.welcome/model/environment.xmi
new file mode 100644
index 00000000000..886b8ba02f9
--- /dev/null
+++ b/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.welcome/model/environment.xmi
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="ASCII"?>
+<environment:Environment
+ xmi:version="2.0"
+ xmlns:xmi="http://www.omg.org/XMI"
+ xmlns:environment="http://www.eclipse.org/papyrus/properties/environment/0.9">
+ <modelElementFactories
+ name="Welcome Factory"
+ factoryClass="org.eclipse.papyrus.infra.gmfdiag.welcome.internal.modelelements.WelcomeModelElementFactory"/>
+ <widgetTypes
+ label="Create Diagram"
+ widgetClass="CreateNewDiagramButton"
+ namespace="//@namespaces.0"/>
+ <compositeWidgetTypes
+ label="Diagrams"
+ widgetClass="DiagramsTable"
+ namespace="//@namespaces.0"/>
+ <namespaces
+ name="ppew"
+ value="org.eclipse.papyrus.infra.gmfdiag.welcome.internal.widgets"/>
+</environment:Environment>
diff --git a/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.welcome/plugin.properties b/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.welcome/plugin.properties
new file mode 100644
index 00000000000..ef32709d639
--- /dev/null
+++ b/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.welcome/plugin.properties
@@ -0,0 +1,13 @@
+#
+# Copyright (c) 2015 Christian W. Damus and others.
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License v1.0
+# which accompanies this distribution, and is available at
+# http://www.eclipse.org/legal/epl-v10.html
+#
+# Contributors:
+# Christian W. Damus - Initial API and implementation
+#
+pluginName=Papyrus Editor Diagrams Welcome Page Content
+providerName=Eclipse Modeling Project
diff --git a/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.welcome/plugin.xml b/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.welcome/plugin.xml
new file mode 100644
index 00000000000..e3167433681
--- /dev/null
+++ b/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.welcome/plugin.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.2"?>
+<!--
+ Copyright (c) 2015 Christian W. Damus and others.
+
+ All rights reserved. This program and the accompanying materials
+ are made available under the terms of the Eclipse Public License v1.0
+ which accompanies this distribution, and is available at
+ http://www.eclipse.org/legal/epl-v10.html
+
+ Contributors:
+ Christian W. Damus - Initial API and implementation
+-->
+<plugin>
+ <extension
+ point="org.eclipse.papyrus.views.properties.context">
+ <context
+ contextModel="model/diagrams/diagrams.ctx">
+ </context>
+ <preferencePageBinding
+ context="welcome-diagrams"
+ page="org.eclipse.papyrus.infra.editor.welcome.content">
+ </preferencePageBinding>
+ </extension>
+ <extension
+ point="org.eclipse.papyrus.views.properties.environment">
+ <environment
+ environmentModel="model/environment.xmi">
+ </environment>
+ </extension>
+</plugin>
diff --git a/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.welcome/pom.xml b/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.welcome/pom.xml
new file mode 100644
index 00000000000..be9e5c5b4e0
--- /dev/null
+++ b/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.welcome/pom.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project>
+ <modelVersion>4.0.0</modelVersion>
+ <parent>
+ <artifactId>org.eclipse.papyrus.releng</artifactId>
+ <groupId>org.eclipse.papyrus</groupId>
+ <version>1.2.0-SNAPSHOT</version>
+ <relativePath>../../../../releng/main</relativePath>
+ </parent>
+ <artifactId>org.eclipse.papyrus.infra.gmfdiag.welcome</artifactId>
+ <groupId>org.eclipse.papyrus</groupId>
+ <version>1.2.0-SNAPSHOT</version>
+ <packaging>eclipse-plugin</packaging>
+</project> \ No newline at end of file
diff --git a/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.welcome/src/org/eclipse/papyrus/infra/gmfdiag/welcome/internal/Activator.java b/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.welcome/src/org/eclipse/papyrus/infra/gmfdiag/welcome/internal/Activator.java
new file mode 100644
index 00000000000..c69fcc755ae
--- /dev/null
+++ b/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.welcome/src/org/eclipse/papyrus/infra/gmfdiag/welcome/internal/Activator.java
@@ -0,0 +1,60 @@
+/*****************************************************************************
+ * Copyright (c) 2015 Christian W. Damus and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Christian W. Damus - Initial API and implementation
+ *
+ *****************************************************************************/
+package org.eclipse.papyrus.infra.gmfdiag.welcome.internal;
+
+import org.eclipse.papyrus.infra.core.log.LogHelper;
+import org.eclipse.ui.plugin.AbstractUIPlugin;
+import org.osgi.framework.BundleContext;
+
+/**
+ * The activator class controls the plug-in life cycle
+ */
+public class Activator extends AbstractUIPlugin {
+
+ // The plug-in ID
+ public static final String PLUGIN_ID = "org.eclipse.papyrus.infra.gmfdiag.welcome"; //$NON-NLS-1$
+
+ // The shared instance
+ private static Activator plugin;
+
+ public static LogHelper log;
+
+ /**
+ * The constructor
+ */
+ public Activator() {
+ }
+
+ @Override
+ public void start(BundleContext context) throws Exception {
+ super.start(context);
+ plugin = this;
+ log = new LogHelper(this);
+ }
+
+ @Override
+ public void stop(BundleContext context) throws Exception {
+ plugin = null;
+ super.stop(context);
+ }
+
+ /**
+ * Returns the shared instance
+ *
+ * @return the shared instance
+ */
+ public static Activator getDefault() {
+ return plugin;
+ }
+
+}
diff --git a/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.welcome/src/org/eclipse/papyrus/infra/gmfdiag/welcome/internal/modelelements/DiagramObservable.java b/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.welcome/src/org/eclipse/papyrus/infra/gmfdiag/welcome/internal/modelelements/DiagramObservable.java
new file mode 100644
index 00000000000..7717e09db08
--- /dev/null
+++ b/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.welcome/src/org/eclipse/papyrus/infra/gmfdiag/welcome/internal/modelelements/DiagramObservable.java
@@ -0,0 +1,187 @@
+/*****************************************************************************
+ * Copyright (c) 2015 Christian W. Damus and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Christian W. Damus - Initial API and implementation
+ *
+ *****************************************************************************/
+
+package org.eclipse.papyrus.infra.gmfdiag.welcome.internal.modelelements;
+
+import org.eclipse.core.databinding.observable.AbstractObservable;
+import org.eclipse.core.databinding.observable.ChangeEvent;
+import org.eclipse.core.databinding.observable.IChangeListener;
+import org.eclipse.core.databinding.observable.Realm;
+import org.eclipse.core.databinding.observable.value.IObservableValue;
+import org.eclipse.emf.common.notify.Adapter;
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.notify.Notifier;
+import org.eclipse.emf.common.notify.impl.AdapterImpl;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.gmf.runtime.notation.Diagram;
+import org.eclipse.gmf.runtime.notation.NotationPackage;
+import org.eclipse.papyrus.infra.tools.databinding.TouchableValue;
+
+/**
+ * Encapsulation of a {@link Diagram} that presents the following as observable properties:
+ * <ul>
+ * <li>the diagram</li>
+ * <li>the diagram's context element</li>
+ * </ul>
+ */
+public class DiagramObservable extends AbstractObservable {
+ private final Diagram diagram;
+
+ private Adapter diagramAdapter;
+ private Adapter contextAdapter;
+
+ private final TouchableValue<Diagram> diagramValue;
+ private final TouchableValue<EObject> contextValue;
+
+ public DiagramObservable(Diagram diagram) {
+ this(Realm.getDefault(), diagram);
+ }
+
+ public DiagramObservable(Realm realm, Diagram diagram) {
+ super(realm);
+
+ this.diagram = diagram;
+
+ this.diagramValue = new TouchableValue<Diagram>(realm, Diagram.class, diagram);
+ this.contextValue = new TouchableValue<EObject>(realm, EObject.class, diagram.getElement());
+
+ this.diagramAdapter = new DiagramAdapter(diagram);
+ handleContextChanged(null, diagram.getElement());
+
+ // Roll up changes to my elements as changes to me
+ IChangeListener rollup = new IChangeListener() {
+
+ @Override
+ public void handleChange(ChangeEvent event) {
+ DiagramObservable.this.fireChange();
+ }
+ };
+ diagramValue.addChangeListener(rollup);
+ contextValue.addChangeListener(rollup);
+ }
+
+ @Override
+ public synchronized void dispose() {
+ if (diagramAdapter != null) {
+ // This will nullify the 'diagramAdapter' field
+ diagram.eAdapters().remove(diagramAdapter);
+ }
+
+ if (contextAdapter != null) {
+ // This will nullify the 'contextAdapter' field
+ diagram.getElement().eAdapters().remove(contextAdapter);
+ }
+
+ diagramValue.dispose();
+ contextValue.dispose();
+
+ super.dispose();
+ }
+
+ public IObservableValue<Diagram> getDiagram() {
+ return diagramValue;
+ }
+
+ public IObservableValue<EObject> getContext() {
+ return contextValue;
+ }
+
+ @Override
+ public boolean isStale() {
+ return false;
+ }
+
+ void handleContextChanged(EObject oldContext, EObject newContext) {
+ Adapter adapter = this.contextAdapter;
+
+ if (oldContext != null) {
+ // This will nullify the 'contextAdapter' field
+ oldContext.eAdapters().remove(contextAdapter);
+ }
+ if (newContext != null) {
+ if (adapter == null) {
+ // initial context
+ contextAdapter = new ContextAdapter(newContext);
+ } else {
+ // reuse the adapter
+ newContext.eAdapters().add(adapter);
+ contextAdapter = adapter;
+ }
+ }
+
+ contextValue.setValue(newContext);
+ }
+
+ //
+ // Nested types
+ //
+
+ private class DiagramAdapter extends AdapterImpl {
+ DiagramAdapter(Diagram diagram) {
+ super();
+
+ diagram.eAdapters().add(this);
+ }
+
+ @Override
+ public void unsetTarget(Notifier oldTarget) {
+ if (target == oldTarget) {
+ // I am disposed
+ diagramAdapter = null;
+ }
+
+ super.unsetTarget(oldTarget);
+ }
+
+ @Override
+ public void notifyChanged(Notification msg) {
+ if (!msg.isTouch()) {
+ switch (msg.getFeatureID(Diagram.class)) {
+ case NotationPackage.DIAGRAM__NAME:
+ case NotationPackage.DIAGRAM__TYPE:
+ diagramValue.touch();
+ break;
+ case NotationPackage.DIAGRAM__ELEMENT:
+ handleContextChanged((EObject) msg.getOldValue(), (EObject) msg.getNewValue());
+ break;
+ }
+ }
+ }
+ }
+
+ private class ContextAdapter extends AdapterImpl {
+ ContextAdapter(EObject context) {
+ super();
+
+ context.eAdapters().add(this);
+ }
+
+ @Override
+ public void unsetTarget(Notifier oldTarget) {
+ if (target == oldTarget) {
+ // I am disposed
+ contextAdapter = null;
+ }
+
+ super.unsetTarget(oldTarget);
+ }
+
+ @Override
+ public void notifyChanged(Notification msg) {
+ if (!msg.isTouch()) {
+ // Can't interpret the change, so just assume that the label needs to change
+ contextValue.touch();
+ }
+ }
+ }
+}
diff --git a/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.welcome/src/org/eclipse/papyrus/infra/gmfdiag/welcome/internal/modelelements/DiagramsObservableList.java b/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.welcome/src/org/eclipse/papyrus/infra/gmfdiag/welcome/internal/modelelements/DiagramsObservableList.java
new file mode 100644
index 00000000000..ecabd7343aa
--- /dev/null
+++ b/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.welcome/src/org/eclipse/papyrus/infra/gmfdiag/welcome/internal/modelelements/DiagramsObservableList.java
@@ -0,0 +1,87 @@
+/*****************************************************************************
+ * Copyright (c) 2015 Christian W. Damus and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Christian W. Damus - Initial API and implementation
+ *
+ *****************************************************************************/
+
+package org.eclipse.papyrus.infra.gmfdiag.welcome.internal.modelelements;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.emf.transaction.TransactionalEditingDomain;
+import org.eclipse.gmf.runtime.notation.Diagram;
+import org.eclipse.papyrus.infra.core.resource.ResourceAdapter;
+import org.eclipse.papyrus.infra.tools.databinding.WritableListWithIterator;
+
+/**
+ * An observable list of diagram-observables, tracking all of the diagrams available
+ * in the resource set.
+ */
+public class DiagramsObservableList extends WritableListWithIterator<DiagramObservable> {
+ private TransactionalEditingDomain domain;
+ private ResourceAdapter.Transactional diagramsListener;
+
+ public DiagramsObservableList(WelcomeModelElement owner) {
+ super(new ArrayList<>(), DiagramObservable.class);
+
+ this.domain = (TransactionalEditingDomain) owner.getDomain();
+ hookDiagramsListener();
+ }
+
+ @Override
+ public synchronized void dispose() {
+ if (diagramsListener != null) {
+ diagramsListener.uninstall(domain);
+ diagramsListener = null;
+ domain = null;
+ }
+
+ super.dispose();
+ }
+
+ void hookDiagramsListener() {
+ diagramsListener = new ResourceAdapter.Transactional() {
+
+ @Override
+ protected void handleResourceLoaded(Resource resource) {
+ resource.getContents().stream()
+ .filter(Diagram.class::isInstance)
+ .map(Diagram.class::cast)
+ .map(DiagramObservable::new)
+ .forEach(DiagramsObservableList.this::add);
+ }
+
+ @Override
+ protected void handleRootAdded(Resource resource, EObject root) {
+ if (root instanceof Diagram) {
+ add(new DiagramObservable((Diagram) root));
+ }
+ }
+
+ @Override
+ protected void handleRootRemoved(Resource resource, EObject root) {
+ if (root instanceof Diagram) {
+ for (Iterator<DiagramObservable> iter = iterator(); iter.hasNext();) {
+ DiagramObservable next = iter.next();
+ if (next.getDiagram().getValue() == root) {
+ iter.remove();
+ next.dispose();
+ }
+ }
+ }
+ }
+ };
+
+ diagramsListener.install(domain);
+ }
+}
diff --git a/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.welcome/src/org/eclipse/papyrus/infra/gmfdiag/welcome/internal/modelelements/WelcomeModelElement.java b/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.welcome/src/org/eclipse/papyrus/infra/gmfdiag/welcome/internal/modelelements/WelcomeModelElement.java
new file mode 100644
index 00000000000..e8469e95007
--- /dev/null
+++ b/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.welcome/src/org/eclipse/papyrus/infra/gmfdiag/welcome/internal/modelelements/WelcomeModelElement.java
@@ -0,0 +1,68 @@
+/*****************************************************************************
+ * Copyright (c) 2015 Christian W. Damus and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Christian W. Damus - Initial API and implementation
+ *
+ *****************************************************************************/
+
+package org.eclipse.papyrus.infra.gmfdiag.welcome.internal.modelelements;
+
+import org.eclipse.core.databinding.observable.IObservable;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.edit.domain.EditingDomain;
+import org.eclipse.papyrus.views.properties.modelelement.EMFModelElement;
+
+/**
+ * @author damus
+ *
+ */
+public class WelcomeModelElement extends EMFModelElement {
+ private final String DIAGRAMS = "diagrams"; //$NON-NLS-1$
+
+ public WelcomeModelElement(EObject source, EditingDomain domain) {
+ super(source, domain);
+ }
+
+ @Override
+ protected IObservable doGetObservable(String propertyPath) {
+ IObservable result;
+
+ switch (propertyPath) {
+ case DIAGRAMS:
+ result = new DiagramsObservableList(this);
+ break;
+ default:
+ result = super.doGetObservable(propertyPath);
+ break;
+ }
+
+ return result;
+ }
+
+ @Override
+ protected boolean isFeatureEditable(String propertyPath) {
+ boolean result;
+
+ switch (propertyPath) {
+ case DIAGRAMS:
+ result = true;
+ break;
+ default:
+ result = super.isEditable(propertyPath);
+ break;
+ }
+
+ return result;
+ }
+
+ @Override
+ protected boolean isElementEditable() {
+ return true;
+ }
+}
diff --git a/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.welcome/src/org/eclipse/papyrus/infra/gmfdiag/welcome/internal/modelelements/WelcomeModelElementFactory.java b/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.welcome/src/org/eclipse/papyrus/infra/gmfdiag/welcome/internal/modelelements/WelcomeModelElementFactory.java
new file mode 100644
index 00000000000..5592680cfe8
--- /dev/null
+++ b/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.welcome/src/org/eclipse/papyrus/infra/gmfdiag/welcome/internal/modelelements/WelcomeModelElementFactory.java
@@ -0,0 +1,45 @@
+/*****************************************************************************
+ * Copyright (c) 2015 Christian W. Damus and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Christian W. Damus - Initial API and implementation
+ *
+ *****************************************************************************/
+
+package org.eclipse.papyrus.infra.gmfdiag.welcome.internal.modelelements;
+
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.edit.domain.EditingDomain;
+import org.eclipse.papyrus.infra.emf.utils.EMFHelper;
+import org.eclipse.papyrus.views.properties.Activator;
+import org.eclipse.papyrus.views.properties.contexts.DataContextElement;
+import org.eclipse.papyrus.views.properties.modelelement.AbstractEMFModelElementFactory;
+
+/**
+ * @author damus
+ *
+ */
+public class WelcomeModelElementFactory extends AbstractEMFModelElementFactory<WelcomeModelElement> {
+
+ public WelcomeModelElementFactory() {
+ super();
+ }
+
+ @Override
+ protected WelcomeModelElement doCreateFromSource(Object sourceElement, DataContextElement context) {
+ EObject source = EMFHelper.getEObject(sourceElement);
+ if (source == null) {
+ Activator.log.warn("Unable to resolve the selected element to an EObject"); //$NON-NLS-1$
+ return null;
+ }
+
+ EditingDomain domain = EMFHelper.resolveEditingDomain(source);
+ return new WelcomeModelElement(source, domain);
+ }
+
+}
diff --git a/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.welcome/src/org/eclipse/papyrus/infra/gmfdiag/welcome/internal/widgets/CreateNewDiagramButton.java b/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.welcome/src/org/eclipse/papyrus/infra/gmfdiag/welcome/internal/widgets/CreateNewDiagramButton.java
new file mode 100644
index 00000000000..04c879ed580
--- /dev/null
+++ b/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.welcome/src/org/eclipse/papyrus/infra/gmfdiag/welcome/internal/widgets/CreateNewDiagramButton.java
@@ -0,0 +1,179 @@
+/*****************************************************************************
+ * Copyright (c) 2015 Christian W. Damus and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Christian W. Damus - Initial API and implementation
+ *
+ *****************************************************************************/
+
+package org.eclipse.papyrus.infra.gmfdiag.welcome.internal.widgets;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.jface.viewers.ILabelProvider;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.jface.window.Window;
+import org.eclipse.papyrus.infra.core.resource.ModelSet;
+import org.eclipse.papyrus.infra.core.services.ServiceException;
+import org.eclipse.papyrus.infra.emf.providers.strategy.SemanticEMFContentProvider;
+import org.eclipse.papyrus.infra.emf.utils.EMFHelper;
+import org.eclipse.papyrus.infra.emf.utils.ServiceUtilsForEObject;
+import org.eclipse.papyrus.infra.emf.utils.ServiceUtilsForResourceSet;
+import org.eclipse.papyrus.infra.services.labelprovider.service.LabelProviderService;
+import org.eclipse.papyrus.infra.viewpoints.configuration.PapyrusDiagram;
+import org.eclipse.papyrus.infra.viewpoints.policy.PolicyChecker;
+import org.eclipse.papyrus.infra.viewpoints.policy.ViewPrototype;
+import org.eclipse.papyrus.infra.widgets.editors.TreeSelectorDialog;
+import org.eclipse.papyrus.uml.tools.providers.SemanticUMLContentProvider;
+import org.eclipse.papyrus.views.properties.modelelement.DataSource;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.ui.dialogs.ElementListSelectionDialog;
+
+/**
+ * The properties widget that creates a new diagram.
+ */
+public class CreateNewDiagramButton extends Composite {
+
+ private DataSource input;
+
+ public CreateNewDiagramButton(Composite parent, int style) {
+ super(parent, style);
+
+ GridLayout layout = new GridLayout(1, false);
+ setLayout(layout);
+
+ Button button = new Button(this, SWT.PUSH | SWT.FLAT);
+ button.setText("Create Diagram");
+ button.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ createDiagram();
+ }
+ });
+ }
+
+ @Override
+ public void dispose() {
+ this.input = null;
+
+ super.dispose();
+ }
+
+ /**
+ * Sets the input DataSource for this Property editor.
+ *
+ * @param input
+ */
+ public void setInput(DataSource input) {
+ this.input = input;
+ }
+
+ /**
+ * @return the input DataSource for this Property editor
+ */
+ public DataSource getInput() {
+ return input;
+ }
+
+ protected EObject getModelElement() {
+ return EMFHelper.getEObject(input.getSelection().getFirstElement());
+ }
+
+ protected void createDiagram() {
+ List<ViewPrototype> availablePrototypes = new ArrayList<>();
+
+ ModelSet modelSet = null;
+ LabelProviderService labels = null;
+
+ try {
+ modelSet = ServiceUtilsForEObject.getInstance().getModelSet(getModelElement());
+ labels = ServiceUtilsForResourceSet.getInstance().getService(LabelProviderService.class, modelSet);
+ } catch (ServiceException e) {
+ throw new IllegalStateException(e);
+ }
+
+ SemanticEMFContentProvider content = new SemanticUMLContentProvider(modelSet) {
+
+ @Override
+ public boolean isValidValue(Object element) {
+ availablePrototypes.clear();
+
+ if (element != null) {
+ EObject object = EMFHelper.getEObject(element);
+ if (object != null) {
+ // build a list of all the available prototypes
+ for (final ViewPrototype proto : PolicyChecker.getCurrent().getPrototypesFor(object)) {
+ if (!(proto.getConfiguration() instanceof PapyrusDiagram)) {
+ continue;
+ }
+ availablePrototypes.add(proto);
+ }
+ }
+ }
+
+ return !availablePrototypes.isEmpty();
+ }
+ };
+
+ TreeSelectorDialog dlg = new TreeSelectorDialog(getShell());
+ dlg.setLabelProvider(labels.getLabelProvider());
+ dlg.setContentProvider(content);
+ dlg.setMessage("Select an element for which to create a new diagram.");
+ dlg.setTitle("Select Diagram Context");
+ dlg.setInput(modelSet);
+
+ if (dlg.open() == Window.OK) {
+ Object[] result = dlg.getResult();
+ if (result.length > 0) {
+ EObject object = EMFHelper.getEObject(result[0]);
+ if (object != null) {
+ createDiagram(object, availablePrototypes);
+ }
+ }
+ }
+ }
+
+ protected void createDiagram(EObject context, List<ViewPrototype> prototypes) {
+ Collections.sort(prototypes, new ViewPrototype.Comp());
+
+ ILabelProvider labels = new LabelProvider() {
+ @Override
+ public String getText(Object element) {
+ return ((ViewPrototype) element).getLabel();
+ }
+
+ @Override
+ public Image getImage(Object element) {
+ return ((ViewPrototype) element).getIcon();
+ }
+ };
+
+ ElementListSelectionDialog dlg = new ElementListSelectionDialog(getShell(), labels);
+ dlg.setTitle("Create Diagram");
+ dlg.setMessage("Select the diagram to create");
+ dlg.setMultipleSelection(false);
+ dlg.setElements(prototypes.toArray());
+
+ if (dlg.open() == Window.OK) {
+ Object[] result = dlg.getResult();
+ if (result.length > 0) {
+ ViewPrototype prototype = (ViewPrototype) result[0];
+ prototype.instantiateOn(context);
+ }
+ }
+ }
+}
diff --git a/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.welcome/src/org/eclipse/papyrus/infra/gmfdiag/welcome/internal/widgets/DiagramsTable.java b/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.welcome/src/org/eclipse/papyrus/infra/gmfdiag/welcome/internal/widgets/DiagramsTable.java
new file mode 100644
index 00000000000..2c4d1ecc666
--- /dev/null
+++ b/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.welcome/src/org/eclipse/papyrus/infra/gmfdiag/welcome/internal/widgets/DiagramsTable.java
@@ -0,0 +1,92 @@
+/*****************************************************************************
+ * Copyright (c) 2015 Christian W. Damus and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Christian W. Damus - Initial API and implementation
+ *
+ *****************************************************************************/
+
+package org.eclipse.papyrus.infra.gmfdiag.welcome.internal.widgets;
+
+import org.eclipse.nebula.widgets.nattable.data.IColumnPropertyAccessor;
+import org.eclipse.papyrus.infra.editor.welcome.nattable.widgets.HyperlinkTable;
+import org.eclipse.papyrus.infra.gmfdiag.welcome.internal.modelelements.DiagramObservable;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * A two-column table of hyperlinks for diagrams: on the left side, a link that navigates
+ * to the diagram page, and on the right side, a link that navigates to the diagram's
+ * context element in the Model Explorer.
+ */
+public class DiagramsTable extends HyperlinkTable<DiagramObservable> {
+
+ public DiagramsTable(Composite parent, int style) {
+ super(parent, style, new DiagramsColumnAccessor(), "Diagram", "Context");
+ }
+
+ //
+ // Nested types
+ //
+
+ static class DiagramsColumnAccessor implements IColumnPropertyAccessor<DiagramObservable> {
+ static final String DIAGRAM = "diagram"; //$NON-NLS-1$
+ static final String CONTEXT = "context"; //$NON-NLS-1$
+
+ @Override
+ public int getColumnCount() {
+ return 2;
+ }
+
+ @Override
+ public Object getDataValue(DiagramObservable rowObject, int columnIndex) {
+ Object result;
+
+ switch (columnIndex) {
+ case 0:
+ result = rowObject.getDiagram();
+ break;
+ case 1:
+ result = rowObject.getContext();
+ break;
+ default:
+ throw new IndexOutOfBoundsException(Integer.toString(columnIndex));
+ }
+
+ return result;
+ }
+
+ @Override
+ public void setDataValue(DiagramObservable rowObject, int columnIndex, Object newValue) {
+ throw new IllegalStateException("not editable"); //$NON-NLS-1$
+ }
+
+ @Override
+ public String getColumnProperty(int columnIndex) {
+ switch (columnIndex) {
+ case 0:
+ return DIAGRAM;
+ case 1:
+ return CONTEXT;
+ default:
+ throw new IndexOutOfBoundsException(Integer.toString(columnIndex));
+ }
+ }
+
+ @Override
+ public int getColumnIndex(String propertyName) {
+ switch (propertyName) {
+ case DIAGRAM:
+ return 0;
+ case CONTEXT:
+ return 1;
+ default:
+ throw new IllegalArgumentException(propertyName);
+ }
+ }
+ }
+}
diff --git a/plugins/infra/nattable/org.eclipse.papyrus.infra.nattable.welcome/.classpath b/plugins/infra/nattable/org.eclipse.papyrus.infra.nattable.welcome/.classpath
new file mode 100644
index 00000000000..eca7bdba8f0
--- /dev/null
+++ b/plugins/infra/nattable/org.eclipse.papyrus.infra.nattable.welcome/.classpath
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>
+ <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+ <classpathentry kind="src" path="src"/>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/plugins/infra/nattable/org.eclipse.papyrus.infra.nattable.welcome/.project b/plugins/infra/nattable/org.eclipse.papyrus.infra.nattable.welcome/.project
new file mode 100644
index 00000000000..68db456b78a
--- /dev/null
+++ b/plugins/infra/nattable/org.eclipse.papyrus.infra.nattable.welcome/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.papyrus.infra.nattable.welcome</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.ManifestBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.SchemaBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.pde.PluginNature</nature>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ </natures>
+</projectDescription>
diff --git a/plugins/infra/nattable/org.eclipse.papyrus.infra.nattable.welcome/.settings/org.eclipse.jdt.core.prefs b/plugins/infra/nattable/org.eclipse.papyrus.infra.nattable.welcome/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 00000000000..8ddd9a88d57
--- /dev/null
+++ b/plugins/infra/nattable/org.eclipse.papyrus.infra.nattable.welcome/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,296 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=1.8
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.8
+org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation=0
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_assignment=0
+org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
+org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80
+org.eclipse.jdt.core.formatter.alignment_for_enum_constants=0
+org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16
+org.eclipse.jdt.core.formatter.alignment_for_method_declaration=0
+org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_resources_in_try=80
+org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=16
+org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_union_type_in_multicatch=16
+org.eclipse.jdt.core.formatter.blank_lines_after_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_after_package=1
+org.eclipse.jdt.core.formatter.blank_lines_before_field=0
+org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0
+org.eclipse.jdt.core.formatter.blank_lines_before_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1
+org.eclipse.jdt.core.formatter.blank_lines_before_method=1
+org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1
+org.eclipse.jdt.core.formatter.blank_lines_before_package=0
+org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1
+org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1
+org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_lambda_body=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_switch=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=false
+org.eclipse.jdt.core.formatter.comment.format_block_comments=true
+org.eclipse.jdt.core.formatter.comment.format_header=false
+org.eclipse.jdt.core.formatter.comment.format_html=true
+org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true
+org.eclipse.jdt.core.formatter.comment.format_line_comments=true
+org.eclipse.jdt.core.formatter.comment.format_source_code=true
+org.eclipse.jdt.core.formatter.comment.indent_parameter_description=true
+org.eclipse.jdt.core.formatter.comment.indent_root_tags=true
+org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert
+org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=insert
+org.eclipse.jdt.core.formatter.comment.line_length=260
+org.eclipse.jdt.core.formatter.comment.new_lines_at_block_boundaries=true
+org.eclipse.jdt.core.formatter.comment.new_lines_at_javadoc_boundaries=true
+org.eclipse.jdt.core.formatter.comment.preserve_white_space_between_code_and_line_comments=false
+org.eclipse.jdt.core.formatter.compact_else_if=true
+org.eclipse.jdt.core.formatter.continuation_indentation=2
+org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2
+org.eclipse.jdt.core.formatter.disabling_tag=@formatter\:off
+org.eclipse.jdt.core.formatter.enabling_tag=@formatter\:on
+org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false
+org.eclipse.jdt.core.formatter.format_line_comment_starting_on_first_column=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true
+org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_empty_lines=false
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false
+org.eclipse.jdt.core.formatter.indentation.size=4
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_label=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_type_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert
+org.eclipse.jdt.core.formatter.insert_space_after_lambda_arrow=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_try=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_try_resources=insert
+org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_try=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_lambda_arrow=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_try=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert
+org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_try_resources=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.join_lines_in_comments=false
+org.eclipse.jdt.core.formatter.join_wrapped_lines=false
+org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.lineSplit=260
+org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=false
+org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=false
+org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0
+org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=5
+org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true
+org.eclipse.jdt.core.formatter.tabulation.char=tab
+org.eclipse.jdt.core.formatter.tabulation.size=4
+org.eclipse.jdt.core.formatter.use_on_off_tags=false
+org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
+org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_or_operator_multicatch=true
+org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested=true
diff --git a/plugins/infra/nattable/org.eclipse.papyrus.infra.nattable.welcome/.settings/org.eclipse.jdt.ui.prefs b/plugins/infra/nattable/org.eclipse.papyrus.infra.nattable.welcome/.settings/org.eclipse.jdt.ui.prefs
new file mode 100644
index 00000000000..954281dbc31
--- /dev/null
+++ b/plugins/infra/nattable/org.eclipse.papyrus.infra.nattable.welcome/.settings/org.eclipse.jdt.ui.prefs
@@ -0,0 +1,68 @@
+cleanup.add_default_serial_version_id=true
+cleanup.add_generated_serial_version_id=false
+cleanup.add_missing_annotations=true
+cleanup.add_missing_deprecated_annotations=true
+cleanup.add_missing_methods=false
+cleanup.add_missing_nls_tags=false
+cleanup.add_missing_override_annotations=true
+cleanup.add_missing_override_annotations_interface_methods=true
+cleanup.add_serial_version_id=false
+cleanup.always_use_blocks=true
+cleanup.always_use_parentheses_in_expressions=false
+cleanup.always_use_this_for_non_static_field_access=false
+cleanup.always_use_this_for_non_static_method_access=false
+cleanup.convert_functional_interfaces=false
+cleanup.convert_to_enhanced_for_loop=false
+cleanup.correct_indentation=false
+cleanup.format_source_code=false
+cleanup.format_source_code_changes_only=false
+cleanup.insert_inferred_type_arguments=false
+cleanup.make_local_variable_final=true
+cleanup.make_parameters_final=false
+cleanup.make_private_fields_final=true
+cleanup.make_type_abstract_if_missing_method=false
+cleanup.make_variable_declarations_final=false
+cleanup.never_use_blocks=false
+cleanup.never_use_parentheses_in_expressions=true
+cleanup.organize_imports=false
+cleanup.qualify_static_field_accesses_with_declaring_class=false
+cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
+cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
+cleanup.qualify_static_member_accesses_with_declaring_class=true
+cleanup.qualify_static_method_accesses_with_declaring_class=false
+cleanup.remove_private_constructors=true
+cleanup.remove_redundant_type_arguments=true
+cleanup.remove_trailing_whitespaces=true
+cleanup.remove_trailing_whitespaces_all=true
+cleanup.remove_trailing_whitespaces_ignore_empty=false
+cleanup.remove_unnecessary_casts=true
+cleanup.remove_unnecessary_nls_tags=true
+cleanup.remove_unused_imports=true
+cleanup.remove_unused_local_variables=false
+cleanup.remove_unused_private_fields=true
+cleanup.remove_unused_private_members=false
+cleanup.remove_unused_private_methods=true
+cleanup.remove_unused_private_types=true
+cleanup.sort_members=false
+cleanup.sort_members_all=false
+cleanup.use_anonymous_class_creation=false
+cleanup.use_blocks=true
+cleanup.use_blocks_only_for_return_and_throw=false
+cleanup.use_lambda=true
+cleanup.use_parentheses_in_expressions=false
+cleanup.use_this_for_non_static_field_access=false
+cleanup.use_this_for_non_static_field_access_only_if_necessary=true
+cleanup.use_this_for_non_static_method_access=false
+cleanup.use_this_for_non_static_method_access_only_if_necessary=true
+cleanup.use_type_arguments=false
+cleanup_profile=_Papyrus
+cleanup_settings_version=2
+eclipse.preferences.version=1
+formatter_profile=_Papyrus
+formatter_settings_version=12
+org.eclipse.jdt.ui.ignorelowercasenames=true
+org.eclipse.jdt.ui.importorder=java;javax;org;com;
+org.eclipse.jdt.ui.javadoc=true
+org.eclipse.jdt.ui.ondemandthreshold=99
+org.eclipse.jdt.ui.staticondemandthreshold=99
+org.eclipse.jdt.ui.text.custom_code_templates=<?xml version\="1.0" encoding\="UTF-8" standalone\="no"?><templates><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\n * @return the ${bare_field_name}\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\n * @param ${param} the ${bare_field_name} to set\n */</template><template autoinsert\="false" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\n * Constructor.\n *\n * ${tags}\n */</template><template autoinsert\="false" context\="filecomment_context" deleted\="false" description\="Comment for created Java files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.filecomment" name\="filecomment">/*****************************************************************************\n * Copyright (c) ${year} CEA LIST and others.\n * \n * All rights reserved. This program and the accompanying materials\n * are made available under the terms of the Eclipse Public License v1.0\n * which accompanies this distribution, and is available at\n * http\://www.eclipse.org/legal/epl-v10.html\n *\n * Contributors\:\n * CEA LIST - Initial API and implementation\n * \n *****************************************************************************/\n</template><template autoinsert\="true" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\n * @author ${user}\n *\n * ${tags}\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for fields" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\n * \n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\n * ${tags}\n */</template><template autoinsert\="false" context\="overridecomment_context" deleted\="false" description\="Comment for overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.overridecomment" name\="overridecomment">/**\n * ${see_to_overridden}\n *\n * ${tags}\n */</template><template autoinsert\="false" context\="delegatecomment_context" deleted\="false" description\="Comment for delegate methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.delegatecomment" name\="delegatecomment">/**\n * ${see_to_target}\n *\n * ${tags}\n */</template><template autoinsert\="true" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.newtype" name\="newtype">${filecomment}\n${package_declaration}\n\n${typecomment}\n${type_declaration}</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.classbody" name\="classbody">\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.enumbody" name\="enumbody">\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\n</template><template autoinsert\="true" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\n${exception_var}.printStackTrace();</template><template autoinsert\="true" context\="methodbody_context" deleted\="false" description\="Code in created method stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodbody" name\="methodbody">// ${todo} Auto-generated method stub\n${body_statement}</template><template autoinsert\="true" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\n// ${todo} Auto-generated constructor stub</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template></templates>
diff --git a/plugins/infra/nattable/org.eclipse.papyrus.infra.nattable.welcome/META-INF/MANIFEST.MF b/plugins/infra/nattable/org.eclipse.papyrus.infra.nattable.welcome/META-INF/MANIFEST.MF
new file mode 100644
index 00000000000..7463026eb13
--- /dev/null
+++ b/plugins/infra/nattable/org.eclipse.papyrus.infra.nattable.welcome/META-INF/MANIFEST.MF
@@ -0,0 +1,39 @@
+Manifest-Version: 1.0
+Export-Package: org.eclipse.papyrus.infra.nattable.welcome.internal;x-internal:=true,
+ org.eclipse.papyrus.infra.nattable.welcome.internal.modelelements;x-internal:=true,
+ org.eclipse.papyrus.infra.nattable.welcome.internal.widgets;x-internal:=true
+Require-Bundle: org.eclipse.core.runtime;bundle-version="3.12.0",
+ org.eclipse.papyrus.infra.core.log;bundle-version="1.2.0",
+ org.eclipse.papyrus.infra.core;bundle-version="1.2.0",
+ org.eclipse.ui;bundle-version="3.100.0",
+ org.eclipse.ui.forms;bundle-version="3.7.0",
+ org.eclipse.papyrus.infra.editor.welcome;bundle-version="1.2.0",
+ org.eclipse.papyrus.infra.services.labelprovider;bundle-version="1.2.0",
+ org.eclipse.papyrus.infra.services.navigation;bundle-version="1.2.0",
+ org.eclipse.papyrus.infra.widgets;bundle-version="1.2.0",
+ org.eclipse.papyrus.infra.emf;bundle-version="1.2.0",
+ org.eclipse.papyrus.emf.facet.custom.ui;bundle-version="1.2.0",
+ org.eclipse.papyrus.emf.facet.custom.metamodel;bundle-version="1.2.0",
+ org.eclipse.papyrus.emf.facet.custom.core;bundle-version="1.2.0",
+ org.eclipse.papyrus.infra.viewpoints.policy;bundle-version="1.2.0",
+ org.eclipse.papyrus.uml.tools;bundle-version="1.2.0",
+ org.eclipse.papyrus.views.properties;bundle-version="1.2.0",
+ org.eclipse.papyrus.views.properties.model;bundle-version="1.2.0",
+ org.eclipse.core.databinding;bundle-version="1.6.0",
+ org.eclipse.emf.databinding;bundle-version="1.3.0",
+ org.eclipse.jface.databinding;bundle-version="1.8.0",
+ org.eclipse.core.databinding.property;bundle-version="1.6.0",
+ org.eclipse.nebula.widgets.nattable.core;bundle-version="1.3.0",
+ org.eclipse.papyrus.infra.editor.welcome.nattable;bundle-version="1.2.0",
+ org.eclipse.emf.transaction;bundle-version="1.9.0",
+ org.eclipse.papyrus.infra.nattable.model;bundle-version="1.2.0"
+Bundle-Vendor: %providerName
+Bundle-ActivationPolicy: lazy
+Bundle-Version: 1.2.0.qualifier
+Bundle-ClassPath: .
+Bundle-Localization: plugin
+Bundle-Name: %pluginName
+Bundle-Activator: org.eclipse.papyrus.infra.nattable.welcome.internal.Activator
+Bundle-ManifestVersion: 2
+Bundle-SymbolicName: org.eclipse.papyrus.infra.nattable.welcome;singleton:=true
+Bundle-RequiredExecutionEnvironment: JavaSE-1.8
diff --git a/plugins/infra/nattable/org.eclipse.papyrus.infra.nattable.welcome/about.html b/plugins/infra/nattable/org.eclipse.papyrus.infra.nattable.welcome/about.html
new file mode 100644
index 00000000000..dd3c089a94c
--- /dev/null
+++ b/plugins/infra/nattable/org.eclipse.papyrus.infra.nattable.welcome/about.html
@@ -0,0 +1,28 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
+<title>About</title>
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+
+<p>November 14, 2008</p>
+<h3>License</h3>
+
+<p>The Eclipse Foundation makes available all content in this plug-in (&quot;Content&quot;). Unless otherwise
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 1.0 (&quot;EPL&quot;). A copy of the EPL is available
+at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
+
+<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is
+being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
+apply to your use of any object code in the Content. Check the Redistributor's license that was
+provided with the Content. If no such license exists, contact the Redistributor. Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <a href="http://www.eclipse.org">http://www.eclipse.org</a>.</p>
+
+</body>
+</html> \ No newline at end of file
diff --git a/plugins/infra/nattable/org.eclipse.papyrus.infra.nattable.welcome/build.properties b/plugins/infra/nattable/org.eclipse.papyrus.infra.nattable.welcome/build.properties
new file mode 100644
index 00000000000..bb4312bfa23
--- /dev/null
+++ b/plugins/infra/nattable/org.eclipse.papyrus.infra.nattable.welcome/build.properties
@@ -0,0 +1,22 @@
+#
+# Copyright (c) 2015 Christian W. Damus and others.
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License v1.0
+# which accompanies this distribution, and is available at
+# http://www.eclipse.org/legal/epl-v10.html
+#
+# Contributors:
+# Christian W. Damus - Initial API and implementation
+#
+
+bin.includes = META-INF/,\
+ .,\
+ plugin.xml,\
+ about.html,\
+ plugin.properties,\
+ model/
+output.. = bin/
+src.includes = about.html
+source.. = src/
+bin.. = bin/
diff --git a/plugins/infra/nattable/org.eclipse.papyrus.infra.nattable.welcome/model/environment.xmi b/plugins/infra/nattable/org.eclipse.papyrus.infra.nattable.welcome/model/environment.xmi
new file mode 100644
index 00000000000..56868319345
--- /dev/null
+++ b/plugins/infra/nattable/org.eclipse.papyrus.infra.nattable.welcome/model/environment.xmi
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="ASCII"?>
+<environment:Environment
+ xmi:version="2.0"
+ xmlns:xmi="http://www.omg.org/XMI"
+ xmlns:environment="http://www.eclipse.org/papyrus/properties/environment/0.9">
+ <modelElementFactories
+ name="Welcome Factory"
+ factoryClass="org.eclipse.papyrus.infra.nattable.welcome.internal.modelelements.WelcomeModelElementFactory"/>
+ <widgetTypes
+ label="Create Table"
+ widgetClass="CreateNewTableButton"
+ namespace="//@namespaces.0"/>
+ <compositeWidgetTypes
+ label="Tables"
+ widgetClass="TablesTable"
+ namespace="//@namespaces.0"/>
+ <namespaces
+ name="ppew"
+ value="org.eclipse.papyrus.infra.nattable.welcome.internal.widgets"/>
+</environment:Environment>
diff --git a/plugins/infra/nattable/org.eclipse.papyrus.infra.nattable.welcome/model/tables/tables.ctx b/plugins/infra/nattable/org.eclipse.papyrus.infra.nattable.welcome/model/tables/tables.ctx
new file mode 100644
index 00000000000..a9d1ac510c5
--- /dev/null
+++ b/plugins/infra/nattable/org.eclipse.papyrus.infra.nattable.welcome/model/tables/tables.ctx
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="ASCII"?>
+<contexts:Context xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:constraints="http://www.eclipse.org/papyrus/constraints/0.9" xmlns:contexts="http://www.eclipse.org/papyrus/properties/contexts/0.9" xmi:id="_MPALcI7eEeWNa5T2Agi7uA" name="welcome-tables" label="List of Tables">
+ <tabs xmi:id="_SsfbQcElEeS_u7hIvAIReA" label="Tables" id="tables" category="org.eclipse.papyrus" priority="100">
+ <afterTab href="ppe:/context/org.eclipse.papyrus.infra.gmfdiag.welcome/model/diagrams/diagrams.ctx#_SsfbQcElEeS_u7hIvAIReA"/>
+ <sections xmi:id="_SsgCV8ElEeS_u7hIvAIReA" name="Single Tables" sectionFile="ui/SingleTables.xwt">
+ <widget href="ui/SingleTables.xwt#/"/>
+ </sections>
+ </tabs>
+ <views xmi:id="_Ssiem8ElEeS_u7hIvAIReA" name="Single Tables" sections="_SsgCV8ElEeS_u7hIvAIReA" automaticContext="true" datacontexts="_SsmJGsElEeS_u7hIvAIReA">
+ <constraints xsi:type="constraints:SimpleConstraint" xmi:id="_SskT2cElEeS_u7hIvAIReA" name="isWelcomeElement">
+ <constraintType href="ppe:/environment/org.eclipse.papyrus.infra.editor.welcome/model/environment.xmi#//@constraintTypes.0"/>
+ <properties xsi:type="constraints:ValueProperty" xmi:id="_SskT2sElEeS_u7hIvAIReA" name="metaclassName" value="Welcome"/>
+ </constraints>
+ </views>
+ <dataContexts xmi:id="_SsmI-cElEeS_u7hIvAIReA" name="welcomeTables" label="Welcome">
+ <elements xmi:id="_SsmJGsElEeS_u7hIvAIReA" name="Welcome">
+ <properties xmi:id="_SsmJG8ElEeS_u7hIvAIReA" name="tables" label="Tables" type="Reference" multiplicity="-1" description="All of the tables available in the model."/>
+ </elements>
+ <modelElementFactory href="ppe:/environment/org.eclipse.papyrus.infra.nattable.welcome/model/environment.xmi#//@modelElementFactories.0"/>
+ </dataContexts>
+</contexts:Context>
diff --git a/plugins/infra/nattable/org.eclipse.papyrus.infra.nattable.welcome/model/tables/ui/SingleTables.xwt b/plugins/infra/nattable/org.eclipse.papyrus.infra.nattable.welcome/model/tables/ui/SingleTables.xwt
new file mode 100644
index 00000000000..150aa90cb96
--- /dev/null
+++ b/plugins/infra/nattable/org.eclipse.papyrus.infra.nattable.welcome/model/tables/ui/SingleTables.xwt
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Composite
+ xmlns:ppel="clr-namespace:org.eclipse.papyrus.views.properties.widgets.layout"
+ xmlns:ppe="clr-namespace:org.eclipse.papyrus.views.properties.widgets"
+ xmlns:x="http://www.eclipse.org/xwt"
+ xmlns:ppew="clr-namespace:org.eclipse.papyrus.infra.nattable.welcome.internal.widgets"
+ xmlns="http://www.eclipse.org/xwt/presentation" xmlns:j="clr-namespace:java.lang">
+ <Composite.layout>
+ <ppel:PropertiesLayout></ppel:PropertiesLayout>
+ </Composite.layout>
+ <ppew:TablesTable input="{Binding}" property="welcomeTables:Welcome:tables"></ppew:TablesTable>
+ <ppew:CreateNewTableButton input="{Binding}"></ppew:CreateNewTableButton>
+</Composite> \ No newline at end of file
diff --git a/plugins/infra/nattable/org.eclipse.papyrus.infra.nattable.welcome/plugin.properties b/plugins/infra/nattable/org.eclipse.papyrus.infra.nattable.welcome/plugin.properties
new file mode 100644
index 00000000000..ef32709d639
--- /dev/null
+++ b/plugins/infra/nattable/org.eclipse.papyrus.infra.nattable.welcome/plugin.properties
@@ -0,0 +1,13 @@
+#
+# Copyright (c) 2015 Christian W. Damus and others.
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License v1.0
+# which accompanies this distribution, and is available at
+# http://www.eclipse.org/legal/epl-v10.html
+#
+# Contributors:
+# Christian W. Damus - Initial API and implementation
+#
+pluginName=Papyrus Editor Diagrams Welcome Page Content
+providerName=Eclipse Modeling Project
diff --git a/plugins/infra/nattable/org.eclipse.papyrus.infra.nattable.welcome/plugin.xml b/plugins/infra/nattable/org.eclipse.papyrus.infra.nattable.welcome/plugin.xml
new file mode 100644
index 00000000000..0fc6eb13271
--- /dev/null
+++ b/plugins/infra/nattable/org.eclipse.papyrus.infra.nattable.welcome/plugin.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.2"?>
+<!--
+ Copyright (c) 2015 Christian W. Damus and others.
+
+ All rights reserved. This program and the accompanying materials
+ are made available under the terms of the Eclipse Public License v1.0
+ which accompanies this distribution, and is available at
+ http://www.eclipse.org/legal/epl-v10.html
+
+ Contributors:
+ Christian W. Damus - Initial API and implementation
+-->
+<plugin>
+ <extension
+ point="org.eclipse.papyrus.views.properties.context">
+ <context
+ contextModel="model/tables/tables.ctx">
+ </context>
+ <preferencePageBinding
+ context="welcome-tables"
+ page="org.eclipse.papyrus.infra.editor.welcome.content">
+ </preferencePageBinding>
+ </extension>
+ <extension
+ point="org.eclipse.papyrus.views.properties.environment">
+ <environment
+ environmentModel="model/environment.xmi">
+ </environment>
+ </extension>
+</plugin>
diff --git a/plugins/infra/nattable/org.eclipse.papyrus.infra.nattable.welcome/pom.xml b/plugins/infra/nattable/org.eclipse.papyrus.infra.nattable.welcome/pom.xml
new file mode 100644
index 00000000000..b91a24ddb17
--- /dev/null
+++ b/plugins/infra/nattable/org.eclipse.papyrus.infra.nattable.welcome/pom.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project>
+ <modelVersion>4.0.0</modelVersion>
+ <parent>
+ <artifactId>org.eclipse.papyrus.releng</artifactId>
+ <groupId>org.eclipse.papyrus</groupId>
+ <version>1.2.0-SNAPSHOT</version>
+ <relativePath>../../../../releng/main</relativePath>
+ </parent>
+ <artifactId>org.eclipse.papyrus.infra.nattable.welcome</artifactId>
+ <groupId>org.eclipse.papyrus</groupId>
+ <version>1.2.0-SNAPSHOT</version>
+ <packaging>eclipse-plugin</packaging>
+</project> \ No newline at end of file
diff --git a/plugins/infra/nattable/org.eclipse.papyrus.infra.nattable.welcome/src/org/eclipse/papyrus/infra/nattable/welcome/internal/Activator.java b/plugins/infra/nattable/org.eclipse.papyrus.infra.nattable.welcome/src/org/eclipse/papyrus/infra/nattable/welcome/internal/Activator.java
new file mode 100644
index 00000000000..3347f46122a
--- /dev/null
+++ b/plugins/infra/nattable/org.eclipse.papyrus.infra.nattable.welcome/src/org/eclipse/papyrus/infra/nattable/welcome/internal/Activator.java
@@ -0,0 +1,60 @@
+/*****************************************************************************
+ * Copyright (c) 2015 Christian W. Damus and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Christian W. Damus - Initial API and implementation
+ *
+ *****************************************************************************/
+package org.eclipse.papyrus.infra.nattable.welcome.internal;
+
+import org.eclipse.papyrus.infra.core.log.LogHelper;
+import org.eclipse.ui.plugin.AbstractUIPlugin;
+import org.osgi.framework.BundleContext;
+
+/**
+ * The activator class controls the plug-in life cycle
+ */
+public class Activator extends AbstractUIPlugin {
+
+ // The plug-in ID
+ public static final String PLUGIN_ID = "org.eclipse.papyrus.infra.gmfdiag.welcome"; //$NON-NLS-1$
+
+ // The shared instance
+ private static Activator plugin;
+
+ public static LogHelper log;
+
+ /**
+ * The constructor
+ */
+ public Activator() {
+ }
+
+ @Override
+ public void start(BundleContext context) throws Exception {
+ super.start(context);
+ plugin = this;
+ log = new LogHelper(this);
+ }
+
+ @Override
+ public void stop(BundleContext context) throws Exception {
+ plugin = null;
+ super.stop(context);
+ }
+
+ /**
+ * Returns the shared instance
+ *
+ * @return the shared instance
+ */
+ public static Activator getDefault() {
+ return plugin;
+ }
+
+}
diff --git a/plugins/infra/nattable/org.eclipse.papyrus.infra.nattable.welcome/src/org/eclipse/papyrus/infra/nattable/welcome/internal/modelelements/TableObservable.java b/plugins/infra/nattable/org.eclipse.papyrus.infra.nattable.welcome/src/org/eclipse/papyrus/infra/nattable/welcome/internal/modelelements/TableObservable.java
new file mode 100644
index 00000000000..a0011c97b18
--- /dev/null
+++ b/plugins/infra/nattable/org.eclipse.papyrus.infra.nattable.welcome/src/org/eclipse/papyrus/infra/nattable/welcome/internal/modelelements/TableObservable.java
@@ -0,0 +1,187 @@
+/*****************************************************************************
+ * Copyright (c) 2015 Christian W. Damus and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Christian W. Damus - Initial API and implementation
+ *
+ *****************************************************************************/
+
+package org.eclipse.papyrus.infra.nattable.welcome.internal.modelelements;
+
+import org.eclipse.core.databinding.observable.AbstractObservable;
+import org.eclipse.core.databinding.observable.ChangeEvent;
+import org.eclipse.core.databinding.observable.IChangeListener;
+import org.eclipse.core.databinding.observable.Realm;
+import org.eclipse.core.databinding.observable.value.IObservableValue;
+import org.eclipse.emf.common.notify.Adapter;
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.notify.Notifier;
+import org.eclipse.emf.common.notify.impl.AdapterImpl;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.papyrus.infra.nattable.model.nattable.NattablePackage;
+import org.eclipse.papyrus.infra.nattable.model.nattable.Table;
+import org.eclipse.papyrus.infra.tools.databinding.TouchableValue;
+
+/**
+ * Encapsulation of a {@link Table} that presents the following as observable properties:
+ * <ul>
+ * <li>the table</li>
+ * <li>the table's context element</li>
+ * </ul>
+ */
+public class TableObservable extends AbstractObservable {
+ private final Table table;
+
+ private Adapter tableAdapter;
+ private Adapter contextAdapter;
+
+ private final TouchableValue<Table> tableValue;
+ private final TouchableValue<EObject> contextValue;
+
+ public TableObservable(Table table) {
+ this(Realm.getDefault(), table);
+ }
+
+ public TableObservable(Realm realm, Table table) {
+ super(realm);
+
+ this.table = table;
+
+ this.tableValue = new TouchableValue<>(realm, Table.class, table);
+ this.contextValue = new TouchableValue<>(realm, EObject.class, table.getContext());
+
+ this.tableAdapter = new TableAdapter(table);
+ handleContextChanged(null, table.getContext());
+
+ // Roll up changes to my elements as changes to me
+ IChangeListener rollup = new IChangeListener() {
+
+ @Override
+ public void handleChange(ChangeEvent event) {
+ TableObservable.this.fireChange();
+ }
+ };
+ tableValue.addChangeListener(rollup);
+ contextValue.addChangeListener(rollup);
+ }
+
+ @Override
+ public synchronized void dispose() {
+ if (tableAdapter != null) {
+ // This will nullify the 'tableAdapter' field
+ table.eAdapters().remove(tableAdapter);
+ }
+
+ if (contextAdapter != null) {
+ // This will nullify the 'contextAdapter' field
+ table.getContext().eAdapters().remove(contextAdapter);
+ }
+
+ tableValue.dispose();
+ contextValue.dispose();
+
+ super.dispose();
+ }
+
+ public IObservableValue<Table> getTable() {
+ return tableValue;
+ }
+
+ public IObservableValue<EObject> getContext() {
+ return contextValue;
+ }
+
+ @Override
+ public boolean isStale() {
+ return false;
+ }
+
+ void handleContextChanged(EObject oldContext, EObject newContext) {
+ Adapter adapter = this.contextAdapter;
+
+ if (oldContext != null) {
+ // This will nullify the 'contextAdapter' field
+ oldContext.eAdapters().remove(contextAdapter);
+ }
+ if (newContext != null) {
+ if (adapter == null) {
+ // initial context
+ contextAdapter = new ContextAdapter(newContext);
+ } else {
+ // reuse the adapter
+ newContext.eAdapters().add(adapter);
+ contextAdapter = adapter;
+ }
+ }
+
+ contextValue.setValue(newContext);
+ }
+
+ //
+ // Nested types
+ //
+
+ private class TableAdapter extends AdapterImpl {
+ TableAdapter(Table table) {
+ super();
+
+ table.eAdapters().add(this);
+ }
+
+ @Override
+ public void unsetTarget(Notifier oldTarget) {
+ if (target == oldTarget) {
+ // I am disposed
+ tableAdapter = null;
+ }
+
+ super.unsetTarget(oldTarget);
+ }
+
+ @Override
+ public void notifyChanged(Notification msg) {
+ if (!msg.isTouch()) {
+ switch (msg.getFeatureID(Table.class)) {
+ case NattablePackage.TABLE__NAME:
+ case NattablePackage.TABLE__TABLE_CONFIGURATION:
+ tableValue.touch();
+ break;
+ case NattablePackage.TABLE__CONTEXT:
+ handleContextChanged((EObject) msg.getOldValue(), (EObject) msg.getNewValue());
+ break;
+ }
+ }
+ }
+ }
+
+ private class ContextAdapter extends AdapterImpl {
+ ContextAdapter(EObject context) {
+ super();
+
+ context.eAdapters().add(this);
+ }
+
+ @Override
+ public void unsetTarget(Notifier oldTarget) {
+ if (target == oldTarget) {
+ // I am disposed
+ contextAdapter = null;
+ }
+
+ super.unsetTarget(oldTarget);
+ }
+
+ @Override
+ public void notifyChanged(Notification msg) {
+ if (!msg.isTouch()) {
+ // Can't interpret the change, so just assume that the label needs to change
+ contextValue.touch();
+ }
+ }
+ }
+}
diff --git a/plugins/infra/nattable/org.eclipse.papyrus.infra.nattable.welcome/src/org/eclipse/papyrus/infra/nattable/welcome/internal/modelelements/TablesObservableList.java b/plugins/infra/nattable/org.eclipse.papyrus.infra.nattable.welcome/src/org/eclipse/papyrus/infra/nattable/welcome/internal/modelelements/TablesObservableList.java
new file mode 100644
index 00000000000..a4982c9bbd5
--- /dev/null
+++ b/plugins/infra/nattable/org.eclipse.papyrus.infra.nattable.welcome/src/org/eclipse/papyrus/infra/nattable/welcome/internal/modelelements/TablesObservableList.java
@@ -0,0 +1,87 @@
+/*****************************************************************************
+ * Copyright (c) 2015 Christian W. Damus and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Christian W. Damus - Initial API and implementation
+ *
+ *****************************************************************************/
+
+package org.eclipse.papyrus.infra.nattable.welcome.internal.modelelements;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.emf.transaction.TransactionalEditingDomain;
+import org.eclipse.papyrus.infra.core.resource.ResourceAdapter;
+import org.eclipse.papyrus.infra.nattable.model.nattable.Table;
+import org.eclipse.papyrus.infra.tools.databinding.WritableListWithIterator;
+
+/**
+ * An observable list of diagram-observables, tracking all of the diagrams available
+ * in the resource set.
+ */
+public class TablesObservableList extends WritableListWithIterator<TableObservable> {
+ private TransactionalEditingDomain domain;
+ private ResourceAdapter.Transactional diagramsListener;
+
+ public TablesObservableList(WelcomeModelElement owner) {
+ super(new ArrayList<>(), TableObservable.class);
+
+ this.domain = (TransactionalEditingDomain) owner.getDomain();
+ hookDiagramsListener();
+ }
+
+ @Override
+ public synchronized void dispose() {
+ if (diagramsListener != null) {
+ diagramsListener.uninstall(domain);
+ diagramsListener = null;
+ domain = null;
+ }
+
+ super.dispose();
+ }
+
+ void hookDiagramsListener() {
+ diagramsListener = new ResourceAdapter.Transactional() {
+
+ @Override
+ protected void handleResourceLoaded(Resource resource) {
+ resource.getContents().stream()
+ .filter(Table.class::isInstance)
+ .map(Table.class::cast)
+ .map(TableObservable::new)
+ .forEach(TablesObservableList.this::add);
+ }
+
+ @Override
+ protected void handleRootAdded(Resource resource, EObject root) {
+ if (root instanceof Table) {
+ add(new TableObservable((Table) root));
+ }
+ }
+
+ @Override
+ protected void handleRootRemoved(Resource resource, EObject root) {
+ if (root instanceof Table) {
+ for (Iterator<TableObservable> iter = iterator(); iter.hasNext();) {
+ TableObservable next = iter.next();
+ if (next.getTable().getValue() == root) {
+ iter.remove();
+ next.dispose();
+ }
+ }
+ }
+ }
+ };
+
+ diagramsListener.install(domain);
+ }
+}
diff --git a/plugins/infra/nattable/org.eclipse.papyrus.infra.nattable.welcome/src/org/eclipse/papyrus/infra/nattable/welcome/internal/modelelements/WelcomeModelElement.java b/plugins/infra/nattable/org.eclipse.papyrus.infra.nattable.welcome/src/org/eclipse/papyrus/infra/nattable/welcome/internal/modelelements/WelcomeModelElement.java
new file mode 100644
index 00000000000..e55fc51ab35
--- /dev/null
+++ b/plugins/infra/nattable/org.eclipse.papyrus.infra.nattable.welcome/src/org/eclipse/papyrus/infra/nattable/welcome/internal/modelelements/WelcomeModelElement.java
@@ -0,0 +1,68 @@
+/*****************************************************************************
+ * Copyright (c) 2015 Christian W. Damus and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Christian W. Damus - Initial API and implementation
+ *
+ *****************************************************************************/
+
+package org.eclipse.papyrus.infra.nattable.welcome.internal.modelelements;
+
+import org.eclipse.core.databinding.observable.IObservable;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.edit.domain.EditingDomain;
+import org.eclipse.papyrus.views.properties.modelelement.EMFModelElement;
+
+/**
+ * @author damus
+ *
+ */
+public class WelcomeModelElement extends EMFModelElement {
+ private final String TABLES = "tables"; //$NON-NLS-1$
+
+ public WelcomeModelElement(EObject source, EditingDomain domain) {
+ super(source, domain);
+ }
+
+ @Override
+ protected IObservable doGetObservable(String propertyPath) {
+ IObservable result;
+
+ switch (propertyPath) {
+ case TABLES:
+ result = new TablesObservableList(this);
+ break;
+ default:
+ result = super.doGetObservable(propertyPath);
+ break;
+ }
+
+ return result;
+ }
+
+ @Override
+ protected boolean isFeatureEditable(String propertyPath) {
+ boolean result;
+
+ switch (propertyPath) {
+ case TABLES:
+ result = true;
+ break;
+ default:
+ result = super.isEditable(propertyPath);
+ break;
+ }
+
+ return result;
+ }
+
+ @Override
+ protected boolean isElementEditable() {
+ return true;
+ }
+}
diff --git a/plugins/infra/nattable/org.eclipse.papyrus.infra.nattable.welcome/src/org/eclipse/papyrus/infra/nattable/welcome/internal/modelelements/WelcomeModelElementFactory.java b/plugins/infra/nattable/org.eclipse.papyrus.infra.nattable.welcome/src/org/eclipse/papyrus/infra/nattable/welcome/internal/modelelements/WelcomeModelElementFactory.java
new file mode 100644
index 00000000000..0f81f6b8de3
--- /dev/null
+++ b/plugins/infra/nattable/org.eclipse.papyrus.infra.nattable.welcome/src/org/eclipse/papyrus/infra/nattable/welcome/internal/modelelements/WelcomeModelElementFactory.java
@@ -0,0 +1,45 @@
+/*****************************************************************************
+ * Copyright (c) 2015 Christian W. Damus and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Christian W. Damus - Initial API and implementation
+ *
+ *****************************************************************************/
+
+package org.eclipse.papyrus.infra.nattable.welcome.internal.modelelements;
+
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.edit.domain.EditingDomain;
+import org.eclipse.papyrus.infra.emf.utils.EMFHelper;
+import org.eclipse.papyrus.views.properties.Activator;
+import org.eclipse.papyrus.views.properties.contexts.DataContextElement;
+import org.eclipse.papyrus.views.properties.modelelement.AbstractEMFModelElementFactory;
+
+/**
+ * @author damus
+ *
+ */
+public class WelcomeModelElementFactory extends AbstractEMFModelElementFactory<WelcomeModelElement> {
+
+ public WelcomeModelElementFactory() {
+ super();
+ }
+
+ @Override
+ protected WelcomeModelElement doCreateFromSource(Object sourceElement, DataContextElement context) {
+ EObject source = EMFHelper.getEObject(sourceElement);
+ if (source == null) {
+ Activator.log.warn("Unable to resolve the selected element to an EObject"); //$NON-NLS-1$
+ return null;
+ }
+
+ EditingDomain domain = EMFHelper.resolveEditingDomain(source);
+ return new WelcomeModelElement(source, domain);
+ }
+
+}
diff --git a/plugins/infra/nattable/org.eclipse.papyrus.infra.nattable.welcome/src/org/eclipse/papyrus/infra/nattable/welcome/internal/widgets/CreateNewTableButton.java b/plugins/infra/nattable/org.eclipse.papyrus.infra.nattable.welcome/src/org/eclipse/papyrus/infra/nattable/welcome/internal/widgets/CreateNewTableButton.java
new file mode 100644
index 00000000000..c8618167f09
--- /dev/null
+++ b/plugins/infra/nattable/org.eclipse.papyrus.infra.nattable.welcome/src/org/eclipse/papyrus/infra/nattable/welcome/internal/widgets/CreateNewTableButton.java
@@ -0,0 +1,180 @@
+/*****************************************************************************
+ * Copyright (c) 2015 Christian W. Damus and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Christian W. Damus - Initial API and implementation
+ *
+ *****************************************************************************/
+
+package org.eclipse.papyrus.infra.nattable.welcome.internal.widgets;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.jface.viewers.ILabelProvider;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.jface.window.Window;
+import org.eclipse.papyrus.infra.core.resource.ModelSet;
+import org.eclipse.papyrus.infra.core.services.ServiceException;
+import org.eclipse.papyrus.infra.emf.providers.strategy.SemanticEMFContentProvider;
+import org.eclipse.papyrus.infra.emf.utils.EMFHelper;
+import org.eclipse.papyrus.infra.emf.utils.ServiceUtilsForEObject;
+import org.eclipse.papyrus.infra.emf.utils.ServiceUtilsForResourceSet;
+import org.eclipse.papyrus.infra.services.labelprovider.service.LabelProviderService;
+import org.eclipse.papyrus.infra.viewpoints.configuration.PapyrusSyncTable;
+import org.eclipse.papyrus.infra.viewpoints.configuration.PapyrusTable;
+import org.eclipse.papyrus.infra.viewpoints.policy.PolicyChecker;
+import org.eclipse.papyrus.infra.viewpoints.policy.ViewPrototype;
+import org.eclipse.papyrus.infra.widgets.editors.TreeSelectorDialog;
+import org.eclipse.papyrus.uml.tools.providers.SemanticUMLContentProvider;
+import org.eclipse.papyrus.views.properties.modelelement.DataSource;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.ui.dialogs.ElementListSelectionDialog;
+
+/**
+ * The properties widget that creates a new diagram.
+ */
+public class CreateNewTableButton extends Composite {
+
+ private DataSource input;
+
+ public CreateNewTableButton(Composite parent, int style) {
+ super(parent, style);
+
+ GridLayout layout = new GridLayout(1, false);
+ setLayout(layout);
+
+ Button button = new Button(this, SWT.PUSH | SWT.FLAT);
+ button.setText("Create Table");
+ button.addSelectionListener(new SelectionAdapter() {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ createTable();
+ }
+ });
+ }
+
+ @Override
+ public void dispose() {
+ this.input = null;
+
+ super.dispose();
+ }
+
+ /**
+ * Sets the input DataSource for this Property editor.
+ *
+ * @param input
+ */
+ public void setInput(DataSource input) {
+ this.input = input;
+ }
+
+ /**
+ * @return the input DataSource for this Property editor
+ */
+ public DataSource getInput() {
+ return input;
+ }
+
+ protected EObject getModelElement() {
+ return EMFHelper.getEObject(input.getSelection().getFirstElement());
+ }
+
+ protected void createTable() {
+ List<ViewPrototype> availablePrototypes = new ArrayList<>();
+
+ ModelSet modelSet = null;
+ LabelProviderService labels = null;
+
+ try {
+ modelSet = ServiceUtilsForEObject.getInstance().getModelSet(getModelElement());
+ labels = ServiceUtilsForResourceSet.getInstance().getService(LabelProviderService.class, modelSet);
+ } catch (ServiceException e) {
+ throw new IllegalStateException(e);
+ }
+
+ SemanticEMFContentProvider content = new SemanticUMLContentProvider(modelSet) {
+
+ @Override
+ public boolean isValidValue(Object element) {
+ availablePrototypes.clear();
+
+ if (element != null) {
+ EObject object = EMFHelper.getEObject(element);
+ if (object != null) {
+ // build a list of all the available prototypes
+ for (final ViewPrototype proto : PolicyChecker.getCurrent().getPrototypesFor(object)) {
+ if (!((proto.getConfiguration() instanceof PapyrusTable) || (proto.getConfiguration() instanceof PapyrusSyncTable))) {
+ continue;
+ }
+ availablePrototypes.add(proto);
+ }
+ }
+ }
+
+ return !availablePrototypes.isEmpty();
+ }
+ };
+
+ TreeSelectorDialog dlg = new TreeSelectorDialog(getShell());
+ dlg.setLabelProvider(labels.getLabelProvider());
+ dlg.setContentProvider(content);
+ dlg.setMessage("Select an element for which to create a new table.");
+ dlg.setTitle("Select Table Context");
+ dlg.setInput(modelSet);
+
+ if (dlg.open() == Window.OK) {
+ Object[] result = dlg.getResult();
+ if (result.length > 0) {
+ EObject object = EMFHelper.getEObject(result[0]);
+ if (object != null) {
+ createTable(object, availablePrototypes);
+ }
+ }
+ }
+ }
+
+ protected void createTable(EObject context, List<ViewPrototype> prototypes) {
+ Collections.sort(prototypes, new ViewPrototype.Comp());
+
+ ILabelProvider labels = new LabelProvider() {
+ @Override
+ public String getText(Object element) {
+ return ((ViewPrototype) element).getLabel();
+ }
+
+ @Override
+ public Image getImage(Object element) {
+ return ((ViewPrototype) element).getIcon();
+ }
+ };
+
+ ElementListSelectionDialog dlg = new ElementListSelectionDialog(getShell(), labels);
+ dlg.setTitle("Create Table");
+ dlg.setMessage("Select the table to create");
+ dlg.setMultipleSelection(false);
+ dlg.setElements(prototypes.toArray());
+
+ if (dlg.open() == Window.OK) {
+ Object[] result = dlg.getResult();
+ if (result.length > 0) {
+ ViewPrototype prototype = (ViewPrototype) result[0];
+ prototype.instantiateOn(context);
+ }
+ }
+ }
+}
diff --git a/plugins/infra/nattable/org.eclipse.papyrus.infra.nattable.welcome/src/org/eclipse/papyrus/infra/nattable/welcome/internal/widgets/TablesTable.java b/plugins/infra/nattable/org.eclipse.papyrus.infra.nattable.welcome/src/org/eclipse/papyrus/infra/nattable/welcome/internal/widgets/TablesTable.java
new file mode 100644
index 00000000000..2ed02cbc903
--- /dev/null
+++ b/plugins/infra/nattable/org.eclipse.papyrus.infra.nattable.welcome/src/org/eclipse/papyrus/infra/nattable/welcome/internal/widgets/TablesTable.java
@@ -0,0 +1,92 @@
+/*****************************************************************************
+ * Copyright (c) 2015 Christian W. Damus and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Christian W. Damus - Initial API and implementation
+ *
+ *****************************************************************************/
+
+package org.eclipse.papyrus.infra.nattable.welcome.internal.widgets;
+
+import org.eclipse.nebula.widgets.nattable.data.IColumnPropertyAccessor;
+import org.eclipse.papyrus.infra.editor.welcome.nattable.widgets.HyperlinkTable;
+import org.eclipse.papyrus.infra.nattable.welcome.internal.modelelements.TableObservable;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * A two-column table of hyperlinks for diagrams: on the left side, a link that navigates
+ * to the diagram page, and on the right side, a link that navigates to the diagram's
+ * context element in the Model Explorer.
+ */
+public class TablesTable extends HyperlinkTable<TableObservable> {
+
+ public TablesTable(Composite parent, int style) {
+ super(parent, style, new DiagramsColumnAccessor(), "Table", "Context");
+ }
+
+ //
+ // Nested types
+ //
+
+ static class DiagramsColumnAccessor implements IColumnPropertyAccessor<TableObservable> {
+ static final String TABLE = "table"; //$NON-NLS-1$
+ static final String CONTEXT = "context"; //$NON-NLS-1$
+
+ @Override
+ public int getColumnCount() {
+ return 2;
+ }
+
+ @Override
+ public Object getDataValue(TableObservable rowObject, int columnIndex) {
+ Object result;
+
+ switch (columnIndex) {
+ case 0:
+ result = rowObject.getTable();
+ break;
+ case 1:
+ result = rowObject.getContext();
+ break;
+ default:
+ throw new IndexOutOfBoundsException(Integer.toString(columnIndex));
+ }
+
+ return result;
+ }
+
+ @Override
+ public void setDataValue(TableObservable rowObject, int columnIndex, Object newValue) {
+ throw new IllegalStateException("not editable"); //$NON-NLS-1$
+ }
+
+ @Override
+ public String getColumnProperty(int columnIndex) {
+ switch (columnIndex) {
+ case 0:
+ return TABLE;
+ case 1:
+ return CONTEXT;
+ default:
+ throw new IndexOutOfBoundsException(Integer.toString(columnIndex));
+ }
+ }
+
+ @Override
+ public int getColumnIndex(String propertyName) {
+ switch (propertyName) {
+ case TABLE:
+ return 0;
+ case CONTEXT:
+ return 1;
+ default:
+ throw new IllegalArgumentException(propertyName);
+ }
+ }
+ }
+}
diff --git a/plugins/infra/nattable/pom.xml b/plugins/infra/nattable/pom.xml
index 9abba63a009..c3350326dc7 100755
--- a/plugins/infra/nattable/pom.xml
+++ b/plugins/infra/nattable/pom.xml
@@ -26,7 +26,8 @@
<module>org.eclipse.papyrus.infra.nattable.properties</module>
<module>org.eclipse.papyrus.infra.nattable.views.config</module>
<module>org.eclipse.papyrus.infra.nattable.views.editor</module>
+ <module>org.eclipse.papyrus.infra.nattable.welcome</module>
</modules>
-</project> \ No newline at end of file
+</project>
diff --git a/plugins/infra/org.eclipse.papyrus.infra.tools/.classpath b/plugins/infra/org.eclipse.papyrus.infra.tools/.classpath
index 94c7bb7e8ed..eca7bdba8f0 100644
--- a/plugins/infra/org.eclipse.papyrus.infra.tools/.classpath
+++ b/plugins/infra/org.eclipse.papyrus.infra.tools/.classpath
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
- <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>
<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
<classpathentry kind="src" path="src"/>
<classpathentry kind="output" path="bin"/>
-</classpath> \ No newline at end of file
+</classpath>
diff --git a/plugins/infra/org.eclipse.papyrus.infra.tools/.settings/org.eclipse.jdt.core.prefs b/plugins/infra/org.eclipse.papyrus.infra.tools/.settings/org.eclipse.jdt.core.prefs
index 4759947300a..62a08f4494d 100644
--- a/plugins/infra/org.eclipse.papyrus.infra.tools/.settings/org.eclipse.jdt.core.prefs
+++ b/plugins/infra/org.eclipse.papyrus.infra.tools/.settings/org.eclipse.jdt.core.prefs
@@ -1,10 +1,10 @@
eclipse.preferences.version=1
org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
-org.eclipse.jdt.core.compiler.compliance=1.5
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
+org.eclipse.jdt.core.compiler.compliance=1.8
org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.source=1.5
+org.eclipse.jdt.core.compiler.source=1.8
org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation=0
diff --git a/plugins/infra/org.eclipse.papyrus.infra.tools/META-INF/MANIFEST.MF b/plugins/infra/org.eclipse.papyrus.infra.tools/META-INF/MANIFEST.MF
index d68271a5d17..bfbfd52f4b0 100644
--- a/plugins/infra/org.eclipse.papyrus.infra.tools/META-INF/MANIFEST.MF
+++ b/plugins/infra/org.eclipse.papyrus.infra.tools/META-INF/MANIFEST.MF
@@ -2,6 +2,7 @@ Manifest-Version: 1.0
Export-Package: org.eclipse.papyrus.infra.tools.comparator,
org.eclipse.papyrus.infra.tools.converter,
org.eclipse.papyrus.infra.tools.databinding,
+ org.eclipse.papyrus.infra.tools.dnd,
org.eclipse.papyrus.infra.tools.preferences,
org.eclipse.papyrus.infra.tools.preferences.ui.dialog,
org.eclipse.papyrus.infra.tools.util
@@ -23,4 +24,4 @@ Bundle-Name: %Bundle-Name
Bundle-Activator: org.eclipse.papyrus.infra.tools.Activator
Bundle-ManifestVersion: 2
Bundle-SymbolicName: org.eclipse.papyrus.infra.tools
-Bundle-RequiredExecutionEnvironment: J2SE-1.5
+Bundle-RequiredExecutionEnvironment: JavaSE-1.8
diff --git a/plugins/infra/org.eclipse.papyrus.infra.tools/src/org/eclipse/papyrus/infra/tools/databinding/TouchableValue.java b/plugins/infra/org.eclipse.papyrus.infra.tools/src/org/eclipse/papyrus/infra/tools/databinding/TouchableValue.java
new file mode 100644
index 00000000000..23ffdf711b0
--- /dev/null
+++ b/plugins/infra/org.eclipse.papyrus.infra.tools/src/org/eclipse/papyrus/infra/tools/databinding/TouchableValue.java
@@ -0,0 +1,74 @@
+/*****************************************************************************
+ * Copyright (c) 2015 Christian W. Damus and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Christian W. Damus - Initial API and implementation
+ *
+ *****************************************************************************/
+
+package org.eclipse.papyrus.infra.tools.databinding;
+
+import java.util.Objects;
+
+import org.eclipse.core.databinding.observable.ChangeEvent;
+import org.eclipse.core.databinding.observable.Diffs;
+import org.eclipse.core.databinding.observable.Realm;
+import org.eclipse.core.databinding.observable.value.AbstractObservableValue;
+import org.eclipse.core.databinding.observable.value.WritableValue;
+
+/**
+ * An analogue of the {@link WritableValue} that supports "touches" to send
+ * change events even though the value is not replaced.
+ */
+public class TouchableValue<T> extends AbstractObservableValue<T> {
+ private final Class<? extends T> type;
+
+ private T value;
+
+ public TouchableValue(Realm realm, Class<? extends T> type) {
+ super(realm);
+
+ this.type = type;
+ }
+
+ public TouchableValue(Realm realm, Class<? extends T> type, T initialValue) {
+ super(realm);
+
+ this.type = type;
+ this.value = initialValue;
+ }
+
+ @Override
+ public Object getValueType() {
+ return type;
+ }
+
+ @Override
+ protected T doGetValue() {
+ return value;
+ }
+
+ @Override
+ protected void doSetValue(T value) {
+ if (!Objects.equals(this.value, value)) {
+ T oldValue = this.value;
+ this.value = value;
+ fireValueChange(Diffs.createValueDiff(oldValue, value));
+ }
+ }
+
+ /**
+ * Indicates that some kind of change has happened to the observable's value
+ * that observers should know about, but for which specific change details
+ * are not available.
+ */
+ public void touch() {
+ checkRealm();
+ fireEvent(new ChangeEvent(this));
+ }
+}
diff --git a/plugins/infra/org.eclipse.papyrus.infra.tools/src/org/eclipse/papyrus/infra/tools/databinding/WritableListWithIterator.java b/plugins/infra/org.eclipse.papyrus.infra.tools/src/org/eclipse/papyrus/infra/tools/databinding/WritableListWithIterator.java
new file mode 100644
index 00000000000..d2c3bde7c6b
--- /dev/null
+++ b/plugins/infra/org.eclipse.papyrus.infra.tools/src/org/eclipse/papyrus/infra/tools/databinding/WritableListWithIterator.java
@@ -0,0 +1,179 @@
+/*****************************************************************************
+ * Copyright (c) 2015 Christian W. Damus and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Christian W. Damus - Initial API and implementation
+ *
+ *****************************************************************************/
+
+package org.eclipse.papyrus.infra.tools.databinding;
+
+import static org.eclipse.core.databinding.observable.Diffs.createListDiff;
+
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.List;
+import java.util.ListIterator;
+
+import org.eclipse.core.databinding.observable.Diffs;
+import org.eclipse.core.databinding.observable.Realm;
+import org.eclipse.core.databinding.observable.list.ListDiffEntry;
+import org.eclipse.core.databinding.observable.list.WritableList;
+
+/**
+ * A specialization of the core Databindings {@link WritableList} providing
+ * iterators that support modification.
+ */
+public class WritableListWithIterator<E> extends WritableList<E> {
+
+ public WritableListWithIterator() {
+ super();
+ }
+
+ public WritableListWithIterator(Realm realm) {
+ super(realm);
+ }
+
+ public WritableListWithIterator(List<E> toWrap, Object elementType) {
+ super(toWrap, elementType);
+ }
+
+ public WritableListWithIterator(Collection<E> collection, Object elementType) {
+ super(collection, elementType);
+ }
+
+ public WritableListWithIterator(Realm realm, List<E> toWrap, Object elementType) {
+ super(realm, toWrap, elementType);
+ }
+
+ public WritableListWithIterator(Realm realm, Collection<E> collection, Object elementType) {
+ super(realm, collection, elementType);
+ }
+
+ @Override
+ public Iterator<E> iterator() {
+ getterCalled();
+ return new Iter();
+ }
+
+ @Override
+ public ListIterator<E> listIterator() {
+ getterCalled();
+ return new ListIter(0);
+ }
+
+ @Override
+ public ListIterator<E> listIterator(int index) {
+ getterCalled();
+ return new ListIter(index);
+ }
+
+ static <E> ListDiffEntry<E> added(E element, int position) {
+ return Diffs.createListDiffEntry(position, true, element);
+ }
+
+ static <E> ListDiffEntry<E> removed(E element, int position) {
+ return Diffs.createListDiffEntry(position, false, element);
+ }
+
+ //
+ // Nested types
+ //
+
+ private class Iter implements Iterator<E> {
+
+ final ListIterator<E> delegate;
+ int lastReturned = -1;
+
+ Iter() {
+ this(0);
+ }
+
+ Iter(int index) {
+ super();
+
+ this.delegate = wrappedList.listIterator(index);
+ }
+
+ @Override
+ public boolean hasNext() {
+ return delegate.hasNext();
+ }
+
+ @Override
+ public E next() {
+ E result = delegate.next();
+ lastReturned = delegate.previousIndex();
+ return result;
+ }
+
+ E lastReturned() {
+ return ((lastReturned >= 0) && (lastReturned < size()))
+ ? get(lastReturned)
+ : null;
+ }
+
+ @Override
+ public void remove() {
+ E removed = lastReturned();
+
+ delegate.remove();
+
+ // We only get this far if remove succeeded
+ fireListChange(createListDiff(removed(removed, lastReturned)));
+ }
+ }
+
+ private class ListIter extends Iter implements ListIterator<E> {
+
+ ListIter(int index) {
+ super(index);
+ }
+
+ @Override
+ public boolean hasPrevious() {
+ return delegate.hasPrevious();
+ }
+
+ @Override
+ public int nextIndex() {
+ return delegate.nextIndex();
+ }
+
+ @Override
+ public int previousIndex() {
+ return delegate.previousIndex();
+ }
+
+ @Override
+ public E previous() {
+ E result = delegate.previous();
+ lastReturned = delegate.nextIndex();
+ return result;
+ }
+
+ @Override
+ public void set(E e) {
+ E removed = lastReturned();
+
+ delegate.set(e);
+
+ // We only get this far if remove succeeded
+ fireListChange(createListDiff(removed(removed, lastReturned), added(e, lastReturned)));
+ }
+
+ @Override
+ public void add(E e) {
+ delegate.add(e);
+
+ // We only get this far if add succeeded
+ fireListChange(createListDiff(added(e, previousIndex())));
+ }
+
+ }
+}
diff --git a/plugins/infra/org.eclipse.papyrus.infra.tools/src/org/eclipse/papyrus/infra/tools/dnd/PapyrusTransfer.java b/plugins/infra/org.eclipse.papyrus.infra.tools/src/org/eclipse/papyrus/infra/tools/dnd/PapyrusTransfer.java
new file mode 100644
index 00000000000..fabbb3d118d
--- /dev/null
+++ b/plugins/infra/org.eclipse.papyrus.infra.tools/src/org/eclipse/papyrus/infra/tools/dnd/PapyrusTransfer.java
@@ -0,0 +1,105 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2015 IBM Corporation, Christian W. Damus, and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * IBM Corporation - initial API and implementation
+ * Christian W. Damus - adapted from GEF for bug 469188
+ *******************************************************************************/
+package org.eclipse.papyrus.infra.tools.dnd;
+
+import java.lang.ref.Reference;
+import java.lang.ref.WeakReference;
+
+import org.eclipse.swt.dnd.ByteArrayTransfer;
+import org.eclipse.swt.dnd.TransferData;
+
+/**
+ * A local transfer carrying a single object being dragged. Subclasses should maintain a
+ * single instance of their Transfer and provide a static method to obtain that
+ * instance.
+ */
+public abstract class PapyrusTransfer<T> extends ByteArrayTransfer {
+
+ private final Class<? extends T> objectType;
+ private final String typeName;
+ private final int typeID;
+
+ private Reference<T> object;
+ private long startTime;
+
+ protected PapyrusTransfer(Class<? extends T> objectType) {
+ super();
+
+ this.objectType = objectType;
+
+ typeName = String.format("%s:%x:%x", getClass().getSimpleName(), hashCode(), System.currentTimeMillis());
+ typeID = registerType(typeName);
+ }
+
+ @Override
+ public final int hashCode() {
+ return System.identityHashCode(this);
+ }
+
+ /**
+ * The data object is not converted to bytes. It is held onto in a field.
+ * Instead, a checksum is written out to prevent unwanted drags across
+ * mulitple running copies of Eclipse.
+ *
+ * @see org.eclipse.swt.dnd.Transfer#javaToNative(Object, TransferData)
+ */
+ @Override
+ public void javaToNative(Object object, TransferData transferData) {
+ setObject(objectType.cast(object));
+ startTime = System.currentTimeMillis();
+ if (transferData != null)
+ super.javaToNative(String.valueOf(startTime).getBytes(),
+ transferData);
+ }
+
+ /**
+ * The data object is not converted to bytes. It is held onto in a field.
+ * Instead, a checksum is written out to prevent unwanted drags across
+ * mulitple running. copies of Eclipse.
+ *
+ * @see org.eclipse.swt.dnd.Transfer#nativeToJava(TransferData)
+ */
+ @Override
+ public Object nativeToJava(TransferData transferData) {
+ byte bytes[] = (byte[]) super.nativeToJava(transferData);
+ if (bytes == null) {
+ return null;
+ }
+ long startTime = Long.parseLong(new String(bytes));
+ return (this.startTime == startTime) ? getObject() : null;
+ }
+
+ /**
+ * Obtains the object being dragged.
+ */
+ public T getObject() {
+ return (object == null) ? null : objectType.cast(object.get());
+ }
+
+ /**
+ * Sets the object being dragged.
+ */
+ public void setObject(T object) {
+ this.object = new WeakReference<>(object);
+ }
+
+ @Override
+ protected int[] getTypeIds() {
+ return new int[] { typeID };
+ }
+
+ @Override
+ protected String[] getTypeNames() {
+ return new String[] { typeName };
+ }
+
+}
diff --git a/plugins/infra/org.eclipse.papyrus.infra.tools/src/org/eclipse/papyrus/infra/tools/util/PlatformHelper.java b/plugins/infra/org.eclipse.papyrus.infra.tools/src/org/eclipse/papyrus/infra/tools/util/PlatformHelper.java
index 64d1f6d8c0a..9c9f9d514e9 100644
--- a/plugins/infra/org.eclipse.papyrus.infra.tools/src/org/eclipse/papyrus/infra/tools/util/PlatformHelper.java
+++ b/plugins/infra/org.eclipse.papyrus.infra.tools/src/org/eclipse/papyrus/infra/tools/util/PlatformHelper.java
@@ -9,12 +9,15 @@
* Contributors:
* CEA LIST - Initial API and implementation
* Christian W. Damus - bug 479999
+ * Christian W. Damus - bug 469188
*****************************************************************************/
package org.eclipse.papyrus.infra.tools.util;
import static com.google.common.collect.Iterables.filter;
import static com.google.common.collect.Iterables.find;
+import java.util.function.Supplier;
+
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.core.runtime.Platform;
import org.eclipse.emf.common.notify.Notifier;
@@ -109,4 +112,30 @@ public class PlatformHelper {
return result;
}
+
+ /**
+ * Get an adapter of the specified target {@code type} from an {@code object} by any means available.
+ *
+ * @param object
+ * an object to adapt. May be {@code null}, in which case the {@code defaultAdapter} is returned
+ * @param type
+ * the type of adapter to get
+ * @param defaultSupplier
+ * a supplier to consult for a default adapter in the case that none can be
+ * obtained by the usual means (may be {@code null}
+ *
+ * @return the best-effort adapter of the given {@code type}, else the {@code defaultAdapter}
+ */
+ public static <T> T getAdapter(Object object, Class<T> type, Supplier<T> defaultAdapter) {
+ T result = null;
+
+ if (object != null) {
+ T adapter = getAdapter(object, type);
+ if (adapter != null) {
+ result = adapter;
+ }
+ }
+
+ return (result != null) ? result : defaultAdapter.get();
+ }
}
diff --git a/plugins/infra/widget/org.eclipse.papyrus.infra.widgets/.classpath b/plugins/infra/widget/org.eclipse.papyrus.infra.widgets/.classpath
index 8a8f1668cdc..eca7bdba8f0 100644
--- a/plugins/infra/widget/org.eclipse.papyrus.infra.widgets/.classpath
+++ b/plugins/infra/widget/org.eclipse.papyrus.infra.widgets/.classpath
@@ -1,7 +1,7 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
- <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6"/>
- <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
- <classpathentry kind="src" path="src"/>
- <classpathentry kind="output" path="bin"/>
-</classpath>
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>
+ <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+ <classpathentry kind="src" path="src"/>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/plugins/infra/widget/org.eclipse.papyrus.infra.widgets/.settings/org.eclipse.jdt.core.prefs b/plugins/infra/widget/org.eclipse.papyrus.infra.widgets/.settings/org.eclipse.jdt.core.prefs
index 410244d65a6..62a08f4494d 100755
--- a/plugins/infra/widget/org.eclipse.papyrus.infra.widgets/.settings/org.eclipse.jdt.core.prefs
+++ b/plugins/infra/widget/org.eclipse.papyrus.infra.widgets/.settings/org.eclipse.jdt.core.prefs
@@ -1,10 +1,10 @@
eclipse.preferences.version=1
org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6
-org.eclipse.jdt.core.compiler.compliance=1.6
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
+org.eclipse.jdt.core.compiler.compliance=1.8
org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.source=1.6
+org.eclipse.jdt.core.compiler.source=1.8
org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation=0
diff --git a/plugins/infra/widget/org.eclipse.papyrus.infra.widgets/META-INF/MANIFEST.MF b/plugins/infra/widget/org.eclipse.papyrus.infra.widgets/META-INF/MANIFEST.MF
index c01b5f752c1..c9d354245b9 100644
--- a/plugins/infra/widget/org.eclipse.papyrus.infra.widgets/META-INF/MANIFEST.MF
+++ b/plugins/infra/widget/org.eclipse.papyrus.infra.widgets/META-INF/MANIFEST.MF
@@ -36,4 +36,4 @@ Bundle-ManifestVersion: 2
Bundle-Activator: org.eclipse.papyrus.infra.widgets.Activator
Bundle-Description: %pluginDescription
Bundle-SymbolicName: org.eclipse.papyrus.infra.widgets;singleton:=true
-Bundle-RequiredExecutionEnvironment: JavaSE-1.6
+Bundle-RequiredExecutionEnvironment: JavaSE-1.8
diff --git a/plugins/infra/widget/org.eclipse.papyrus.infra.widgets/src/org/eclipse/papyrus/infra/widgets/providers/WorkbenchFilteredLabelProvider.java b/plugins/infra/widget/org.eclipse.papyrus.infra.widgets/src/org/eclipse/papyrus/infra/widgets/providers/WorkbenchFilteredLabelProvider.java
index 9c4b8c891c1..02098bb8020 100644
--- a/plugins/infra/widget/org.eclipse.papyrus.infra.widgets/src/org/eclipse/papyrus/infra/widgets/providers/WorkbenchFilteredLabelProvider.java
+++ b/plugins/infra/widget/org.eclipse.papyrus.infra.widgets/src/org/eclipse/papyrus/infra/widgets/providers/WorkbenchFilteredLabelProvider.java
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (c) 2012 CEA LIST.
+ * Copyright (c) 2012, 2015 CEA LIST, Christian W. Damus, and others.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
@@ -8,11 +8,13 @@
*
* Contributors:
* Camille Letavernier (CEA LIST) camille.letavernier@cea.fr - Initial API and implementation
+ * Christian W. Damus - bug 469188
*****************************************************************************/
package org.eclipse.papyrus.infra.widgets.providers;
import org.eclipse.core.resources.IResource;
import org.eclipse.jface.viewers.ILabelProvider;
+import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.papyrus.infra.services.labelprovider.service.IFilteredLabelProvider;
import org.eclipse.swt.graphics.Image;
@@ -34,17 +36,35 @@ public class WorkbenchFilteredLabelProvider extends LabelProvider implements IFi
@Override
public String getText(Object element) {
- return workbenchLabelProvider.getText(element);
+ return workbenchLabelProvider.getText(unwrapSelection(element));
}
@Override
public Image getImage(Object element) {
- return workbenchLabelProvider.getImage(element);
+ return workbenchLabelProvider.getImage(unwrapSelection(element));
}
@Override
public boolean accept(Object element) {
- return element instanceof IResource;
+ return unwrapSelection(element) instanceof IResource;
}
+ /**
+ * Unwraps a single selection to get the element inside it.
+ *
+ * @param selection
+ * @return
+ */
+ Object unwrapSelection(Object possibleSelection) {
+ Object result = possibleSelection;
+
+ if (possibleSelection instanceof IStructuredSelection) {
+ IStructuredSelection selection = (IStructuredSelection) possibleSelection;
+ if (selection.size() == 1) {
+ result = selection.getFirstElement();
+ }
+ }
+
+ return result;
+ }
}
diff --git a/plugins/views/properties/org.eclipse.papyrus.views.properties/schema/context.exsd b/plugins/views/properties/org.eclipse.papyrus.views.properties/schema/context.exsd
index 1a8c125efa6..8cec839e23e 100644
--- a/plugins/views/properties/org.eclipse.papyrus.views.properties/schema/context.exsd
+++ b/plugins/views/properties/org.eclipse.papyrus.views.properties/schema/context.exsd
@@ -1,139 +1,167 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.papyrus.views.properties" xmlns="http://www.w3.org/2001/XMLSchema">
-<annotation>
- <appInfo>
- <meta.schema plugin="org.eclipse.papyrus.views.properties" id="Context" name="Context"/>
- </appInfo>
- <documentation>
- Extension point used to provide new Contexts to the Papyrus Property View. A Context is an EMF Model conforming to http://www.eclipse.org/papyrus/properties (From org.eclipse.papyrus.views.properties.model), defining a set of Constraint descriptors, and the view to display for each.
- </documentation>
- </annotation>
-
- <element name="extension">
- <annotation>
- <appInfo>
- <meta.element />
- </appInfo>
- </annotation>
- <complexType>
- <sequence>
- <element ref="context" minOccurs="1" maxOccurs="unbounded"/>
- </sequence>
- <attribute name="point" type="string" use="required">
- <annotation>
- <documentation>
-
- </documentation>
- </annotation>
- </attribute>
- <attribute name="id" type="string">
- <annotation>
- <documentation>
-
- </documentation>
- </annotation>
- </attribute>
- <attribute name="name" type="string">
- <annotation>
- <documentation>
-
- </documentation>
- <appInfo>
- <meta.attribute translatable="true"/>
- </appInfo>
- </annotation>
- </attribute>
- </complexType>
- </element>
-
- <element name="context">
- <complexType>
- <attribute name="contextModel" type="string" use="required">
- <annotation>
- <documentation>
-
- </documentation>
- <appInfo>
- <meta.attribute kind="resource"/>
- </appInfo>
- </annotation>
- </attribute>
- <attribute name="isCustomizable" type="boolean" use="default" value="true">
- <annotation>
- <documentation>
- Indicates whether this property view configuration is customizable. Default is true. If this configuration is not marked as customizable, it won&apos;t appear in the Property view customization tools, and the user won&apos;t be able to disable this configuration. Use this option when the user shouldn&apos;t be allowed to modify this configuration (e.g. when the property view configuration is used in a Wizard).
- </documentation>
- </annotation>
- </attribute>
- <attribute name="appliedByDefault" type="boolean">
- <annotation>
- <documentation>
-
- </documentation>
- </annotation>
- </attribute>
- </complexType>
- </element>
-
- <annotation>
- <appInfo>
- <meta.section type="since"/>
- </appInfo>
- <documentation>
- 0.8.0
- </documentation>
- </annotation>
-
- <annotation>
- <appInfo>
- <meta.section type="examples"/>
- </appInfo>
- <documentation>
- &lt;extension
- point=&quot;org.eclipse.papyrus.views.properties.Context&quot;&gt;
- &lt;context contextModel=&quot;Model/UML.xmi&quot;&gt;
- &lt;/context&gt;
-&lt;/extension&gt;
- </documentation>
- </annotation>
-
- <annotation>
- <appInfo>
- <meta.section type="apiinfo"/>
- </appInfo>
- <documentation>
- There is no API associated with this extension point.
- </documentation>
- </annotation>
-
- <annotation>
- <appInfo>
- <meta.section type="implementation"/>
- </appInfo>
- <documentation>
- Sample Implementation :
-org.eclipse.papyrus.views.properties.uml
- </documentation>
- </annotation>
-
- <annotation>
- <appInfo>
- <meta.section type="copyright"/>
- </appInfo>
- <documentation>
- /*****************************************************************************
- * Copyright (c) 2010 CEA LIST.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Camille Letavernier (CEA LIST) camille.letavernier@cea.fr - Initial API and implementation
- *****************************************************************************/
- </documentation>
- </annotation>
-
-</schema>
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Schema file written by PDE -->
+<schema targetNamespace="org.eclipse.papyrus.views.properties" xmlns="http://www.w3.org/2001/XMLSchema">
+<annotation>
+ <appInfo>
+ <meta.schema plugin="org.eclipse.papyrus.views.properties" id="Context" name="Context"/>
+ </appInfo>
+ <documentation>
+ Extension point used to provide new Contexts to the Papyrus Property View. A Context is an EMF Model conforming to http://www.eclipse.org/papyrus/properties (From org.eclipse.papyrus.views.properties.model), defining a set of Constraint descriptors, and the view to display for each.
+ </documentation>
+ </annotation>
+
+ <element name="extension">
+ <annotation>
+ <appInfo>
+ <meta.element />
+ </appInfo>
+ </annotation>
+ <complexType>
+ <choice minOccurs="1" maxOccurs="unbounded">
+ <element ref="context"/>
+ <element ref="preferencePageBinding"/>
+ </choice>
+ <attribute name="point" type="string" use="required">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="id" type="string">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="name" type="string">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ <appInfo>
+ <meta.attribute translatable="true"/>
+ </appInfo>
+ </annotation>
+ </attribute>
+ </complexType>
+ </element>
+
+ <element name="context">
+ <complexType>
+ <attribute name="contextModel" type="string" use="required">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ <appInfo>
+ <meta.attribute kind="resource"/>
+ </appInfo>
+ </annotation>
+ </attribute>
+ <attribute name="isCustomizable" type="boolean" use="default" value="true">
+ <annotation>
+ <documentation>
+ Indicates whether this property view configuration is customizable. Default is true. If this configuration is not marked as customizable, it won&apos;t appear in the Property view customization tools, and the user won&apos;t be able to disable this configuration. Use this option when the user shouldn&apos;t be allowed to modify this configuration (e.g. when the property view configuration is used in a Wizard).
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="appliedByDefault" type="boolean">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ </complexType>
+ </element>
+
+ <element name="preferencePageBinding">
+ <annotation>
+ <documentation>
+ Specifies a binding of a particular registered Properties context model to some preference page (usually different than the default Papyrus Properties View preference page).
+ </documentation>
+ </annotation>
+ <complexType>
+ <attribute name="context" type="string" use="required">
+ <annotation>
+ <documentation>
+ References the Properties Context (by name) to associate with a preference page. The name is used instead of the URI because that is what the enablement preferences use to identify contexts and it is how (temporarily) missing contexts are tracked.
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="page" type="string" use="required">
+ <annotation>
+ <documentation>
+ Indicates the preference page in which to present the customization of the referenced properties context.
+ </documentation>
+ <appInfo>
+ <meta.attribute kind="identifier" basedOn="org.eclipse.ui.preferencePages/page/@id"/>
+ </appInfo>
+ </annotation>
+ </attribute>
+ </complexType>
+ </element>
+
+ <annotation>
+ <appInfo>
+ <meta.section type="since"/>
+ </appInfo>
+ <documentation>
+ 0.8.0
+ </documentation>
+ </annotation>
+
+ <annotation>
+ <appInfo>
+ <meta.section type="examples"/>
+ </appInfo>
+ <documentation>
+ &lt;extension
+ point=&quot;org.eclipse.papyrus.views.properties.Context&quot;&gt;
+ &lt;context contextModel=&quot;Model/UML.xmi&quot;&gt;
+ &lt;/context&gt;
+&lt;/extension&gt;
+ </documentation>
+ </annotation>
+
+ <annotation>
+ <appInfo>
+ <meta.section type="apiinfo"/>
+ </appInfo>
+ <documentation>
+ There is no API associated with this extension point.
+ </documentation>
+ </annotation>
+
+ <annotation>
+ <appInfo>
+ <meta.section type="implementation"/>
+ </appInfo>
+ <documentation>
+ Sample Implementation :
+org.eclipse.papyrus.views.properties.uml
+ </documentation>
+ </annotation>
+
+ <annotation>
+ <appInfo>
+ <meta.section type="copyright"/>
+ </appInfo>
+ <documentation>
+ /*****************************************************************************
+ * Copyright (c) 2010 CEA LIST.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Camille Letavernier (CEA LIST) camille.letavernier@cea.fr - Initial API and implementation
+ *****************************************************************************/
+ </documentation>
+ </annotation>
+
+</schema>
diff --git a/plugins/views/properties/org.eclipse.papyrus.views.properties/src/org/eclipse/papyrus/views/properties/extensions/ContextExtensionPoint.java b/plugins/views/properties/org.eclipse.papyrus.views.properties/src/org/eclipse/papyrus/views/properties/extensions/ContextExtensionPoint.java
index bf54e07569d..de64bdb84e0 100644
--- a/plugins/views/properties/org.eclipse.papyrus.views.properties/src/org/eclipse/papyrus/views/properties/extensions/ContextExtensionPoint.java
+++ b/plugins/views/properties/org.eclipse.papyrus.views.properties/src/org/eclipse/papyrus/views/properties/extensions/ContextExtensionPoint.java
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (c) 2015 CEA LIST.
+ * Copyright (c) 2015 CEA LIST, Christian W. Damus, and others.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
@@ -9,6 +9,7 @@
* Contributors:
* Camille Letavernier (CEA LIST) camille.letavernier@cea.fr - Initial API and implementation
* Mickael ADAM (ALL4TEC) mickael.adam@all4tec.net - adds isVisible implementation
+ * Christian W. Damus - bug 469188
*
*****************************************************************************/
package org.eclipse.papyrus.views.properties.extensions;
@@ -37,6 +38,14 @@ public class ContextExtensionPoint {
/** The Constant IS_VISIBLE. */
private static final String APPLIED_BY_DEFAULT = "appliedByDefault";//$NON-NLS-1$
+ private static final String CONTEXT_MODEL = "contextModel"; //$NON-NLS-1$
+
+ private static final String CONTEXT = "context"; //$NON-NLS-1$
+
+ private static final String PREFPAGE_BINDING = "preferencePageBinding"; //$NON-NLS-1$
+
+ private static final String PAGE = "page"; //$NON-NLS-1$
+
/** The extension id. */
private final String EXTENSION_ID = "org.eclipse.papyrus.views.properties.context"; //$NON-NLS-1$
@@ -48,26 +57,15 @@ public class ContextExtensionPoint {
for (IConfigurationElement e : config) {
try {
- final String contextResource = e.getAttribute("contextModel"); //$NON-NLS-1$
-
- final boolean isCustomizable;
- if (Arrays.asList(e.getAttributeNames()).contains(IS_CUSTOMIZABLE)) {
- isCustomizable = Boolean.parseBoolean(e.getAttribute(IS_CUSTOMIZABLE));
- } else {
- isCustomizable = true; // Default value
- }
-
- final boolean appliedByDefault;
- if (Arrays.asList(e.getAttributeNames()).contains(APPLIED_BY_DEFAULT)) {
- appliedByDefault = Boolean.parseBoolean(e.getAttribute(APPLIED_BY_DEFAULT));
- } else {
- appliedByDefault = true; // Default value
+ switch (e.getName()) {
+ case CONTEXT:
+ processContext(e);
+ break;
+ case PREFPAGE_BINDING:
+ processPrefPageBinding(e);
+ break;
}
- URI uri = URI.createURI("ppe:/context/" + e.getContributor().getName() + "/" + contextResource); //$NON-NLS-1$ //$NON-NLS-2$
-
- ConfigurationManager.getInstance().addContext(uri, appliedByDefault, isCustomizable);
-
} catch (IOException ex) {
Activator.log.error("The plugin " + e.getContributor() + " contributed an invalid extension for " + EXTENSION_ID, ex); //$NON-NLS-1$//$NON-NLS-2$
} catch (Exception ex) {
@@ -75,4 +73,46 @@ public class ContextExtensionPoint {
}
}
}
+
+ private void processContext(IConfigurationElement e) throws IOException {
+ final String contextResource = e.getAttribute(CONTEXT_MODEL);
+
+ final boolean isCustomizable;
+ if (Arrays.asList(e.getAttributeNames()).contains(IS_CUSTOMIZABLE)) {
+ isCustomizable = Boolean.parseBoolean(e.getAttribute(IS_CUSTOMIZABLE));
+ } else {
+ isCustomizable = true; // Default value
+ }
+
+ final boolean appliedByDefault;
+ if (Arrays.asList(e.getAttributeNames()).contains(APPLIED_BY_DEFAULT)) {
+ appliedByDefault = Boolean.parseBoolean(e.getAttribute(APPLIED_BY_DEFAULT));
+ } else {
+ appliedByDefault = true; // Default value
+ }
+
+ URI uri = URI.createURI("ppe:/context/" + e.getContributor().getName() + "/" + contextResource); //$NON-NLS-1$ //$NON-NLS-2$
+
+ ConfigurationManager.getInstance().addContext(uri, appliedByDefault, isCustomizable);
+ }
+
+ private void processPrefPageBinding(IConfigurationElement config) {
+ boolean valid = true;
+
+ String context = config.getAttribute(CONTEXT);
+ if ((context == null) || context.isEmpty()) {
+ valid = false;
+ Activator.log.warn(String.format("Missing context name in preference page binding extension in plug-in %s", config.getContributor().getName()));
+ }
+
+ String page = config.getAttribute(PAGE);
+ if ((page == null) || page.isEmpty()) {
+ valid = false;
+ Activator.log.warn(String.format("Missing page ID in preference page binding extension in plug-in %s", config.getContributor().getName()));
+ }
+
+ if (valid) {
+ ConfigurationManager.getInstance().registerPreferencePageBinding(context, page);
+ }
+ }
}
diff --git a/plugins/views/properties/org.eclipse.papyrus.views.properties/src/org/eclipse/papyrus/views/properties/preferences/Preferences.java b/plugins/views/properties/org.eclipse.papyrus.views.properties/src/org/eclipse/papyrus/views/properties/preferences/Preferences.java
index 8ee8990fe2e..eee6db4f44c 100644
--- a/plugins/views/properties/org.eclipse.papyrus.views.properties/src/org/eclipse/papyrus/views/properties/preferences/Preferences.java
+++ b/plugins/views/properties/org.eclipse.papyrus.views.properties/src/org/eclipse/papyrus/views/properties/preferences/Preferences.java
@@ -10,11 +10,11 @@
* Camille Letavernier (CEA LIST) camille.letavernier@cea.fr - Initial API and implementation
* Christian W. Damus - bug 482930
* Christian W. Damus - bug 482927
+ * Christian W. Damus - bug 469188
*****************************************************************************/
package org.eclipse.papyrus.views.properties.preferences;
import java.util.Collection;
-import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
@@ -24,6 +24,9 @@ import java.util.Objects;
import java.util.Set;
import java.util.stream.Collectors;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.core.runtime.IExecutableExtension;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.preference.PreferencePage;
@@ -49,13 +52,36 @@ import org.eclipse.ui.IWorkbenchPreferencePage;
*
* @author Camille Letavernier
*/
-public class Preferences extends PreferencePage implements IWorkbenchPreferencePage {
+public class Preferences extends PreferencePage implements IWorkbenchPreferencePage, IExecutableExtension {
+
+ /**
+ * The unique identifier of the default preference page, covering the <b>Properties View</b>.
+ *
+ * @see #getID()
+ */
+ public static final String DEFAULT_ID = "org.eclipse.papyrus.views.properties.propertyview"; //$NON-NLS-1$
+
+ private String id;
@Override
public void init(IWorkbench workbench) {
// Nothing
}
+ /**
+ * Queries my unique identifier as configured on the extension point.
+ *
+ * @return my unique identifier
+ */
+ public final String getID() {
+ return id;
+ }
+
+ @Override
+ public void setInitializationData(IConfigurationElement config, String propertyName, Object data) throws CoreException {
+ this.id = config.getAttribute("id"); //$NON-NLS-1$
+ }
+
@Override
protected Control createContents(Composite parent) {
Composite self = new Composite(parent, SWT.NONE);
@@ -67,12 +93,11 @@ public class Preferences extends PreferencePage implements IWorkbenchPreferenceP
final ConfigurationManager configurationManager = ConfigurationManager.getInstance();
- // Only customizable Property view contexts should appear here
- List<Context> contexts = new java.util.ArrayList<Context>(configurationManager.getCustomizableContexts());
- contexts.addAll(configurationManager.getMissingContexts());
- Collections.sort(contexts, contextOrdering());
+ List<Context> sortedContexts = configurationManager.getContextsForPreferencePage(getID()).stream()
+ .sorted(contextOrdering())
+ .collect(Collectors.toList());
- for (Context context : contexts) {
+ for (Context context : sortedContexts) {
boolean applied = configurationManager.isApplied(context);
Button checkbox = new Button(self, SWT.CHECK);
checkbox.setText(getLabel(context));
diff --git a/plugins/views/properties/org.eclipse.papyrus.views.properties/src/org/eclipse/papyrus/views/properties/runtime/ConfigurationManager.java b/plugins/views/properties/org.eclipse.papyrus.views.properties/src/org/eclipse/papyrus/views/properties/runtime/ConfigurationManager.java
index 6f3da4ec9ea..5cd16104c9d 100644
--- a/plugins/views/properties/org.eclipse.papyrus.views.properties/src/org/eclipse/papyrus/views/properties/runtime/ConfigurationManager.java
+++ b/plugins/views/properties/org.eclipse.papyrus.views.properties/src/org/eclipse/papyrus/views/properties/runtime/ConfigurationManager.java
@@ -11,6 +11,7 @@
* Christian W. Damus (CEA) - Factor out workspace storage for pluggable storage providers (CDO)
* Christian W. Damus (CEA) - Support implicit enablement of prototypes of unavailable contexts (CDO)
* Christian W. Damus - bug 482930
+ * Christian W. Damus - bug 469188
*****************************************************************************/
package org.eclipse.papyrus.views.properties.runtime;
@@ -27,6 +28,8 @@ import java.util.List;
import java.util.Map;
import java.util.Queue;
import java.util.Set;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
@@ -108,6 +111,9 @@ public class ConfigurationManager {
private IContextStorageProviderListener contextStorageProviderListener;
+ /** Map of preference page identifier to context unique identifiers. */
+ private final Map<String, Set<String>> preferencePageBindings;
+
/**
* The global constraint engine
*/
@@ -133,6 +139,7 @@ public class ConfigurationManager {
customizableContexts = new HashMap<Context, Boolean>();
contexts = new LinkedHashMap<URI, Context>();
contextStorageRegistry = new ContextStorageRegistry(resourceSet);
+ preferencePageBindings = new HashMap<>();
root = RootFactory.eINSTANCE.createPropertiesRoot();
@@ -1187,4 +1194,63 @@ public class ConfigurationManager {
public ViewConstraintEngine getConstraintEngine() {
return constraintEngine;
}
+
+ /**
+ * Registers association of a context with a preference page in which to present it
+ * for enablement/customization.
+ *
+ * @param context
+ * the context name
+ * @param page
+ * the preference page identifier
+ *
+ * @throws IllegalArgumentException
+ * if the {@code context} or {@link page} is
+ * {@code null} or empty
+ *
+ * @see #registerContext(URI, String)
+ */
+ public void registerPreferencePageBinding(String context, String page) {
+ if ((context == null) || context.isEmpty()) {
+ throw new IllegalArgumentException("context name is missing"); //$NON-NLS-1$
+ }
+ if ((page == null) || page.isEmpty()) {
+ throw new IllegalArgumentException("preference page identifier is missing"); //$NON-NLS-1$
+ }
+
+ Set<String> contexts = preferencePageBindings.get(page);
+ if (contexts == null) {
+ contexts = new HashSet<>();
+ preferencePageBindings.put(page, contexts);
+ }
+ contexts.add(context);
+ }
+
+ public List<Context> getContextsForPreferencePage(String page) {
+ return Stream.concat(getContexts().stream(), getMissingContexts().stream())
+ .filter(this::isCustomizable) // Only present customizable contexts
+ .filter(c -> isBoundToPreferencePage(c, page))
+ .collect(Collectors.toList());
+ }
+
+ private boolean isBoundToPreferencePage(Context context, String page) {
+ boolean result = false;
+ String contextName = context.getName();
+
+ if ((page == null) || page.equals(org.eclipse.papyrus.views.properties.preferences.Preferences.DEFAULT_ID)) {
+ page = org.eclipse.papyrus.views.properties.preferences.Preferences.DEFAULT_ID;
+ Set<String> explicitBindings = preferencePageBindings.getOrDefault(page, Collections.emptySet());
+
+ // Looking for bindings to the default preference page. This includes
+ // all contexts that are not bound to any page and those that are
+ // explicitly bound to the default page
+ result = explicitBindings.contains(contextName)
+ || preferencePageBindings.values().stream().noneMatch(set -> set.contains(contextName));
+ } else {
+ // Only explicit bindings
+ result = preferencePageBindings.getOrDefault(page, Collections.emptySet()).contains(contextName);
+ }
+
+ return result;
+ }
}
diff --git a/plugins/views/properties/org.eclipse.papyrus.views.properties/src/org/eclipse/papyrus/views/properties/widgets/AbstractPropertyEditor.java b/plugins/views/properties/org.eclipse.papyrus.views.properties/src/org/eclipse/papyrus/views/properties/widgets/AbstractPropertyEditor.java
index d6f0fa7a712..4e3d23f0d74 100644
--- a/plugins/views/properties/org.eclipse.papyrus.views.properties/src/org/eclipse/papyrus/views/properties/widgets/AbstractPropertyEditor.java
+++ b/plugins/views/properties/org.eclipse.papyrus.views.properties/src/org/eclipse/papyrus/views/properties/widgets/AbstractPropertyEditor.java
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (c) 2010, 2014 CEA LIST and others.
+ * Copyright (c) 2010, 2015 CEA LIST, Christian W. Damus, and others.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
@@ -12,6 +12,7 @@
* Christian W. Damus (CEA) - bug 417409
* Christian W. Damus (CEA) - bug 443417
* Christian W. Damus (CEA) - bug 444227
+ * Christian W. Damus - bug 469188
*
*****************************************************************************/
package org.eclipse.papyrus.views.properties.widgets;
@@ -253,6 +254,10 @@ public abstract class AbstractPropertyEditor implements IChangeListener, Customi
AbstractEditor editor = getEditor();
if (editor != null) {
editor.refreshValue();
+
+ // And refresh the read-only state
+ isEditable = input.isEditable(propertyPath);
+ applyReadOnly(getReadOnly());
}
}

Back to the top