Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.tooling.runtime/src/org/eclipse/papyrus/infra/gmfdiag/tooling/runtime/linklf/DiagramGridSpec.java')
-rwxr-xr-xplugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.tooling.runtime/src/org/eclipse/papyrus/infra/gmfdiag/tooling/runtime/linklf/DiagramGridSpec.java176
1 files changed, 176 insertions, 0 deletions
diff --git a/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.tooling.runtime/src/org/eclipse/papyrus/infra/gmfdiag/tooling/runtime/linklf/DiagramGridSpec.java b/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.tooling.runtime/src/org/eclipse/papyrus/infra/gmfdiag/tooling/runtime/linklf/DiagramGridSpec.java
new file mode 100755
index 00000000000..8281e92fabf
--- /dev/null
+++ b/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.tooling.runtime/src/org/eclipse/papyrus/infra/gmfdiag/tooling/runtime/linklf/DiagramGridSpec.java
@@ -0,0 +1,176 @@
+/*****************************************************************************
+ * Copyright (c) 2014-15 CEA LIST, Montages AG and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Michael Golubev (Montages) - Initial API and implementation
+ *
+ *****************************************************************************/
+package org.eclipse.papyrus.infra.gmfdiag.tooling.runtime.linklf;
+
+import java.beans.PropertyChangeEvent;
+import java.beans.PropertyChangeListener;
+
+import org.eclipse.draw2d.geometry.Dimension;
+import org.eclipse.draw2d.geometry.Point;
+import org.eclipse.draw2d.geometry.PrecisionRectangle;
+import org.eclipse.gef.EditPartViewer;
+import org.eclipse.gef.GraphicalEditPart;
+import org.eclipse.gef.SnapToGrid;
+
+/**
+ * Utility class to compute active grid specification for given edit part
+ * viewer.
+ * <p/>
+ * Clients may call static methods to compute grid spec once, or may setup
+ * listeners that will automatically update the active spec when it changed
+ *
+ * @since 3.3
+ */
+public class DiagramGridSpec {
+
+ private final EditPartViewer myViewer;
+
+ private PrecisionRectangle myRelativeGridSpec;
+
+ private PrecisionRectangle myAbsoluteGridSpec;
+
+ private final GridSpecListener myGridListener;
+
+ public DiagramGridSpec(EditPartViewer viewer) {
+ myViewer = viewer;
+ myGridListener = new GridSpecListener() {
+
+ @Override
+ public void gridSpecChanged() {
+ myRelativeGridSpec = null;
+ myAbsoluteGridSpec = null;
+ }
+ };
+ myViewer.addPropertyChangeListener(myGridListener);
+ }
+
+ public void dispose() {
+ myViewer.removePropertyChangeListener(myGridListener);
+ myRelativeGridSpec = null;
+ myAbsoluteGridSpec = null;
+ }
+
+ /**
+ * Always returns the same instance to avoid endless creation
+ *
+ * @return active grid specification in absolute coordinates or
+ * <code>null</code> if not enabled
+ */
+ public PrecisionRectangle getAbsoluteGridSpec() {
+ PrecisionRectangle result = getRelativeGridSpec();
+ if (result == null) {
+ return null;
+ }
+
+ if (myAbsoluteGridSpec == null) {
+ myAbsoluteGridSpec = new PrecisionRectangle();
+ }
+ myAbsoluteGridSpec.setPreciseBounds(result.preciseX(),
+ result.preciseY(), result.preciseWidth(),
+ result.preciseHeight());
+ GraphicalEditPart diagramEP = (GraphicalEditPart) myViewer
+ .getContents();
+ diagramEP.getContentPane().translateToAbsolute(myAbsoluteGridSpec);
+
+ return myAbsoluteGridSpec;
+ }
+
+ private PrecisionRectangle getRelativeGridSpec() {
+ if (myRelativeGridSpec == null) {
+ myRelativeGridSpec = getRelativeGridSpec(myViewer);
+ }
+ return myRelativeGridSpec;
+ }
+
+ public EditPartViewer getViewer() {
+ return myViewer;
+ }
+
+ /**
+ * Computes actual grid specification (origin + single cell width and
+ * height) in the absolute coordinate system. Note, in contrast to
+ * {@link #getRelativeGridSpec(EditPartViewer)} this specification depends
+ * on the active zoom or scroll and can't be cached by clients.
+ *
+ * @param viewer
+ * @return absolute grid specification, or <code>null</code> if grid is not
+ * enabled
+ */
+ public static PrecisionRectangle getAbsoluteGridSpec(EditPartViewer viewer) {
+ PrecisionRectangle spec = getRelativeGridSpec(viewer);
+ if (spec != null) {
+ GraphicalEditPart diagramEP = (GraphicalEditPart) viewer
+ .getContents();
+ diagramEP.getContentPane().translateToAbsolute(spec);
+ }
+ return spec;
+ }
+
+ /**
+ * Computes actual grid specification (origin + single cell width and
+ * height) in the coordinates relative to the diagram content pane.
+ * <p/>
+ * This specification depends only on the grid-relative properties stored in
+ * the {@link EditPartViewer}, so client may cache it and rely on
+ * {@link EditPartViewer#addPropertyChangeListener(PropertyChangeListener)}
+ *
+ * @param viewer
+ * @return grid specification in the coordinate system relative to diagram
+ * content pane, or <code>null</code> if grid is not enabled
+ */
+ private static PrecisionRectangle getRelativeGridSpec(EditPartViewer viewer) {
+ Boolean enabled = (Boolean) viewer
+ .getProperty(SnapToGrid.PROPERTY_GRID_ENABLED);
+ if (enabled == null || !enabled) {
+ return null;
+ }
+ double gridX = 0;
+ double gridY = 0;
+ Dimension spacing = (Dimension) viewer
+ .getProperty(SnapToGrid.PROPERTY_GRID_SPACING);
+ if (spacing != null) {
+ gridX = spacing.preciseWidth();
+ gridY = spacing.preciseHeight();
+ }
+ if (gridX <= 0) {
+ gridX = SnapToGrid.DEFAULT_GRID_SIZE;
+ }
+ if (gridY <= 0) {
+ gridY = SnapToGrid.DEFAULT_GRID_SIZE;
+ }
+ Point origin = (Point) viewer
+ .getProperty(SnapToGrid.PROPERTY_GRID_ORIGIN);
+ PrecisionRectangle result = new PrecisionRectangle(//
+ origin == null ? 0 : origin.preciseX(), origin == null ? 0
+ : origin.preciseY(), gridX, gridY);
+
+ return result;
+ }
+
+ public static abstract class GridSpecListener implements
+ PropertyChangeListener {
+
+ public void propertyChange(PropertyChangeEvent evt) {
+ String propertyName = evt.getPropertyName();
+ if (SnapToGrid.PROPERTY_GRID_ORIGIN.equals(propertyName) || //
+ SnapToGrid.PROPERTY_GRID_ENABLED.equals(propertyName) || //
+ SnapToGrid.PROPERTY_GRID_SPACING.equals(propertyName)) {
+
+ gridSpecChanged();
+ }
+ }
+
+ public abstract void gridSpecChanged();
+ };
+
+}

Back to the top