Skip to content

Commit b92c467

Browse files
committed
Add autoscale disabled mode to allow drawing on unscaled GC
1 parent 2655fd6 commit b92c467

File tree

9 files changed

+143
-10
lines changed

9 files changed

+143
-10
lines changed

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

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323

2424
import org.eclipse.draw2d.geometry.Dimension;
2525
import org.eclipse.draw2d.geometry.Rectangle;
26+
import org.eclipse.draw2d.internal.InternalDraw2dUtils;
2627

2728
/**
2829
* Provides miscellaneous Figure operations.
@@ -73,7 +74,9 @@ public static FontMetrics getFontMetrics(Font f) {
7374
@Deprecated
7475
protected static GC getGC() {
7576
if (gc == null) {
76-
gc = new GC(new Shell());
77+
Shell shell = new Shell();
78+
InternalDraw2dUtils.configureForAutoscalingMode(shell);
79+
gc = new GC(shell);
7780
appliedFont = gc.getFont();
7881
}
7982
return gc;
@@ -424,5 +427,4 @@ public static boolean isNotFullyClipped(IFigure figure) {
424427
}
425428
return !figBounds.isEmpty();
426429
}
427-
428430
}
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
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+
import org.eclipse.swt.widgets.Control;
17+
18+
public class InternalDraw2dUtils {
19+
/**
20+
* System property that controls the disablement of any autoScale functionality.
21+
* Currently it only has effects when executed on Windows.
22+
*
23+
* <ul>
24+
* <li><b>false</b>: autoScale functionality is enabled</li>
25+
* <li><b>true</b>: autoScale functionality is disabled<</li>
26+
*
27+
* </ul>
28+
* The current default is "false".
29+
*/
30+
private static final String DRAW2D_DISABLE_AUTOSCALE = "draw2d.disableAutoscale"; //$NON-NLS-1$
31+
32+
public static boolean disableAutoscale;
33+
34+
static {
35+
disableAutoscale = "win32".equals(SWT.getPlatform()) //$NON-NLS-1$
36+
&& Boolean.parseBoolean(System.getProperty(DRAW2D_DISABLE_AUTOSCALE));
37+
}
38+
39+
public static void configureForAutoscalingMode(Control control) {
40+
if (control != null && disableAutoscale) {
41+
control.setData("AUTOSCALE_DISABLED", true); //$NON-NLS-1$
42+
}
43+
}
44+
}

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

Lines changed: 5 additions & 3 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.InternalGEFPlugin;
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,8 @@ 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();
108+
this.addEditPartListener(InternalGEFPlugin.createAutoscaleEditPartListener(innerLayers));
106109
createLayers(innerLayers);
107110
viewport.setContents(innerLayers);
108111
return viewport;
@@ -276,5 +279,4 @@ class FeedbackLayer extends FreeformLayer {
276279
setEnabled(false);
277280
}
278281
}
279-
280282
}

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

Lines changed: 4 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.InternalGEFPlugin;
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,8 @@ protected ZoomManager createZoomManager(ScalableFigure scalableFigure, Viewport
174175
protected IFigure createFigure() {
175176
Viewport viewport = createViewport();
176177

177-
innerLayers = new LayeredPane();
178+
innerLayers = new ScalableLayeredPane();
179+
this.addEditPartListener(InternalGEFPlugin.createAutoscaleEditPartListener(innerLayers));
178180
createLayers(innerLayers);
179181

180182
viewport.setContents(innerLayers);

org.eclipse.gef/src/org/eclipse/gef/internal/InternalGEFPlugin.java

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313

1414
package org.eclipse.gef.internal;
1515

16+
import java.beans.PropertyChangeListener;
1617
import java.lang.reflect.Constructor;
1718
import java.lang.reflect.InvocationTargetException;
1819

@@ -30,12 +31,17 @@
3031

3132
import org.eclipse.draw2d.BasicColorProvider;
3233
import org.eclipse.draw2d.ColorProvider;
34+
import org.eclipse.draw2d.ScalableFigure;
3335

36+
import org.eclipse.gef.EditPart;
37+
import org.eclipse.gef.EditPartListener;
3438
import org.eclipse.gef.GEFColorProvider;
3539

3640
import org.osgi.framework.BundleContext;
3741

3842
public class InternalGEFPlugin extends AbstractUIPlugin {
43+
/** Monitor scale property */
44+
public static final String MONITOR_SCALE_PROPERTY = "monitorScale"; //$NON-NLS-1$
3945

4046
private static BundleContext context;
4147
private static AbstractUIPlugin singleton;
@@ -127,4 +133,31 @@ public static Cursor createCursor(ImageDescriptor source, int hotspotX, int hots
127133
throw new RuntimeException("Failed to instantiate Cursor", e); //$NON-NLS-1$
128134
}
129135
}
136+
137+
public static EditPartListener createAutoscaleEditPartListener(ScalableFigure figure) {
138+
final PropertyChangeListener autoScaleListener = evt -> {
139+
if (InternalGEFPlugin.MONITOR_SCALE_PROPERTY.equals(evt.getPropertyName()) && evt.getNewValue() != null) {
140+
double newValue = (double) evt.getNewValue();
141+
figure.setScale(newValue);
142+
}
143+
};
144+
145+
return new EditPartListener.Stub() {
146+
@Override
147+
public void partActivated(EditPart editpart) {
148+
editpart.getViewer().addPropertyChangeListener(autoScaleListener);
149+
try {
150+
double scale = (double) editpart.getViewer().getProperty(InternalGEFPlugin.MONITOR_SCALE_PROPERTY);
151+
figure.setScale(scale);
152+
} catch (NullPointerException | ClassCastException e) {
153+
// no value available
154+
}
155+
}
156+
157+
@Override
158+
public void partDeactivated(EditPart editpart) {
159+
editpart.getViewer().removePropertyChangeListener(autoScaleListener);
160+
}
161+
};
162+
}
130163
}
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
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.ScalableFigure;
16+
import org.eclipse.draw2d.ScalableLayeredPane;
17+
18+
import org.eclipse.gef.editparts.SimpleRootEditPart;
19+
20+
public final class SimpleAutoscaledRootEditPart extends SimpleRootEditPart {
21+
22+
@Override
23+
protected final ScalableFigure createFigure() {
24+
ScalableFigure scalableFigure = new ScalableLayeredPane();
25+
this.addEditPartListener(InternalGEFPlugin.createAutoscaleEditPartListener(scalableFigure));
26+
return scalableFigure;
27+
}
28+
29+
@Override
30+
public ScalableFigure getFigure() {
31+
return (ScalableFigure) super.getFigure();
32+
}
33+
}

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() {

org.eclipse.gef/src/org/eclipse/gef/ui/parts/AbstractEditPartViewer.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import java.util.Map;
2323
import java.util.concurrent.CopyOnWriteArrayList;
2424

25+
import org.eclipse.swt.SWT;
2526
import org.eclipse.swt.dnd.DND;
2627
import org.eclipse.swt.dnd.DragSource;
2728
import org.eclipse.swt.dnd.DropTarget;
@@ -46,6 +47,7 @@
4647

4748
import org.eclipse.draw2d.IFigure;
4849
import org.eclipse.draw2d.geometry.Point;
50+
import org.eclipse.draw2d.internal.InternalDraw2dUtils;
4951

5052
import org.eclipse.gef.AccessibleEditPart;
5153
import org.eclipse.gef.EditDomain;
@@ -55,6 +57,7 @@
5557
import org.eclipse.gef.KeyHandler;
5658
import org.eclipse.gef.RootEditPart;
5759
import org.eclipse.gef.SelectionManager;
60+
import org.eclipse.gef.internal.InternalGEFPlugin;
5861

5962
/**
6063
* The base implementation for EditPartViewer.
@@ -484,6 +487,11 @@ protected void hookControl() {
484487
if (contextMenu != null) {
485488
control.setMenu(contextMenu.createContextMenu(getControl()));
486489
}
490+
if (InternalDraw2dUtils.disableAutoscale) {
491+
control.addListener(SWT.ZoomChanged,
492+
e -> setProperty(InternalGEFPlugin.MONITOR_SCALE_PROPERTY, e.detail / 100.0));
493+
}
494+
setProperty(InternalGEFPlugin.MONITOR_SCALE_PROPERTY, calculateScale());
487495
}
488496

489497
/**
@@ -855,4 +863,10 @@ protected void unhookControl() {
855863
public void unregisterAccessibleEditPart(AccessibleEditPart acc) {
856864
}
857865

866+
private double calculateScale() {
867+
if (!InternalDraw2dUtils.disableAutoscale || control == null) {
868+
return 1.0;
869+
}
870+
return control.getMonitor().getZoom() / 100.0;
871+
}
858872
}

org.eclipse.gef/src/org/eclipse/gef/ui/parts/ScrollingGraphicalViewer.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import org.eclipse.draw2d.geometry.Dimension;
2222
import org.eclipse.draw2d.geometry.Point;
2323
import org.eclipse.draw2d.geometry.Rectangle;
24+
import org.eclipse.draw2d.internal.InternalDraw2dUtils;
2425

2526
import org.eclipse.gef.EditPart;
2627
import org.eclipse.gef.GraphicalEditPart;
@@ -52,7 +53,9 @@ public ScrollingGraphicalViewer() {
5253
*/
5354
@Override
5455
public final Control createControl(Composite parent) {
55-
setControl(new FigureCanvas(parent, getLightweightSystem()));
56+
FigureCanvas control = new FigureCanvas(parent, getLightweightSystem());
57+
InternalDraw2dUtils.configureForAutoscalingMode(control);
58+
setControl(control);
5659
hookRootFigure();
5760
return getControl();
5861
}

0 commit comments

Comments
 (0)