15
15
import org .eclipse .swt .SWT ;
16
16
import org .eclipse .swt .graphics .Color ;
17
17
import org .eclipse .swt .graphics .Rectangle ;
18
+ import org .eclipse .swt .widgets .Canvas ;
18
19
import org .eclipse .swt .widgets .Control ;
19
20
import org .eclipse .swt .widgets .Shell ;
20
21
21
22
import org .eclipse .draw2d .geometry .Dimension ;
23
+ import org .eclipse .draw2d .internal .InternalDraw2dUtils ;
22
24
23
25
/**
24
26
* Provides abstract support for classes that manage popups. Popups in Draw2d
@@ -62,7 +64,7 @@ protected PopUpHelper(Control c) {
62
64
*/
63
65
protected PopUpHelper (Control c , int shellStyle ) {
64
66
control = c ;
65
- this .shellStyle = shellStyle | SWT .NO_BACKGROUND | SWT .NO_REDRAW_RESIZE ;
67
+ this .shellStyle = shellStyle | SWT .NO_BACKGROUND | SWT .NO_REDRAW_RESIZE | SWT . DOUBLE_BUFFERED ;
66
68
}
67
69
68
70
/**
@@ -72,9 +74,8 @@ protected PopUpHelper(Control c, int shellStyle) {
72
74
* @return the newly created LightweightSystem
73
75
* @since 2.0
74
76
*/
75
- @ SuppressWarnings ("static-method" )
76
77
protected LightweightSystem createLightweightSystem () {
77
- return new LightweightSystem ();
78
+ return InternalDraw2dUtils . disableAutoscale ? new PopupHelperLightweightSystem () : new LightweightSystem ();
78
79
}
79
80
80
81
/**
@@ -219,4 +220,73 @@ protected void show() {
219
220
tipShowing = true ;
220
221
}
221
222
223
+ private class PopupHelperLightweightSystem extends LightweightSystem {
224
+
225
+ /**
226
+ * Data that can be set to scale this widget at 100%.
227
+ */
228
+ private static final String DATA_AUTOSCALE_DISABLED = "AUTOSCALE_DISABLED" ; //$NON-NLS-1$
229
+
230
+ /**
231
+ * Internal flag for fetching the shell zoom
232
+ */
233
+ private static final String DATA_SHELL_ZOOM = "SHELL_ZOOM" ; //$NON-NLS-1$
234
+
235
+ /**
236
+ * Returns the zoom of the monitor this widget is assigned to.
237
+ *
238
+ * @return 1.0 at 100%, 1.25 at 125% etc.
239
+ */
240
+ private static double getMonitorZoomScale (Control c ) {
241
+ int shellZooom ;
242
+ try {
243
+ shellZooom = (int ) c .getData (DATA_SHELL_ZOOM );
244
+ } catch (ClassCastException | NullPointerException e ) {
245
+ shellZooom = 100 ;
246
+ }
247
+ return shellZooom / 100.0 ;
248
+ }
249
+
250
+ /**
251
+ * The scalable pane that is injected between the root figure and the contents
252
+ * of this viewport.
253
+ */
254
+ private final ScalableLayeredPane scalablePane ;
255
+
256
+ private PopupHelperLightweightSystem () {
257
+ scalablePane = new ScalableLayeredPane (true );
258
+ scalablePane .setLayoutManager (new StackLayout ());
259
+ getRootFigure ().add (scalablePane );
260
+ }
261
+
262
+ /**
263
+ * Updates the scale factor of the scalable pane to the given value.
264
+ *
265
+ * @param scale The new scale factor.
266
+ */
267
+ private void setScale (double scale ) {
268
+ scalablePane .setScale (scale );
269
+ }
270
+
271
+ @ Override
272
+ public void setControl (Canvas c ) {
273
+ if (c == null ) {
274
+ return ;
275
+ }
276
+
277
+ c .setData (DATA_AUTOSCALE_DISABLED , true );
278
+ c .addListener (SWT .ZoomChanged , e -> setScale (e .detail / 100.0 ));
279
+ setScale (getMonitorZoomScale (c ));
280
+
281
+ super .setControl (c );
282
+ }
283
+
284
+ @ Override
285
+ public void setContents (IFigure figure ) {
286
+ scalablePane .removeAll ();
287
+ if (figure != null ) {
288
+ scalablePane .add (figure );
289
+ }
290
+ }
291
+ }
222
292
}
0 commit comments