Skip to content

Commit 9388e35

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

File tree

5 files changed

+64
-2
lines changed

5 files changed

+64
-2
lines changed

bundles/org.eclipse.e4.ui.workbench.swt/META-INF/MANIFEST.MF

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,8 @@ Export-Package: org.eclipse.e4.ui.internal.workbench.swt;
3939
x-friends:="org.eclipse.e4.ui.workbench.addons.swt,
4040
org.eclipse.e4.ui.workbench.renderers.swt,
4141
org.eclipse.ui.workbench,
42-
org.eclipse.e4.ui.bindings.tests",
42+
org.eclipse.e4.ui.bindings.tests,
43+
org.eclipse.ui.ide.application",
4344
org.eclipse.e4.ui.internal.workbench.swt.handlers;x-internal:=true,
4445
org.eclipse.e4.ui.workbench.swt,
4546
org.eclipse.e4.ui.workbench.swt.factories;x-friends:="org.eclipse.e4.ui.workbench.renderers.swt,org.eclipse.ui.workbench",

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

bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/ChooseWorkspaceDialog.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@
3939
import org.eclipse.jface.dialogs.IDialogConstants;
4040
import org.eclipse.jface.dialogs.IDialogSettings;
4141
import org.eclipse.jface.dialogs.TitleAreaDialog;
42+
import org.eclipse.jface.resource.JFaceColors;
4243
import org.eclipse.jface.util.Geometry;
4344
import org.eclipse.jface.window.Window;
4445
import org.eclipse.osgi.util.NLS;
@@ -319,6 +320,7 @@ private void createRecentWorkspacesComposite(final Composite composite) {
319320
recentWorkspacesForm.getBody().setLayout(new GridLayout());
320321
ExpandableComposite recentWorkspacesExpandable = toolkit.createExpandableComposite(recentWorkspacesForm.getBody(),
321322
ExpandableComposite.TWISTIE);
323+
recentWorkspacesExpandable.setTitleBarForeground(composite.getForeground());
322324
recentWorkspacesForm.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
323325
recentWorkspacesExpandable.setBackground(composite.getBackground());
324326
recentWorkspacesExpandable.setText(IDEWorkbenchMessages.ChooseWorkspaceDialog_recentWorkspaces);
@@ -352,6 +354,7 @@ public void expansionStateChanged(ExpansionEvent e) {
352354
final String recentWorkspace = uniqueWorkspaceEntry.getValue();
353355

354356
Link link = new Link(panel, SWT.WRAP);
357+
link.setForeground(JFaceColors.getHyperlink(composite.getDisplay()));
355358
link.setLayoutData(new RowData(SWT.DEFAULT, SWT.DEFAULT));
356359
link.setText("<a>" + uniqueWorkspaceEntry.getKey() + "</a>"); //$NON-NLS-1$ //$NON-NLS-2$
357360
link.setToolTipText(recentWorkspace);

bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/ide/ChooseWorkspaceWithSettingsDialog.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,7 @@ private void createSettingsControls(Composite workArea) {
128128

129129
copySettingsExpandable.setText(IDEWorkbenchMessages.ChooseWorkspaceWithSettingsDialog_SettingsGroupName);
130130
copySettingsExpandable.setBackground(workArea.getBackground());
131+
copySettingsExpandable.setTitleBarForeground(workArea.getForeground());
131132
copySettingsExpandable.setLayout(new GridLayout());
132133
copySettingsExpandable.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
133134
copySettingsExpandable.addExpansionListener(new IExpansionListener() {

0 commit comments

Comments
 (0)