Skip to content

Commit fcab70f

Browse files
committed
Add autoscale disabled mode to allow drawing on unscaled GC
1 parent 467992a commit fcab70f

File tree

11 files changed

+300
-9
lines changed

11 files changed

+300
-9
lines changed

org.eclipse.draw2d/src/org/eclipse/draw2d/FigureUtilities.java

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,12 @@
1919
import org.eclipse.swt.graphics.Font;
2020
import org.eclipse.swt.graphics.FontMetrics;
2121
import org.eclipse.swt.graphics.GC;
22+
import org.eclipse.swt.widgets.Control;
2223
import org.eclipse.swt.widgets.Shell;
2324

2425
import org.eclipse.draw2d.geometry.Dimension;
2526
import org.eclipse.draw2d.geometry.Rectangle;
27+
import org.eclipse.draw2d.internal.InternalDraw2dUtils;
2628

2729
/**
2830
* Provides miscellaneous Figure operations.
@@ -73,7 +75,9 @@ public static FontMetrics getFontMetrics(Font f) {
7375
@Deprecated
7476
protected static GC getGC() {
7577
if (gc == null) {
76-
gc = new GC(new Shell());
78+
Shell shell = new Shell();
79+
configureAutoscaleMode(shell);
80+
gc = new GC(shell);
7781
appliedFont = gc.getFont();
7882
}
7983
return gc;
@@ -425,4 +429,9 @@ public static boolean isNotFullyClipped(IFigure figure) {
425429
return !figBounds.isEmpty();
426430
}
427431

432+
public static void configureAutoscaleMode(Control control) {
433+
if (control != null && InternalDraw2dUtils.disableAutoscale) {
434+
control.setData("AUTOSCALE_DISABLED", true); //$NON-NLS-1$
435+
}
436+
}
428437
}
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
/*******************************************************************************
2+
* Copyright (c) 2025 Yatta and others.
3+
*
4+
* This program and the accompanying materials are made available under the
5+
* terms of the Eclipse Public License 2.0 which is available at
6+
* http://www.eclipse.org/legal/epl-2.0.
7+
*
8+
* SPDX-License-Identifier: EPL-2.0
9+
*
10+
* Contributors:
11+
* Yatta - initial API and implementation
12+
*******************************************************************************/
13+
package org.eclipse.draw2d.internal;
14+
15+
import org.eclipse.swt.SWT;
16+
17+
public class InternalDraw2dUtils {
18+
/**
19+
* System property that controls the disablement of any autoScale functionality.
20+
* Currently it only has effects when executed on Windows.
21+
*
22+
* <ul>
23+
* <li><b>false</b>: autoScale functionality is enabled</li>
24+
* <li><b>true</b>: autoScale functionality is disabled<</li>
25+
*
26+
* </ul>
27+
* The current default is "false".
28+
*/
29+
private static final String DRAW2D_DISABLE_AUTOSCALE = "draw2d.disableAutoscale"; //$NON-NLS-1$
30+
31+
public static boolean disableAutoscale;
32+
33+
static {
34+
disableAutoscale = "win32".equals(SWT.getPlatform()) //$NON-NLS-1$
35+
&& Boolean.parseBoolean(System.getProperty(DRAW2D_DISABLE_AUTOSCALE));
36+
}
37+
}

org.eclipse.gef/src/org/eclipse/gef/editparts/FreeformGraphicalRootEditPart.java

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import org.eclipse.draw2d.FreeformViewport;
2121
import org.eclipse.draw2d.IFigure;
2222
import org.eclipse.draw2d.LayeredPane;
23+
import org.eclipse.draw2d.ScalableFreeformLayeredPane;
2324
import org.eclipse.draw2d.geometry.Dimension;
2425
import org.eclipse.draw2d.geometry.Point;
2526

@@ -30,6 +31,7 @@
3031
import org.eclipse.gef.LayerConstants;
3132
import org.eclipse.gef.Request;
3233
import org.eclipse.gef.SnapToGrid;
34+
import org.eclipse.gef.internal.MonitorAwareZoomManager;
3335
import org.eclipse.gef.tools.MarqueeDragTracker;
3436

3537
/**
@@ -86,7 +88,7 @@
8688
*/
8789
public class FreeformGraphicalRootEditPart extends SimpleRootEditPart implements LayerConstants, LayerManager {
8890

89-
private LayeredPane innerLayers;
91+
private ScalableFreeformLayeredPane innerLayers;
9092
private LayeredPane printableLayers;
9193
private final PropertyChangeListener gridListener = evt -> {
9294
String property = evt.getPropertyName();
@@ -102,7 +104,7 @@ public class FreeformGraphicalRootEditPart extends SimpleRootEditPart implements
102104
@Override
103105
protected IFigure createFigure() {
104106
FreeformViewport viewport = new FreeformViewport();
105-
innerLayers = new FreeformLayeredPane();
107+
innerLayers = new ScalableFreeformLayeredPane();
106108
createLayers(innerLayers);
107109
viewport.setContents(innerLayers);
108110
return viewport;
@@ -260,13 +262,23 @@ protected void register() {
260262
getViewer().addPropertyChangeListener(gridListener);
261263
refreshGridLayer();
262264
}
265+
MonitorAwareZoomManager monitorAwareZoomManager = (MonitorAwareZoomManager) getViewer()
266+
.getProperty(MonitorAwareZoomManager.class.toString());
267+
if (monitorAwareZoomManager != null) {
268+
monitorAwareZoomManager.registerPane(innerLayers);
269+
}
263270
}
264271

265272
/**
266273
* @see AbstractEditPart#unregister()
267274
*/
268275
@Override
269276
protected void unregister() {
277+
MonitorAwareZoomManager monitorAwareZoomManager = (MonitorAwareZoomManager) getViewer()
278+
.getProperty(MonitorAwareZoomManager.class.toString());
279+
if (monitorAwareZoomManager != null) {
280+
monitorAwareZoomManager.unregisterPane(innerLayers);
281+
}
270282
getViewer().removePropertyChangeListener(gridListener);
271283
super.unregister();
272284
}

org.eclipse.gef/src/org/eclipse/gef/editparts/ScalableRootEditPart.java

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
import org.eclipse.gef.LayerConstants;
3333
import org.eclipse.gef.Request;
3434
import org.eclipse.gef.SnapToGrid;
35+
import org.eclipse.gef.internal.MonitorAwareZoomManager;
3536
import org.eclipse.gef.tools.MarqueeDragTracker;
3637

3738
/**
@@ -121,7 +122,7 @@ public Dimension getPreferredSize(int wHint, int hHint) {
121122

122123
}
123124

124-
private LayeredPane innerLayers;
125+
private ScalableLayeredPane innerLayers;
125126
private LayeredPane printableLayers;
126127
private ScalableLayeredPane scaledLayers;
127128
private final PropertyChangeListener gridListener = (PropertyChangeEvent evt) -> {
@@ -174,7 +175,7 @@ protected ZoomManager createZoomManager(ScalableFigure scalableFigure, Viewport
174175
protected IFigure createFigure() {
175176
Viewport viewport = createViewport();
176177

177-
innerLayers = new LayeredPane();
178+
innerLayers = new ScalableLayeredPane();
178179
createLayers(innerLayers);
179180

180181
viewport.setContents(innerLayers);
@@ -390,13 +391,23 @@ protected void register() {
390391
getViewer().addPropertyChangeListener(gridListener);
391392
refreshGridLayer();
392393
}
394+
MonitorAwareZoomManager monitorAwareZoomManager = (MonitorAwareZoomManager) getViewer()
395+
.getProperty(MonitorAwareZoomManager.class.toString());
396+
if (monitorAwareZoomManager != null) {
397+
monitorAwareZoomManager.registerPane(innerLayers);
398+
}
393399
}
394400

395401
/**
396402
* @see org.eclipse.gef.editparts.AbstractEditPart#unregister()
397403
*/
398404
@Override
399405
protected void unregister() {
406+
MonitorAwareZoomManager monitorAwareZoomManager = (MonitorAwareZoomManager) getViewer()
407+
.getProperty(MonitorAwareZoomManager.class.toString());
408+
if (monitorAwareZoomManager != null) {
409+
monitorAwareZoomManager.unregisterPane(innerLayers);
410+
}
400411
getViewer().removePropertyChangeListener(gridListener);
401412
super.unregister();
402413
getViewer().setProperty(ZoomManager.class.toString(), null);
Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
/*******************************************************************************
2+
* Copyright (c) 2025 Yatta and others.
3+
*
4+
* This program and the accompanying materials are made available under the
5+
* terms of the Eclipse Public License 2.0 which is available at
6+
* http://www.eclipse.org/legal/epl-2.0.
7+
*
8+
* SPDX-License-Identifier: EPL-2.0
9+
*
10+
* Contributors:
11+
* Yatta - initial API and implementation
12+
*******************************************************************************/
13+
package org.eclipse.gef.internal;
14+
15+
import java.util.HashSet;
16+
import java.util.Set;
17+
18+
import org.eclipse.swt.SWT;
19+
import org.eclipse.swt.widgets.Control;
20+
import org.eclipse.swt.widgets.Listener;
21+
22+
import org.eclipse.draw2d.IFigure;
23+
import org.eclipse.draw2d.ScalableFigure;
24+
import org.eclipse.draw2d.internal.InternalDraw2dUtils;
25+
26+
public class MonitorAwareZoomManager {
27+
private final Set<ScalableFigure> scalablePanes;
28+
private Control control;
29+
private final Listener zoomChangedListener = event -> {
30+
refreshZoom();
31+
};
32+
33+
public MonitorAwareZoomManager() {
34+
this.scalablePanes = new HashSet<>();
35+
}
36+
37+
public void setControl(Control control) {
38+
if (this.control != null) {
39+
this.control.removeListener(SWT.ZoomChanged, zoomChangedListener);
40+
}
41+
this.control = control;
42+
if (control != null) {
43+
control.addListener(SWT.ZoomChanged, zoomChangedListener);
44+
refreshZoom();
45+
}
46+
}
47+
48+
public void registerPane(ScalableFigure scalableFigure) {
49+
IFigure parentFigure = scalableFigure.getParent();
50+
while (parentFigure != null) {
51+
if (this.scalablePanes.contains(parentFigure)) {
52+
// do not register figure if a parent is already registered
53+
return;
54+
}
55+
parentFigure = parentFigure.getParent();
56+
}
57+
this.scalablePanes.add(scalableFigure);
58+
refreshZoom();
59+
}
60+
61+
public void unregisterPane(ScalableFigure scalableFigure) {
62+
this.scalablePanes.remove(scalableFigure);
63+
}
64+
65+
private void refreshZoom() {
66+
final double calculateScale = calculateScale();
67+
this.scalablePanes.forEach(scalablePane -> {
68+
scalablePane.setScale(calculateScale);
69+
});
70+
}
71+
72+
private double calculateScale() {
73+
int zoom;
74+
if (InternalDraw2dUtils.disableAutoscale) {
75+
try {
76+
zoom = (int) control.getData("NATIVE_ZOOM"); //$NON-NLS-1$
77+
} catch (Exception e) {
78+
zoom = 100;
79+
}
80+
} else {
81+
zoom = 100;
82+
}
83+
return zoom / 100d;
84+
}
85+
}
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
/*******************************************************************************
2+
* Copyright (c) 2025 Yatta and others.
3+
*
4+
* This program and the accompanying materials are made available under the
5+
* terms of the Eclipse Public License 2.0 which is available at
6+
* http://www.eclipse.org/legal/epl-2.0.
7+
*
8+
* SPDX-License-Identifier: EPL-2.0
9+
*
10+
* Contributors:
11+
* Yatta - initial API and implementation
12+
*******************************************************************************/
13+
package org.eclipse.gef.internal;
14+
15+
import org.eclipse.draw2d.IScalablePane;
16+
import org.eclipse.draw2d.ScalableLayeredPane;
17+
18+
import org.eclipse.gef.editparts.SimpleRootEditPart;
19+
20+
public final class SimpleAutoscaledRootEditPart extends SimpleRootEditPart {
21+
@Override
22+
protected final IScalablePane createFigure() {
23+
return new ScalableLayeredPane();
24+
}
25+
26+
@Override
27+
public IScalablePane getFigure() {
28+
return (IScalablePane) super.getFigure();
29+
}
30+
31+
@Override
32+
protected void register() {
33+
super.register();
34+
MonitorAwareZoomManager monitorAwareZoomManager = (MonitorAwareZoomManager) getViewer()
35+
.getProperty(MonitorAwareZoomManager.class.toString());
36+
if (monitorAwareZoomManager != null) {
37+
monitorAwareZoomManager.registerPane(getFigure());
38+
}
39+
}
40+
41+
@Override
42+
protected void unregister() {
43+
MonitorAwareZoomManager monitorAwareZoomManager = (MonitorAwareZoomManager) getViewer()
44+
.getProperty(MonitorAwareZoomManager.class.toString());
45+
if (monitorAwareZoomManager != null) {
46+
monitorAwareZoomManager.unregisterPane(getFigure());
47+
}
48+
super.unregister();
49+
}
50+
}

org.eclipse.gef/src/org/eclipse/gef/ui/palette/FlyoutPaletteComposite.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1125,6 +1125,17 @@ public TitleLabel(boolean isHorizontal) {
11251125
setForegroundColor(ColorConstants.listForeground);
11261126
}
11271127

1128+
@Override
1129+
protected Dimension calculateTextSize() {
1130+
GC gc = new GC(paletteContainer);
1131+
try {
1132+
gc.setFont(getFont());
1133+
return new Dimension(gc.textExtent(getText()));
1134+
} finally {
1135+
gc.dispose();
1136+
}
1137+
}
1138+
11281139
@Override
11291140
public IFigure getToolTip() {
11301141
if (isTextTruncated()) {

org.eclipse.gef/src/org/eclipse/gef/ui/palette/PaletteViewer.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@
3131
import org.eclipse.gef.EditDomain;
3232
import org.eclipse.gef.EditPart;
3333
import org.eclipse.gef.GraphicalEditPart;
34-
import org.eclipse.gef.editparts.SimpleRootEditPart;
34+
import org.eclipse.gef.internal.SimpleAutoscaledRootEditPart;
3535
import org.eclipse.gef.internal.ui.palette.PaletteSelectionTool;
3636
import org.eclipse.gef.internal.ui.palette.editparts.DrawerEditPart;
3737
import org.eclipse.gef.internal.ui.palette.editparts.PaletteStackEditPart;
@@ -127,7 +127,7 @@ public void addPaletteListener(PaletteListener paletteListener) {
127127
*/
128128
@Override
129129
protected void createDefaultRoot() {
130-
setRootEditPart(new SimpleRootEditPart());
130+
setRootEditPart(new SimpleAutoscaledRootEditPart());
131131
}
132132

133133
private void disposeFont() {

0 commit comments

Comments
 (0)