diff options
Diffstat (limited to 'bundles/org.eclipse.swt/Eclipse SWT/carbon/org/eclipse/swt/widgets/Slider.java')
-rw-r--r-- | bundles/org.eclipse.swt/Eclipse SWT/carbon/org/eclipse/swt/widgets/Slider.java | 510 |
1 files changed, 116 insertions, 394 deletions
diff --git a/bundles/org.eclipse.swt/Eclipse SWT/carbon/org/eclipse/swt/widgets/Slider.java b/bundles/org.eclipse.swt/Eclipse SWT/carbon/org/eclipse/swt/widgets/Slider.java index 94280b6ce4..d67f0bdd61 100644 --- a/bundles/org.eclipse.swt/Eclipse SWT/carbon/org/eclipse/swt/widgets/Slider.java +++ b/bundles/org.eclipse.swt/Eclipse SWT/carbon/org/eclipse/swt/widgets/Slider.java @@ -6,127 +6,23 @@ package org.eclipse.swt.widgets; * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/cpl-v10.html */ + +import org.eclipse.swt.internal.carbon.OS; +import org.eclipse.swt.internal.carbon.Rect; import org.eclipse.swt.*; import org.eclipse.swt.events.*; import org.eclipse.swt.graphics.*; -import org.eclipse.swt.internal.carbon.*; -/** - * Instances of this class are selectable user interface - * objects that represent a range of positive, numeric values. - * <p> - * At any given moment, a given slider will have a - * single <em>selection</em> that is considered to be its - * value, which is constrained to be within the range of - * values the slider represents (that is, between its - * <em>minimum</em> and <em>maximum</em> values). - * </p><p> - * Typically, sliders will be made up of five areas: - * <ol> - * <li>an arrow button for decrementing the value</li> - * <li>a page decrement area for decrementing the value by a larger amount</li> - * <li>a <em>thumb</em> for modifying the value by mouse dragging</li> - * <li>a page increment area for incrementing the value by a larger amount</li> - * <li>an arrow button for incrementing the value</li> - * </ol> - * Based on their style, sliders are either <code>HORIZONTAL</code> - * (which have a left facing button for decrementing the value and a - * right facing button for incrementing it) or <code>VERTICAL</code> - * (which have an upward facing button for decrementing the value - * and a downward facing buttons for incrementing it). - * </p><p> - * On some platforms, the size of the slider's thumb can be - * varied relative to the magnitude of the range of values it - * represents (that is, relative to the difference between its - * maximum and minimum values). Typically, this is used to - * indicate some proportional value such as the ratio of the - * visible area of a document to the total amount of space that - * it would take to display it. SWT supports setting the thumb - * size even if the underlying platform does not, but in this - * case the appearance of the slider will not change. - * </p> - * <dl> - * <dt><b>Styles:</b></dt> - * <dd>HORIZONTAL, VERTICAL</dd> - * <dt><b>Events:</b></dt> - * <dd>Selection</dd> - * </dl> - * <p> - * Note: Only one of the styles HORIZONTAL and VERTICAL may be specified. - * </p><p> - * IMPORTANT: This class is <em>not</em> intended to be subclassed. - * </p> - * - * @see ScrollBar - */ -public /*final*/ class Slider extends Control { - private int fIncrement= 1; // AW - private int fPageIncrement= 10; // AW -/** - * Constructs a new instance of this class given its parent - * and a style value describing its behavior and appearance. - * <p> - * The style value is either one of the style constants defined in - * class <code>SWT</code> which is applicable to instances of this - * class, or must be built by <em>bitwise OR</em>'ing together - * (that is, using the <code>int</code> "|" operator) two or more - * of those <code>SWT</code> style constants. The class description - * lists the style constants that are applicable to the class. - * Style bits are also inherited from superclasses. - * </p> - * - * @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 <ul> - * <li>ERROR_NULL_ARGUMENT - if the parent is null</li> - * </ul> - * @exception SWTException <ul> - * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the parent</li> - * <li>ERROR_INVALID_SUBCLASS - if this class is not an allowed subclass</li> - * </ul> - * - * @see SWT#HORIZONTAL - * @see SWT#VERTICAL - * @see Widget#checkSubclass - * @see Widget#getStyle - */ +public class Slider extends Control { + boolean dragging; + int increment = 1; + int pageIncrement = 10; + public Slider (Composite parent, int style) { super (parent, checkStyle (style)); } -/** - * Adds the listener to the collection of listeners who will - * be notified when the receiver's value changes, by sending - * it one of the messages defined in the <code>SelectionListener</code> - * interface. - * <p> - * When <code>widgetSelected</code> is called, the event object detail field contains one of the following values: - * <code>0</code> - for the end of a drag. - * <code>SWT.DRAG</code>. - * <code>SWT.HOME</code>. - * <code>SWT.END</code>. - * <code>SWT.ARROW_DOWN</code>. - * <code>SWT.ARROW_UP</code>. - * <code>SWT.PAGE_DOWN</code>. - * <code>SWT.PAGE_UP</code>. - * <code>widgetDefaultSelected</code> is not called. - * </p> - * - * @param listener the listener which should be notified - * - * @exception IllegalArgumentException <ul> - * <li>ERROR_NULL_ARGUMENT - if the listener is null</li> - * </ul> - * @exception SWTException <ul> - * <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li> - * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li> - * </ul> - * - * @see SelectionListener - * @see #removeSelectionListener - * @see SelectionEvent - */ + public void addSelectionListener(SelectionListener listener) { checkWidget(); if (listener == null) error (SWT.ERROR_NULL_ARGUMENT); @@ -134,210 +30,119 @@ public void addSelectionListener(SelectionListener listener) { addListener(SWT.Selection,typedListener); addListener(SWT.DefaultSelection,typedListener); } + static int checkStyle (int style) { return checkBits (style, SWT.HORIZONTAL, SWT.VERTICAL, 0, 0, 0, 0); } + +int actionProc (int theControl, int partCode) { + Event event = new Event (); + int value = OS.GetControl32BitValue (handle); + switch (partCode) { + case OS.kControlUpButtonPart: + value -= increment; + event.detail = SWT.ARROW_UP; + break; + case OS.kControlPageUpPart: + value -= pageIncrement; + event.detail = SWT.PAGE_UP; + break; + case OS.kControlPageDownPart: + value += pageIncrement; + event.detail = SWT.PAGE_DOWN; + break; + case OS.kControlDownButtonPart: + value += increment; + event.detail = SWT.ARROW_DOWN; + break; + case OS.kControlIndicatorPart: + dragging = true; + event.detail = SWT.DRAG; + break; + default: + return 0; + } + OS.SetControl32BitValue (handle, value); + sendEvent (SWT.Selection, event); + if (dragging) { + Display display = getDisplay (); + display.update (); + } + return 0; +} + public Point computeSize (int wHint, int hHint, boolean changed) { checkWidget(); - int border = getBorderWidth (); - int width = border * 2, height = border * 2; - Display display = getDisplay (); - int hScroll = display.scrolledMarginX; - int vScroll = display.scrolledMarginY; + int [] outMetric = new int [1]; + OS.GetThemeMetric (OS.kThemeMetricScrollBarWidth, outMetric); + int width = 0, height = 0; if ((style & SWT.HORIZONTAL) != 0) { - width += hScroll * 10; - height += vScroll; + height = outMetric [0]; + width = height * 10; } else { - width += hScroll; - height += vScroll * 10; + width = outMetric [0]; + height = width * 10; } - if (wHint != SWT.DEFAULT) width = wHint + (border * 2); - if (hHint != SWT.DEFAULT) height = hHint + (border * 2); + if (wHint != SWT.DEFAULT) width = wHint; + if (hHint != SWT.DEFAULT) height = hHint; return new Point (width, height); } -void createHandle (int index) { - state |= HANDLE; - /* AW - int [] argList = { - OS.XmNancestorSensitive, 1, - OS.XmNborderWidth, (style & SWT.BORDER) != 0 ? 1 : 0, - OS.XmNorientation, ((style & SWT.H_SCROLL) != 0) ? OS.XmHORIZONTAL : OS.XmVERTICAL, - }; - handle = OS.XmCreateScrollBar (parent.handle, null, argList, argList.length / 2); - */ - handle= MacUtil.newControl(parent.handle, (short)0, (short)0, (short)100, OS.kControlScrollBarLiveProc); - if (handle == 0) error (SWT.ERROR_NO_HANDLES); + +void createHandle () { + Display display = getDisplay (); + int actionProc = display.actionProc; + int [] outControl = new int [1]; + int window = OS.GetControlOwner (parent.handle); + OS.CreateScrollBarControl (window, null, 0, 0, 100, 10, true, actionProc, outControl); + if (outControl [0] == 0) error (SWT.ERROR_NO_HANDLES); + handle = outControl [0]; } -/** - * Returns the amount that the receiver's value will be - * modified by when the up/down (or right/left) arrows - * are pressed. - * - * @return the increment - * - * @exception SWTException <ul> - * <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li> - * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li> - * </ul> - */ + public int getIncrement () { checkWidget(); - return fIncrement; + return increment; } -/** - * Returns the maximum value which the receiver will allow. - * - * @return the maximum - * - * @exception SWTException <ul> - * <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li> - * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li> - * </ul> - */ + public int getMaximum () { checkWidget(); - return OS.GetControl32BitMaximum(handle); + int maximum = OS.GetControl32BitMaximum (handle); + int viewSize = OS.GetControlViewSize (handle); + return maximum + viewSize; } -/** - * Returns the minimum value which the receiver will allow. - * - * @return the minimum - * - * @exception SWTException <ul> - * <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li> - * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li> - * </ul> - */ + public int getMinimum () { checkWidget(); - return OS.GetControl32BitMinimum(handle); + return OS.GetControl32BitMinimum (handle); } -/** - * Returns the amount that the receiver's value will be - * modified by when the page increment/decrement areas - * are selected. - * - * @return the page increment - * - * @exception SWTException <ul> - * <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li> - * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li> - * </ul> - */ + public int getPageIncrement () { checkWidget(); - return fPageIncrement; + return pageIncrement; } -/** - * Returns the single <em>selection</em> that is the receiver's value. - * - * @return the selection - * - * @exception SWTException <ul> - * <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li> - * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li> - * </ul> - */ + public int getSelection () { checkWidget(); - return OS.GetControl32BitValue(handle); + return OS.GetControl32BitValue (handle); } -/** - * Returns the size of the receiver's thumb relative to the - * difference between its maximum and minimum values. - * - * @return the thumb value - * - * @exception SWTException <ul> - * <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li> - * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li> - * </ul> - */ + public int getThumb () { checkWidget(); - return OS.GetControlViewSize(handle); -} -void hookEvents () { - super.hookEvents (); - /* AW - int windowProc = getDisplay ().windowProc; - OS.XtAddCallback (handle, OS.XmNvalueChangedCallback, windowProc, SWT.Selection); - OS.XtAddCallback (handle, OS.XmNdragCallback, windowProc, SWT.Selection); - OS.XtAddCallback (handle, OS.XmNtoBottomCallback, windowProc, SWT.Selection); - OS.XtAddCallback (handle, OS.XmNincrementCallback, windowProc, SWT.Selection); - OS.XtAddCallback (handle, OS.XmNdecrementCallback, windowProc, SWT.Selection); - OS.XtAddCallback (handle, OS.XmNpageIncrementCallback, windowProc, SWT.Selection); - OS.XtAddCallback (handle, OS.XmNpageDecrementCallback, windowProc, SWT.Selection); - OS.XtAddCallback (handle, OS.XmNtoTopCallback, windowProc, SWT.Selection); - */ - OS.SetControlAction(handle, getDisplay().fControlActionProc); + return OS.GetControlViewSize (handle); } -int processSelection (Object callData) { - MacControlEvent macEvent= (MacControlEvent) callData; - if (! macEvent.isMouseDown()) - return 0; - - Event event = new Event (); - switch (macEvent.getPartCode()) { - case OS.kControlUpButtonPart: - OS.SetControl32BitValue(handle, OS.GetControl32BitValue(handle) - fIncrement); - event.detail = SWT.ARROW_UP; - break; - case OS.kControlPageUpPart: - OS.SetControl32BitValue(handle, OS.GetControl32BitValue(handle) - fPageIncrement); - event.detail = SWT.PAGE_UP; - break; - case OS.kControlPageDownPart: - OS.SetControl32BitValue(handle, OS.GetControl32BitValue(handle) + fPageIncrement); - event.detail = SWT.PAGE_DOWN; - break; - case OS.kControlDownButtonPart: - OS.SetControl32BitValue(handle, OS.GetControl32BitValue(handle) + fIncrement); - event.detail = SWT.ARROW_DOWN; - break; - case OS.kControlIndicatorPart: // end of drag or continuos drag - if (macEvent.isMouseDown()) - event.detail = SWT.DRAG; // continuos drag - else { - /* - * Do not set the detail field to SWT.DRAG - * to indicate that the dragging has ended. - */ - } - break; - } - - sendEvent (SWT.Selection, event); - - /* AW FIXME: may be we need the following here too... - if (macEvent.isMouseDown()) { - int wHandle= OS.GetControlOwner(handle); - if (wHandle != 0) { - getDisplay().updateWindow(wHandle); - } +int kEventMouseDown (int nextHandler, int theEvent, int userData) { + int status = super.kEventMouseDown (nextHandler, theEvent, userData); + if (status == OS.noErr) return status; + dragging = false; + status = OS.CallNextEventHandler (nextHandler, theEvent); + if (dragging) { + Event event = new Event (); + sendEvent (SWT.Selection, event); } - */ - - return 0; + dragging = false; + return status; } -/** - * Removes the listener from the collection of listeners who will - * be notified when the receiver's value changes. - * - * @param listener the listener which should no longer be notified - * - * @exception IllegalArgumentException <ul> - * <li>ERROR_NULL_ARGUMENT - if the listener is null</li> - * </ul> - * @exception SWTException <ul> - * <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li> - * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li> - * </ul> - * - * @see SelectionListener - * @see #addSelectionListener - */ + public void removeSelectionListener(SelectionListener listener) { checkWidget(); if (listener == null) error (SWT.ERROR_NULL_ARGUMENT); @@ -345,133 +150,49 @@ public void removeSelectionListener(SelectionListener listener) { eventTable.unhook(SWT.Selection, listener); eventTable.unhook(SWT.DefaultSelection,listener); } -/** - * Sets the amount that the receiver's value will be - * modified by when the up/down (or right/left) arrows - * are pressed to the argument, which must be at least - * one. - * - * @param value the new increment (must be greater than zero) - * - * @exception SWTException <ul> - * <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li> - * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li> - * </ul> - */ + public void setIncrement (int value) { checkWidget(); if (value < 1) return; - fIncrement= value; + increment = value; } -/** - * Sets the maximum value which the receiver will allow - * to be the argument which must be greater than or - * equal to zero. - * - * @param value the new maximum (must be zero or greater) - * - * @exception SWTException <ul> - * <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li> - * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li> - * </ul> - */ + public void setMaximum (int value) { checkWidget(); if (value < 0) return; - OS.SetControl32BitMaximum(handle, value); + int minimum = OS.GetControl32BitMinimum (handle); + int viewSize = OS.GetControlViewSize (handle); + if (value - minimum - viewSize < 0) return; + OS.SetControl32BitMaximum (handle, value - viewSize); } -/** - * Sets the minimum value which the receiver will allow - * to be the argument which must be greater than or - * equal to zero. - * - * @param value the new minimum (must be zero or greater) - * - * @exception SWTException <ul> - * <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li> - * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li> - * </ul> - */ + public void setMinimum (int value) { checkWidget(); if (value < 0) return; - OS.SetControl32BitMinimum(handle, value); + int maximum = OS.GetControl32BitMinimum (handle); + int viewSize = OS.GetControlViewSize (handle); + if (maximum - value - viewSize < 0) return; + OS.SetControl32BitMinimum (handle, value); } -/** - * Sets the amount that the receiver's value will be - * modified by when the page increment/decrement areas - * are selected to the argument, which must be at least - * one. - * - * @return the page increment (must be greater than zero) - * - * @exception SWTException <ul> - * <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li> - * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li> - * </ul> - */ + public void setPageIncrement (int value) { checkWidget(); if (value < 1) return; - fPageIncrement= value; + pageIncrement = value; } -/** - * Sets the single <em>selection</em> that is the receiver's - * value to the argument which must be greater than or equal - * to zero. - * - * @param value the new selection (must be zero or greater) - * - * @exception SWTException <ul> - * <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li> - * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li> - * </ul> - */ + public void setSelection (int value) { checkWidget(); if (value < 0) return; - OS.SetControl32BitValue(handle, value); + OS.SetControl32BitValue (handle, value); } -/** - * Sets the size of the receiver's thumb relative to the - * difference between its maximum and minimum values to the - * argument which must be at least one. - * - * @param value the new thumb value (must be at least one) - * - * @exception SWTException <ul> - * <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li> - * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li> - * </ul> - * - * @see ScrollBar - */ + public void setThumb (int value) { checkWidget(); if (value < 1) return; - OS.SetControlViewSize(handle, value); + OS.SetControlViewSize (handle, value); } -/** - * Sets the receiver's selection, minimum value, maximum - * value, thumb, increment and page increment all at once. - * <p> - * Note: This is equivalent to setting the values individually - * using the appropriate methods, but may be implemented in a - * more efficient fashion on some platforms. - * </p> - * - * @param selection the new selection value - * @param minimum the new minimum value - * @param maximum the new maximum value - * @param thumb the new thumb value - * @param increment the new increment value - * @param pageIncrement the new pageIncrement value - * - * @exception SWTException <ul> - * <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li> - * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li> - * </ul> - */ + public void setValues (int selection, int minimum, int maximum, int thumb, int increment, int pageIncrement) { checkWidget(); if (selection < 0) return; @@ -481,11 +202,12 @@ public void setValues (int selection, int minimum, int maximum, int thumb, int i if (maximum - minimum - thumb < 0) return; if (increment < 1) return; if (pageIncrement < 1) return; - OS.SetControl32BitMinimum(handle, minimum); - OS.SetControl32BitMaximum(handle, maximum); - OS.SetControlViewSize(handle, thumb); - OS.SetControl32BitValue(handle, selection); - fIncrement= increment; - fPageIncrement= pageIncrement; + OS.SetControl32BitMinimum (handle, minimum); + OS.SetControl32BitMaximum (handle, maximum - thumb); + OS.SetControlViewSize (handle, thumb); + OS.SetControl32BitValue (handle, selection); + this.increment = increment; + this.pageIncrement = pageIncrement; } + } |