Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorStephan Wahlbrink2021-08-02 09:30:38 +0000
committerStephan Wahlbrink2021-08-03 14:05:58 +0000
commit0d017d1f3a2d5278b94cc5b9c4d68d3d76caba76 (patch)
tree29a23d0b3713c9853e398369b608e0f9b70f5a9a
parent2382e768094ec0be798c99a175fe30966a734f45 (diff)
downloadorg.eclipse.statet-commons-0d017d1f3a2d5278b94cc5b9c4d68d3d76caba76.tar.gz
org.eclipse.statet-commons-0d017d1f3a2d5278b94cc5b9c4d68d3d76caba76.tar.xz
org.eclipse.statet-commons-0d017d1f3a2d5278b94cc5b9c4d68d3d76caba76.zip
Bug 575176: [UI-Viewer] Improve rendering of breadcrumb in dark theme
-rw-r--r--ecommons/org.eclipse.statet.ecommons.uimisc/src/org/eclipse/statet/ecommons/ui/viewers/breadcrumb/BreadcrumbItem.java4
-rw-r--r--ecommons/org.eclipse.statet.ecommons.uimisc/src/org/eclipse/statet/ecommons/ui/viewers/breadcrumb/BreadcrumbItemDetails.java145
-rw-r--r--ecommons/org.eclipse.statet.ecommons.uimisc/src/org/eclipse/statet/ecommons/ui/viewers/breadcrumb/BreadcrumbItemDropDown.java23
-rw-r--r--ecommons/org.eclipse.statet.ecommons.uimisc/src/org/eclipse/statet/ecommons/ui/viewers/breadcrumb/BreadcrumbViewer.java102
4 files changed, 110 insertions, 164 deletions
diff --git a/ecommons/org.eclipse.statet.ecommons.uimisc/src/org/eclipse/statet/ecommons/ui/viewers/breadcrumb/BreadcrumbItem.java b/ecommons/org.eclipse.statet.ecommons.uimisc/src/org/eclipse/statet/ecommons/ui/viewers/breadcrumb/BreadcrumbItem.java
index 09b45ec4..1929f76f 100644
--- a/ecommons/org.eclipse.statet.ecommons.uimisc/src/org/eclipse/statet/ecommons/ui/viewers/breadcrumb/BreadcrumbItem.java
+++ b/ecommons/org.eclipse.statet.ecommons.uimisc/src/org/eclipse/statet/ecommons/ui/viewers/breadcrumb/BreadcrumbItem.java
@@ -29,6 +29,8 @@ import org.eclipse.swt.widgets.Shell;
import org.eclipse.statet.jcommons.lang.NonNullByDefault;
import org.eclipse.statet.jcommons.lang.Nullable;
+import org.eclipse.statet.ecommons.ui.workbench.StylingUtils;
+
/**
* An item in a breadcrumb viewer.
@@ -76,6 +78,8 @@ class BreadcrumbItem extends Item {
layout.horizontalSpacing= 0;
this.container.setLayout(layout);
+ this.container.setData(StylingUtils.WIDGET_CSS_ID_KEY, "BreadcrumbItemComposite"); //$NON-NLS-1$
+
this.detailsBlock= new BreadcrumbItemDetails(this, this.container);
this.expandBlock= new BreadcrumbItemDropDown(this, this.container);
diff --git a/ecommons/org.eclipse.statet.ecommons.uimisc/src/org/eclipse/statet/ecommons/ui/viewers/breadcrumb/BreadcrumbItemDetails.java b/ecommons/org.eclipse.statet.ecommons.uimisc/src/org/eclipse/statet/ecommons/ui/viewers/breadcrumb/BreadcrumbItemDetails.java
index 4db7ee6e..8503fe66 100644
--- a/ecommons/org.eclipse.statet.ecommons.uimisc/src/org/eclipse/statet/ecommons/ui/viewers/breadcrumb/BreadcrumbItemDetails.java
+++ b/ecommons/org.eclipse.statet.ecommons.uimisc/src/org/eclipse/statet/ecommons/ui/viewers/breadcrumb/BreadcrumbItemDetails.java
@@ -43,6 +43,8 @@ import org.eclipse.statet.jcommons.lang.NonNull;
import org.eclipse.statet.jcommons.lang.NonNullByDefault;
import org.eclipse.statet.jcommons.lang.Nullable;
+import org.eclipse.statet.ecommons.ui.workbench.StylingUtils;
+
/**
* The label and icon part of the breadcrumb item.
@@ -69,72 +71,93 @@ class BreadcrumbItemDetails {
this.parent= parent;
this.textVisible= true;
- this.detailComposite= new Composite(parentContainer, SWT.NONE);
- this.detailComposite.setLayoutData(new GridData(SWT.BEGINNING, SWT.CENTER, false, false));
- GridLayout layout= new GridLayout(2, false);
- layout.marginHeight= 0;
- layout.marginWidth= 0;
- layout.horizontalSpacing= 0;
- this.detailComposite.setLayout(layout);
- addElementListener(this.detailComposite);
-
- this.imageComposite= new Composite(this.detailComposite, SWT.NONE);
- this.imageComposite.setLayoutData(new GridData(SWT.BEGINNING, SWT.CENTER, false, false));
- layout= new GridLayout(1, false);
- layout.marginHeight= 1;
- layout.marginWidth= 2;
- this.imageComposite.setLayout(layout);
- this.imageComposite.addPaintListener(new PaintListener() {
- @Override
- public void paintControl(final PaintEvent e) {
- if (BreadcrumbItemDetails.this.hasFocus && !isTextVisible()) {
- e.gc.drawFocus(e.x, e.y, e.width, e.height);
- }
- }
- });
- installFocusComposite(this.imageComposite);
- addElementListener(this.imageComposite);
-
- this.elementImage= new Label(this.imageComposite, SWT.NONE);
- GridData layoutData= new GridData(SWT.BEGINNING, SWT.CENTER, false, false);
- this.elementImage.setLayoutData(layoutData);
- addElementListener(this.elementImage);
-
- this.textComposite= new Composite(this.detailComposite, SWT.NONE);
- this.textComposite.setLayoutData(new GridData(SWT.BEGINNING, SWT.CENTER, false, false));
- layout= new GridLayout(1, false);
- layout.marginHeight= 2;
- layout.marginWidth= 2;
- this.textComposite.setLayout(layout);
- addElementListener(this.textComposite);
- this.textComposite.addPaintListener(new PaintListener() {
- @Override
- public void paintControl(final PaintEvent e) {
- if (BreadcrumbItemDetails.this.hasFocus && isTextVisible()) {
- e.gc.drawFocus(e.x, e.y, e.width, e.height);
- }
- }
- });
- installFocusComposite(this.textComposite);
- addElementListener(this.textComposite);
-
- this.elementText= new Label(this.textComposite, SWT.NONE);
- layoutData= new GridData(SWT.BEGINNING, SWT.CENTER, false, false);
- this.elementText.setLayoutData(layoutData);
- addElementListener(this.elementText);
+ { final var detailComposite= new Composite(parentContainer, SWT.NONE);
+ final var layout= new GridLayout(2, false);
+ layout.marginHeight= 0;
+ layout.marginWidth= 0;
+ layout.horizontalSpacing= 0;
+ detailComposite.setLayout(layout);
+
+ detailComposite.setData(StylingUtils.WIDGET_CSS_ID_KEY, "BreadcrumbItemDetailComposite"); //$NON-NLS-1$
+
+ addElementListener(detailComposite);
+
+ detailComposite.setLayoutData(new GridData(SWT.BEGINNING, SWT.CENTER, false, false));
+ this.detailComposite= detailComposite;
+ }
- this.textComposite.getAccessible().addAccessibleListener(new AccessibleAdapter() {
- @Override
- public void getName(final AccessibleEvent e) {
- e.result= BreadcrumbItemDetails.this.elementText.getText();
- }
- });
- this.imageComposite.getAccessible().addAccessibleListener(new AccessibleAdapter() {
+ final var accessibleListener= new AccessibleAdapter() {
@Override
public void getName(final AccessibleEvent e) {
e.result= BreadcrumbItemDetails.this.elementText.getText();
}
- });
+ };
+ { // Image
+ final var composite= new Composite(this.detailComposite, SWT.NONE);
+ final var layout= new GridLayout(1, false);
+ layout.marginHeight= 1;
+ layout.marginWidth= 2;
+ composite.setLayout(layout);
+
+ composite.setData(StylingUtils.WIDGET_CSS_ID_KEY, "BreadcrumbItemDetailImageComposite"); //$NON-NLS-1$
+ composite.addPaintListener(new PaintListener() {
+ @Override
+ public void paintControl(final PaintEvent e) {
+ if (BreadcrumbItemDetails.this.hasFocus && !isTextVisible()) {
+ e.gc.drawFocus(e.x, e.y, e.width, e.height);
+ }
+ }
+ });
+
+ installFocusComposite(composite);
+ addElementListener(composite);
+
+ composite.setLayoutData(new GridData(SWT.BEGINNING, SWT.CENTER, false, false));
+ this.imageComposite= composite;
+
+ final var label= new Label(composite, SWT.NONE);
+
+ label.setData(StylingUtils.WIDGET_CSS_ID_KEY, "BreadcrumbItemDetailImageLabel"); //$NON-NLS-1$
+
+ label.getAccessible().addAccessibleListener(accessibleListener);
+ addElementListener(label);
+
+ label.setLayoutData(new GridData(SWT.BEGINNING, SWT.CENTER, false, false));
+ this.elementImage= label;
+ }
+ { // Text
+ final var composite= new Composite(this.detailComposite, SWT.NONE);
+ final var layout= new GridLayout(1, false);
+ layout.marginHeight= 2;
+ layout.marginWidth= 2;
+ composite.setLayout(layout);
+
+ composite.setData(StylingUtils.WIDGET_CSS_ID_KEY, "BreadcrumbItemDetailTextComposite"); //$NON-NLS-1$
+ composite.addPaintListener(new PaintListener() {
+ @Override
+ public void paintControl(final PaintEvent e) {
+ if (BreadcrumbItemDetails.this.hasFocus && isTextVisible()) {
+ e.gc.drawFocus(e.x, e.y, e.width, e.height);
+ }
+ }
+ });
+
+ installFocusComposite(composite);
+ addElementListener(composite);
+
+ composite.setLayoutData(new GridData(SWT.BEGINNING, SWT.CENTER, false, false));
+ this.textComposite= composite;
+
+ final var label= new Label(composite, SWT.NONE);
+
+ label.setData(StylingUtils.WIDGET_CSS_ID_KEY, "BreadcrumbItemDetailTextLabel"); //$NON-NLS-1$
+
+ label.getAccessible().addAccessibleListener(accessibleListener);
+ addElementListener(label);
+
+ label.setLayoutData(new GridData(SWT.BEGINNING, SWT.CENTER, false, false));
+ this.elementText= label;
+ }
this.detailComposite.setTabList(new @NonNull Control[] { this.textComposite });
}
diff --git a/ecommons/org.eclipse.statet.ecommons.uimisc/src/org/eclipse/statet/ecommons/ui/viewers/breadcrumb/BreadcrumbItemDropDown.java b/ecommons/org.eclipse.statet.ecommons.uimisc/src/org/eclipse/statet/ecommons/ui/viewers/breadcrumb/BreadcrumbItemDropDown.java
index 0c6ba0ac..aff4838e 100644
--- a/ecommons/org.eclipse.statet.ecommons.uimisc/src/org/eclipse/statet/ecommons/ui/viewers/breadcrumb/BreadcrumbItemDropDown.java
+++ b/ecommons/org.eclipse.statet.ecommons.uimisc/src/org/eclipse/statet/ecommons/ui/viewers/breadcrumb/BreadcrumbItemDropDown.java
@@ -68,6 +68,7 @@ import org.eclipse.statet.jcommons.lang.NonNullByDefault;
import org.eclipse.statet.jcommons.lang.Nullable;
import org.eclipse.statet.ecommons.ui.swt.AccessibleArrowImage;
+import org.eclipse.statet.ecommons.ui.workbench.StylingUtils;
/**
@@ -104,14 +105,20 @@ class BreadcrumbItemDropDown {
this.isMenuShown= false;
this.isEnabled= true;
- this.toolBar= new ToolBar(composite, SWT.FLAT);
- this.toolBar.setLayoutData(new GridData(SWT.END, SWT.CENTER, false, false));
- this.toolBar.getAccessible().addAccessibleListener(new AccessibleAdapter() {
- @Override
- public void getName(final AccessibleEvent e) {
- e.result= BreadcrumbMessages.BreadcrumbItemDropDown_showDropDownMenu_action_tooltip;
- }
- });
+ { final var toolBar= new ToolBar(composite, SWT.FLAT);
+
+ toolBar.setData(StylingUtils.WIDGET_CSS_ID_KEY, "BreadcrumbItemDropDownToolBar"); //$NON-NLS-1$
+
+ toolBar.getAccessible().addAccessibleListener(new AccessibleAdapter() {
+ @Override
+ public void getName(final AccessibleEvent e) {
+ e.result= BreadcrumbMessages.BreadcrumbItemDropDown_showDropDownMenu_action_tooltip;
+ }
+ });
+
+ toolBar.setLayoutData(new GridData(SWT.END, SWT.CENTER, false, false));
+ this.toolBar= toolBar;
+ }
final ToolBarManager manager= new ToolBarManager(this.toolBar);
final Action showDropDownMenuAction= new Action(null, SWT.NONE) {
diff --git a/ecommons/org.eclipse.statet.ecommons.uimisc/src/org/eclipse/statet/ecommons/ui/viewers/breadcrumb/BreadcrumbViewer.java b/ecommons/org.eclipse.statet.ecommons.uimisc/src/org/eclipse/statet/ecommons/ui/viewers/breadcrumb/BreadcrumbViewer.java
index f39245d8..bf5beaec 100644
--- a/ecommons/org.eclipse.statet.ecommons.uimisc/src/org/eclipse/statet/ecommons/ui/viewers/breadcrumb/BreadcrumbViewer.java
+++ b/ecommons/org.eclipse.statet.ecommons.uimisc/src/org/eclipse/statet/ecommons/ui/viewers/breadcrumb/BreadcrumbViewer.java
@@ -40,14 +40,10 @@ import org.eclipse.swt.events.MenuDetectEvent;
import org.eclipse.swt.events.MenuDetectListener;
import org.eclipse.swt.events.TraverseEvent;
import org.eclipse.swt.events.TraverseListener;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.GC;
-import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Shell;
@@ -60,7 +56,7 @@ import org.eclipse.statet.jcommons.lang.NonNull;
import org.eclipse.statet.jcommons.lang.NonNullByDefault;
import org.eclipse.statet.jcommons.lang.Nullable;
-import org.eclipse.statet.ecommons.ui.swt.ColorUtils;
+import org.eclipse.statet.ecommons.ui.workbench.StylingUtils;
/**
@@ -87,7 +83,6 @@ public abstract class BreadcrumbViewer extends StructuredViewer {
private final Composite container;
- private @Nullable Image gradientBackground;
private @Nullable BreadcrumbItem selectedItem;
private @Nullable ILabelProvider toolTipLabelProvider;
@@ -110,30 +105,23 @@ public abstract class BreadcrumbViewer extends StructuredViewer {
*/
public BreadcrumbViewer(final Composite parent, final int style) {
this.container= new Composite(parent, SWT.NONE);
- final GridData layoutData= new GridData(SWT.FILL, SWT.TOP, true, false);
- this.container.setLayoutData(layoutData);
+ this.container.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false));
+
+ this.container.setBackgroundMode(SWT.INHERIT_DEFAULT);
+ this.container.setData(StylingUtils.WIDGET_CSS_ID_KEY, "BreadcrumbComposite"); //$NON-NLS-1$
+
this.container.addTraverseListener(new TraverseListener() {
@Override
public void keyTraversed(final TraverseEvent e) {
e.doit= true;
}
});
- this.container.setBackgroundMode(SWT.INHERIT_DEFAULT);
-
- this.container.addListener(SWT.Resize, new Listener() {
- @Override
- public void handleEvent(final Event event) {
- updateBackground();
- }
- });
-
hookControl(this.container);
int columns= 1000;
if ((SWT.VERTICAL & style) != 0) {
columns= 1;
}
-
final GridLayout gridLayout= new GridLayout(columns, false);
gridLayout.marginWidth= 0;
gridLayout.marginHeight= 0;
@@ -151,11 +139,6 @@ public abstract class BreadcrumbViewer extends StructuredViewer {
@Override
protected void handleDispose(final DisposeEvent event) {
- if (this.gradientBackground != null && !this.gradientBackground.isDisposed()) {
- this.gradientBackground.dispose();
- this.gradientBackground= null;
- }
-
{ final var toolTipLabelProvider= this.toolTipLabelProvider;
if (toolTipLabelProvider != null) {
this.toolTipLabelProvider= null;
@@ -168,6 +151,7 @@ public abstract class BreadcrumbViewer extends StructuredViewer {
final BreadcrumbItem indexItem= this.breadcrumbItems.get(index);
indexItem.dispose();
}
+ this.breadcrumbItems.clear();
super.handleDispose(event);
}
@@ -781,78 +765,6 @@ public abstract class BreadcrumbViewer extends StructuredViewer {
this.container.setRedraw(false);
}
- private void updateBackground() {
- final int height= this.container.getClientArea().height;
-
- final var currentBackground= this.gradientBackground;
- if (currentBackground == null || currentBackground.getBounds().height != height) {
- final Image newBackground= (height > 0) ?
- createGradientImage(height, this.container.getDisplay()) :
- null;
- this.container.setBackgroundImage(newBackground);
-
- if (currentBackground != null) {
- currentBackground.dispose();
- }
- this.gradientBackground= newBackground;
- }
- }
-
- /**
- * The image to use for the breadcrumb background as specified in
- * https://bugs.eclipse.org/bugs/show_bug.cgi?id=221477
- *
- * @param height the height of the image to create
- * @param display the current display
- * @return the image for the breadcrumb background
- */
- private Image createGradientImage(final int height, final Display display) {
- final int width= 50;
-
- final Image result= new Image(display, width, height);
-
- final GC gc= new GC(result);
-
- final Color colorC= createColor(SWT.COLOR_WIDGET_BACKGROUND, SWT.COLOR_LIST_BACKGROUND, 0.35f, display);
- final Color colorD= createColor(SWT.COLOR_WIDGET_BACKGROUND, SWT.COLOR_LIST_BACKGROUND, 0.45f, display);
- final Color colorE= createColor(SWT.COLOR_WIDGET_BACKGROUND, SWT.COLOR_LIST_BACKGROUND, 0.80f, display);
- final Color colorF= createColor(SWT.COLOR_WIDGET_BACKGROUND, SWT.COLOR_LIST_BACKGROUND, 0.70f, display);
- final Color colorG= createColor(SWT.COLOR_WIDGET_BACKGROUND, SWT.COLOR_WHITE, 0.45f, display);
- final Color colorH= createColor(SWT.COLOR_WIDGET_NORMAL_SHADOW, SWT.COLOR_LIST_BACKGROUND, 0.35f, display);
-
- try {
- drawLine(width, 0, colorC, gc);
- drawLine(width, 1, colorC, gc);
-
- gc.setForeground(colorD);
- gc.setBackground(colorE);
- gc.fillGradientRectangle(0, 2, width, 2 + 8, true);
-
- gc.setBackground(colorE);
- gc.fillRectangle(0, 2 + 9, width, height - 4);
-
- drawLine(width, height - 3, colorF, gc);
- drawLine(width, height - 2, colorG, gc);
- drawLine(width, height - 1, colorH, gc);
-
- }
- finally {
- gc.dispose();
- }
-
- return result;
- }
-
- private void drawLine(final int width, final int position, final Color color, final GC gc) {
- gc.setForeground(color);
- gc.drawLine(0, position, width, position);
- }
-
- private Color createColor(final int color1, final int color2, final float ratio,
- final Display display) {
- return ColorUtils.blend(display.getSystemColor(color2), display.getSystemColor(color1), ratio);
- }
-
/**
* Configure the given drop down viewer. The given input is used for the viewers input. Clients

Back to the top