]> gerrit.simantics Code Review - simantics/platform.git/blob - 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
1 /*******************************************************************************\r
2  * Copyright (c) 2007, 2010 Association for Decentralized Information Management\r
3  * in Industry THTH ry.\r
4  * All rights reserved. This program and the accompanying materials\r
5  * are made available under the terms of the Eclipse Public License v1.0\r
6  * which accompanies this distribution, and is available at\r
7  * http://www.eclipse.org/legal/epl-v10.html\r
8  *\r
9  * Contributors:\r
10  *     VTT Technical Research Centre of Finland - initial API and implementation\r
11  *******************************************************************************/\r
12 package org.simantics.modeling.ui.diagramEditor.tools;\r
13 \r
14 import java.util.ArrayList;\r
15 import java.util.List;\r
16 \r
17 import org.eclipse.jface.layout.GridDataFactory;\r
18 import org.eclipse.jface.layout.GridLayoutFactory;\r
19 import org.eclipse.jface.resource.ImageDescriptor;\r
20 import org.eclipse.jface.resource.LocalResourceManager;\r
21 import org.eclipse.jface.viewers.ISelection;\r
22 import org.eclipse.swt.SWT;\r
23 import org.eclipse.swt.events.SelectionAdapter;\r
24 import org.eclipse.swt.events.SelectionEvent;\r
25 import org.eclipse.swt.widgets.Button;\r
26 import org.eclipse.swt.widgets.Composite;\r
27 import org.eclipse.ui.forms.widgets.FormToolkit;\r
28 import org.simantics.db.ReadGraph;\r
29 import org.simantics.db.Resource;\r
30 import org.simantics.db.common.request.ReadRequest;\r
31 import org.simantics.db.exception.DatabaseException;\r
32 import org.simantics.diagram.elements.ElementTransforms;\r
33 import org.simantics.diagram.elements.ElementTransforms.SIDE;\r
34 import org.simantics.diagram.stubs.DiagramResource;\r
35 import org.simantics.modeling.ui.Activator;\r
36 import org.simantics.ui.SimanticsUI;\r
37 import org.simantics.ui.utils.ResourceAdaptionUtils;\r
38 \r
39 /**\r
40  * Diagramming alignment tools\r
41  * \r
42  * @author Marko Luukkainen <marko.luukkainen@vtt.fi>\r
43  */\r
44 public class AlignTools implements DiagramTools {\r
45 \r
46     private Resource selection[] = new Resource[0];\r
47 \r
48     Button alignLeft;\r
49     Button alignVertButton;\r
50     Button alignRight;\r
51     Button alignTop;\r
52     Button alignHorizButton;\r
53     Button alignBottom;\r
54     Button distLeft;\r
55     Button distVert;\r
56     Button distRight;\r
57     Button distVertBetween;\r
58     Button distTop;\r
59     Button distHoriz;\r
60     Button distBottom;\r
61     Button distHorizBetween;\r
62 \r
63     Button rotateCW;\r
64     Button rotateCCW;\r
65     Button flipX;\r
66     Button flipY;\r
67 \r
68 \r
69 \r
70     @Override\r
71     public String getName() {\r
72         return "Align";\r
73     }\r
74 \r
75 \r
76     @Override\r
77     public void createContols(Composite parent, FormToolkit toolkit, LocalResourceManager resourceManager) {\r
78         parent.setLayout(GridLayoutFactory.fillDefaults().numColumns(1).equalWidth(true).margins(0, 0).spacing(1,1).create());\r
79                 \r
80                 Composite alignComposite = new Composite(parent, SWT.NONE);\r
81                 Composite distributeComposite = new Composite(parent, SWT.NONE);\r
82                 Composite rotateComposite = new Composite(parent, SWT.NONE);\r
83                 alignComposite.setLayout(GridLayoutFactory.fillDefaults().numColumns(3).equalWidth(true).margins(0, 2).spacing(0, 0).create());\r
84                 distributeComposite.setLayout(GridLayoutFactory.fillDefaults().numColumns(4).equalWidth(true).margins(0, 2).spacing(0, 0).create());\r
85                 rotateComposite.setLayout(GridLayoutFactory.fillDefaults().numColumns(2).equalWidth(true).margins(0, 2).spacing(0, 0).create());\r
86 \r
87         GridDataFactory.fillDefaults().align(SWT.FILL, SWT.CENTER).applyTo(alignComposite);\r
88         GridDataFactory.fillDefaults().align(SWT.FILL, SWT.CENTER).applyTo(distributeComposite);\r
89         GridDataFactory.fillDefaults().align(SWT.FILL, SWT.CENTER).applyTo(rotateComposite);\r
90 \r
91         alignLeft = toolkit.createButton(alignComposite, "", SWT.PUSH);\r
92         //alignLeft.setText("Left");\r
93         alignLeft.setToolTipText("Align Left Edges");\r
94         GridDataFactory.fillDefaults().align(SWT.FILL, SWT.CENTER).applyTo(alignLeft);\r
95 \r
96         alignVertButton = toolkit.createButton(alignComposite, "", SWT.PUSH);\r
97         //alignVertButton.setText("Middle");\r
98         alignVertButton.setToolTipText("Center on Vertical Axis");\r
99         GridDataFactory.fillDefaults().align(SWT.FILL, SWT.CENTER).applyTo(alignVertButton);\r
100 \r
101         alignRight = toolkit.createButton(alignComposite, "", SWT.PUSH);\r
102         //alignRight.setText("Right");\r
103         alignRight.setToolTipText("Align Right Edges");\r
104         GridDataFactory.fillDefaults().align(SWT.FILL, SWT.CENTER).applyTo(alignRight);\r
105 \r
106         alignTop = toolkit.createButton(alignComposite, "", SWT.PUSH);\r
107         //alignTop.setText("Top");\r
108         alignTop.setToolTipText("Align Top Edges");\r
109         GridDataFactory.fillDefaults().align(SWT.FILL, SWT.CENTER).applyTo(alignTop);\r
110 \r
111         alignHorizButton = toolkit.createButton(alignComposite, "", SWT.PUSH);\r
112         //alignHorizButton.setText("Middle");\r
113         alignHorizButton.setToolTipText("Center on Horizontal Axis");\r
114         GridDataFactory.fillDefaults().align(SWT.FILL, SWT.CENTER).applyTo(alignHorizButton);\r
115 \r
116         alignBottom = toolkit.createButton(alignComposite, "", SWT.PUSH);\r
117         //alignBottom.setText("Bottom");\r
118         alignBottom.setToolTipText("Align Bottom Edges");\r
119         GridDataFactory.fillDefaults().align(SWT.FILL, SWT.CENTER).applyTo(alignBottom);\r
120 \r
121         distLeft = toolkit.createButton(distributeComposite, "", SWT.PUSH);\r
122         //distLeft.setText("Left");\r
123         distLeft.setToolTipText("Distribute Left Edges Equidistantly");\r
124         GridDataFactory.fillDefaults().align(SWT.FILL, SWT.CENTER).applyTo(distLeft);\r
125 \r
126         distVert = toolkit.createButton(distributeComposite, "", SWT.PUSH);\r
127         //distVert.setText("Middle");\r
128         distVert.setToolTipText("Distribute Centers Equidistantly Horizontally");\r
129         GridDataFactory.fillDefaults().align(SWT.FILL, SWT.CENTER).applyTo(distVert);\r
130 \r
131         distRight = toolkit.createButton(distributeComposite, "", SWT.PUSH);\r
132         //distRight.setText("Right");\r
133         distRight.setToolTipText("Distribute Right Edges Equidistantly");\r
134         GridDataFactory.fillDefaults().align(SWT.FILL, SWT.CENTER).applyTo(distRight);\r
135 \r
136         distVertBetween = toolkit.createButton(distributeComposite, "", SWT.PUSH);\r
137         //distVertBetween.setText("Between");\r
138         distVertBetween.setToolTipText("Make Horizontal Gaps Between Objects Equal");\r
139         GridDataFactory.fillDefaults().align(SWT.FILL, SWT.CENTER).applyTo(distVertBetween);\r
140 \r
141         distTop = toolkit.createButton(distributeComposite, "", SWT.PUSH);\r
142         //distTop.setText("Top");\r
143         distTop.setToolTipText("Distribute Top Edges Equidistantly");\r
144         GridDataFactory.fillDefaults().align(SWT.FILL, SWT.CENTER).applyTo(distTop);\r
145 \r
146         distHoriz = toolkit.createButton(distributeComposite, "", SWT.PUSH);\r
147         //distHoriz.setText("Middle");\r
148         distHoriz.setToolTipText("Distribute Centers Equidistantly Vertically");\r
149         GridDataFactory.fillDefaults().align(SWT.FILL, SWT.CENTER).applyTo(distHoriz);\r
150 \r
151         distBottom = toolkit.createButton(distributeComposite, "", SWT.PUSH);\r
152         //distBottom.setText("Bottom");\r
153         distBottom.setToolTipText("Distribute Bottom Edges Equidistantly");\r
154         GridDataFactory.fillDefaults().align(SWT.FILL, SWT.CENTER).applyTo(distBottom);\r
155 \r
156         distHorizBetween = toolkit.createButton(distributeComposite, "", SWT.PUSH);\r
157         //distHorizBetween.setText("Between");\r
158         distHorizBetween.setToolTipText("Make Vertical Gaps Between Objects Equal");\r
159         GridDataFactory.fillDefaults().align(SWT.FILL, SWT.CENTER).applyTo(distHorizBetween);\r
160 \r
161         rotateCCW = toolkit.createButton(rotateComposite, "", SWT.PUSH);\r
162         //rotateCCW.setText("rotate left");\r
163         rotateCCW.setToolTipText("Rotate Counterclockwise");\r
164         GridDataFactory.fillDefaults().align(SWT.FILL, SWT.CENTER).applyTo(rotateCCW);\r
165 \r
166         rotateCW = toolkit.createButton(rotateComposite, "", SWT.PUSH);\r
167         //rotateCW.setText("rotate right");\r
168         rotateCW.setToolTipText("Rotate Clockwise");\r
169         GridDataFactory.fillDefaults().align(SWT.FILL, SWT.CENTER).applyTo(rotateCW);\r
170 \r
171         flipX = toolkit.createButton(rotateComposite, "", SWT.PUSH);\r
172         //flipX.setText("flip");\r
173         flipX.setToolTipText("Flip About Horizontal Axis");\r
174         GridDataFactory.fillDefaults().align(SWT.FILL, SWT.CENTER).applyTo(flipX);\r
175 \r
176         flipY = toolkit.createButton(rotateComposite, "", SWT.PUSH);\r
177         //flipY.setText("mirror");\r
178         flipY.setToolTipText("Flip About Vertical Axis");\r
179         GridDataFactory.fillDefaults().align(SWT.FILL, SWT.CENTER).applyTo(flipY);\r
180 \r
181         alignVertButton.addSelectionListener(new SelectionAdapter() {\r
182             @Override\r
183             public void widgetSelected(SelectionEvent e) {\r
184                 ElementTransforms.align(getSelected(), SIDE.VERT);\r
185             }\r
186         });\r
187 \r
188         alignHorizButton.addSelectionListener(new SelectionAdapter() {\r
189             @Override\r
190             public void widgetSelected(SelectionEvent e) {\r
191                 ElementTransforms.align(getSelected(),SIDE.HORIZ);\r
192             }\r
193         });\r
194 \r
195         alignLeft.addSelectionListener(new SelectionAdapter() {\r
196             @Override\r
197             public void widgetSelected(SelectionEvent e) {\r
198                 ElementTransforms.align(getSelected(),SIDE.LEFT);\r
199             }\r
200         });\r
201 \r
202         alignRight.addSelectionListener(new SelectionAdapter() {\r
203             @Override\r
204             public void widgetSelected(SelectionEvent e) {\r
205                 ElementTransforms.align(getSelected(),SIDE.RIGHT);\r
206             }\r
207         });\r
208 \r
209         alignTop.addSelectionListener(new SelectionAdapter() {\r
210             @Override\r
211             public void widgetSelected(SelectionEvent e) {\r
212                 ElementTransforms.align(getSelected(),SIDE.TOP);\r
213             }\r
214         });\r
215 \r
216         alignBottom.addSelectionListener(new SelectionAdapter() {\r
217             @Override\r
218             public void widgetSelected(SelectionEvent e) {\r
219                 ElementTransforms.align(getSelected(),SIDE.BOTTOM);\r
220             }\r
221         });\r
222 \r
223         distLeft.addSelectionListener(new SelectionAdapter() {\r
224             @Override\r
225             public void widgetSelected(SelectionEvent e) {\r
226                 ElementTransforms.dist(getSelected(),SIDE.LEFT);\r
227             }\r
228         });\r
229 \r
230         distVert.addSelectionListener(new SelectionAdapter() {\r
231             @Override\r
232             public void widgetSelected(SelectionEvent e) {\r
233                 ElementTransforms.dist(getSelected(),SIDE.VERT);\r
234             }\r
235         });\r
236 \r
237         distRight.addSelectionListener(new SelectionAdapter() {\r
238             @Override\r
239             public void widgetSelected(SelectionEvent e) {\r
240                 ElementTransforms.dist(getSelected(),SIDE.RIGHT);\r
241             }\r
242         });\r
243 \r
244         distVertBetween.addSelectionListener(new SelectionAdapter() {\r
245             @Override\r
246             public void widgetSelected(SelectionEvent e) {\r
247                 ElementTransforms.dist(getSelected(),SIDE.VERT_BTW);\r
248             }\r
249         });\r
250 \r
251         distTop.addSelectionListener(new SelectionAdapter() {\r
252             @Override\r
253             public void widgetSelected(SelectionEvent e) {\r
254                 ElementTransforms.dist(getSelected(),SIDE.TOP);\r
255             }\r
256         });\r
257 \r
258         distHoriz.addSelectionListener(new SelectionAdapter() {\r
259             @Override\r
260             public void widgetSelected(SelectionEvent e) {\r
261                 ElementTransforms.dist(getSelected(),SIDE.HORIZ);\r
262             }\r
263         });\r
264 \r
265         distBottom.addSelectionListener(new SelectionAdapter() {\r
266             @Override\r
267             public void widgetSelected(SelectionEvent e) {\r
268                 ElementTransforms.dist(getSelected(),SIDE.BOTTOM);\r
269             }\r
270         });\r
271 \r
272         distHorizBetween.addSelectionListener(new SelectionAdapter() {\r
273             @Override\r
274             public void widgetSelected(SelectionEvent e) {\r
275                 ElementTransforms.dist(getSelected(),SIDE.HORIZ_BTW);\r
276             }\r
277         });\r
278 \r
279         rotateCW.addSelectionListener(new SelectionAdapter() {\r
280             @Override\r
281             public void widgetSelected(SelectionEvent e) {\r
282                 ElementTransforms.rotate(getSelected(),true);\r
283             }\r
284         });\r
285 \r
286         rotateCCW.addSelectionListener(new SelectionAdapter() {\r
287             @Override\r
288             public void widgetSelected(SelectionEvent e) {\r
289                 ElementTransforms.rotate(getSelected(),false);\r
290             }\r
291         });\r
292 \r
293         flipX.addSelectionListener(new SelectionAdapter() {\r
294             @Override\r
295             public void widgetSelected(SelectionEvent e) {\r
296                 ElementTransforms.flip(getSelected(),true);\r
297             }\r
298         });\r
299 \r
300         flipY.addSelectionListener(new SelectionAdapter() {\r
301             @Override\r
302             public void widgetSelected(SelectionEvent e) {\r
303                 ElementTransforms.flip(getSelected(),false);\r
304             }\r
305         });\r
306 \r
307         alignLeft.setImage(resourceManager.createImage(ImageDescriptor.createFromURL(Activator.getDefault().getBundle().getResource("icons/align_left.png"))));\r
308         alignVertButton.setImage(resourceManager.createImage(ImageDescriptor.createFromURL(Activator.getDefault().getBundle().getResource("icons/align_center.png"))));\r
309         alignRight.setImage(resourceManager.createImage(ImageDescriptor.createFromURL(Activator.getDefault().getBundle().getResource("icons/align_right.png"))));\r
310         alignTop.setImage(resourceManager.createImage(ImageDescriptor.createFromURL(Activator.getDefault().getBundle().getResource("icons/align_top.png"))));\r
311         alignHorizButton.setImage(resourceManager.createImage(ImageDescriptor.createFromURL(Activator.getDefault().getBundle().getResource("icons/align_middle.png"))));\r
312         alignBottom.setImage(resourceManager.createImage(ImageDescriptor.createFromURL(Activator.getDefault().getBundle().getResource("icons/align_bottom.png"))));\r
313 \r
314         distLeft.setImage(resourceManager.createImage(ImageDescriptor.createFromURL(Activator.getDefault().getBundle().getResource("icons/dist_left.png"))));\r
315         distVert.setImage(resourceManager.createImage(ImageDescriptor.createFromURL(Activator.getDefault().getBundle().getResource("icons/dist_center.png"))));\r
316         distRight.setImage(resourceManager.createImage(ImageDescriptor.createFromURL(Activator.getDefault().getBundle().getResource("icons/dist_right.png"))));\r
317         distVertBetween.setImage(resourceManager.createImage(ImageDescriptor.createFromURL(Activator.getDefault().getBundle().getResource("icons/dist_horiz.png"))));\r
318         distTop.setImage(resourceManager.createImage(ImageDescriptor.createFromURL(Activator.getDefault().getBundle().getResource("icons/dist_top.png"))));\r
319         distHoriz.setImage(resourceManager.createImage(ImageDescriptor.createFromURL(Activator.getDefault().getBundle().getResource("icons/dist_middle.png"))));\r
320         distBottom.setImage(resourceManager.createImage(ImageDescriptor.createFromURL(Activator.getDefault().getBundle().getResource("icons/dist_bottom.png"))));\r
321         distHorizBetween.setImage(resourceManager.createImage(ImageDescriptor.createFromURL(Activator.getDefault().getBundle().getResource("icons/dist_vert.png"))));\r
322 \r
323         rotateCCW.setImage(resourceManager.createImage(ImageDescriptor.createFromURL(Activator.getDefault().getBundle().getResource("icons/rotate_left.png"))));\r
324         rotateCW.setImage(resourceManager.createImage(ImageDescriptor.createFromURL(Activator.getDefault().getBundle().getResource("icons/rotate_right.png"))));\r
325         flipX.setImage(resourceManager.createImage(ImageDescriptor.createFromURL(Activator.getDefault().getBundle().getResource("icons/flip_x.png"))));\r
326         flipY.setImage(resourceManager.createImage(ImageDescriptor.createFromURL(Activator.getDefault().getBundle().getResource("icons/flip_y.png"))));\r
327 \r
328         updateUI();\r
329     }\r
330 \r
331     @Override\r
332     public void setSelection(ISelection s) {\r
333         this.selection = ResourceAdaptionUtils.toResources(s);\r
334         try {\r
335             SimanticsUI.getSession().syncRequest(new ReadRequest() {\r
336 \r
337                 @Override\r
338                 public void run(ReadGraph graph) throws DatabaseException {\r
339                     DiagramResource dr = DiagramResource.getInstance(graph);\r
340                     List<Resource> sel = new ArrayList<Resource>();\r
341                     for (Resource r : selection) {\r
342                         if(graph.isInstanceOf(r, dr.Element) && !graph.isInstanceOf(r, dr.Connection) /*&& !graph.isInstanceOf(r, dr.Monitor)*/) {\r
343                             sel.add(r);\r
344                         }\r
345                     }\r
346                     selection = sel.toArray(new Resource[sel.size()]);\r
347 \r
348                 }\r
349             });\r
350 \r
351             updateUI();\r
352         } catch (DatabaseException e) {\r
353             // TODO Auto-generated catch block\r
354             e.printStackTrace();\r
355         }\r
356     }\r
357 \r
358     private void updateUI() {\r
359         boolean showAlign = selection.length >= 2;\r
360         boolean showDist = selection.length >= 3;\r
361         boolean showRotate = selection.length >= 1;\r
362         alignBottom.setEnabled(showAlign);\r
363         alignHorizButton.setEnabled(showAlign);\r
364         alignLeft.setEnabled(showAlign);\r
365         alignRight.setEnabled(showAlign);\r
366         alignTop.setEnabled(showAlign);\r
367         alignVertButton.setEnabled(showAlign);\r
368 \r
369         distBottom.setEnabled(showDist);\r
370         distHoriz.setEnabled(showDist);\r
371         distHorizBetween.setEnabled(showDist);\r
372         distLeft.setEnabled(showDist);\r
373         distRight.setEnabled(showDist);\r
374         distTop.setEnabled(showDist);\r
375         distVert.setEnabled(showDist);\r
376         distVertBetween.setEnabled(showDist);\r
377 \r
378         rotateCCW.setEnabled(showRotate);\r
379         rotateCW.setEnabled(showRotate);\r
380         flipX.setEnabled(showRotate);\r
381         flipY.setEnabled(showRotate);\r
382     }\r
383 \r
384     @Override\r
385     public void dispose() {\r
386 \r
387     }\r
388 \r
389     private Resource[] getSelected() {\r
390         return selection;\r
391     }\r
392 \r
393 }\r