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. + * + * + * 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(); }