Skip to content

Commit ce674f9

Browse files
authored
Merge pull request #362 from bls337/main
make ComboBox generic to improve enum serialization
2 parents c17f1e1 + 146aa24 commit ce674f9

23 files changed

Lines changed: 207 additions & 322 deletions

‎src/main/java/org/micromanager/lightsheetmanager/LightSheetManagerPlugin.java‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ public class LightSheetManagerPlugin implements MenuPlugin, SciJavaPlugin {
1212
public static final String copyright = "Applied Scientific Instrumentation (ASI), 2022-2026";
1313
public static final String description = "A plugin to control various types of light sheet microscopes.";
1414
public static final String menuName = "Light Sheet Manager";
15-
public static final String version = "0.5.8";
15+
public static final String version = "0.5.9";
1616

1717
private Studio studio_;
1818
private LightSheetManager model_;

‎src/main/java/org/micromanager/lightsheetmanager/api/data/AcquisitionMode.java‎

Lines changed: 6 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,6 @@
66
import java.util.List;
77
import java.util.Map;
88
import java.util.Optional;
9-
import java.util.stream.Collectors;
10-
import java.util.stream.Stream;
119

1210
// To add a new AcquisitionMode:
1311
// 1) Add a new constant to the enum.
@@ -63,9 +61,6 @@ public enum AcquisitionMode {
6361
// Display text used in the UI
6462
private final String text_;
6563

66-
private static final Map<String, AcquisitionMode> STRING_TO_ENUM =
67-
Stream.of(values()).collect(Collectors.toMap(Object::toString, e -> e));
68-
6964
AcquisitionMode(final String text) {
7065
text_ = text;
7166
}
@@ -94,39 +89,13 @@ public boolean isStageScanMode() {
9489
* @param hasStageScanning {@code true} if stage scan hardware is available
9590
* @return a {@code List} of {@link AcquisitionMode} constants
9691
*/
97-
public static List<AcquisitionMode> getValidModes(final GeometryType geometry, final boolean hasStageScanning) {
92+
public static AcquisitionMode[] getValidModes(final GeometryType geometry, final boolean hasStageScanning) {
9893
return Optional.ofNullable(geometry)
99-
.map(MODES_BY_GEOMETRY::get) // returns null if geometry is not in map
100-
.orElse(Collections.emptyList())
101-
.stream()
102-
.filter(mode -> hasStageScanning || !mode.isStageScanMode())
103-
.collect(Collectors.toList());
104-
}
105-
106-
/**
107-
* Return an array of {@code String} labels for a dropdown menu.
108-
*
109-
* @param geometry the microscope {@link GeometryType}
110-
* @param hasStageScanning {@code true} if stage scan hardware is available
111-
* @return an array of strings
112-
*/
113-
public static String[] getLabels(final GeometryType geometry, final boolean hasStageScanning) {
114-
return getValidModes(geometry, hasStageScanning).stream()
115-
.map(AcquisitionMode::toString)
116-
.toArray(String[]::new);
94+
.map(MODES_BY_GEOMETRY::get) // returns null if geometry is not in map
95+
.orElse(Collections.emptyList())
96+
.stream()
97+
.filter(mode -> hasStageScanning || !mode.isStageScanMode())
98+
.toArray(AcquisitionMode[]::new);
11799
}
118100

119-
/**
120-
* Returns the {@link AcquisitionMode} associated with the string label.
121-
* <p>
122-
* If the provided string is {@code null} or does not match any known
123-
* acquisition mode, an empty {@link Optional} is returned.
124-
*
125-
* @param str the string label to convert (Example: "Stage scan")
126-
* @return an {@link Optional} containing the matching {@link AcquisitionMode},
127-
* or an empty {@code Optional} if no match is found.
128-
*/
129-
public static Optional<AcquisitionMode> fromString(final String str) {
130-
return Optional.ofNullable(str).map(STRING_TO_ENUM::get);
131-
}
132101
}

‎src/main/java/org/micromanager/lightsheetmanager/api/data/AutofocusMode.java‎

Lines changed: 0 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,5 @@
11
package org.micromanager.lightsheetmanager.api.data;
22

3-
import java.util.Arrays;
4-
import java.util.Map;
5-
import java.util.stream.Collectors;
6-
import java.util.stream.Stream;
7-
83
/**
94
* The autofocus mode for the general autofocus settings.
105
*/
@@ -14,23 +9,10 @@ public enum AutofocusMode {
149

1510
private final String name_;
1611

17-
private static final Map<String, AutofocusMode> stringToEnum =
18-
Stream.of(values()).collect(Collectors.toMap(Object::toString, e -> e));
19-
2012
AutofocusMode(final String name) {
2113
name_ = name;
2214
}
2315

24-
public static String[] toArray() {
25-
return Arrays.stream(values())
26-
.map(AutofocusMode::toString)
27-
.toArray(String[]::new);
28-
}
29-
30-
public static AutofocusMode fromString(final String symbol) {
31-
return stringToEnum.getOrDefault(symbol, AutofocusMode.FIXED_PIEZO_SWEEP_SLICE);
32-
}
33-
3416
@Override
3517
public String toString() {
3618
return name_;

‎src/main/java/org/micromanager/lightsheetmanager/api/data/AutofocusType.java‎

Lines changed: 0 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,5 @@
11
package org.micromanager.lightsheetmanager.api.data;
22

3-
import java.util.Arrays;
4-
import java.util.Map;
5-
import java.util.stream.Collectors;
6-
import java.util.stream.Stream;
7-
83
/**
94
* The type of scoring algorithm for the general autofocus settings.
105
*/
@@ -23,23 +18,10 @@ public enum AutofocusType {
2318

2419
private final String name_;
2520

26-
private static final Map<String, AutofocusType> stringToEnum =
27-
Stream.of(values()).collect(Collectors.toMap(Object::toString, e -> e));
28-
2921
AutofocusType(final String name) {
3022
name_ = name;
3123
}
3224

33-
public static String[] toArray() {
34-
return Arrays.stream(values())
35-
.map(AutofocusType::toString)
36-
.toArray(String[]::new);
37-
}
38-
39-
public static AutofocusType fromString(final String symbol) {
40-
return stringToEnum.getOrDefault(symbol, AutofocusType.EDGES);
41-
}
42-
4325
@Override
4426
public String toString() {
4527
return name_;

‎src/main/java/org/micromanager/lightsheetmanager/api/data/CameraLibrary.java‎

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,8 @@ public enum CameraLibrary {
1717

1818
private final String text_;
1919

20-
private static final Map<String, CameraLibrary> stringToEnum =
21-
Stream.of(values()).collect(Collectors.toMap(Object::toString, e -> e));
20+
private static final Map<String, CameraLibrary> STRING_TO_ENUM =
21+
Stream.of(values()).collect(Collectors.toUnmodifiableMap(Object::toString, e -> e));
2222

2323
CameraLibrary(final String text) {
2424
text_ = text;
@@ -30,6 +30,6 @@ public String toString() {
3030
}
3131

3232
public static CameraLibrary fromString(final String symbol) {
33-
return stringToEnum.getOrDefault(symbol, CameraLibrary.UNKNOWN);
33+
return STRING_TO_ENUM.getOrDefault(symbol, CameraLibrary.UNKNOWN);
3434
}
3535
}

‎src/main/java/org/micromanager/lightsheetmanager/api/data/CameraMode.java‎

Lines changed: 3 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ public enum CameraMode {
2424
private final String text_;
2525

2626
private static final Map<String, CameraMode> stringToEnum =
27-
Stream.of(values()).collect(Collectors.toMap(Object::toString, e -> e));
27+
Stream.of(values()).collect(Collectors.toUnmodifiableMap(Object::toString, e -> e));
2828

2929
CameraMode(final String text) {
3030
text_ = text;
@@ -34,15 +34,6 @@ public static CameraMode fromString(final String symbol) {
3434
return stringToEnum.getOrDefault(symbol, CameraMode.EDGE);
3535
}
3636

37-
/**
38-
* @return an array of Strings containing all possible camera trigger modes.
39-
*/
40-
public static String[] toArray() {
41-
return Arrays.stream(values())
42-
.map(CameraMode::toString)
43-
.toArray(String[]::new);
44-
}
45-
4637
/**
4738
* Does camera support overlap/synchronous mode?
4839
*
@@ -89,7 +80,7 @@ public static boolean isCameraValid(CameraLibrary camLib) {
8980
return camLib != CameraLibrary.UNKNOWN;
9081
}
9182

92-
public static String[] getAvailableModes(CameraLibrary camLib) {
83+
public static CameraMode[] getAvailableModes(CameraLibrary camLib) {
9384
ArrayList<CameraMode> modes = new ArrayList<>();
9485
if (isCameraValid(camLib)) {
9586
modes.add(CameraMode.EDGE);
@@ -108,7 +99,7 @@ public static String[] getAvailableModes(CameraLibrary camLib) {
10899
}
109100
return modes.stream()
110101
.map(CameraMode::toString)
111-
.toArray(String[]::new);
102+
.toArray(CameraMode[]::new);
112103
}
113104

114105
@Override
Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,15 @@
11
package org.micromanager.lightsheetmanager.api.data;
22

3-
import java.util.Map;
4-
import java.util.stream.Collectors;
5-
import java.util.stream.Stream;
3+
import java.util.Arrays;
64

75
public enum GeometryType {
86
UNKNOWN("Unknown"),
97
DISPIM("diSPIM"),
108
ISPIM("iSPIM"),
119
OSPIM("oSPIM"),
1210
MESOSPIM("mesoSPIM"),
13-
OPENSPIML("OpenSPIM-L"),
1411
SCAPE("SCAPE");
1512

16-
private static final Map<String, GeometryType> stringToEnum =
17-
Stream.of(values()).collect(Collectors.toMap(Object::toString, e -> e));
18-
1913
private final String label_;
2014

2115
GeometryType(final String label) {
@@ -27,7 +21,14 @@ public String toString() {
2721
return label_;
2822
}
2923

30-
public static GeometryType fromString(final String symbol) {
31-
return stringToEnum.getOrDefault(symbol, GeometryType.UNKNOWN);
24+
public static GeometryType fromString(final String propertyValue) {
25+
if (propertyValue == null || propertyValue.isEmpty()) {
26+
return UNKNOWN;
27+
}
28+
return Arrays.stream(values())
29+
.filter(g -> g.label_.equalsIgnoreCase(propertyValue))
30+
.findFirst()
31+
.orElse(UNKNOWN);
3232
}
33+
3334
}
Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,11 @@
11
package org.micromanager.lightsheetmanager.api.data;
22

3-
import java.util.Map;
4-
import java.util.stream.Collectors;
5-
import java.util.stream.Stream;
3+
import java.util.Arrays;
64

75
public enum LightSheetType {
8-
UNKNOWN("Unknown"),
96
STATIC("Static"),
107
SCANNED("Scanned");
118

12-
private static final Map<String, LightSheetType> stringToEnum =
13-
Stream.of(values()).collect(Collectors.toMap(Object::toString, e -> e));
14-
159
private final String label_;
1610

1711
LightSheetType(final String label) {
@@ -23,7 +17,14 @@ public String toString() {
2317
return label_;
2418
}
2519

26-
public static LightSheetType fromString(final String symbol) {
27-
return stringToEnum.getOrDefault(symbol, LightSheetType.UNKNOWN);
20+
public static LightSheetType fromString(final String propertyValue) {
21+
if (propertyValue == null || propertyValue.isEmpty()) {
22+
return STATIC;
23+
}
24+
return Arrays.stream(values())
25+
.filter(g -> g.label_.equalsIgnoreCase(propertyValue))
26+
.findFirst()
27+
.orElse(STATIC);
2828
}
29+
2930
}
Lines changed: 0 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,12 @@
11
package org.micromanager.lightsheetmanager.api.data;
22

3-
import java.util.Arrays;
4-
import java.util.Map;
5-
import java.util.Optional;
6-
import java.util.stream.Collectors;
7-
import java.util.stream.Stream;
8-
93
public enum MultiChannelMode {
104
VOLUME("Every Volume"),
115
VOLUME_HW("Every Volume (PLogic)"),
126
SLICE_HW("Every Slice (PLogic)");
137

148
private final String text_;
159

16-
private static final Map<String, MultiChannelMode> STRING_TO_ENUM =
17-
Stream.of(values()).collect(Collectors.toMap(Object::toString, e -> e));
18-
1910
MultiChannelMode(final String text) {
2011
text_ = text;
2112
}
@@ -25,18 +16,4 @@ public String toString() {
2516
return text_;
2617
}
2718

28-
public static MultiChannelMode getByIndex(final int index) {
29-
return values()[index];
30-
}
31-
32-
public static String[] toArray() {
33-
return Arrays.stream(values())
34-
.map(MultiChannelMode::toString)
35-
.toArray(String[]::new);
36-
}
37-
38-
public static Optional<MultiChannelMode> fromString(final String str) {
39-
return Optional.ofNullable(str).map(STRING_TO_ENUM::get);
40-
}
41-
4219
}

‎src/main/java/org/micromanager/lightsheetmanager/gui/components/ComboBox.java‎

Lines changed: 9 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -5,49 +5,22 @@
55
import java.awt.Dimension;
66
import java.util.Arrays;
77

8-
public class ComboBox extends JComboBox<String> {
8+
public class ComboBox<T> extends JComboBox<T> {
99

10-
private static int defaultWidth = 100;
11-
private static int defaultHeight = 20;
12-
13-
private String selected;
14-
private final String[] labels;
15-
16-
public ComboBox(final String[] labels, final String selected) {
17-
super(labels);
18-
this.labels = labels;
19-
this.selected = selected;
20-
init(defaultWidth, defaultHeight);
21-
}
22-
23-
public ComboBox(final String[] labels, final String selected, final int width, final int height) {
10+
public ComboBox(final T[] labels, final T selected, final int width, final int height) {
2411
super(labels);
25-
this.labels = labels;
26-
this.selected = selected;
27-
init(width, height);
28-
}
29-
30-
private void init(final int width, final int height) {
3112
setAbsoluteSize(width, height);
32-
setSelectedIndex(getIndex(selected));
13+
setSelectedItem(selected);
3314
setFocusable(false); // removes the focus highlight
3415
}
3516

36-
public static void setDefaultSize(final int width, final int height) {
37-
defaultWidth = width;
38-
defaultHeight = height;
39-
}
40-
41-
private int getIndex(final String label) {
42-
return Arrays.asList(labels).indexOf(label);
43-
}
44-
45-
public String getSelected() {
46-
return selected;
17+
@SuppressWarnings("unchecked")
18+
public T getSelected() {
19+
return (T) getSelectedItem();
4720
}
4821

49-
public void setSelected(final String label) {
50-
setSelectedIndex(getIndex(label));
22+
public void setSelected(final T item) {
23+
setSelectedItem(item);
5124
}
5225

5326
public void setAbsoluteSize(final int width, final int height) {
@@ -58,10 +31,7 @@ public void setAbsoluteSize(final int width, final int height) {
5831
}
5932

6033
public void registerListener(final Method method) {
61-
addActionListener(event -> {
62-
selected = (String)getSelectedItem();
63-
method.run(event);
64-
});
34+
addActionListener(method::run);
6535
}
6636

6737
}

0 commit comments

Comments
 (0)