diff --git a/org.eclipse.draw2d/src/org/eclipse/draw2d/FigureUtilities.java b/org.eclipse.draw2d/src/org/eclipse/draw2d/FigureUtilities.java
index 97a0c613e..742fd5c70 100644
--- a/org.eclipse.draw2d/src/org/eclipse/draw2d/FigureUtilities.java
+++ b/org.eclipse.draw2d/src/org/eclipse/draw2d/FigureUtilities.java
@@ -23,6 +23,7 @@
import org.eclipse.draw2d.geometry.Dimension;
import org.eclipse.draw2d.geometry.Rectangle;
+import org.eclipse.draw2d.internal.InternalDraw2dUtils;
/**
* Provides miscellaneous Figure operations.
@@ -73,7 +74,12 @@ public static FontMetrics getFontMetrics(Font f) {
@Deprecated
protected static GC getGC() {
if (gc == null) {
- gc = new GC(new Shell());
+ Shell shell = new Shell();
+ InternalDraw2dUtils.configureForAutoscalingMode(shell);
+ gc = new GC(shell);
+ if (InternalDraw2dUtils.disableAutoscale) {
+ gc.setAdvanced(true);
+ }
appliedFont = gc.getFont();
}
return gc;
@@ -424,5 +430,4 @@ public static boolean isNotFullyClipped(IFigure figure) {
}
return !figBounds.isEmpty();
}
-
}
diff --git a/org.eclipse.draw2d/src/org/eclipse/draw2d/PopUpHelper.java b/org.eclipse.draw2d/src/org/eclipse/draw2d/PopUpHelper.java
index 54e39087d..50c3e3633 100644
--- a/org.eclipse.draw2d/src/org/eclipse/draw2d/PopUpHelper.java
+++ b/org.eclipse.draw2d/src/org/eclipse/draw2d/PopUpHelper.java
@@ -15,10 +15,12 @@
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Rectangle;
+import org.eclipse.swt.widgets.Canvas;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.draw2d.geometry.Dimension;
+import org.eclipse.draw2d.internal.InternalDraw2dUtils;
/**
* Provides abstract support for classes that manage popups. Popups in Draw2d
@@ -62,7 +64,7 @@ protected PopUpHelper(Control c) {
*/
protected PopUpHelper(Control c, int shellStyle) {
control = c;
- this.shellStyle = shellStyle | SWT.NO_BACKGROUND | SWT.NO_REDRAW_RESIZE;
+ this.shellStyle = shellStyle | SWT.NO_BACKGROUND | SWT.NO_REDRAW_RESIZE | SWT.DOUBLE_BUFFERED;
}
/**
@@ -72,9 +74,8 @@ protected PopUpHelper(Control c, int shellStyle) {
* @return the newly created LightweightSystem
* @since 2.0
*/
- @SuppressWarnings("static-method")
protected LightweightSystem createLightweightSystem() {
- return new LightweightSystem();
+ return InternalDraw2dUtils.disableAutoscale ? new PopupHelperLightweightSystem() : new LightweightSystem();
}
/**
@@ -219,4 +220,73 @@ protected void show() {
tipShowing = true;
}
+ private class PopupHelperLightweightSystem extends LightweightSystem {
+
+ /**
+ * Data that can be set to scale this widget at 100%.
+ */
+ private static final String DATA_AUTOSCALE_DISABLED = "AUTOSCALE_DISABLED"; //$NON-NLS-1$
+
+ /**
+ * Internal flag for fetching the shell zoom
+ */
+ private static final String DATA_SHELL_ZOOM = "SHELL_ZOOM"; //$NON-NLS-1$
+
+ /**
+ * Returns the zoom of the monitor this widget is assigned to.
+ *
+ * @return 1.0 at 100%, 1.25 at 125% etc.
+ */
+ private static double getMonitorZoomScale(Control c) {
+ int shellZooom;
+ try {
+ shellZooom = (int) c.getData(DATA_SHELL_ZOOM);
+ } catch (ClassCastException | NullPointerException e) {
+ shellZooom = 100;
+ }
+ return shellZooom / 100.0;
+ }
+
+ /**
+ * The scalable pane that is injected between the root figure and the contents
+ * of this viewport.
+ */
+ private final ScalableLayeredPane scalablePane;
+
+ private PopupHelperLightweightSystem() {
+ scalablePane = new ScalableLayeredPane(true);
+ scalablePane.setLayoutManager(new StackLayout());
+ getRootFigure().add(scalablePane);
+ }
+
+ /**
+ * Updates the scale factor of the scalable pane to the given value.
+ *
+ * @param scale The new scale factor.
+ */
+ private void setScale(double scale) {
+ scalablePane.setScale(scale);
+ }
+
+ @Override
+ public void setControl(Canvas c) {
+ if (c == null) {
+ return;
+ }
+
+ c.setData(DATA_AUTOSCALE_DISABLED, true);
+ c.addListener(SWT.ZoomChanged, e -> setScale(e.detail / 100.0));
+ setScale(getMonitorZoomScale(c));
+
+ super.setControl(c);
+ }
+
+ @Override
+ public void setContents(IFigure figure) {
+ scalablePane.removeAll();
+ if (figure != null) {
+ scalablePane.add(figure);
+ }
+ }
+ }
}
diff --git a/org.eclipse.draw2d/src/org/eclipse/draw2d/internal/DrawableFigureUtilities.java b/org.eclipse.draw2d/src/org/eclipse/draw2d/internal/DrawableFigureUtilities.java
new file mode 100644
index 000000000..ce7da1592
--- /dev/null
+++ b/org.eclipse.draw2d/src/org/eclipse/draw2d/internal/DrawableFigureUtilities.java
@@ -0,0 +1,142 @@
+/*******************************************************************************
+ * Copyright (c) 2025 Yatta and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * Yatta - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.draw2d.internal;
+
+import java.util.Objects;
+
+import org.eclipse.swt.graphics.Font;
+import org.eclipse.swt.graphics.FontMetrics;
+import org.eclipse.swt.graphics.GC;
+import org.eclipse.swt.widgets.Control;
+
+import org.eclipse.draw2d.geometry.Dimension;
+
+/**
+ * Provides miscellaneous Figure operations calculated with the zoom context of
+ * the the provided {@code Drawable}.
+ *
+ * All GC related operations are mirrored from {@code FigureUtilities}
+ */
+public class DrawableFigureUtilities {
+ private final GC gc;
+ private Font appliedFont;
+ private FontMetrics metrics;
+
+ public DrawableFigureUtilities(Control source) {
+ gc = new GC(source);
+ source.addDisposeListener(e -> {
+ gc.dispose();
+ });
+ appliedFont = gc.getFont();
+ }
+
+ /**
+ * Returns the FontMetrics associated with the passed Font.
+ *
+ * @param f the font
+ * @return the FontMetrics for the given font
+ * @see GC#getFontMetrics()
+ */
+ public FontMetrics getFontMetrics(Font f) {
+ setFont(f);
+ if (metrics == null) {
+ metrics = gc.getFontMetrics();
+ }
+ return metrics;
+ }
+
+ /**
+ * Returns the dimensions of the String s using the font f. Tab
+ * expansion and carriage return processing are performed.
+ *
+ * @param s the string
+ * @param f the font
+ * @return the text's dimensions
+ * @see GC#textExtent(String)
+ */
+ protected org.eclipse.swt.graphics.Point getTextDimension(String s, Font f) {
+ setFont(f);
+ return gc.textExtent(s);
+ }
+
+ /**
+ * Returns the dimensions of the String s using the font f. No tab
+ * expansion or carriage return processing will be performed.
+ *
+ * @param s the string
+ * @param f the font
+ * @return the string's dimensions
+ * @see GC#stringExtent(java.lang.String)
+ */
+ protected org.eclipse.swt.graphics.Point getStringDimension(String s, Font f) {
+ setFont(f);
+ return gc.stringExtent(s);
+ }
+
+ /**
+ * Returns the Dimensions of the given text, converting newlines and tabs
+ * appropriately.
+ *
+ * @param text the text
+ * @param f the font
+ * @return the dimensions of the given text
+ */
+ public Dimension getTextExtents(String text, Font f) {
+ return new Dimension(getTextDimension(text, f));
+ }
+
+ /**
+ * Returns the Dimensions of s in Font f.
+ *
+ * @param s the string
+ * @param f the font
+ * @return the dimensions of the given string
+ */
+ public Dimension getStringExtents(String s, Font f) {
+ return new Dimension(getStringDimension(s, f));
+ }
+
+ /**
+ * Returns the Dimensions of the given text, converting newlines and tabs
+ * appropriately.
+ *
+ * @param s the string
+ * @param f the font
+ * @param result the Dimension that will contain the result of this calculation
+ */
+ public void getTextExtents(String s, Font f, Dimension result) {
+ org.eclipse.swt.graphics.Point pt = getTextDimension(s, f);
+ result.width = pt.x;
+ result.height = pt.y;
+ }
+
+ /**
+ * Returns the width of s in Font f.
+ *
+ * @param s the string
+ * @param f the font
+ * @return the width
+ */
+ public int getTextWidth(String s, Font f) {
+ return getTextDimension(s, f).x;
+ }
+
+ private void setFont(Font f) {
+ if (Objects.equals(appliedFont, f)) {
+ return;
+ }
+ gc.setFont(f);
+ appliedFont = f;
+ metrics = null;
+ }
+}
diff --git a/org.eclipse.draw2d/src/org/eclipse/draw2d/internal/DrawableTextUtilities.java b/org.eclipse.draw2d/src/org/eclipse/draw2d/internal/DrawableTextUtilities.java
new file mode 100644
index 000000000..caf39e377
--- /dev/null
+++ b/org.eclipse.draw2d/src/org/eclipse/draw2d/internal/DrawableTextUtilities.java
@@ -0,0 +1,82 @@
+/*******************************************************************************
+ * Copyright (c) 2025 Yatta and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * Yatta - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.draw2d.internal;
+
+import org.eclipse.swt.graphics.Font;
+import org.eclipse.swt.graphics.FontMetrics;
+import org.eclipse.swt.widgets.Control;
+
+import org.eclipse.draw2d.TextUtilities;
+import org.eclipse.draw2d.geometry.Dimension;
+
+/**
+ * Provides miscellaneous text operations calculated with the zoom context of
+ * the the provided {@code Drawable}.
+ */
+public class DrawableTextUtilities extends TextUtilities {
+
+ private final DrawableFigureUtilities figureUtilities;
+
+ public DrawableTextUtilities(Control source) {
+ figureUtilities = new DrawableFigureUtilities(source);
+ }
+
+ /**
+ * Returns the Dimensions of s in Font f.
+ *
+ * @param s the string
+ * @param f the font
+ * @return the dimensions of the given string
+ */
+ @Override
+ public Dimension getStringExtents(String s, Font f) {
+ return figureUtilities.getStringExtents(s, f);
+ }
+
+ /**
+ * Returns the Dimensions of the given text, converting newlines and tabs
+ * appropriately.
+ *
+ * @param s the text
+ * @param f the font
+ * @return the dimensions of the given text
+ */
+ @Override
+ public Dimension getTextExtents(String s, Font f) {
+ return figureUtilities.getTextExtents(s, f);
+ }
+
+ /**
+ * Gets the font's ascent.
+ *
+ * @param font
+ * @return the font's ascent
+ */
+ @Override
+ public int getAscent(Font font) {
+ FontMetrics fm = figureUtilities.getFontMetrics(font);
+ return fm.getHeight() - fm.getDescent();
+ }
+
+ /**
+ * Gets the font's descent.
+ *
+ * @param font
+ * @return the font's descent
+ */
+ @Override
+ public int getDescent(Font font) {
+ return figureUtilities.getFontMetrics(font).getDescent();
+ }
+}
diff --git a/org.eclipse.draw2d/src/org/eclipse/draw2d/internal/InternalDraw2dUtils.java b/org.eclipse.draw2d/src/org/eclipse/draw2d/internal/InternalDraw2dUtils.java
new file mode 100644
index 000000000..96cc913f7
--- /dev/null
+++ b/org.eclipse.draw2d/src/org/eclipse/draw2d/internal/InternalDraw2dUtils.java
@@ -0,0 +1,44 @@
+/*******************************************************************************
+ * Copyright (c) 2025 Yatta and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * Yatta - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.draw2d.internal;
+
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.Control;
+
+public class InternalDraw2dUtils {
+ /**
+ * System property that controls the disablement of any autoScale functionality.
+ * Currently it only has effects when executed on Windows.
+ *
+ *
+ * - false: autoScale functionality is enabled
+ * - true: autoScale functionality is disabled<
+ *
+ *
+ * The current default is "false".
+ */
+ private static final String DRAW2D_DISABLE_AUTOSCALE = "draw2d.disableAutoscale"; //$NON-NLS-1$
+
+ public static boolean disableAutoscale;
+
+ static {
+ disableAutoscale = "win32".equals(SWT.getPlatform()) //$NON-NLS-1$
+ && Boolean.parseBoolean(System.getProperty(DRAW2D_DISABLE_AUTOSCALE));
+ }
+
+ public static void configureForAutoscalingMode(Control control) {
+ if (control != null && disableAutoscale) {
+ control.setData("AUTOSCALE_DISABLED", true); //$NON-NLS-1$
+ }
+ }
+}
diff --git a/org.eclipse.gef/src/org/eclipse/gef/editparts/FreeformGraphicalRootEditPart.java b/org.eclipse.gef/src/org/eclipse/gef/editparts/FreeformGraphicalRootEditPart.java
index 8facee299..6367b6f3b 100644
--- a/org.eclipse.gef/src/org/eclipse/gef/editparts/FreeformGraphicalRootEditPart.java
+++ b/org.eclipse.gef/src/org/eclipse/gef/editparts/FreeformGraphicalRootEditPart.java
@@ -20,6 +20,7 @@
import org.eclipse.draw2d.FreeformViewport;
import org.eclipse.draw2d.IFigure;
import org.eclipse.draw2d.LayeredPane;
+import org.eclipse.draw2d.ScalableFreeformLayeredPane;
import org.eclipse.draw2d.geometry.Dimension;
import org.eclipse.draw2d.geometry.Point;
@@ -30,6 +31,7 @@
import org.eclipse.gef.LayerConstants;
import org.eclipse.gef.Request;
import org.eclipse.gef.SnapToGrid;
+import org.eclipse.gef.internal.InternalGEFPlugin;
import org.eclipse.gef.tools.MarqueeDragTracker;
/**
@@ -86,7 +88,7 @@
*/
public class FreeformGraphicalRootEditPart extends SimpleRootEditPart implements LayerConstants, LayerManager {
- private LayeredPane innerLayers;
+ private ScalableFreeformLayeredPane innerLayers;
private LayeredPane printableLayers;
private final PropertyChangeListener gridListener = evt -> {
String property = evt.getPropertyName();
@@ -102,7 +104,8 @@ public class FreeformGraphicalRootEditPart extends SimpleRootEditPart implements
@Override
protected IFigure createFigure() {
FreeformViewport viewport = new FreeformViewport();
- innerLayers = new FreeformLayeredPane();
+ innerLayers = new ScalableFreeformLayeredPane();
+ this.addEditPartListener(InternalGEFPlugin.createAutoscaleEditPartListener(innerLayers));
createLayers(innerLayers);
viewport.setContents(innerLayers);
return viewport;
diff --git a/org.eclipse.gef/src/org/eclipse/gef/editparts/ScalableRootEditPart.java b/org.eclipse.gef/src/org/eclipse/gef/editparts/ScalableRootEditPart.java
index 49a6ef4f1..a56e5fff1 100644
--- a/org.eclipse.gef/src/org/eclipse/gef/editparts/ScalableRootEditPart.java
+++ b/org.eclipse.gef/src/org/eclipse/gef/editparts/ScalableRootEditPart.java
@@ -32,6 +32,7 @@
import org.eclipse.gef.LayerConstants;
import org.eclipse.gef.Request;
import org.eclipse.gef.SnapToGrid;
+import org.eclipse.gef.internal.InternalGEFPlugin;
import org.eclipse.gef.tools.MarqueeDragTracker;
/**
@@ -121,7 +122,7 @@ public Dimension getPreferredSize(int wHint, int hHint) {
}
- private LayeredPane innerLayers;
+ private ScalableLayeredPane innerLayers;
private LayeredPane printableLayers;
private ScalableLayeredPane scaledLayers;
private final PropertyChangeListener gridListener = (PropertyChangeEvent evt) -> {
@@ -174,7 +175,8 @@ protected ZoomManager createZoomManager(ScalableFigure scalableFigure, Viewport
protected IFigure createFigure() {
Viewport viewport = createViewport();
- innerLayers = new LayeredPane();
+ innerLayers = new ScalableLayeredPane();
+ this.addEditPartListener(InternalGEFPlugin.createAutoscaleEditPartListener(innerLayers));
createLayers(innerLayers);
viewport.setContents(innerLayers);
diff --git a/org.eclipse.gef/src/org/eclipse/gef/internal/InternalGEFPlugin.java b/org.eclipse.gef/src/org/eclipse/gef/internal/InternalGEFPlugin.java
index 27473b31f..bf8668811 100644
--- a/org.eclipse.gef/src/org/eclipse/gef/internal/InternalGEFPlugin.java
+++ b/org.eclipse.gef/src/org/eclipse/gef/internal/InternalGEFPlugin.java
@@ -13,6 +13,7 @@
package org.eclipse.gef.internal;
+import java.beans.PropertyChangeListener;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
@@ -30,12 +31,17 @@
import org.eclipse.draw2d.BasicColorProvider;
import org.eclipse.draw2d.ColorProvider;
+import org.eclipse.draw2d.ScalableFigure;
+import org.eclipse.gef.EditPart;
+import org.eclipse.gef.EditPartListener;
import org.eclipse.gef.GEFColorProvider;
import org.osgi.framework.BundleContext;
public class InternalGEFPlugin extends AbstractUIPlugin {
+ /** Monitor scale property */
+ public static final String MONITOR_SCALE_PROPERTY = "monitorScale"; //$NON-NLS-1$
private static BundleContext context;
private static AbstractUIPlugin singleton;
@@ -127,4 +133,31 @@ public static Cursor createCursor(ImageDescriptor source, int hotspotX, int hots
throw new RuntimeException("Failed to instantiate Cursor", e); //$NON-NLS-1$
}
}
+
+ public static EditPartListener createAutoscaleEditPartListener(ScalableFigure figure) {
+ final PropertyChangeListener autoScaleListener = evt -> {
+ if (InternalGEFPlugin.MONITOR_SCALE_PROPERTY.equals(evt.getPropertyName()) && evt.getNewValue() != null) {
+ double newValue = (double) evt.getNewValue();
+ figure.setScale(newValue);
+ }
+ };
+
+ return new EditPartListener.Stub() {
+ @Override
+ public void partActivated(EditPart editpart) {
+ editpart.getViewer().addPropertyChangeListener(autoScaleListener);
+ try {
+ double scale = (double) editpart.getViewer().getProperty(InternalGEFPlugin.MONITOR_SCALE_PROPERTY);
+ figure.setScale(scale);
+ } catch (NullPointerException | ClassCastException e) {
+ // no value available
+ }
+ }
+
+ @Override
+ public void partDeactivated(EditPart editpart) {
+ editpart.getViewer().removePropertyChangeListener(autoScaleListener);
+ }
+ };
+ }
}
diff --git a/org.eclipse.gef/src/org/eclipse/gef/internal/SimpleAutoscaledRootEditPart.java b/org.eclipse.gef/src/org/eclipse/gef/internal/SimpleAutoscaledRootEditPart.java
new file mode 100644
index 000000000..719abbd58
--- /dev/null
+++ b/org.eclipse.gef/src/org/eclipse/gef/internal/SimpleAutoscaledRootEditPart.java
@@ -0,0 +1,33 @@
+/*******************************************************************************
+ * Copyright (c) 2025 Yatta and others.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * Yatta - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.gef.internal;
+
+import org.eclipse.draw2d.ScalableFigure;
+import org.eclipse.draw2d.ScalableLayeredPane;
+
+import org.eclipse.gef.editparts.SimpleRootEditPart;
+
+public final class SimpleAutoscaledRootEditPart extends SimpleRootEditPart {
+
+ @Override
+ protected final ScalableFigure createFigure() {
+ ScalableFigure scalableFigure = new ScalableLayeredPane();
+ this.addEditPartListener(InternalGEFPlugin.createAutoscaleEditPartListener(scalableFigure));
+ return scalableFigure;
+ }
+
+ @Override
+ public ScalableFigure getFigure() {
+ return (ScalableFigure) super.getFigure();
+ }
+}
\ No newline at end of file
diff --git a/org.eclipse.gef/src/org/eclipse/gef/ui/palette/FlyoutPaletteComposite.java b/org.eclipse.gef/src/org/eclipse/gef/ui/palette/FlyoutPaletteComposite.java
index 99f988225..18ac606b1 100644
--- a/org.eclipse.gef/src/org/eclipse/gef/ui/palette/FlyoutPaletteComposite.java
+++ b/org.eclipse.gef/src/org/eclipse/gef/ui/palette/FlyoutPaletteComposite.java
@@ -81,8 +81,10 @@
import org.eclipse.draw2d.LightweightSystem;
import org.eclipse.draw2d.MarginBorder;
import org.eclipse.draw2d.PositionConstants;
+import org.eclipse.draw2d.TextUtilities;
import org.eclipse.draw2d.Triangle;
import org.eclipse.draw2d.geometry.Dimension;
+import org.eclipse.draw2d.internal.DrawableTextUtilities;
import org.eclipse.gef.GraphicalViewer;
import org.eclipse.gef.dnd.TemplateTransfer;
@@ -1114,6 +1116,7 @@ protected void updateState() {
private class TitleLabel extends Label {
protected static final Border BORDER = new MarginBorder(4, 3, 4, 3);
protected static final Border TOOL_TIP_BORDER = new MarginBorder(0, 2, 0, 2);
+ private TextUtilities textUtilities;
public TitleLabel(boolean isHorizontal) {
super(GEFMessages.Palette_Label, InternalImages.get(InternalImages.IMG_PALETTE));
@@ -1125,6 +1128,14 @@ public TitleLabel(boolean isHorizontal) {
setForegroundColor(ColorConstants.listForeground);
}
+ @Override
+ public TextUtilities getTextUtilities() {
+ if (textUtilities == null) {
+ textUtilities = new DrawableTextUtilities(paletteContainer);
+ }
+ return textUtilities;
+ }
+
@Override
public IFigure getToolTip() {
if (isTextTruncated()) {
diff --git a/org.eclipse.gef/src/org/eclipse/gef/ui/palette/PaletteViewer.java b/org.eclipse.gef/src/org/eclipse/gef/ui/palette/PaletteViewer.java
index 4f87ef00d..1480593e1 100644
--- a/org.eclipse.gef/src/org/eclipse/gef/ui/palette/PaletteViewer.java
+++ b/org.eclipse.gef/src/org/eclipse/gef/ui/palette/PaletteViewer.java
@@ -31,7 +31,7 @@
import org.eclipse.gef.EditDomain;
import org.eclipse.gef.EditPart;
import org.eclipse.gef.GraphicalEditPart;
-import org.eclipse.gef.editparts.SimpleRootEditPart;
+import org.eclipse.gef.internal.SimpleAutoscaledRootEditPart;
import org.eclipse.gef.internal.ui.palette.PaletteSelectionTool;
import org.eclipse.gef.internal.ui.palette.editparts.DrawerEditPart;
import org.eclipse.gef.internal.ui.palette.editparts.PaletteStackEditPart;
@@ -127,7 +127,7 @@ public void addPaletteListener(PaletteListener paletteListener) {
*/
@Override
protected void createDefaultRoot() {
- setRootEditPart(new SimpleRootEditPart());
+ setRootEditPart(new SimpleAutoscaledRootEditPart());
}
private void disposeFont() {
diff --git a/org.eclipse.gef/src/org/eclipse/gef/ui/parts/AbstractEditPartViewer.java b/org.eclipse.gef/src/org/eclipse/gef/ui/parts/AbstractEditPartViewer.java
index d3a8c470e..ddc958579 100644
--- a/org.eclipse.gef/src/org/eclipse/gef/ui/parts/AbstractEditPartViewer.java
+++ b/org.eclipse.gef/src/org/eclipse/gef/ui/parts/AbstractEditPartViewer.java
@@ -22,6 +22,7 @@
import java.util.Map;
import java.util.concurrent.CopyOnWriteArrayList;
+import org.eclipse.swt.SWT;
import org.eclipse.swt.dnd.DND;
import org.eclipse.swt.dnd.DragSource;
import org.eclipse.swt.dnd.DropTarget;
@@ -46,6 +47,7 @@
import org.eclipse.draw2d.IFigure;
import org.eclipse.draw2d.geometry.Point;
+import org.eclipse.draw2d.internal.InternalDraw2dUtils;
import org.eclipse.gef.AccessibleEditPart;
import org.eclipse.gef.EditDomain;
@@ -55,6 +57,7 @@
import org.eclipse.gef.KeyHandler;
import org.eclipse.gef.RootEditPart;
import org.eclipse.gef.SelectionManager;
+import org.eclipse.gef.internal.InternalGEFPlugin;
/**
* The base implementation for EditPartViewer.
@@ -115,6 +118,11 @@ public abstract class AbstractEditPartViewer implements EditPartViewer {
private KeyHandler keyHandler;
private PropertyChangeSupport changeSupport;
+ /**
+ * Internal flag for fetching the shell zoom
+ */
+ private static final String DATA_SHELL_ZOOM = "SHELL_ZOOM"; //$NON-NLS-1$
+
/**
* Constructs the viewer and calls {@link #init()}.
*/
@@ -484,6 +492,11 @@ protected void hookControl() {
if (contextMenu != null) {
control.setMenu(contextMenu.createContextMenu(getControl()));
}
+ if (InternalDraw2dUtils.disableAutoscale) {
+ control.addListener(SWT.ZoomChanged,
+ e -> setProperty(InternalGEFPlugin.MONITOR_SCALE_PROPERTY, e.detail / 100.0));
+ }
+ setProperty(InternalGEFPlugin.MONITOR_SCALE_PROPERTY, calculateScale());
}
/**
@@ -855,4 +868,16 @@ protected void unhookControl() {
public void unregisterAccessibleEditPart(AccessibleEditPart acc) {
}
+ private double calculateScale() {
+ if (!InternalDraw2dUtils.disableAutoscale || control == null) {
+ return 1.0;
+ }
+ int shellZooom;
+ try {
+ shellZooom = (int) control.getData(DATA_SHELL_ZOOM);
+ } catch (ClassCastException | NullPointerException e) {
+ shellZooom = 100;
+ }
+ return shellZooom / 100.0;
+ }
}
diff --git a/org.eclipse.gef/src/org/eclipse/gef/ui/parts/ScrollingGraphicalViewer.java b/org.eclipse.gef/src/org/eclipse/gef/ui/parts/ScrollingGraphicalViewer.java
index e073c0f48..878731aca 100644
--- a/org.eclipse.gef/src/org/eclipse/gef/ui/parts/ScrollingGraphicalViewer.java
+++ b/org.eclipse.gef/src/org/eclipse/gef/ui/parts/ScrollingGraphicalViewer.java
@@ -21,6 +21,7 @@
import org.eclipse.draw2d.geometry.Dimension;
import org.eclipse.draw2d.geometry.Point;
import org.eclipse.draw2d.geometry.Rectangle;
+import org.eclipse.draw2d.internal.InternalDraw2dUtils;
import org.eclipse.gef.EditPart;
import org.eclipse.gef.GraphicalEditPart;
@@ -52,7 +53,9 @@ public ScrollingGraphicalViewer() {
*/
@Override
public final Control createControl(Composite parent) {
- setControl(new FigureCanvas(parent, getLightweightSystem()));
+ FigureCanvas control = new FigureCanvas(parent, getLightweightSystem());
+ InternalDraw2dUtils.configureForAutoscalingMode(control);
+ setControl(control);
hookRootFigure();
return getControl();
}