]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.modeling.ui/src/org/simantics/modeling/ui/diagramEditor/tools/AlignTools.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.modeling.ui / src / org / simantics / modeling / ui / diagramEditor / tools / AlignTools.java
diff --git a/bundles/org.simantics.modeling.ui/src/org/simantics/modeling/ui/diagramEditor/tools/AlignTools.java b/bundles/org.simantics.modeling.ui/src/org/simantics/modeling/ui/diagramEditor/tools/AlignTools.java
new file mode 100644 (file)
index 0000000..ecff1b9
--- /dev/null
@@ -0,0 +1,393 @@
+/*******************************************************************************\r
+ * Copyright (c) 2007, 2010 Association for Decentralized Information Management\r
+ * in Industry THTH ry.\r
+ * All rights reserved. This program and the accompanying materials\r
+ * are made available under the terms of the Eclipse Public License v1.0\r
+ * which accompanies this distribution, and is available at\r
+ * http://www.eclipse.org/legal/epl-v10.html\r
+ *\r
+ * Contributors:\r
+ *     VTT Technical Research Centre of Finland - initial API and implementation\r
+ *******************************************************************************/\r
+package org.simantics.modeling.ui.diagramEditor.tools;\r
+\r
+import java.util.ArrayList;\r
+import java.util.List;\r
+\r
+import org.eclipse.jface.layout.GridDataFactory;\r
+import org.eclipse.jface.layout.GridLayoutFactory;\r
+import org.eclipse.jface.resource.ImageDescriptor;\r
+import org.eclipse.jface.resource.LocalResourceManager;\r
+import org.eclipse.jface.viewers.ISelection;\r
+import org.eclipse.swt.SWT;\r
+import org.eclipse.swt.events.SelectionAdapter;\r
+import org.eclipse.swt.events.SelectionEvent;\r
+import org.eclipse.swt.widgets.Button;\r
+import org.eclipse.swt.widgets.Composite;\r
+import org.eclipse.ui.forms.widgets.FormToolkit;\r
+import org.simantics.db.ReadGraph;\r
+import org.simantics.db.Resource;\r
+import org.simantics.db.common.request.ReadRequest;\r
+import org.simantics.db.exception.DatabaseException;\r
+import org.simantics.diagram.elements.ElementTransforms;\r
+import org.simantics.diagram.elements.ElementTransforms.SIDE;\r
+import org.simantics.diagram.stubs.DiagramResource;\r
+import org.simantics.modeling.ui.Activator;\r
+import org.simantics.ui.SimanticsUI;\r
+import org.simantics.ui.utils.ResourceAdaptionUtils;\r
+\r
+/**\r
+ * Diagramming alignment tools\r
+ * \r
+ * @author Marko Luukkainen <marko.luukkainen@vtt.fi>\r
+ */\r
+public class AlignTools implements DiagramTools {\r
+\r
+    private Resource selection[] = new Resource[0];\r
+\r
+    Button alignLeft;\r
+    Button alignVertButton;\r
+    Button alignRight;\r
+    Button alignTop;\r
+    Button alignHorizButton;\r
+    Button alignBottom;\r
+    Button distLeft;\r
+    Button distVert;\r
+    Button distRight;\r
+    Button distVertBetween;\r
+    Button distTop;\r
+    Button distHoriz;\r
+    Button distBottom;\r
+    Button distHorizBetween;\r
+\r
+    Button rotateCW;\r
+    Button rotateCCW;\r
+    Button flipX;\r
+    Button flipY;\r
+\r
+\r
+\r
+    @Override\r
+    public String getName() {\r
+        return "Align";\r
+    }\r
+\r
+\r
+    @Override\r
+    public void createContols(Composite parent, FormToolkit toolkit, LocalResourceManager resourceManager) {\r
+       parent.setLayout(GridLayoutFactory.fillDefaults().numColumns(1).equalWidth(true).margins(0, 0).spacing(1,1).create());\r
+               \r
+               Composite alignComposite = new Composite(parent, SWT.NONE);\r
+               Composite distributeComposite = new Composite(parent, SWT.NONE);\r
+               Composite rotateComposite = new Composite(parent, SWT.NONE);\r
+               alignComposite.setLayout(GridLayoutFactory.fillDefaults().numColumns(3).equalWidth(true).margins(0, 2).spacing(0, 0).create());\r
+               distributeComposite.setLayout(GridLayoutFactory.fillDefaults().numColumns(4).equalWidth(true).margins(0, 2).spacing(0, 0).create());\r
+               rotateComposite.setLayout(GridLayoutFactory.fillDefaults().numColumns(2).equalWidth(true).margins(0, 2).spacing(0, 0).create());\r
+\r
+        GridDataFactory.fillDefaults().align(SWT.FILL, SWT.CENTER).applyTo(alignComposite);\r
+        GridDataFactory.fillDefaults().align(SWT.FILL, SWT.CENTER).applyTo(distributeComposite);\r
+        GridDataFactory.fillDefaults().align(SWT.FILL, SWT.CENTER).applyTo(rotateComposite);\r
+\r
+        alignLeft = toolkit.createButton(alignComposite, "", SWT.PUSH);\r
+        //alignLeft.setText("Left");\r
+        alignLeft.setToolTipText("Align Left Edges");\r
+        GridDataFactory.fillDefaults().align(SWT.FILL, SWT.CENTER).applyTo(alignLeft);\r
+\r
+        alignVertButton = toolkit.createButton(alignComposite, "", SWT.PUSH);\r
+        //alignVertButton.setText("Middle");\r
+        alignVertButton.setToolTipText("Center on Vertical Axis");\r
+        GridDataFactory.fillDefaults().align(SWT.FILL, SWT.CENTER).applyTo(alignVertButton);\r
+\r
+        alignRight = toolkit.createButton(alignComposite, "", SWT.PUSH);\r
+        //alignRight.setText("Right");\r
+        alignRight.setToolTipText("Align Right Edges");\r
+        GridDataFactory.fillDefaults().align(SWT.FILL, SWT.CENTER).applyTo(alignRight);\r
+\r
+        alignTop = toolkit.createButton(alignComposite, "", SWT.PUSH);\r
+        //alignTop.setText("Top");\r
+        alignTop.setToolTipText("Align Top Edges");\r
+        GridDataFactory.fillDefaults().align(SWT.FILL, SWT.CENTER).applyTo(alignTop);\r
+\r
+        alignHorizButton = toolkit.createButton(alignComposite, "", SWT.PUSH);\r
+        //alignHorizButton.setText("Middle");\r
+        alignHorizButton.setToolTipText("Center on Horizontal Axis");\r
+        GridDataFactory.fillDefaults().align(SWT.FILL, SWT.CENTER).applyTo(alignHorizButton);\r
+\r
+        alignBottom = toolkit.createButton(alignComposite, "", SWT.PUSH);\r
+        //alignBottom.setText("Bottom");\r
+        alignBottom.setToolTipText("Align Bottom Edges");\r
+        GridDataFactory.fillDefaults().align(SWT.FILL, SWT.CENTER).applyTo(alignBottom);\r
+\r
+        distLeft = toolkit.createButton(distributeComposite, "", SWT.PUSH);\r
+        //distLeft.setText("Left");\r
+        distLeft.setToolTipText("Distribute Left Edges Equidistantly");\r
+        GridDataFactory.fillDefaults().align(SWT.FILL, SWT.CENTER).applyTo(distLeft);\r
+\r
+        distVert = toolkit.createButton(distributeComposite, "", SWT.PUSH);\r
+        //distVert.setText("Middle");\r
+        distVert.setToolTipText("Distribute Centers Equidistantly Horizontally");\r
+        GridDataFactory.fillDefaults().align(SWT.FILL, SWT.CENTER).applyTo(distVert);\r
+\r
+        distRight = toolkit.createButton(distributeComposite, "", SWT.PUSH);\r
+        //distRight.setText("Right");\r
+        distRight.setToolTipText("Distribute Right Edges Equidistantly");\r
+        GridDataFactory.fillDefaults().align(SWT.FILL, SWT.CENTER).applyTo(distRight);\r
+\r
+        distVertBetween = toolkit.createButton(distributeComposite, "", SWT.PUSH);\r
+        //distVertBetween.setText("Between");\r
+        distVertBetween.setToolTipText("Make Horizontal Gaps Between Objects Equal");\r
+        GridDataFactory.fillDefaults().align(SWT.FILL, SWT.CENTER).applyTo(distVertBetween);\r
+\r
+        distTop = toolkit.createButton(distributeComposite, "", SWT.PUSH);\r
+        //distTop.setText("Top");\r
+        distTop.setToolTipText("Distribute Top Edges Equidistantly");\r
+        GridDataFactory.fillDefaults().align(SWT.FILL, SWT.CENTER).applyTo(distTop);\r
+\r
+        distHoriz = toolkit.createButton(distributeComposite, "", SWT.PUSH);\r
+        //distHoriz.setText("Middle");\r
+        distHoriz.setToolTipText("Distribute Centers Equidistantly Vertically");\r
+        GridDataFactory.fillDefaults().align(SWT.FILL, SWT.CENTER).applyTo(distHoriz);\r
+\r
+        distBottom = toolkit.createButton(distributeComposite, "", SWT.PUSH);\r
+        //distBottom.setText("Bottom");\r
+        distBottom.setToolTipText("Distribute Bottom Edges Equidistantly");\r
+        GridDataFactory.fillDefaults().align(SWT.FILL, SWT.CENTER).applyTo(distBottom);\r
+\r
+        distHorizBetween = toolkit.createButton(distributeComposite, "", SWT.PUSH);\r
+        //distHorizBetween.setText("Between");\r
+        distHorizBetween.setToolTipText("Make Vertical Gaps Between Objects Equal");\r
+        GridDataFactory.fillDefaults().align(SWT.FILL, SWT.CENTER).applyTo(distHorizBetween);\r
+\r
+        rotateCCW = toolkit.createButton(rotateComposite, "", SWT.PUSH);\r
+        //rotateCCW.setText("rotate left");\r
+        rotateCCW.setToolTipText("Rotate Counterclockwise");\r
+        GridDataFactory.fillDefaults().align(SWT.FILL, SWT.CENTER).applyTo(rotateCCW);\r
+\r
+        rotateCW = toolkit.createButton(rotateComposite, "", SWT.PUSH);\r
+        //rotateCW.setText("rotate right");\r
+        rotateCW.setToolTipText("Rotate Clockwise");\r
+        GridDataFactory.fillDefaults().align(SWT.FILL, SWT.CENTER).applyTo(rotateCW);\r
+\r
+        flipX = toolkit.createButton(rotateComposite, "", SWT.PUSH);\r
+        //flipX.setText("flip");\r
+        flipX.setToolTipText("Flip About Horizontal Axis");\r
+        GridDataFactory.fillDefaults().align(SWT.FILL, SWT.CENTER).applyTo(flipX);\r
+\r
+        flipY = toolkit.createButton(rotateComposite, "", SWT.PUSH);\r
+        //flipY.setText("mirror");\r
+        flipY.setToolTipText("Flip About Vertical Axis");\r
+        GridDataFactory.fillDefaults().align(SWT.FILL, SWT.CENTER).applyTo(flipY);\r
+\r
+        alignVertButton.addSelectionListener(new SelectionAdapter() {\r
+            @Override\r
+            public void widgetSelected(SelectionEvent e) {\r
+                ElementTransforms.align(getSelected(), SIDE.VERT);\r
+            }\r
+        });\r
+\r
+        alignHorizButton.addSelectionListener(new SelectionAdapter() {\r
+            @Override\r
+            public void widgetSelected(SelectionEvent e) {\r
+                ElementTransforms.align(getSelected(),SIDE.HORIZ);\r
+            }\r
+        });\r
+\r
+        alignLeft.addSelectionListener(new SelectionAdapter() {\r
+            @Override\r
+            public void widgetSelected(SelectionEvent e) {\r
+                ElementTransforms.align(getSelected(),SIDE.LEFT);\r
+            }\r
+        });\r
+\r
+        alignRight.addSelectionListener(new SelectionAdapter() {\r
+            @Override\r
+            public void widgetSelected(SelectionEvent e) {\r
+                ElementTransforms.align(getSelected(),SIDE.RIGHT);\r
+            }\r
+        });\r
+\r
+        alignTop.addSelectionListener(new SelectionAdapter() {\r
+            @Override\r
+            public void widgetSelected(SelectionEvent e) {\r
+                ElementTransforms.align(getSelected(),SIDE.TOP);\r
+            }\r
+        });\r
+\r
+        alignBottom.addSelectionListener(new SelectionAdapter() {\r
+            @Override\r
+            public void widgetSelected(SelectionEvent e) {\r
+                ElementTransforms.align(getSelected(),SIDE.BOTTOM);\r
+            }\r
+        });\r
+\r
+        distLeft.addSelectionListener(new SelectionAdapter() {\r
+            @Override\r
+            public void widgetSelected(SelectionEvent e) {\r
+                ElementTransforms.dist(getSelected(),SIDE.LEFT);\r
+            }\r
+        });\r
+\r
+        distVert.addSelectionListener(new SelectionAdapter() {\r
+            @Override\r
+            public void widgetSelected(SelectionEvent e) {\r
+                ElementTransforms.dist(getSelected(),SIDE.VERT);\r
+            }\r
+        });\r
+\r
+        distRight.addSelectionListener(new SelectionAdapter() {\r
+            @Override\r
+            public void widgetSelected(SelectionEvent e) {\r
+                ElementTransforms.dist(getSelected(),SIDE.RIGHT);\r
+            }\r
+        });\r
+\r
+        distVertBetween.addSelectionListener(new SelectionAdapter() {\r
+            @Override\r
+            public void widgetSelected(SelectionEvent e) {\r
+                ElementTransforms.dist(getSelected(),SIDE.VERT_BTW);\r
+            }\r
+        });\r
+\r
+        distTop.addSelectionListener(new SelectionAdapter() {\r
+            @Override\r
+            public void widgetSelected(SelectionEvent e) {\r
+                ElementTransforms.dist(getSelected(),SIDE.TOP);\r
+            }\r
+        });\r
+\r
+        distHoriz.addSelectionListener(new SelectionAdapter() {\r
+            @Override\r
+            public void widgetSelected(SelectionEvent e) {\r
+                ElementTransforms.dist(getSelected(),SIDE.HORIZ);\r
+            }\r
+        });\r
+\r
+        distBottom.addSelectionListener(new SelectionAdapter() {\r
+            @Override\r
+            public void widgetSelected(SelectionEvent e) {\r
+                ElementTransforms.dist(getSelected(),SIDE.BOTTOM);\r
+            }\r
+        });\r
+\r
+        distHorizBetween.addSelectionListener(new SelectionAdapter() {\r
+            @Override\r
+            public void widgetSelected(SelectionEvent e) {\r
+                ElementTransforms.dist(getSelected(),SIDE.HORIZ_BTW);\r
+            }\r
+        });\r
+\r
+        rotateCW.addSelectionListener(new SelectionAdapter() {\r
+            @Override\r
+            public void widgetSelected(SelectionEvent e) {\r
+                ElementTransforms.rotate(getSelected(),true);\r
+            }\r
+        });\r
+\r
+        rotateCCW.addSelectionListener(new SelectionAdapter() {\r
+            @Override\r
+            public void widgetSelected(SelectionEvent e) {\r
+                ElementTransforms.rotate(getSelected(),false);\r
+            }\r
+        });\r
+\r
+        flipX.addSelectionListener(new SelectionAdapter() {\r
+            @Override\r
+            public void widgetSelected(SelectionEvent e) {\r
+                ElementTransforms.flip(getSelected(),true);\r
+            }\r
+        });\r
+\r
+        flipY.addSelectionListener(new SelectionAdapter() {\r
+            @Override\r
+            public void widgetSelected(SelectionEvent e) {\r
+                ElementTransforms.flip(getSelected(),false);\r
+            }\r
+        });\r
+\r
+        alignLeft.setImage(resourceManager.createImage(ImageDescriptor.createFromURL(Activator.getDefault().getBundle().getResource("icons/align_left.png"))));\r
+        alignVertButton.setImage(resourceManager.createImage(ImageDescriptor.createFromURL(Activator.getDefault().getBundle().getResource("icons/align_center.png"))));\r
+        alignRight.setImage(resourceManager.createImage(ImageDescriptor.createFromURL(Activator.getDefault().getBundle().getResource("icons/align_right.png"))));\r
+        alignTop.setImage(resourceManager.createImage(ImageDescriptor.createFromURL(Activator.getDefault().getBundle().getResource("icons/align_top.png"))));\r
+        alignHorizButton.setImage(resourceManager.createImage(ImageDescriptor.createFromURL(Activator.getDefault().getBundle().getResource("icons/align_middle.png"))));\r
+        alignBottom.setImage(resourceManager.createImage(ImageDescriptor.createFromURL(Activator.getDefault().getBundle().getResource("icons/align_bottom.png"))));\r
+\r
+        distLeft.setImage(resourceManager.createImage(ImageDescriptor.createFromURL(Activator.getDefault().getBundle().getResource("icons/dist_left.png"))));\r
+        distVert.setImage(resourceManager.createImage(ImageDescriptor.createFromURL(Activator.getDefault().getBundle().getResource("icons/dist_center.png"))));\r
+        distRight.setImage(resourceManager.createImage(ImageDescriptor.createFromURL(Activator.getDefault().getBundle().getResource("icons/dist_right.png"))));\r
+        distVertBetween.setImage(resourceManager.createImage(ImageDescriptor.createFromURL(Activator.getDefault().getBundle().getResource("icons/dist_horiz.png"))));\r
+        distTop.setImage(resourceManager.createImage(ImageDescriptor.createFromURL(Activator.getDefault().getBundle().getResource("icons/dist_top.png"))));\r
+        distHoriz.setImage(resourceManager.createImage(ImageDescriptor.createFromURL(Activator.getDefault().getBundle().getResource("icons/dist_middle.png"))));\r
+        distBottom.setImage(resourceManager.createImage(ImageDescriptor.createFromURL(Activator.getDefault().getBundle().getResource("icons/dist_bottom.png"))));\r
+        distHorizBetween.setImage(resourceManager.createImage(ImageDescriptor.createFromURL(Activator.getDefault().getBundle().getResource("icons/dist_vert.png"))));\r
+\r
+        rotateCCW.setImage(resourceManager.createImage(ImageDescriptor.createFromURL(Activator.getDefault().getBundle().getResource("icons/rotate_left.png"))));\r
+        rotateCW.setImage(resourceManager.createImage(ImageDescriptor.createFromURL(Activator.getDefault().getBundle().getResource("icons/rotate_right.png"))));\r
+        flipX.setImage(resourceManager.createImage(ImageDescriptor.createFromURL(Activator.getDefault().getBundle().getResource("icons/flip_x.png"))));\r
+        flipY.setImage(resourceManager.createImage(ImageDescriptor.createFromURL(Activator.getDefault().getBundle().getResource("icons/flip_y.png"))));\r
+\r
+        updateUI();\r
+    }\r
+\r
+    @Override\r
+    public void setSelection(ISelection s) {\r
+        this.selection = ResourceAdaptionUtils.toResources(s);\r
+        try {\r
+            SimanticsUI.getSession().syncRequest(new ReadRequest() {\r
+\r
+                @Override\r
+                public void run(ReadGraph graph) throws DatabaseException {\r
+                    DiagramResource dr = DiagramResource.getInstance(graph);\r
+                    List<Resource> sel = new ArrayList<Resource>();\r
+                    for (Resource r : selection) {\r
+                        if(graph.isInstanceOf(r, dr.Element) && !graph.isInstanceOf(r, dr.Connection) /*&& !graph.isInstanceOf(r, dr.Monitor)*/) {\r
+                            sel.add(r);\r
+                        }\r
+                    }\r
+                    selection = sel.toArray(new Resource[sel.size()]);\r
+\r
+                }\r
+            });\r
+\r
+            updateUI();\r
+        } catch (DatabaseException e) {\r
+            // TODO Auto-generated catch block\r
+            e.printStackTrace();\r
+        }\r
+    }\r
+\r
+    private void updateUI() {\r
+        boolean showAlign = selection.length >= 2;\r
+        boolean showDist = selection.length >= 3;\r
+        boolean showRotate = selection.length >= 1;\r
+        alignBottom.setEnabled(showAlign);\r
+        alignHorizButton.setEnabled(showAlign);\r
+        alignLeft.setEnabled(showAlign);\r
+        alignRight.setEnabled(showAlign);\r
+        alignTop.setEnabled(showAlign);\r
+        alignVertButton.setEnabled(showAlign);\r
+\r
+        distBottom.setEnabled(showDist);\r
+        distHoriz.setEnabled(showDist);\r
+        distHorizBetween.setEnabled(showDist);\r
+        distLeft.setEnabled(showDist);\r
+        distRight.setEnabled(showDist);\r
+        distTop.setEnabled(showDist);\r
+        distVert.setEnabled(showDist);\r
+        distVertBetween.setEnabled(showDist);\r
+\r
+        rotateCCW.setEnabled(showRotate);\r
+        rotateCW.setEnabled(showRotate);\r
+        flipX.setEnabled(showRotate);\r
+        flipY.setEnabled(showRotate);\r
+    }\r
+\r
+    @Override\r
+    public void dispose() {\r
+\r
+    }\r
+\r
+    private Resource[] getSelected() {\r
+        return selection;\r
+    }\r
+\r
+}\r