--- /dev/null
+/*******************************************************************************\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