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
10 * VTT Technical Research Centre of Finland - initial API and implementation
\r
11 *******************************************************************************/
\r
12 package org.simantics.modeling.ui.diagramEditor.tools;
\r
14 import java.util.ArrayList;
\r
15 import java.util.List;
\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
40 * Diagramming alignment tools
\r
42 * @author Marko Luukkainen <marko.luukkainen@vtt.fi>
\r
44 public class AlignTools implements DiagramTools {
\r
46 private Resource selection[] = new Resource[0];
\r
49 Button alignVertButton;
\r
52 Button alignHorizButton;
\r
57 Button distVertBetween;
\r
61 Button distHorizBetween;
\r
71 public String getName() {
\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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
181 alignVertButton.addSelectionListener(new SelectionAdapter() {
\r
183 public void widgetSelected(SelectionEvent e) {
\r
184 ElementTransforms.align(getSelected(), SIDE.VERT);
\r
188 alignHorizButton.addSelectionListener(new SelectionAdapter() {
\r
190 public void widgetSelected(SelectionEvent e) {
\r
191 ElementTransforms.align(getSelected(),SIDE.HORIZ);
\r
195 alignLeft.addSelectionListener(new SelectionAdapter() {
\r
197 public void widgetSelected(SelectionEvent e) {
\r
198 ElementTransforms.align(getSelected(),SIDE.LEFT);
\r
202 alignRight.addSelectionListener(new SelectionAdapter() {
\r
204 public void widgetSelected(SelectionEvent e) {
\r
205 ElementTransforms.align(getSelected(),SIDE.RIGHT);
\r
209 alignTop.addSelectionListener(new SelectionAdapter() {
\r
211 public void widgetSelected(SelectionEvent e) {
\r
212 ElementTransforms.align(getSelected(),SIDE.TOP);
\r
216 alignBottom.addSelectionListener(new SelectionAdapter() {
\r
218 public void widgetSelected(SelectionEvent e) {
\r
219 ElementTransforms.align(getSelected(),SIDE.BOTTOM);
\r
223 distLeft.addSelectionListener(new SelectionAdapter() {
\r
225 public void widgetSelected(SelectionEvent e) {
\r
226 ElementTransforms.dist(getSelected(),SIDE.LEFT);
\r
230 distVert.addSelectionListener(new SelectionAdapter() {
\r
232 public void widgetSelected(SelectionEvent e) {
\r
233 ElementTransforms.dist(getSelected(),SIDE.VERT);
\r
237 distRight.addSelectionListener(new SelectionAdapter() {
\r
239 public void widgetSelected(SelectionEvent e) {
\r
240 ElementTransforms.dist(getSelected(),SIDE.RIGHT);
\r
244 distVertBetween.addSelectionListener(new SelectionAdapter() {
\r
246 public void widgetSelected(SelectionEvent e) {
\r
247 ElementTransforms.dist(getSelected(),SIDE.VERT_BTW);
\r
251 distTop.addSelectionListener(new SelectionAdapter() {
\r
253 public void widgetSelected(SelectionEvent e) {
\r
254 ElementTransforms.dist(getSelected(),SIDE.TOP);
\r
258 distHoriz.addSelectionListener(new SelectionAdapter() {
\r
260 public void widgetSelected(SelectionEvent e) {
\r
261 ElementTransforms.dist(getSelected(),SIDE.HORIZ);
\r
265 distBottom.addSelectionListener(new SelectionAdapter() {
\r
267 public void widgetSelected(SelectionEvent e) {
\r
268 ElementTransforms.dist(getSelected(),SIDE.BOTTOM);
\r
272 distHorizBetween.addSelectionListener(new SelectionAdapter() {
\r
274 public void widgetSelected(SelectionEvent e) {
\r
275 ElementTransforms.dist(getSelected(),SIDE.HORIZ_BTW);
\r
279 rotateCW.addSelectionListener(new SelectionAdapter() {
\r
281 public void widgetSelected(SelectionEvent e) {
\r
282 ElementTransforms.rotate(getSelected(),true);
\r
286 rotateCCW.addSelectionListener(new SelectionAdapter() {
\r
288 public void widgetSelected(SelectionEvent e) {
\r
289 ElementTransforms.rotate(getSelected(),false);
\r
293 flipX.addSelectionListener(new SelectionAdapter() {
\r
295 public void widgetSelected(SelectionEvent e) {
\r
296 ElementTransforms.flip(getSelected(),true);
\r
300 flipY.addSelectionListener(new SelectionAdapter() {
\r
302 public void widgetSelected(SelectionEvent e) {
\r
303 ElementTransforms.flip(getSelected(),false);
\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
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
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
332 public void setSelection(ISelection s) {
\r
333 this.selection = ResourceAdaptionUtils.toResources(s);
\r
335 SimanticsUI.getSession().syncRequest(new ReadRequest() {
\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
346 selection = sel.toArray(new Resource[sel.size()]);
\r
352 } catch (DatabaseException e) {
\r
353 // TODO Auto-generated catch block
\r
354 e.printStackTrace();
\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
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
378 rotateCCW.setEnabled(showRotate);
\r
379 rotateCW.setEnabled(showRotate);
\r
380 flipX.setEnabled(showRotate);
\r
381 flipY.setEnabled(showRotate);
\r
385 public void dispose() {
\r
389 private Resource[] getSelected() {
\r