diff options
| author | Mickael LANOE | 2015-03-20 16:12:26 +0000 |
|---|---|---|
| committer | Pierre-Charles David | 2015-04-14 08:31:36 +0000 |
| commit | e74bd1221bfe814bf556dc4f3e913fae45e5f689 (patch) | |
| tree | 614648ba9c1f432d7ff6b7b3a3794aed895dda06 | |
| parent | fa0bd28fdfa336264b6f8594d655888faa8ee417 (diff) | |
| download | org.eclipse.sirius-e74bd1221bfe814bf556dc4f3e913fae45e5f689.tar.gz org.eclipse.sirius-e74bd1221bfe814bf556dc4f3e913fae45e5f689.tar.xz org.eclipse.sirius-e74bd1221bfe814bf556dc4f3e913fae45e5f689.zip | |
[458822] Add the plugin org.eclipse.sirius.tests.sample.component.design
Add a plugin that contains a VSM for the Component MM.
This VSM can be used to test actions that trigger a deep walk inside
the semantic models.
Bug: 458822
Change-Id: I47a4ae450a228b52fd1f637a3d67259f4a338212
Signed-off-by: Mickael LANOE <mickael.lanoe@obeo.fr>
18 files changed, 3611 insertions, 2 deletions
diff --git a/packaging/org.eclipse.sirius.tests.parent/pom.xml b/packaging/org.eclipse.sirius.tests.parent/pom.xml index 2c87d1cab6..ae138cca31 100644 --- a/packaging/org.eclipse.sirius.tests.parent/pom.xml +++ b/packaging/org.eclipse.sirius.tests.parent/pom.xml @@ -72,6 +72,7 @@ <module>../../plugins/org.eclipse.sirius.tests.sample.migration</module> <module>../../plugins/org.eclipse.sirius.tests.sample.migration.design</module> <module>../../plugins/org.eclipse.sirius.tests.sample.component</module> + <module>../../plugins/org.eclipse.sirius.tests.sample.component.design</module> <module>../../plugins/org.eclipse.sirius.tests.sample.scxml</module> <module>../../plugins/org.eclipse.sirius.tests.sample.scxml.design</module> <module>../../plugins/org.eclipse.sirius.tests.junit</module> diff --git a/packaging/org.eclipse.sirius.tests/feature.xml b/packaging/org.eclipse.sirius.tests/feature.xml index c093fbea22..fd4c8b3528 100644 --- a/packaging/org.eclipse.sirius.tests/feature.xml +++ b/packaging/org.eclipse.sirius.tests/feature.xml @@ -113,14 +113,14 @@ modelers, using JUnit or SWTbot. Install this if you want to write automated tes install-size="0" version="0.0.0" unpack="false"/> - + <plugin id="org.eclipse.sirius.tests.sample.scxml.design" download-size="0" install-size="0" version="0.0.0" unpack="false"/> - + <plugin id="org.eclipse.sirius.tests.junit" download-size="0" @@ -142,4 +142,11 @@ modelers, using JUnit or SWTbot. Install this if you want to write automated tes version="0.0.0" unpack="false"/> + <plugin + id="org.eclipse.sirius.tests.sample.component.design" + download-size="0" + install-size="0" + version="0.0.0" + unpack="false"/> + </feature> diff --git a/plugins/org.eclipse.sirius.tests.sample.component.design/.classpath b/plugins/org.eclipse.sirius.tests.sample.component.design/.classpath new file mode 100644 index 0000000000..5d0495ecf1 --- /dev/null +++ b/plugins/org.eclipse.sirius.tests.sample.component.design/.classpath @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="UTF-8"?> +<classpath> + <classpathentry kind="src" path="src"/> + <classpathentry kind="src" path="src-gen"/> + <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="output" path="bin"/> +</classpath> diff --git a/plugins/org.eclipse.sirius.tests.sample.component.design/.project b/plugins/org.eclipse.sirius.tests.sample.component.design/.project new file mode 100644 index 0000000000..8dfad988a4 --- /dev/null +++ b/plugins/org.eclipse.sirius.tests.sample.component.design/.project @@ -0,0 +1,35 @@ +<?xml version="1.0" encoding="UTF-8"?> +<projectDescription> + <name>org.eclipse.sirius.tests.sample.component.design</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> + <buildCommand> + <name>org.eclipse.acceleo.ide.ui.acceleoBuilder</name> + <arguments> + </arguments> + </buildCommand> + </buildSpec> + <natures> + <nature>org.eclipse.acceleo.ide.ui.acceleoNature</nature> + <nature>org.eclipse.jdt.core.javanature</nature> + <nature>org.eclipse.pde.PluginNature</nature> + </natures> +</projectDescription> + diff --git a/plugins/org.eclipse.sirius.tests.sample.component.design/.settings/org.eclipse.jdt.core.prefs b/plugins/org.eclipse.sirius.tests.sample.component.design/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000000..c537b63063 --- /dev/null +++ b/plugins/org.eclipse.sirius.tests.sample.component.design/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,7 @@ +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.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.source=1.6 diff --git a/plugins/org.eclipse.sirius.tests.sample.component.design/META-INF/MANIFEST.MF b/plugins/org.eclipse.sirius.tests.sample.component.design/META-INF/MANIFEST.MF new file mode 100644 index 0000000000..65fe17b0f1 --- /dev/null +++ b/plugins/org.eclipse.sirius.tests.sample.component.design/META-INF/MANIFEST.MF @@ -0,0 +1,22 @@ +Manifest-Version: 1.0 +Bundle-ManifestVersion: 2 +Bundle-Name: %pluginName +Bundle-SymbolicName: org.eclipse.sirius.tests.sample.component.design;singleton:=true +Bundle-Version: 3.0.0.qualifier +Bundle-ClassPath: . +Bundle-Activator: org.eclipse.sirius.tests.sample.component.design.ComponentDesignPlugin +Bundle-Vendor: %providerName +Require-Bundle: org.eclipse.ui, + org.eclipse.core.runtime, + org.eclipse.core.resources;visibility:=reexport, + org.eclipse.emf.ecore.xmi;visibility:=reexport, + org.eclipse.emf.edit.ui;visibility:=reexport, + org.eclipse.ui.ide;visibility:=reexport, + org.eclipse.sirius, + org.eclipse.sirius.common.acceleo.mtl, + org.eclipse.sirius.tests.sample.component, + org.eclipse.sirius.common +Bundle-ActivationPolicy: lazy +Bundle-RequiredExecutionEnvironment: JavaSE-1.6 +Export-Package: org.eclipse.sirius.tests.sample.component.presentation +Bundle-Localization: plugin diff --git a/plugins/org.eclipse.sirius.tests.sample.component.design/build.properties b/plugins/org.eclipse.sirius.tests.sample.component.design/build.properties new file mode 100644 index 0000000000..0523bfdd56 --- /dev/null +++ b/plugins/org.eclipse.sirius.tests.sample.component.design/build.properties @@ -0,0 +1,18 @@ +# ==================================================================== +# Copyright (c) 2015 Obeo. +# 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: +# Obeo - initial API and implementation +# ==================================================================== +source.. = src/, src-gen/ +output.. = bin/ +bin.includes = META-INF/,\ + .,\ + description/,\ + plugin.xml,\ + plugin.properties +customBuildCallbacks = build.acceleo diff --git a/plugins/org.eclipse.sirius.tests.sample.component.design/description/component.odesign b/plugins/org.eclipse.sirius.tests.sample.component.design/description/component.odesign new file mode 100644 index 0000000000..1b8dc0d8a1 --- /dev/null +++ b/plugins/org.eclipse.sirius.tests.sample.component.design/description/component.odesign @@ -0,0 +1,417 @@ +<?xml version="1.0" encoding="UTF-8"?> +<description:Group xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:description="http://www.eclipse.org/sirius/description/1.1.0" xmlns:description_1="http://www.eclipse.org/sirius/diagram/description/1.1.0" xmlns:description_2="http://www.eclipse.org/sirius/table/description/1.1.0" xmlns:description_3="http://www.eclipse.org/sirius/tree/description/1.0.0" xmlns:style="http://www.eclipse.org/sirius/diagram/description/style/1.1.0" xmlns:tool="http://www.eclipse.org/sirius/diagram/description/tool/1.1.0" xmlns:tool_1="http://www.eclipse.org/sirius/description/tool/1.1.0" name="component" version="10.0.0.201411061000"> + <ownedViewpoints name="Component" modelFileExtension="component"> + <ownedRepresentations xsi:type="description_1:DiagramDescription" dropDescriptions="//@ownedViewpoints[name='Component']/@ownedRepresentations[name='Diagram']/@defaultLayer/@toolSections.0/@ownedTools[name='Drop%20Component']" name="Diagram" domainClass="component.Component"> + <defaultLayer name="Default"> + <edgeMappings name="Single Reference" deletionDescription="//@ownedViewpoints[name='Component']/@ownedRepresentations[name='Diagram']/@defaultLayer/@toolSections.0/@ownedTools[name='Delete%20Single%20Reference']" sourceMapping="//@ownedViewpoints[name='Component']/@ownedRepresentations[name='Diagram']/@defaultLayer/@containerMappings[name='Component']" targetMapping="//@ownedViewpoints[name='Component']/@ownedRepresentations[name='Diagram']/@defaultLayer/@containerMappings[name='Component']" targetFinderExpression="[reference/]" reconnections="//@ownedViewpoints[name='Component']/@ownedRepresentations[name='Diagram']/@defaultLayer/@toolSections.0/@ownedTools[name='Reconnect%20Single%20Reference']"> + <style sizeComputationExpression="2"> + <strokeColor xsi:type="description:SystemColor" href="environment:/viewpoint#//@systemColors/@entries[name='gray']"/> + <endLabelStyleDescription showIcon="false" labelExpression="r"> + <labelColor xsi:type="description:SystemColor" href="environment:/viewpoint#//@systemColors/@entries[name='black']"/> + </endLabelStyleDescription> + </style> + </edgeMappings> + <edgeMappings name="Bi-Directional Reference" deletionDescription="//@ownedViewpoints[name='Component']/@ownedRepresentations[name='Diagram']/@defaultLayer/@toolSections.0/@ownedTools[name='Delete%20Bi-Directional%20Reference']" sourceMapping="//@ownedViewpoints[name='Component']/@ownedRepresentations[name='Diagram']/@defaultLayer/@containerMappings[name='Component']" targetMapping="//@ownedViewpoints[name='Component']/@ownedRepresentations[name='Diagram']/@defaultLayer/@containerMappings[name='Component']" targetFinderExpression="[references/]" reconnections="//@ownedViewpoints[name='Component']/@ownedRepresentations[name='Diagram']/@defaultLayer/@toolSections.0/@ownedTools[name='Reconnect%20Bi-Directional%20Reference']"> + <style lineStyle="dash" targetArrow="NoDecoration" sizeComputationExpression="2"> + <strokeColor xsi:type="description:SystemColor" href="environment:/viewpoint#//@systemColors/@entries[name='gray']"/> + <beginLabelStyleDescription showIcon="false" labelExpression="O"> + <labelColor xsi:type="description:SystemColor" href="environment:/viewpoint#//@systemColors/@entries[name='black']"/> + </beginLabelStyleDescription> + <endLabelStyleDescription showIcon="false" labelExpression="R"> + <labelColor xsi:type="description:SystemColor" href="environment:/viewpoint#//@systemColors/@entries[name='black']"/> + </endLabelStyleDescription> + </style> + </edgeMappings> + <edgeMappings name="Reference" deletionDescription="//@ownedViewpoints[name='Component']/@ownedRepresentations[name='Diagram']/@defaultLayer/@toolSections.0/@ownedTools[name='Delete%20Reference']" sourceMapping="//@ownedViewpoints[name='Component']/@ownedRepresentations[name='Diagram']/@defaultLayer/@containerMappings[name='Component']" targetMapping="//@ownedViewpoints[name='Component']/@ownedRepresentations[name='Diagram']/@defaultLayer/@containerMappings[name='Component']" targetFinderExpression="[references2/]" reconnections="//@ownedViewpoints[name='Component']/@ownedRepresentations[name='Diagram']/@defaultLayer/@toolSections.0/@ownedTools[name='Reconnect%20%20Reference']"> + <style lineStyle="dot" sizeComputationExpression="2"> + <strokeColor xsi:type="description:SystemColor" href="environment:/viewpoint#//@systemColors/@entries[name='gray']"/> + <endLabelStyleDescription showIcon="false" labelExpression="R2"> + <labelColor xsi:type="description:SystemColor" href="environment:/viewpoint#//@systemColors/@entries[name='black']"/> + </endLabelStyleDescription> + </style> + </edgeMappings> + <containerMappings name="Component" deletionDescription="//@ownedViewpoints[name='Component']/@ownedRepresentations[name='Diagram']/@defaultLayer/@toolSections.0/@ownedTools[name='Delete%20Component']" labelDirectEdit="//@ownedViewpoints[name='Component']/@ownedRepresentations[name='Diagram']/@defaultLayer/@toolSections.0/@ownedTools[name='Edit%20Name']" semanticCandidatesExpression="[self.children->select(not payload)/]" domainClass="component.Component" dropDescriptions="//@ownedViewpoints[name='Component']/@ownedRepresentations[name='Diagram']/@defaultLayer/@toolSections.0/@ownedTools[name='Drop%20Component']" reusedContainerMappings="//@ownedViewpoints[name='Component']/@ownedRepresentations[name='Diagram']/@defaultLayer/@containerMappings[name='Component']"> + <style xsi:type="style:FlatContainerStyleDescription"> + <borderColor xsi:type="description:SystemColor" href="environment:/viewpoint#//@systemColors/@entries[name='black']"/> + <labelColor xsi:type="description:SystemColor" href="environment:/viewpoint#//@systemColors/@entries[name='black']"/> + <backgroundColor xsi:type="description:SystemColor" href="environment:/viewpoint#//@systemColors/@entries[name='white']"/> + <foregroundColor xsi:type="description:SystemColor" href="environment:/viewpoint#//@systemColors/@entries[name='light_gray']"/> + </style> + <conditionnalStyles predicateExpression="[self.children->exists(c | c.payload)/]"> + <style xsi:type="style:FlatContainerStyleDescription"> + <borderColor xsi:type="description:SystemColor" href="environment:/viewpoint#//@systemColors/@entries[name='red']"/> + <labelColor xsi:type="description:SystemColor" href="environment:/viewpoint#//@systemColors/@entries[name='black']"/> + <backgroundColor xsi:type="description:SystemColor" href="environment:/viewpoint#//@systemColors/@entries[name='white']"/> + <foregroundColor xsi:type="description:SystemColor" href="environment:/viewpoint#//@systemColors/@entries[name='light_gray']"/> + </style> + </conditionnalStyles> + </containerMappings> + <toolSections name="Tools"> + <ownedTools xsi:type="tool:ContainerCreationDescription" name="ComponentCreation" label="Component" containerMappings="//@ownedViewpoints[name='Component']/@ownedRepresentations[name='Diagram']/@defaultLayer/@containerMappings[name='Component']"> + <variable name="container"/> + <viewVariable name="containerView"/> + <initialOperation> + <firstModelOperations xsi:type="tool_1:CreateInstance" typeName="component.Component" referenceName="children" variableName=""> + <subModelOperations xsi:type="tool_1:SetValue" featureName="name" valueExpression="[eContainer(component::Component).name + '.' + eContainer(component::Component).children->size()/]"/> + </firstModelOperations> + </initialOperation> + </ownedTools> + <ownedTools xsi:type="tool:DirectEditLabel" name="Edit Name"> + <mask mask="{0}"/> + <initialOperation> + <firstModelOperations xsi:type="tool_1:SetValue" featureName="name" valueExpression="var:0"/> + </initialOperation> + </ownedTools> + <ownedTools xsi:type="tool:EdgeCreationDescription" name="Create Single Reference" label="Single Reference" edgeMappings="//@ownedViewpoints[name='Component']/@ownedRepresentations[name='Diagram']/@defaultLayer/@edgeMappings[name='Single%20Reference']"> + <sourceVariable name="sourceObj"/> + <targetVariable name="targetObj"/> + <sourceViewVariable name="sourceView"/> + <targetViewVariable name="targetView"/> + <initialOperation> + <firstModelOperations xsi:type="tool_1:ChangeContext" browseExpression="var:sourceObj"> + <subModelOperations xsi:type="tool_1:SetValue" featureName="reference" valueExpression="var:targetObj"/> + </firstModelOperations> + </initialOperation> + </ownedTools> + <ownedTools xsi:type="tool:EdgeCreationDescription" name="Create Bi-Directional Reference" label="Bi-Directional Reference" edgeMappings="//@ownedViewpoints[name='Component']/@ownedRepresentations[name='Diagram']/@defaultLayer/@edgeMappings[name='Bi-Directional%20Reference']"> + <sourceVariable name="sourceObj"/> + <targetVariable name="targetObj"/> + <sourceViewVariable name="sourceView"/> + <targetViewVariable name="targetView"/> + <initialOperation> + <firstModelOperations xsi:type="tool_1:ChangeContext" browseExpression="var:sourceObj"> + <subModelOperations xsi:type="tool_1:SetValue" featureName="references" valueExpression="var:targetObj"/> + </firstModelOperations> + </initialOperation> + </ownedTools> + <ownedTools xsi:type="tool:EdgeCreationDescription" name="Create Reference" label="Reference" edgeMappings="//@ownedViewpoints[name='Component']/@ownedRepresentations[name='Diagram']/@defaultLayer/@edgeMappings[name='Reference']"> + <sourceVariable name="sourceObj"/> + <targetVariable name="targetObj"/> + <sourceViewVariable name="sourceView"/> + <targetViewVariable name="targetView"/> + <initialOperation> + <firstModelOperations xsi:type="tool_1:ChangeContext" browseExpression="var:sourceObj"> + <subModelOperations xsi:type="tool_1:SetValue" featureName="references2" valueExpression="var:targetObj"/> + </firstModelOperations> + </initialOperation> + </ownedTools> + <ownedTools xsi:type="tool:DeleteElementDescription" name="Delete Single Reference"> + <element name="element"/> + <elementView name="elementView"/> + <containerView name="containerView"/> + <initialOperation> + <firstModelOperations xsi:type="tool_1:ChangeContext" browseExpression="[elementView.sourceNode.oclAsType(viewpoint::DSemanticDecorator).target/]"> + <subModelOperations xsi:type="tool_1:Unset" featureName="reference" elementExpression="[elementView.targetNode.oclAsType(viewpoint::DSemanticDecorator).target/]"/> + </firstModelOperations> + </initialOperation> + </ownedTools> + <ownedTools xsi:type="tool:DeleteElementDescription" name="Delete Bi-Directional Reference"> + <element name="element"/> + <elementView name="elementView"/> + <containerView name="containerView"/> + <initialOperation> + <firstModelOperations xsi:type="tool_1:ChangeContext" browseExpression="[elementView.sourceNode.oclAsType(viewpoint::DSemanticDecorator).target/]"> + <subModelOperations xsi:type="tool_1:Unset" featureName="references" elementExpression="[elementView.targetNode.oclAsType(viewpoint::DSemanticDecorator).target/]"/> + </firstModelOperations> + </initialOperation> + </ownedTools> + <ownedTools xsi:type="tool:DeleteElementDescription" name="Delete Reference"> + <element name="element"/> + <elementView name="elementView"/> + <containerView name="containerView"/> + <initialOperation> + <firstModelOperations xsi:type="tool_1:ChangeContext" browseExpression="[elementView.sourceNode.oclAsType(viewpoint::DSemanticDecorator).target/]"> + <subModelOperations xsi:type="tool_1:Unset" featureName="references2" elementExpression="[elementView.targetNode.oclAsType(viewpoint::DSemanticDecorator).target/]"/> + </firstModelOperations> + </initialOperation> + </ownedTools> + <ownedTools xsi:type="tool:DeleteElementDescription" name="Delete Component"> + <element name="element"/> + <elementView name="elementView"/> + <containerView name="containerView"/> + <initialOperation> + <firstModelOperations xsi:type="tool_1:ChangeContext" browseExpression="var:self"> + <subModelOperations xsi:type="tool_1:RemoveElement"/> + </firstModelOperations> + </initialOperation> + </ownedTools> + <ownedTools xsi:type="tool_1:PopupMenu" name="Component Actions" precondition="[self.oclIsKindOf(component::Component)/]"> + <menuItemDescription xsi:type="tool_1:OperationAction" name="Enable All Content Payload" precondition="[self.eAllContents()->filter(component::Component)->exists(c | not c.payload)/]"> + <view name="views"/> + <initialOperation> + <firstModelOperations xsi:type="tool_1:For" expression="[self.eAllContents()->filter(component::Component)/]"> + <subModelOperations xsi:type="tool_1:SetValue" featureName="payload" valueExpression="true"/> + </firstModelOperations> + </initialOperation> + </menuItemDescription> + <menuItemDescription xsi:type="tool_1:OperationAction" name="Disable All Content Payload" precondition="[self.eAllContents()->filter(component::Component)->exists(c | c.payload)/]"> + <view name="views"/> + <initialOperation> + <firstModelOperations xsi:type="tool_1:For" expression="[self.eAllContents()->filter(component::Component)/]"> + <subModelOperations xsi:type="tool_1:SetValue" featureName="payload" valueExpression="false"/> + </firstModelOperations> + </initialOperation> + </menuItemDescription> + <menuItemDescription xsi:type="tool_1:OperationAction" name="Enable Children Payload" precondition="[self.oclIsKindOf(component::Component) and self.oclAsType(component::Component).children->exists(c | not c.payload)/]"> + <view name="views"/> + <initialOperation> + <firstModelOperations xsi:type="tool_1:For" expression="feature:children"> + <subModelOperations xsi:type="tool_1:SetValue" featureName="payload" valueExpression="true"/> + </firstModelOperations> + </initialOperation> + </menuItemDescription> + <menuItemDescription xsi:type="tool_1:OperationAction" name="Disable Children Payload" label="Disable Children Payload" precondition="[self.oclIsKindOf(component::Component) and self.oclAsType(component::Component).children->exists(c | c.payload)/]"> + <view name="views"/> + <initialOperation> + <firstModelOperations xsi:type="tool_1:For" expression="feature:children"> + <subModelOperations xsi:type="tool_1:SetValue" featureName="payload" valueExpression="false"/> + </firstModelOperations> + </initialOperation> + </menuItemDescription> + <menuItemDescription xsi:type="tool_1:OperationAction" name="Enable Payload" precondition="[self.oclIsKindOf(component::Component) and not self.oclAsType(component::Component).payload/]"> + <view name="views"/> + <initialOperation> + <firstModelOperations xsi:type="tool_1:SetValue" featureName="payload" valueExpression="true"/> + </initialOperation> + </menuItemDescription> + </ownedTools> + <ownedTools xsi:type="tool:ReconnectEdgeDescription" name="Reconnect Single Reference" reconnectionKind="RECONNECT_BOTH"> + <source name="source"/> + <target name="target"/> + <sourceView name="sourceView"/> + <targetView name="targetView"/> + <element name="element"/> + <initialOperation> + <firstModelOperations xsi:type="tool_1:ChangeContext" browseExpression="var:source"> + <subModelOperations xsi:type="tool_1:If" conditionExpression="[source <> element/]"> + <subModelOperations xsi:type="tool_1:ChangeContext" browseExpression="var:element"> + <subModelOperations xsi:type="tool_1:SetValue" featureName="reference" valueExpression="var:target"/> + </subModelOperations> + </subModelOperations> + <subModelOperations xsi:type="tool_1:If" conditionExpression="[source = element/]"> + <subModelOperations xsi:type="tool_1:If" conditionExpression="[otherEnd = sourceView/]"> + <subModelOperations xsi:type="tool_1:If" conditionExpression="[otherEnd = edgeView.targetNode/]"> + <subModelOperations xsi:type="tool_1:ChangeContext" browseExpression="var:target"> + <subModelOperations xsi:type="tool_1:SetValue" featureName="reference" valueExpression="[edgeView.targetNode.oclAsType(viewpoint::DSemanticDecorator).target/]"/> + <subModelOperations xsi:type="tool_1:ChangeContext" browseExpression="var:element"> + <subModelOperations xsi:type="tool_1:Unset" featureName="reference" elementExpression="var:element"/> + </subModelOperations> + </subModelOperations> + </subModelOperations> + <subModelOperations xsi:type="tool_1:If" conditionExpression="[otherEnd <> edgeView.targetNode/]"> + <subModelOperations xsi:type="tool_1:ChangeContext" browseExpression="var:element"> + <subModelOperations xsi:type="tool_1:SetValue" featureName="reference" valueExpression="var:target"/> + <subModelOperations xsi:type="tool_1:Unset" featureName="reference" elementExpression="var:source"/> + </subModelOperations> + </subModelOperations> + </subModelOperations> + <subModelOperations xsi:type="tool_1:If" conditionExpression="[otherEnd <> sourceView/]"> + <subModelOperations xsi:type="tool_1:ChangeContext" browseExpression="var:target"> + <subModelOperations xsi:type="tool_1:SetValue" featureName="reference" valueExpression="[edgeView.targetNode.oclAsType(viewpoint::DSemanticDecorator).target/]"/> + </subModelOperations> + <subModelOperations xsi:type="tool_1:ChangeContext" browseExpression="var:source"> + <subModelOperations xsi:type="tool_1:Unset" featureName="reference" elementExpression="[edgeView.targetNode.oclAsType(viewpoint::DSemanticDecorator).target/]"/> + </subModelOperations> + </subModelOperations> + </subModelOperations> + </firstModelOperations> + </initialOperation> + <edgeView name="edgeView"/> + </ownedTools> + <ownedTools xsi:type="tool:ReconnectEdgeDescription" name="Reconnect Bi-Directional Reference" reconnectionKind="RECONNECT_BOTH"> + <source name="source"/> + <target name="target"/> + <sourceView name="sourceView"/> + <targetView name="targetView"/> + <element name="element"/> + <initialOperation> + <firstModelOperations xsi:type="tool_1:ChangeContext" browseExpression="var:source"> + <subModelOperations xsi:type="tool_1:If" conditionExpression="[source <> element/]"> + <subModelOperations xsi:type="tool_1:ChangeContext" browseExpression="var:element"> + <subModelOperations xsi:type="tool_1:SetValue" featureName="references" valueExpression="var:target"/> + <subModelOperations xsi:type="tool_1:Unset" featureName="references" elementExpression="var:source"/> + </subModelOperations> + </subModelOperations> + <subModelOperations xsi:type="tool_1:If" conditionExpression="[source = element/]"> + <subModelOperations xsi:type="tool_1:If" conditionExpression="[otherEnd = sourceView/]"> + <subModelOperations xsi:type="tool_1:If" conditionExpression="[otherEnd = edgeView.targetNode/]"> + <subModelOperations xsi:type="tool_1:ChangeContext" browseExpression="var:target"> + <subModelOperations xsi:type="tool_1:SetValue" featureName="references" valueExpression="[edgeView.targetNode.oclAsType(viewpoint::DSemanticDecorator).target/]"/> + <subModelOperations xsi:type="tool_1:ChangeContext" browseExpression="var:element"> + <subModelOperations xsi:type="tool_1:Unset" featureName="references" elementExpression="var:element"/> + </subModelOperations> + </subModelOperations> + </subModelOperations> + <subModelOperations xsi:type="tool_1:If" conditionExpression="[otherEnd <> edgeView.targetNode/]"> + <subModelOperations xsi:type="tool_1:ChangeContext" browseExpression="var:element"> + <subModelOperations xsi:type="tool_1:SetValue" featureName="references" valueExpression="var:target"/> + <subModelOperations xsi:type="tool_1:Unset" featureName="references" elementExpression="var:source"/> + </subModelOperations> + </subModelOperations> + </subModelOperations> + <subModelOperations xsi:type="tool_1:If" conditionExpression="[otherEnd <> sourceView/]"> + <subModelOperations xsi:type="tool_1:ChangeContext" browseExpression="var:target"> + <subModelOperations xsi:type="tool_1:SetValue" featureName="references" valueExpression="[edgeView.targetNode.oclAsType(viewpoint::DSemanticDecorator).target/]"/> + </subModelOperations> + <subModelOperations xsi:type="tool_1:ChangeContext" browseExpression="var:source"> + <subModelOperations xsi:type="tool_1:Unset" featureName="references" elementExpression="[edgeView.targetNode.oclAsType(viewpoint::DSemanticDecorator).target/]"/> + </subModelOperations> + </subModelOperations> + </subModelOperations> + </firstModelOperations> + </initialOperation> + <edgeView name="edgeView"/> + </ownedTools> + <ownedTools xsi:type="tool:ReconnectEdgeDescription" name="Reconnect Reference" reconnectionKind="RECONNECT_BOTH"> + <source name="source"/> + <target name="target"/> + <sourceView name="sourceView"/> + <targetView name="targetView"/> + <element name="element"/> + <initialOperation> + <firstModelOperations xsi:type="tool_1:ChangeContext" browseExpression="var:source"> + <subModelOperations xsi:type="tool_1:If" conditionExpression="[source <> element/]"> + <subModelOperations xsi:type="tool_1:ChangeContext" browseExpression="var:element"> + <subModelOperations xsi:type="tool_1:SetValue" featureName="references2" valueExpression="var:target"/> + <subModelOperations xsi:type="tool_1:Unset" featureName="references2" elementExpression="var:source"/> + </subModelOperations> + </subModelOperations> + <subModelOperations xsi:type="tool_1:If" conditionExpression="[source = element/]"> + <subModelOperations xsi:type="tool_1:If" conditionExpression="[otherEnd = sourceView/]"> + <subModelOperations xsi:type="tool_1:If" conditionExpression="[otherEnd = edgeView.targetNode/]"> + <subModelOperations xsi:type="tool_1:ChangeContext" browseExpression="var:target"> + <subModelOperations xsi:type="tool_1:SetValue" featureName="references2" valueExpression="[edgeView.targetNode.oclAsType(viewpoint::DSemanticDecorator).target/]"/> + <subModelOperations xsi:type="tool_1:ChangeContext" browseExpression="var:element"> + <subModelOperations xsi:type="tool_1:Unset" featureName="references2" elementExpression="var:element"/> + </subModelOperations> + </subModelOperations> + </subModelOperations> + <subModelOperations xsi:type="tool_1:If" conditionExpression="[otherEnd <> edgeView.targetNode/]"> + <subModelOperations xsi:type="tool_1:ChangeContext" browseExpression="var:element"> + <subModelOperations xsi:type="tool_1:SetValue" featureName="references2" valueExpression="var:target"/> + <subModelOperations xsi:type="tool_1:Unset" featureName="references2" elementExpression="var:source"/> + </subModelOperations> + </subModelOperations> + </subModelOperations> + <subModelOperations xsi:type="tool_1:If" conditionExpression="[otherEnd <> sourceView/]"> + <subModelOperations xsi:type="tool_1:ChangeContext" browseExpression="var:target"> + <subModelOperations xsi:type="tool_1:SetValue" featureName="references2" valueExpression="[edgeView.targetNode.oclAsType(viewpoint::DSemanticDecorator).target/]"/> + </subModelOperations> + <subModelOperations xsi:type="tool_1:ChangeContext" browseExpression="var:source"> + <subModelOperations xsi:type="tool_1:Unset" featureName="references2" elementExpression="[edgeView.targetNode.oclAsType(viewpoint::DSemanticDecorator).target/]"/> + </subModelOperations> + </subModelOperations> + </subModelOperations> + </firstModelOperations> + </initialOperation> + <edgeView name="edgeView"/> + </ownedTools> + <ownedTools xsi:type="tool:ContainerDropDescription" name="Drop Component" precondition="[self.oclIsKindOf(component::Component)/]" forceRefresh="true" mappings="//@ownedViewpoints[name='Component']/@ownedRepresentations[name='Diagram']/@defaultLayer/@containerMappings[name='Component']"> + <oldContainer name="oldSemanticContainer"/> + <newContainer name="newSemanticContainer"/> + <element name="element"/> + <newViewContainer name="newContainerView"/> + <initialOperation> + <firstModelOperations xsi:type="tool_1:ChangeContext" browseExpression="var:newSemanticContainer"> + <subModelOperations xsi:type="tool_1:SetValue" featureName="children" valueExpression="var:element"/> + </firstModelOperations> + </initialOperation> + </ownedTools> + </toolSections> + </defaultLayer> + </ownedRepresentations> + <ownedRepresentations xsi:type="description_2:CrossTableDescription" name="References" domainClass="component.Component"> + <ownedLineMappings name="References Component Lines" reusedSubLines="//@ownedViewpoints[name='Component']/@ownedRepresentations[name='References']/@ownedLineMappings[name='References%20Component%20Lines']" reusedInMappings="//@ownedViewpoints[name='Component']/@ownedRepresentations[name='References']/@ownedLineMappings[name='References%20Component%20Lines']" domainClass="component.Component" semanticCandidatesExpression="[self.children->select(not payload)/]" headerLabelExpression="feature:name"> + <defaultBackground> + <backgroundColor xsi:type="description:SystemColor" href="environment:/viewpoint#//@systemColors/@entries[name='white']"/> + </defaultBackground> + <backgroundConditionalStyle predicateExpression="[self.children->exists(c | c.payload)/]"> + <style> + <backgroundColor xsi:type="description:SystemColor" href="environment:/viewpoint#//@systemColors/@entries[name='red']"/> + </style> + </backgroundConditionalStyle> + <create name="Create Child Component" mapping="//@ownedViewpoints[name='Component']/@ownedRepresentations[name='References']/@ownedLineMappings[name='References%20Component%20Lines']"> + <variables name="root" documentation="The semantic element of the table."/> + <variables name="element" documentation="The semantic currently edited element."/> + <variables name="container" documentation="The semantic element corresponding to the view container."/> + <firstModelOperation xsi:type="tool_1:CreateInstance" typeName="component.Component" referenceName="children" variableName=""> + <subModelOperations xsi:type="tool_1:SetValue" featureName="name" valueExpression="[eContainer(component::Component).name + '.' + eContainer(component::Component).children->size()/]"/> + </firstModelOperation> + </create> + </ownedLineMappings> + <ownedCreateLine name="Create Global Component" mapping="//@ownedViewpoints[name='Component']/@ownedRepresentations[name='References']/@ownedLineMappings[name='References%20Component%20Lines']"> + <variables name="root" documentation="The semantic element of the table."/> + <variables name="element" documentation="The semantic currently edited element."/> + <variables name="container" documentation="The semantic element corresponding to the view container."/> + <firstModelOperation xsi:type="tool_1:CreateInstance" typeName="component.Component" referenceName="children" variableName=""> + <subModelOperations xsi:type="tool_1:SetValue" featureName="name" valueExpression="[eContainer(component::Component).name + '.' + eContainer(component::Component).children->size()/]"/> + </firstModelOperation> + </ownedCreateLine> + <ownedColumnMappings name="Component Columns" headerLabelExpression="feature:name" domainClass="component.Component" semanticCandidatesExpression="service:getAllChildren"/> + <intersection name="Intersection" lineMapping="//@ownedViewpoints[name='Component']/@ownedRepresentations[name='References']/@ownedLineMappings[name='References%20Component%20Lines']" columnMapping="//@ownedViewpoints[name='Component']/@ownedRepresentations[name='References']/@ownedColumnMappings.0" labelExpression="service:getIntersectionLabel(columnSemantic)" columnFinderExpression="service:getIntersectionColumms"/> + </ownedRepresentations> + <ownedRepresentations xsi:type="description_2:EditionTableDescription" name="Statistics" domainClass="component.Component"> + <ownedLineMappings name="Statistics Component Lines" reusedSubLines="//@ownedViewpoints[name='Component']/@ownedRepresentations[name='Statistics']/@ownedLineMappings[name='Statistics%20Component%20Lines']" reusedInMappings="//@ownedViewpoints[name='Component']/@ownedRepresentations[name='Statistics']/@ownedLineMappings[name='Statistics%20Component%20Lines']" domainClass="component.Component" semanticCandidatesExpression="[self.children->select(not payload)/]" headerLabelExpression="feature:name"> + <defaultBackground> + <backgroundColor xsi:type="description:SystemColor" href="environment:/viewpoint#//@systemColors/@entries[name='white']"/> + </defaultBackground> + <backgroundConditionalStyle predicateExpression="[self.children->exists(c | c.payload)/]"> + <style> + <backgroundColor xsi:type="description:SystemColor" href="environment:/viewpoint#//@systemColors/@entries[name='red']"/> + </style> + </backgroundConditionalStyle> + <create name="Create Child Component" mapping="//@ownedViewpoints[name='Component']/@ownedRepresentations[name='Statistics']/@ownedLineMappings[name='Statistics%20Component%20Lines']"> + <variables name="root" documentation="The semantic element of the table."/> + <variables name="element" documentation="The semantic currently edited element."/> + <variables name="container" documentation="The semantic element corresponding to the view container."/> + <firstModelOperation xsi:type="tool_1:CreateInstance" typeName="component.Component" referenceName="children" variableName=""> + <subModelOperations xsi:type="tool_1:SetValue" featureName="name" valueExpression="[eContainer(component::Component).name + '.' + eContainer(component::Component).children->size()/]"/> + </firstModelOperation> + </create> + </ownedLineMappings> + <ownedCreateLine name="Create Global Component" mapping="//@ownedViewpoints[name='Component']/@ownedRepresentations[name='Statistics']/@ownedLineMappings[name='Statistics%20Component%20Lines']"> + <variables name="root" documentation="The semantic element of the table."/> + <variables name="element" documentation="The semantic currently edited element."/> + <variables name="container" documentation="The semantic element corresponding to the view container."/> + <firstModelOperation xsi:type="tool_1:CreateInstance" typeName="component.Component" referenceName="children" variableName=""> + <subModelOperations xsi:type="tool_1:SetValue" featureName="name" valueExpression="[eContainer(component::Component).name + '.' + eContainer(component::Component).children->size()/]"/> + </firstModelOperation> + </ownedCreateLine> + <ownedColumnMappings name="References" headerLabelExpression="References" featureName="references" labelExpression="[self.references->size()/]"/> + <ownedColumnMappings name="Opposites" headerLabelExpression="Opposites" featureName="opposites" labelExpression="[self.opposites->size()/]"/> + <ownedColumnMappings name="Reference" headerLabelExpression="Reference" featureName="reference"/> + <ownedColumnMappings name="References2" headerLabelExpression="References" featureName="references2" labelExpression="[self.references->size()/]"/> + </ownedRepresentations> + <ownedRepresentations xsi:type="description_3:TreeDescription" name="Tree" domainClass="component.Component"> + <subItemMappings name="Component" domainClass="component.Component" semanticCandidatesExpression="[self.children->select(not payload)/]" reusedTreeItemMappings="//@ownedViewpoints[name='Component']/@ownedRepresentations[name='Tree']/@subItemMappings[name='Component']"> + <defaultStyle> + <labelColor xsi:type="description:SystemColor" href="environment:/viewpoint#//@systemColors/@entries[name='black']"/> + <backgroundColor xsi:type="description:SystemColor" href="environment:/viewpoint#//@systemColors/@entries[name='white']"/> + </defaultStyle> + <conditionalStyles predicateExpression="[self.children->exists(c | c.payload)/]"> + <style> + <labelColor xsi:type="description:SystemColor" href="environment:/viewpoint#//@systemColors/@entries[name='black']"/> + <backgroundColor xsi:type="description:SystemColor" href="environment:/viewpoint#//@systemColors/@entries[name='red']"/> + </style> + </conditionalStyles> + <create name="Create Child Component" mapping="//@ownedViewpoints[name='Component']/@ownedRepresentations[name='Tree']/@subItemMappings[name='Component']"> + <firstModelOperation xsi:type="tool_1:CreateInstance" typeName="component.Component" referenceName="children" variableName=""> + <subModelOperations xsi:type="tool_1:SetValue" featureName="name" valueExpression="[eContainer(component::Component).name + '.' + eContainer(component::Component).children->size()/]"/> + </firstModelOperation> + <variables name="root" documentation="The semantic element of the tree."/> + <variables name="element" documentation="The semantic currently edited element."/> + <variables name="container" documentation="The semantic element corresponding to the view container."/> + </create> + </subItemMappings> + <createTreeItem name="Create Global Component" mapping="//@ownedViewpoints[name='Component']/@ownedRepresentations[name='Tree']/@subItemMappings[name='Component']"> + <firstModelOperation xsi:type="tool_1:CreateInstance" typeName="component.Component" referenceName="children" variableName=""> + <subModelOperations xsi:type="tool_1:SetValue" featureName="name" valueExpression="[eContainer(component::Component).name + '.' + eContainer(component::Component).children->size()/]"/> + </firstModelOperation> + <variables name="root" documentation="The semantic element of the tree."/> + <variables name="element" documentation="The semantic currently edited element."/> + <variables name="container" documentation="The semantic element corresponding to the view container."/> + </createTreeItem> + </ownedRepresentations> + <ownedJavaExtensions qualifiedClassName="org.eclipse.sirius.tests.sample.component.service.ComponentServices"/> + </ownedViewpoints> +</description:Group> diff --git a/plugins/org.eclipse.sirius.tests.sample.component.design/icons/full/obj16/ComponentModelFile.gif b/plugins/org.eclipse.sirius.tests.sample.component.design/icons/full/obj16/ComponentModelFile.gif Binary files differnew file mode 100644 index 0000000000..5a20b74442 --- /dev/null +++ b/plugins/org.eclipse.sirius.tests.sample.component.design/icons/full/obj16/ComponentModelFile.gif diff --git a/plugins/org.eclipse.sirius.tests.sample.component.design/icons/full/wizban/NewComponent.gif b/plugins/org.eclipse.sirius.tests.sample.component.design/icons/full/wizban/NewComponent.gif Binary files differnew file mode 100644 index 0000000000..a76f326ac0 --- /dev/null +++ b/plugins/org.eclipse.sirius.tests.sample.component.design/icons/full/wizban/NewComponent.gif diff --git a/plugins/org.eclipse.sirius.tests.sample.component.design/plugin.properties b/plugins/org.eclipse.sirius.tests.sample.component.design/plugin.properties new file mode 100644 index 0000000000..3d772d8794 --- /dev/null +++ b/plugins/org.eclipse.sirius.tests.sample.component.design/plugin.properties @@ -0,0 +1,45 @@ +# ==================================================================== +# Copyright (c) 2015 Obeo. +# 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: +# Obeo - initial API and implementation +# ==================================================================== +pluginName = Component VSM +providerName = Eclipse Modeling Project +_UI_ComponentEditor_menu = &Component Editor +_UI_CreateChild_menu_item = &New Child +_UI_CreateSibling_menu_item = N&ew Sibling +_UI_ShowPropertiesView_menu_item = Show &Properties View +_UI_RefreshViewer_menu_item = &Refresh +_UI_SelectionPage_label = Selection +_UI_ParentPage_label = Parent +_UI_ListPage_label = List +_UI_TreePage_label = Tree +_UI_TablePage_label = Table +_UI_TreeWithColumnsPage_label = Tree with Columns +_UI_ObjectColumn_label = Object +_UI_SelfColumn_label = Self +_UI_NoObjectSelected = Selected Nothing +_UI_SingleObjectSelected = Selected Object: {0} +_UI_MultiObjectSelected = Selected {0} Objects +_UI_OpenEditorError_label = Open Editor +_UI_Wizard_category = Example EMF Model Creation Wizards +_UI_CreateModelError_message = Problems encountered in file "{0}" +_UI_ComponentModelWizard_label = Component Model +_UI_ComponentModelWizard_description = Create a new Component model +_UI_ComponentEditor_label = Component Model Editor +_UI_ComponentEditorFilenameDefaultBase = My +_UI_ComponentEditorFilenameExtensions = component +_UI_Wizard_label = New +_WARN_FilenameExtension = The file name must end in ''.{0}'' +_WARN_FilenameExtensions = The file name must have one of the following extensions: {0} +_UI_ModelObject = &Model Object +_UI_XMLEncoding = &XML Encoding +_UI_XMLEncodingChoices = UTF-8 ASCII UTF-16 UTF-16BE UTF-16LE ISO-8859-1 +_UI_Wizard_initial_object_description = Select a model object to create +_UI_FileConflict_label = File Conflict +_WARN_FileConflict = There are unsaved changes that conflict with changes made outside the editor. Do you wish to discard this editor's changes? diff --git a/plugins/org.eclipse.sirius.tests.sample.component.design/plugin.xml b/plugins/org.eclipse.sirius.tests.sample.component.design/plugin.xml new file mode 100644 index 0000000000..1beda7a94c --- /dev/null +++ b/plugins/org.eclipse.sirius.tests.sample.component.design/plugin.xml @@ -0,0 +1,47 @@ +<?xml version="1.0" encoding="UTF-8"?> +<?eclipse version="3.0"?> +<!-- + Copyright (c) 2015 Obeo. + 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: + Obeo - Initial API and implementation +--> +<plugin> + <extension point="org.eclipse.sirius.componentization"> + <component class="org.eclipse.sirius.tests.sample.component.design.ComponentDesignPlugin" + id="org.eclipse.sirius.tests.sample.component.design" + name="component"> + </component> + </extension> + <extension point="org.eclipse.ui.newWizards"> + <!-- @generated component --> + <category + id="org.eclipse.emf.ecore.Wizard.category.ID" + name="%_UI_Wizard_category"/> + <wizard + id="org.eclipse.sirius.tests.sample.component.presentation.ComponentModelWizardID" + name="%_UI_ComponentModelWizard_label" + class="org.eclipse.sirius.tests.sample.component.presentation.ComponentModelWizard" + category="org.eclipse.emf.ecore.Wizard.category.ID" + icon="icons/full/obj16/ComponentModelFile.gif"> + <description>%_UI_ComponentModelWizard_description</description> + <selection class="org.eclipse.core.resources.IResource"/> + </wizard> + </extension> + + <extension point="org.eclipse.ui.editors"> + <!-- @generated component --> + <editor + id="org.eclipse.sirius.tests.sample.component.presentation.ComponentEditorID" + name="%_UI_ComponentEditor_label" + icon="icons/full/obj16/ComponentModelFile.gif" + extensions="component" + class="org.eclipse.sirius.tests.sample.component.presentation.ComponentEditor" + contributorClass="org.eclipse.sirius.tests.sample.component.presentation.ComponentActionBarContributor"> + </editor> + </extension> +</plugin> diff --git a/plugins/org.eclipse.sirius.tests.sample.component.design/pom.xml b/plugins/org.eclipse.sirius.tests.sample.component.design/pom.xml new file mode 100644 index 0000000000..0b01cf0658 --- /dev/null +++ b/plugins/org.eclipse.sirius.tests.sample.component.design/pom.xml @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Copyright (c) 2015 Obeo. + 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: + Obeo - Initial API and implementation +--> +<project xmlns="http://maven.apache.org/POM/4.0.0" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> + <modelVersion>4.0.0</modelVersion> + + <parent> + <groupId>org.eclipse.sirius</groupId> + <artifactId>sirius-tests-parent</artifactId> + <version>3.0.0-SNAPSHOT</version> + <relativePath>../../packaging/org.eclipse.sirius.tests.parent</relativePath> + </parent> + + <artifactId>org.eclipse.sirius.tests.sample.component.design</artifactId> + <packaging>eclipse-plugin</packaging> + <version>3.0.0-SNAPSHOT</version> + +</project> diff --git a/plugins/org.eclipse.sirius.tests.sample.component.design/src-gen/org/eclipse/sirius/tests/sample/component/presentation/ComponentActionBarContributor.java b/plugins/org.eclipse.sirius.tests.sample.component.design/src-gen/org/eclipse/sirius/tests/sample/component/presentation/ComponentActionBarContributor.java new file mode 100644 index 0000000000..d416e014ac --- /dev/null +++ b/plugins/org.eclipse.sirius.tests.sample.component.design/src-gen/org/eclipse/sirius/tests/sample/component/presentation/ComponentActionBarContributor.java @@ -0,0 +1,433 @@ +/** + * Copyright (c) 2015 Obeo + * 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: + * Obeo - initial API and implementation + */ +package org.eclipse.sirius.tests.sample.component.presentation; + +import java.util.ArrayList; +import java.util.Collection; + +import org.eclipse.emf.common.ui.viewer.IViewerProvider; +import org.eclipse.emf.edit.domain.EditingDomain; +import org.eclipse.emf.edit.domain.IEditingDomainProvider; +import org.eclipse.emf.edit.ui.action.ControlAction; +import org.eclipse.emf.edit.ui.action.CreateChildAction; +import org.eclipse.emf.edit.ui.action.CreateSiblingAction; +import org.eclipse.emf.edit.ui.action.EditingDomainActionBarContributor; +import org.eclipse.emf.edit.ui.action.LoadResourceAction; +import org.eclipse.emf.edit.ui.action.ValidateAction; +import org.eclipse.jface.action.Action; +import org.eclipse.jface.action.ActionContributionItem; +import org.eclipse.jface.action.IAction; +import org.eclipse.jface.action.IContributionItem; +import org.eclipse.jface.action.IContributionManager; +import org.eclipse.jface.action.IMenuListener; +import org.eclipse.jface.action.IMenuManager; +import org.eclipse.jface.action.IToolBarManager; +import org.eclipse.jface.action.MenuManager; +import org.eclipse.jface.action.Separator; +import org.eclipse.jface.action.SubContributionItem; +import org.eclipse.jface.viewers.ISelection; +import org.eclipse.jface.viewers.ISelectionChangedListener; +import org.eclipse.jface.viewers.ISelectionProvider; +import org.eclipse.jface.viewers.IStructuredSelection; +import org.eclipse.jface.viewers.SelectionChangedEvent; +import org.eclipse.jface.viewers.Viewer; +import org.eclipse.sirius.tests.sample.component.design.ComponentDesignPlugin; +import org.eclipse.ui.IEditorPart; +import org.eclipse.ui.PartInitException; + +/** + * This is the action bar contributor for the Component model editor. <!-- + * begin-user-doc --> <!-- end-user-doc --> + * + * @generated + */ +public class ComponentActionBarContributor extends EditingDomainActionBarContributor implements ISelectionChangedListener { + /** + * This keeps track of the active editor. <!-- begin-user-doc --> <!-- + * end-user-doc --> + * + * @generated + */ + protected IEditorPart activeEditorPart; + + /** + * This keeps track of the current selection provider. <!-- begin-user-doc + * --> <!-- end-user-doc --> + * + * @generated + */ + protected ISelectionProvider selectionProvider; + + /** + * This action opens the Properties view. <!-- begin-user-doc --> <!-- + * end-user-doc --> + * + * @generated NOT + */ + protected IAction showPropertiesViewAction = new Action(ComponentDesignPlugin.INSTANCE.getString("_UI_ShowPropertiesView_menu_item")) { + @Override + public void run() { + try { + getPage().showView("org.eclipse.ui.views.PropertySheet"); + } catch (PartInitException exception) { + ComponentDesignPlugin.INSTANCE.log(exception); + } + } + }; + + /** + * This action refreshes the viewer of the current editor if the editor + * implements {@link org.eclipse.emf.common.ui.viewer.IViewerProvider}. <!-- + * begin-user-doc --> <!-- end-user-doc --> + * + * @generated NOT + */ + protected IAction refreshViewerAction = new Action(ComponentDesignPlugin.INSTANCE.getString("_UI_RefreshViewer_menu_item")) { + @Override + public boolean isEnabled() { + return activeEditorPart instanceof IViewerProvider; + } + + @Override + public void run() { + if (activeEditorPart instanceof IViewerProvider) { + Viewer viewer = ((IViewerProvider) activeEditorPart).getViewer(); + if (viewer != null) { + viewer.refresh(); + } + } + } + }; + + /** + * This will contain one + * {@link org.eclipse.emf.edit.ui.action.CreateChildAction} corresponding to + * each descriptor generated for the current selection by the item provider. + * <!-- begin-user-doc --> <!-- end-user-doc --> + * + * @generated + */ + protected Collection<IAction> createChildActions; + + /** + * This is the menu manager into which menu contribution items should be + * added for CreateChild actions. <!-- begin-user-doc --> <!-- end-user-doc + * --> + * + * @generated + */ + protected IMenuManager createChildMenuManager; + + /** + * This will contain one + * {@link org.eclipse.emf.edit.ui.action.CreateSiblingAction} corresponding + * to each descriptor generated for the current selection by the item + * provider. <!-- begin-user-doc --> <!-- end-user-doc --> + * + * @generated + */ + protected Collection<IAction> createSiblingActions; + + /** + * This is the menu manager into which menu contribution items should be + * added for CreateSibling actions. <!-- begin-user-doc --> <!-- + * end-user-doc --> + * + * @generated + */ + protected IMenuManager createSiblingMenuManager; + + /** + * This creates an instance of the contributor. <!-- begin-user-doc --> <!-- + * end-user-doc --> + * + * @generated + */ + public ComponentActionBarContributor() { + super(ADDITIONS_LAST_STYLE); + loadResourceAction = new LoadResourceAction(); + validateAction = new ValidateAction(); + controlAction = new ControlAction(); + } + + /** + * This adds Separators for editor additions to the tool bar. <!-- + * begin-user-doc --> <!-- end-user-doc --> + * + * @generated + */ + @Override + public void contributeToToolBar(IToolBarManager toolBarManager) { + toolBarManager.add(new Separator("component-settings")); + toolBarManager.add(new Separator("component-additions")); + } + + /** + * This adds to the menu bar a menu and some separators for editor + * additions, as well as the sub-menus for object creation items. <!-- + * begin-user-doc --> <!-- end-user-doc --> + * + * @generated NOT + */ + @Override + public void contributeToMenu(IMenuManager menuManager) { + super.contributeToMenu(menuManager); + + IMenuManager submenuManager = new MenuManager(ComponentDesignPlugin.INSTANCE.getString("_UI_ComponentEditor_menu"), "org.eclipse.sirius.tests.sample.componentMenuID"); + menuManager.insertAfter("additions", submenuManager); + submenuManager.add(new Separator("settings")); + submenuManager.add(new Separator("actions")); + submenuManager.add(new Separator("additions")); + submenuManager.add(new Separator("additions-end")); + + // Prepare for CreateChild item addition or removal. + // + createChildMenuManager = new MenuManager(ComponentDesignPlugin.INSTANCE.getString("_UI_CreateChild_menu_item")); + submenuManager.insertBefore("additions", createChildMenuManager); + + // Prepare for CreateSibling item addition or removal. + // + createSiblingMenuManager = new MenuManager(ComponentDesignPlugin.INSTANCE.getString("_UI_CreateSibling_menu_item")); + submenuManager.insertBefore("additions", createSiblingMenuManager); + + // Force an update because Eclipse hides empty menus now. + // + submenuManager.addMenuListener(new IMenuListener() { + @Override + public void menuAboutToShow(IMenuManager menuManager) { + menuManager.updateAll(true); + } + }); + + addGlobalActions(submenuManager); + } + + /** + * When the active editor changes, this remembers the change and registers + * with it as a selection provider. <!-- begin-user-doc --> <!-- + * end-user-doc --> + * + * @generated + */ + @Override + public void setActiveEditor(IEditorPart part) { + super.setActiveEditor(part); + activeEditorPart = part; + + // Switch to the new selection provider. + // + if (selectionProvider != null) { + selectionProvider.removeSelectionChangedListener(this); + } + if (part == null) { + selectionProvider = null; + } else { + selectionProvider = part.getSite().getSelectionProvider(); + selectionProvider.addSelectionChangedListener(this); + + // Fake a selection changed event to update the menus. + // + if (selectionProvider.getSelection() != null) { + selectionChanged(new SelectionChangedEvent(selectionProvider, selectionProvider.getSelection())); + } + } + } + + /** + * This implements + * {@link org.eclipse.jface.viewers.ISelectionChangedListener}, handling + * {@link org.eclipse.jface.viewers.SelectionChangedEvent}s by querying for + * the children and siblings that can be added to the selected object and + * updating the menus accordingly. <!-- begin-user-doc --> <!-- end-user-doc + * --> + * + * @generated + */ + @Override + public void selectionChanged(SelectionChangedEvent event) { + // Remove any menu items for old selection. + // + if (createChildMenuManager != null) { + depopulateManager(createChildMenuManager, createChildActions); + } + if (createSiblingMenuManager != null) { + depopulateManager(createSiblingMenuManager, createSiblingActions); + } + + // Query the new selection for appropriate new child/sibling descriptors + // + Collection<?> newChildDescriptors = null; + Collection<?> newSiblingDescriptors = null; + + ISelection selection = event.getSelection(); + if (selection instanceof IStructuredSelection && ((IStructuredSelection) selection).size() == 1) { + Object object = ((IStructuredSelection) selection).getFirstElement(); + + EditingDomain domain = ((IEditingDomainProvider) activeEditorPart).getEditingDomain(); + + newChildDescriptors = domain.getNewChildDescriptors(object, null); + newSiblingDescriptors = domain.getNewChildDescriptors(null, object); + } + + // Generate actions for selection; populate and redraw the menus. + // + createChildActions = generateCreateChildActions(newChildDescriptors, selection); + createSiblingActions = generateCreateSiblingActions(newSiblingDescriptors, selection); + + if (createChildMenuManager != null) { + populateManager(createChildMenuManager, createChildActions, null); + createChildMenuManager.update(true); + } + if (createSiblingMenuManager != null) { + populateManager(createSiblingMenuManager, createSiblingActions, null); + createSiblingMenuManager.update(true); + } + } + + /** + * This generates a {@link org.eclipse.emf.edit.ui.action.CreateChildAction} + * for each object in <code>descriptors</code>, and returns the collection + * of these actions. <!-- begin-user-doc --> <!-- end-user-doc --> + * + * @generated + */ + protected Collection<IAction> generateCreateChildActions(Collection<?> descriptors, ISelection selection) { + Collection<IAction> actions = new ArrayList<IAction>(); + if (descriptors != null) { + for (Object descriptor : descriptors) { + actions.add(new CreateChildAction(activeEditorPart, selection, descriptor)); + } + } + return actions; + } + + /** + * This generates a + * {@link org.eclipse.emf.edit.ui.action.CreateSiblingAction} for each + * object in <code>descriptors</code>, and returns the collection of these + * actions. <!-- begin-user-doc --> <!-- end-user-doc --> + * + * @generated + */ + protected Collection<IAction> generateCreateSiblingActions(Collection<?> descriptors, ISelection selection) { + Collection<IAction> actions = new ArrayList<IAction>(); + if (descriptors != null) { + for (Object descriptor : descriptors) { + actions.add(new CreateSiblingAction(activeEditorPart, selection, descriptor)); + } + } + return actions; + } + + /** + * This populates the specified <code>manager</code> with + * {@link org.eclipse.jface.action.ActionContributionItem}s based on the + * {@link org.eclipse.jface.action.IAction}s contained in the + * <code>actions</code> collection, by inserting them before the specified + * contribution item <code>contributionID</code>. If + * <code>contributionID</code> is <code>null</code>, they are simply added. + * <!-- begin-user-doc --> <!-- end-user-doc --> + * + * @generated + */ + protected void populateManager(IContributionManager manager, Collection<? extends IAction> actions, String contributionID) { + if (actions != null) { + for (IAction action : actions) { + if (contributionID != null) { + manager.insertBefore(contributionID, action); + } else { + manager.add(action); + } + } + } + } + + /** + * This removes from the specified <code>manager</code> all + * {@link org.eclipse.jface.action.ActionContributionItem}s based on the + * {@link org.eclipse.jface.action.IAction}s contained in the + * <code>actions</code> collection. <!-- begin-user-doc --> <!-- + * end-user-doc --> + * + * @generated + */ + protected void depopulateManager(IContributionManager manager, Collection<? extends IAction> actions) { + if (actions != null) { + IContributionItem[] items = manager.getItems(); + for (int i = 0; i < items.length; i++) { + // Look into SubContributionItems + // + IContributionItem contributionItem = items[i]; + while (contributionItem instanceof SubContributionItem) { + contributionItem = ((SubContributionItem) contributionItem).getInnerItem(); + } + + // Delete the ActionContributionItems with matching action. + // + if (contributionItem instanceof ActionContributionItem) { + IAction action = ((ActionContributionItem) contributionItem).getAction(); + if (actions.contains(action)) { + manager.remove(contributionItem); + } + } + } + } + } + + /** + * This populates the pop-up menu before it appears. <!-- begin-user-doc --> + * <!-- end-user-doc --> + * + * @generated NOT + */ + @Override + public void menuAboutToShow(IMenuManager menuManager) { + super.menuAboutToShow(menuManager); + MenuManager submenuManager = null; + + submenuManager = new MenuManager(ComponentDesignPlugin.INSTANCE.getString("_UI_CreateChild_menu_item")); + populateManager(submenuManager, createChildActions, null); + menuManager.insertBefore("edit", submenuManager); + + submenuManager = new MenuManager(ComponentDesignPlugin.INSTANCE.getString("_UI_CreateSibling_menu_item")); + populateManager(submenuManager, createSiblingActions, null); + menuManager.insertBefore("edit", submenuManager); + } + + /** + * This inserts global actions before the "additions-end" separator. <!-- + * begin-user-doc --> <!-- end-user-doc --> + * + * @generated + */ + @Override + protected void addGlobalActions(IMenuManager menuManager) { + menuManager.insertAfter("additions-end", new Separator("ui-actions")); + menuManager.insertAfter("ui-actions", showPropertiesViewAction); + + refreshViewerAction.setEnabled(refreshViewerAction.isEnabled()); + menuManager.insertAfter("ui-actions", refreshViewerAction); + + super.addGlobalActions(menuManager); + } + + /** + * This ensures that a delete action will clean up all references to deleted + * objects. <!-- begin-user-doc --> <!-- end-user-doc --> + * + * @generated + */ + @Override + protected boolean removeAllReferencesOnDelete() { + return true; + } + +} diff --git a/plugins/org.eclipse.sirius.tests.sample.component.design/src-gen/org/eclipse/sirius/tests/sample/component/presentation/ComponentEditor.java b/plugins/org.eclipse.sirius.tests.sample.component.design/src-gen/org/eclipse/sirius/tests/sample/component/presentation/ComponentEditor.java new file mode 100644 index 0000000000..e3afa2e703 --- /dev/null +++ b/plugins/org.eclipse.sirius.tests.sample.component.design/src-gen/org/eclipse/sirius/tests/sample/component/presentation/ComponentEditor.java @@ -0,0 +1,1755 @@ +/** + * Copyright (c) 2015 Obeo + * 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: + * Obeo - initial API and implementation + */ +package org.eclipse.sirius.tests.sample.component.presentation; + +import java.io.IOException; +import java.io.InputStream; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.EventObject; +import java.util.HashMap; +import java.util.Iterator; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + +import org.eclipse.core.resources.IFile; +import org.eclipse.core.resources.IMarker; +import org.eclipse.core.resources.IResource; +import org.eclipse.core.resources.IResourceChangeEvent; +import org.eclipse.core.resources.IResourceChangeListener; +import org.eclipse.core.resources.IResourceDelta; +import org.eclipse.core.resources.IResourceDeltaVisitor; +import org.eclipse.core.resources.ResourcesPlugin; +import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.IPath; +import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.core.runtime.NullProgressMonitor; +import org.eclipse.emf.common.command.BasicCommandStack; +import org.eclipse.emf.common.command.Command; +import org.eclipse.emf.common.command.CommandStack; +import org.eclipse.emf.common.command.CommandStackListener; +import org.eclipse.emf.common.notify.AdapterFactory; +import org.eclipse.emf.common.notify.Notification; +import org.eclipse.emf.common.ui.MarkerHelper; +import org.eclipse.emf.common.ui.ViewerPane; +import org.eclipse.emf.common.ui.editor.ProblemEditorPart; +import org.eclipse.emf.common.ui.viewer.IViewerProvider; +import org.eclipse.emf.common.util.BasicDiagnostic; +import org.eclipse.emf.common.util.Diagnostic; +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.util.EContentAdapter; +import org.eclipse.emf.ecore.util.EcoreUtil; +import org.eclipse.emf.edit.domain.AdapterFactoryEditingDomain; +import org.eclipse.emf.edit.domain.EditingDomain; +import org.eclipse.emf.edit.domain.IEditingDomainProvider; +import org.eclipse.emf.edit.provider.AdapterFactoryItemDelegator; +import org.eclipse.emf.edit.provider.ComposedAdapterFactory; +import org.eclipse.emf.edit.provider.ReflectiveItemProviderAdapterFactory; +import org.eclipse.emf.edit.provider.resource.ResourceItemProviderAdapterFactory; +import org.eclipse.emf.edit.ui.action.EditingDomainActionBarContributor; +import org.eclipse.emf.edit.ui.celleditor.AdapterFactoryTreeEditor; +import org.eclipse.emf.edit.ui.dnd.EditingDomainViewerDropAdapter; +import org.eclipse.emf.edit.ui.dnd.LocalTransfer; +import org.eclipse.emf.edit.ui.dnd.ViewerDragAdapter; +import org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider; +import org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider; +import org.eclipse.emf.edit.ui.provider.UnwrappingSelectionProvider; +import org.eclipse.emf.edit.ui.util.EditUIMarkerHelper; +import org.eclipse.emf.edit.ui.util.EditUIUtil; +import org.eclipse.emf.edit.ui.view.ExtendedPropertySheetPage; +import org.eclipse.jface.action.IMenuListener; +import org.eclipse.jface.action.IMenuManager; +import org.eclipse.jface.action.IStatusLineManager; +import org.eclipse.jface.action.IToolBarManager; +import org.eclipse.jface.action.MenuManager; +import org.eclipse.jface.action.Separator; +import org.eclipse.jface.dialogs.MessageDialog; +import org.eclipse.jface.dialogs.ProgressMonitorDialog; +import org.eclipse.jface.viewers.ColumnWeightData; +import org.eclipse.jface.viewers.ISelection; +import org.eclipse.jface.viewers.ISelectionChangedListener; +import org.eclipse.jface.viewers.ISelectionProvider; +import org.eclipse.jface.viewers.IStructuredSelection; +import org.eclipse.jface.viewers.ListViewer; +import org.eclipse.jface.viewers.SelectionChangedEvent; +import org.eclipse.jface.viewers.StructuredSelection; +import org.eclipse.jface.viewers.StructuredViewer; +import org.eclipse.jface.viewers.TableLayout; +import org.eclipse.jface.viewers.TableViewer; +import org.eclipse.jface.viewers.TreeViewer; +import org.eclipse.jface.viewers.Viewer; +import org.eclipse.sirius.tests.sample.component.design.ComponentDesignPlugin; +import org.eclipse.swt.SWT; +import org.eclipse.swt.custom.CTabFolder; +import org.eclipse.swt.dnd.DND; +import org.eclipse.swt.dnd.Transfer; +import org.eclipse.swt.events.ControlAdapter; +import org.eclipse.swt.events.ControlEvent; +import org.eclipse.swt.graphics.Point; +import org.eclipse.swt.layout.FillLayout; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Menu; +import org.eclipse.swt.widgets.Table; +import org.eclipse.swt.widgets.TableColumn; +import org.eclipse.swt.widgets.Tree; +import org.eclipse.swt.widgets.TreeColumn; +import org.eclipse.ui.IActionBars; +import org.eclipse.ui.IEditorInput; +import org.eclipse.ui.IEditorPart; +import org.eclipse.ui.IEditorSite; +import org.eclipse.ui.IPartListener; +import org.eclipse.ui.IWorkbenchPart; +import org.eclipse.ui.PartInitException; +import org.eclipse.ui.actions.WorkspaceModifyOperation; +import org.eclipse.ui.dialogs.SaveAsDialog; +import org.eclipse.ui.ide.IGotoMarker; +import org.eclipse.ui.part.FileEditorInput; +import org.eclipse.ui.part.MultiPageEditorPart; +import org.eclipse.ui.views.contentoutline.ContentOutline; +import org.eclipse.ui.views.contentoutline.ContentOutlinePage; +import org.eclipse.ui.views.contentoutline.IContentOutlinePage; +import org.eclipse.ui.views.properties.IPropertySheetPage; +import org.eclipse.ui.views.properties.PropertySheet; +import org.eclipse.ui.views.properties.PropertySheetPage; + +/** + * This is an example of a Component model editor. <!-- begin-user-doc --> <!-- + * end-user-doc --> + * + * @generated + */ +public class ComponentEditor extends MultiPageEditorPart implements IEditingDomainProvider, ISelectionProvider, IMenuListener, IViewerProvider, IGotoMarker { + /** + * This keeps track of the editing domain that is used to track all changes + * to the model. <!-- begin-user-doc --> <!-- end-user-doc --> + * + * @generated + */ + protected AdapterFactoryEditingDomain editingDomain; + + /** + * This is the one adapter factory used for providing views of the model. + * <!-- begin-user-doc --> <!-- end-user-doc --> + * + * @generated + */ + protected ComposedAdapterFactory adapterFactory; + + /** + * This is the content outline page. <!-- begin-user-doc --> <!-- + * end-user-doc --> + * + * @generated + */ + protected IContentOutlinePage contentOutlinePage; + + /** + * This is a kludge... <!-- begin-user-doc --> <!-- end-user-doc --> + * + * @generated + */ + protected IStatusLineManager contentOutlineStatusLineManager; + + /** + * This is the content outline page's viewer. <!-- begin-user-doc --> <!-- + * end-user-doc --> + * + * @generated + */ + protected TreeViewer contentOutlineViewer; + + /** + * This is the property sheet page. <!-- begin-user-doc --> <!-- + * end-user-doc --> + * + * @generated + */ + protected List<PropertySheetPage> propertySheetPages = new ArrayList<PropertySheetPage>(); + + /** + * This is the viewer that shadows the selection in the content outline. The + * parent relation must be correctly defined for this to work. <!-- + * begin-user-doc --> <!-- end-user-doc --> + * + * @generated + */ + protected TreeViewer selectionViewer; + + /** + * This inverts the roll of parent and child in the content provider and + * show parents as a tree. <!-- begin-user-doc --> <!-- end-user-doc --> + * + * @generated + */ + protected TreeViewer parentViewer; + + /** + * This shows how a tree view works. <!-- begin-user-doc --> <!-- + * end-user-doc --> + * + * @generated + */ + protected TreeViewer treeViewer; + + /** + * This shows how a list view works. A list viewer doesn't support icons. + * <!-- begin-user-doc --> <!-- end-user-doc --> + * + * @generated + */ + protected ListViewer listViewer; + + /** + * This shows how a table view works. A table can be used as a list with + * icons. <!-- begin-user-doc --> <!-- end-user-doc --> + * + * @generated + */ + protected TableViewer tableViewer; + + /** + * This shows how a tree view with columns works. <!-- begin-user-doc --> + * <!-- end-user-doc --> + * + * @generated + */ + protected TreeViewer treeViewerWithColumns; + + /** + * This keeps track of the active viewer pane, in the book. <!-- + * begin-user-doc --> <!-- end-user-doc --> + * + * @generated + */ + protected ViewerPane currentViewerPane; + + /** + * This keeps track of the active content viewer, which may be either one of + * the viewers in the pages or the content outline viewer. <!-- + * begin-user-doc --> <!-- end-user-doc --> + * + * @generated + */ + protected Viewer currentViewer; + + /** + * This listens to which ever viewer is active. <!-- begin-user-doc --> <!-- + * end-user-doc --> + * + * @generated + */ + protected ISelectionChangedListener selectionChangedListener; + + /** + * This keeps track of all the + * {@link org.eclipse.jface.viewers.ISelectionChangedListener}s that are + * listening to this editor. <!-- begin-user-doc --> <!-- end-user-doc --> + * + * @generated + */ + protected Collection<ISelectionChangedListener> selectionChangedListeners = new ArrayList<ISelectionChangedListener>(); + + /** + * This keeps track of the selection of the editor as a whole. <!-- + * begin-user-doc --> <!-- end-user-doc --> + * + * @generated + */ + protected ISelection editorSelection = StructuredSelection.EMPTY; + + /** + * The MarkerHelper is responsible for creating workspace resource markers + * presented in Eclipse's Problems View. <!-- begin-user-doc --> <!-- + * end-user-doc --> + * + * @generated + */ + protected MarkerHelper markerHelper = new EditUIMarkerHelper(); + + /** + * This listens for when the outline becomes active <!-- begin-user-doc --> + * <!-- end-user-doc --> + * + * @generated + */ + protected IPartListener partListener = new IPartListener() { + @Override + public void partActivated(IWorkbenchPart p) { + if (p instanceof ContentOutline) { + if (((ContentOutline) p).getCurrentPage() == contentOutlinePage) { + getActionBarContributor().setActiveEditor(ComponentEditor.this); + + setCurrentViewer(contentOutlineViewer); + } + } else if (p instanceof PropertySheet) { + if (propertySheetPages.contains(((PropertySheet) p).getCurrentPage())) { + getActionBarContributor().setActiveEditor(ComponentEditor.this); + handleActivate(); + } + } else if (p == ComponentEditor.this) { + handleActivate(); + } + } + + @Override + public void partBroughtToTop(IWorkbenchPart p) { + // Ignore. + } + + @Override + public void partClosed(IWorkbenchPart p) { + // Ignore. + } + + @Override + public void partDeactivated(IWorkbenchPart p) { + // Ignore. + } + + @Override + public void partOpened(IWorkbenchPart p) { + // Ignore. + } + }; + + /** + * Resources that have been removed since last activation. <!-- + * begin-user-doc --> <!-- end-user-doc --> + * + * @generated + */ + protected Collection<Resource> removedResources = new ArrayList<Resource>(); + + /** + * Resources that have been changed since last activation. <!-- + * begin-user-doc --> <!-- end-user-doc --> + * + * @generated + */ + protected Collection<Resource> changedResources = new ArrayList<Resource>(); + + /** + * Resources that have been saved. <!-- begin-user-doc --> <!-- end-user-doc + * --> + * + * @generated + */ + protected Collection<Resource> savedResources = new ArrayList<Resource>(); + + /** + * Map to store the diagnostic associated with a resource. <!-- + * begin-user-doc --> <!-- end-user-doc --> + * + * @generated + */ + protected Map<Resource, Diagnostic> resourceToDiagnosticMap = new LinkedHashMap<Resource, Diagnostic>(); + + /** + * Controls whether the problem indication should be updated. <!-- + * begin-user-doc --> <!-- end-user-doc --> + * + * @generated + */ + protected boolean updateProblemIndication = true; + + /** + * Adapter used to update the problem indication when resources are demanded + * loaded. <!-- begin-user-doc --> <!-- end-user-doc --> + * + * @generated + */ + protected EContentAdapter problemIndicationAdapter = new EContentAdapter() { + @Override + public void notifyChanged(Notification notification) { + if (notification.getNotifier() instanceof Resource) { + switch (notification.getFeatureID(Resource.class)) { + case Resource.RESOURCE__IS_LOADED: + case Resource.RESOURCE__ERRORS: + case Resource.RESOURCE__WARNINGS: { + Resource resource = (Resource) notification.getNotifier(); + Diagnostic diagnostic = analyzeResourceProblems(resource, null); + if (diagnostic.getSeverity() != Diagnostic.OK) { + resourceToDiagnosticMap.put(resource, diagnostic); + } else { + resourceToDiagnosticMap.remove(resource); + } + + if (updateProblemIndication) { + getSite().getShell().getDisplay().asyncExec(new Runnable() { + @Override + public void run() { + updateProblemIndication(); + } + }); + } + break; + } + } + } else { + super.notifyChanged(notification); + } + } + + @Override + protected void setTarget(Resource target) { + basicSetTarget(target); + } + + @Override + protected void unsetTarget(Resource target) { + basicUnsetTarget(target); + resourceToDiagnosticMap.remove(target); + if (updateProblemIndication) { + getSite().getShell().getDisplay().asyncExec(new Runnable() { + @Override + public void run() { + updateProblemIndication(); + } + }); + } + } + }; + + /** + * This listens for workspace changes. <!-- begin-user-doc --> <!-- + * end-user-doc --> + * + * @generated NOT + */ + protected IResourceChangeListener resourceChangeListener = new IResourceChangeListener() { + @Override + public void resourceChanged(IResourceChangeEvent event) { + IResourceDelta delta = event.getDelta(); + try { + class ResourceDeltaVisitor implements IResourceDeltaVisitor { + protected ResourceSet resourceSet = editingDomain.getResourceSet(); + + protected Collection<Resource> changedResources = new ArrayList<Resource>(); + + protected Collection<Resource> removedResources = new ArrayList<Resource>(); + + @Override + public boolean visit(IResourceDelta delta) { + if (delta.getResource().getType() == IResource.FILE) { + if (delta.getKind() == IResourceDelta.REMOVED || delta.getKind() == IResourceDelta.CHANGED && delta.getFlags() != IResourceDelta.MARKERS) { + Resource resource = resourceSet.getResource(URI.createPlatformResourceURI(delta.getFullPath().toString(), true), false); + if (resource != null) { + if (delta.getKind() == IResourceDelta.REMOVED) { + removedResources.add(resource); + } else if (!savedResources.remove(resource)) { + changedResources.add(resource); + } + } + } + return false; + } + + return true; + } + + public Collection<Resource> getChangedResources() { + return changedResources; + } + + public Collection<Resource> getRemovedResources() { + return removedResources; + } + } + + final ResourceDeltaVisitor visitor = new ResourceDeltaVisitor(); + delta.accept(visitor); + + if (!visitor.getRemovedResources().isEmpty()) { + getSite().getShell().getDisplay().asyncExec(new Runnable() { + @Override + public void run() { + removedResources.addAll(visitor.getRemovedResources()); + if (!isDirty()) { + getSite().getPage().closeEditor(ComponentEditor.this, false); + } + } + }); + } + + if (!visitor.getChangedResources().isEmpty()) { + getSite().getShell().getDisplay().asyncExec(new Runnable() { + @Override + public void run() { + changedResources.addAll(visitor.getChangedResources()); + if (getSite().getPage().getActiveEditor() == ComponentEditor.this) { + handleActivate(); + } + } + }); + } + } catch (CoreException exception) { + ComponentDesignPlugin.INSTANCE.log(exception); + } + } + }; + + /** + * Handles activation of the editor or it's associated views. <!-- + * begin-user-doc --> <!-- end-user-doc --> + * + * @generated + */ + protected void handleActivate() { + // Recompute the read only state. + // + if (editingDomain.getResourceToReadOnlyMap() != null) { + editingDomain.getResourceToReadOnlyMap().clear(); + + // Refresh any actions that may become enabled or disabled. + // + setSelection(getSelection()); + } + + if (!removedResources.isEmpty()) { + if (handleDirtyConflict()) { + getSite().getPage().closeEditor(ComponentEditor.this, false); + } else { + removedResources.clear(); + changedResources.clear(); + savedResources.clear(); + } + } else if (!changedResources.isEmpty()) { + changedResources.removeAll(savedResources); + handleChangedResources(); + changedResources.clear(); + savedResources.clear(); + } + } + + /** + * Handles what to do with changed resources on activation. <!-- + * begin-user-doc --> <!-- end-user-doc --> + * + * @generated + */ + protected void handleChangedResources() { + if (!changedResources.isEmpty() && (!isDirty() || handleDirtyConflict())) { + if (isDirty()) { + changedResources.addAll(editingDomain.getResourceSet().getResources()); + } + editingDomain.getCommandStack().flush(); + + updateProblemIndication = false; + for (Resource resource : changedResources) { + if (resource.isLoaded()) { + resource.unload(); + try { + resource.load(Collections.EMPTY_MAP); + } catch (IOException exception) { + if (!resourceToDiagnosticMap.containsKey(resource)) { + resourceToDiagnosticMap.put(resource, analyzeResourceProblems(resource, exception)); + } + } + } + } + + if (AdapterFactoryEditingDomain.isStale(editorSelection)) { + setSelection(StructuredSelection.EMPTY); + } + + updateProblemIndication = true; + updateProblemIndication(); + } + } + + /** + * Updates the problems indication with the information described in the + * specified diagnostic. <!-- begin-user-doc --> <!-- end-user-doc --> + * + * @generated NOT + */ + protected void updateProblemIndication() { + if (updateProblemIndication) { + BasicDiagnostic diagnostic = new BasicDiagnostic(Diagnostic.OK, "org.eclipse.sirius.tests.sample.component.design", 0, null, new Object[] { editingDomain.getResourceSet() }); + for (Diagnostic childDiagnostic : resourceToDiagnosticMap.values()) { + if (childDiagnostic.getSeverity() != Diagnostic.OK) { + diagnostic.add(childDiagnostic); + } + } + + int lastEditorPage = getPageCount() - 1; + if (lastEditorPage >= 0 && getEditor(lastEditorPage) instanceof ProblemEditorPart) { + ((ProblemEditorPart) getEditor(lastEditorPage)).setDiagnostic(diagnostic); + if (diagnostic.getSeverity() != Diagnostic.OK) { + setActivePage(lastEditorPage); + } + } else if (diagnostic.getSeverity() != Diagnostic.OK) { + ProblemEditorPart problemEditorPart = new ProblemEditorPart(); + problemEditorPart.setDiagnostic(diagnostic); + problemEditorPart.setMarkerHelper(markerHelper); + try { + addPage(++lastEditorPage, problemEditorPart, getEditorInput()); + setPageText(lastEditorPage, problemEditorPart.getPartName()); + setActivePage(lastEditorPage); + showTabs(); + } catch (PartInitException exception) { + ComponentDesignPlugin.INSTANCE.log(exception); + } + } + + if (markerHelper.hasMarkers(editingDomain.getResourceSet())) { + markerHelper.deleteMarkers(editingDomain.getResourceSet()); + if (diagnostic.getSeverity() != Diagnostic.OK) { + try { + markerHelper.createMarkers(diagnostic); + } catch (CoreException exception) { + ComponentDesignPlugin.INSTANCE.log(exception); + } + } + } + } + } + + /** + * Shows a dialog that asks if conflicting changes should be discarded. <!-- + * begin-user-doc --> <!-- end-user-doc --> + * + * @generated + */ + protected boolean handleDirtyConflict() { + return MessageDialog.openQuestion(getSite().getShell(), getString("_UI_FileConflict_label"), getString("_WARN_FileConflict")); + } + + /** + * This creates a model editor. <!-- begin-user-doc --> <!-- end-user-doc + * --> + * + * @generated + */ + public ComponentEditor() { + super(); + initializeEditingDomain(); + } + + /** + * This sets up the editing domain for the model editor. <!-- begin-user-doc + * --> <!-- end-user-doc --> + * + * @generated NOT + */ + protected void initializeEditingDomain() { + // Create an adapter factory that yields item providers. + // + adapterFactory = new ComposedAdapterFactory(ComposedAdapterFactory.Descriptor.Registry.INSTANCE); + + adapterFactory.addAdapterFactory(new ResourceItemProviderAdapterFactory()); + adapterFactory.addAdapterFactory(new ReflectiveItemProviderAdapterFactory()); + + // Create the command stack that will notify this editor as commands are + // executed. + // + BasicCommandStack commandStack = new BasicCommandStack(); + + // Add a listener to set the most recent command's affected objects to + // be the selection of the viewer with focus. + // + commandStack.addCommandStackListener(new CommandStackListener() { + @Override + public void commandStackChanged(final EventObject event) { + getContainer().getDisplay().asyncExec(new Runnable() { + @Override + public void run() { + firePropertyChange(IEditorPart.PROP_DIRTY); + + // Try to select the affected objects. + // + Command mostRecentCommand = ((CommandStack) event.getSource()).getMostRecentCommand(); + if (mostRecentCommand != null) { + setSelectionToViewer(mostRecentCommand.getAffectedObjects()); + } + for (Iterator<PropertySheetPage> i = propertySheetPages.iterator(); i.hasNext();) { + PropertySheetPage propertySheetPage = i.next(); + if (propertySheetPage.getControl().isDisposed()) { + i.remove(); + } else { + propertySheetPage.refresh(); + } + } + } + }); + } + }); + + // Create the editing domain with a special command stack. + // + editingDomain = new AdapterFactoryEditingDomain(adapterFactory, commandStack, new HashMap<Resource, Boolean>()); + } + + /** + * This is here for the listener to be able to call it. <!-- begin-user-doc + * --> <!-- end-user-doc --> + * + * @generated + */ + @Override + protected void firePropertyChange(int action) { + super.firePropertyChange(action); + } + + /** + * This sets the selection into whichever viewer is active. <!-- + * begin-user-doc --> <!-- end-user-doc --> + * + * @generated + */ + public void setSelectionToViewer(Collection<?> collection) { + final Collection<?> theSelection = collection; + // Make sure it's okay. + // + if (theSelection != null && !theSelection.isEmpty()) { + Runnable runnable = new Runnable() { + @Override + public void run() { + // Try to select the items in the current content viewer of + // the editor. + // + if (currentViewer != null) { + currentViewer.setSelection(new StructuredSelection(theSelection.toArray()), true); + } + } + }; + getSite().getShell().getDisplay().asyncExec(runnable); + } + } + + /** + * This returns the editing domain as required by the + * {@link IEditingDomainProvider} interface. This is important for + * implementing the static methods of {@link AdapterFactoryEditingDomain} + * and for supporting {@link org.eclipse.emf.edit.ui.action.CommandAction}. + * <!-- begin-user-doc --> <!-- end-user-doc --> + * + * @generated + */ + @Override + public EditingDomain getEditingDomain() { + return editingDomain; + } + + /** + * <!-- begin-user-doc --> <!-- end-user-doc --> + * + * @generated + */ + public class ReverseAdapterFactoryContentProvider extends AdapterFactoryContentProvider { + /** + * <!-- begin-user-doc --> <!-- end-user-doc --> + * + * @generated + */ + public ReverseAdapterFactoryContentProvider(AdapterFactory adapterFactory) { + super(adapterFactory); + } + + /** + * <!-- begin-user-doc --> <!-- end-user-doc --> + * + * @generated + */ + @Override + public Object[] getElements(Object object) { + Object parent = super.getParent(object); + return (parent == null ? Collections.EMPTY_SET : Collections.singleton(parent)).toArray(); + } + + /** + * <!-- begin-user-doc --> <!-- end-user-doc --> + * + * @generated + */ + @Override + public Object[] getChildren(Object object) { + Object parent = super.getParent(object); + return (parent == null ? Collections.EMPTY_SET : Collections.singleton(parent)).toArray(); + } + + /** + * <!-- begin-user-doc --> <!-- end-user-doc --> + * + * @generated + */ + @Override + public boolean hasChildren(Object object) { + Object parent = super.getParent(object); + return parent != null; + } + + /** + * <!-- begin-user-doc --> <!-- end-user-doc --> + * + * @generated + */ + @Override + public Object getParent(Object object) { + return null; + } + } + + /** + * <!-- begin-user-doc --> <!-- end-user-doc --> + * + * @generated + */ + public void setCurrentViewerPane(ViewerPane viewerPane) { + if (currentViewerPane != viewerPane) { + if (currentViewerPane != null) { + currentViewerPane.showFocus(false); + } + currentViewerPane = viewerPane; + } + setCurrentViewer(currentViewerPane.getViewer()); + } + + /** + * This makes sure that one content viewer, either for the current page or + * the outline view, if it has focus, is the current one. <!-- + * begin-user-doc --> <!-- end-user-doc --> + * + * @generated + */ + public void setCurrentViewer(Viewer viewer) { + // If it is changing... + // + if (currentViewer != viewer) { + if (selectionChangedListener == null) { + // Create the listener on demand. + // + selectionChangedListener = new ISelectionChangedListener() { + // This just notifies those things that are affected by the + // section. + // + @Override + public void selectionChanged(SelectionChangedEvent selectionChangedEvent) { + setSelection(selectionChangedEvent.getSelection()); + } + }; + } + + // Stop listening to the old one. + // + if (currentViewer != null) { + currentViewer.removeSelectionChangedListener(selectionChangedListener); + } + + // Start listening to the new one. + // + if (viewer != null) { + viewer.addSelectionChangedListener(selectionChangedListener); + } + + // Remember it. + // + currentViewer = viewer; + + // Set the editors selection based on the current viewer's + // selection. + // + setSelection(currentViewer == null ? StructuredSelection.EMPTY : currentViewer.getSelection()); + } + } + + /** + * This returns the viewer as required by the {@link IViewerProvider} + * interface. <!-- begin-user-doc --> <!-- end-user-doc --> + * + * @generated + */ + @Override + public Viewer getViewer() { + return currentViewer; + } + + /** + * This creates a context menu for the viewer and adds a listener as well + * registering the menu for extension. <!-- begin-user-doc --> <!-- + * end-user-doc --> + * + * @generated + */ + protected void createContextMenuFor(StructuredViewer viewer) { + MenuManager contextMenu = new MenuManager("#PopUp"); + contextMenu.add(new Separator("additions")); + contextMenu.setRemoveAllWhenShown(true); + contextMenu.addMenuListener(this); + Menu menu = contextMenu.createContextMenu(viewer.getControl()); + viewer.getControl().setMenu(menu); + getSite().registerContextMenu(contextMenu, new UnwrappingSelectionProvider(viewer)); + + int dndOperations = DND.DROP_COPY | DND.DROP_MOVE | DND.DROP_LINK; + Transfer[] transfers = new Transfer[] { LocalTransfer.getInstance() }; + viewer.addDragSupport(dndOperations, transfers, new ViewerDragAdapter(viewer)); + viewer.addDropSupport(dndOperations, transfers, new EditingDomainViewerDropAdapter(editingDomain, viewer)); + } + + /** + * This is the method called to load a resource into the editing domain's + * resource set based on the editor's input. <!-- begin-user-doc --> <!-- + * end-user-doc --> + * + * @generated + */ + public void createModel() { + URI resourceURI = EditUIUtil.getURI(getEditorInput()); + Exception exception = null; + Resource resource = null; + try { + // Load the resource through the editing domain. + // + resource = editingDomain.getResourceSet().getResource(resourceURI, true); + } catch (Exception e) { + exception = e; + resource = editingDomain.getResourceSet().getResource(resourceURI, false); + } + + Diagnostic diagnostic = analyzeResourceProblems(resource, exception); + if (diagnostic.getSeverity() != Diagnostic.OK) { + resourceToDiagnosticMap.put(resource, analyzeResourceProblems(resource, exception)); + } + editingDomain.getResourceSet().eAdapters().add(problemIndicationAdapter); + } + + /** + * Returns a diagnostic describing the errors and warnings listed in the + * resource and the specified exception (if any). <!-- begin-user-doc --> + * <!-- end-user-doc --> + * + * @generated + */ + public Diagnostic analyzeResourceProblems(Resource resource, Exception exception) { + if (!resource.getErrors().isEmpty() || !resource.getWarnings().isEmpty()) { + BasicDiagnostic basicDiagnostic = new BasicDiagnostic(Diagnostic.ERROR, "org.eclipse.sirius.tests.sample.component.design", 0, + getString("_UI_CreateModelError_message", resource.getURI()), new Object[] { exception == null ? (Object) resource : exception }); + basicDiagnostic.merge(EcoreUtil.computeDiagnostic(resource, true)); + return basicDiagnostic; + } else if (exception != null) { + return new BasicDiagnostic(Diagnostic.ERROR, "org.eclipse.sirius.tests.sample.component.design", 0, getString("_UI_CreateModelError_message", resource.getURI()), + new Object[] { exception }); + } else { + return Diagnostic.OK_INSTANCE; + } + } + + /** + * This is the method used by the framework to install your own controls. + * <!-- begin-user-doc --> <!-- end-user-doc --> + * + * @generated + */ + @Override + public void createPages() { + // Creates the model from the editor input + // + createModel(); + + // Only creates the other pages if there is something that can be edited + // + if (!getEditingDomain().getResourceSet().getResources().isEmpty()) { + // Create a page for the selection tree view. + // + { + ViewerPane viewerPane = new ViewerPane(getSite().getPage(), ComponentEditor.this) { + @Override + public Viewer createViewer(Composite composite) { + Tree tree = new Tree(composite, SWT.MULTI); + TreeViewer newTreeViewer = new TreeViewer(tree); + return newTreeViewer; + } + + @Override + public void requestActivation() { + super.requestActivation(); + setCurrentViewerPane(this); + } + }; + viewerPane.createControl(getContainer()); + + selectionViewer = (TreeViewer) viewerPane.getViewer(); + selectionViewer.setContentProvider(new AdapterFactoryContentProvider(adapterFactory)); + + selectionViewer.setLabelProvider(new AdapterFactoryLabelProvider(adapterFactory)); + selectionViewer.setInput(editingDomain.getResourceSet()); + selectionViewer.setSelection(new StructuredSelection(editingDomain.getResourceSet().getResources().get(0)), true); + viewerPane.setTitle(editingDomain.getResourceSet()); + + new AdapterFactoryTreeEditor(selectionViewer.getTree(), adapterFactory); + + createContextMenuFor(selectionViewer); + int pageIndex = addPage(viewerPane.getControl()); + setPageText(pageIndex, getString("_UI_SelectionPage_label")); + } + + // Create a page for the parent tree view. + // + { + ViewerPane viewerPane = new ViewerPane(getSite().getPage(), ComponentEditor.this) { + @Override + public Viewer createViewer(Composite composite) { + Tree tree = new Tree(composite, SWT.MULTI); + TreeViewer newTreeViewer = new TreeViewer(tree); + return newTreeViewer; + } + + @Override + public void requestActivation() { + super.requestActivation(); + setCurrentViewerPane(this); + } + }; + viewerPane.createControl(getContainer()); + + parentViewer = (TreeViewer) viewerPane.getViewer(); + parentViewer.setAutoExpandLevel(30); + parentViewer.setContentProvider(new ReverseAdapterFactoryContentProvider(adapterFactory)); + parentViewer.setLabelProvider(new AdapterFactoryLabelProvider(adapterFactory)); + + createContextMenuFor(parentViewer); + int pageIndex = addPage(viewerPane.getControl()); + setPageText(pageIndex, getString("_UI_ParentPage_label")); + } + + // This is the page for the list viewer + // + { + ViewerPane viewerPane = new ViewerPane(getSite().getPage(), ComponentEditor.this) { + @Override + public Viewer createViewer(Composite composite) { + return new ListViewer(composite); + } + + @Override + public void requestActivation() { + super.requestActivation(); + setCurrentViewerPane(this); + } + }; + viewerPane.createControl(getContainer()); + listViewer = (ListViewer) viewerPane.getViewer(); + listViewer.setContentProvider(new AdapterFactoryContentProvider(adapterFactory)); + listViewer.setLabelProvider(new AdapterFactoryLabelProvider(adapterFactory)); + + createContextMenuFor(listViewer); + int pageIndex = addPage(viewerPane.getControl()); + setPageText(pageIndex, getString("_UI_ListPage_label")); + } + + // This is the page for the tree viewer + // + { + ViewerPane viewerPane = new ViewerPane(getSite().getPage(), ComponentEditor.this) { + @Override + public Viewer createViewer(Composite composite) { + return new TreeViewer(composite); + } + + @Override + public void requestActivation() { + super.requestActivation(); + setCurrentViewerPane(this); + } + }; + viewerPane.createControl(getContainer()); + treeViewer = (TreeViewer) viewerPane.getViewer(); + treeViewer.setContentProvider(new AdapterFactoryContentProvider(adapterFactory)); + treeViewer.setLabelProvider(new AdapterFactoryLabelProvider(adapterFactory)); + + new AdapterFactoryTreeEditor(treeViewer.getTree(), adapterFactory); + + createContextMenuFor(treeViewer); + int pageIndex = addPage(viewerPane.getControl()); + setPageText(pageIndex, getString("_UI_TreePage_label")); + } + + // This is the page for the table viewer. + // + { + ViewerPane viewerPane = new ViewerPane(getSite().getPage(), ComponentEditor.this) { + @Override + public Viewer createViewer(Composite composite) { + return new TableViewer(composite); + } + + @Override + public void requestActivation() { + super.requestActivation(); + setCurrentViewerPane(this); + } + }; + viewerPane.createControl(getContainer()); + tableViewer = (TableViewer) viewerPane.getViewer(); + + Table table = tableViewer.getTable(); + TableLayout layout = new TableLayout(); + table.setLayout(layout); + table.setHeaderVisible(true); + table.setLinesVisible(true); + + TableColumn objectColumn = new TableColumn(table, SWT.NONE); + layout.addColumnData(new ColumnWeightData(3, 100, true)); + objectColumn.setText(getString("_UI_ObjectColumn_label")); + objectColumn.setResizable(true); + + TableColumn selfColumn = new TableColumn(table, SWT.NONE); + layout.addColumnData(new ColumnWeightData(2, 100, true)); + selfColumn.setText(getString("_UI_SelfColumn_label")); + selfColumn.setResizable(true); + + tableViewer.setColumnProperties(new String[] { "a", "b" }); + tableViewer.setContentProvider(new AdapterFactoryContentProvider(adapterFactory)); + tableViewer.setLabelProvider(new AdapterFactoryLabelProvider(adapterFactory)); + + createContextMenuFor(tableViewer); + int pageIndex = addPage(viewerPane.getControl()); + setPageText(pageIndex, getString("_UI_TablePage_label")); + } + + // This is the page for the table tree viewer. + // + { + ViewerPane viewerPane = new ViewerPane(getSite().getPage(), ComponentEditor.this) { + @Override + public Viewer createViewer(Composite composite) { + return new TreeViewer(composite); + } + + @Override + public void requestActivation() { + super.requestActivation(); + setCurrentViewerPane(this); + } + }; + viewerPane.createControl(getContainer()); + + treeViewerWithColumns = (TreeViewer) viewerPane.getViewer(); + + Tree tree = treeViewerWithColumns.getTree(); + tree.setLayoutData(new FillLayout()); + tree.setHeaderVisible(true); + tree.setLinesVisible(true); + + TreeColumn objectColumn = new TreeColumn(tree, SWT.NONE); + objectColumn.setText(getString("_UI_ObjectColumn_label")); + objectColumn.setResizable(true); + objectColumn.setWidth(250); + + TreeColumn selfColumn = new TreeColumn(tree, SWT.NONE); + selfColumn.setText(getString("_UI_SelfColumn_label")); + selfColumn.setResizable(true); + selfColumn.setWidth(200); + + treeViewerWithColumns.setColumnProperties(new String[] { "a", "b" }); + treeViewerWithColumns.setContentProvider(new AdapterFactoryContentProvider(adapterFactory)); + treeViewerWithColumns.setLabelProvider(new AdapterFactoryLabelProvider(adapterFactory)); + + createContextMenuFor(treeViewerWithColumns); + int pageIndex = addPage(viewerPane.getControl()); + setPageText(pageIndex, getString("_UI_TreeWithColumnsPage_label")); + } + + getSite().getShell().getDisplay().asyncExec(new Runnable() { + @Override + public void run() { + setActivePage(0); + } + }); + } + + // Ensures that this editor will only display the page's tab + // area if there are more than one page + // + getContainer().addControlListener(new ControlAdapter() { + boolean guard = false; + + @Override + public void controlResized(ControlEvent event) { + if (!guard) { + guard = true; + hideTabs(); + guard = false; + } + } + }); + + getSite().getShell().getDisplay().asyncExec(new Runnable() { + @Override + public void run() { + updateProblemIndication(); + } + }); + } + + /** + * If there is just one page in the multi-page editor part, this hides the + * single tab at the bottom. <!-- begin-user-doc --> <!-- end-user-doc --> + * + * @generated + */ + protected void hideTabs() { + if (getPageCount() <= 1) { + setPageText(0, ""); + if (getContainer() instanceof CTabFolder) { + ((CTabFolder) getContainer()).setTabHeight(1); + Point point = getContainer().getSize(); + getContainer().setSize(point.x, point.y + 6); + } + } + } + + /** + * If there is more than one page in the multi-page editor part, this shows + * the tabs at the bottom. <!-- begin-user-doc --> <!-- end-user-doc --> + * + * @generated + */ + protected void showTabs() { + if (getPageCount() > 1) { + setPageText(0, getString("_UI_SelectionPage_label")); + if (getContainer() instanceof CTabFolder) { + ((CTabFolder) getContainer()).setTabHeight(SWT.DEFAULT); + Point point = getContainer().getSize(); + getContainer().setSize(point.x, point.y - 6); + } + } + } + + /** + * This is used to track the active viewer. <!-- begin-user-doc --> <!-- + * end-user-doc --> + * + * @generated + */ + @Override + protected void pageChange(int pageIndex) { + super.pageChange(pageIndex); + + if (contentOutlinePage != null) { + handleContentOutlineSelection(contentOutlinePage.getSelection()); + } + } + + /** + * This is how the framework determines which interfaces we implement. <!-- + * begin-user-doc --> <!-- end-user-doc --> + * + * @generated + */ + @SuppressWarnings("rawtypes") + @Override + public Object getAdapter(Class key) { + if (key.equals(IContentOutlinePage.class)) { + return showOutlineView() ? getContentOutlinePage() : null; + } else if (key.equals(IPropertySheetPage.class)) { + return getPropertySheetPage(); + } else if (key.equals(IGotoMarker.class)) { + return this; + } else { + return super.getAdapter(key); + } + } + + /** + * This accesses a cached version of the content outliner. <!-- + * begin-user-doc --> <!-- end-user-doc --> + * + * @generated + */ + public IContentOutlinePage getContentOutlinePage() { + if (contentOutlinePage == null) { + // The content outline is just a tree. + // + class MyContentOutlinePage extends ContentOutlinePage { + @Override + public void createControl(Composite parent) { + super.createControl(parent); + contentOutlineViewer = getTreeViewer(); + contentOutlineViewer.addSelectionChangedListener(this); + + // Set up the tree viewer. + // + contentOutlineViewer.setContentProvider(new AdapterFactoryContentProvider(adapterFactory)); + contentOutlineViewer.setLabelProvider(new AdapterFactoryLabelProvider(adapterFactory)); + contentOutlineViewer.setInput(editingDomain.getResourceSet()); + + // Make sure our popups work. + // + createContextMenuFor(contentOutlineViewer); + + if (!editingDomain.getResourceSet().getResources().isEmpty()) { + // Select the root object in the view. + // + contentOutlineViewer.setSelection(new StructuredSelection(editingDomain.getResourceSet().getResources().get(0)), true); + } + } + + @Override + public void makeContributions(IMenuManager menuManager, IToolBarManager toolBarManager, IStatusLineManager statusLineManager) { + super.makeContributions(menuManager, toolBarManager, statusLineManager); + contentOutlineStatusLineManager = statusLineManager; + } + + @Override + public void setActionBars(IActionBars actionBars) { + super.setActionBars(actionBars); + getActionBarContributor().shareGlobalActions(this, actionBars); + } + } + + contentOutlinePage = new MyContentOutlinePage(); + + // Listen to selection so that we can handle it is a special way. + // + contentOutlinePage.addSelectionChangedListener(new ISelectionChangedListener() { + // This ensures that we handle selections correctly. + // + @Override + public void selectionChanged(SelectionChangedEvent event) { + handleContentOutlineSelection(event.getSelection()); + } + }); + } + + return contentOutlinePage; + } + + /** + * This accesses a cached version of the property sheet. <!-- begin-user-doc + * --> <!-- end-user-doc --> + * + * @generated + */ + public IPropertySheetPage getPropertySheetPage() { + PropertySheetPage propertySheetPage = new ExtendedPropertySheetPage(editingDomain) { + @Override + public void setSelectionToViewer(List<?> selection) { + ComponentEditor.this.setSelectionToViewer(selection); + ComponentEditor.this.setFocus(); + } + + @Override + public void setActionBars(IActionBars actionBars) { + super.setActionBars(actionBars); + getActionBarContributor().shareGlobalActions(this, actionBars); + } + }; + propertySheetPage.setPropertySourceProvider(new AdapterFactoryContentProvider(adapterFactory)); + propertySheetPages.add(propertySheetPage); + + return propertySheetPage; + } + + /** + * This deals with how we want selection in the outliner to affect the other + * views. <!-- begin-user-doc --> <!-- end-user-doc --> + * + * @generated + */ + public void handleContentOutlineSelection(ISelection selection) { + if (currentViewerPane != null && !selection.isEmpty() && selection instanceof IStructuredSelection) { + Iterator<?> selectedElements = ((IStructuredSelection) selection).iterator(); + if (selectedElements.hasNext()) { + // Get the first selected element. + // + Object selectedElement = selectedElements.next(); + + // If it's the selection viewer, then we want it to select the + // same selection as this selection. + // + if (currentViewerPane.getViewer() == selectionViewer) { + ArrayList<Object> selectionList = new ArrayList<Object>(); + selectionList.add(selectedElement); + while (selectedElements.hasNext()) { + selectionList.add(selectedElements.next()); + } + + // Set the selection to the widget. + // + selectionViewer.setSelection(new StructuredSelection(selectionList)); + } else { + // Set the input to the widget. + // + if (currentViewerPane.getViewer().getInput() != selectedElement) { + currentViewerPane.getViewer().setInput(selectedElement); + currentViewerPane.setTitle(selectedElement); + } + } + } + } + } + + /** + * This is for implementing {@link IEditorPart} and simply tests the command + * stack. <!-- begin-user-doc --> <!-- end-user-doc --> + * + * @generated + */ + @Override + public boolean isDirty() { + return ((BasicCommandStack) editingDomain.getCommandStack()).isSaveNeeded(); + } + + /** + * This is for implementing {@link IEditorPart} and simply saves the model + * file. <!-- begin-user-doc --> <!-- end-user-doc --> + * + * @generated NOT + */ + @Override + public void doSave(IProgressMonitor progressMonitor) { + // Save only resources that have actually changed. + // + final Map<Object, Object> saveOptions = new HashMap<Object, Object>(); + saveOptions.put(Resource.OPTION_SAVE_ONLY_IF_CHANGED, Resource.OPTION_SAVE_ONLY_IF_CHANGED_MEMORY_BUFFER); + + // Do the work within an operation because this is a long running + // activity that modifies the workbench. + // + WorkspaceModifyOperation operation = new WorkspaceModifyOperation() { + // This is the method that gets invoked when the operation runs. + // + @Override + public void execute(IProgressMonitor monitor) { + // Save the resources to the file system. + // + boolean first = true; + for (Resource resource : editingDomain.getResourceSet().getResources()) { + if ((first || !resource.getContents().isEmpty() || isPersisted(resource)) && !editingDomain.isReadOnly(resource)) { + try { + long timeStamp = resource.getTimeStamp(); + resource.save(saveOptions); + if (resource.getTimeStamp() != timeStamp) { + savedResources.add(resource); + } + } catch (Exception exception) { + resourceToDiagnosticMap.put(resource, analyzeResourceProblems(resource, exception)); + } + first = false; + } + } + } + }; + + updateProblemIndication = false; + try { + // This runs the options, and shows progress. + // + new ProgressMonitorDialog(getSite().getShell()).run(true, false, operation); + + // Refresh the necessary state. + // + ((BasicCommandStack) editingDomain.getCommandStack()).saveIsDone(); + firePropertyChange(IEditorPart.PROP_DIRTY); + } catch (Exception exception) { + // Something went wrong that shouldn't. + // + ComponentDesignPlugin.INSTANCE.log(exception); + } + updateProblemIndication = true; + updateProblemIndication(); + } + + /** + * This returns whether something has been persisted to the URI of the + * specified resource. The implementation uses the URI converter from the + * editor's resource set to try to open an input stream. <!-- begin-user-doc + * --> <!-- end-user-doc --> + * + * @generated + */ + protected boolean isPersisted(Resource resource) { + boolean result = false; + try { + InputStream stream = editingDomain.getResourceSet().getURIConverter().createInputStream(resource.getURI()); + if (stream != null) { + result = true; + stream.close(); + } + } catch (IOException e) { + // Ignore + } + return result; + } + + /** + * This always returns true because it is not currently supported. <!-- + * begin-user-doc --> <!-- end-user-doc --> + * + * @generated + */ + @Override + public boolean isSaveAsAllowed() { + return true; + } + + /** + * This also changes the editor's input. <!-- begin-user-doc --> <!-- + * end-user-doc --> + * + * @generated + */ + @Override + public void doSaveAs() { + SaveAsDialog saveAsDialog = new SaveAsDialog(getSite().getShell()); + saveAsDialog.open(); + IPath path = saveAsDialog.getResult(); + if (path != null) { + IFile file = ResourcesPlugin.getWorkspace().getRoot().getFile(path); + if (file != null) { + doSaveAs(URI.createPlatformResourceURI(file.getFullPath().toString(), true), new FileEditorInput(file)); + } + } + } + + /** + * <!-- begin-user-doc --> <!-- end-user-doc --> + * + * @generated + */ + protected void doSaveAs(URI uri, IEditorInput editorInput) { + (editingDomain.getResourceSet().getResources().get(0)).setURI(uri); + setInputWithNotify(editorInput); + setPartName(editorInput.getName()); + IProgressMonitor progressMonitor = getActionBars().getStatusLineManager() != null ? getActionBars().getStatusLineManager().getProgressMonitor() : new NullProgressMonitor(); + doSave(progressMonitor); + } + + /** + * <!-- begin-user-doc --> <!-- end-user-doc --> + * + * @generated + */ + @Override + public void gotoMarker(IMarker marker) { + List<?> targetObjects = markerHelper.getTargetObjects(editingDomain, marker); + if (!targetObjects.isEmpty()) { + setSelectionToViewer(targetObjects); + } + } + + /** + * This is called during startup. <!-- begin-user-doc --> <!-- end-user-doc + * --> + * + * @generated + */ + @Override + public void init(IEditorSite site, IEditorInput editorInput) { + setSite(site); + setInputWithNotify(editorInput); + setPartName(editorInput.getName()); + site.setSelectionProvider(this); + site.getPage().addPartListener(partListener); + ResourcesPlugin.getWorkspace().addResourceChangeListener(resourceChangeListener, IResourceChangeEvent.POST_CHANGE); + } + + /** + * <!-- begin-user-doc --> <!-- end-user-doc --> + * + * @generated + */ + @Override + public void setFocus() { + if (currentViewerPane != null) { + currentViewerPane.setFocus(); + } else { + getControl(getActivePage()).setFocus(); + } + } + + /** + * This implements {@link org.eclipse.jface.viewers.ISelectionProvider}. + * <!-- begin-user-doc --> <!-- end-user-doc --> + * + * @generated + */ + @Override + public void addSelectionChangedListener(ISelectionChangedListener listener) { + selectionChangedListeners.add(listener); + } + + /** + * This implements {@link org.eclipse.jface.viewers.ISelectionProvider}. + * <!-- begin-user-doc --> <!-- end-user-doc --> + * + * @generated + */ + @Override + public void removeSelectionChangedListener(ISelectionChangedListener listener) { + selectionChangedListeners.remove(listener); + } + + /** + * This implements {@link org.eclipse.jface.viewers.ISelectionProvider} to + * return this editor's overall selection. <!-- begin-user-doc --> <!-- + * end-user-doc --> + * + * @generated + */ + @Override + public ISelection getSelection() { + return editorSelection; + } + + /** + * This implements {@link org.eclipse.jface.viewers.ISelectionProvider} to + * set this editor's overall selection. Calling this result will notify the + * listeners. <!-- begin-user-doc --> <!-- end-user-doc --> + * + * @generated + */ + @Override + public void setSelection(ISelection selection) { + editorSelection = selection; + + for (ISelectionChangedListener listener : selectionChangedListeners) { + listener.selectionChanged(new SelectionChangedEvent(this, selection)); + } + setStatusLineManager(selection); + } + + /** + * <!-- begin-user-doc --> <!-- end-user-doc --> + * + * @generated + */ + public void setStatusLineManager(ISelection selection) { + IStatusLineManager statusLineManager = currentViewer != null && currentViewer == contentOutlineViewer ? contentOutlineStatusLineManager : getActionBars().getStatusLineManager(); + + if (statusLineManager != null) { + if (selection instanceof IStructuredSelection) { + Collection<?> collection = ((IStructuredSelection) selection).toList(); + switch (collection.size()) { + case 0: { + statusLineManager.setMessage(getString("_UI_NoObjectSelected")); + break; + } + case 1: { + String text = new AdapterFactoryItemDelegator(adapterFactory).getText(collection.iterator().next()); + statusLineManager.setMessage(getString("_UI_SingleObjectSelected", text)); + break; + } + default: { + statusLineManager.setMessage(getString("_UI_MultiObjectSelected", Integer.toString(collection.size()))); + break; + } + } + } else { + statusLineManager.setMessage(""); + } + } + } + + /** + * This looks up a string in the plugin's plugin.properties file. <!-- + * begin-user-doc --> <!-- end-user-doc --> + * + * @generated NOT + */ + private static String getString(String key) { + return ComponentDesignPlugin.INSTANCE.getString(key); + } + + /** + * This looks up a string in plugin.properties, making a substitution. <!-- + * begin-user-doc --> <!-- end-user-doc --> + * + * @generated NOT + */ + private static String getString(String key, Object s1) { + return ComponentDesignPlugin.INSTANCE.getString(key, new Object[] { s1 }); + } + + /** + * This implements {@link org.eclipse.jface.action.IMenuListener} to help + * fill the context menus with contributions from the Edit menu. <!-- + * begin-user-doc --> <!-- end-user-doc --> + * + * @generated + */ + @Override + public void menuAboutToShow(IMenuManager menuManager) { + ((IMenuListener) getEditorSite().getActionBarContributor()).menuAboutToShow(menuManager); + } + + /** + * <!-- begin-user-doc --> <!-- end-user-doc --> + * + * @generated + */ + public EditingDomainActionBarContributor getActionBarContributor() { + return (EditingDomainActionBarContributor) getEditorSite().getActionBarContributor(); + } + + /** + * <!-- begin-user-doc --> <!-- end-user-doc --> + * + * @generated + */ + public IActionBars getActionBars() { + return getActionBarContributor().getActionBars(); + } + + /** + * <!-- begin-user-doc --> <!-- end-user-doc --> + * + * @generated + */ + public AdapterFactory getAdapterFactory() { + return adapterFactory; + } + + /** + * <!-- begin-user-doc --> <!-- end-user-doc --> + * + * @generated + */ + @Override + public void dispose() { + updateProblemIndication = false; + + ResourcesPlugin.getWorkspace().removeResourceChangeListener(resourceChangeListener); + + getSite().getPage().removePartListener(partListener); + + adapterFactory.dispose(); + + if (getActionBarContributor().getActiveEditor() == this) { + getActionBarContributor().setActiveEditor(null); + } + + for (PropertySheetPage propertySheetPage : propertySheetPages) { + propertySheetPage.dispose(); + } + + if (contentOutlinePage != null) { + contentOutlinePage.dispose(); + } + + super.dispose(); + } + + /** + * Returns whether the outline view should be presented to the user. <!-- + * begin-user-doc --> <!-- end-user-doc --> + * + * @generated + */ + protected boolean showOutlineView() { + return true; + } +} diff --git a/plugins/org.eclipse.sirius.tests.sample.component.design/src-gen/org/eclipse/sirius/tests/sample/component/presentation/ComponentModelWizard.java b/plugins/org.eclipse.sirius.tests.sample.component.design/src-gen/org/eclipse/sirius/tests/sample/component/presentation/ComponentModelWizard.java new file mode 100644 index 0000000000..cf01d2a1d3 --- /dev/null +++ b/plugins/org.eclipse.sirius.tests.sample.component.design/src-gen/org/eclipse/sirius/tests/sample/component/presentation/ComponentModelWizard.java @@ -0,0 +1,590 @@ +/** + * Copyright (c) 2015 Obeo + * 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: + * Obeo - initial API and implementation + */ +package org.eclipse.sirius.tests.sample.component.presentation; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.StringTokenizer; + +import org.eclipse.core.resources.IContainer; +import org.eclipse.core.resources.IFile; +import org.eclipse.core.resources.IFolder; +import org.eclipse.core.resources.IProject; +import org.eclipse.core.resources.IResource; +import org.eclipse.core.resources.ResourcesPlugin; +import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.core.runtime.Path; +import org.eclipse.emf.common.CommonPlugin; +import org.eclipse.emf.common.util.URI; +import org.eclipse.emf.ecore.EClass; +import org.eclipse.emf.ecore.EClassifier; +import org.eclipse.emf.ecore.EObject; +import org.eclipse.emf.ecore.resource.Resource; +import org.eclipse.emf.ecore.resource.ResourceSet; +import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl; +import org.eclipse.emf.ecore.xmi.XMLResource; +import org.eclipse.emf.edit.ui.provider.ExtendedImageRegistry; +import org.eclipse.jface.dialogs.MessageDialog; +import org.eclipse.jface.viewers.ISelection; +import org.eclipse.jface.viewers.IStructuredSelection; +import org.eclipse.jface.viewers.StructuredSelection; +import org.eclipse.jface.wizard.Wizard; +import org.eclipse.jface.wizard.WizardPage; +import org.eclipse.sirius.tests.sample.component.ComponentFactory; +import org.eclipse.sirius.tests.sample.component.ComponentPackage; +import org.eclipse.sirius.tests.sample.component.design.ComponentDesignPlugin; +import org.eclipse.swt.SWT; +import org.eclipse.swt.events.ModifyEvent; +import org.eclipse.swt.events.ModifyListener; +import org.eclipse.swt.layout.GridData; +import org.eclipse.swt.layout.GridLayout; +import org.eclipse.swt.widgets.Combo; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Label; +import org.eclipse.ui.INewWizard; +import org.eclipse.ui.IWorkbench; +import org.eclipse.ui.IWorkbenchPage; +import org.eclipse.ui.IWorkbenchPart; +import org.eclipse.ui.IWorkbenchWindow; +import org.eclipse.ui.PartInitException; +import org.eclipse.ui.actions.WorkspaceModifyOperation; +import org.eclipse.ui.dialogs.WizardNewFileCreationPage; +import org.eclipse.ui.part.FileEditorInput; +import org.eclipse.ui.part.ISetSelectionTarget; + +/** + * This is a simple wizard for creating a new model file. <!-- begin-user-doc + * --> <!-- end-user-doc --> + * + * @generated + */ +public class ComponentModelWizard extends Wizard implements INewWizard { + /** + * The supported extensions for created files. <!-- begin-user-doc --> <!-- + * end-user-doc --> + * + * @generated NOT + */ + public static final List<String> FILE_EXTENSIONS = Collections + .unmodifiableList(Arrays.asList(ComponentDesignPlugin.INSTANCE.getString("_UI_ComponentEditorFilenameExtensions").split("\\s*,\\s*"))); + + /** + * A formatted list of supported file extensions, suitable for display. <!-- + * begin-user-doc --> <!-- end-user-doc --> + * + * @generated NOT + */ + public static final String FORMATTED_FILE_EXTENSIONS = ComponentDesignPlugin.INSTANCE.getString("_UI_ComponentEditorFilenameExtensions").replaceAll("\\s*,\\s*", ", "); + + /** + * This caches an instance of the model package. <!-- begin-user-doc --> + * <!-- end-user-doc --> + * + * @generated + */ + protected ComponentPackage componentPackage = ComponentPackage.eINSTANCE; + + /** + * This caches an instance of the model factory. <!-- begin-user-doc --> + * <!-- end-user-doc --> + * + * @generated + */ + protected ComponentFactory componentFactory = componentPackage.getComponentFactory(); + + /** + * This is the file creation page. <!-- begin-user-doc --> <!-- end-user-doc + * --> + * + * @generated + */ + protected ComponentModelWizardNewFileCreationPage newFileCreationPage; + + /** + * This is the initial object creation page. <!-- begin-user-doc --> <!-- + * end-user-doc --> + * + * @generated + */ + protected ComponentModelWizardInitialObjectCreationPage initialObjectCreationPage; + + /** + * Remember the selection during initialization for populating the default + * container. <!-- begin-user-doc --> <!-- end-user-doc --> + * + * @generated + */ + protected IStructuredSelection selection; + + /** + * Remember the workbench during initialization. <!-- begin-user-doc --> + * <!-- end-user-doc --> + * + * @generated + */ + protected IWorkbench workbench; + + /** + * Caches the names of the types that can be created as the root object. + * <!-- begin-user-doc --> <!-- end-user-doc --> + * + * @generated + */ + protected List<String> initialObjectNames; + + /** + * This just records the information. <!-- begin-user-doc --> <!-- + * end-user-doc --> + * + * @generated NOT + */ + @Override + public void init(IWorkbench workbench, IStructuredSelection selection) { + this.workbench = workbench; + this.selection = selection; + setWindowTitle(ComponentDesignPlugin.INSTANCE.getString("_UI_Wizard_label")); + setDefaultPageImageDescriptor(ExtendedImageRegistry.INSTANCE.getImageDescriptor(ComponentDesignPlugin.INSTANCE.getImage("full/wizban/NewComponent"))); + } + + /** + * Returns the names of the types that can be created as the root object. + * <!-- begin-user-doc --> <!-- end-user-doc --> + * + * @generated + */ + protected Collection<String> getInitialObjectNames() { + if (initialObjectNames == null) { + initialObjectNames = new ArrayList<String>(); + for (EClassifier eClassifier : componentPackage.getEClassifiers()) { + if (eClassifier instanceof EClass) { + EClass eClass = (EClass) eClassifier; + if (!eClass.isAbstract()) { + initialObjectNames.add(eClass.getName()); + } + } + } + Collections.sort(initialObjectNames, CommonPlugin.INSTANCE.getComparator()); + } + return initialObjectNames; + } + + /** + * Create a new model. <!-- begin-user-doc --> <!-- end-user-doc --> + * + * @generated + */ + protected EObject createInitialModel() { + EClass eClass = (EClass) componentPackage.getEClassifier(initialObjectCreationPage.getInitialObjectName()); + EObject rootObject = componentFactory.create(eClass); + return rootObject; + } + + /** + * Do the work after everything is specified. <!-- begin-user-doc --> <!-- + * end-user-doc --> + * + * @generated NOT + */ + @Override + public boolean performFinish() { + try { + // Remember the file. + // + final IFile modelFile = getModelFile(); + + // Do the work within an operation. + // + WorkspaceModifyOperation operation = new WorkspaceModifyOperation() { + @Override + protected void execute(IProgressMonitor progressMonitor) { + try { + // Create a resource set + // + ResourceSet resourceSet = new ResourceSetImpl(); + + // Get the URI of the model file. + // + URI fileURI = URI.createPlatformResourceURI(modelFile.getFullPath().toString(), true); + + // Create a resource for this file. + // + Resource resource = resourceSet.createResource(fileURI); + + // Add the initial model object to the contents. + // + EObject rootObject = createInitialModel(); + if (rootObject != null) { + resource.getContents().add(rootObject); + } + + // Save the contents of the resource to the file system. + // + Map<Object, Object> options = new HashMap<Object, Object>(); + options.put(XMLResource.OPTION_ENCODING, initialObjectCreationPage.getEncoding()); + resource.save(options); + } catch (Exception exception) { + ComponentDesignPlugin.INSTANCE.log(exception); + } finally { + progressMonitor.done(); + } + } + }; + + getContainer().run(false, false, operation); + + // Select the new file resource in the current view. + // + IWorkbenchWindow workbenchWindow = workbench.getActiveWorkbenchWindow(); + IWorkbenchPage page = workbenchWindow.getActivePage(); + final IWorkbenchPart activePart = page.getActivePart(); + if (activePart instanceof ISetSelectionTarget) { + final ISelection targetSelection = new StructuredSelection(modelFile); + getShell().getDisplay().asyncExec(new Runnable() { + @Override + public void run() { + ((ISetSelectionTarget) activePart).selectReveal(targetSelection); + } + }); + } + + // Open an editor on the new file. + // + try { + page.openEditor(new FileEditorInput(modelFile), workbench.getEditorRegistry().getDefaultEditor(modelFile.getFullPath().toString()).getId()); + } catch (PartInitException exception) { + MessageDialog.openError(workbenchWindow.getShell(), ComponentDesignPlugin.INSTANCE.getString("_UI_OpenEditorError_label"), exception.getMessage()); + return false; + } + + return true; + } catch (Exception exception) { + ComponentDesignPlugin.INSTANCE.log(exception); + return false; + } + } + + /** + * This is the one page of the wizard. <!-- begin-user-doc --> <!-- + * end-user-doc --> + * + * @generated + */ + public class ComponentModelWizardNewFileCreationPage extends WizardNewFileCreationPage { + /** + * Pass in the selection. <!-- begin-user-doc --> <!-- end-user-doc --> + * + * @generated + */ + public ComponentModelWizardNewFileCreationPage(String pageId, IStructuredSelection selection) { + super(pageId, selection); + } + + /** + * The framework calls this to see if the file is correct. <!-- + * begin-user-doc --> <!-- end-user-doc --> + * + * @generated NOT + */ + @Override + protected boolean validatePage() { + if (super.validatePage()) { + String extension = new Path(getFileName()).getFileExtension(); + if (extension == null || !FILE_EXTENSIONS.contains(extension)) { + String key = FILE_EXTENSIONS.size() > 1 ? "_WARN_FilenameExtensions" : "_WARN_FilenameExtension"; + setErrorMessage(ComponentDesignPlugin.INSTANCE.getString(key, new Object[] { FORMATTED_FILE_EXTENSIONS })); + return false; + } + return true; + } + return false; + } + + /** + * <!-- begin-user-doc --> <!-- end-user-doc --> + * + * @generated + */ + public IFile getModelFile() { + return ResourcesPlugin.getWorkspace().getRoot().getFile(getContainerFullPath().append(getFileName())); + } + } + + /** + * This is the page where the type of object to create is selected. <!-- + * begin-user-doc --> <!-- end-user-doc --> + * + * @generated + */ + public class ComponentModelWizardInitialObjectCreationPage extends WizardPage { + /** + * <!-- begin-user-doc --> <!-- end-user-doc --> + * + * @generated + */ + protected Combo initialObjectField; + + /** + * @generated <!-- begin-user-doc --> <!-- end-user-doc --> + */ + protected List<String> encodings; + + /** + * <!-- begin-user-doc --> <!-- end-user-doc --> + * + * @generated + */ + protected Combo encodingField; + + /** + * Pass in the selection. <!-- begin-user-doc --> <!-- end-user-doc --> + * + * @generated + */ + public ComponentModelWizardInitialObjectCreationPage(String pageId) { + super(pageId); + } + + /** + * <!-- begin-user-doc --> <!-- end-user-doc --> + * + * @generated NOT + */ + @Override + public void createControl(Composite parent) { + Composite composite = new Composite(parent, SWT.NONE); + { + GridLayout layout = new GridLayout(); + layout.numColumns = 1; + layout.verticalSpacing = 12; + composite.setLayout(layout); + + GridData data = new GridData(); + data.verticalAlignment = GridData.FILL; + data.grabExcessVerticalSpace = true; + data.horizontalAlignment = GridData.FILL; + composite.setLayoutData(data); + } + + Label containerLabel = new Label(composite, SWT.LEFT); + { + containerLabel.setText(ComponentDesignPlugin.INSTANCE.getString("_UI_ModelObject")); + + GridData data = new GridData(); + data.horizontalAlignment = GridData.FILL; + containerLabel.setLayoutData(data); + } + + initialObjectField = new Combo(composite, SWT.BORDER); + { + GridData data = new GridData(); + data.horizontalAlignment = GridData.FILL; + data.grabExcessHorizontalSpace = true; + initialObjectField.setLayoutData(data); + } + + for (String objectName : getInitialObjectNames()) { + initialObjectField.add(getLabel(objectName)); + } + + if (initialObjectField.getItemCount() == 1) { + initialObjectField.select(0); + } + initialObjectField.addModifyListener(validator); + + Label encodingLabel = new Label(composite, SWT.LEFT); + { + encodingLabel.setText(ComponentDesignPlugin.INSTANCE.getString("_UI_XMLEncoding")); + + GridData data = new GridData(); + data.horizontalAlignment = GridData.FILL; + encodingLabel.setLayoutData(data); + } + encodingField = new Combo(composite, SWT.BORDER); + { + GridData data = new GridData(); + data.horizontalAlignment = GridData.FILL; + data.grabExcessHorizontalSpace = true; + encodingField.setLayoutData(data); + } + + for (String encoding : getEncodings()) { + encodingField.add(encoding); + } + + encodingField.select(0); + encodingField.addModifyListener(validator); + + setPageComplete(validatePage()); + setControl(composite); + } + + /** + * <!-- begin-user-doc --> <!-- end-user-doc --> + * + * @generated + */ + protected ModifyListener validator = new ModifyListener() { + @Override + public void modifyText(ModifyEvent e) { + setPageComplete(validatePage()); + } + }; + + /** + * <!-- begin-user-doc --> <!-- end-user-doc --> + * + * @generated + */ + protected boolean validatePage() { + return getInitialObjectName() != null && getEncodings().contains(encodingField.getText()); + } + + /** + * <!-- begin-user-doc --> <!-- end-user-doc --> + * + * @generated + */ + @Override + public void setVisible(boolean visible) { + super.setVisible(visible); + if (visible) { + if (initialObjectField.getItemCount() == 1) { + initialObjectField.clearSelection(); + encodingField.setFocus(); + } else { + encodingField.clearSelection(); + initialObjectField.setFocus(); + } + } + } + + /** + * <!-- begin-user-doc --> <!-- end-user-doc --> + * + * @generated + */ + public String getInitialObjectName() { + String label = initialObjectField.getText(); + + for (String name : getInitialObjectNames()) { + if (getLabel(name).equals(label)) { + return name; + } + } + return null; + } + + /** + * <!-- begin-user-doc --> <!-- end-user-doc --> + * + * @generated + */ + public String getEncoding() { + return encodingField.getText(); + } + + /** + * Returns the label for the specified type name. <!-- begin-user-doc + * --> <!-- end-user-doc --> + * + * @generated NOT + */ + protected String getLabel(String typeName) { + return typeName; + } + + /** + * <!-- begin-user-doc --> <!-- end-user-doc --> + * + * @generated NOT + */ + protected Collection<String> getEncodings() { + if (encodings == null) { + encodings = new ArrayList<String>(); + for (StringTokenizer stringTokenizer = new StringTokenizer(ComponentDesignPlugin.INSTANCE.getString("_UI_XMLEncodingChoices")); stringTokenizer.hasMoreTokens();) { + encodings.add(stringTokenizer.nextToken()); + } + } + return encodings; + } + } + + /** + * The framework calls this to create the contents of the wizard. <!-- + * begin-user-doc --> <!-- end-user-doc --> + * + * @generated NOT + */ + @Override + public void addPages() { + // Create a page, set the title, and the initial model file name. + // + newFileCreationPage = new ComponentModelWizardNewFileCreationPage("Whatever", selection); + newFileCreationPage.setTitle(ComponentDesignPlugin.INSTANCE.getString("_UI_ComponentModelWizard_label")); + newFileCreationPage.setDescription(ComponentDesignPlugin.INSTANCE.getString("_UI_ComponentModelWizard_description")); + newFileCreationPage.setFileName(ComponentDesignPlugin.INSTANCE.getString("_UI_ComponentEditorFilenameDefaultBase") + "." + FILE_EXTENSIONS.get(0)); + addPage(newFileCreationPage); + + // Try and get the resource selection to determine a current directory + // for the file dialog. + // + if (selection != null && !selection.isEmpty()) { + // Get the resource... + // + Object selectedElement = selection.iterator().next(); + if (selectedElement instanceof IResource) { + // Get the resource parent, if its a file. + // + IResource selectedResource = (IResource) selectedElement; + if (selectedResource.getType() == IResource.FILE) { + selectedResource = selectedResource.getParent(); + } + + // This gives us a directory... + // + if (selectedResource instanceof IFolder || selectedResource instanceof IProject) { + // Set this for the container. + // + newFileCreationPage.setContainerFullPath(selectedResource.getFullPath()); + + // Make up a unique new name here. + // + String defaultModelBaseFilename = ComponentDesignPlugin.INSTANCE.getString("_UI_ComponentEditorFilenameDefaultBase"); + String defaultModelFilenameExtension = FILE_EXTENSIONS.get(0); + String modelFilename = defaultModelBaseFilename + "." + defaultModelFilenameExtension; + for (int i = 1; ((IContainer) selectedResource).findMember(modelFilename) != null; ++i) { + modelFilename = defaultModelBaseFilename + i + "." + defaultModelFilenameExtension; + } + newFileCreationPage.setFileName(modelFilename); + } + } + } + initialObjectCreationPage = new ComponentModelWizardInitialObjectCreationPage("Whatever2"); + initialObjectCreationPage.setTitle(ComponentDesignPlugin.INSTANCE.getString("_UI_ComponentModelWizard_label")); + initialObjectCreationPage.setDescription(ComponentDesignPlugin.INSTANCE.getString("_UI_Wizard_initial_object_description")); + addPage(initialObjectCreationPage); + } + + /** + * Get the file from the page. <!-- begin-user-doc --> <!-- end-user-doc --> + * + * @generated + */ + public IFile getModelFile() { + return newFileCreationPage.getModelFile(); + } + +} diff --git a/plugins/org.eclipse.sirius.tests.sample.component.design/src/org/eclipse/sirius/tests/sample/component/design/ComponentDesignPlugin.java b/plugins/org.eclipse.sirius.tests.sample.component.design/src/org/eclipse/sirius/tests/sample/component/design/ComponentDesignPlugin.java new file mode 100644 index 0000000000..5a77f8a125 --- /dev/null +++ b/plugins/org.eclipse.sirius.tests.sample.component.design/src/org/eclipse/sirius/tests/sample/component/design/ComponentDesignPlugin.java @@ -0,0 +1,68 @@ +/******************************************************************************* + * Copyright (c) 2015 Obeo. + * 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: + * Obeo - initial API and implementation + *******************************************************************************/ +package org.eclipse.sirius.tests.sample.component.design; + +import java.util.HashSet; +import java.util.Set; + +import org.eclipse.emf.common.ui.EclipseUIPlugin; +import org.eclipse.sirius.business.api.componentization.ViewpointRegistry; +import org.eclipse.sirius.viewpoint.description.Viewpoint; +import org.osgi.framework.BundleContext; + +/** + * The activator class controls the plug-in life cycle. + */ +public class ComponentDesignPlugin extends EclipseUIPlugin { + // The plug-in ID + public static final String PLUGIN_ID = "org.eclipse.sirius.tests.sample.component.design"; + + // The shared instance + public static ComponentDesignPlugin INSTANCE; + + private static Set<Viewpoint> viewpoints; + + /** + * The constructor. + */ + public ComponentDesignPlugin() { + } + + @Override + public void start(BundleContext context) throws Exception { + super.start(context); + INSTANCE = this; + viewpoints = new HashSet<Viewpoint>(); + viewpoints.addAll(ViewpointRegistry.getInstance().registerFromPlugin(PLUGIN_ID + "/description/component.odesign")); + } + + @Override + public void stop(BundleContext context) throws Exception { + INSTANCE = null; + if (viewpoints != null) { + for (final Viewpoint viewpoint : viewpoints) { + ViewpointRegistry.getInstance().disposeFromPlugin(viewpoint); + } + viewpoints.clear(); + viewpoints = null; + } + super.stop(context); + } + + /** + * Returns the shared instance. + * + * @return the shared instance + */ + public static ComponentDesignPlugin getDefault() { + return INSTANCE; + } +} diff --git a/plugins/org.eclipse.sirius.tests.sample.component.design/src/org/eclipse/sirius/tests/sample/component/service/ComponentServices.java b/plugins/org.eclipse.sirius.tests.sample.component.design/src/org/eclipse/sirius/tests/sample/component/service/ComponentServices.java new file mode 100644 index 0000000000..5136ebe34e --- /dev/null +++ b/plugins/org.eclipse.sirius.tests.sample.component.design/src/org/eclipse/sirius/tests/sample/component/service/ComponentServices.java @@ -0,0 +1,128 @@ +/******************************************************************************* + * Copyright (c) 2015 Obeo. + * 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: + * Obeo - initial API and implementation + *******************************************************************************/ +package org.eclipse.sirius.tests.sample.component.service; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashSet; + +import org.eclipse.sirius.tests.sample.component.Component; + +/** + * Component services. + * + * @author <a href="mailto:mickael.lanoe@obeo.fr">Mickael LANOE</a> + */ +public class ComponentServices { + + /** + * Get all component children that are not payload. + * + * @param component + * @return all component children + */ + public Collection<Component> getAllChildren(Component component) { + Collection<Component> allChildren = new ArrayList<Component>(); + appendChildren(component, allChildren); + return allChildren; + } + + /** + * Get component in column that are related to component in the line. + * + * @param line + * component in the selected line + * @return related component in columns + */ + public Collection<Component> getIntersectionColumms(Component line) { + Collection<Component> validColumns = new HashSet<Component>(); + for (Component ref : line.getReferences()) { + if (!ref.isPayload()) { + validColumns.add(ref); + } + } + + for (Component ref : line.getReferences2()) { + if (!ref.isPayload()) { + validColumns.add(ref); + } + } + + for (Component opposite : line.getOpposites()) { + if (!opposite.isPayload()) { + validColumns.add(opposite); + } + } + + Component ref = line.getReference(); + if (ref != null && !ref.isPayload()) { + validColumns.add(ref); + } + + return validColumns; + } + + /** + * Get intersection label. + * + * @param line + * component on the line + * @param column + * column on the line + * @return intersection label + */ + public String getIntersectionLabel(Component line, Component column) { + StringBuilder result = new StringBuilder(); + boolean empty = true; + + if (line.getReferences().contains(column)) { + result.append("R"); + empty = false; + } + + if (line.getReferences2().contains(column)) { + if (empty) { + result.append("R2"); + } else { + result.append(", R2"); + } + empty = false; + } + + if (line.getOpposites().contains(column)) { + if (empty) { + result.append("O"); + } else { + result.append(", O"); + } + empty = false; + } + + if (line.getReference() == column) { + if (empty) { + result.append("r"); + } else { + result.append(", r"); + } + } + + return result.toString(); + } + + private void appendChildren(Component component, Collection<Component> allChildren) { + for (Component child : component.getChildren()) { + if (!child.isPayload()) { + allChildren.add(child); + appendChildren(child, allChildren); + } + } + } +} |
