Skip to content

Commit 612df4b

Browse files
committed
8391: Dark theme support for dials
Reviewed-by: bdutheil
1 parent c20efe3 commit 612df4b

File tree

11 files changed

+86
-15
lines changed

11 files changed

+86
-15
lines changed

application/org.openjdk.jmc.rjmx.ui/src/main/java/org/openjdk/jmc/rjmx/ui/internal/CombinedDialsSectionPart.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@
6666
import org.openjdk.jmc.rjmx.common.subscription.IMRIService;
6767
import org.openjdk.jmc.rjmx.common.subscription.IMRIValueListener;
6868
import org.openjdk.jmc.rjmx.common.subscription.ISubscriptionService;
69+
import org.openjdk.jmc.ui.common.util.ThemeUtils;
6970
import org.openjdk.jmc.rjmx.common.subscription.MRI;
7071
import org.openjdk.jmc.rjmx.common.subscription.MRIValueEvent;
7172
import org.openjdk.jmc.rjmx.subscription.MRIMetadataToolkit;
@@ -128,7 +129,7 @@ private class AttributeDial extends Dial implements IMRIValueListener {
128129
private final RateLimitedRefresher infoRefresher;
129130

130131
AttributeDial(MRI mri, DialConfiguration dialConfiguration) {
131-
super(m_dialsHolder, toolkit, dialConfiguration);
132+
super(m_dialsHolder, toolkit, dialConfiguration, ThemeUtils.isDarkTheme());
132133
this.mri = mri;
133134
statistics = new StatisticsCalculator(mri);
134135
infoRefresher = new RateLimitedRefresher(rateCoordinator, 100) {
Loading
Loading
Loading
Loading

application/org.openjdk.jmc.ui/src/main/java/org/openjdk/jmc/ui/UIPlugin.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -163,11 +163,17 @@ public class UIPlugin extends MCAbstractUIPlugin {
163163

164164
public static final String ICON_DIAL_PANEL = "single-dial.png"; //$NON-NLS-1$
165165
public static final String ICON_DIAL_BACKGROUND = "dial-bkgnd.png"; //$NON-NLS-1$
166+
public static final String ICON_DIAL_BACKGROUND_DARK = "dial-bkgnd-dark.png"; //$NON-NLS-1$
166167
public static final String ICON_DIAL_PANEL2 = "dial2.png"; //$NON-NLS-1$TDial
167168

168169
public static final String ICON_DIAL_PANEL_1_10 = "dial_1_to_10.png"; //$NON-NLS-1$
169170
public static final String ICON_DIAL_PANEL_10_100 = "dial_10_to_100.png"; //$NON-NLS-1$
170171
public static final String ICON_DIAL_PANEL_100_1000 = "dial_100_to_1000.png"; //$NON-NLS-1$
172+
173+
public static final String ICON_DIAL_PANEL_1_10_DARK = "dial_1_to_10-dark.png"; //$NON-NLS-1$
174+
public static final String ICON_DIAL_PANEL_10_100_DARK = "dial_10_to_100-dark.png"; //$NON-NLS-1$
175+
public static final String ICON_DIAL_PANEL_100_1000_DARK = "dial_100_to_1000-dark.png"; //$NON-NLS-1$
176+
171177
public final static String ICON_DELETE = "delete-16.png"; //$NON-NLS-1$
172178

173179
public final static String ICON_MISSION_CONTROL = "mission_control.gif"; //$NON-NLS-1$
@@ -322,8 +328,12 @@ protected void initializeImageRegistry(ImageRegistry registry) {
322328
registerImage(registry, ICON_DIAL_PANEL_1_10, ICON_DIAL_PANEL_1_10);
323329
registerImage(registry, ICON_DIAL_PANEL_10_100, ICON_DIAL_PANEL_10_100);
324330
registerImage(registry, ICON_DIAL_PANEL_100_1000, ICON_DIAL_PANEL_100_1000);
331+
registerImage(registry, ICON_DIAL_PANEL_1_10_DARK, ICON_DIAL_PANEL_1_10_DARK);
332+
registerImage(registry, ICON_DIAL_PANEL_10_100_DARK, ICON_DIAL_PANEL_10_100_DARK);
333+
registerImage(registry, ICON_DIAL_PANEL_100_1000_DARK, ICON_DIAL_PANEL_100_1000_DARK);
325334

326335
registerImage(registry, ICON_DIAL_BACKGROUND, ICON_DIAL_BACKGROUND);
336+
registerImage(registry, ICON_DIAL_BACKGROUND_DARK, ICON_DIAL_BACKGROUND_DARK);
327337
registerImage(registry, ICON_FOLDER, ICON_FOLDER);
328338
registerImage(registry, ICON_FOLDER_CLOSED, ICON_FOLDER_CLOSED);
329339

application/org.openjdk.jmc.ui/src/main/java/org/openjdk/jmc/ui/dial/Dial.java

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,8 +64,26 @@ public class Dial extends Composite {
6464
* a widget which will be the parent of the new widget
6565
* @param toolkit
6666
* the form toolkit in use
67+
* @param dialConfiguration
68+
* the dial configuration to use
6769
*/
6870
public Dial(Composite parent, FormToolkit formToolkit, DialConfiguration dialConfiguration) {
71+
this(parent, formToolkit, dialConfiguration, false);
72+
}
73+
74+
/**
75+
* Creates the actual dial widget with theme support.
76+
*
77+
* @param parent
78+
* a widget which will be the parent of the new widget
79+
* @param toolkit
80+
* the form toolkit in use
81+
* @param dialConfiguration
82+
* the dial configuration to use
83+
* @param isDarkMode
84+
* whether to use dark mode styling
85+
*/
86+
public Dial(Composite parent, FormToolkit formToolkit, DialConfiguration dialConfiguration, boolean isDarkMode) {
6987
super(parent, SWT.NONE);
7088

7189
GridLayout layout = new GridLayout();
@@ -75,7 +93,7 @@ public Dial(Composite parent, FormToolkit formToolkit, DialConfiguration dialCon
7593
layout.marginWidth = 0;
7694
setLayout(layout);
7795

78-
m_dialViewer = new DialViewer(this, SWT.NONE);
96+
m_dialViewer = new DialViewer(this, SWT.NONE, isDarkMode);
7997
FocusTracker.enableFocusTracking(m_dialViewer);
8098
m_dialViewer.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
8199
formToolkit.adapt(m_dialViewer);

application/org.openjdk.jmc.ui/src/main/java/org/openjdk/jmc/ui/dial/DialConfiguration.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@
4242
import org.openjdk.jmc.common.unit.QuantityConversionException;
4343
import org.openjdk.jmc.common.unit.UnitLookup;
4444
import org.openjdk.jmc.common.util.ColorToolkit;
45+
import org.openjdk.jmc.ui.common.util.ThemeUtils;
4546

4647
public class DialConfiguration {
4748

@@ -55,7 +56,7 @@ public class DialConfiguration {
5556

5657
private Color m_gradientBeginColor = new Color(107, 143, 183);
5758
private Color m_gradientEndColor = new Color(107, 143, 183);
58-
private Color m_waterMarkColor = new Color(150, 150, 150);
59+
private Color m_waterMarkColor = ThemeUtils.isDarkTheme() ? new Color(80, 80, 80) : new Color(150, 150, 150);
5960
private IQuantity m_gradientBeginValue;
6061
private IQuantity m_gradientEndValue;
6162
private boolean m_useWatermark = true;

application/org.openjdk.jmc.ui/src/main/java/org/openjdk/jmc/ui/dial/DialDevice.java

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -52,14 +52,24 @@ class DialDevice {
5252
ImageDescription.createStandardConfiguration(
5353
UIPlugin.getDefault().getImage(UIPlugin.ICON_DIAL_PANEL_100_1000), 1000)};
5454

55+
private static final ImageDescription[] DARK_BACKGROUNDS = new ImageDescription[] {
56+
ImageDescription.createStandardConfiguration(
57+
UIPlugin.getDefault().getImage(UIPlugin.ICON_DIAL_PANEL_1_10_DARK), 10),
58+
ImageDescription.createStandardConfiguration(
59+
UIPlugin.getDefault().getImage(UIPlugin.ICON_DIAL_PANEL_10_100_DARK), 100),
60+
ImageDescription.createStandardConfiguration(
61+
UIPlugin.getDefault().getImage(UIPlugin.ICON_DIAL_PANEL_100_1000_DARK), 1000)};
62+
5563
private final IUnit unit;
5664
private final ImageDescription background;
5765
private final Boolean positive;
66+
private final boolean isDarkMode;
5867

59-
private DialDevice(IUnit unit, ImageDescription background, Boolean positive) {
68+
private DialDevice(IUnit unit, ImageDescription background, Boolean positive, boolean isDarkMode) {
6069
this.unit = unit;
6170
this.background = background;
6271
this.positive = positive;
72+
this.isDarkMode = isDarkMode;
6373
}
6474

6575
String getTitle() {
@@ -95,20 +105,21 @@ static Rectangle getBackgroundSize() {
95105
return BACKGROUNDS[0].image.getBounds();
96106
}
97107

98-
static DialDevice buildSuitableDevice(double minValue, double maxValue, IUnit inUnit) {
108+
static DialDevice buildSuitableDevice(double minValue, double maxValue, IUnit inUnit, boolean isDarkMode) {
99109
if (minValue > maxValue || Double.isInfinite(minValue) || Double.isInfinite(maxValue)) {
100110
// no value background
101111
return new DialDevice(inUnit.getContentType().getPreferredUnit(inUnit.quantity(1), 1.0, 1000),
102-
BACKGROUNDS[0], true);
112+
isDarkMode ? DARK_BACKGROUNDS[0] : BACKGROUNDS[0], true, isDarkMode);
103113
}
104114
IQuantity quantity = inUnit.quantity(Math.max(Math.abs(minValue), Math.abs(maxValue)));
105115
IUnit preferredUnit = inUnit.getContentType().getPreferredUnit(quantity, 1.0,
106116
BACKGROUNDS[BACKGROUNDS.length - 1].dialEndValue);
107117
double value = quantity.doubleValueIn(preferredUnit);
108-
for (ImageDescription bg : BACKGROUNDS) {
118+
ImageDescription[] backgrounds = isDarkMode ? DARK_BACKGROUNDS : BACKGROUNDS;
119+
for (ImageDescription bg : backgrounds) {
109120
if (value <= bg.dialEndValue) {
110121
Boolean positive = maxValue < 0 ? Boolean.FALSE : (minValue < 0 ? null : Boolean.TRUE);
111-
return new DialDevice(preferredUnit, bg, positive);
122+
return new DialDevice(preferredUnit, bg, positive, isDarkMode);
112123
}
113124
}
114125

@@ -118,7 +129,7 @@ static DialDevice buildSuitableDevice(double minValue, double maxValue, IUnit in
118129
* Choosing a hopefully useful dial device, but too large values will be normalized to 1.
119130
* Consider throwing an exception instead.
120131
*/
121-
return new DialDevice(preferredUnit, BACKGROUNDS[BACKGROUNDS.length - 1], true);
132+
return new DialDevice(preferredUnit, backgrounds[backgrounds.length - 1], true, isDarkMode);
122133
// throw new IllegalArgumentException("Cannot find a suitable dial device");
123134
}
124135
}

application/org.openjdk.jmc.ui/src/main/java/org/openjdk/jmc/ui/dial/DialViewer.java

Lines changed: 30 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,7 @@ public class DialViewer extends Composite implements IRefreshable {
8383
// Model
8484
private IDialProvider[] m_dials = new IDialProvider[] {};
8585
final private Map<String, Object> m_inputs = new LinkedHashMap<>();
86+
private final boolean m_isDarkMode;
8687

8788
// listeners
8889
final private MCAccessibleListener m_accessibleListener;
@@ -109,7 +110,23 @@ public class DialViewer extends Composite implements IRefreshable {
109110
* @param configuration
110111
*/
111112
public DialViewer(Composite parent, int style) {
113+
this(parent, style, false);
114+
}
115+
116+
/**
117+
* Constructs a {@link DialViewer} with a given configuration on the parent composite,
118+
* respecting the theme settings.
119+
*
120+
* @param parent
121+
* the parent composite
122+
* @param style
123+
* the SWT style
124+
* @param isDarkMode
125+
* whether to use dark mode dial images
126+
*/
127+
public DialViewer(Composite parent, int style, boolean isDarkMode) {
112128
super(parent, SWT.DOUBLE_BUFFERED);
129+
m_isDarkMode = isDarkMode;
113130

114131
m_accessibleListener = new MCAccessibleListener();
115132
m_accessibleListener.setComponentType(AccessibilityConstants.COMPONENT_TYPE_DIAL);
@@ -352,7 +369,7 @@ private void draw(GC gc, int x, int y, int width, int height, boolean drawOptima
352369
maxValue = Math.max(maxValue, values[n]);
353370
minValue = Math.min(minValue, values[n]);
354371
}
355-
DialDevice dd = DialDevice.buildSuitableDevice(minValue, maxValue, getUnit());
372+
DialDevice dd = DialDevice.buildSuitableDevice(minValue, maxValue, getUnit(), m_isDarkMode);
356373
ImageDescription bgConfig = dd.getBackground();
357374
Rectangle size = bgConfig.image.getBounds();
358375
int xOffset = (width - size.width) / 2;
@@ -413,7 +430,12 @@ private void createBackground(DialDevice dialDevice, int width, int height, int
413430
Image panelImage = new Image(getDisplay(), bgBounds.width, bgBounds.height);
414431

415432
GC dialGC = new GC(panelImage);
416-
Image g = UIPlugin.getDefault().getImage(UIPlugin.ICON_DIAL_BACKGROUND);
433+
Image g;
434+
if (m_isDarkMode) {
435+
g = UIPlugin.getDefault().getImage(UIPlugin.ICON_DIAL_BACKGROUND_DARK);
436+
} else {
437+
g = UIPlugin.getDefault().getImage(UIPlugin.ICON_DIAL_BACKGROUND);
438+
}
417439
for (int i = 0; i < panelImage.getBounds().width; i += g.getBounds().width) {
418440
dialGC.drawImage(g, i, 0);
419441
}
@@ -456,8 +478,12 @@ private void drawDialText(GC gc, int xOffset, int YOffset, ImageDescription conf
456478
int x = config.dialTextCenter.x - textExtent.x / 2 + xOffset;
457479
int y = config.dialTextCenter.y - textExtent.y / 2 + YOffset;
458480

459-
// FIXME: Once we have dark background dials we should just use the default fg color...
460-
Color foreground = new Color(gc.getDevice(), 0, 0, 0);
481+
Color foreground;
482+
if (m_isDarkMode) {
483+
foreground = new Color(gc.getDevice(), 255, 255, 255);
484+
} else {
485+
foreground = new Color(gc.getDevice(), 0, 0, 0);
486+
}
461487
gc.setForeground(foreground);
462488

463489
gc.setAlpha(192);
@@ -506,5 +532,4 @@ private void drawUnNormalizedbackground(GC gc, DialDevice dialDevice, RGB startR
506532
color.dispose();
507533
}
508534
}
509-
510535
}

application/org.openjdk.jmc.ui/src/main/java/org/openjdk/jmc/ui/dial/MovingDial.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434

3535
import java.awt.Color;
3636

37+
import org.openjdk.jmc.ui.common.util.ThemeUtils;
3738
import org.openjdk.jmc.ui.dial.MovingDial.RK2Solver.DifferentialEquation;
3839

3940
/**
@@ -104,7 +105,7 @@ public MovingDial(String id, Color color) {
104105
}
105106

106107
public MovingDial(String id) {
107-
this(id, new Color(0, 0, 0));
108+
this(id, getDefaultDialColor());
108109
}
109110

110111
/**
@@ -374,6 +375,10 @@ private double currentTime() {
374375
return System.currentTimeMillis() / (1000.0) - m_timeOffset;
375376
}
376377

378+
private static Color getDefaultDialColor() {
379+
return ThemeUtils.isDarkTheme() ? new Color(255, 255, 255) : new Color(0, 0, 0);
380+
}
381+
377382
@Override
378383
public String getId() {
379384
return m_id;

0 commit comments

Comments
 (0)