Repository navigation
Expand file tree
/
Copy pathThemeManager.java
More file actions
252 lines (223 loc) · 8.66 KB
/
Copy pathThemeManager.java
File metadata and controls
252 lines (223 loc) · 8.66 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
package com.simulator;
import atlantafx.base.theme.*;
import javafx.application.Application;
import javafx.scene.Scene;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class ThemeManager {
private static ThemeManager instance;
private volatile boolean isDarkMode = false;
private volatile String currentTheme = "PrimerLight";
private final List<Scene> registeredScenes = Collections.synchronizedList(new ArrayList<>());
public enum ThemeType {
PRIMER_LIGHT("Primer Light", PrimerLight.class),
PRIMER_DARK("Primer Dark", PrimerDark.class),
NORD_LIGHT("Nord Light", NordLight.class),
NORD_DARK("Nord Dark", NordDark.class),
CUPERTINO_LIGHT("Cupertino Light", CupertinoLight.class),
CUPERTINO_DARK("Cupertino Dark", CupertinoDark.class);
private final String displayName;
private final Class<? extends Theme> themeClass;
ThemeType(String displayName, Class<? extends Theme> themeClass) {
this.displayName = displayName;
this.themeClass = themeClass;
}
public String getDisplayName() { return displayName; }
public Class<? extends Theme> getThemeClass() { return themeClass; }
}
private ThemeManager() {}
public static synchronized ThemeManager getInstance() {
if (instance == null) {
instance = new ThemeManager();
}
return instance;
}
/**
* Register a scene for theme updates
*/
public void registerScene(Scene scene) {
if (scene != null && !registeredScenes.contains(scene)) {
registeredScenes.add(scene);
// Apply current theme to newly registered scene
updateScene(scene);
System.out.println("✅ Scene registered with ThemeManager (Total: " + registeredScenes.size() + ")");
}
}
/**
* Unregister a scene (important for memory management)
*/
public void unregisterScene(Scene scene) {
if (scene != null && registeredScenes.remove(scene)) {
System.out.println("🗑️ Scene unregistered from ThemeManager (Remaining: " + registeredScenes.size() + ")");
}
}
/**
* Clear all registered scenes
*/
public void clearAllScenes() {
int count = registeredScenes.size();
registeredScenes.clear();
System.out.println("🧹 Cleared " + count + " scenes from ThemeManager");
}
/**
* Get number of registered scenes
*/
public int getRegisteredSceneCount() {
return registeredScenes.size();
}
/**
* Update all registered scenes when theme changes
*/
private void updateAllRegisteredScenes() {
if (!registeredScenes.isEmpty()) {
System.out.println("🔄 Updating " + registeredScenes.size() + " registered scenes...");
// Create a copy to avoid concurrent modification
List<Scene> scenesToUpdate = new ArrayList<>(registeredScenes);
for (Scene scene : scenesToUpdate) {
updateScene(scene);
}
System.out.println("✅ All scenes updated successfully");
}
}
/**
* Update individual scene styling
*/
private void updateScene(Scene scene) {
try {
if (scene != null && scene.getRoot() != null) {
String themeClass = isDarkMode ? "dark-theme" : "light-theme";
scene.getRoot().getStyleClass().removeAll("light-theme", "dark-theme");
scene.getRoot().getStyleClass().add(themeClass);
System.out.println("🎨 Scene updated with theme class: " + themeClass);
}
} catch (Exception e) {
System.err.println("❌ Error updating scene theme: " + e.getMessage());
}
}
public void setDefaultTheme() {
try {
Application.setUserAgentStylesheet(new PrimerLight().getUserAgentStylesheet());
currentTheme = "PrimerLight";
isDarkMode = false;
updateAllRegisteredScenes();
System.out.println("🌟 Default theme applied: " + currentTheme);
} catch (Exception e) {
System.err.println("❌ Failed to load default theme: " + e.getMessage());
fallbackToDefault();
}
}
public void toggleTheme() {
String previousTheme = currentTheme;
boolean wasDarkMode = isDarkMode;
try {
if (isDarkMode) {
setLightTheme();
} else {
setDarkTheme();
}
System.out.println("🎨 Theme toggled: " + previousTheme + " (" +
(wasDarkMode ? "Dark" : "Light") + ") → " + currentTheme + " (" +
(isDarkMode ? "Dark" : "Light") + ")");
} catch (Exception e) {
System.err.println("❌ Error toggling theme: " + e.getMessage());
fallbackToDefault();
}
}
public void setLightTheme() {
try {
Application.setUserAgentStylesheet(new PrimerLight().getUserAgentStylesheet());
currentTheme = "PrimerLight";
isDarkMode = false;
updateAllRegisteredScenes();
System.out.println("☀️ Light theme applied: " + currentTheme);
} catch (Exception e) {
System.err.println("❌ Failed to load light theme: " + e.getMessage());
fallbackToDefault();
}
}
public void setDarkTheme() {
try {
Application.setUserAgentStylesheet(new PrimerDark().getUserAgentStylesheet());
currentTheme = "PrimerDark";
isDarkMode = true;
updateAllRegisteredScenes();
System.out.println("🌙 Dark theme applied: " + currentTheme);
} catch (Exception e) {
System.err.println("❌ Failed to load dark theme: " + e.getMessage());
fallbackToDefault();
}
}
public void setTheme(ThemeType themeType) {
try {
Theme theme = themeType.getThemeClass().getDeclaredConstructor().newInstance();
Application.setUserAgentStylesheet(theme.getUserAgentStylesheet());
currentTheme = themeType.name();
isDarkMode = themeType.name().contains("DARK");
updateAllRegisteredScenes();
System.out.println("🎨 Custom theme applied: " + themeType.getDisplayName());
} catch (Exception e) {
System.err.println("❌ Failed to load theme " + themeType.getDisplayName() + ": " + e.getMessage());
fallbackToDefault();
}
}
public boolean isDarkMode() {
return isDarkMode;
}
public String getCurrentTheme() {
return currentTheme;
}
public ThemeType[] getAvailableThemes() {
return ThemeType.values();
}
/**
* Get current theme type enum
*/
public ThemeType getCurrentThemeType() {
for (ThemeType type : ThemeType.values()) {
if (type.name().equals(currentTheme)) {
return type;
}
}
return isDarkMode ? ThemeType.PRIMER_DARK : ThemeType.PRIMER_LIGHT;
}
/**
* Check if a specific theme is available
*/
public boolean isThemeAvailable(String themeName) {
for (ThemeType type : ThemeType.values()) {
if (type.name().equalsIgnoreCase(themeName) ||
type.getDisplayName().equalsIgnoreCase(themeName)) {
return true;
}
}
return false;
}
private void fallbackToDefault() {
try {
Application.setUserAgentStylesheet(Application.STYLESHEET_MODENA);
currentTheme = "Modena (Fallback)";
isDarkMode = false;
updateAllRegisteredScenes();
System.out.println("🔧 Switched to fallback theme: " + currentTheme);
} catch (Exception e) {
System.err.println("❌ Critical error: Even fallback theme failed: " + e.getMessage());
}
}
/**
* Reset theme manager to initial state
*/
public void reset() {
clearAllScenes();
setDefaultTheme();
System.out.println("🔄 ThemeManager reset to default state");
}
@Override
public String toString() {
return "ThemeManager{" +
"currentTheme='" + currentTheme + '\'' +
", isDarkMode=" + isDarkMode +
", registeredScenes=" + registeredScenes.size() +
'}';
}
}