summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJayant Gupta2012-07-16 22:09:35 (EDT)
committer Jayant Gupta2012-08-20 14:48:46 (EDT)
commitaab0e7dbfa4dc0c0c071673686a94b5cc279ab63 (patch)
treea26061510bdd2e416024bd34d1757cdf8e68249a
parented265d34bda7e5677e0e3e58de3ff549dd04b05a (diff)
downloadorg.eclipse.etrice-aab0e7dbfa4dc0c0c071673686a94b5cc279ab63.zip
org.eclipse.etrice-aab0e7dbfa4dc0c0c071673686a94b5cc279ab63.tar.gz
org.eclipse.etrice-aab0e7dbfa4dc0c0c071673686a94b5cc279ab63.tar.bz2
Adding support for context sensitive layout and building on juno branchrefs/changes/11/6911/2
1. It contains the complete code for the layout plug-in (up-till now) 2. Adds the feature of context specific layout for a selected shape Change-Id: I7b833ee211015672c7ab211624752b8d97d4ff9a
-rw-r--r--plugins/org.eclipse.etrice.ui.layout/.classpath7
-rw-r--r--plugins/org.eclipse.etrice.ui.layout/.project28
-rw-r--r--plugins/org.eclipse.etrice.ui.layout/.settings/org.eclipse.jdt.core.prefs7
-rw-r--r--plugins/org.eclipse.etrice.ui.layout/META-INF/MANIFEST.MF24
-rw-r--r--plugins/org.eclipse.etrice.ui.layout/about.html28
-rw-r--r--plugins/org.eclipse.etrice.ui.layout/build.properties7
-rw-r--r--plugins/org.eclipse.etrice.ui.layout/epl-v10.html262
-rw-r--r--plugins/org.eclipse.etrice.ui.layout/plugin.xml16
-rw-r--r--plugins/org.eclipse.etrice.ui.layout/src/org/eclipse/etrice/ui/layout/BehaviorDiagramLayoutManager.java150
-rw-r--r--plugins/org.eclipse.etrice.ui.layout/src/org/eclipse/etrice/ui/layout/ETriceDiagramLayoutManager.java526
-rw-r--r--plugins/org.eclipse.etrice.ui.layout/src/org/eclipse/etrice/ui/layout/ETriceLayoutCommand.java167
-rw-r--r--plugins/org.eclipse.etrice.ui.layout/src/org/eclipse/etrice/ui/layout/StructureDiagramLayoutmanager.java134
12 files changed, 1356 insertions, 0 deletions
diff --git a/plugins/org.eclipse.etrice.ui.layout/.classpath b/plugins/org.eclipse.etrice.ui.layout/.classpath
new file mode 100644
index 0000000..ad32c83
--- /dev/null
+++ b/plugins/org.eclipse.etrice.ui.layout/.classpath
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6"/>
+ <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+ <classpathentry kind="src" path="src"/>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/plugins/org.eclipse.etrice.ui.layout/.project b/plugins/org.eclipse.etrice.ui.layout/.project
new file mode 100644
index 0000000..1c2d0c1
--- /dev/null
+++ b/plugins/org.eclipse.etrice.ui.layout/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.etrice.ui.layout</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.ManifestBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.SchemaBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.pde.PluginNature</nature>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ </natures>
+</projectDescription>
diff --git a/plugins/org.eclipse.etrice.ui.layout/.settings/org.eclipse.jdt.core.prefs b/plugins/org.eclipse.etrice.ui.layout/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..c537b63
--- /dev/null
+++ b/plugins/org.eclipse.etrice.ui.layout/.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.etrice.ui.layout/META-INF/MANIFEST.MF b/plugins/org.eclipse.etrice.ui.layout/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..66e3cd8
--- /dev/null
+++ b/plugins/org.eclipse.etrice.ui.layout/META-INF/MANIFEST.MF
@@ -0,0 +1,24 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: KIELER support for ETrice
+Bundle-SymbolicName: org.eclipse.etrice.ui.layout;singleton:=true
+Bundle-Version: 1.0.0.qualifier
+Require-Bundle: org.eclipse.graphiti;bundle-version="0.8.1",
+ org.eclipse.graphiti.ui;bundle-version="0.8.1",
+ org.eclipse.gef;bundle-version="3.5.0",
+ org.eclipse.ui;bundle-version="3.5.0",
+ org.eclipse.core.runtime;bundle-version="3.5.0",
+ org.eclipse.emf.transaction;bundle-version="1.3.0",
+ org.eclipse.ui.ide;bundle-version="3.5.0",
+ org.eclipse.ui.views.properties.tabbed;bundle-version="3.5.0",
+ com.google.guava;bundle-version="8.0.0",
+ de.cau.cs.kieler.core,
+ de.cau.cs.kieler.core.ui,
+ de.cau.cs.kieler.core.kgraph,
+ de.cau.cs.kieler.kiml.ui,
+ de.cau.cs.kieler.kiml.graphiti;bundle-version="0.2.0",
+ org.eclipse.etrice.ui.behavior;bundle-version="0.2.0",
+ org.eclipse.etrice.ui.structure;bundle-version="0.2.0",
+ org.eclipse.etrice.ui.common;bundle-version="0.2.0",
+ org.eclipse.etrice.core.room;bundle-version="0.2.0"
+Bundle-RequiredExecutionEnvironment: JavaSE-1.6
diff --git a/plugins/org.eclipse.etrice.ui.layout/about.html b/plugins/org.eclipse.etrice.ui.layout/about.html
new file mode 100644
index 0000000..82d49bf
--- /dev/null
+++ b/plugins/org.eclipse.etrice.ui.layout/about.html
@@ -0,0 +1,28 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
+<title>About</title>
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+
+<p>June 5, 2007</p>
+<h3>License</h3>
+
+<p>The Eclipse Foundation makes available all content in this plug-in (&quot;Content&quot;). Unless otherwise
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 1.0 (&quot;EPL&quot;). A copy of the EPL is available
+at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
+
+<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is
+being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
+apply to your use of any object code in the Content. Check the Redistributor's license that was
+provided with the Content. If no such license exists, contact the Redistributor. Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <a href="http://www.eclipse.org/">http://www.eclipse.org</a>.</p>
+
+</body>
+</html>
diff --git a/plugins/org.eclipse.etrice.ui.layout/build.properties b/plugins/org.eclipse.etrice.ui.layout/build.properties
new file mode 100644
index 0000000..0a3895a
--- /dev/null
+++ b/plugins/org.eclipse.etrice.ui.layout/build.properties
@@ -0,0 +1,7 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+ .,\
+ plugin.xml,\
+ epl-v10.html
+src.includes = epl-v10.html
diff --git a/plugins/org.eclipse.etrice.ui.layout/epl-v10.html b/plugins/org.eclipse.etrice.ui.layout/epl-v10.html
new file mode 100644
index 0000000..9e4b628
--- /dev/null
+++ b/plugins/org.eclipse.etrice.ui.layout/epl-v10.html
@@ -0,0 +1,262 @@
+<?xml version="1.0" encoding="ISO-8859-1" ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
+<title>Eclipse Public License - Version 1.0</title>
+<style type="text/css">
+ body {
+ size: 8.5in 11.0in;
+ margin: 0.25in 0.5in 0.25in 0.5in;
+ tab-interval: 0.5in;
+ }
+ p {
+ margin-left: auto;
+ margin-top: 0.5em;
+ margin-bottom: 0.5em;
+ }
+ p.list {
+ margin-left: 0.5in;
+ margin-top: 0.05em;
+ margin-bottom: 0.05em;
+ }
+ </style>
+
+</head>
+
+<body lang="EN-US">
+
+<p align=center><b>Eclipse Public License - v 1.0</b></p>
+
+<p>THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE
+PUBLIC LICENSE (&quot;AGREEMENT&quot;). ANY USE, REPRODUCTION OR
+DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS
+AGREEMENT.</p>
+
+<p><b>1. DEFINITIONS</b></p>
+
+<p>&quot;Contribution&quot; means:</p>
+
+<p class="list">a) in the case of the initial Contributor, the initial
+code and documentation distributed under this Agreement, and</p>
+<p class="list">b) in the case of each subsequent Contributor:</p>
+
+<p class="list">i) changes to the Program, and</p>
+<p class="list">ii) additions to the Program;</p>
+<p class="list">where such changes and/or additions to the Program
+originate from and are distributed by that particular Contributor. A
+Contribution 'originates' from a Contributor if it was added to the
+Program by such Contributor itself or anyone acting on such
+Contributor's behalf. Contributions do not include additions to the
+Program which: (i) are separate modules of software distributed in
+conjunction with the Program under their own license agreement, and (ii)
+are not derivative works of the Program.</p>
+
+<p>&quot;Contributor&quot; means any person or entity that distributes
+the Program.</p>
+
+<p>&quot;Licensed Patents&quot; mean patent claims licensable by a
+Contributor which are necessarily infringed by the use or sale of its
+Contribution alone or when combined with the Program.</p>
+
+<p>&quot;Program&quot; means the Contributions distributed in accordance
+with this Agreement.</p>
+
+<p>&quot;Recipient&quot; means anyone who receives the Program under
+this Agreement, including all Contributors.</p>
+
+<p><b>2. GRANT OF RIGHTS</b></p>
+
+<p class="list">a) Subject to the terms of this Agreement, each
+Contributor hereby grants Recipient a non-exclusive, worldwide,
+royalty-free copyright license to reproduce, prepare derivative works
+of, publicly display, publicly perform, distribute and sublicense the
+Contribution of such Contributor, if any, and such derivative works, in
+source code and object code form.</p>
+
+<p class="list">b) Subject to the terms of this Agreement, each
+Contributor hereby grants Recipient a non-exclusive, worldwide,
+royalty-free patent license under Licensed Patents to make, use, sell,
+offer to sell, import and otherwise transfer the Contribution of such
+Contributor, if any, in source code and object code form. This patent
+license shall apply to the combination of the Contribution and the
+Program if, at the time the Contribution is added by the Contributor,
+such addition of the Contribution causes such combination to be covered
+by the Licensed Patents. The patent license shall not apply to any other
+combinations which include the Contribution. No hardware per se is
+licensed hereunder.</p>
+
+<p class="list">c) Recipient understands that although each Contributor
+grants the licenses to its Contributions set forth herein, no assurances
+are provided by any Contributor that the Program does not infringe the
+patent or other intellectual property rights of any other entity. Each
+Contributor disclaims any liability to Recipient for claims brought by
+any other entity based on infringement of intellectual property rights
+or otherwise. As a condition to exercising the rights and licenses
+granted hereunder, each Recipient hereby assumes sole responsibility to
+secure any other intellectual property rights needed, if any. For
+example, if a third party patent license is required to allow Recipient
+to distribute the Program, it is Recipient's responsibility to acquire
+that license before distributing the Program.</p>
+
+<p class="list">d) Each Contributor represents that to its knowledge it
+has sufficient copyright rights in its Contribution, if any, to grant
+the copyright license set forth in this Agreement.</p>
+
+<p><b>3. REQUIREMENTS</b></p>
+
+<p>A Contributor may choose to distribute the Program in object code
+form under its own license agreement, provided that:</p>
+
+<p class="list">a) it complies with the terms and conditions of this
+Agreement; and</p>
+
+<p class="list">b) its license agreement:</p>
+
+<p class="list">i) effectively disclaims on behalf of all Contributors
+all warranties and conditions, express and implied, including warranties
+or conditions of title and non-infringement, and implied warranties or
+conditions of merchantability and fitness for a particular purpose;</p>
+
+<p class="list">ii) effectively excludes on behalf of all Contributors
+all liability for damages, including direct, indirect, special,
+incidental and consequential damages, such as lost profits;</p>
+
+<p class="list">iii) states that any provisions which differ from this
+Agreement are offered by that Contributor alone and not by any other
+party; and</p>
+
+<p class="list">iv) states that source code for the Program is available
+from such Contributor, and informs licensees how to obtain it in a
+reasonable manner on or through a medium customarily used for software
+exchange.</p>
+
+<p>When the Program is made available in source code form:</p>
+
+<p class="list">a) it must be made available under this Agreement; and</p>
+
+<p class="list">b) a copy of this Agreement must be included with each
+copy of the Program.</p>
+
+<p>Contributors may not remove or alter any copyright notices contained
+within the Program.</p>
+
+<p>Each Contributor must identify itself as the originator of its
+Contribution, if any, in a manner that reasonably allows subsequent
+Recipients to identify the originator of the Contribution.</p>
+
+<p><b>4. COMMERCIAL DISTRIBUTION</b></p>
+
+<p>Commercial distributors of software may accept certain
+responsibilities with respect to end users, business partners and the
+like. While this license is intended to facilitate the commercial use of
+the Program, the Contributor who includes the Program in a commercial
+product offering should do so in a manner which does not create
+potential liability for other Contributors. Therefore, if a Contributor
+includes the Program in a commercial product offering, such Contributor
+(&quot;Commercial Contributor&quot;) hereby agrees to defend and
+indemnify every other Contributor (&quot;Indemnified Contributor&quot;)
+against any losses, damages and costs (collectively &quot;Losses&quot;)
+arising from claims, lawsuits and other legal actions brought by a third
+party against the Indemnified Contributor to the extent caused by the
+acts or omissions of such Commercial Contributor in connection with its
+distribution of the Program in a commercial product offering. The
+obligations in this section do not apply to any claims or Losses
+relating to any actual or alleged intellectual property infringement. In
+order to qualify, an Indemnified Contributor must: a) promptly notify
+the Commercial Contributor in writing of such claim, and b) allow the
+Commercial Contributor to control, and cooperate with the Commercial
+Contributor in, the defense and any related settlement negotiations. The
+Indemnified Contributor may participate in any such claim at its own
+expense.</p>
+
+<p>For example, a Contributor might include the Program in a commercial
+product offering, Product X. That Contributor is then a Commercial
+Contributor. If that Commercial Contributor then makes performance
+claims, or offers warranties related to Product X, those performance
+claims and warranties are such Commercial Contributor's responsibility
+alone. Under this section, the Commercial Contributor would have to
+defend claims against the other Contributors related to those
+performance claims and warranties, and if a court requires any other
+Contributor to pay any damages as a result, the Commercial Contributor
+must pay those damages.</p>
+
+<p><b>5. NO WARRANTY</b></p>
+
+<p>EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS
+PROVIDED ON AN &quot;AS IS&quot; BASIS, WITHOUT WARRANTIES OR CONDITIONS
+OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION,
+ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY
+OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely
+responsible for determining the appropriateness of using and
+distributing the Program and assumes all risks associated with its
+exercise of rights under this Agreement , including but not limited to
+the risks and costs of program errors, compliance with applicable laws,
+damage to or loss of data, programs or equipment, and unavailability or
+interruption of operations.</p>
+
+<p><b>6. DISCLAIMER OF LIABILITY</b></p>
+
+<p>EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT
+NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING
+WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF
+LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR
+DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED
+HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.</p>
+
+<p><b>7. GENERAL</b></p>
+
+<p>If any provision of this Agreement is invalid or unenforceable under
+applicable law, it shall not affect the validity or enforceability of
+the remainder of the terms of this Agreement, and without further action
+by the parties hereto, such provision shall be reformed to the minimum
+extent necessary to make such provision valid and enforceable.</p>
+
+<p>If Recipient institutes patent litigation against any entity
+(including a cross-claim or counterclaim in a lawsuit) alleging that the
+Program itself (excluding combinations of the Program with other
+software or hardware) infringes such Recipient's patent(s), then such
+Recipient's rights granted under Section 2(b) shall terminate as of the
+date such litigation is filed.</p>
+
+<p>All Recipient's rights under this Agreement shall terminate if it
+fails to comply with any of the material terms or conditions of this
+Agreement and does not cure such failure in a reasonable period of time
+after becoming aware of such noncompliance. If all Recipient's rights
+under this Agreement terminate, Recipient agrees to cease use and
+distribution of the Program as soon as reasonably practicable. However,
+Recipient's obligations under this Agreement and any licenses granted by
+Recipient relating to the Program shall continue and survive.</p>
+
+<p>Everyone is permitted to copy and distribute copies of this
+Agreement, but in order to avoid inconsistency the Agreement is
+copyrighted and may only be modified in the following manner. The
+Agreement Steward reserves the right to publish new versions (including
+revisions) of this Agreement from time to time. No one other than the
+Agreement Steward has the right to modify this Agreement. The Eclipse
+Foundation is the initial Agreement Steward. The Eclipse Foundation may
+assign the responsibility to serve as the Agreement Steward to a
+suitable separate entity. Each new version of the Agreement will be
+given a distinguishing version number. The Program (including
+Contributions) may always be distributed subject to the version of the
+Agreement under which it was received. In addition, after a new version
+of the Agreement is published, Contributor may elect to distribute the
+Program (including its Contributions) under the new version. Except as
+expressly stated in Sections 2(a) and 2(b) above, Recipient receives no
+rights or licenses to the intellectual property of any Contributor under
+this Agreement, whether expressly, by implication, estoppel or
+otherwise. All rights in the Program not expressly granted under this
+Agreement are reserved.</p>
+
+<p>This Agreement is governed by the laws of the State of New York and
+the intellectual property laws of the United States of America. No party
+to this Agreement will bring a legal action under this Agreement more
+than one year after the cause of action arose. Each party waives its
+rights to a jury trial in any resulting litigation.</p>
+
+</body>
+
+</html>
diff --git a/plugins/org.eclipse.etrice.ui.layout/plugin.xml b/plugins/org.eclipse.etrice.ui.layout/plugin.xml
new file mode 100644
index 0000000..58435d8
--- /dev/null
+++ b/plugins/org.eclipse.etrice.ui.layout/plugin.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.4"?>
+<plugin>
+ <extension
+ point="de.cau.cs.kieler.kiml.ui.layoutManagers">
+ <manager
+ class="org.eclipse.etrice.ui.layout.BehaviorDiagramLayoutManager"
+ priority="1">
+ </manager>
+ <manager
+ class="org.eclipse.etrice.ui.layout.StructureDiagramLayoutmanager"
+ priority="1">
+ </manager>
+ </extension>
+
+</plugin>
diff --git a/plugins/org.eclipse.etrice.ui.layout/src/org/eclipse/etrice/ui/layout/BehaviorDiagramLayoutManager.java b/plugins/org.eclipse.etrice.ui.layout/src/org/eclipse/etrice/ui/layout/BehaviorDiagramLayoutManager.java
new file mode 100644
index 0000000..63329e1
--- /dev/null
+++ b/plugins/org.eclipse.etrice.ui.layout/src/org/eclipse/etrice/ui/layout/BehaviorDiagramLayoutManager.java
@@ -0,0 +1,150 @@
+/*******************************************************************************
+ * 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:
+ * Jayant Gupta (initial contribution)
+ *
+ *******************************************************************************/
+
+package org.eclipse.etrice.ui.layout;
+
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.etrice.core.room.StateGraph;
+import org.eclipse.etrice.core.room.TrPoint;
+import org.eclipse.etrice.ui.behavior.editor.BehaviorEditor;
+import org.eclipse.etrice.ui.behavior.support.StateSupport;
+import org.eclipse.graphiti.mm.pictograms.Anchor;
+import org.eclipse.graphiti.mm.pictograms.Diagram;
+import org.eclipse.graphiti.mm.pictograms.PictogramElement;
+import org.eclipse.graphiti.mm.pictograms.Shape;
+import org.eclipse.graphiti.ui.internal.parts.IPictogramElementEditPart;
+
+import de.cau.cs.kieler.core.kgraph.KNode;
+import de.cau.cs.kieler.kiml.LayoutContext;
+import de.cau.cs.kieler.kiml.config.VolatileLayoutConfig;
+import de.cau.cs.kieler.kiml.graphiti.KimlGraphitiUtil;
+import de.cau.cs.kieler.kiml.options.LayoutOptions;
+import de.cau.cs.kieler.kiml.ui.diagram.LayoutMapping;
+import de.cau.cs.kieler.kiml.util.KimlUtil;
+
+/**
+ * Layout Manager implementation for eTrice Structure Editor.
+ *
+ * @author jayant
+ */
+@SuppressWarnings("restriction")
+public class BehaviorDiagramLayoutManager extends ETriceDiagramLayoutManager {
+
+ /**
+ * {@inheritDoc}
+ *
+ * @author jayant
+ */
+ @Override
+ public boolean supports(final Object object) {
+
+ return object instanceof BehaviorEditor
+ || object instanceof IPictogramElementEditPart
+ || object instanceof PictogramElement;
+
+ }
+
+ /**
+ * {@inheritDoc}
+ *
+ * @author jayant
+ */
+ @Override
+ protected void buildLayoutGraphForBoundingBox(
+ LayoutMapping<PictogramElement> mapping, Diagram diagram,
+ KNode diagramNode, boolean onlyVisible) {
+
+ if (onlyVisible) {
+ for (Shape boundingBox : ((Diagram) diagram).getChildren()) {
+ if (boundingBox.isVisible()) {
+ buildAllLevels(mapping, boundingBox, diagramNode);
+ break;
+ }
+ }
+ } else {
+ // This happens when the user requests Layout of the whole hierarchy
+ // of Diagrams in the behavior editor
+ // FIXME need to be corrected.
+ for (Shape boundingBox : ((Diagram) diagram).getChildren())
+ buildAllLevels(mapping, boundingBox, diagramNode);
+ }
+
+ }
+
+ /** the fixed minimal height of nodes. */
+ public static final float MIN_HEIGHT = StateSupport.DEFAULT_SIZE_Y;
+ /** the fixed minimal width of shapes. */
+ public static final float MIN_WIDHT = StateSupport.DEFAULT_SIZE_X;
+
+ /**
+ * {@inheritDoc}
+ *
+ * @author jayant
+ */
+ protected KNode createNode(final LayoutMapping<PictogramElement> mapping,
+ final KNode parentNode, final Shape shape) {
+ KNode node = KimlUtil.createInitializedNode();
+ node.setParent(parentNode);
+
+ setCurrentPositionAndSize(mapping, parentNode, node, shape);
+
+ VolatileLayoutConfig staticConfig = mapping
+ .getProperty(KimlGraphitiUtil.STATIC_CONFIG);
+ // FIXME find a way to specify the minimal size dynamically
+
+ staticConfig.setValue(LayoutOptions.MIN_WIDTH, node,
+ LayoutContext.GRAPH_ELEM, MIN_WIDHT);
+ staticConfig.setValue(LayoutOptions.MIN_HEIGHT, node,
+ LayoutContext.GRAPH_ELEM, MIN_HEIGHT);
+
+ mapping.getGraphMap().put(node, shape);
+
+ // gather all connections directly connected to the Node (not the
+ // connections connected via ports). These only exist in the behavior
+ // editor.
+ for (Anchor anchor : shape.getAnchors()) {
+ mapping.getProperty(KimlGraphitiUtil.CONNECTIONS).addAll(
+ anchor.getOutgoingConnections());
+ }
+
+ return node;
+ }
+
+
+
+ /**
+ * {@inheritDoc}
+ *
+ * @author jayant
+ */
+ @Override
+ protected boolean isPort(Shape shape) {
+ EObject modelObject = shape.getLink().getBusinessObjects().get(0);
+ if (modelObject instanceof TrPoint)
+ return true;
+
+ return false;
+ }
+
+ /**
+ * {@inheritDoc}
+ *
+ * @author jayant
+ */
+ @Override
+ protected boolean isTopLevelBoundingBox(Shape shape) {
+ EObject modelObject = shape.getLink().getBusinessObjects().get(0);
+ if (modelObject instanceof StateGraph)
+ return true;
+
+ return false;
+ }
+}
diff --git a/plugins/org.eclipse.etrice.ui.layout/src/org/eclipse/etrice/ui/layout/ETriceDiagramLayoutManager.java b/plugins/org.eclipse.etrice.ui.layout/src/org/eclipse/etrice/ui/layout/ETriceDiagramLayoutManager.java
new file mode 100644
index 0000000..a5a83b7
--- /dev/null
+++ b/plugins/org.eclipse.etrice.ui.layout/src/org/eclipse/etrice/ui/layout/ETriceDiagramLayoutManager.java
@@ -0,0 +1,526 @@
+/*******************************************************************************
+ * 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:
+ * Jayant Gupta (initial contribution)
+ *
+ *******************************************************************************/
+
+package org.eclipse.etrice.ui.layout;
+
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map.Entry;
+
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.transaction.TransactionalEditingDomain;
+import org.eclipse.etrice.ui.common.editor.RoomDiagramEditor;
+import org.eclipse.gef.EditPart;
+import org.eclipse.graphiti.mm.algorithms.AbstractText;
+import org.eclipse.graphiti.mm.algorithms.GraphicsAlgorithm;
+import org.eclipse.graphiti.mm.pictograms.Anchor;
+import org.eclipse.graphiti.mm.pictograms.Connection;
+import org.eclipse.graphiti.mm.pictograms.ContainerShape;
+import org.eclipse.graphiti.mm.pictograms.Diagram;
+import org.eclipse.graphiti.mm.pictograms.FreeFormConnection;
+import org.eclipse.graphiti.mm.pictograms.PictogramElement;
+import org.eclipse.graphiti.mm.pictograms.Shape;
+import org.eclipse.graphiti.ui.editor.DiagramEditor;
+import org.eclipse.graphiti.ui.internal.parts.IPictogramElementEditPart;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.MessageBox;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.IWorkbenchPart;
+import org.eclipse.ui.PlatformUI;
+
+import de.cau.cs.kieler.core.kgraph.KGraphElement;
+import de.cau.cs.kieler.core.kgraph.KLabeledGraphElement;
+import de.cau.cs.kieler.core.kgraph.KNode;
+import de.cau.cs.kieler.core.kgraph.KPort;
+import de.cau.cs.kieler.kiml.LayoutContext;
+import de.cau.cs.kieler.kiml.config.VolatileLayoutConfig;
+import de.cau.cs.kieler.kiml.graphiti.GefDiagramLayoutManager;
+import de.cau.cs.kieler.kiml.graphiti.GraphitiLayoutCommand;
+import de.cau.cs.kieler.kiml.graphiti.GraphitiLayoutConfig;
+import de.cau.cs.kieler.kiml.graphiti.KimlGraphitiUtil;
+import de.cau.cs.kieler.kiml.klayoutdata.KInsets;
+import de.cau.cs.kieler.kiml.klayoutdata.KShapeLayout;
+import de.cau.cs.kieler.kiml.klayoutdata.impl.KShapeLayoutImpl;
+import de.cau.cs.kieler.kiml.ui.diagram.LayoutMapping;
+import de.cau.cs.kieler.kiml.util.KimlUtil;
+
+/**
+ * The abstract class to support the creation of eTrice
+ * {@link BehaviorDiagramLayoutManager } and
+ * {@link StructureDiagramLayoutmanager}
+ *
+ * @author jayant
+ */
+@SuppressWarnings("restriction")
+public abstract class ETriceDiagramLayoutManager extends
+ GefDiagramLayoutManager<PictogramElement> {
+
+ /**
+ * {@inheritDoc}
+ */
+ public abstract boolean supports(Object object);
+
+ /**
+ * {@inheritDoc}
+ */
+ @SuppressWarnings({ "rawtypes", "unchecked" })
+ public Object getAdapter(final Object object, final Class adapterType) {
+ if (adapterType.isAssignableFrom(GraphitiLayoutConfig.class)) {
+ return layoutConfig;
+ } else if (adapterType
+ .isAssignableFrom(IPictogramElementEditPart.class)) {
+ if (object instanceof IPictogramElementEditPart) {
+ return object;
+ } else if (object instanceof DiagramEditor) {
+ return ((DiagramEditor) object).getGraphicalViewer()
+ .getContents();
+ }
+ } else if (adapterType.isAssignableFrom(EObject.class)) {
+ if (object instanceof IPictogramElementEditPart) {
+ PictogramElement pe = ((IPictogramElementEditPart) object)
+ .getPictogramElement();
+ if (pe.getLink() != null) {
+ List<EObject> businessObjects = pe.getLink()
+ .getBusinessObjects();
+ if (!businessObjects.isEmpty()) {
+ return businessObjects.get(0);
+ }
+ }
+ } else if (object instanceof PictogramElement) {
+ PictogramElement pe = (PictogramElement) object;
+ if (pe.getLink() != null) {
+ List<EObject> businessObjects = pe.getLink()
+ .getBusinessObjects();
+ if (!businessObjects.isEmpty()) {
+ return businessObjects.get(0);
+ }
+ }
+ }
+ } else if (adapterType.isAssignableFrom(PictogramElement.class)) {
+ if (object instanceof PictogramElement) {
+ return object;
+ } else if (object instanceof IPictogramElementEditPart) {
+ return ((IPictogramElementEditPart) object)
+ .getPictogramElement();
+ } else if (object instanceof DiagramEditor) {
+ EditPart contents = ((DiagramEditor) object)
+ .getGraphicalViewer().getContents();
+ if (contents instanceof IPictogramElementEditPart) {
+ return ((IPictogramElementEditPart) contents)
+ .getPictogramElement();
+ }
+ }
+ } else if (adapterType
+ .isAssignableFrom(TransactionalEditingDomain.class)) {
+ if (object instanceof DiagramEditor) {
+ return ((DiagramEditor) object).getEditingDomain();
+ } else if (object instanceof IPictogramElementEditPart) {
+ return ((IPictogramElementEditPart) object)
+ .getConfigurationProvider().getDiagramEditor()
+ .getEditingDomain();
+ }
+ }
+ if (object instanceof IAdaptable) {
+ return ((IAdaptable) object).getAdapter(adapterType);
+ }
+ return null;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public Class<?>[] getAdapterList() {
+ return new Class<?>[] { PictogramElement.class };
+ }
+
+ /**
+ * {@inheritDoc}
+ *
+ * @author jayant
+ */
+
+ @Override
+ protected void transferLayout(final LayoutMapping<PictogramElement> mapping) {
+ DiagramEditor diagramEditor = mapping
+ .getProperty(KimlGraphitiUtil.DIAGRAM_EDITOR);
+ ETriceLayoutCommand command = new ETriceLayoutCommand(
+ diagramEditor.getEditingDomain(), diagramEditor
+ .getDiagramTypeProvider().getFeatureProvider());
+ for (Entry<KGraphElement, PictogramElement> entry : mapping
+ .getGraphMap().entrySet()) {
+ command.add(entry.getKey(), entry.getValue());
+ }
+ mapping.setProperty(KimlGraphitiUtil.LAYOUT_COMMAND, command);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ protected void applyLayout(final LayoutMapping<PictogramElement> mapping) {
+ TransactionalEditingDomain editingDomain = mapping.getProperty(
+ KimlGraphitiUtil.DIAGRAM_EDITOR).getEditingDomain();
+ editingDomain.getCommandStack().execute(
+ mapping.getProperty(KimlGraphitiUtil.LAYOUT_COMMAND));
+ }
+
+ /** the cached layout configuration for Graphiti. */
+ private GraphitiLayoutConfig layoutConfig = new GraphitiLayoutConfig();
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public LayoutMapping<PictogramElement> buildLayoutGraph(
+ final IWorkbenchPart workbenchPart, final Object diagramPart) {
+ LayoutMapping<PictogramElement> mapping = new LayoutMapping<PictogramElement>(
+ this);
+ mapping.setProperty(KimlGraphitiUtil.CONNECTIONS,
+ new LinkedList<Connection>());
+ mapping.setProperty(KimlGraphitiUtil.STATIC_CONFIG,
+ new VolatileLayoutConfig());
+
+ if (workbenchPart instanceof RoomDiagramEditor) {
+ mapping.setProperty(KimlGraphitiUtil.DIAGRAM_EDITOR,
+ (RoomDiagramEditor) workbenchPart);
+ }
+
+ EditPart layoutRootPart = null;
+ if (diagramPart instanceof IPictogramElementEditPart) {
+ layoutRootPart = (EditPart) diagramPart;
+ } else if (mapping.getProperty(KimlGraphitiUtil.DIAGRAM_EDITOR) != null) {
+ layoutRootPart = mapping
+ .getProperty(KimlGraphitiUtil.DIAGRAM_EDITOR)
+ .getGraphicalViewer().getContents();
+ }
+ if (!(layoutRootPart instanceof IPictogramElementEditPart)) {
+ throw new UnsupportedOperationException(
+ "Not supported by this layout manager: Workbench part "
+ + workbenchPart + ", Edit part " + diagramPart);
+ }
+ PictogramElement element = ((IPictogramElementEditPart) layoutRootPart)
+ .getPictogramElement();
+ mapping.setParentElement(element);
+
+ if (element instanceof Diagram) {
+
+ KNode diagramNode = KimlUtil.createInitializedNode();
+ KShapeLayout shapeLayout = diagramNode.getData(KShapeLayout.class);
+ GraphicsAlgorithm ga = element.getGraphicsAlgorithm();
+ shapeLayout.setPos(ga.getX(), ga.getY());
+ shapeLayout.setSize(ga.getWidth(), ga.getHeight());
+ mapping.getGraphMap().put(diagramNode, element);
+
+ // Node creation for currently visible top-level Container
+ // Shape(Bounding Box) in
+ // eTrice Diagrams
+ buildLayoutGraphForBoundingBox(mapping, (Diagram) element,
+ diagramNode, true);
+
+ mapping.setLayoutGraph(diagramNode);
+
+ } else if (element instanceof Shape) {
+
+ if ( isTopLevelBoundingBox( (Shape)element) ) {
+ // The selected Element is the Top Level Top Level Bounding Box
+ mapping.setLayoutGraph((KNode) buildAllLevels(mapping,
+ (Shape) element, null));
+ } else {
+ KGraphElement internalKGraphElement = createKGaphElementFromShape(
+ mapping, null, (Shape) element);
+
+ if (internalKGraphElement instanceof KNode) {
+ // The selected Element is a Node.
+ for (Shape childShape : ((ContainerShape) element)
+ .getChildren()) {
+
+ createKGaphElementFromShape(mapping,
+ internalKGraphElement, childShape);
+ }
+
+ mapping.setLayoutGraph((KNode) internalKGraphElement);
+
+ } else {
+ // The selected Element is a Port or an Edge Label.
+
+ // Giving the user a SWT dialog indicating that this Shape
+ // cannot be lay-outed.
+ Shell shell = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell();
+ MessageBox dialog = new MessageBox(shell, SWT.ICON_ERROR
+ | SWT.OK | SWT.CANCEL);
+ dialog.setText("Invalid Layout Call");
+ dialog.setMessage("This shape connot be layouted saparately.");
+ System.out.println(dialog.open());
+
+ }
+
+ }
+ } else if (element instanceof FreeFormConnection) {
+ // This gives the user a SWT dialog indicating this is a connection and
+ // cannot be lay-outed.
+ Shell shell = PlatformUI.getWorkbench().getActiveWorkbenchWindow()
+ .getShell();
+ MessageBox dialog = new MessageBox(shell, SWT.ICON_ERROR | SWT.OK
+ | SWT.CANCEL);
+ dialog.setText("Invalid Layout Call");
+ dialog.setMessage("A connection connot be layouted saparately");
+ System.out.println(dialog.open());
+ }
+
+ for (Connection entry : mapping
+ .getProperty(KimlGraphitiUtil.CONNECTIONS)) {
+ KimlGraphitiUtil.createEdge(mapping, entry);
+ }
+
+ // create a layout configuration
+ mapping.getLayoutConfigs().add(
+ mapping.getProperty(KimlGraphitiUtil.STATIC_CONFIG));
+ mapping.getLayoutConfigs().add(layoutConfig);
+
+ return mapping;
+ }
+
+ /**
+ * Identifies the visible Bounding Box (Top Level Container) and delegates
+ * the control to {@link #buildAllLevels(LayoutMapping, Shape, KNode)}
+ *
+ * @param mapping
+ * the mapping of pictogram elements to graph elements
+ * @param diagram
+ * @param diagramNode
+ * @param onlyVisible
+ *
+ * @author jayant
+ */
+ protected abstract void buildLayoutGraphForBoundingBox(
+ final LayoutMapping<PictogramElement> mapping,
+ final Diagram diagram, final KNode diagramNode,
+ final boolean onlyVisible);
+
+ /**
+ * Develops the complete LayoutGraph for the eTrice Diagram starting from
+ * the Bounding Box.
+ *
+ * @param mapping
+ * the mapping of pictogram elements to graph elements
+ * @param topLevelBoundingBox
+ * The Top Level Container Shape containing all other shapes
+ * @param diagramNode
+ * The KNode corresponding to the Diagram
+ *
+ * @author jayant
+ */
+ /* This is fairly general for both the eTrice editors */
+ protected KNode buildAllLevels(LayoutMapping<PictogramElement> mapping,
+ Shape topLevelBoundingBox, KNode diagramNode) {
+ // Top Level
+ KNode topLevelBoundingBoxNode = createNode(mapping, diagramNode,
+ topLevelBoundingBox);
+
+ for (Shape secondtLevelShape : ((ContainerShape) topLevelBoundingBox)
+ .getChildren()) {
+ // Second Level
+ KGraphElement secondLevelKGraphElement = createKGaphElementFromShape(
+ mapping, topLevelBoundingBoxNode, secondtLevelShape);
+
+ if (secondLevelKGraphElement instanceof KNode) {
+ for (Shape thirdLevelShape : ((ContainerShape) secondtLevelShape)
+ .getChildren()) {
+ // Third Level
+ createKGaphElementFromShape(mapping,
+ secondLevelKGraphElement, thirdLevelShape);
+ }
+ }
+ }
+
+ return topLevelBoundingBoxNode;
+ }
+
+ /**
+ * Identifies the type of Shape (Label, Port or Node) and creates the
+ * corresponding KGraphElement Element
+ *
+ * @param mapping
+ * the mapping of pictogram elements to graph elements
+ * @param parent
+ * the parent KNode
+ * @param shape
+ * the shape for which a KGraphElement is required
+ *
+ * @return the created KGraphElement for the given Shape
+ *
+ * @author jayant
+ */
+ /* This is fairly general for both the eTrice editors */
+ private KGraphElement createKGaphElementFromShape(
+ LayoutMapping<PictogramElement> mapping, KGraphElement parent,
+ Shape shape) {
+
+ GraphicsAlgorithm ga = shape.getGraphicsAlgorithm();
+
+ // Checking whether this shape is a label
+ if (ga instanceof AbstractText) {
+
+ KInsets parentInsets = parent.getData(KShapeLayout.class)
+ .getProperty(GraphitiLayoutCommand.INVIS_INSETS);
+
+ assert (parentInsets != null) : "There must be an invisible insets attached to all ports and nodes(except diagramNode)";
+ return KimlGraphitiUtil.createLabel((KLabeledGraphElement) parent,
+ (AbstractText) ga, -parentInsets.getLeft(),
+ -parentInsets.getTop());
+ }
+
+ else if (shape instanceof ContainerShape) {
+
+ // Checking whether this shape is a Port
+ if (isPort(shape))
+ return createPort(mapping, (KNode) parent, shape);
+
+ else
+ // This shape is a node
+ return createNode(mapping, (KNode) parent, shape);
+
+ } else
+ return null;
+ }
+
+ /**
+ * {@inheritDoc}
+ *
+ * @author jayant
+ */
+ protected abstract KNode createNode(
+ final LayoutMapping<PictogramElement> mapping,
+ final KNode parentNode, final Shape shape);
+
+ /**
+ * Create a port for the layout graph.
+ *
+ * @param mapping
+ * the mapping of pictogram elements to graph elements
+ * @param parentNode
+ * the parent node
+ * @param shape
+ * the shape for a new port
+ * @return a new layout node
+ *
+ * @author jayant
+ */
+ /* This is fairly general for both the eTrice editors */
+ protected KPort createPort(final LayoutMapping<PictogramElement> mapping,
+ final KNode parentNode, final Shape shape) {
+ KPort port = KimlUtil.createInitializedPort();
+ port.setNode(parentNode);
+
+ setCurrentPositionAndSize(mapping, parentNode, port, shape);
+
+ mapping.getGraphMap().put(port, shape.getAnchors().get(0));
+
+ // Set Port label
+ Shape portLabelShape = ((ContainerShape) shape).getChildren().get(0);
+ createKGaphElementFromShape(mapping, port, portLabelShape);
+
+ // gather all connections connected to the parentNode via this port
+ for (Anchor anchor : shape.getAnchors()) {
+ mapping.getProperty(KimlGraphitiUtil.CONNECTIONS).addAll(
+ anchor.getOutgoingConnections());
+ }
+
+ return port;
+ }
+
+ /**
+ * Sets the insets(border) and calculates the position and size of the
+ * KgraphElement.
+ *
+ * @param mapping
+ * the mapping of pictogram elements to graph elements
+ * @param parentNode
+ * the parent node
+ * @param kelem
+ * the kGraphElement whose size and position is to be determined
+ * @param shape
+ * the corresponding shape
+ *
+ * @author jayant
+ */
+ /*
+ * This is fairly general for both the eTrice editors and same for Nodes and
+ * Ports
+ */
+ public static void setCurrentPositionAndSize(
+ final LayoutMapping<PictogramElement> mapping,
+ final KNode parentNode, final KGraphElement kelem, final Shape shape) {
+
+ VolatileLayoutConfig staticConfig = mapping
+ .getProperty(KimlGraphitiUtil.STATIC_CONFIG);
+
+ KShapeLayout shapeLayout = kelem.getData(KShapeLayout.class);
+ GraphicsAlgorithm ga = shape.getGraphicsAlgorithm();
+
+ // Calculate and set the invisible insets
+ KInsets shapeInsets = KimlGraphitiUtil.calcInsets(ga);
+ shapeLayout
+ .setProperty(GraphitiLayoutCommand.INVIS_INSETS, shapeInsets);
+ staticConfig.setValue(GraphitiLayoutCommand.INVIS_INSETS, kelem,
+ LayoutContext.GRAPH_ELEM, shapeInsets);
+
+ // Get the parent insets
+ KInsets parentInsets = parentNode == null ? null : parentNode.getData(
+ KShapeLayout.class).getProperty(
+ GraphitiLayoutCommand.INVIS_INSETS);
+
+ // Set Position
+ if (parentInsets == null) {
+ shapeLayout.setPos(ga.getX() + shapeInsets.getLeft(), ga.getY()
+ + shapeInsets.getTop());
+ } else {
+ shapeLayout.setPos(
+ ga.getX() + shapeInsets.getLeft() - parentInsets.getLeft(),
+ ga.getY() + shapeInsets.getTop() - parentInsets.getTop());
+ }
+
+ // Set Size
+ shapeLayout
+ .setSize(
+ ga.getWidth() - shapeInsets.getLeft()
+ - shapeInsets.getRight(),
+ ga.getHeight() - shapeInsets.getTop()
+ - shapeInsets.getBottom());
+
+ // the modification flag must initially be false
+ ((KShapeLayoutImpl) shapeLayout).resetModificationFlag();
+
+ }
+
+ /**
+ * Determines whether the given shape is a port.
+ *
+ * @param shape the shape to be investigated
+ * @return true if the {@code shape} is a port else false
+ *
+ * @author jayant
+ */
+ protected abstract boolean isPort(Shape shape);
+
+ /**
+ * Determines whether the given shape is a Top Level Bounding Box or not.
+ *
+ * @param shape the shape to be investigated
+ * @return true if the {@code shape} is the Top Level Bounding Box
+ *
+ * @author jayant
+ */
+ protected abstract boolean isTopLevelBoundingBox(Shape shape);
+
+}
diff --git a/plugins/org.eclipse.etrice.ui.layout/src/org/eclipse/etrice/ui/layout/ETriceLayoutCommand.java b/plugins/org.eclipse.etrice.ui.layout/src/org/eclipse/etrice/ui/layout/ETriceLayoutCommand.java
new file mode 100644
index 0000000..c09dabf
--- /dev/null
+++ b/plugins/org.eclipse.etrice.ui.layout/src/org/eclipse/etrice/ui/layout/ETriceLayoutCommand.java
@@ -0,0 +1,167 @@
+/*******************************************************************************
+ * 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:
+ * Jayant Gupta (initial contribution)
+ *
+ *******************************************************************************/
+
+package org.eclipse.etrice.ui.layout;
+
+import java.util.List;
+
+import org.eclipse.emf.transaction.TransactionalEditingDomain;
+import org.eclipse.graphiti.features.IFeatureProvider;
+import org.eclipse.graphiti.features.context.impl.LayoutContext;
+import org.eclipse.graphiti.mm.algorithms.GraphicsAlgorithm;
+import org.eclipse.graphiti.mm.algorithms.styles.Point;
+import org.eclipse.graphiti.mm.pictograms.Anchor;
+import org.eclipse.graphiti.mm.pictograms.ContainerShape;
+import org.eclipse.graphiti.mm.pictograms.FreeFormConnection;
+import org.eclipse.graphiti.mm.pictograms.PictogramElement;
+import org.eclipse.graphiti.services.Graphiti;
+
+import de.cau.cs.kieler.core.kgraph.KEdge;
+import de.cau.cs.kieler.core.kgraph.KGraphElement;
+import de.cau.cs.kieler.core.kgraph.KNode;
+import de.cau.cs.kieler.core.kgraph.KPort;
+import de.cau.cs.kieler.core.math.KVector;
+import de.cau.cs.kieler.core.math.KVectorChain;
+import de.cau.cs.kieler.kiml.graphiti.GraphitiLayoutCommand;
+import de.cau.cs.kieler.kiml.klayoutdata.KInsets;
+import de.cau.cs.kieler.kiml.klayoutdata.KShapeLayout;
+
+/**
+ * A command for applying the result of automatic layout to an eTrice
+ * editor(Graphiti) diagram.
+ *
+ * @author jayant
+ */
+public class ETriceLayoutCommand extends GraphitiLayoutCommand {
+
+ public ETriceLayoutCommand(TransactionalEditingDomain domain,
+ IFeatureProvider thefeatureProvider) {
+ super(domain, thefeatureProvider);
+ }
+
+ /**
+ * {@inheritDoc}
+ *
+ * @author jayant
+ */
+ @Override
+ protected void applyPortLayout(KPort kport, PictogramElement pelem) {
+
+ ContainerShape shape = (ContainerShape) ((Anchor) pelem).getParent();
+
+ setCalculatedPositionAndSize(kport, kport.getNode(), shape);
+ };
+
+ /**
+ * {@inheritDoc}
+ *
+ * @author jayant
+ */
+ @Override
+ protected void applyNodeLayout(KNode knode, PictogramElement pelem) {
+
+ setCalculatedPositionAndSize(knode, knode.getParent(),
+ (ContainerShape) pelem);
+
+ };
+
+ /**
+ * {@inheritDoc}
+ *
+ */
+ /*
+ * The code used in this function has been taken from
+ * GraphitilayoutCommand.applyEdgeLayout() method. (Removing some unwanted
+ * code)
+ */
+ @Override
+ protected void applyEdgeLayout(final KEdge kedge,
+ final PictogramElement pelem) {
+ // create bend points for the edge
+ KVectorChain bendPoints = getBendPoints(kedge);
+
+ if (pelem instanceof FreeFormConnection) {
+ FreeFormConnection connection = (FreeFormConnection) pelem;
+ List<Point> pointList = connection.getBendpoints();
+ // add the bend points to the connection, reusing existing points
+ for (int i = 0; i < bendPoints.size(); i++) {
+ KVector kpoint = bendPoints.get(i);
+ if (i >= pointList.size()) {
+ Point point = Graphiti.getGaService().createPoint(
+ (int) Math.round(kpoint.x),
+ (int) Math.round(kpoint.y));
+ pointList.add(point);
+ } else {
+ Point point = pointList.get(i);
+ point.setX((int) Math.round(kpoint.x));
+ point.setY((int) Math.round(kpoint.y));
+ }
+ }
+ while (pointList.size() > bendPoints.size()) {
+ pointList.remove(pointList.size() - 1);
+ }
+ }
+ }
+
+ /**
+ * Sets the calculated position and size from a KGraph Model-Element (Node or
+ * Port) back to the corresponding diagram shape.
+ *
+ * @param kelem
+ * the KGraph Model Element (Node/Port)
+ * @param parentNode
+ * for nodes : the parent node , for ports : the containing node
+ * @param shape
+ * the corresponding pictogram element for Node/Port
+ *
+ * @author jayant
+ */
+ /*
+ * This function derives its code majorly from
+ * GraphitilayoutCommand.applyNodeLayout() method
+ */
+ private void setCalculatedPositionAndSize(final KGraphElement kelem,
+ KNode parentNode, final ContainerShape shape) {
+
+ KShapeLayout shapeLayout = kelem.getData(KShapeLayout.class);
+ float xpos = shapeLayout.getXpos();
+ float ypos = shapeLayout.getYpos();
+
+ if (parentNode != null) {
+ KInsets parentInsets = parentNode.getData(KShapeLayout.class)
+ .getProperty(INVIS_INSETS);
+ if (parentInsets != null) {
+ xpos += parentInsets.getLeft();
+ ypos += parentInsets.getRight();
+ }
+ }
+
+ float width = shapeLayout.getWidth();
+ float height = shapeLayout.getHeight();
+
+ KInsets nodeInsets = shapeLayout.getProperty(INVIS_INSETS);
+ if (nodeInsets != null) {
+ xpos -= nodeInsets.getLeft();
+ ypos -= nodeInsets.getTop();
+ width += nodeInsets.getLeft() + nodeInsets.getRight();
+ height += nodeInsets.getTop() + nodeInsets.getBottom();
+ }
+
+ GraphicsAlgorithm ga = shape.getGraphicsAlgorithm();
+
+ ga.setX(Math.round(xpos));
+ ga.setY(Math.round(ypos));
+ ga.setWidth(Math.round(width));
+ ga.setHeight(Math.round(height));
+
+ featureProvider.layoutIfPossible(new LayoutContext(shape));
+ }
+}
diff --git a/plugins/org.eclipse.etrice.ui.layout/src/org/eclipse/etrice/ui/layout/StructureDiagramLayoutmanager.java b/plugins/org.eclipse.etrice.ui.layout/src/org/eclipse/etrice/ui/layout/StructureDiagramLayoutmanager.java
new file mode 100644
index 0000000..5dd544f
--- /dev/null
+++ b/plugins/org.eclipse.etrice.ui.layout/src/org/eclipse/etrice/ui/layout/StructureDiagramLayoutmanager.java
@@ -0,0 +1,134 @@
+/*******************************************************************************
+ * 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:
+ * Jayant Gupta (initial contribution)
+ *
+ *******************************************************************************/
+package org.eclipse.etrice.ui.layout;
+
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.etrice.core.room.ActorClass;
+import org.eclipse.etrice.core.room.InterfaceItem;
+import org.eclipse.etrice.core.room.SAPoint;
+import org.eclipse.etrice.core.room.SPPoint;
+import org.eclipse.etrice.ui.structure.editor.StructureEditor;
+import org.eclipse.etrice.ui.structure.support.ActorContainerRefSupport;
+import org.eclipse.graphiti.mm.pictograms.Diagram;
+import org.eclipse.graphiti.mm.pictograms.PictogramElement;
+import org.eclipse.graphiti.mm.pictograms.Shape;
+import org.eclipse.graphiti.ui.internal.parts.IPictogramElementEditPart;
+
+import de.cau.cs.kieler.core.kgraph.KNode;
+import de.cau.cs.kieler.kiml.LayoutContext;
+import de.cau.cs.kieler.kiml.config.VolatileLayoutConfig;
+import de.cau.cs.kieler.kiml.graphiti.KimlGraphitiUtil;
+import de.cau.cs.kieler.kiml.options.LayoutOptions;
+import de.cau.cs.kieler.kiml.ui.diagram.LayoutMapping;
+import de.cau.cs.kieler.kiml.util.KimlUtil;
+
+/**
+ * Layout Manager implementation for eTrice Structure Editor.
+ *
+ * @author jayant
+ */
+@SuppressWarnings("restriction")
+public class StructureDiagramLayoutmanager extends ETriceDiagramLayoutManager {
+
+ /**
+ * {@inheritDoc}
+ *
+ * @author jayant
+ */
+ @Override
+ public boolean supports(final Object object) {
+
+ return object instanceof StructureEditor
+ || object instanceof IPictogramElementEditPart
+ || object instanceof PictogramElement;
+
+ }
+
+ /**
+ * {@inheritDoc}
+ *
+ * @author jayant
+ */
+ @Override
+ protected void buildLayoutGraphForBoundingBox(
+ LayoutMapping<PictogramElement> mapping, Diagram diagram,
+ KNode diagramNode, boolean onlyVisible) {
+
+ for (Shape boundingBox : ((Diagram) diagram).getChildren()) {
+ if (boundingBox.isVisible()) {
+ buildAllLevels(mapping, boundingBox, diagramNode);
+ break;
+ }
+ }
+ }
+
+ /** the fixed minimal height of nodes. */
+ public static final float MIN_HEIGHT = ActorContainerRefSupport.DEFAULT_SIZE_Y;
+ /** the fixed minimal width of shapes. */
+ public static final float MIN_WIDHT = ActorContainerRefSupport.DEFAULT_SIZE_X;
+
+ /**
+ * {@inheritDoc}
+ *
+ * @author jayant
+ */
+ protected KNode createNode(final LayoutMapping<PictogramElement> mapping,
+ final KNode parentNode, final Shape shape) {
+ KNode node = KimlUtil.createInitializedNode();
+ node.setParent(parentNode);
+
+ setCurrentPositionAndSize(mapping, parentNode, node, shape);
+
+ VolatileLayoutConfig staticConfig = mapping
+ .getProperty(KimlGraphitiUtil.STATIC_CONFIG);
+ // FIXME find a way to specify the minimal size dynamically
+
+ staticConfig.setValue(LayoutOptions.MIN_WIDTH, node,
+ LayoutContext.GRAPH_ELEM, MIN_WIDHT);
+ staticConfig.setValue(LayoutOptions.MIN_HEIGHT, node,
+ LayoutContext.GRAPH_ELEM, MIN_HEIGHT);
+
+ mapping.getGraphMap().put(node, shape);
+
+ return node;
+ }
+
+ /**
+ * {@inheritDoc}
+ *
+ * @author jayant
+ */
+ @Override
+ protected boolean isPort(Shape shape) {
+ EObject modelObject = shape.getLink().getBusinessObjects().get(0);
+ if (modelObject instanceof InterfaceItem
+ || modelObject instanceof SPPoint
+ || modelObject instanceof SAPoint)
+ return true;
+
+ return false;
+ }
+
+ /**
+ * {@inheritDoc}
+ *
+ * @author jayant
+ */
+ @Override
+ protected boolean isTopLevelBoundingBox(Shape shape) {
+ EObject modelObject = shape.getLink().getBusinessObjects().get(0);
+ if (modelObject instanceof ActorClass)
+ return true;
+
+ return false;
+ }
+
+}