From 1b826aa17ee018b2af4553ff36151e129abea6f9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christoph=20L=C3=A4ubrich?= Date: Fri, 22 Mar 2024 07:07:07 +0100 Subject: [PATCH 1/2] Fix the Slider#computeSize method to take the real height into account Currently the slider is displayed quite big compared to other SWT controls (e.g. labels) and even if one make the slider height smaller this does not really change much using the usual SWT layout managers. The reason for this is that the slider currently reports a minimum height of 40 instead of query the real selector height. This now reports the real height the control will be painted including a one pixel padding on top/bottom for antialiasing effects to be correctly shown. --- .../eclipse/nebula/widgets/opal/nebulaslider/NebulaSlider.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/widgets/nebulaslider/org.eclipse.nebula.widgets.nebulaslider/src/org/eclipse/nebula/widgets/opal/nebulaslider/NebulaSlider.java b/widgets/nebulaslider/org.eclipse.nebula.widgets.nebulaslider/src/org/eclipse/nebula/widgets/opal/nebulaslider/NebulaSlider.java index 0823a1fb0..fb80d3e01 100644 --- a/widgets/nebulaslider/org.eclipse.nebula.widgets.nebulaslider/src/org/eclipse/nebula/widgets/opal/nebulaslider/NebulaSlider.java +++ b/widgets/nebulaslider/org.eclipse.nebula.widgets.nebulaslider/src/org/eclipse/nebula/widgets/opal/nebulaslider/NebulaSlider.java @@ -342,7 +342,7 @@ public void addSelectionListener(final SelectionListener listener) { */ @Override public Point computeSize(final int wHint, final int hHint, final boolean changed) { - return new Point(Math.max(300, wHint), Math.max(40, hHint)); + return new Point(Math.max(300, wHint), renderer.getSelectorHeight() + 2); } /** From a713f7b15ba2669be2be0b1df64db2f07e78d69d Mon Sep 17 00:00:00 2001 From: Laurent CARON Date: Sun, 26 May 2024 17:00:48 +0200 Subject: [PATCH 2/2] Fix conflict I made a mistake while resolving the conflict --- .../opal/nebulaslider/NebulaSlider.java | 522 ------------------ 1 file changed, 522 deletions(-) diff --git a/widgets/nebulaslider/org.eclipse.nebula.widgets.nebulaslider/src/org/eclipse/nebula/widgets/opal/nebulaslider/NebulaSlider.java b/widgets/nebulaslider/org.eclipse.nebula.widgets.nebulaslider/src/org/eclipse/nebula/widgets/opal/nebulaslider/NebulaSlider.java index ce61d6c50..fb80d3e01 100644 --- a/widgets/nebulaslider/org.eclipse.nebula.widgets.nebulaslider/src/org/eclipse/nebula/widgets/opal/nebulaslider/NebulaSlider.java +++ b/widgets/nebulaslider/org.eclipse.nebula.widgets.nebulaslider/src/org/eclipse/nebula/widgets/opal/nebulaslider/NebulaSlider.java @@ -519,525 +519,3 @@ public void setRenderer(final NebulaSliderGraphicConfiguration renderer) { } } -======= -/******************************************************************************* - * Copyright (c) 2018-2024 Laurent CARON - * This program and the accompanying materials - * are made available under the terms of the Eclipse Public License 2.0 - * which accompanies this distribution, and is available at - * https://www.eclipse.org/legal/epl-2.0/ - * - * SPDX-License-Identifier: EPL-2.0 - * - * Contributors: Laurent CARON (laurent.caron at gmail dot com) - Initial - * implementation and API - *******************************************************************************/ -package org.eclipse.nebula.widgets.opal.nebulaslider; - -import java.util.function.IntFunction; - -import org.eclipse.nebula.widgets.opal.commons.SelectionListenerUtil; -import org.eclipse.swt.SWT; -import org.eclipse.swt.SWTException; -import org.eclipse.swt.events.SelectionEvent; -import org.eclipse.swt.events.SelectionListener; -import org.eclipse.swt.graphics.Color; -import org.eclipse.swt.graphics.GC; -import org.eclipse.swt.graphics.Point; -import org.eclipse.swt.graphics.Rectangle; -import org.eclipse.swt.widgets.Canvas; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Widget; - -/** - * Instances of this class are selectable user interface - * objects that represent a range of positive, numeric values. - * It is like an horizontal slider - *
- *
Styles:
- *
(None)
- *
Events:
- *
Selection
- *
- */ -public class NebulaSlider extends Canvas { - - private NebulaSliderGraphicConfiguration renderer; - - private int minimum; - private int maximum; - private int value; - private int xPosition; - private int mouseDeltaX; - - private boolean moving = false; - - private IntFunction format; - - private int movingValue; - - /** - * Constructs a new instance of this class given its parent and a style value - * describing its behavior and appearance. - *

- * The style value is either one of the style constants defined in class - * SWT which is applicable to instances of this class, or must be - * built by bitwise OR'ing together (that is, using the - * int "|" operator) two or more of those SWT style - * constants. The class description lists the style constants that are - * applicable to the class. Style bits are also inherited from superclasses. - *

- * - * @param parent a composite control which will be the parent of the new - * instance (cannot be null) - * @param style the style of control to construct - * - * @exception IllegalArgumentException - *
    - *
  • ERROR_NULL_ARGUMENT - if the parent is null
  • - *
- * @exception SWTException - *
    - *
  • ERROR_THREAD_INVALID_ACCESS - if not called from the - * thread that created the parent
  • - *
  • ERROR_INVALID_SUBCLASS - if this class is not an allowed - * subclass
  • - *
- * - * @see Widget#getStyle() - */ - public NebulaSlider(final Composite parent, final int style) { - super(parent, checkStyle(style) | SWT.DOUBLE_BUFFERED); - - renderer = new NebularSliderDefaultConfiguration(this); - - minimum = Integer.MIN_VALUE; - maximum = Integer.MAX_VALUE; - value = 0; - xPosition = -1; - - addPaintListener(e -> { - paintControl(e.gc); - }); - addMouseListeners(); - } - - private static int checkStyle(final int style) { - if ((style & SWT.BORDER) != 0) { - return style & ~SWT.BORDER; - } - return 0; - } - - private void paintControl(final GC gc) { - gc.setAdvanced(true); - gc.setAntialias(SWT.ON); - - if (xPosition < 0) { - // Compute xPosition - xPosition = computeXPosition(); - } - boolean enabled = isEnabled(); - drawBar(gc, enabled); - drawSelectionPart(gc, enabled); - drawSelector(gc, enabled); - } - - private void drawBar(final GC gc, boolean enabled) { - final Rectangle rect = getClientArea(); - gc.setForeground(getColor(renderer.getBarBorderColor(), enabled)); - gc.setBackground(getColor(renderer.getBarInsideColor(), enabled)); - - final int hMargin = renderer.getHorizontalMargin(); - final int selectorWidth = renderer.getSelectorWidth(); - final int barHeight = renderer.getBarHeight(); - - final int x = hMargin + selectorWidth / 2; - final int y = (rect.height - barHeight) / 2; - final int width = rect.width - hMargin * 2 - selectorWidth; - - gc.fillRoundRectangle(x, y, width, barHeight, barHeight, barHeight); - gc.drawRoundRectangle(x, y, width, barHeight, barHeight, barHeight); - } - - private void drawSelectionPart(final GC gc, boolean enabled) { - final Rectangle rect = getClientArea(); - gc.setForeground(getColor(renderer.getBarBorderColor(), enabled)); - gc.setBackground(getColor(renderer.getBarSelectionColor(), enabled)); - - final int barHeight = renderer.getBarHeight(); - - final int x = renderer.getHorizontalMargin() + renderer.getSelectorWidth() / 2; - final int y = (rect.height - barHeight) / 2; - - gc.fillRoundRectangle(x, y, xPosition, barHeight, barHeight, barHeight); - gc.drawRoundRectangle(x, y, xPosition, barHeight, barHeight, barHeight); - } - - private int computeXPosition() { - final int originalWidth = getClientArea().width - renderer.getHorizontalMargin() * 2 - renderer.getSelectorWidth(); - final float coeff = value * 1f / (maximum - minimum); - final int position = (int) (coeff * originalWidth); - return position; - } - - private void drawSelector(final GC gc, boolean enabled) { - final Rectangle rect = getClientArea(); - gc.setForeground(getColor(renderer.getSelectorColorBorder(), enabled)); - gc.setBackground(getColor(renderer.getSelectorColor(), enabled)); - - final int hMargin = renderer.getHorizontalMargin(); - - final int selectorWidth = renderer.getSelectorWidth(); - final int selectorHeight = renderer.getSelectorHeight(); - - final int y = (rect.height - selectorHeight) / 2; - - // Draw the body - gc.fillRoundRectangle(hMargin + xPosition, y, selectorWidth, selectorHeight, selectorHeight, selectorHeight); - gc.drawRoundRectangle(hMargin + xPosition, y, selectorWidth, selectorHeight, selectorHeight, selectorHeight); - - // Draw the arrows - gc.setForeground(getColor(renderer.getArrowColor(), enabled)); - gc.setLineWidth(renderer.getArrowLineWidth()); - final int baseY = y + selectorHeight / 2; - gc.drawLine(hMargin + xPosition + 10, baseY, hMargin + xPosition + 17, baseY - 7); - gc.drawLine(hMargin + xPosition + 10, baseY, hMargin + xPosition + 17, baseY + 7); - - gc.drawLine(hMargin + xPosition + selectorWidth - 10, baseY, hMargin + xPosition + selectorWidth - 17, baseY - 7); - gc.drawLine(hMargin + xPosition + selectorWidth - 10, baseY, hMargin + xPosition + selectorWidth - 17, baseY + 7); - - // And the value - gc.setForeground(getColor(renderer.getSelectorTextColor(), enabled)); - gc.setFont(renderer.getTextFont()); - final String valueAsString = stringValueOf(value); - final Point textSize = gc.textExtent(valueAsString); - - final int xText = hMargin + xPosition + selectorWidth / 2; - final int yText = y + selectorHeight / 2; - - gc.drawText(valueAsString, xText - textSize.x / 2, yText - textSize.y / 2, true); - } - - @Override - public void setBounds(int x, int y, int width, int height) { - xPosition = -1; - super.setBounds(x, y, width, height); - } - - @Override - public void setEnabled(boolean enabled) { - if(!enabled && moving) { - moving = false; - } - super.setEnabled(enabled); - } - - private Color getColor(Color color, boolean enabled) { - if(enabled) { - return color; - } - // see https://en.wikipedia.org/wiki/Grayscale#Converting_color_to_grayscale - int red = color.getRed(); - int green = color.getGreen(); - int blue = color.getBlue(); - if(red == green && green == blue) { - return color; - } - int g = (int)(0.299 * red + 0.587 * green + 0.114 * blue); - return new Color(g, g, g); - } - - private String stringValueOf(int value) { - if(format != null) { - return format.apply(value); - } - return String.valueOf(value); - } - - /** - * Set the format that should be used to format the given number to a string. - * - * @param format - * the format or null to use the default format. - */ - public void setLabelFormatProvider(IntFunction format) { - checkWidget(); - this.format = format; - } - - public IntFunction getLabelFormatProvider() { - checkWidget(); - return format; - } - - private void addMouseListeners() { - - addListener(SWT.MouseDown, e -> { - if(isEnabled()) { - final int selectorWidth = renderer.getSelectorWidth(); - final int selectorHeight = renderer.getSelectorHeight(); - - final int y = (getClientArea().height - selectorHeight) / 2; - final Rectangle rect = new Rectangle(xPosition + renderer.getHorizontalMargin(), y, selectorWidth, selectorHeight); - if (!rect.contains(e.x, e.y)) { - return; - } - moving = true; - movingValue = value; - mouseDeltaX = xPosition - e.x; - } - }); - - addListener(SWT.MouseUp, e -> { - moving = false; - mouseDeltaX = 0; - if(movingValue != value) { - SelectionListenerUtil.fireDefaultSelectionListeners(this, e); - } - redraw(); - }); - - addListener(SWT.MouseMove, e -> { - if (!moving) { - return; - } - - xPosition = e.x + mouseDeltaX; - if (xPosition < 0) { - xPosition = 0; - } - final int originalWidth = getClientArea().width - renderer.getHorizontalMargin() * 2 - renderer.getSelectorWidth(); - - if (xPosition > originalWidth) { - xPosition = originalWidth; - } - - // Update value - final float ratio = (float) xPosition / originalWidth; - int value = (int)Math.floor(ratio * (maximum - minimum)); - if(this.value != value) { - this.value = value; - SelectionListenerUtil.fireSelectionListeners(this, e); - } - redraw(); - - }); - } - - - - /** - * Adds the listener to the collection of listeners who will be notified when - * the control is selected by the user, by sending it one of the messages - * defined in the SelectionListener interface. - *

- * widgetDefaultSelected is not called. - *

- * - * @param listener the listener which should be notified when the control is - * selected by the user, - * - * @exception IllegalArgumentException - *
    - *
  • ERROR_NULL_ARGUMENT - if the listener is null
  • - *
- * @exception SWTException - *
    - *
  • ERROR_WIDGET_DISPOSED - if the receiver has been - * disposed
  • - *
  • ERROR_THREAD_INVALID_ACCESS - if not called from the - * thread that created the receiver
  • - *
- * - * @see SelectionListener - * @see #removeSelectionListener - * @see SelectionEvent - */ - public void addSelectionListener(final SelectionListener listener) { - checkWidget(); - SelectionListenerUtil.addSelectionListener(this, listener); - } - - /** - * @see org.eclipse.swt.widgets.Control#computeSize(int, int, boolean) - */ - @Override - public Point computeSize(final int wHint, final int hHint, final boolean changed) { - return new Point(Math.max(300, wHint), Math.max(40, hHint)); - } - - /** - * Removes the listener from the collection of listeners who will be notified - * when the control is selected by the user. - * - * @param listener the listener which should no longer be notified - * - * @exception IllegalArgumentException - *
    - *
  • ERROR_NULL_ARGUMENT - if the listener is null
  • - *
- * @exception SWTException - *
    - *
  • ERROR_WIDGET_DISPOSED - if the receiver has been - * disposed
  • - *
  • ERROR_THREAD_INVALID_ACCESS - if not called from the - * thread that created the receiver
  • - *
- * - * @see SelectionListener - * @see #addSelectionListener - */ - public void removeSelectionListener(final SelectionListener listener) { - checkWidget(); - SelectionListenerUtil.removeSelectionListener(this, listener); - } - - // ----------------------- Getters & Setters - - /** - * Returns the minimum value which the receiver will allow. - * - * @return the minimum - * - * @exception SWTException - *
    - *
  • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
  • - *
  • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
  • - *
- */ - public int getMinimum() { - checkWidget(); - return minimum; - } - - /** - * Sets the minimum value. If this value is greater than the maximum, an exception is thrown - * - * @param value the new minimum - * - * @exception SWTException - *
    - *
  • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
  • - *
  • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
  • - *
- */ - public void setMinimum(final int minimum) { - checkWidget(); - if (minimum > maximum) { - SWT.error(SWT.ERROR_INVALID_ARGUMENT, new IllegalArgumentException(String.format("Value %d is greater than the maximum value (%d)", minimum, maximum))); - } - this.minimum = minimum; - redraw(); - update(); - } - - /** - * Returns the maximum value which the receiver will allow. - * - * @return the maximum - * - * @exception SWTException - *
    - *
  • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
  • - *
  • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
  • - *
- */ - public int getMaximum() { - checkWidget(); - return maximum; - } - - /** - * Sets the maximum value. If this value is lower than the minimum, an exception is thrown - * - * @param value the new minimum - * - * @exception SWTException - *
    - *
  • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
  • - *
  • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
  • - *
- */ - public void setMaximum(final int maximum) { - checkWidget(); - if (maximum < minimum) { - SWT.error(SWT.ERROR_INVALID_ARGUMENT, new IllegalArgumentException(String.format("Value %d is lower than the minimum value (%d)", maximum, minimum))); - } - this.maximum = maximum; - redraw(); - update(); - } - - /** - * Returns the receiver's value. - * - * @return the selection - * - * @exception SWTException - *
    - *
  • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
  • - *
  • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
  • - *
- */ - public int getValue() { - checkWidget(); - return value; - } - - /** - * Sets the receiver's value. If the value is lower to minimum or greater than the maximum, an exception is thrown - * - * @param value the new selection (must be zero or greater) - * - * @exception SWTException - *
    - *
  • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
  • - *
  • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
  • - *
- */ - public void setValue(final int value) { - checkWidget(); - if (value < minimum || value > maximum) { - SWT.error(SWT.ERROR_INVALID_ARGUMENT, new IllegalArgumentException(String.format("Value %d is not int the range [%d - %d]", value, minimum, maximum))); - } - this.value = value; - xPosition = -1; - redraw(); - update(); - } - - /** - * Return the current renderer for this widget - * - * @return the renderer - * - * @exception SWTException - *
    - *
  • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
  • - *
  • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
  • - *
- */ - public NebulaSliderGraphicConfiguration getRenderer() { - checkWidget(); - return renderer; - } - - /** - * Sets the renderer for this widget - * - * @param renderer the new renderer - * - * @exception SWTException - *
    - *
  • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
  • - *
  • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
  • - *
- */ - public void setRenderer(final NebulaSliderGraphicConfiguration renderer) { - checkWidget(); - this.renderer = renderer; - redraw(); - } - -}