Skip to content

Commit 4c9d7fe

Browse files
tferrctrueden
andcommitted
Update JDatePicker and fix DateWidget not adapting dark theme
JDatePicker 2.0.2 is compiled for java 17 and won't work for Java 8. Therefore, this commit updates the minimum Java version to 17, and fixes backwards-incompatible behavior of the OpenJDK 17 compiler. Co-Authored-By: Curtis Rueden <ctrueden@wisc.edu>
1 parent d2b9bb5 commit 4c9d7fe

4 files changed

Lines changed: 48 additions & 10 deletions

File tree

‎.github/workflows/build.yml‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ jobs:
1919
- name: Set up Java
2020
uses: actions/setup-java@v5
2121
with:
22-
java-version: '8'
22+
java-version: '17'
2323
distribution: 'zulu'
2424
cache: 'maven'
2525
- name: Set up CI environment

‎pom.xml‎

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@
102102
</ciManagement>
103103

104104
<properties>
105-
<scijava.jvm.version>8</scijava.jvm.version>
105+
<scijava.jvm.version>17</scijava.jvm.version>
106106
<package-name>org.scijava.ui.swing</package-name>
107107
<license.licenseName>bsd_2</license.licenseName>
108108
<license.copyrightOwners>SciJava developers.</license.copyrightOwners>
@@ -111,7 +111,7 @@
111111
<!-- NB: Deploy releases to the SciJava Maven repository. -->
112112
<releaseProfiles>sign,deploy-to-scijava</releaseProfiles>
113113

114-
<jdatepicker.version>1.3.2</jdatepicker.version>
114+
<jdatepicker.version>2.0.1</jdatepicker.version>
115115
<object-inspector.version>0.1</object-inspector.version>
116116

117117
<!-- TEMP: for Task#log(); drop once propagated to pom-scijava. -->
@@ -171,7 +171,7 @@
171171
<version>${object-inspector.version}</version>
172172
</dependency>
173173
<dependency>
174-
<groupId>net.sourceforge.jdatepicker</groupId>
174+
<groupId>org.jdatepicker</groupId>
175175
<artifactId>jdatepicker</artifactId>
176176
<version>${jdatepicker.version}</version>
177177
</dependency>

‎src/main/java/org/scijava/ui/swing/commands/WatchEventsFrame.java‎

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -397,7 +397,8 @@ private Iterable<DefaultMutableTreeNode> children(
397397
final DefaultMutableTreeNode node)
398398
{
399399
@SuppressWarnings("unchecked")
400-
final Enumeration<DefaultMutableTreeNode> en = node.children();
400+
final Enumeration<DefaultMutableTreeNode> en =
401+
(Enumeration<DefaultMutableTreeNode>) (Enumeration<?>) node.children();
401402
return new IteratorPlus<>(en);
402403
}
403404

‎src/main/java/org/scijava/ui/swing/widget/SwingDateWidget.java‎

Lines changed: 42 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -29,15 +29,18 @@
2929

3030
package org.scijava.ui.swing.widget;
3131

32+
import java.awt.Color;
3233
import java.awt.event.ActionEvent;
3334
import java.awt.event.ActionListener;
3435
import java.util.Date;
3536

3637
import javax.swing.JPanel;
38+
import javax.swing.UIManager;
3739

38-
import net.sourceforge.jdatepicker.impl.JDatePanelImpl;
39-
import net.sourceforge.jdatepicker.impl.JDatePickerImpl;
40-
import net.sourceforge.jdatepicker.impl.UtilDateModel;
40+
import org.jdatepicker.ComponentColorDefaults;
41+
import org.jdatepicker.ComponentColorDefaults.Key;
42+
import org.jdatepicker.JDatePicker;
43+
import org.jdatepicker.UtilDateModel;
4144

4245
import org.scijava.log.LogService;
4346
import org.scijava.plugin.Parameter;
@@ -75,15 +78,49 @@ public void set(final WidgetModel model) {
7578
super.set(model);
7679

7780
dateModel = new UtilDateModel();
78-
final JDatePickerImpl datePicker =
79-
new JDatePickerImpl(new JDatePanelImpl(dateModel), null);
81+
applyThemeColors();
82+
// NB: the picker must be built on our model, or user picks never reach it
83+
final JDatePicker datePicker = new JDatePicker(dateModel);
8084
setToolTip(datePicker);
8185
getComponent().add(datePicker);
8286
datePicker.addActionListener(this);
8387

8488
refreshWidget();
8589
}
8690

91+
// -- Helper methods --
92+
93+
/**
94+
* Maps the picker colors to the current look and feel. Note that
95+
* {@link ComponentColorDefaults} is a global singleton read when a picker
96+
* is created, so existing pickers keep their colors on a theme change
97+
*/
98+
private static void applyThemeColors() {
99+
setColor(Key.BG_MONTH_SELECTOR, "TableHeader.background");
100+
setColor(Key.FG_MONTH_SELECTOR, "TableHeader.foreground");
101+
setColor(Key.BG_GRID_HEADER, "TableHeader.background");
102+
setColor(Key.FG_GRID_HEADER, "TableHeader.foreground");
103+
setColor(Key.BG_GRID, "Table.background");
104+
setColor(Key.BG_GRID_NOT_SELECTABLE, "Panel.background");
105+
setColor(Key.FG_GRID_THIS_MONTH, "Table.foreground");
106+
setColor(Key.FG_GRID_OTHER_MONTH, "Label.disabledForeground");
107+
setColor(Key.FG_GRID_TODAY, "Component.accentColor");
108+
setColor(Key.FG_GRID_SELECTED, "Table.selectionForeground");
109+
setColor(Key.BG_GRID_SELECTED, "Table.selectionBackground");
110+
setColor(Key.FG_GRID_TODAY_SELECTED, "Table.selectionForeground");
111+
setColor(Key.BG_GRID_TODAY_SELECTED, "Table.selectionBackground");
112+
setColor(Key.BG_TODAY_SELECTOR, "Panel.background");
113+
setColor(Key.FG_TODAY_SELECTOR_ENABLED, "Label.foreground");
114+
setColor(Key.FG_TODAY_SELECTOR_DISABLED, "Label.disabledForeground");
115+
setColor(Key.POPUP_BORDER, "Component.borderColor");
116+
}
117+
118+
/** Sets a picker color from a UIManager key, if the key is defined */
119+
private static void setColor(final Key key, final String uiKey) {
120+
final Color color = UIManager.getColor(uiKey);
121+
if (color != null) ComponentColorDefaults.getInstance().setColor(key, color);
122+
}
123+
87124
// -- Typed methods --
88125

89126
@Override

0 commit comments

Comments
 (0)