| package org.eclipse.swt.widgets; |
| |
| /* |
| * Copyright (c) 2000, 2002 IBM Corp. All rights reserved. |
| * This file is made available under the terms of the Common Public License v1.0 |
| * which accompanies this distribution, and is available at |
| * http://www.eclipse.org/legal/cpl-v10.html |
| */ |
| |
| import org.eclipse.swt.internal.*; |
| import org.eclipse.swt.internal.carbon.*; |
| import org.eclipse.swt.graphics.*; |
| import org.eclipse.swt.*; |
| import org.eclipse.swt.events.*; |
| import org.eclipse.swt.accessibility.*; |
| |
| /** |
| * Control is the abstract superclass of all windowed user interface classes. |
| * <p> |
| * <dl> |
| * <dt><b>Styles:</b> |
| * <dd>BORDER</dd> |
| * <dt><b>Events:</b> |
| * <dd>FocusIn, FocusOut, Help, KeyDown, KeyUp, MouseDoubleClick, MouseDown, MouseEnter, |
| * MouseExit, MouseHover, MouseUp, MouseMove, Move, Paint, Resize</dd> |
| * </dl> |
| * <p> |
| * IMPORTANT: This class is intended to be subclassed <em>only</em> |
| * within the SWT implementation. |
| * </p> |
| */ |
| public abstract class Control extends Widget implements Drawable { |
| Composite parent; |
| Font font; |
| int foreground, background; |
| Menu menu; |
| String toolTipText; |
| Object layoutData; |
| Accessible accessible; |
| |
| Control () { |
| /* Do nothing */ |
| } |
| /** |
| * 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#BORDER |
| * @see Widget#checkSubclass |
| * @see Widget#getStyle |
| */ |
| public Control (Composite parent, int style) { |
| super (parent, style); |
| this.parent = parent; |
| createWidget (0); |
| } |
| /** |
| * Adds the listener to the collection of listeners who will |
| * be notified when the control is moved or resized, by sending |
| * it one of the messages defined in the <code>ControlListener</code> |
| * interface. |
| * |
| * @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 ControlListener |
| * @see #removeControlListener |
| */ |
| public void addControlListener(ControlListener listener) { |
| checkWidget(); |
| if (listener == null) error (SWT.ERROR_NULL_ARGUMENT); |
| TypedListener typedListener = new TypedListener (listener); |
| addListener (SWT.Resize,typedListener); |
| addListener (SWT.Move,typedListener); |
| } |
| /** |
| * Adds the listener to the collection of listeners who will |
| * be notified when the control gains or loses focus, by sending |
| * it one of the messages defined in the <code>FocusListener</code> |
| * interface. |
| * |
| * @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 FocusListener |
| * @see #removeFocusListener |
| */ |
| public void addFocusListener(FocusListener listener) { |
| checkWidget(); |
| if (listener == null) error (SWT.ERROR_NULL_ARGUMENT); |
| TypedListener typedListener = new TypedListener (listener); |
| addListener(SWT.FocusIn,typedListener); |
| addListener(SWT.FocusOut,typedListener); |
| } |
| /** |
| * Adds the listener to the collection of listeners who will |
| * be notified when help events are generated for the control, |
| * by sending it one of the messages defined in the |
| * <code>HelpListener</code> interface. |
| * |
| * @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 HelpListener |
| * @see #removeHelpListener |
| */ |
| public void addHelpListener (HelpListener listener) { |
| checkWidget(); |
| if (listener == null) error (SWT.ERROR_NULL_ARGUMENT); |
| TypedListener typedListener = new TypedListener (listener); |
| addListener (SWT.Help, typedListener); |
| } |
| /** |
| * Adds the listener to the collection of listeners who will |
| * be notified when keys are pressed and released on the system keyboard, by sending |
| * it one of the messages defined in the <code>KeyListener</code> |
| * interface. |
| * |
| * @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 KeyListener |
| * @see #removeKeyListener |
| */ |
| public void addKeyListener(KeyListener listener) { |
| checkWidget(); |
| if (listener == null) error (SWT.ERROR_NULL_ARGUMENT); |
| TypedListener typedListener = new TypedListener (listener); |
| addListener(SWT.KeyUp,typedListener); |
| addListener(SWT.KeyDown,typedListener); |
| } |
| /** |
| * Adds the listener to the collection of listeners who will |
| * be notified when mouse buttons are pressed and released, by sending |
| * it one of the messages defined in the <code>MouseListener</code> |
| * interface. |
| * |
| * @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 MouseListener |
| * @see #removeMouseListener |
| */ |
| public void addMouseListener(MouseListener listener) { |
| checkWidget(); |
| if (listener == null) error (SWT.ERROR_NULL_ARGUMENT); |
| TypedListener typedListener = new TypedListener (listener); |
| addListener(SWT.MouseDown,typedListener); |
| addListener(SWT.MouseUp,typedListener); |
| addListener(SWT.MouseDoubleClick,typedListener); |
| } |
| /** |
| * Adds the listener to the collection of listeners who will |
| * be notified when the mouse passes or hovers over controls, by sending |
| * it one of the messages defined in the <code>MouseTrackListener</code> |
| * interface. |
| * |
| * @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 MouseTrackListener |
| * @see #removeMouseTrackListener |
| */ |
| public void addMouseTrackListener (MouseTrackListener listener) { |
| checkWidget(); |
| if (listener == null) error (SWT.ERROR_NULL_ARGUMENT); |
| TypedListener typedListener = new TypedListener (listener); |
| addListener (SWT.MouseEnter,typedListener); |
| addListener (SWT.MouseExit,typedListener); |
| addListener (SWT.MouseHover,typedListener); |
| } |
| /** |
| * Adds the listener to the collection of listeners who will |
| * be notified when the mouse moves, by sending it one of the |
| * messages defined in the <code>MouseMoveListener</code> |
| * interface. |
| * |
| * @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 MouseMoveListener |
| * @see #removeMouseMoveListener |
| */ |
| public void addMouseMoveListener(MouseMoveListener listener) { |
| checkWidget(); |
| if (listener == null) error (SWT.ERROR_NULL_ARGUMENT); |
| TypedListener typedListener = new TypedListener (listener); |
| addListener(SWT.MouseMove,typedListener); |
| } |
| /** |
| * Adds the listener to the collection of listeners who will |
| * be notified when the receiver needs to be painted, by sending it |
| * one of the messages defined in the <code>PaintListener</code> |
| * interface. |
| * |
| * @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 PaintListener |
| * @see #removePaintListener |
| */ |
| public void addPaintListener(PaintListener listener) { |
| checkWidget(); |
| if (listener == null) error (SWT.ERROR_NULL_ARGUMENT); |
| TypedListener typedListener = new TypedListener (listener); |
| addListener(SWT.Paint,typedListener); |
| } |
| /** |
| * Adds the listener to the collection of listeners who will |
| * be notified when traversal events occur, by sending it |
| * one of the messages defined in the <code>TraverseListener</code> |
| * interface. |
| * |
| * @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 TraverseListener |
| * @see #removeTraverseListener |
| */ |
| public void addTraverseListener (TraverseListener listener) { |
| checkWidget(); |
| if (listener == null) error (SWT.ERROR_NULL_ARGUMENT); |
| TypedListener typedListener = new TypedListener (listener); |
| addListener (SWT.Traverse,typedListener); |
| } |
| /** |
| * Returns the preferred size of the receiver. |
| * <p> |
| * The <em>preferred size</em> of a control is the size that it would |
| * best be displayed at. The width hint and height hint arguments |
| * allow the caller to ask a control questions such as "Given a particular |
| * width, how high does the control need to be to show all of the contents?" |
| * To indicate that the caller does not wish to constrain a particular |
| * dimension, the constant <code>SWT.DEFAULT</code> is passed for the hint. |
| * </p> |
| * |
| * @param wHint the width hint (can be <code>SWT.DEFAULT</code>) |
| * @param hHint the height hint (can be <code>SWT.DEFAULT</code>) |
| * @return the preferred size of the control |
| * |
| * @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 Layout |
| * @see #getBorderWidth |
| * @see #getBounds |
| * @see #getSize |
| * @see #pack |
| * @see "computeTrim, getClientArea for controls that implement them" |
| */ |
| public Point computeSize (int wHint, int hHint) { |
| return computeSize (wHint, hHint, true); |
| } |
| /** |
| * Returns the preferred size of the receiver. |
| * <p> |
| * The <em>preferred size</em> of a control is the size that it would |
| * best be displayed at. The width hint and height hint arguments |
| * allow the caller to ask a control questions such as "Given a particular |
| * width, how high does the control need to be to show all of the contents?" |
| * To indicate that the caller does not wish to constrain a particular |
| * dimension, the constant <code>SWT.DEFAULT</code> is passed for the hint. |
| * </p><p> |
| * If the changed flag is <code>true</code>, it indicates that the receiver's |
| * <em>contents</em> have changed, therefore any caches that a layout manager |
| * containing the control may have been keeping need to be flushed. When the |
| * control is resized, the changed flag will be <code>false</code>, so layout |
| * manager caches can be retained. |
| * </p> |
| * |
| * @param wHint the width hint (can be <code>SWT.DEFAULT</code>) |
| * @param hHint the height hint (can be <code>SWT.DEFAULT</code>) |
| * @param changed <code>true</code> if the control's contents have changed, and <code>false</code> otherwise |
| * @return the preferred size of the control. |
| * |
| * @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 Layout |
| * @see #getBorderWidth |
| * @see #getBounds |
| * @see #getSize |
| * @see #pack |
| * @see "computeTrim, getClientArea for controls that implement them" |
| */ |
| public Point computeSize (int wHint, int hHint, boolean changed) { |
| checkWidget(); |
| int width = DEFAULT_WIDTH; |
| int height = DEFAULT_HEIGHT; |
| if (wHint != SWT.DEFAULT) width = wHint; |
| if (hHint != SWT.DEFAULT) height = hHint; |
| int border = getBorderWidth (); |
| width += border * 2; |
| height += border * 2; |
| return new Point (width, height); |
| } |
| void createWidget (int index) { |
| super.createWidget (index); |
| foreground = background = -1; |
| |
| /* |
| * Feature in MOTIF. When a widget is created before the |
| * parent has been realized, the widget is created behind |
| * all siblings in the Z-order. When a widget is created |
| * after the parent has been realized, it is created in |
| * front of all siblings. This is not incorrect but is |
| * unexpected. The fix is to force all widgets to always |
| * be created behind their siblings. |
| */ |
| /* AW |
| int topHandle = topHandle (); |
| if (OS.XtIsRealized (topHandle)) { |
| int window = OS.XtWindow (topHandle); |
| if (window != 0) { |
| int display = OS.XtDisplay (topHandle); |
| if (display != 0) OS.XLowerWindow (display, window); |
| } |
| /* |
| * Make that the widget has been properly realized |
| * because the widget was created after the parent |
| * has been realized. This is not part of the fix |
| * for Z-order in the code above. |
| */ |
| /* AW |
| realizeChildren (); |
| } |
| */ |
| |
| /* |
| * Feature in Motif. When the XmNfontList resource is set for |
| * a widget, Motif creates a copy of the fontList and disposes |
| * the copy when the widget is disposed. This means that when |
| * the programmer queries the font, not only will the handle be |
| * different but the font will be unexpectedly disposed when |
| * the widget is disposed. This can cause GP's when the font |
| * is set in another widget. The fix is to cache the font the |
| * the programmer provides. The initial value of the cache is |
| * the default font for the widget. |
| */ |
| font = defaultFont (); |
| |
| /* |
| * Explicitly set the tab ordering for XmTAB_GROUP widgets to |
| * override the default traversal. This is done so that the |
| * traversal order can be changed after the widget tree is |
| * created. Unless explicitly changed, the overridded traversal |
| * order is the same as the default. |
| */ |
| /* AW |
| int [] argList1 = new int [] {OS.XmNnavigationType, 0}; |
| OS.XtGetValues (handle, argList1, argList1.length / 2); |
| if (argList1 [1] == OS.XmTAB_GROUP) { |
| int [] argList2 = new int [] {OS.XmNnavigationType, OS.XmEXCLUSIVE_TAB_GROUP}; |
| OS.XtSetValues (handle, argList2, argList2.length / 2); |
| } |
| */ |
| } |
| int defaultBackground () { |
| return getDisplay ().defaultBackground; |
| } |
| Font defaultFont () { |
| return getDisplay ().defaultFont; |
| } |
| int defaultForeground () { |
| return getDisplay ().defaultForeground; |
| } |
| void enableWidget (boolean enabled) { |
| enableHandle (enabled, handle); |
| } |
| char findMnemonic (String string) { |
| int index = 0; |
| int length = string.length (); |
| do { |
| while ((index < length) && (string.charAt (index) != Mnemonic)) index++; |
| if (++index >= length) return '\0'; |
| if (string.charAt (index) != Mnemonic) return string.charAt (index); |
| index++; |
| } while (index < length); |
| return '\0'; |
| } |
| int fontHandle () { |
| return handle; |
| } |
| /** |
| * Forces the receiver to have the <em>keyboard focus</em>, causing |
| * all keyboard events to be delivered to it. |
| * |
| * @return <code>true</code> if the control got focus, and <code>false</code> if it was unable to. |
| * |
| * @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 #setFocus |
| */ |
| public boolean forceFocus () { |
| checkWidget(); |
| Decorations shell = menuShell (); |
| shell.setSavedFocus (this); |
| if (!isEnabled () || !isVisible ()) return false; |
| if (isFocusControl ()) return true; |
| shell.bringToTop (); |
| /* AW |
| return OS.XmProcessTraversal (handle, OS.XmTRAVERSE_CURRENT); |
| */ |
| |
| Display display= getDisplay(); |
| if (display != null) |
| return display.setMacFocusHandle(((Shell)shell).shellHandle, handle); |
| |
| if (!isFocusControl ()) return false; |
| shell.setDefaultButton (null, false); |
| return true; |
| } |
| |
| /** |
| * Returns the accessible object for the receiver. |
| * If this is the first time this object is requested, |
| * then the object is created and returned. |
| * |
| * @return the accessible object |
| * |
| * @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 Accessible#addAccessibleListener |
| * @see Accessible#addAccessibleControlListener |
| * |
| * @since 2.0 |
| */ |
| public Accessible getAccessible () { |
| checkWidget (); |
| if (accessible == null) { |
| accessible = Accessible.internal_new_Accessible (this); |
| } |
| return accessible; |
| } |
| |
| /** |
| * Returns the receiver's background color. |
| * |
| * @return the background color |
| * |
| * @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 Color getBackground () { |
| checkWidget(); |
| /* AW |
| return Color.motif_new (getDisplay (), getXColor (getBackgroundPixel ())); |
| */ |
| return Color.carbon_new (getDisplay (), getBackgroundPixel ()); |
| } |
| int getBackgroundPixel () { |
| /* AW |
| int [] argList = {OS.XmNbackground, 0}; |
| OS.XtGetValues (handle, argList, argList.length / 2); |
| return argList [1]; |
| */ |
| if (background == -1) return defaultBackground (); |
| return background; |
| } |
| /** |
| * Returns the receiver's border width. |
| * |
| * @return the border width |
| * |
| * @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 getBorderWidth () { |
| checkWidget(); |
| int topHandle = topHandle (); |
| /* AW |
| int [] argList = {OS.XmNborderWidth, 0}; |
| OS.XtGetValues (topHandle, argList, argList.length / 2); |
| return argList [1]; |
| */ |
| return 0; |
| } |
| /** |
| * Returns a rectangle describing the receiver's size and location |
| * relative to its parent (or its display if its parent is null). |
| * |
| * @return the receiver's bounding rectangle |
| * |
| * @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 Rectangle getBounds () { |
| checkWidget(); |
| int topHandle = topHandle (); |
| /* AW |
| int [] argList = {OS.XmNx, 0, OS.XmNy, 0, OS.XmNwidth, 0, OS.XmNheight, 0, OS.XmNborderWidth, 0}; |
| OS.XtGetValues (topHandle, argList, argList.length / 2); |
| int borders = argList [9] * 2; |
| return new Rectangle ((short) argList [1], (short) argList [3], argList [5] + borders, argList [7] + borders); |
| */ |
| short[] bounds= new short[4]; |
| short[] pbounds= new short[4]; |
| OS.GetControlBounds(topHandle, bounds); |
| OS.GetControlBounds(parent.handle, pbounds); |
| return new Rectangle(bounds[1]-pbounds[1], bounds[0]-pbounds[0], bounds[3]-bounds[1], bounds[2]-bounds[0]); |
| } |
| Point getClientLocation () { |
| /* AW |
| short [] handle_x = new short [1], handle_y = new short [1]; |
| OS.XtTranslateCoords (handle, (short) 0, (short) 0, handle_x, handle_y); |
| short [] topHandle_x = new short [1], topHandle_y = new short [1]; |
| OS.XtTranslateCoords (parent.handle, (short) 0, (short) 0, topHandle_x, topHandle_y); |
| return new Point (handle_x [0] - topHandle_x [0], handle_y [0] - topHandle_y [0]); |
| */ |
| short[] bounds= new short[4]; |
| short[] pbounds= new short[4]; |
| OS.GetControlBounds(handle, bounds); |
| OS.GetControlBounds(parent.handle, pbounds); |
| return new Point(bounds[1]-pbounds[1], bounds[0]-pbounds[0]); |
| } |
| /** |
| * Returns the display that the receiver was created on. |
| * |
| * @return the receiver's display |
| * |
| * @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 Display getDisplay () { |
| Composite parent = this.parent; |
| if (parent == null) error (SWT.ERROR_WIDGET_DISPOSED); |
| return parent.getDisplay (); |
| } |
| /** |
| * Returns <code>true</code> if the receiver is enabled, and |
| * <code>false</code> otherwise. A disabled control is typically |
| * not selectable from the user interface and draws with an |
| * inactive or "grayed" look. |
| * |
| * @return the receiver's enabled state |
| * |
| * @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 boolean getEnabled () { |
| checkWidget(); |
| /* AW |
| int [] argList = {OS.XmNsensitive, 0}; |
| OS.XtGetValues (topHandle (), argList, argList.length / 2); |
| return argList [1] != 0; |
| */ |
| int h= topHandle(); |
| if (OS.IsValidControlHandle(h)) |
| return OS.IsControlEnabled(h); |
| System.out.println("Control.getEnabled: fixme for " + getClass().getName()); |
| return true; |
| } |
| /** |
| * Returns the font that the receiver will use to paint textual information. |
| * |
| * @return the receiver's font |
| * |
| * @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 Font getFont () { |
| checkWidget(); |
| return font; |
| } |
| |
| int getFontAscent () { |
| int oldPort= OS.GetPort(); |
| OS.SetPortWindowPort(OS.GetControlOwner(handle)); |
| if (font != null && font.handle != null) |
| font.handle.installInGrafPort(); |
| short[] fontInfo= new short[4]; |
| OS.GetFontInfo(fontInfo); // FontInfo |
| int height= fontInfo[0]; |
| OS.SetPort(oldPort); |
| return height; |
| } |
| |
| int getFontHeight () { |
| int oldPort= OS.GetPort(); |
| OS.SetPortWindowPort(OS.GetControlOwner(handle)); |
| if (font != null && font.handle != null) |
| font.handle.installInGrafPort(); |
| short[] fontInfo= new short[4]; |
| OS.GetFontInfo(fontInfo); // FontInfo |
| int height= fontInfo[0] + fontInfo[1]; |
| OS.SetPort(oldPort); |
| return height; |
| } |
| /** |
| * Returns the foreground color that the receiver will use to draw. |
| * |
| * @return the receiver's foreground color |
| * |
| * @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 Color getForeground () { |
| checkWidget(); |
| /* AW |
| return Color.motif_new (getDisplay (), getXColor (getForegroundPixel ())); |
| */ |
| return Color.carbon_new (getDisplay (), getForegroundPixel ()); |
| } |
| int getForegroundPixel () { |
| /* AW |
| int [] argList = {OS.XmNforeground, 0}; |
| OS.XtGetValues (handle, argList, argList.length / 2); |
| return argList [1]; |
| */ |
| if (foreground == -1) return defaultForeground (); |
| return foreground; |
| } |
| /* AW |
| short [] getIMECaretPos () { |
| return new short[]{0, 0}; |
| } |
| */ |
| /** |
| * Returns layout data which is associated with the receiver. |
| * |
| * @return the receiver's layout data |
| * |
| * @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 Object getLayoutData () { |
| checkWidget(); |
| return layoutData; |
| } |
| /** |
| * Returns a point describing the receiver's location relative |
| * to its parent (or its display if its parent is null). |
| * |
| * @return the receiver's location |
| * |
| * @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 Point getLocation () { |
| checkWidget(); |
| int topHandle = topHandle (); |
| /* |
| int [] argList = {OS.XmNx, 0, OS.XmNy, 0}; |
| OS.XtGetValues (topHandle, argList, argList.length / 2); |
| return new Point ((short) argList [1], (short) argList [3]); |
| */ |
| short[] bounds= new short[4]; |
| short[] pbounds= new short[4]; |
| OS.GetControlBounds(topHandle, bounds); |
| OS.GetControlBounds(parent.handle, pbounds); |
| return new Point(bounds[1]-pbounds[1], bounds[0]-pbounds[0]); |
| } |
| /** |
| * Returns the receiver's pop up menu if it has one, or null |
| * if it does not. All controls may optionally have a pop up |
| * menu that is displayed when the user requests one for |
| * the control. The sequence of key strokes, button presses |
| * and/or button releases that are used to request a pop up |
| * menu is platform specific. |
| * |
| * @return the receiver's menu |
| * |
| * @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 Menu getMenu () { |
| checkWidget(); |
| return menu; |
| } |
| /** |
| * Returns the receiver's parent, which must be a <code>Composite</code> |
| * or null when the receiver is a shell that was created with null or |
| * a display for a parent. |
| * |
| * @return the receiver's parent |
| * |
| * @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 Composite getParent () { |
| checkWidget(); |
| return parent; |
| } |
| Control [] getPath () { |
| int count = 0; |
| Shell shell = getShell (); |
| Control control = this; |
| while (control != shell) { |
| count++; |
| control = control.parent; |
| } |
| control = this; |
| Control [] result = new Control [count]; |
| while (control != shell) { |
| result [--count] = control; |
| control = control.parent; |
| } |
| return result; |
| } |
| /** |
| * Returns the receiver's shell. For all controls other than |
| * shells, this simply returns the control's nearest ancestor |
| * shell. Shells return themselves, even if they are children |
| * of other shells. |
| * |
| * @return the receiver's shell |
| * |
| * @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 #getParent |
| */ |
| public Shell getShell () { |
| checkWidget(); |
| return parent.getShell (); |
| } |
| /** |
| * Returns a point describing the receiver's size. The |
| * x coordinate of the result is the width of the receiver. |
| * The y coordinate of the result is the height of the |
| * receiver. |
| * |
| * @return the receiver's size |
| * |
| * @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 Point getSize () { |
| checkWidget(); |
| int topHandle = topHandle (); |
| /* AW |
| int [] argList = {OS.XmNwidth, 0, OS.XmNheight, 0, OS.XmNborderWidth, 0}; |
| OS.XtGetValues (topHandle, argList, argList.length / 2); |
| int borders = argList [5] * 2; |
| return new Point (argList [1] + borders, argList [3] + borders); |
| */ |
| MacRect bounds= new MacRect(); |
| OS.GetControlBounds(topHandle, bounds.getData()); |
| return bounds.getSize(); |
| } |
| /** |
| * Returns the receiver's tool tip text, or null if it has |
| * not been set. |
| * |
| * @return the receiver's tool tip text |
| * |
| * @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 String getToolTipText () { |
| checkWidget(); |
| return toolTipText; |
| } |
| /** |
| * Returns <code>true</code> if the receiver is visible, and |
| * <code>false</code> otherwise. |
| * <p> |
| * If one of the receiver's ancestors is not visible or some |
| * other condition makes the receiver not visible, this method |
| * may still indicate that it is considered visible even though |
| * it may not actually be showing. |
| * </p> |
| * |
| * @return the receiver's visibility state |
| * |
| * @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 boolean getVisible () { |
| checkWidget(); |
| int topHandle = topHandle (); |
| /* AW |
| int [] argList = {OS.XmNmappedWhenManaged, 0}; |
| OS.XtGetValues (topHandle, argList, argList.length / 2); |
| return argList [1] != 0; |
| */ |
| return OS.IsControlVisible(topHandle); |
| } |
| boolean hasFocus () { |
| return (this == getDisplay ().getFocusControl ()); |
| } |
| void hookEvents () { |
| /* AW |
| int windowProc = getDisplay ().windowProc; |
| OS.XtAddEventHandler (handle, OS.KeyPressMask, false, windowProc, SWT.KeyDown); |
| OS.XtAddEventHandler (handle, OS.KeyReleaseMask, false, windowProc, SWT.KeyUp); |
| OS.XtAddEventHandler (handle, OS.ButtonPressMask, false, windowProc, SWT.MouseDown); |
| OS.XtAddEventHandler (handle, OS.ButtonReleaseMask, false, windowProc, SWT.MouseUp); |
| OS.XtAddEventHandler (handle, OS.PointerMotionMask, false, windowProc, SWT.MouseMove); |
| OS.XtAddEventHandler (handle, OS.EnterWindowMask, false, windowProc, SWT.MouseEnter); |
| OS.XtAddEventHandler (handle, OS.LeaveWindowMask, false, windowProc, SWT.MouseExit); |
| OS.XtAddEventHandler (handle, OS.ExposureMask, false, windowProc, SWT.Paint); |
| OS.XtAddEventHandler (handle, OS.FocusChangeMask, false, windowProc, SWT.FocusIn); |
| OS.XtAddCallback (handle, OS.XmNhelpCallback, windowProc, SWT.Help); |
| */ |
| } |
| /** |
| * Invokes platform specific functionality to allocate a new GC handle. |
| * <p> |
| * <b>IMPORTANT:</b> This method is <em>not</em> part of the public |
| * API for <code>Control</code>. It is marked public only so that it |
| * can be shared within the packages provided by SWT. It is not |
| * available on all platforms, and should never be called from |
| * application code. |
| * </p> |
| * |
| * @param data the platform specific GC data |
| * @return the platform specific GC handle |
| * |
| * @private |
| */ |
| public int internal_new_GC (GCData data) { |
| checkWidget(); |
| /* AW |
| if (!OS.XtIsRealized (handle)) { |
| Shell shell = getShell (); |
| shell.realizeWidget (); |
| } |
| int xDisplay = OS.XtDisplay (handle); |
| if (xDisplay == 0) SWT.error(SWT.ERROR_NO_HANDLES); |
| int xWindow = OS.XtWindow (handle); |
| if (xWindow == 0) SWT.error(SWT.ERROR_NO_HANDLES); |
| int xGC = OS.XCreateGC (xDisplay, xWindow, 0, null); |
| if (xGC == 0) SWT.error(SWT.ERROR_NO_HANDLES); |
| OS.XSetGraphicsExposures (xDisplay, xGC, false); |
| int [] argList = {OS.XmNforeground, 0, OS.XmNbackground, 0, OS.XmNcolormap, 0}; |
| OS.XtGetValues (handle, argList, argList.length / 2); |
| */ |
| if (data != null) { |
| data.device = getDisplay (); |
| /* AW |
| data.display = xDisplay; |
| data.drawable = xWindow; |
| data.foreground = argList [1]; |
| data.background = argList [3]; |
| data.fontList = fontList; |
| data.colormap = argList [5]; |
| */ |
| data.foreground = foreground; |
| data.background = background; |
| data.font = font.handle; |
| data.controlHandle = handle; |
| } |
| |
| int wHandle= OS.GetControlOwner(handle); |
| int xGC= OS.GetWindowPort(wHandle); |
| if (xGC == 0) SWT.error(SWT.ERROR_NO_HANDLES); |
| |
| return xGC; |
| } |
| /** |
| * Invokes platform specific functionality to dispose a GC handle. |
| * <p> |
| * <b>IMPORTANT:</b> This method is <em>not</em> part of the public |
| * API for <code>Control</code>. It is marked public only so that it |
| * can be shared within the packages provided by SWT. It is not |
| * available on all platforms, and should never be called from |
| * application code. |
| * </p> |
| * |
| * @param handle the platform specific GC handle |
| * @param data the platform specific GC data |
| * |
| * @private |
| */ |
| public void internal_dispose_GC (int xGC, GCData data) { |
| checkWidget (); |
| /* AW |
| int xDisplay = 0; |
| if (data != null) xDisplay = data.display; |
| if (xDisplay == 0 && handle != 0) xDisplay = OS.XtDisplay (handle); |
| if (xDisplay == 0) SWT.error(SWT.ERROR_NO_HANDLES); |
| OS.XFreeGC (xDisplay, xGC); |
| */ |
| } |
| /** |
| * Returns <code>true</code> if the receiver is enabled and all |
| * of the receiver's ancestors are enabled, and <code>false</code> |
| * otherwise. A disabled control is typically not selectable from the |
| * user interface and draws with an inactive or "grayed" look. |
| * |
| * @return the receiver's enabled state |
| * |
| * @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 #getEnabled |
| */ |
| public boolean isEnabled () { |
| checkWidget(); |
| return getEnabled () && parent.isEnabled (); |
| } |
| /** |
| * Returns <code>true</code> if the receiver has the user-interface |
| * focus, and <code>false</code> otherwise. |
| * |
| * @return the receiver's focus state |
| * |
| * @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 boolean isFocusControl () { |
| checkWidget(); |
| return hasFocus (); |
| } |
| /** |
| * Returns <code>true</code> if the underlying operating |
| * system supports this reparenting, otherwise <code>false</code> |
| * |
| * @return <code>true</code> if the widget can be reparented, otherwise <code>false</code> |
| * |
| * @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 boolean isReparentable () { |
| checkWidget(); |
| return false; |
| } |
| /** |
| * Returns <code>true</code> if the receiver is visible and all |
| * of the receiver's ancestors are visible and <code>false</code> |
| * otherwise. |
| * |
| * @return the receiver's visibility state |
| * |
| * @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 #getVisible |
| */ |
| public boolean isVisible () { |
| checkWidget(); |
| return getVisible () && parent.isVisible (); |
| } |
| void manageChildren () { |
| /* AW |
| OS.XtSetMappedWhenManaged (handle, false); |
| OS.XtManageChild (handle); |
| int [] argList = {OS.XmNborderWidth, 0}; |
| OS.XtGetValues (handle, argList, argList.length / 2); |
| OS.XtResizeWidget (handle, 1, 1, argList [1]); |
| OS.XtSetMappedWhenManaged (handle, true); |
| */ |
| } |
| Decorations menuShell () { |
| return parent.menuShell (); |
| } |
| boolean mnemonicHit (char key) { |
| return false; |
| } |
| boolean mnemonicMatch (char key) { |
| return false; |
| } |
| /** |
| * Moves the receiver above the specified control in the |
| * drawing order. If the argument is null, then the receiver |
| * is moved to the top of the drawing order. The control at |
| * the top of the drawing order will not be covered by other |
| * controls even if they occupy intersecting areas. |
| * |
| * @param the sibling control (or null) |
| * |
| * @exception IllegalArgumentException <ul> |
| * <li>ERROR_INVALID_ARGUMENT - if the control has been disposed</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> |
| */ |
| public void moveAbove (Control control) { |
| checkWidget(); |
| if (control != null && control.isDisposed ()) error(SWT.ERROR_INVALID_ARGUMENT); |
| setZOrder (control, true); |
| } |
| /** |
| * Moves the receiver below the specified control in the |
| * drawing order. If the argument is null, then the receiver |
| * is moved to the bottom of the drawing order. The control at |
| * the bottom of the drawing order will be covered by all other |
| * controls which occupy intersecting areas. |
| * |
| * @param the sibling control (or null) |
| * |
| * @exception IllegalArgumentException <ul> |
| * <li>ERROR_INVALID_ARGUMENT - if the control has been disposed</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> |
| */ |
| public void moveBelow (Control control) { |
| checkWidget(); |
| if (control != null && control.isDisposed ()) error(SWT.ERROR_INVALID_ARGUMENT); |
| setZOrder (control, false); |
| } |
| /** |
| * Causes the receiver to be resized to its preferred size. |
| * For a composite, this involves computing the preferred size |
| * from its layout, if there is 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 #computeSize |
| */ |
| public void pack () { |
| checkWidget(); |
| pack (true); |
| } |
| /** |
| * Causes the receiver to be resized to its preferred size. |
| * For a composite, this involves computing the preferred size |
| * from its layout, if there is one. |
| * <p> |
| * If the changed flag is <code>true</code>, it indicates that the receiver's |
| * <em>contents</em> have changed, therefore any caches that a layout manager |
| * containing the control may have been keeping need to be flushed. When the |
| * control is resized, the changed flag will be <code>false</code>, so layout |
| * manager caches can be retained. |
| * </p> |
| * |
| * @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 #computeSize |
| */ |
| public void pack (boolean changed) { |
| checkWidget(); |
| setSize (computeSize (SWT.DEFAULT, SWT.DEFAULT, changed)); |
| } |
| int processDefaultSelection (Object callData) { |
| postEvent (SWT.DefaultSelection); |
| return 0; |
| } |
| int processFocusIn () { |
| sendEvent (SWT.FocusIn); |
| return 0; |
| } |
| int processFocusOut () { |
| sendEvent (SWT.FocusOut); |
| return 0; |
| } |
| int processHelp (Object callData) { |
| sendHelpEvent (callData); |
| return 0; |
| } |
| int processKeyDown (Object callData) { |
| /* AW |
| XKeyEvent xEvent = new XKeyEvent (); |
| OS.memmove (xEvent, callData, XKeyEvent.sizeof); |
| */ |
| MacEvent macEvent = (MacEvent) callData; |
| /* AW |
| if (xEvent.keycode != 0) { |
| */ |
| int keyCode= macEvent.getKeyCode(); |
| if (Display.translateKey(keyCode) != 0) { |
| sendKeyEvent (SWT.KeyDown, macEvent); |
| } else { |
| sendIMEKeyEvent (SWT.KeyDown, macEvent); |
| } |
| return 0; |
| } |
| int processKeyUp (Object callData) { |
| /* AW |
| XKeyEvent xEvent = new XKeyEvent (); |
| OS.memmove (xEvent, callData, XKeyEvent.sizeof); |
| */ |
| MacEvent macEvent = (MacEvent) callData; |
| int keyCode= macEvent.getKeyCode(); |
| if (Display.translateKey(keyCode) != 0) { |
| sendKeyEvent (SWT.KeyUp, macEvent); |
| } else { |
| sendIMEKeyEvent (SWT.KeyUp, macEvent); |
| } |
| return 0; |
| } |
| int processModify (Object callData) { |
| sendEvent (SWT.Modify); |
| return 0; |
| } |
| int processMouseDown (Object callData) { |
| Display display = getDisplay (); |
| Shell shell = getShell (); |
| display.hideToolTip (); |
| /* AW |
| XButtonEvent xEvent = new XButtonEvent (); |
| OS.memmove (xEvent, callData, XButtonEvent.sizeof); |
| */ |
| MacEvent xEvent= (MacEvent) callData; |
| int button= xEvent.getButton(); |
| sendMouseEvent (SWT.MouseDown, button, xEvent); |
| if (button == 2 && hooks (SWT.DragDetect)) { |
| sendEvent (SWT.DragDetect); |
| } |
| if (button == 3 && menu != null) { |
| /* AW |
| OS.XmProcessTraversal (handle, OS.XmTRAVERSE_CURRENT); |
| menu.setVisible (true); |
| */ |
| } |
| int clickTime = display.getDoubleClickTime (); |
| int lastTime = display.lastTime, eventTime = xEvent.getWhen(); |
| int lastButton = display.lastButton, eventButton = button; |
| if (lastButton == eventButton && lastTime != 0 && Math.abs (lastTime - eventTime) <= clickTime) { |
| sendMouseEvent (SWT.MouseDoubleClick, eventButton, xEvent); |
| } |
| display.lastTime = eventTime == 0 ? 1 : eventTime; |
| display.lastButton = eventButton; |
| |
| /* |
| * It is possible that the shell may be |
| * disposed at this point. If this happens |
| * don't send the activate and deactivate |
| * events. |
| */ |
| if (!shell.isDisposed ()) { |
| shell.setActiveControl (this); |
| } |
| return 0; |
| } |
| int processMouseEnter (Object callData) { |
| /* AW |
| XCrossingEvent xEvent = new XCrossingEvent (); |
| OS.memmove (xEvent, callData, XCrossingEvent.sizeof); |
| if (xEvent.mode != OS.NotifyNormal) return 0; |
| if (xEvent.subwindow != 0) return 0; |
| */ |
| MacEvent me= (MacEvent) callData; |
| Event event = new Event (); |
| event.x = me.getX(); |
| event.y = me.getY(); |
| postEvent (SWT.MouseEnter, event); |
| return 0; |
| } |
| int processMouseMove (Object callData) { |
| Display display = getDisplay (); |
| display.addMouseHoverTimeOut (handle); |
| sendMouseEvent (SWT.MouseMove, 0, (MacEvent)callData); |
| return 0; |
| } |
| int processMouseExit (Object callData) { |
| Display display = getDisplay (); |
| display.removeMouseHoverTimeOut (); |
| display.hideToolTip (); |
| /* AW |
| XCrossingEvent xEvent = new XCrossingEvent (); |
| OS.memmove (xEvent, callData, XCrossingEvent.sizeof); |
| if (xEvent.mode != OS.NotifyNormal) return 0; |
| if (xEvent.subwindow != 0) return 0; |
| */ |
| MacEvent me= (MacEvent) callData; |
| Event event = new Event (); |
| event.x = me.getX(); |
| event.y = me.getY(); |
| postEvent (SWT.MouseExit, event); |
| return 0; |
| } |
| int processMouseHover (Object callData) { |
| Display display = getDisplay (); |
| Event event = new Event (); |
| Point local = toControl (display.getCursorLocation ()); |
| event.x = local.x; event.y = local.y; |
| postEvent (SWT.MouseHover, event); |
| display.showToolTip (handle, toolTipText); |
| return 0; |
| } |
| int processMouseUp (Object callData) { |
| Display display = getDisplay (); |
| display.hideToolTip (); |
| /* AW |
| XButtonEvent xEvent = new XButtonEvent (); |
| OS.memmove (xEvent, callData, XButtonEvent.sizeof); |
| sendMouseEvent (SWT.MouseUp, xEvent.button, xEvent); |
| */ |
| MacEvent xEvent = (MacEvent) callData; |
| sendMouseEvent (SWT.MouseUp, xEvent.getButton(), xEvent); |
| return 0; |
| } |
| int processPaint (Object callData) { |
| if (!hooks (SWT.Paint)) return 0; |
| |
| // AW |
| // calculate damage rect for this Control |
| MacControlEvent me= (MacControlEvent) callData; |
| int updateRegion= me.getDamageRegionHandle(); |
| |
| MacRect bounds= new MacRect(); |
| OS.GetControlBounds(me.getControlHandle(), bounds.getData()); |
| int x= bounds.getX(); |
| int y= bounds.getY(); |
| int contentRgn= OS.NewRgn(); |
| OS.RectRgn(contentRgn, bounds.getData()); |
| if (updateRegion != 0) |
| OS.SectRgn(contentRgn, updateRegion, contentRgn); |
| OS.GetRegionBounds(contentRgn, bounds.getData()); |
| Rectangle r= bounds.toRectangle(); |
| OS.DisposeRgn(contentRgn); |
| r.x-= x; |
| r.y-= y; |
| // AW |
| |
| Event event = new Event (); |
| /* AW |
| event.count = xEvent.count; |
| event.time = OS.XtLastTimestampProcessed (xDisplay); |
| event.x = xEvent.x; event.y = xEvent.y; |
| event.width = xEvent.width; event.height = xEvent.height; |
| */ |
| event.x = r.x; event.y = r.y; |
| event.width = r.width; event.height = r.height; |
| GC gc = event.gc = new GC (this); |
| /* AW |
| XRectangle rect = new XRectangle (); |
| rect.x = (short) xEvent.x; rect.y = (short) xEvent.y; |
| rect.width = (short) xEvent.width; rect.height = (short) xEvent.height; |
| OS.XSetClipRectangles (xDisplay, gc.handle, 0, 0, rect, 1, OS.Unsorted); |
| */ |
| gc.carbon_focus(); |
| |
| // erase background |
| if ((state & CANVAS) != 0) { |
| if ((style & SWT.NO_BACKGROUND) == 0) { |
| gc.fillRectangle(r); |
| } |
| } |
| |
| sendEvent (SWT.Paint, event); |
| |
| if (!gc.isDisposed ()) { |
| gc.carbon_unfocus (); |
| gc.dispose (); |
| } |
| event.gc = null; |
| return 0; |
| } |
| int processResize (Object callData) { |
| sendEvent (SWT.Resize); |
| // widget could be disposed at this point |
| return 0; |
| } |
| int processSelection (Object callData) { |
| postEvent (SWT.Selection); |
| return 0; |
| } |
| int processSetFocus (Object callData) { |
| /* |
| * Ignore focus change events when the window getting or losing |
| * focus is a menu. Because XmGetFocusWidget() does not answer |
| * the menu shell (it answers the menu parent), it is necessary |
| * to use XGetInputFocus() to get the real X focus window. |
| */ |
| /* AW |
| int xDisplay = xEvent.display; |
| if (xDisplay == 0) return 0; |
| int [] unused = new int [1], xWindow = new int [1]; |
| OS.XGetInputFocus (xDisplay, xWindow, unused); |
| if (xWindow [0] != 0) { |
| int widget = OS.XtWindowToWidget (xDisplay, xWindow [0]); |
| if (widget != 0 && OS.XtClass (widget) == OS.XmMenuShellWidgetClass ()) return 0; |
| } |
| */ |
| /* Process the focus change for the widget */ |
| |
| Shell shell = getShell (); |
| Boolean b = (Boolean) callData; |
| if (b.booleanValue ()) { |
| |
| processFocusIn (); |
| // widget could be disposed at this point |
| /* |
| * It is possible that the shell may be |
| * disposed at this point. If this happens |
| * don't send the activate and deactivate |
| * events. |
| */ |
| if (!shell.isDisposed ()) { |
| shell.setActiveControl (this); |
| } |
| } else { |
| Display display = getDisplay (); |
| |
| processFocusOut (); |
| // widget could be disposed at this point |
| /* |
| * It is possible that the shell may be |
| * disposed at this point. If this happens |
| * don't send the activate and deactivate |
| * events. |
| */ |
| if (!shell.isDisposed ()) { |
| Control control = display.getFocusControl (); |
| if (control == null || shell != control.getShell () ) { |
| shell.setActiveControl (null); |
| } |
| } |
| } |
| return 0; |
| } |
| void propagateChildren (boolean enabled) { |
| propagateWidget (enabled); |
| } |
| void propagateWidget (boolean enabled) { |
| propagateHandle (enabled, handle); |
| } |
| void realizeChildren () { |
| if (!isEnabled ()) propagateWidget (false); |
| } |
| /** |
| * Causes the entire bounds of the receiver to be marked |
| * as needing to be redrawn. The next time a paint request |
| * is processed, the control will be completely painted. |
| * |
| * @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 #update |
| */ |
| public void redraw () { |
| checkWidget(); |
| redrawWidget (0, 0, 0, 0, false); |
| } |
| /** |
| * Causes the rectangular area of the receiver specified by |
| * the arguments to be marked as needing to be redrawn. |
| * The next time a paint request is processed, that area of |
| * the receiver will be painted. If the <code>all</code> flag |
| * is <code>true</code>, any children of the receiver which |
| * intersect with the specified area will also paint their |
| * intersecting areas. If the <code>all</code> flag is |
| * <code>false</code>, the children will not be painted. |
| * |
| * @param x the x coordinate of the area to draw |
| * @param y the y coordinate of the area to draw |
| * @param width the width of the area to draw |
| * @param height the height of the area to draw |
| * @param all <code>true</code> if children should redraw, and <code>false</code> otherwise |
| * |
| * @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 #update |
| */ |
| public void redraw (int x, int y, int width, int height, boolean all) { |
| checkWidget (); |
| if (width <= 0 || height <= 0) return; |
| redrawWidget (x, y, width, height, all); |
| } |
| void redrawWidget (int x, int y, int width, int height, boolean all) { |
| redrawHandle (x, y, width, height, handle, all); |
| } |
| void releaseWidget () { |
| super.releaseWidget (); |
| Display display = getDisplay (); |
| display.releaseToolTipHandle (handle); |
| toolTipText = null; |
| if (menu != null && !menu.isDisposed ()) { |
| menu.dispose (); |
| } |
| menu = null; |
| /* AW |
| OS.XmImUnregister (handle); |
| */ |
| parent = null; |
| layoutData = null; |
| } |
| /** |
| * Removes the listener from the collection of listeners who will |
| * be notified when the control is moved or resized. |
| * |
| * @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 ControlListener |
| * @see #addControlListener |
| */ |
| public void removeControlListener (ControlListener listener) { |
| checkWidget(); |
| if (listener == null) error (SWT.ERROR_NULL_ARGUMENT); |
| if (eventTable == null) return; |
| eventTable.unhook (SWT.Move, listener); |
| eventTable.unhook (SWT.Resize, listener); |
| } |
| /** |
| * Removes the listener from the collection of listeners who will |
| * be notified when the control gains or loses focus. |
| * |
| * @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 FocusListener |
| * @see #addFocusListener |
| */ |
| public void removeFocusListener(FocusListener listener) { |
| checkWidget(); |
| if (listener == null) error (SWT.ERROR_NULL_ARGUMENT); |
| if (eventTable == null) return; |
| eventTable.unhook(SWT.FocusIn, listener); |
| eventTable.unhook(SWT.FocusOut, listener); |
| } |
| /** |
| * Removes the listener from the collection of listeners who will |
| * be notified when the help events are generated for the control. |
| * |
| * @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 HelpListener |
| * @see #addHelpListener |
| */ |
| public void removeHelpListener (HelpListener listener) { |
| checkWidget(); |
| if (listener == null) error (SWT.ERROR_NULL_ARGUMENT); |
| if (eventTable == null) return; |
| eventTable.unhook (SWT.Help, listener); |
| } |
| /** |
| * Removes the listener from the collection of listeners who will |
| * be notified when keys are pressed and released on the system keyboard. |
| * |
| * @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 KeyListener |
| * @see #addKeyListener |
| */ |
| public void removeKeyListener(KeyListener listener) { |
| checkWidget(); |
| if (listener == null) error (SWT.ERROR_NULL_ARGUMENT); |
| if (eventTable == null) return; |
| eventTable.unhook(SWT.KeyUp, listener); |
| eventTable.unhook(SWT.KeyDown, listener); |
| } |
| /** |
| * Removes the listener from the collection of listeners who will |
| * be notified when mouse buttons are pressed and released. |
| * |
| * @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 MouseListener |
| * @see #addMouseListener |
| */ |
| public void removeMouseListener(MouseListener listener) { |
| checkWidget(); |
| if (listener == null) error (SWT.ERROR_NULL_ARGUMENT); |
| if (eventTable == null) return; |
| eventTable.unhook(SWT.MouseDown, listener); |
| eventTable.unhook(SWT.MouseUp, listener); |
| eventTable.unhook(SWT.MouseDoubleClick, listener); |
| } |
| /** |
| * Removes the listener from the collection of listeners who will |
| * be notified when the mouse moves. |
| * |
| * @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 MouseMoveListener |
| * @see #addMouseMoveListener |
| */ |
| public void removeMouseMoveListener(MouseMoveListener listener) { |
| checkWidget(); |
| if (listener == null) error (SWT.ERROR_NULL_ARGUMENT); |
| if (eventTable == null) return; |
| eventTable.unhook(SWT.MouseMove, listener); |
| } |
| /** |
| * Removes the listener from the collection of listeners who will |
| * be notified when the mouse passes or hovers over controls. |
| * |
| * @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 MouseTrackListener |
| * @see #addMouseTrackListener |
| */ |
| public void removeMouseTrackListener(MouseTrackListener listener) { |
| checkWidget(); |
| if (listener == null) error (SWT.ERROR_NULL_ARGUMENT); |
| if (eventTable == null) return; |
| eventTable.unhook (SWT.MouseEnter, listener); |
| eventTable.unhook (SWT.MouseExit, listener); |
| eventTable.unhook (SWT.MouseHover, listener); |
| } |
| /** |
| * Removes the listener from the collection of listeners who will |
| * be notified when the receiver needs to be painted. |
| * |
| * @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 PaintListener |
| * @see #addPaintListener |
| */ |
| public void removePaintListener(PaintListener listener) { |
| checkWidget(); |
| if (listener == null) error (SWT.ERROR_NULL_ARGUMENT); |
| if (eventTable == null) return; |
| eventTable.unhook(SWT.Paint, listener); |
| }/** |
| * Removes the listener from the collection of listeners who will |
| * be notified when traversal events occur. |
| * |
| * @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 TraverseListener |
| * @see #addTraverseListener |
| */ |
| public void removeTraverseListener(TraverseListener listener) { |
| checkWidget(); |
| if (listener == null) error (SWT.ERROR_NULL_ARGUMENT); |
| if (eventTable == null) return; |
| eventTable.unhook (SWT.Traverse, listener); |
| } |
| void sendHelpEvent (Object callData) { |
| Control control = this; |
| while (control != null) { |
| if (control.hooks (SWT.Help)) { |
| control.postEvent (SWT.Help); |
| return; |
| } |
| control = control.parent; |
| } |
| } |
| byte [] sendIMEKeyEvent (int type, /* AW XKeyEvent */ MacEvent xEvent) { |
| /* |
| * Bug in Motif. On Linux only, XmImMbLookupString () does not return |
| * XBufferOverflow as the status if the buffer is too small. The fix |
| * is to pass a large buffer. |
| */ |
| /* AW |
| byte [] buffer = new byte [512]; |
| int [] status = new int [1], unused = new int [1]; |
| int length = OS.XmImMbLookupString (handle, xEvent, buffer, buffer.length, unused, status); |
| if (status [0] == OS.XBufferOverflow) { |
| buffer = new byte [length]; |
| length = OS.XmImMbLookupString (handle, xEvent, buffer, length, unused, status); |
| } |
| if (length == 0) return null; |
| */ |
| |
| byte [] buffer = new byte[1]; |
| buffer[0]= xEvent.getCharacter(); |
| |
| /* Convert from MBCS to UNICODE and send the event */ |
| /* Use the character encoding for the default locale */ |
| /* AW |
| char [] result = Converter.mbcsToWcs (null, buffer); |
| */ |
| char [] result= new char[1]; |
| result[0]= (char) buffer[0]; |
| |
| int index = 0; |
| while (index < result.length) { |
| if (result [index] == 0) break; |
| Event event = new Event (); |
| event.time = xEvent.getWhen(); |
| event.character = result [index]; |
| setInputState (event, xEvent); |
| postEvent (type, event); |
| index++; |
| } |
| return buffer; |
| } |
| void sendKeyEvent (int type, MacEvent xEvent) { |
| Event event = new Event (); |
| /* AW |
| event.time = xEvent.time; |
| */ |
| event.time = xEvent.getWhen(); |
| setKeyState (event, xEvent); |
| postEvent (type, event); |
| // Control control = this; |
| // if ((state & CANVAS) != 0) { |
| // if ((style & SWT.NO_FOCUS) != 0) { |
| // Display display = getDisplay (); |
| // control = display.getFocusControl (); |
| // } |
| // } |
| // if (control != null) { |
| // control.postEvent (type, event); |
| // } |
| } |
| void sendMouseEvent (int type, int button, MacEvent xEvent) { |
| Event event = new Event (); |
| /* AW |
| event.time = xEvent.time; |
| */ |
| event.time = xEvent.getWhen(); |
| event.button = button; |
| /* AW |
| event.x = xEvent.x; event.y = xEvent.y; |
| */ |
| Point ml= MacUtil.toControl(handle, xEvent.getWhere2()); |
| event.x = ml.x; event.y = ml.y; |
| setInputState (event, xEvent); |
| postEvent (type, event); |
| } |
| /** |
| * Sets the receiver's background color to the color specified |
| * by the argument, or to the default system color for the control |
| * if the argument is null. |
| * |
| * @param color the new color (or null) |
| * |
| * @exception IllegalArgumentException <ul> |
| * <li>ERROR_INVALID_ARGUMENT - if the argument has been disposed</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> |
| */ |
| public void setBackground (Color color) { |
| checkWidget(); |
| int pixel = -1; |
| if (color != null) { |
| if (color.isDisposed()) SWT.error(SWT.ERROR_INVALID_ARGUMENT); |
| pixel = color.handle; |
| } |
| setBackgroundPixel (pixel); |
| } |
| void setBackgroundPixel (int pixel) { |
| /* AW |
| int [] argList = {OS.XmNforeground, 0, OS.XmNhighlightColor, 0}; |
| OS.XtGetValues (handle, argList, argList.length / 2); |
| OS.XmChangeColor (handle, pixel); |
| OS.XtSetValues (handle, argList, argList.length / 2); |
| */ |
| if (background == pixel) return; |
| background = pixel; |
| redrawHandle(0, 0, 0, 0, handle, false); |
| } |
| /** |
| * Sets the receiver's size and location to the rectangular |
| * area specified by the arguments. The <code>x</code> and |
| * <code>y</code> arguments are relative to the receiver's |
| * parent (or its display if its parent is null). |
| * <p> |
| * Note: Attempting to set the width or height of the |
| * receiver to a negative number will cause that |
| * value to be set to zero instead. |
| * </p> |
| * |
| * @param x the new x coordinate for the receiver |
| * @param y the new y coordinate for the receiver |
| * @param width the new width for the receiver |
| * @param height the new height for the receiver |
| * |
| * @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 setBounds (int x, int y, int width, int height) { |
| checkWidget(); |
| /* |
| * Feature in Motif. Motif will not allow a window |
| * to have a zero width or zero height. The fix is |
| * to ensure these values are never zero. |
| */ |
| /* AW |
| int [] argList = { |
| OS.XmNx, 0, // 1 |
| OS.XmNy, 0, // 3 |
| OS.XmNwidth, 0, // 5 |
| OS.XmNheight, 0, // 7 |
| OS.XmNborderWidth, 0, // 9 |
| }; |
| OS.XtGetValues (topHandle, argList, argList.length / 2); |
| int newWidth = Math.max (width - (argList [9] * 2), 1); |
| int newHeight = Math.max (height - (argList [9] * 2), 1); |
| boolean sameOrigin = (x == (short) argList [1]) && (y == (short) argList [3]); |
| boolean sameExtent = (newWidth == argList [5]) && (newHeight == argList [7]); |
| if (sameOrigin && sameExtent) return; |
| OS.XtConfigureWidget (topHandle, x, y, newWidth, newHeight, argList [9]); |
| */ |
| int topHandle = topHandle (); |
| width = Math.max(width, 0); |
| height = Math.max(height, 0); |
| short[] bounds= new short[4]; |
| short[] pbounds= new short[4]; |
| OS.GetControlBounds(topHandle, bounds); |
| OS.GetControlBounds(parent.handle, pbounds); |
| boolean sameOrigin = (bounds[1]-pbounds[1]) == x && (bounds[0]-pbounds[0]) == y; |
| boolean sameExtent = (bounds[3]-bounds[1]) == width && (bounds[2]-bounds[0]) == height; |
| if (sameOrigin && sameExtent) return; |
| internalSetBounds(topHandle, bounds, pbounds[1]+x, pbounds[0]+y, width, height, !sameExtent); |
| if (!sameOrigin) sendEvent (SWT.Move); |
| if (!sameExtent) sendEvent (SWT.Resize); |
| } |
| /** |
| * Sets the receiver's size and location to the rectangular |
| * area specified by the argument. The <code>x</code> and |
| * <code>y</code> fields of the rectangle are relative to |
| * the receiver's parent (or its display if its parent is null). |
| * <p> |
| * Note: Attempting to set the width or height of the |
| * receiver to a negative number will cause that |
| * value to be set to zero instead. |
| * </p> |
| * |
| * @param rect the new bounds for the receiver |
| * |
| * @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 setBounds (Rectangle rect) { |
| if (rect == null) error (SWT.ERROR_NULL_ARGUMENT); |
| setBounds (rect.x, rect.y, rect.width, rect.height); |
| } |
| /** |
| * If the argument is <code>true</code>, causes the receiver to have |
| * all mouse events delivered to it until the method is called with |
| * <code>false</code> as the argument. |
| * |
| * @param capture <code>true</code> to capture the mouse, and <code>false</code> to release it |
| * |
| * @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 setCapture (boolean capture) { |
| checkWidget(); |
| System.out.println("Control.setCapture: nyi"); |
| /* AW |
| int display = OS.XtDisplay (handle); |
| if (display == 0) return; |
| if (capture) { |
| int window = OS.XtWindow (handle); |
| if (window == 0) return; |
| OS.XGrabPointer ( |
| display, |
| window, |
| 0, |
| OS.ButtonPressMask | OS.ButtonReleaseMask | OS.PointerMotionMask, |
| OS.GrabModeAsync, |
| OS.GrabModeAsync, |
| OS.None, |
| OS.None, |
| OS.CurrentTime); |
| } else { |
| OS.XUngrabPointer (display, OS.CurrentTime); |
| } |
| */ |
| } |
| /** |
| * Sets the receiver's cursor to the cursor specified by the |
| * argument, or to the default cursor for that kind of control |
| * if the argument is null. |
| * <p> |
| * When the mouse pointer passes over a control its appearance |
| * is changed to match the control's cursor. |
| * </p> |
| * |
| * @param cursor the new cursor (or null) |
| * |
| * @exception IllegalArgumentException <ul> |
| * <li>ERROR_INVALID_ARGUMENT - if the argument has been disposed</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> |
| */ |
| public void setCursor (Cursor cursor) { |
| checkWidget(); |
| /* AW |
| int display = OS.XtDisplay (handle); |
| if (display == 0) return; |
| int window = OS.XtWindow (handle); |
| if (window == 0) { |
| if (!OS.XtIsRealized (handle)) getShell ().realizeWidget (); |
| window = OS.XtWindow (handle); |
| if (window == 0) return; |
| } |
| if (cursor == null) { |
| OS.XUndefineCursor (display, window); |
| } else { |
| if (cursor.isDisposed()) SWT.error(SWT.ERROR_INVALID_ARGUMENT); |
| int xCursor = cursor.handle; |
| OS.XDefineCursor (display, window, xCursor); |
| OS.XFlush (display); |
| } |
| */ |
| } |
| /** |
| * Enables the receiver if the argument is <code>true</code>, |
| * and disables it otherwise. A disabled control is typically |
| * not selectable from the user interface and draws with an |
| * inactive or "grayed" look. |
| * |
| * @param enabled the new enabled state |
| * |
| * @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 setEnabled (boolean enabled) { |
| checkWidget(); |
| enableWidget (enabled); |
| if (!enabled || (isEnabled () && enabled)) { |
| propagateChildren (enabled); |
| } |
| } |
| /** |
| * Causes the receiver to have the <em>keyboard focus</em>, |
| * such that all keyboard events will be delivered to it. |
| * |
| * @return <code>true</code> if the control got focus, and <code>false</code> if it was unable to. |
| * |
| * @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 #forceFocus |
| */ |
| public boolean setFocus () { |
| checkWidget(); |
| return forceFocus (); |
| } |
| /** |
| * Sets the font that the receiver will use to paint textual information |
| * to the font specified by the argument, or to the default font for that |
| * kind of control if the argument is null. |
| * |
| * @param font the new font (or null) |
| * |
| * @exception IllegalArgumentException <ul> |
| * <li>ERROR_INVALID_ARGUMENT - if the argument has been disposed</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> |
| */ |
| public void setFont (Font font) { |
| checkWidget(); |
| if (font == null) font = defaultFont (); |
| if (font.isDisposed()) SWT.error(SWT.ERROR_INVALID_ARGUMENT); |
| this.font = font; |
| /* |
| * Feature in Motif. Setting the font in a widget |
| * can cause the widget to automatically resize in |
| * the OS. This behavior is unwanted. The fix is |
| * to force the widget to resize to original size |
| * after every font change. |
| */ |
| /* AW |
| int [] argList1 = {OS.XmNwidth, 0, OS.XmNheight, 0, OS.XmNborderWidth, 0}; |
| OS.XtGetValues (handle, argList1, argList1.length / 2); |
| */ |
| |
| /* Set the font list */ |
| int fontHandle = fontHandle (); |
| /* AW |
| int [] argList2 = {OS.XmNfontList, fontList}; |
| OS.XtSetValues (fontHandle, argList2, argList2.length / 2); |
| */ |
| if (OS.SetControlFontStyle(fontHandle, font.handle.fID, font.handle.fSize, font.handle.fFace) != OS.kNoErr) |
| ; //System.out.println("Control.setFont("+this+"): error"); |
| |
| /* Restore the widget size */ |
| /* AW |
| OS.XtSetValues (handle, argList1, argList1.length / 2); |
| */ |
| } |
| /** |
| * Sets the receiver's foreground color to the color specified |
| * by the argument, or to the default system color for the control |
| * if the argument is null. |
| * |
| * @param color the new color (or null) |
| * |
| * @exception IllegalArgumentException <ul> |
| * <li>ERROR_INVALID_ARGUMENT - if the argument has been disposed</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> |
| */ |
| public void setForeground (Color color) { |
| checkWidget(); |
| /* AW |
| if (color == null) { |
| setForegroundPixel (defaultForeground ()); |
| } else { |
| if (color.isDisposed()) SWT.error(SWT.ERROR_INVALID_ARGUMENT); |
| setForegroundPixel (color.handle.pixel); |
| } |
| */ |
| int pixel = -1; |
| if (color != null) { |
| if (color.isDisposed()) SWT.error(SWT.ERROR_INVALID_ARGUMENT); |
| pixel = color.handle; |
| } |
| setForegroundPixel (pixel); |
| } |
| void setForegroundPixel (int pixel) { |
| /* AW |
| int [] argList = {OS.XmNforeground, pixel}; |
| OS.XtSetValues (handle, argList, argList.length / 2); |
| int xDisplay = OS.XtDisplay (handle); |
| if (xDisplay == 0) return; |
| int xWindow = OS.XtWindow (handle); |
| if (xWindow == 0) return; |
| OS.XClearArea (xDisplay, xWindow, 0, 0, 0, 0, true); |
| */ |
| if (foreground == pixel) return; |
| foreground = pixel; |
| redrawHandle(0, 0, 0, 0, handle, false); |
| } |
| void setGrabCursor (int cursor) { |
| System.out.println("Control.setGrabCursor: nyi"); |
| } |
| /** |
| * Sets the layout data associated with the receiver to the argument. |
| * |
| * @param layoutData the new layout data for the receiver. |
| * |
| * @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 setLayoutData (Object layoutData) { |
| checkWidget(); |
| this.layoutData = layoutData; |
| } |
| /** |
| * Sets the receiver's location to the point specified by |
| * the arguments which are relative to the receiver's |
| * parent (or its display if its parent is null). |
| * |
| * @param x the new x coordinate for the receiver |
| * @param y the new y coordinate for the receiver |
| * |
| * @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 setLocation (int x, int y) { |
| checkWidget(); |
| /* AW |
| int [] argList = {OS.XmNx, 0, OS.XmNy, 0}; |
| OS.XtGetValues (topHandle, argList, argList.length / 2); |
| boolean sameOrigin = (x == (short) argList [1]) && (y == (short) argList [3]); |
| if (sameOrigin) return; |
| OS.XtMoveWidget (topHandle, x, y); |
| if (!sameOrigin) sendEvent (SWT.Move); |
| */ |
| int topHandle = topHandle (); |
| short[] bounds= new short[4]; |
| short[] pbounds= new short[4]; |
| OS.GetControlBounds(topHandle, bounds); |
| OS.GetControlBounds(parent.handle, pbounds); |
| boolean sameOrigin = (x == (bounds[1]-pbounds[1])) && (y == (bounds[0]-pbounds[0])); |
| if (sameOrigin) return; |
| internalSetBounds(topHandle, bounds, pbounds[1]+x, pbounds[0]+y, bounds[3]-bounds[1], bounds[2]-bounds[0], false); |
| sendEvent (SWT.Move); |
| } |
| /** |
| * Sets the receiver's location to the point specified by |
| * the argument which is relative to the receiver's |
| * parent (or its display if its parent is null). |
| * |
| * @param location the new location for the receiver |
| * |
| * @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 setLocation (Point location) { |
| if (location == null) error (SWT.ERROR_NULL_ARGUMENT); |
| setLocation (location.x, location.y); |
| } |
| /** |
| * Sets the receiver's pop up menu to the argument. |
| * All controls may optionally have a pop up |
| * menu that is displayed when the user requests one for |
| * the control. The sequence of key strokes, button presses |
| * and/or button releases that are used to request a pop up |
| * menu is platform specific. |
| * |
| * @param menu the new pop up menu |
| * |
| * @exception IllegalArgumentException <ul> |
| * <li>ERROR_MENU_NOT_POP_UP - the menu is not a pop up menu</li> |
| * <li>ERROR_INVALID_PARENT - if the menu is not in the same widget tree</li> |
| * <li>ERROR_INVALID_ARGUMENT - if the menu has been disposed</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> |
| */ |
| public void setMenu (Menu menu) { |
| checkWidget(); |
| if (menu != null) { |
| if (menu.isDisposed()) SWT.error(SWT.ERROR_INVALID_ARGUMENT); |
| if ((menu.style & SWT.POP_UP) == 0) { |
| error (SWT.ERROR_MENU_NOT_POP_UP); |
| } |
| if (menu.parent != menuShell ()) { |
| error (SWT.ERROR_INVALID_PARENT); |
| } |
| } |
| this.menu = menu; |
| } |
| |
| /** |
| * Changes the parent of the widget to be the one provided if |
| * the underlying operating system supports this feature. |
| * Answers <code>true</code> if the parent is successfully changed. |
| * |
| * @param parent the new parent for the control. |
| * @return <code>true</code> if the parent is changed and <code>false</code> otherwise. |
| * |
| * @exception IllegalArgumentException <ul> |
| * <li>ERROR_INVALID_ARGUMENT - if the argument has been disposed</li> |
| * </ul> |
| * @exception SWTError <ul> |
| * <li>ERROR_THREAD_INVALID_ACCESS when called from the wrong thread</li> |
| * <li>ERROR_WIDGET_DISPOSED when the widget has been disposed</li> |
| * </ul> |
| */ |
| public boolean setParent (Composite parent) { |
| checkWidget(); |
| if (parent.isDisposed()) SWT.error(SWT.ERROR_INVALID_ARGUMENT); |
| return false; |
| } |
| |
| /** |
| * If the argument is <code>false</code>, causes subsequent drawing |
| * operations in the receiver to be ignored. No drawing of any kind |
| * can occur in the receiver until the flag is set to true. |
| * Graphics operations that occurred while the flag was |
| * <code>false</code> are lost. When the flag is set to <code>true</code>, |
| * the entire widget is marked as needing to be redrawn. |
| * <p> |
| * Note: This operation is a hint and may not be supported on some |
| * platforms or for some widgets. |
| * </p> |
| * |
| * @param redraw the new redraw state |
| * |
| * @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 #redraw |
| * @see #update |
| */ |
| public void setRedraw (boolean redraw) { |
| checkWidget(); |
| /* |
| int topHandle = topHandle (); |
| OS.SetControlVisibility(topHandle, redraw, redraw); |
| */ |
| } |
| /** |
| * Sets the receiver's size to the point specified by the arguments. |
| * <p> |
| * Note: Attempting to set the width or height of the |
| * receiver to a negative number will cause that |
| * value to be set to zero instead. |
| * </p> |
| * |
| * @param width the new width for the receiver |
| * @param height the new height for the receiver |
| * |
| * @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 setSize (int width, int height) { |
| checkWidget(); |
| /* |
| int [] argList = {OS.XmNwidth, 0, OS.XmNheight, 0, OS.XmNborderWidth, 0}; |
| OS.XtGetValues (topHandle, argList, argList.length / 2); |
| int newWidth = Math.max (width - (argList [5] * 2), 1); |
| int newHeight = Math.max (height - (argList [5] * 2), 1); |
| boolean sameExtent = (newWidth == argList [1]) && (newHeight == argList [3]); |
| OS.XtResizeWidget (topHandle, newWidth, newHeight, argList [5]); |
| */ |
| int topHandle = topHandle (); |
| width = Math.max(width, 0); |
| height = Math.max(height, 0); |
| short[] bounds= new short[4]; |
| OS.GetControlBounds(topHandle, bounds); |
| boolean sameExtent = (bounds[3]-bounds[1]) == width && (bounds[2]-bounds[0]) == height; |
| if (sameExtent) return; |
| internalSetBounds(topHandle, bounds, bounds[1], bounds[0], width, height, true); |
| sendEvent (SWT.Resize); |
| } |
| /** |
| * Sets the receiver's size to the point specified by the argument. |
| * <p> |
| * Note: Attempting to set the width or height of the |
| * receiver to a negative number will cause them to be |
| * set to zero instead. |
| * </p> |
| * |
| * @param size the new size for the receiver |
| * @param height the new height for the receiver |
| * |
| * @exception IllegalArgumentException <ul> |
| * <li>ERROR_NULL_ARGUMENT - if the point 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> |
| */ |
| public void setSize (Point size) { |
| if (size == null) error (SWT.ERROR_NULL_ARGUMENT); |
| setSize (size.x, size.y); |
| } |
| /** |
| * Sets the receiver's tool tip text to the argument, which |
| * may be null indicating that no tool tip text should be shown. |
| * |
| * @param string the new tool tip text (or null) |
| * |
| * @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 setToolTipText (String string) { |
| checkWidget(); |
| toolTipText = string; |
| } |
| /** |
| * Marks the receiver as visible if the argument is <code>true</code>, |
| * and marks it invisible otherwise. |
| * <p> |
| * If one of the receiver's ancestors is not visible or some |
| * other condition makes the receiver not visible, marking |
| * it visible may not actually cause it to be displayed. |
| * </p> |
| * |
| * @param visible the new visibility state |
| * |
| * @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 setVisible (boolean visible) { |
| checkWidget(); |
| int topHandle = topHandle (); |
| /* AW |
| int [] argList = {OS.XmNmappedWhenManaged, 0}; |
| OS.XtGetValues (topHandle, argList, argList.length / 2); |
| if ((argList [1] != 0) == visible) return; |
| OS.XtSetMappedWhenManaged (topHandle, visible); |
| */ |
| if (OS.IsControlVisible(topHandle) != visible) { |
| OS.SetControlVisibility(topHandle, visible, true); |
| sendEvent (visible ? SWT.Show : SWT.Hide); |
| if (visible) |
| redraw(); |
| } |
| } |
| void setZOrder (Control control, boolean above) { |
| |
| //System.out.println("Control.setZOrder(" + parent + "): move " + this + (above?" above ":" below ") + control); |
| |
| if (control != null && control.parent != parent) |
| return; |
| |
| int thisHandle= topHandle(); |
| if (parent == null) |
| error (SWT.ERROR_INVALID_PARENT); |
| int destHandle= parent.handle; |
| int otherHandle= 0; |
| if (control != null) |
| otherHandle= control.topHandle(); |
| |
| int pos= 0; |
| short[] cnt= new short[1]; |
| OS.CountSubControls(destHandle, cnt); |
| int count= cnt[0]; |
| int children[]= new int[count]; |
| int[] outHandle= new int[1]; |
| int to= 0; |
| for (int i= 0; i < count; i++) { |
| if (OS.GetIndexedSubControl(destHandle, (short)(i+1), outHandle) == 0) { |
| int h= outHandle[0]; |
| if (h == otherHandle) |
| pos= to; |
| if (h != thisHandle) |
| children[to++]= h; |
| } else |
| error (SWT.ERROR_CANNOT_GET_ITEM); |
| } |
| |
| if (control == null) { |
| if (above) pos= to; |
| } else { |
| if (above) pos++; |
| } |
| |
| for (int z= children.length-1; z > pos; z--) |
| children[z]= children[z-1]; |
| children[pos]= thisHandle; |
| |
| for (int i= 0; i < children.length; i++) |
| OS.EmbedControl(children[i], destHandle); |
| } |
| /** |
| * Returns a point which is the result of converting the |
| * argument, which is specified in display relative coordinates, |
| * to coordinates relative to the receiver. |
| * <p> |
| * @param point the point to be translated (must not be null) |
| * |
| * @exception IllegalArgumentException <ul> |
| * <li>ERROR_NULL_ARGUMENT - if the point 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> |
| */ |
| public Point toControl (Point point) { |
| checkWidget(); |
| if (point == null) error (SWT.ERROR_NULL_ARGUMENT); |
| /* AW |
| short [] root_x = new short [1], root_y = new short [1]; |
| OS.XtTranslateCoords (handle, (short) 0, (short) 0, root_x, root_y); |
| return new Point (point.x - root_x [0], point.y - root_y [0]); |
| */ |
| return MacUtil.toControl(handle, point); |
| } |
| /** |
| * Returns a point which is the result of converting the |
| * argument, which is specified in coordinates relative to |
| * the receiver, to display relative coordinates. |
| * <p> |
| * @param point the point to be translated (must not be null) |
| * |
| * @exception IllegalArgumentException <ul> |
| * <li>ERROR_NULL_ARGUMENT - if the point 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> |
| */ |
| public Point toDisplay (Point point) { |
| checkWidget(); |
| if (point == null) error (SWT.ERROR_NULL_ARGUMENT); |
| /* AW |
| short [] root_x = new short [1], root_y = new short [1]; |
| OS.XtTranslateCoords (handle, (short) point.x, (short) point.y, root_x, root_y); |
| return new Point (root_x [0], root_y [0]); |
| */ |
| return MacUtil.toDisplay(handle, point); |
| } |
| /* AW |
| boolean translateMnemonic (char key, XKeyEvent xEvent) { |
| if (!isVisible () || !isEnabled ()) return false; |
| boolean doit = mnemonicMatch (key); |
| if (hooks (SWT.Traverse)) { |
| Event event = new Event(); |
| event.doit = doit; |
| event.detail = SWT.TRAVERSE_MNEMONIC; |
| event.time = xEvent.time; |
| setKeyState (event, xEvent); |
| sendEvent (SWT.Traverse, event); |
| doit = event.doit; |
| } |
| if (doit) return mnemonicHit (key); |
| return false; |
| } |
| boolean translateMnemonic (int key, XKeyEvent xEvent) { |
| if (xEvent.state != OS.Mod1Mask) { |
| if (xEvent.state != 0 || !(this instanceof Button)) { |
| return false; |
| } |
| } |
| Decorations shell = menuShell (); |
| if (shell.isVisible () && shell.isEnabled ()) { |
| char ch = mbcsToWcs ((char) key); |
| return ch != 0 && shell.translateMnemonic (ch, xEvent); |
| } |
| return false; |
| } |
| */ |
| /* |
| boolean translateTraversal (int key, XKeyEvent xEvent) { |
| int detail = 0; |
| switch (key) { |
| case OS.XK_Escape: |
| case OS.XK_Cancel: |
| Shell shell = getShell (); |
| if (shell.parent == null) return false; |
| if (!shell.isVisible () || !shell.isEnabled ()) return false; |
| detail = SWT.TRAVERSE_ESCAPE; |
| break; |
| case OS.XK_Return: |
| Button button = menuShell ().getDefaultButton (); |
| if (button == null || button.isDisposed ()) return false; |
| if (!button.isVisible () || !button.isEnabled ()) return false; |
| detail = SWT.TRAVERSE_RETURN; |
| break; |
| case OS.XK_Tab: |
| detail = SWT.TRAVERSE_TAB_PREVIOUS; |
| boolean next = (xEvent.state & OS.ShiftMask) == 0; |
| if (next && ((xEvent.state & OS.ControlMask) != 0)) return false; |
| if (next) detail = SWT.TRAVERSE_TAB_NEXT; |
| break; |
| case OS.XK_Up: |
| case OS.XK_Left: |
| detail = SWT.TRAVERSE_ARROW_PREVIOUS; |
| break; |
| case OS.XK_Down: |
| case OS.XK_Right: |
| detail = SWT.TRAVERSE_ARROW_NEXT; |
| break; |
| default: |
| return false; |
| } |
| boolean doit = (detail & traversalCode ()) != 0; |
| if (hooks (SWT.Traverse)) { |
| Event event = new Event(); |
| event.doit = doit; |
| event.detail = detail; |
| event.time = xEvent.time; |
| setKeyState (event, xEvent); |
| sendEvent (SWT.Traverse, event); |
| doit = event.doit; |
| detail = event.detail; |
| } |
| */ |
| /* |
| * NOTE: The native widgets handle tab and arrow key traversal |
| * so it is not necessary to traverse these keys. A canvas widget |
| * has no native traversal by definition so it is necessary to |
| * traverse all keys. |
| */ |
| /* AW |
| if (doit) { |
| int flags = SWT.TRAVERSE_RETURN | SWT.TRAVERSE_ESCAPE; |
| if ((detail & flags) != 0 || (state & CANVAS) != 0) { |
| return traverse (detail); |
| } |
| } |
| return false; |
| } |
| */ |
| int traversalCode () { |
| int code = SWT.TRAVERSE_ESCAPE | SWT.TRAVERSE_RETURN; |
| /* AW |
| int [] argList = {OS.XmNnavigationType, 0}; |
| OS.XtGetValues (handle, argList, argList.length / 2); |
| if (argList [1] == OS.XmNONE) { |
| code |= SWT.TRAVERSE_ARROW_NEXT | SWT.TRAVERSE_ARROW_PREVIOUS; |
| } else { |
| code |= SWT.TRAVERSE_TAB_NEXT | SWT.TRAVERSE_TAB_PREVIOUS; |
| } |
| */ |
| return code; |
| } |
| boolean traverseMnemonic (char key) { |
| if (!isVisible () || !isEnabled ()) return false; |
| return mnemonicMatch (key) && mnemonicHit (key); |
| } |
| /** |
| * Based on the argument, perform one of the expected platform |
| * traversal action. The argument should be one of the constants: |
| * <code>SWT.TRAVERSE_ESCAPE</code>, <code>SWT.TRAVERSE_RETURN</code>, |
| * <code>SWT.TRAVERSE_TAB_NEXT</code>, <code>SWT.TRAVERSE_TAB_PREVIOUS</code>, |
| * <code>SWT.TRAVERSE_ARROW_NEXT</code> and <code>SWT.TRAVERSE_ARROW_PREVIOUS</code>. |
| * |
| * @param traversal the type of traversal |
| * @return true if the traversal succeeded |
| * |
| * @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> |
| */ |
| /* AW |
| public boolean traverse (int traversal) { |
| checkWidget(); |
| if (!isFocusControl () && !setFocus ()) return false; |
| switch (traversal) { |
| case SWT.TRAVERSE_ESCAPE: return traverseEscape (); |
| case SWT.TRAVERSE_RETURN: return traverseReturn (); |
| case SWT.TRAVERSE_TAB_NEXT: return traverseGroup (true); |
| case SWT.TRAVERSE_TAB_PREVIOUS: return traverseGroup (false); |
| case SWT.TRAVERSE_ARROW_NEXT: return traverseItem (true); |
| case SWT.TRAVERSE_ARROW_PREVIOUS: return traverseItem (false); |
| // case SWT.TRAVERSE_MNEMONIC: return traverseMnemonic (??); |
| } |
| return false; |
| } |
| boolean traverseEscape () { |
| Shell shell = getShell (); |
| if (shell.parent == null) return false; |
| if (!shell.isVisible () || !shell.isEnabled ()) return false; |
| shell.close (); |
| return true; |
| } |
| boolean traverseGroup (boolean next) { |
| return OS.XmProcessTraversal (handle, next ? OS.XmTRAVERSE_NEXT_TAB_GROUP : OS.XmTRAVERSE_PREV_TAB_GROUP); |
| } |
| boolean traverseItem (boolean next) { |
| return OS.XmProcessTraversal (handle, next ? OS.XmTRAVERSE_NEXT : OS.XmTRAVERSE_PREV); |
| } |
| boolean traverseReturn () { |
| Button button = menuShell ().getDefaultButton (); |
| if (button == null || button.isDisposed ()) return false; |
| if (!button.isVisible () || !button.isEnabled ()) return false; |
| button.click (); |
| return true; |
| } |
| */ |
| /** |
| * Forces all outstanding paint requests for the widget tree |
| * to be processed before this method returns. |
| * |
| * @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 #redraw |
| */ |
| public void update () { |
| checkWidget(); |
| /* AW |
| int display = OS.XtDisplay (handle); |
| if (display == 0) return; |
| int window = OS.XtWindow (handle); |
| if (window == 0) return; |
| XAnyEvent event = new XAnyEvent (); |
| OS.XSync (display, false); OS.XSync (display, false); |
| while (OS.XCheckWindowEvent (display, window, OS.ExposureMask, event)) { |
| OS.XtDispatchEvent (event); |
| } |
| */ |
| Display.processAllUpdateEvents(handle); |
| } |
| |
| ////////////////////////////////////////////////////////////////////// |
| // Mac stuff |
| ////////////////////////////////////////////////////////////////////// |
| /** |
| * Sets the bounds of the given control. |
| */ |
| private void internalSetBounds(int hndl, short[] bounds, int x, int y, int width, int height, boolean sizeChanged) { |
| |
| int wHandle= OS.GetControlOwner(hndl); |
| OS.InvalWindowRect(wHandle, bounds); |
| |
| MacRect newBounds= new MacRect(x, y, width, height); |
| |
| if (sizeChanged) { |
| handleResize(hndl, x, y, width, height); |
| } else { |
| OS.SetControlBounds(hndl, newBounds.getData()); |
| } |
| |
| OS.InvalWindowRect(wHandle, newBounds.getData()); |
| } |
| |
| /** |
| * subclasses can override if a resize must trigger some internal layout. |
| */ |
| void handleResize(int hndl, int x, int y, int width, int height) { |
| OS.SetControlBounds(hndl, new MacRect(x, y, width, height).getData()); |
| } |
| } |