diff options
| author | Stephan Wahlbrink | 2021-08-02 09:30:38 +0000 |
|---|---|---|
| committer | Stephan Wahlbrink | 2021-08-03 14:05:58 +0000 |
| commit | 0d017d1f3a2d5278b94cc5b9c4d68d3d76caba76 (patch) | |
| tree | 29a23d0b3713c9853e398369b608e0f9b70f5a9a | |
| parent | 2382e768094ec0be798c99a175fe30966a734f45 (diff) | |
| download | org.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
Change-Id: I08c0fae7b7778b5a308778dd75618cda23f95ebb
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 |
