1 /*******************************************************************************
2 * Copyright (c) 2007, 2010 Association for Decentralized Information Management
4 * All rights reserved. This program and the accompanying materials
5 * are made available under the terms of the Eclipse Public License v1.0
6 * which accompanies this distribution, and is available at
7 * http://www.eclipse.org/legal/epl-v10.html
10 * VTT Technical Research Centre of Finland - initial API and implementation
11 *******************************************************************************/
12 package org.simantics.modeling.ui.diagramEditor.tools;
14 import java.util.ArrayList;
15 import java.util.List;
17 import org.eclipse.jface.layout.GridDataFactory;
18 import org.eclipse.jface.layout.GridLayoutFactory;
19 import org.eclipse.jface.resource.ImageDescriptor;
20 import org.eclipse.jface.resource.LocalResourceManager;
21 import org.eclipse.jface.viewers.ISelection;
22 import org.eclipse.swt.SWT;
23 import org.eclipse.swt.events.SelectionAdapter;
24 import org.eclipse.swt.events.SelectionEvent;
25 import org.eclipse.swt.widgets.Button;
26 import org.eclipse.swt.widgets.Composite;
27 import org.eclipse.ui.forms.widgets.FormToolkit;
28 import org.simantics.Simantics;
29 import org.simantics.db.ReadGraph;
30 import org.simantics.db.Resource;
31 import org.simantics.db.common.request.ReadRequest;
32 import org.simantics.db.exception.DatabaseException;
33 import org.simantics.diagram.elements.ElementTransforms;
34 import org.simantics.diagram.elements.ElementTransforms.SIDE;
35 import org.simantics.diagram.stubs.DiagramResource;
36 import org.simantics.modeling.ui.Activator;
37 import org.simantics.ui.utils.ResourceAdaptionUtils;
40 * Diagramming alignment tools
42 * @author Marko Luukkainen <marko.luukkainen@vtt.fi>
44 public class AlignTools implements DiagramTools {
46 private Resource selection[] = new Resource[0];
49 Button alignVertButton;
52 Button alignHorizButton;
57 Button distVertBetween;
61 Button distHorizBetween;
71 public String getName() {
77 public void createContols(Composite parent, FormToolkit toolkit, LocalResourceManager resourceManager) {
78 parent.setLayout(GridLayoutFactory.fillDefaults().numColumns(1).equalWidth(true).margins(0, 0).spacing(1,1).create());
80 Composite alignComposite = new Composite(parent, SWT.NONE);
81 Composite distributeComposite = new Composite(parent, SWT.NONE);
82 Composite rotateComposite = new Composite(parent, SWT.NONE);
83 alignComposite.setLayout(GridLayoutFactory.fillDefaults().numColumns(3).equalWidth(true).margins(0, 2).spacing(0, 0).create());
84 distributeComposite.setLayout(GridLayoutFactory.fillDefaults().numColumns(4).equalWidth(true).margins(0, 2).spacing(0, 0).create());
85 rotateComposite.setLayout(GridLayoutFactory.fillDefaults().numColumns(2).equalWidth(true).margins(0, 2).spacing(0, 0).create());
87 GridDataFactory.fillDefaults().align(SWT.FILL, SWT.CENTER).applyTo(alignComposite);
88 GridDataFactory.fillDefaults().align(SWT.FILL, SWT.CENTER).applyTo(distributeComposite);
89 GridDataFactory.fillDefaults().align(SWT.FILL, SWT.CENTER).applyTo(rotateComposite);
91 alignLeft = toolkit.createButton(alignComposite, "", SWT.PUSH);
92 //alignLeft.setText("Left");
93 alignLeft.setToolTipText("Align Left Edges");
94 GridDataFactory.fillDefaults().align(SWT.FILL, SWT.CENTER).applyTo(alignLeft);
96 alignVertButton = toolkit.createButton(alignComposite, "", SWT.PUSH);
97 //alignVertButton.setText("Middle");
98 alignVertButton.setToolTipText("Center on Vertical Axis");
99 GridDataFactory.fillDefaults().align(SWT.FILL, SWT.CENTER).applyTo(alignVertButton);
101 alignRight = toolkit.createButton(alignComposite, "", SWT.PUSH);
102 //alignRight.setText("Right");
103 alignRight.setToolTipText("Align Right Edges");
104 GridDataFactory.fillDefaults().align(SWT.FILL, SWT.CENTER).applyTo(alignRight);
106 alignTop = toolkit.createButton(alignComposite, "", SWT.PUSH);
107 //alignTop.setText("Top");
108 alignTop.setToolTipText("Align Top Edges");
109 GridDataFactory.fillDefaults().align(SWT.FILL, SWT.CENTER).applyTo(alignTop);
111 alignHorizButton = toolkit.createButton(alignComposite, "", SWT.PUSH);
112 //alignHorizButton.setText("Middle");
113 alignHorizButton.setToolTipText("Center on Horizontal Axis");
114 GridDataFactory.fillDefaults().align(SWT.FILL, SWT.CENTER).applyTo(alignHorizButton);
116 alignBottom = toolkit.createButton(alignComposite, "", SWT.PUSH);
117 //alignBottom.setText("Bottom");
118 alignBottom.setToolTipText("Align Bottom Edges");
119 GridDataFactory.fillDefaults().align(SWT.FILL, SWT.CENTER).applyTo(alignBottom);
121 distLeft = toolkit.createButton(distributeComposite, "", SWT.PUSH);
122 //distLeft.setText("Left");
123 distLeft.setToolTipText("Distribute Left Edges Equidistantly");
124 GridDataFactory.fillDefaults().align(SWT.FILL, SWT.CENTER).applyTo(distLeft);
126 distVert = toolkit.createButton(distributeComposite, "", SWT.PUSH);
127 //distVert.setText("Middle");
128 distVert.setToolTipText("Distribute Centers Equidistantly Horizontally");
129 GridDataFactory.fillDefaults().align(SWT.FILL, SWT.CENTER).applyTo(distVert);
131 distRight = toolkit.createButton(distributeComposite, "", SWT.PUSH);
132 //distRight.setText("Right");
133 distRight.setToolTipText("Distribute Right Edges Equidistantly");
134 GridDataFactory.fillDefaults().align(SWT.FILL, SWT.CENTER).applyTo(distRight);
136 distVertBetween = toolkit.createButton(distributeComposite, "", SWT.PUSH);
137 //distVertBetween.setText("Between");
138 distVertBetween.setToolTipText("Make Horizontal Gaps Between Objects Equal");
139 GridDataFactory.fillDefaults().align(SWT.FILL, SWT.CENTER).applyTo(distVertBetween);
141 distTop = toolkit.createButton(distributeComposite, "", SWT.PUSH);
142 //distTop.setText("Top");
143 distTop.setToolTipText("Distribute Top Edges Equidistantly");
144 GridDataFactory.fillDefaults().align(SWT.FILL, SWT.CENTER).applyTo(distTop);
146 distHoriz = toolkit.createButton(distributeComposite, "", SWT.PUSH);
147 //distHoriz.setText("Middle");
148 distHoriz.setToolTipText("Distribute Centers Equidistantly Vertically");
149 GridDataFactory.fillDefaults().align(SWT.FILL, SWT.CENTER).applyTo(distHoriz);
151 distBottom = toolkit.createButton(distributeComposite, "", SWT.PUSH);
152 //distBottom.setText("Bottom");
153 distBottom.setToolTipText("Distribute Bottom Edges Equidistantly");
154 GridDataFactory.fillDefaults().align(SWT.FILL, SWT.CENTER).applyTo(distBottom);
156 distHorizBetween = toolkit.createButton(distributeComposite, "", SWT.PUSH);
157 //distHorizBetween.setText("Between");
158 distHorizBetween.setToolTipText("Make Vertical Gaps Between Objects Equal");
159 GridDataFactory.fillDefaults().align(SWT.FILL, SWT.CENTER).applyTo(distHorizBetween);
161 rotateCCW = toolkit.createButton(rotateComposite, "", SWT.PUSH);
162 //rotateCCW.setText("rotate left");
163 rotateCCW.setToolTipText("Rotate Counterclockwise");
164 GridDataFactory.fillDefaults().align(SWT.FILL, SWT.CENTER).applyTo(rotateCCW);
166 rotateCW = toolkit.createButton(rotateComposite, "", SWT.PUSH);
167 //rotateCW.setText("rotate right");
168 rotateCW.setToolTipText("Rotate Clockwise");
169 GridDataFactory.fillDefaults().align(SWT.FILL, SWT.CENTER).applyTo(rotateCW);
171 flipX = toolkit.createButton(rotateComposite, "", SWT.PUSH);
172 //flipX.setText("flip");
173 flipX.setToolTipText("Flip About Horizontal Axis");
174 GridDataFactory.fillDefaults().align(SWT.FILL, SWT.CENTER).applyTo(flipX);
176 flipY = toolkit.createButton(rotateComposite, "", SWT.PUSH);
177 //flipY.setText("mirror");
178 flipY.setToolTipText("Flip About Vertical Axis");
179 GridDataFactory.fillDefaults().align(SWT.FILL, SWT.CENTER).applyTo(flipY);
181 alignVertButton.addSelectionListener(new SelectionAdapter() {
183 public void widgetSelected(SelectionEvent e) {
184 ElementTransforms.align(getSelected(), SIDE.VERT);
188 alignHorizButton.addSelectionListener(new SelectionAdapter() {
190 public void widgetSelected(SelectionEvent e) {
191 ElementTransforms.align(getSelected(),SIDE.HORIZ);
195 alignLeft.addSelectionListener(new SelectionAdapter() {
197 public void widgetSelected(SelectionEvent e) {
198 ElementTransforms.align(getSelected(),SIDE.LEFT);
202 alignRight.addSelectionListener(new SelectionAdapter() {
204 public void widgetSelected(SelectionEvent e) {
205 ElementTransforms.align(getSelected(),SIDE.RIGHT);
209 alignTop.addSelectionListener(new SelectionAdapter() {
211 public void widgetSelected(SelectionEvent e) {
212 ElementTransforms.align(getSelected(),SIDE.TOP);
216 alignBottom.addSelectionListener(new SelectionAdapter() {
218 public void widgetSelected(SelectionEvent e) {
219 ElementTransforms.align(getSelected(),SIDE.BOTTOM);
223 distLeft.addSelectionListener(new SelectionAdapter() {
225 public void widgetSelected(SelectionEvent e) {
226 ElementTransforms.dist(getSelected(),SIDE.LEFT);
230 distVert.addSelectionListener(new SelectionAdapter() {
232 public void widgetSelected(SelectionEvent e) {
233 ElementTransforms.dist(getSelected(),SIDE.VERT);
237 distRight.addSelectionListener(new SelectionAdapter() {
239 public void widgetSelected(SelectionEvent e) {
240 ElementTransforms.dist(getSelected(),SIDE.RIGHT);
244 distVertBetween.addSelectionListener(new SelectionAdapter() {
246 public void widgetSelected(SelectionEvent e) {
247 ElementTransforms.dist(getSelected(),SIDE.VERT_BTW);
251 distTop.addSelectionListener(new SelectionAdapter() {
253 public void widgetSelected(SelectionEvent e) {
254 ElementTransforms.dist(getSelected(),SIDE.TOP);
258 distHoriz.addSelectionListener(new SelectionAdapter() {
260 public void widgetSelected(SelectionEvent e) {
261 ElementTransforms.dist(getSelected(),SIDE.HORIZ);
265 distBottom.addSelectionListener(new SelectionAdapter() {
267 public void widgetSelected(SelectionEvent e) {
268 ElementTransforms.dist(getSelected(),SIDE.BOTTOM);
272 distHorizBetween.addSelectionListener(new SelectionAdapter() {
274 public void widgetSelected(SelectionEvent e) {
275 ElementTransforms.dist(getSelected(),SIDE.HORIZ_BTW);
279 rotateCW.addSelectionListener(new SelectionAdapter() {
281 public void widgetSelected(SelectionEvent e) {
282 ElementTransforms.rotate(getSelected(),true);
286 rotateCCW.addSelectionListener(new SelectionAdapter() {
288 public void widgetSelected(SelectionEvent e) {
289 ElementTransforms.rotate(getSelected(),false);
293 flipX.addSelectionListener(new SelectionAdapter() {
295 public void widgetSelected(SelectionEvent e) {
296 ElementTransforms.flip(getSelected(),true);
300 flipY.addSelectionListener(new SelectionAdapter() {
302 public void widgetSelected(SelectionEvent e) {
303 ElementTransforms.flip(getSelected(),false);
307 alignLeft.setImage(resourceManager.createImage(ImageDescriptor.createFromURL(Activator.getDefault().getBundle().getResource("icons/align_left.png"))));
308 alignVertButton.setImage(resourceManager.createImage(ImageDescriptor.createFromURL(Activator.getDefault().getBundle().getResource("icons/align_center.png"))));
309 alignRight.setImage(resourceManager.createImage(ImageDescriptor.createFromURL(Activator.getDefault().getBundle().getResource("icons/align_right.png"))));
310 alignTop.setImage(resourceManager.createImage(ImageDescriptor.createFromURL(Activator.getDefault().getBundle().getResource("icons/align_top.png"))));
311 alignHorizButton.setImage(resourceManager.createImage(ImageDescriptor.createFromURL(Activator.getDefault().getBundle().getResource("icons/align_middle.png"))));
312 alignBottom.setImage(resourceManager.createImage(ImageDescriptor.createFromURL(Activator.getDefault().getBundle().getResource("icons/align_bottom.png"))));
314 distLeft.setImage(resourceManager.createImage(ImageDescriptor.createFromURL(Activator.getDefault().getBundle().getResource("icons/dist_left.png"))));
315 distVert.setImage(resourceManager.createImage(ImageDescriptor.createFromURL(Activator.getDefault().getBundle().getResource("icons/dist_center.png"))));
316 distRight.setImage(resourceManager.createImage(ImageDescriptor.createFromURL(Activator.getDefault().getBundle().getResource("icons/dist_right.png"))));
317 distVertBetween.setImage(resourceManager.createImage(ImageDescriptor.createFromURL(Activator.getDefault().getBundle().getResource("icons/dist_horiz.png"))));
318 distTop.setImage(resourceManager.createImage(ImageDescriptor.createFromURL(Activator.getDefault().getBundle().getResource("icons/dist_top.png"))));
319 distHoriz.setImage(resourceManager.createImage(ImageDescriptor.createFromURL(Activator.getDefault().getBundle().getResource("icons/dist_middle.png"))));
320 distBottom.setImage(resourceManager.createImage(ImageDescriptor.createFromURL(Activator.getDefault().getBundle().getResource("icons/dist_bottom.png"))));
321 distHorizBetween.setImage(resourceManager.createImage(ImageDescriptor.createFromURL(Activator.getDefault().getBundle().getResource("icons/dist_vert.png"))));
323 rotateCCW.setImage(resourceManager.createImage(ImageDescriptor.createFromURL(Activator.getDefault().getBundle().getResource("icons/rotate_left.png"))));
324 rotateCW.setImage(resourceManager.createImage(ImageDescriptor.createFromURL(Activator.getDefault().getBundle().getResource("icons/rotate_right.png"))));
325 flipX.setImage(resourceManager.createImage(ImageDescriptor.createFromURL(Activator.getDefault().getBundle().getResource("icons/flip_x.png"))));
326 flipY.setImage(resourceManager.createImage(ImageDescriptor.createFromURL(Activator.getDefault().getBundle().getResource("icons/flip_y.png"))));
332 public void setSelection(ISelection s) {
333 this.selection = ResourceAdaptionUtils.toResources(s);
335 Simantics.getSession().syncRequest(new ReadRequest() {
338 public void run(ReadGraph graph) throws DatabaseException {
339 DiagramResource dr = DiagramResource.getInstance(graph);
340 List<Resource> sel = new ArrayList<Resource>();
341 for (Resource r : selection) {
342 if(graph.isInstanceOf(r, dr.Element) && !graph.isInstanceOf(r, dr.Connection) /*&& !graph.isInstanceOf(r, dr.Monitor)*/) {
346 selection = sel.toArray(new Resource[sel.size()]);
352 } catch (DatabaseException e) {
353 // TODO Auto-generated catch block
358 private void updateUI() {
359 boolean showAlign = selection.length >= 2;
360 boolean showDist = selection.length >= 3;
361 boolean showRotate = selection.length >= 1;
362 alignBottom.setEnabled(showAlign);
363 alignHorizButton.setEnabled(showAlign);
364 alignLeft.setEnabled(showAlign);
365 alignRight.setEnabled(showAlign);
366 alignTop.setEnabled(showAlign);
367 alignVertButton.setEnabled(showAlign);
369 distBottom.setEnabled(showDist);
370 distHoriz.setEnabled(showDist);
371 distHorizBetween.setEnabled(showDist);
372 distLeft.setEnabled(showDist);
373 distRight.setEnabled(showDist);
374 distTop.setEnabled(showDist);
375 distVert.setEnabled(showDist);
376 distVertBetween.setEnabled(showDist);
378 rotateCCW.setEnabled(showRotate);
379 rotateCW.setEnabled(showRotate);
380 flipX.setEnabled(showRotate);
381 flipY.setEnabled(showRotate);
385 public void dispose() {
389 private Resource[] getSelected() {