Skip to content

Commit ae04fe3

Browse files
committed
Style workspace selection dialog with default theme setting
1 parent bff29fd commit ae04fe3

File tree

2 files changed

+58
-1
lines changed

2 files changed

+58
-1
lines changed

bundles/org.eclipse.ui.ide.application/META-INF/MANIFEST.MF

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,8 @@ Require-Bundle: org.eclipse.ui.ide;bundle-version="[3.21.0,4.0.0)",
1919
org.eclipse.e4.core.services;bundle-version="2.4.0",
2020
org.eclipse.e4.core.contexts;bundle-version="[1.12.0,2.0.0)",
2121
org.eclipse.urischeme;bundle-version="[1.3.0,2.0.0)",
22-
org.eclipse.e4.ui.di
22+
org.eclipse.e4.ui.di,
23+
org.eclipse.ui.forms
2324
Export-Package: org.eclipse.ui.internal.ide.application;x-internal:=true,
2425
org.eclipse.ui.internal.ide.application.addons;x-internal:=true,
2526
org.eclipse.ui.internal.ide.application.dialogs;x-internal:=true

bundles/org.eclipse.ui.ide.application/src/org/eclipse/ui/internal/ide/application/IDEApplication.java

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@
4242
import org.eclipse.core.runtime.Status;
4343
import org.eclipse.core.runtime.jobs.Job;
4444
import org.eclipse.core.runtime.preferences.ConfigurationScope;
45+
import org.eclipse.core.runtime.preferences.IEclipsePreferences;
4546
import org.eclipse.equinox.app.IApplication;
4647
import org.eclipse.equinox.app.IApplicationContext;
4748
import org.eclipse.jface.dialogs.IDialogConstants;
@@ -53,7 +54,9 @@
5354
import org.eclipse.osgi.util.NLS;
5455
import org.eclipse.swt.SWT;
5556
import org.eclipse.swt.layout.FillLayout;
57+
import org.eclipse.swt.graphics.Color;
5658
import org.eclipse.swt.widgets.Composite;
59+
import org.eclipse.ui.forms.widgets.ExpandableComposite;
5760
import org.eclipse.swt.widgets.Control;
5861
import org.eclipse.swt.widgets.Display;
5962
import org.eclipse.swt.widgets.Label;
@@ -94,6 +97,8 @@ public class IDEApplication implements IApplication, IExecutableExtension {
9497

9598
private static final String USER_NAME = "user.name"; //$NON-NLS-1$
9699

100+
private boolean isDarkTheme;
101+
97102
// Use the branding plug-in of the platform feature since this is most likely
98103
// to change on an update of the IDE.
99104
private static final String WORKSPACE_CHECK_REFERENCE_BUNDLE_NAME = "org.eclipse.platform"; //$NON-NLS-1$
@@ -145,6 +150,15 @@ public Object start(IApplicationContext appContext) throws Exception {
145150
Job.getJobManager().suspend();
146151

147152
Display display = createDisplay();
153+
154+
IEclipsePreferences configurationScopeNode = ConfigurationScope.INSTANCE
155+
.getNode("org.eclipse.e4.ui.css.swt.theme"); //$NON-NLS-1$
156+
String defaultThemeId = configurationScopeNode.get("themeid", null); //$NON-NLS-1$
157+
isDarkTheme = defaultThemeId != null && defaultThemeId.toLowerCase().contains("dark"); //$NON-NLS-1$
158+
if (isDarkTheme) {
159+
requestDarkWindowDecorations(display);
160+
}
161+
148162
// processor must be created before we start event loop
149163
DelayedEventsProcessor processor = new DelayedEventsProcessor(display);
150164

@@ -587,9 +601,51 @@ protected Shell getParentShell() {
587601
return null;
588602
}
589603

604+
@Override
605+
protected Control createContents(Composite parent) {
606+
Control contents = super.createContents(parent);
607+
if (isDarkTheme) {
608+
applyDarkColors(getShell());
609+
}
610+
return contents;
611+
}
590612
}.prompt(force);
591613
}
592614

615+
private static void requestDarkWindowDecorations(Display display) {
616+
// On GTK, request dark window decorations via the SWT internal API.
617+
// Use reflection to avoid a hard compile-time dependency on GTK internals.
618+
if ("gtk".equals(SWT.getPlatform())) { //$NON-NLS-1$
619+
try {
620+
Class.forName("org.eclipse.swt.internal.gtk.OS") //$NON-NLS-1$
621+
.getMethod("setDarkThemePreferred", boolean.class) //$NON-NLS-1$
622+
.invoke(null, true);
623+
} catch (ReflectiveOperationException e) {
624+
// GTK OS API unavailable — ignore
625+
}
626+
}
627+
}
628+
629+
private static void applyDarkColors(Shell shell) {
630+
// Colors matching org-eclipse-ui-workbench-DARK_BACKGROUND / DARK_FOREGROUND
631+
Color background = new Color(0x48, 0x48, 0x4c);
632+
Color foreground = new Color(0xee, 0xee, 0xee);
633+
applyColorsRecursively(shell, background, foreground);
634+
}
635+
636+
private static void applyColorsRecursively(Control control, Color background, Color foreground) {
637+
control.setBackground(background);
638+
control.setForeground(foreground);
639+
if (control instanceof ExpandableComposite expandable) {
640+
expandable.setTitleBarForeground(foreground);
641+
}
642+
if (control instanceof Composite composite) {
643+
for (Control child : composite.getChildren()) {
644+
applyColorsRecursively(child, background, foreground);
645+
}
646+
}
647+
}
648+
593649
/**
594650
* Result of the {@link IDEApplication#checkValidWorkspace(Shell, URL)}
595651
* operation

0 commit comments

Comments
 (0)