diff -r 6c158198356e -r ae942d28ec0e javauis/eswt_qt/org.eclipse.swt/Eclipse SWT/qt/org/eclipse/swt/widgets/Control.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/javauis/eswt_qt/org.eclipse.swt/Eclipse SWT/qt/org/eclipse/swt/widgets/Control.java Tue Aug 31 15:09:22 2010 +0300 @@ -0,0 +1,3591 @@ +/******************************************************************************* + * Copyright (c) 2000, 2007 IBM Corporation and others. + * Portion Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * IBM Corporation - initial API and implementation + * Nokia Corporation - Qt implementation + *******************************************************************************/ +package org.eclipse.swt.widgets; + +import java.util.Vector; + +import org.eclipse.ercp.swt.mobile.Command; +import org.eclipse.swt.SWT; +import org.eclipse.swt.SWTException; +import org.eclipse.swt.events.ControlListener; +import org.eclipse.swt.events.FocusListener; +import org.eclipse.swt.events.KeyListener; +import org.eclipse.swt.events.MouseListener; +import org.eclipse.swt.events.MouseMoveListener; +import org.eclipse.swt.events.PaintListener; +import org.eclipse.swt.events.TraverseListener; +import org.eclipse.swt.graphics.Color; +import org.eclipse.swt.graphics.Drawable; +import org.eclipse.swt.graphics.Font; +import org.eclipse.swt.graphics.GC; +import org.eclipse.swt.graphics.Image; +import org.eclipse.swt.graphics.Internal_GfxPackageSupport; +import org.eclipse.swt.graphics.Point; +import org.eclipse.swt.graphics.Rectangle; +import org.eclipse.swt.internal.qt.CommandUtils; +import org.eclipse.swt.internal.qt.GCData; +import org.eclipse.swt.internal.qt.OS; +import org.eclipse.swt.internal.qt.QObjectDeleteWrapper; +import org.eclipse.swt.internal.qt.SharedGCWrapper; +import org.eclipse.swt.internal.qt.WidgetConstant; +import org.eclipse.swt.internal.qt.WidgetState; +import org.eclipse.swt.internal.qt.graphics.NativeCommandBuffer; +import org.eclipse.swt.internal.qt.graphics.GraphicsContext; + +/** + * Control is the abstract superclass of all windowed user interface classes. + *

+ *

+ *
Styles: + *
BORDER
+ *
LEFT_TO_RIGHT, RIGHT_TO_LEFT
+ *
Events: + *
FocusIn, FocusOut, KeyDown, KeyUp, MouseDoubleClick, MouseDown, + * MouseUp, MouseMove, Move, Paint, Resize, Traverse
+ *
+ *

+ * Only one of LEFT_TO_RIGHT or RIGHT_TO_LEFT may be specified. + *

+ * IMPORTANT: This class is intended to be subclassed only + * within the SWT implementation. + *

+ */ +public abstract class Control extends Widget implements Drawable { + Composite parent; + int frameHandle, extraStyle; + Menu menu; + Font font; + boolean toolTipTextExists; + Object layoutData; + Color foreground, background; + Image backgroundImage; + private Command[] commandList; + + // Flags controlling traverse key event handling + boolean traverseDoit, traverseCancel; + + // Each external GC has its own buffer for now. + // Not possible to bind several GCs to one buffer. + Vector/**/ bufferedGcs; + Vector/**/ gcBuffers; + + private byte isPainting; + boolean bufferFlush; + +Control() { +} + +/** + * Constructs a new instance of this class given its parent + * and a style value describing its behavior and appearance. + *

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

+ * + * @param parent a composite control which will be the parent of the new instance (cannot be null) + * @param style the style of control to construct + * + * @exception IllegalArgumentException + * @exception SWTException + * + * @see SWT#BORDER + * @see Widget#checkSubclass + * @see Widget#getStyle + */ +public Control(Composite parent, int style) { + this(parent, style, 0, null, false); +} + +/** + *

+ * IMPORTANT: This constructor is not part of the SWT + * public API. It should never be referenced from application code. + *

+ */ +protected Control(Composite parent, int style, int extraStyle, Object packageProxy, + boolean isExtended) { + super(parent, style, extraStyle, packageProxy, isExtended); + this.parent = parent; + this.extraStyle = extraStyle; + createWidget(0); + OS.QWidget_setParent(topHandle, parent.handle); + OS.QWidget_resize(topHandle, 0, 0); + if(isParentMirrored()) { + Point size = OS.QWidget_size(topHandle); + OS.QWidget_move(topHandle, parent.getClientWidth() - size.x, 0); + } + OS.QWidget_setVisible(topHandle, true); + if(this.parent.packageProxy != null) { + this.parent.packageProxy.addControl(this); + } else { + this.parent.addControl_pp(this); + } +} + +void addCommand(final Command command) { + if (command.control != this) + return; + if (commandList == null) { + commandList = new Command[1]; + commandList[0] = command; + return; + } + int size = commandList.length; + + for (int i = 0; i < size; i++) { + if (commandList[i] == command) + return; + } + Command[] newList = new Command[size + 1]; + System.arraycopy(commandList, 0, newList, 0, size); + newList[size] = command; + commandList = newList; +} + +/** + * 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 ControlListener interface. + * + * @param listener + * the listener which should be notified + * + * @exception IllegalArgumentException + * + * @exception SWTException + * + * + * @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 FocusListener interface. + * + * @param listener + * the listener which should be notified + * + * @exception IllegalArgumentException + * + * @exception SWTException + * + * + * @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 + * keys are pressed and released on the system keyboard, by sending it one of + * the messages defined in the KeyListener interface. + *

+ * When a key listener is added to a control, the control will take part in + * widget traversal. By default, all traversal keys (such as the tab key and so + * on) are delivered to the control. In order for a control to take part in + * traversal, it should listen for traversal events. Otherwise, the user can + * traverse into a control but not out. Note that native controls such as table + * and tree implement key traversal in the operating system. It is not necessary + * to add traversal listeners for these controls, unless you want to override + * the default traversal. + *

+ * + * @param listener + * the listener which should be notified + * + * @exception IllegalArgumentException + * + * @exception SWTException + * + * + * @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 MouseListener interface. + * + * @param listener + * the listener which should be notified + * + * @exception IllegalArgumentException + * + * @exception SWTException + * + * + * @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 moves, by sending it one of the messages defined in the + * MouseMoveListener interface. + * + * @param listener + * the listener which should be notified + * + * @exception IllegalArgumentException + * + * @exception SWTException + * + * + * @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 PaintListener interface. + * + * @param listener + * the listener which should be notified + * + * @exception IllegalArgumentException + * + * @exception SWTException + * + * + * @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 + * TraverseListener interface. + * + * @param listener + * the listener which should be notified + * + * @exception IllegalArgumentException + * + * @exception SWTException + * + * + * @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); +} + +//This is called with the background control's background color +void applyBackgroundColor(Color color) { + // Get a temporary copy of the widget's palette, modify the background + // color, and set the palette back to the widget. + int palette = OS.QWidget_swt_palette_new(topHandle); + try { + setPaletteBgColor(palette, color); + OS.QWidget_setPalette(topHandle, palette); + } finally { + OS.QPalette_delete(palette); + } + updateAutoFillBackground(); +} + +//This is called with the background control's background image +void applyBackgroundImage(Image image) { + // Get a temporary copy of the widget's palette, modify the background + // texture, and set the palette back to the widget. + int palette = OS.QWidget_swt_palette_new(topHandle); + try { + setPaletteBgImage(palette, image); + OS.QWidget_setPalette(topHandle, palette); + } finally { + OS.QPalette_delete(palette); + } + updateAutoFillBackground(); +} + +/* + * Some widgets need to know when background texture is taken into use. They can + * override this to hook in. E.g. scrolling can't be done but whole area needs + * repainting if there's a non-single color background in use. + */ +void backgroundImageApplied_pp(Image image) { +} + +/* + * Some widgets need to know when background texture of parent taken into use. + * They can override this to hook in. E.g. Combo can inherit texture only for + * some sub-widgets and for some it needs to draw the background image by + * itself. + */ +void backgroundImageInherited(Image image) { +} + +/* + * Controls that return true here will use null brush for their background + * role(s) when inheriting a background image. This means they don't draw the + * background but depend on the parent to draw it. This doesn't work well with + * some built-in widgets and they will return false here. When this returns + * false then the background image drawing will be handled by the control itself + * and the image will appear starting from the control's own origin instead of + * the parent's. + */ +boolean canInheritBackgroundImage() { + return true; +} + +void checkBackground () { + Shell shell = getShell (); + if (this == shell) return; + state &= ~WidgetState.PARENT_BACKGROUND; + Composite composite = parent; + do { + int mode = composite.backgroundMode; + if (mode != SWT.INHERIT_NONE) { + // On some platforms INHERIT_DEFAULT depends on the + // THEME_BACKGROUND. With Qt we don't have any such criteria + // but INHERIT_DEFAULT and INHERIT_FORCE have the same effect. + state |= WidgetState.PARENT_BACKGROUND; + return; + } + if (composite == shell) break; + composite = composite.parent; + } while (true); +} + +void checkBorder_pp() { + if (frameHandle != 0) { + if ((style & SWT.BORDER) == 0) { + OS.QFrame_setFrameStyle(frameHandle, OS.QT_NOFRAME); + } else { + int qStyle = OS.QFrame_frameShape(frameHandle); + if ((qStyle & (OS.QT_FRAMEPANEL | OS.QT_FRAMEWINPANEL + | OS.QT_FRAMESTYLEDPANEL | OS.QT_FRAMEBOX)) == 0) { + OS.QFrame_setFrameStyle(frameHandle, qStyle + | OS.QT_FRAMESTYLEDPANEL); + } + } + } + + // a control has to manage the border by itself if it can't provide a frame + // handle . + + if (getBorderWidth() == 0) + // remove border flag if there is no border + style &= ~SWT.BORDER; +} + +void checkBuffered() { + style &= ~SWT.DOUBLE_BUFFERED; +} + +void checkMirrored() { + if ((style & SWT.RIGHT_TO_LEFT) != 0) { + style |= SWT.MIRRORED; + } else { + style &= ~SWT.MIRRORED; + } +} + +void checkNoBackground() { + style &= ~SWT.NO_BACKGROUND; +} + +void checkNoFocus() { +// Nothing to be done for Control by default. Override case by case. +} + +void checkNoRedrawResize() { + style &= ~SWT.NO_REDRAW_RESIZE; +} + +/** + * Returns the preferred size of the receiver. + *

+ * The preferred size 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 + * SWT.DEFAULT is passed for the hint. + *

+ * + * @param wHint + * the width hint (can be SWT.DEFAULT) + * @param hHint + * the height hint (can be SWT.DEFAULT) + * @return the preferred size of the control + * + * @exception SWTException + * + * + * @see Layout + * @see #getBorderWidth + * @see #getBounds + * @see #getSize + * @see #pack(boolean) + * @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. + *

+ * The preferred size 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 + * SWT.DEFAULT is passed for the hint. + *

+ *

+ * If the changed flag is true, it indicates that the receiver's + * contents 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 false, so layout + * manager caches can be retained. + *

+ * + * @param wHint + * the width hint (can be SWT.DEFAULT) + * @param hHint + * the height hint (can be SWT.DEFAULT) + * @param changed + * true if the control's contents have changed, and + * false otherwise + * @return the preferred size of the control. + * + * @exception SWTException + * + * + * @see Layout + * @see #getBorderWidth + * @see #getBounds + * @see #getSize + * @see #pack(boolean) + * @see "computeTrim, getClientArea for controls that implement them" + */ +public Point computeSize(int wHint, int hHint, boolean changed) { + checkWidget(); + + if (changed) { + OS.QWidget_updateGeometry(topHandle); + } + + // The border, if enabled, is already included in the native size hint + Point res = OS.QWidget_sizeHint(topHandle); + if (res.x < 0) { + res.x = WidgetConstant.DEFAULT_WIDTH; + } + if (res.y < 0) { + res.y = WidgetConstant.DEFAULT_HEIGHT; + } + + int border = getBorderWidth(); + if (wHint != SWT.DEFAULT) { + res.x = wHint + 2 * border; + } + if (hHint != SWT.DEFAULT) { + res.y = hHint + 2 * border; + } + + return res; +} + +Control computeTabGroup() { + if (isTabGroup()) + return this; + return parent.computeTabGroup(); +} + +Control[] computeTabList() { + if (isTabGroup()) { + if (getVisible() && getEnabled()) { + return new Control[] { this }; + } + } + return new Control[0]; +} + +Control computeTabRoot() { + Control[] tabList = parent._getTabList(); + if (tabList != null) { + int index = 0; + while (index < tabList.length) { + if (tabList[index] == this) + break; + index++; + } + if (index == tabList.length) { + if (isTabGroup()) + return this; + } + } + return parent.computeTabRoot(); +} + +void createWidget(int index) { + checkOrientation(parent); + super.createWidget(index); + checkBuffered(); + checkMirrored(); + if(packageProxy != null) { + packageProxy.checkBorder(); + } else { + checkBorder_pp(); + } + checkNoBackground(); + checkNoRedrawResize(); + checkNoFocus(); + checkBackground(); + if ((style & SWT.RIGHT_TO_LEFT) != 0){ + OS.QWidget_setLayoutDirection(topHandle, OS.QT_RIGHTTOLEFT); + } else { + OS.QWidget_setLayoutDirection(topHandle, OS.QT_LEFTTORIGHT); + } + // This creates a custom palette for the control + if(packageProxy != null) { + packageProxy.setBackground(); + } else { + setBackground_pp(); + } +} + +boolean doHandleMouseEvent(int type, int widgetHandle, int button, int x, + int y, int state, int buttons) { + if (!isEnabled()) { + // In SWT parent is supposed to receive events of a disabled + // control. + // Many Qt widgets consume the events when they are disabled. + // To get SWT behavior, a new event is sent to the parent and the + // native event is cancelled. + mouseToParent(type, widgetHandle, button, x, y, state, buttons); + return true; + } + Point p = mapToClientArea(widgetHandle, x, y); + return sendMouseEvent(type, button, false, p.x, p.y, state, buttons); +} + +/* + * Processes a mnemonic hit. Called on the focused control when some control + * gets a shortcut event. Focused control is then sent traversal/key events. + */ +boolean doProcessShortCut(int key, int modifier, int character) { + // Send traverse/key event + Event event = sendTraverseEvent(SWT.TRAVERSE_MNEMONIC, key, modifier, + character); + if (isDisposed()) + return true; + if (event.doit) { + // Traversal is done respective to the control which has the + // mnemonic. + if (doTraversal(event)) { + return true; // Cancel the shortcut event + } + } + sendKeyEvent(SWT.KeyDown, key, modifier, character, 0); + + return true; // Cancel the shortcut event +} + +void doRedraw() { + OS.QWidget_update(handle); +} + +void doRedraw(int x, int y, int width, int height) { + OS.QWidget_update(handle, x, y, width, height); +} + +boolean doTraversal(Event event) { + if (!event.doit) + return false; + switch (event.detail) { + case SWT.TRAVERSE_NONE: + return true; + 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(event.character); + case SWT.TRAVERSE_PAGE_NEXT: + return traversePage(true); + case SWT.TRAVERSE_PAGE_PREVIOUS: + return traversePage(false); + } + return false; +} + +void enableWidget(boolean enabled) { + // Disabling a widget implicitly disables all its children. Enabling + // respectively enables all child widgets unless they have been explicitly + // disabled. + OS.QWidget_setEnabled(topHandle, enabled); +} + +Control findBackgroundControl () { + if (background != null || backgroundImage != null) return this; + return (state & WidgetState.PARENT_BACKGROUND) != 0 ? parent.findBackgroundControl () : null; +} + +Menu[] findMenus(Control control) { + if (menu != null && this != control) + return new Menu[] { menu }; + return new Menu[0]; +} + +/* + * Finds the next control in the parent's child array. + * + * @param loopOver + * If this control is the last one, should the search loop over and + * return the first control as the next one. + * @return The next control with the same parent or null. + */ +Control findNextControl(boolean loopOver) { + Composite parent = getParent(); + if (parent == null) + return null; + Control nextChild = null; + boolean next = false; + Control[] children = parent._getChildren(); + for (int i = 0; i < children.length; i++) { + Control child = children[i]; + if (!next) { + if (child.equals(this)) { + next = true; + } + } else { + nextChild = children[i]; + } + } + if (nextChild == null && loopOver && children.length > 0 + && children[0] != this) { + nextChild = children[0]; + } + return nextChild; +} + +void fixFocus (Control focusControl) { + Shell shell = getShell (); + Control control = this; + while (control != shell && (control = control.parent) != null) { + if (control.setFixedFocus ()) return; + } + shell.setSavedFocus (focusControl); + + // Set the focus to desktop as the last resort + int desktopWidget = OS.QApplication_desktop(); + if(desktopWidget != 0) { + OS.QWidget_setFocus(desktopWidget, OS.QT_OTHERFOCUSREASON); + } +} + +void fixMousePropagation() { + // In SWT mouse events are not supposed to propagate to the parent like in + // Qt. Thus, the default is never to propagate. + if(handle != 0) { + OS.QWidget_setAttribute(handle, OS.QT_WA_NOMOUSEPROPAGATION, true); + } +} + +void flushBuffers() { + if (bufferedGcs != null) { + for (int i = 0; i < bufferedGcs.size(); i++) { + GraphicsContext igc = (GraphicsContext)bufferedGcs.elementAt(i); + NativeCommandBuffer buf = (NativeCommandBuffer)gcBuffers.elementAt(i); + igc.releaseTarget(); + igc.bindTarget(this); + igc.render(buf); + igc.releaseTarget(); + igc.bindTarget(buf, this); + } + } +} + +/** + * Forces the receiver to have the keyboard focus, causing all keyboard + * events to be delivered to it. + * + * @return true if the control got focus, and false if + * it was unable to. + * + * @exception SWTException + * + * + * @see #setFocus + */ +public boolean forceFocus() { + checkWidget(); + return forceFocus(OS.QT_OTHERFOCUSREASON); +} + +boolean forceFocus(int focusReason) { + if (Display.focusEvent == SWT.FocusOut) return false; + Decorations shell = menuShell(); + shell.setSavedFocus(this); + if (!isEnabled() || !isVisible() || !isActive()) + return false; + if (isFocusControl()) + return true; + shell.setSavedFocus(null); + shell.bringToTop(false); + + // Wait for requests sent in bringToTop to complete. This doesn't guarantee + // that focus has moved after this. + if (OS.windowServer == OS.WS_X11) { + waitXRequestComplete(); + if (isDisposed()) + return false; + } + + // Gives focus to a widget regardless of its focus policy. + // If widget is hidden then it'll get focus when it's shown. + OS.QWidget_setFocus(handle, focusReason); + + if (isDisposed()) + return false; + shell.setSavedFocus(this); + + // Because focus transition cannot be guaranteed to have completed a fixed + // return value needs to be returned for consistent focus behavior. + if (OS.windowServer == OS.WS_X11) + return true; + + return (packageProxy != null ? packageProxy._isFocusControl() : _isFocusControl_pp()); +} + +/** + * Returns the receiver's background color. + * + * @return the background color + * + * @exception SWTException + * + */ +public Color getBackground() { + checkWidget(); + Control control = findBackgroundControl (); + if (control == null) control = this; + if (control.background != null) { + // Return a copy + return Internal_GfxPackageSupport.newColor(display, control.background.handle); + } + int palette = 0; + int[] rgb; + try { + palette = OS.QWidget_swt_palette_new(topHandle); + rgb = OS.QPalette_color(palette, + OS.QPALETTE_COLORGROUP_NORMAL, getBackgroundColorRole()); + } finally { + OS.QPalette_delete(palette); + } + return Internal_GfxPackageSupport.newColor(display, (rgb[0] & 0xFF) | ((rgb[1] & 0xFF) << 8) | ((rgb[2] & 0xFF) << 16)); +} + +int getBackgroundColorRole() { + return OS.QPALETTE_COLORROLE_WINDOW; +} + +/** + * Returns the receiver's background image. + * + * @return the background image + * + * @exception SWTException + * + * @since 3.2 + */ +public Image getBackgroundImage () { + checkWidget (); + Control control = findBackgroundControl (); + if (control == null) control = this; + return control.backgroundImage; +} + +int[] getBackgroundColorRoles() { + return new int[] { OS.QPALETTE_COLORROLE_WINDOW, + OS.QPALETTE_COLORROLE_BASE, OS.QPALETTE_COLORROLE_BUTTON }; +} + +int[] getBackgroundImageRoles() { + // For some reason button color role becomes black if pixmap is set to it. + // At least with Cleanlooks style this happened. + return new int[] { OS.QPALETTE_COLORROLE_WINDOW, + OS.QPALETTE_COLORROLE_BASE/*, OS.QPALETTE_COLORROLE_BUTTON */}; +} + +/** + * Returns the receiver's border width. + * + * @return the border width + * + * @exception SWTException + * + */ +public int getBorderWidth() { + checkWidget(); + if (frameHandle != 0) { + return OS.QFrame_frameWidth(frameHandle); + + } + // a control should overwrite this method if it has border but a frame + // handle. + return 0; +} + +/** + * Returns a rectangle describing the receiver's size and location relative to + * its parent (or its display if its parent is null), unless the receiver is a + * shell. In this case, the location is relative to the display. + * + * @return the receiver's bounding rectangle + * + * @exception SWTException + * + */ +public Rectangle getBounds() { + checkWidget(); + // This can return + // - display relative main window coordinates (if top-level shell) + // - parent's viewport relative coordinates + Rectangle bounds = OS.QWidget_frameGeometry(topHandle); + if (isParentMirrored()) { + bounds.x = parent.getClientWidth() - bounds.width - bounds.x; + } + return bounds; +} + +int getClientWidth() { + return OS.QWidget_rect(handle).width; +} + +Command[] getCommands() { + return commandList == null ? new Command[0] : commandList; +} + +/** + * Returns true if the receiver is enabled, and false + * 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 + * + * + * @see #isEnabled + */ +public boolean getEnabled() { + checkWidget(); + return _getEnabled(); +} + +boolean _getEnabled() { + return (state & WidgetState.DISABLED) == 0; +} + +/** + * Returns the font that the receiver will use to paint textual information. + * + * @return the receiver's font + * + * @exception SWTException + * + */ +public Font getFont() { + checkWidget(); + return font != null ? font : Internal_GfxPackageSupport.newFont(display, OS.SwtFontCache_cache(OS.QWidget_swt_font_new(topHandle))); +} + +/** + * Returns the foreground color that the receiver will use to draw. + * + * @return the receiver's foreground color + * + * @exception SWTException + * + */ +public Color getForeground() { + checkWidget(); + if (foreground != null) { + return Internal_GfxPackageSupport.newColor(display, foreground.handle); + } + int paletteHandle = 0; + int[] rgb; + try { + paletteHandle = OS.QWidget_swt_palette_new(handle); + rgb = OS.QPalette_color(paletteHandle, + OS.QPALETTE_COLORGROUP_NORMAL, getForegroundColorRole()); + } finally { + OS.QPalette_delete(paletteHandle); + } + foreground = Internal_GfxPackageSupport.newColor(display, (rgb[0] & 0xFF) | ((rgb[1] & 0xFF) << 8) | ((rgb[2] & 0xFF) << 16)); + return Internal_GfxPackageSupport.newColor(display, foreground.handle); +} + +int getForegroundColorRole() { + return OS.QPALETTE_COLORROLE_WINDOWTEXT; +} + +/** + * Returns layout data which is associated with the receiver. + * + * @return the receiver's layout data + * + * @exception SWTException + * + */ +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), unless the receiver is a shell. In this + * case, the point is relative to the display. + * + * @return the receiver's location + * + * @exception SWTException + * + */ +public Point getLocation() { + checkWidget(); + Point p = OS.QWidget_pos(topHandle); + if (isParentMirrored()) { + p.x = parent.getClientWidth() - p.x - OS.QWidget_geometry(topHandle).width; + } + return p; +} + +/** + * 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 + * + */ +public Menu getMenu() { + checkWidget(); + return menu; +} + +/** + * Returns the receiver's parent, which must be a Composite 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 + * + */ +public Composite getParent() { + checkWidget(); + return parent; +} + +int getParentClientWidth() { + if(parent != null) { + return parent.getClientWidth(); + } else { + return display.getClientArea().width; + } +} + +/** + * 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 + * + * + * @see #getParent + */ +public Shell getShell() { + checkWidget(); + return _getShell(); +} + +Shell _getShell() { + return parent._getShell(); +} + +/* + * Returns the control that will handle the shortcut event. I.e. shortcut + * parameters are delivered to that control in a doProcessShortcut call. + */ +Control getShortcutHandler() { + // By default the focused control handles the shortcut. + return display.getFocusControl(); +} + +/** + * 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 + * + */ +public Point getSize() { + checkWidget(); + return OS.QWidget_frameSize(topHandle); +} + +/** + * Returns the receiver's tool tip text, or null if it has not been set. + * + * @return the receiver's tool tip text + * + * @exception SWTException + * + */ +public String getToolTipText() { + checkWidget(); + String toolTip = null; + if (toolTipTextExists) { + toolTip = OS.QWidget_toolTip(handle); + } + return toolTip; +} + +int getTraversalTypeForKey(int key, int modifier, int character) { + int type = -1; + switch (key) { + case OS.QT_KEY_ESCAPE: { + if (modifier != 0) + break; + type = SWT.TRAVERSE_ESCAPE; + break; + } + case OS.QT_KEY_ENTER: + case OS.QT_KEY_RETURN: { + if (modifier == 0 + || (((modifier & OS.QT_KEYPADMODIFIER) != 0) && key == OS.QT_KEY_ENTER)) { + type = SWT.TRAVERSE_RETURN; + } + break; + } + case OS.QT_KEY_TAB: { + if (modifier != 0) + break; + type = SWT.TRAVERSE_TAB_NEXT; + break; + } + case OS.QT_KEY_BACKTAB: { + if ((modifier & ~OS.QT_SHIFTMODIFIER) != 0) + break; + type = SWT.TRAVERSE_TAB_PREVIOUS; + break; + } + case OS.QT_KEY_UP: + case OS.QT_KEY_LEFT: + case OS.QT_KEY_DOWN: + case OS.QT_KEY_RIGHT: { + if (modifier != 0) + break; + boolean next = (key == OS.QT_KEY_DOWN || key == OS.QT_KEY_RIGHT); + if (parent != null && (parent.style & SWT.MIRRORED) != 0) { + if (key == OS.QT_KEY_LEFT || key == OS.QT_KEY_RIGHT) + next = !next; + } + // Perform tab group traversal also for arrow keys + type = next ? SWT.TRAVERSE_TAB_NEXT : SWT.TRAVERSE_TAB_PREVIOUS; + break; + } + case OS.QT_KEY_PAGEUP: + case OS.QT_KEY_PAGEDOWN: { + if (modifier != 0) + break; + type = (key == OS.QT_KEY_PAGEDOWN ? SWT.TRAVERSE_PAGE_NEXT + : SWT.TRAVERSE_PAGE_PREVIOUS); + break; + } + default: + break; + } + return type; +} + +/** + * Returns true if the receiver is visible, and false + * otherwise. + *

+ * 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. + *

+ * + * @return the receiver's visibility state + * + * @exception SWTException + * + */ +public boolean getVisible() { + checkWidget(); + return !OS.QWidget_isHidden(topHandle); +} + +final boolean hasFocus() { + return this == display.getFocusControl(); +} + +/** + * Invokes platform specific functionality to dispose a GC. + *

+ * IMPORTANT: This method is not part of the public API for + * Control. 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. + *

+ * + * @param data + * the platform specific GC data + */ +public void internal_dispose_GC(GCData data) { + checkWidget(); + data.internalGc.releaseTarget(); + + // If the GraphicsContext we just released is the shared GraphicsContext + // used by all paint listeners then don't really destroy it. + if(data.internalGc == SharedGCWrapper.getSharedGC()) { + return; + } + + if (bufferedGcs != null) { + int i = bufferedGcs.indexOf(data.internalGc); + if (i >= 0) { + bufferedGcs.removeElementAt(i); + gcBuffers.removeElementAt(i); + } + } + + data.internalGc.dispose(); +} + +/** + * Invokes platform specific functionality to allocate a new GC handle. + *

+ * IMPORTANT: This method is not part of the public API for + * Control. 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. + *

+ * + * @param data + * the platform specific GC data + * @return the platform specific GC handle + */ +public int internal_new_GC(GCData data) { + checkWidget(); + + // Try obtaining the shared internal GraphicsContext instance for paint + // listener drawing if it's available. For outside paint listener drawing + // always create a new one. + GraphicsContext sharedGc; + if(isPainting>0 && (sharedGc = SharedGCWrapper.getSharedGC()) != null) { + data.internalGc = sharedGc; + } else { + data.internalGc = new GraphicsContext(); + } + + data.drawable = OS.QWidget_swt_paintDevice(handle); + data.device = display; + data.background = getBackground(); + data.foreground = getForeground(); + data.font = getFont(); + + int mask = SWT.LEFT_TO_RIGHT | SWT.RIGHT_TO_LEFT; + if ((data.style & mask) == 0) { + data.style |= style & (mask | SWT.MIRRORED); + } else { + if ((data.style & SWT.RIGHT_TO_LEFT) != 0) { + data.style |= SWT.MIRRORED; + } + } + + if (isPainting>0) { + data.buffered = false; + data.internalGc.bindTarget(this); + } + else { + data.buffered = true; + if (bufferedGcs == null) { + bufferedGcs = new Vector(); + } + if (gcBuffers == null) { + gcBuffers = new Vector(); + } + NativeCommandBuffer buf = new NativeCommandBuffer(); + data.internalGc.bindTarget(buf, this); + bufferedGcs.addElement(data.internalGc); + gcBuffers.addElement(buf); + } + + return data.internalGc.getHandle(); +} + +boolean isActive() { + Dialog dialog = Display.getModalDialog(); + if (dialog != null) { + Shell dialogShell = dialog.parent; + if (dialogShell != null && !dialogShell.isDisposed()) { + if (dialogShell != getShell()) + return false; + } + } + Shell shell = null; + Shell[] modalShells = Display.modalShells; + if (modalShells != null) { + int bits = SWT.APPLICATION_MODAL | SWT.SYSTEM_MODAL; + int index = modalShells.length; + while (--index >= 0) { + Shell modal = modalShells[index]; + if (modal != null) { + if ((modal.style & bits) != 0) { + Control control = this; + while (control != null) { + if (control == modal) + break; + control = control.parent; + } + if (control != modal) + return false; + break; + } + if ((modal.style & SWT.PRIMARY_MODAL) != 0) { + if (shell == null) + shell = getShell(); + if (modal.parent == shell) + return false; + } + } + } + } + if (shell == null) + shell = getShell(); + return shell.getEnabled(); +} + +/** + * Returns true if the receiver is enabled and all ancestors up to + * and including the receiver's nearest ancestor shell are enabled. Otherwise, + * false is returned. 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 + * + * + * @see #getEnabled + */ +public boolean isEnabled() { + checkWidget(); + return getEnabled() && parent.isEnabled(); +} + +boolean isFocusAncestor(Control control) { + while (control != null && control != this && !(control instanceof Shell)) { + control = control.parent; + } + return control == this; +} + +/** + * Returns true if the receiver has the user-interface focus, and + * false otherwise. + * + * @return the receiver's focus state + * + * @exception SWTException + * + */ +public boolean isFocusControl() { + checkWidget(); + boolean isFocusControl = (packageProxy != null ? packageProxy._isFocusControl() : _isFocusControl_pp()); + if (isFocusControl && !isDisposed()) { + return true; + } + return false; +} + +boolean _isFocusControl_pp() { + int focusHandle = handle; + int proxy = OS.QWidget_focusProxy(handle); + if (proxy != 0) + focusHandle = proxy; + return (OS.QApplication_focusWidget() == focusHandle); +} + +boolean isMirrored() { + return (style & SWT.MIRRORED) != 0; +} + +boolean isParentMirrored() { + if(parent != null) { + return parent.isMirrored(); + } else { + // Display is never mirrored + return false; + } +} + +/** + * Returns true if the underlying operating system supports this + * reparenting, otherwise false + * + * @return true if the widget can be reparented, otherwise + * false + * + * @exception SWTException + * + */ +public boolean isReparentable() { + checkWidget(); + return false; // Qt supports but not implemented +} + +final boolean isShowing() { + /* + * This is not complete. Need to check if the widget is obscurred by a + * parent or sibling. + */ + if (!isVisible()) + return false; + Control control = this; + while (control != null) { + Point size = control.getSize(); + if (size.x == 0 || size.y == 0) { + return false; + } + control = control.parent; + } + return true; +} + +boolean isTabGroup() { + // If in tablist then a tabgroup + Control[] tabList = parent._getTabList(); + if (tabList != null) { + for (int i = 0; i < tabList.length; i++) { + if (tabList[i] == this) + return true; + } + } + // If accepts focus by tabbing then a group + int bits = OS.QWidget_focusPolicy(topHandle); + return (bits & OS.QT_FOCUSPOLICY_TABFOCUS) != 0; +} + +boolean isTabItem() { + // If in tablist then not a tabitem but a group + Control[] tabList = parent._getTabList(); + if (tabList != null) { + for (int i = 0; i < tabList.length; i++) { + if (tabList[i] == this) + return false; + } + } + // If accepts focus by tabbing then not a tabitem but a group + int bits = OS.QWidget_focusPolicy(topHandle); + if ((bits & OS.QT_FOCUSPOLICY_TABFOCUS) != 0) + return false; + return true; +} + +boolean isTraversalKey(int key, int modifier, int character) { + return getTraversalTypeForKey(key, modifier, character) != -1; +} + +/** + * Returns true if the receiver is visible and all ancestors up to + * and including the receiver's nearest ancestor shell are visible. Otherwise, + * false is returned. + * + * @return the receiver's visibility state + * + * @exception SWTException + * + * + * @see #getVisible + */ +public boolean isVisible() { + checkWidget(); + return getVisible() && parent.isVisible(); +} + +Event makeMouseEvent(int type, int button, int x, int y, int modifiers, + int buttons) { + Event event = new Event(); + event.button = Display.translateButton(button); + event.detail = 0; + event.count = 0; + if(isMirrored()) { + event.x = getClientWidth() - x; + } else { + event.x = x; + } + event.y = y; + event.stateMask = (Display.translateModifiers(modifiers) | Display + .translateButtons(buttons)); + event.stateMask &= ~Display.translateButtons(button); + if (type == SWT.MouseUp) + event.stateMask |= Display.translateButtons(button); + return event; +} + +/* + * The coordinates are mapped to the client area widget if some other widget + * received the event. + */ +final Point mapToClientArea(int widgetHandle, int x, int y) { + if (widgetHandle == handle) { + return new Point(x, y); + } else { // scroll area + Point global = OS.QWidget_mapToGlobal(widgetHandle, x, y); + return OS.QWidget_mapFromGlobal(handle, global.x, global.y); + } +} + +void markLayout(boolean changed, boolean all) { + /* Do nothing */ +} + +Decorations menuShell() { + return parent.menuShell(); +} + +void mouseToParent(int type, int widgetHandle, int button, int x, int y, + int state, int buttons) { + Composite parent = getParent(); + if (parent != null) { + Point p = parent.mapToClientArea(widgetHandle, x, y); + Event event = parent.makeMouseEvent(type, button, p.x, p.y, state, buttons); + event.widget = parent; + event.type = type; + display.post(event); + } +} + +/** + * 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 control + * the sibling control (or null) + * + * @exception IllegalArgumentException + * + * @exception SWTException + * + * + * @see Control#moveBelow + * @see Composite#getChildren + */ +public void moveAbove(Control control) { + checkWidget(); + if (control != null) { + if (control.isDisposed()) + error(SWT.ERROR_INVALID_ARGUMENT); + if (parent != control.parent) + return; + + // There's no QWidget::stackOver, only stackUnder. The z order is + // determined by the order of QObject children. Find out the control + // that is above the control that we should move above of. Then use + // stackUnder on that. + Control controlAbove = null; + int parentHandle = 0; + if (parent == null) { + parentHandle = Display.handle; + } else { + parentHandle = parent.handle; + } + int children[] = OS.QObject_children(parentHandle); + int iChild = 0; + boolean next = false; + for (; iChild < children.length; ++iChild) { + if (!next && children[iChild] == control.topHandle) { + // The next widget we should move below of. + next = true; + continue; + } + if (next) { + Widget widget = Display.getWidget(children[iChild]); + if (widget != null && widget != this) { + if (widget instanceof org.eclipse.swt.widgets.Control) { + controlAbove = (Control) widget; + break; + } + } + } + } + if (controlAbove != null) { + moveBelow(controlAbove); + } else { + // There was no child after the target so move to top. + OS.QWidget_raise(topHandle); + } + } else { + OS.QWidget_raise(topHandle); + } +} + +/** + * 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 control + * the sibling control (or null) + * + * @exception IllegalArgumentException + * + * @exception SWTException + * + * + * @see Control#moveAbove + * @see Composite#getChildren + */ +public void moveBelow(Control control) { + checkWidget(); + if (control != null) { + if (control.isDisposed()) + error(SWT.ERROR_INVALID_ARGUMENT); + if (parent != control.parent) + return; + OS.QWidget_stackUnder(topHandle, control.topHandle); + + } else { + OS.QWidget_lower(topHandle); + } +} + +/** + * 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 + * + * + * @see #computeSize(int, int, boolean) + */ +public void pack() { + 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. + *

+ * If the changed flag is true, it indicates that the receiver's + * contents 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 false, so layout + * manager caches can be retained. + *

+ * + * @param changed + * whether or not the receiver's contents have changed + * + * @exception SWTException + * + * + * @see #computeSize(int, int, boolean) + */ +public void pack(boolean changed) { + setSize(computeSize(SWT.DEFAULT, SWT.DEFAULT, changed)); +} + + + +boolean qt_event_contextmenu(int x, int y, int reason) { + Event event = new Event(); + event.x = x; + event.y = y; + sendEvent(SWT.MenuDetect, event); + if (event.doit && !isDisposed()) { + // Check if there is a menu or commands to show. + if ((commandList == null || commandList.length == 0) && menu == null) + return true; + + int menuHandle = 0; + boolean commandMenu = this.menu == null || menu.isDisposed(); + if (commandMenu) { + menuHandle = OS.QMenu_new(handle); + } else { + menuHandle = menu.handle; + } + + // Add the actions that may be added by CommandArranger + if(commandList != null) { + CommandUtils.sort(commandList); + for (int i = 0; i < commandList.length; i++) { + OS.QMenu_addAction(menuHandle, Internal_PackageSupport.topHandle(commandList[i])); + } + } + + OS.QMenu_exec(menuHandle, event.x, event.y, 0); + + // Clean-up the QActions from CommandArranger and QMenu + if(commandList != null && menuHandle != 0) { + for (int i = 0; i < commandList.length; i++) { + int action = Internal_PackageSupport.topHandle(commandList[i]); + if(action != 0) { + OS.QWidget_removeAction(menuHandle, action); + } + } + } + if (commandMenu) { + QObjectDeleteWrapper.deleteSafely(menuHandle); + menuHandle = 0; + } + } + return true; +} + +boolean qt_event_keypress_pp(int widgetHandle, int key, int modifier, + int character, int nativeScanCode) { + if (!hasFocus()) { + return true; + } + + // Try if traversal would consume the key + int traversalType = getTraversalTypeForKey(key, modifier, character); + boolean isTraversalKey = traversalType != -1 ? true : false; + if (isTraversalKey) { + Event event = sendTraverseEvent(traversalType, key, modifier, character); + if (isDisposed()) + return true; + + if (event.doit) { + if (doTraversal(event)) + return true; // Key used for traversal + } + } + + + // Proceed with sending the key event since it wasn't consumed by + // traversal. + + // Call key listener + boolean cancelInKeyListener = super.qt_event_keypress_pp(widgetHandle, key, + modifier, character, nativeScanCode); + // If KeyListener set doit=false then always obey that + if (cancelInKeyListener) { + return true; + } + // By default the key event is not passed to native widget if it was a + // traversal key. Otherwise it would still traverse when traversal doIt + // has been changed to false. But if Java widget needs to pass the + // traverse key to native widget anyway then do it. + return isTraversalKey ? traverseCancel : false; +} + +boolean qt_event_keyrelease_pp( int widgetHandle, int key, int modifier, int character, int nativeScanCode ) +{ + // Focus checking is necessary because it + // 1. stops the key delivery to listeners () when control does not have focus; + // 2. stops the key delivery to native QWidget if the key event has been consumed as traversal key. + if (!hasFocus()) { + return true; + } + + if (((state & WidgetState.NO_KEY_PROPAGATE) != 0) && (widgetHandle != handle)) { + return true; + } + return sendKeyEvent( SWT.KeyUp, key, modifier, character, nativeScanCode ); +} + + +boolean qt_event_mouseButtonDblClick_pp(int widgetHandle, int button, + int x, int y, int state, int buttons) { + if (((this.state & WidgetState.NO_MOUSE_PROPAGATE) != 0) && (widgetHandle != handle)) { + return true; + } + return doHandleMouseEvent(SWT.MouseDoubleClick, widgetHandle, button, x, y, + state, buttons); +} + +boolean qt_event_mouseButtonPress_pp(int widgetHandle, int button, + int x, int y, int state, int buttons) { + if (((this.state & WidgetState.NO_MOUSE_PROPAGATE) != 0) && (widgetHandle != handle)) { + return true; + } + return doHandleMouseEvent(SWT.MouseDown, widgetHandle, button, x, y, state, + buttons); +} + +boolean qt_event_mouseButtonRelease_pp(int widgetHandle, int button, + int x, int y, int state, int buttons) { + if (((this.state & WidgetState.NO_MOUSE_PROPAGATE) != 0) && (widgetHandle != handle)) { + return true; + } + return doHandleMouseEvent(SWT.MouseUp, widgetHandle, button, x, y, state, + buttons); +} + +boolean qt_event_mouseMove(int widgetHandle, int button, int x, int y, + int state, int buttons) { + return doHandleMouseEvent(SWT.MouseMove, widgetHandle, button, x, y, state, + buttons); +} + +void qt_swt_event_widgetMoved(int widgetHandle) { + // Resize events are sent only for top native widget, + // as some Controls are made of multiple native widgets. + if (widgetHandle == topHandle) + sendEvent(SWT.Move); +} + +void qt_swt_event_widgetResized_pp(int widgetHandle, int oldWidth, int oldHeight, int width, int height, boolean sendResizeEvent) { + // Resize events are sent only for top native widget, + // as some Controls are made of multiple native widgets. + if (widgetHandle == topHandle && sendResizeEvent) + sendEvent(SWT.Resize); +} + +boolean qt_event_shortcut(int key, int modifier, int character) { + Display.mnemonicControl = this; + Control shortcutHandler = getShortcutHandler(); + if (shortcutHandler == null) { + // If there's no shortcut handler then just activate the shortcut. + return false; + } + return shortcutHandler.doProcessShortCut(key, modifier, character); +} + +void qt_swt_event_bufferFlush() { + // Next paint event is a buffer flush event + bufferFlush = true; +} + +void qt_swt_event_focusWasGained() { + try { + Display.focusEvent = SWT.FocusIn; + sendEvent(SWT.FocusIn); + } finally { + if(display != null && !display.isDisposed()) { + Display.focusEvent = SWT.None; + } + } + + +} +void qt_swt_event_focusWasLost() { + try { + Display.focusEvent = SWT.FocusOut; + sendEvent(SWT.FocusOut); + } finally { + if(display != null && !display.isDisposed()) { + Display.focusEvent = SWT.None; + } + } +} + +void qt_swt_event_widgetPainted(int widgetHandle, int x, int y, int width, + int height, int regionHandle) { + try { + isPainting = 1; + qt_swt_event_widgetPainted_handler(widgetHandle, x, y, width, height, + regionHandle); + } finally { + isPainting = 0; + } +} + +private void qt_swt_event_widgetPainted_handler(int widgetHandle, int x, + int y, int width, int height, int regionHandle) { + if ((state & WidgetState.OBSCURED) != 0) + return; + + // In the case there are multiple native widgets, the paint event is + // sent only to the "handle". + if (widgetHandle != handle) { + return; + } + + // Render the buffers created outside the paint event, if any + flushBuffers(); + + // If this is only a buffer flush event then stop here + if(bufferFlush) { + bufferFlush = false; + return; + } + + if (!hooks(SWT.Paint) && !filters(SWT.Paint)) + return; + + GC gc = new GC(this); + Event event = new Event(); + event.count = 0; + if(isMirrored()) { + event.x = getClientWidth() - x - width; + } else { + event.x = x; + } + event.y = y; + event.width = width; + event.height = height; + event.gc = gc; + try { + event.gc.setClipping(x, y, width - 1, height - 1); + sendEvent(SWT.Paint, event); + } finally { + // Painting needs to be ended also in the case the Control gets disposed in + // the paint listener. After the control is disposed it's not possible to + // call GC.dispose() because it will throw an exception. + if(!gc.isDisposed()) { + if(isDisposed()) { + GCData data = gc.getGCData(); + data.internalGc.releaseTarget(); + } + gc.dispose(); // Will throw if control is disposed + } + } +} + +/** + * 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, including the background. + * + * @exception SWTException + * + * + * @see #update() + * @see PaintListener + * @see SWT#Paint + * @see SWT#NO_BACKGROUND + * @see SWT#NO_REDRAW_RESIZE + * @see SWT#NO_MERGE_PAINTS + */ +public void redraw() { + checkWidget(); + doRedraw(); +} + +/** + * 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, including the background. If the + * all flag is true, any children of the receiver + * which intersect with the specified area will also paint their intersecting + * areas. If the all flag is false, 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 + * true if children should redraw, and + * false otherwise + * + * @exception SWTException + * + * + * @see #update() + * @see PaintListener + * @see SWT#Paint + * @see SWT#NO_BACKGROUND + * @see SWT#NO_REDRAW_RESIZE + * @see SWT#NO_MERGE_PAINTS + */ +public void redraw(int x, int y, int width, int height, boolean all) { + checkWidget(); + if(isMirrored()) { + x = getClientWidth() - x - width; + } + doRedraw(x, y, width, height); + if (all) { + redrawChildren(); + } +} + +void redrawChildren() { +} + +void releaseChildren_pp(boolean destroy) { + Command[] cmds = getCommands(); + for (int i = 0; i < cmds.length; i++) { + Command child = cmds[i]; + if (child != null && !child.isDisposed()) { + child.dispose(); + } + } + super.releaseChildren_pp(destroy); +} + +void releaseHandle_pp() { + super.releaseHandle_pp(); + parent = null; +} + +void releaseParent_pp() { + if(parent.packageProxy != null) { + parent.packageProxy.removeControl(this); + } else { + parent.removeControl_pp(this); + } +} + +void releaseWidget_pp() { + super.releaseWidget_pp(); + + if (menu != null && !menu.isDisposed()) { + menu.dispose(); + } + menu = null; + + layoutData = null; + background = null; + foreground = null; +} + +void removeCommand(final Command command) { + if (command.control != this) + return; + if (commandList == null || commandList.length == 0) + return; + if (commandList.length == 1 && command == commandList[0]) { + commandList = null; + return; + } + + int size = commandList.length; + Command[] newList = new Command[size - 1]; + int counter = 0; + for (int i = 0; i < size; i++) { + if (command != commandList[i]) { + newList[counter] = commandList[i]; + counter++; + } + } + if (counter == newList.length) { + commandList = newList; + } +} + +/** + * 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 no longer be notified + * + * @exception IllegalArgumentException + * + * @exception SWTException + * + * + * @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 no longer be notified + * + * @exception IllegalArgumentException + * + * @exception SWTException + * + * + * @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 keys are pressed and released on the system keyboard. + * + * @param listener + * the listener which should no longer be notified + * + * @exception IllegalArgumentException + * + * @exception SWTException + * + * + * @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 no longer be notified + * + * @exception IllegalArgumentException + * + * @exception SWTException + * + * + * @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 no longer be notified + * + * @exception IllegalArgumentException + * + * @exception SWTException + * + * + * @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 receiver needs to be painted. + * + * @param listener + * the listener which should no longer be notified + * + * @exception IllegalArgumentException + * + * @exception SWTException + * + * + * @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 no longer be notified + * + * @exception IllegalArgumentException + * + * @exception SWTException + * + * + * @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); +} + +final boolean sendMouseEvent(int type, int button, boolean send, int x, int y, + int modifiers, int buttons) { + Event event = makeMouseEvent(type, button, x, y, modifiers, buttons); + if (send) { + sendEvent(type, event); + if (isDisposed()) + return true; + } else { + postEvent(type, event); + } + return !event.doit; +} + +Event sendTraverseEvent(int traversalType, int key, int modifier, int character) { + // Make traverse event + Event event = makeKeyEvent(key, modifier, character, 0); + event.detail = traversalType; + event.stateMask = Display.translateModifiers(modifier); + + // Ask from the control if it would traverse with this key + // and if it should go to the native widget. + if(packageProxy != null) { + packageProxy.setTraversalFlags(traversalType, key, modifier, character); + } else { + setTraversalFlags_pp(traversalType, key, modifier, character); + } + event.doit = traverseDoit; + + // Event to the listener + if (hooks(SWT.Traverse) || filters(SWT.Traverse)) { + sendEvent(SWT.Traverse, event); + } + + return event; +} + +void setBackground_pp () { + if(backgroundImage != null) { + applyBackgroundImage(backgroundImage); + return; + } + if(background != null) { + applyBackgroundColor (background); + return; + } + Control control = findBackgroundControl (); + if(control == null) control = this; + if(control.backgroundImage != null) { + applyBackgroundImage(control.backgroundImage); + return; + } + // If this is null then it will reset the default background + applyBackgroundColor(control.background); +} + +/** + * 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. + *

+ * Note: This operation is a hint and may be overridden by the platform. For + * example, on Windows the background of a Button cannot be changed. + *

+ * + * @param color + * the new color (or null) + * + * @exception IllegalArgumentException + * + * @exception SWTException + * + */ +public void setBackground(Color color) { + checkWidget(); + if (color != null) { + if (color.isDisposed()) SWT.error(SWT.ERROR_INVALID_ARGUMENT); + } + if (background == null && color == null) { + return; + } + if(color == null) { + background = null; + } else { + // Store a copy + background = Internal_GfxPackageSupport.newColor(display, color.handle); + } + // Propagate background color change + updateBackground(); +} + +/** + * Sets the receiver's background image to the image specified by the argument, + * or to the default system color for the control if the argument is null. The + * background image is tiled to fill the available space. + *

+ * Note: This operation is a hint and may be overridden by the platform. For + * example, on Windows the background of a Button cannot be changed. + *

+ * + * @param image + * the new image (or null) + * + * @exception IllegalArgumentException + * + * @exception SWTException + * + * + * @since 3.2 + */ +public void setBackgroundImage(Image image) { + checkWidget(); + if(image == null && backgroundImage == null) { + return; + } + if (image != null) { + if (image.isDisposed ()) error (SWT.ERROR_INVALID_ARGUMENT); + if (image.type != SWT.BITMAP) error (SWT.ERROR_INVALID_ARGUMENT); + } + if (backgroundImage == image) return; + backgroundImage = image; + // Propagate background image change + updateBackground(); +} + +/** + * Sets the receiver's size and location to the rectangular area specified by + * the arguments. The x and y arguments are relative + * to the receiver's parent (or its display if its parent is null), unless the + * receiver is a shell. In this case, the x and y + * arguments are relative to the display. + *

+ * 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. + *

+ * + * @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 + * + */ +public void setBounds(int x, int y, int width, int height) { + checkWidget(); + setBounds(x, y, Math.max(0, width), Math.max(0, height), true, true); +} + +int setBounds(int x, int y, int width, int height, boolean move, + boolean resize) { + int result = 0; + Point oldSize = OS.QWidget_size(topHandle); + Point oldPos = OS.QWidget_pos(topHandle); + if (resize) { + if (oldSize.x != width || oldSize.y != height) { + if(isParentMirrored()) { + try { + Display.blockedQtEventType = OS.QSWTEVENT_WIDGETMOVED; + OS.QWidget_move(topHandle, oldPos.x - (width - oldSize.x), oldPos.y); + } finally { + Display.blockedQtEventType = OS.QEVENT_NONE; + } + } + // This will send a resize event + OS.QWidget_resize(topHandle, width, height); + result |= WidgetState.RESIZED; + } + } + if (move) { + if(isParentMirrored()) { + x = parent.getClientWidth() - x - OS.QWidget_size(topHandle).x; + } + if (oldPos.x != x || oldPos.y != y) { + // This will send a move event + OS.QWidget_move(topHandle, x, y); + result |= WidgetState.MOVED; + } + } + return result; +} + +/** + * Sets the receiver's size and location to the rectangular area specified by + * the argument. The x and y fields of the rectangle + * are relative to the receiver's parent (or its display if its parent is null). + *

+ * 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. + *

+ * + * @param rect + * the new bounds for the receiver + * + * @exception SWTException + * + */ +public void setBounds(Rectangle rect) { + checkWidget(); + if (rect == null) + error(SWT.ERROR_NULL_ARGUMENT); + setBounds(rect.x, rect.y, Math.max(0, rect.width), + Math.max(0, rect.height), true, true); +} + +/** + * If the argument is true, causes the receiver to have all mouse + * events delivered to it until the method is called with false as + * the argument. + * + * @param capture + * true to capture the mouse, and false to + * release it + * + * @exception SWTException + * + */ +public void setCapture(boolean capture) { + checkWidget(); + if(capture) { + OS.QWidget_grabMouse(handle); + } else { + OS.QWidget_releaseMouse(handle); + } +} + +/** + * Enables the receiver if the argument is true, 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 + * + */ +public void setEnabled(boolean enabled) { + checkWidget(); + if (enabled) { + state &= ~WidgetState.DISABLED; + } else { + state |= WidgetState.DISABLED; + } + Control control = null; + boolean fixFocus = false; + if (!enabled) { + if (Display.focusEvent != SWT.FocusOut) { + control = display.getFocusControl (); + fixFocus = isFocusAncestor (control); + } + } + enableWidget(enabled); + if (fixFocus) fixFocus (control); +} + +boolean setFixedFocus () { + if ((style & SWT.NO_FOCUS) != 0) return false; + return forceFocus (OS.QT_OTHERFOCUSREASON); +} + +/** + * Causes the receiver to have the keyboard focus, such that all + * keyboard events will be delivered to it. Focus reassignment will respect + * applicable platform constraints. + * + * @return true if the control got focus, and false if + * it was unable to. + * + * @exception SWTException + * + * + * @see #forceFocus + */ +public boolean setFocus() { + checkWidget(); + return setFocus(OS.QT_OTHERFOCUSREASON); +} + +boolean setFocus(int focusReason) { + if ((style & SWT.NO_FOCUS) != 0) + return false; + return forceFocus(focusReason); +} + +/** + * 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 + * + * @exception SWTException + * + */ +public void setFont(Font font) { + checkWidget(); + if (((state & WidgetState.FONT) == 0) && font == null) + return; + this.font = font; + + if (font == null) { + OS.QWidget_setFont(topHandle, OS.SwtFontCache_cache(OS.QApplication_swt_font_new(topHandle))); + } else { + if (font.isDisposed()) + SWT.error(SWT.ERROR_INVALID_ARGUMENT); + OS.QWidget_setFont(topHandle, font.handle); + } + + if (font == null) { + state &= ~WidgetState.FONT; + } else { + state |= WidgetState.FONT; + } +} + +/** + * 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. + *

+ * Note: This operation is a hint and may be overridden by the platform. + *

+ * + * @param color + * the new color (or null) + * + * @exception IllegalArgumentException + * + * @exception SWTException + * + */ +public void setForeground(Color color) { + checkWidget(); + if (color != null) { + if (color.isDisposed()) SWT.error(SWT.ERROR_INVALID_ARGUMENT); + } + if (foreground == null && color == null) { + return; + } + // Get a temporary copy of the widgets current palette, modify the + // foreground color, and set the modified palette back to the widget. + int palette = OS.QWidget_swt_palette_new(topHandle); + try { + if(color == null) { + foreground = null; + } else { + // Store a copy + foreground = Internal_GfxPackageSupport.newColor(display, color.handle); + } + setPaletteFgColor(palette, color); + OS.QWidget_setPalette(topHandle, palette); + } finally { + OS.QPalette_delete(palette); + } +} + +/** + * Sets the layout data associated with the receiver to the argument. + * + * @param layoutData + * the new layout data for the receiver. + * + * @exception SWTException + * + */ +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), + * unless the receiver is a shell. In this case, the point is relative to the + * display. + * + * @param x + * the new x coordinate for the receiver + * @param y + * the new y coordinate for the receiver + * + * @exception SWTException + * + */ +public void setLocation(int x, int y) { + checkWidget(); + setBounds(x, y, 0, 0, true, false); +} + +/** + * 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), + * unless the receiver is a shell. In this case, the point is relative to the + * display. + * + * @param location + * the new location for the receiver + * + * @exception SWTException + * + */ +public void setLocation(Point location) { + checkWidget(); + if (location == null) + error(SWT.ERROR_NULL_ARGUMENT); + setBounds(location.x, location.y, 0, 0, true, false); +} + +/** + * 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. + *

+ * Note: Disposing of a control that has a pop up menu will dispose of the menu. + * To avoid this behavior, set the menu to null before the control is disposed. + *

+ * + * @param menu + * the new pop up menu + * + * @exception IllegalArgumentException + * + * @exception SWTException + * + */ +public void setMenu(Menu menu) { + checkWidget(); + if (menu != null) { + 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; +} + +private final void setPaletteBgColor(int paletteHandle, Color color) { + int[] bkRoles = getBackgroundColorRoles(); + if (color != null) { + for (int j = 0; j < bkRoles.length; j++) { + OS.QPalette_setColor(paletteHandle, bkRoles[j], color.getRed(), + color.getGreen(), color.getBlue()); + } + } else { // Restore the default colors from application palette + int defaultPalette = OS.QApplication_swt_palette_new(); + try { + for (int j = 0; j < bkRoles.length; j++) { + OS.QPalette_swt_copyBrushFromPalette(paletteHandle, + defaultPalette, bkRoles[j]); + } + } finally { + OS.QPalette_delete(defaultPalette); + } + } +} + +private final void setPaletteBgImage(int paletteHandle, Image image) { + int[] bkRoles = getBackgroundImageRoles(); + if (image != null) { + for (int j = 0; j < bkRoles.length; j++) { + if ((findBackgroundControl () != this) && canInheritBackgroundImage()) { + // If background is inherited then brush is set to null + OS.QPalette_swt_setBrush(paletteHandle, bkRoles[j], 0); + backgroundImageInherited(image); + } else { + OS.QPalette_swt_setBrush(paletteHandle, bkRoles[j], Internal_GfxPackageSupport.getPixmapHandle(image)); + if(packageProxy != null) { + packageProxy.backgroundImageApplied(image); + } else { + backgroundImageApplied_pp(image); + } + } + } + } else { // Restore the default brushes from application palette + int defaultPalette = OS.QApplication_swt_palette_new(); + try { + for (int j = 0; j < bkRoles.length; j++) { + OS.QPalette_swt_copyBrushFromPalette(paletteHandle, + defaultPalette, bkRoles[j]); + } + } finally { + OS.QPalette_delete(defaultPalette); + } + } +} + +private final void setPaletteFgColor(int paletteHandle, Color color) { + int[] fgRoles = new int[] { OS.QPALETTE_COLORROLE_WINDOWTEXT, + OS.QPALETTE_COLORROLE_TEXT, OS.QPALETTE_COLORROLE_BUTTONTEXT }; + if (color != null) { + for (int j = 0; j < fgRoles.length; j++) { + OS.QPalette_setColor(paletteHandle, fgRoles[j], color.getRed(), + color.getGreen(), color.getBlue()); + } + } else { // Restore the default colors from application palette + int defaultPalette = OS.QApplication_swt_palette_new(); + try { + for (int j = 0; j < fgRoles.length; j++) { + OS.QPalette_swt_copyBrushFromPalette(paletteHandle, + defaultPalette, fgRoles[j]); + } + } finally { + OS.QPalette_delete(defaultPalette); + } + } +} + +/** + * Changes the parent of the widget to be the one provided if the underlying + * operating system supports this feature. Returns true if the + * parent is successfully changed. + * + * @param parent + * the new parent for the control. + * @return true if the parent is changed and false + * otherwise. + * + * @exception IllegalArgumentException + * + * @exception SWTException + * + */ +public boolean setParent(Composite parent) { + checkWidget(); + if (parent == null) + error(SWT.ERROR_NULL_ARGUMENT); + if (parent.isDisposed()) + SWT.error(SWT.ERROR_INVALID_ARGUMENT); + if (this.parent == parent) + return true; + if (!isReparentable()) + return false; + return false; +} + +boolean setRadioFocus(boolean tabbing) { + return false; +} + +boolean setRadioSelection(boolean value) { + return false; +} + +/** + * If the argument is false, 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 false are lost. When the flag is set to + * true, the entire widget is marked as needing to be redrawn. + * Nested calls to this method are stacked. + *

+ * Note: This operation is a hint and may not be supported on some platforms or + * for some widgets. + *

+ * + * @param redraw + * the new redraw state + * + * @exception SWTException + * + * + * @see #redraw(int, int, int, int, boolean) + * @see #update() + */ +public void setRedraw(boolean redraw) { + checkWidget(); + OS.QWidget_setUpdatesEnabled(handle, redraw); +} + +/** + * Sets the receiver's size to the point specified by the arguments. + *

+ * 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. + *

+ * + * @param width + * the new width for the receiver + * @param height + * the new height for the receiver + * + * @exception SWTException + * + */ +public void setSize(int width, int height) { + checkWidget(); + setBounds(0, 0, Math.max(0, width), Math.max(0, height), false, true); +} + +/** + * Sets the receiver's size to the point specified by the argument. + *

+ * Note: Attempting to set the width or height of the receiver to a negative + * number will cause them to be set to zero instead. + *

+ * + * @param size + * the new size for the receiver + * + * @exception IllegalArgumentException + * + * @exception SWTException + * + */ +public void setSize(Point size) { + checkWidget(); + if (size == null) + error(SWT.ERROR_NULL_ARGUMENT); + setBounds(0, 0, Math.max(0, size.x), Math.max(0, size.y), false, true); +} + +boolean setTabGroupFocus_pp() { + return setTabItemFocus(); +} + +boolean setTabItemFocus() { + if (!isShowing()) + return false; + return forceFocus(OS.QT_TABFOCUSREASON); +} + +/** + * 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 + * + */ +public void setToolTipText(String string) { + checkWidget(); + if (string == null) { + string = ""; + toolTipTextExists = false; + } else { + toolTipTextExists = true; + } + OS.QWidget_setToolTip(handle, string); +} + +void setTraversalFlags_pp(int type, int key, int modifier, int character) { + if ((state & WidgetState.NO_TRAVERSE) != 0) { + traverseDoit = false; + traverseCancel = false; + return; + } + + // Set doIt to true for the types that will actually traverse + int traversalFlags = SWT.TRAVERSE_ARROW_NEXT | SWT.TRAVERSE_ARROW_PREVIOUS + | SWT.TRAVERSE_TAB_NEXT | SWT.TRAVERSE_TAB_PREVIOUS + | SWT.TRAVERSE_MNEMONIC; + traverseDoit = ((type & traversalFlags) != 0); + + // If there's a default button then offer invoking it + if (type == SWT.TRAVERSE_RETURN) { + traverseDoit = (menuShell().defaultButton != null); + } + + // Cancel the traverse key event so that the key is not delivered + // to the native widget. Key events that will cause native widget + // to traverse must never go through. However, if it is known that + // the traverse key will not traverse in the current state of the widget + // then it can be let through by setting this flag. + traverseCancel = true; +} + +/** + * Marks the receiver as visible if the argument is true, and marks + * it invisible otherwise. + *

+ * 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. + *

+ * + * @param visible + * the new visibility state + * + * @exception SWTException + * + */ +public void setVisible(boolean visible) { + checkWidget(); + if (getVisible() == visible) + return; + OS.QWidget_setVisible(topHandle, visible); + if (visible) { + sendEvent(SWT.Show); + if(isDisposed()) return; + } + Control control = null; + boolean fixFocus = false; + if (!visible) { + if (Display.focusEvent != SWT.FocusOut) { + control = display.getFocusControl (); + fixFocus = isFocusAncestor (control); + } + } + if (!visible) { + sendEvent(SWT.Hide); + if (isDisposed ()) return; + } + if (fixFocus) fixFocus (control); +} + +/** + * Returns a point which is the result of converting the argument, which is + * specified in display relative coordinates, to coordinates relative to the + * receiver. + *

+ * + * @param x + * the x coordinate to be translated + * @param y + * the y coordinate to be translated + * @return the translated coordinates + * + * @exception SWTException + *

+ * + * @since 2.1 + */ +public Point toControl(int x, int y) { + checkWidget(); + Point p = OS.QWidget_mapFromGlobal(handle, x, y); + if(isMirrored()) { + p.x = getClientWidth() - p.x; + } + return p; +} + +/** + * Returns a point which is the result of converting the argument, which is + * specified in display relative coordinates, to coordinates relative to the + * receiver. + *

+ * + * @param point + * the point to be translated (must not be null) + * @return the translated coordinates + * + * @exception IllegalArgumentException + *

+ * @exception SWTException + * + */ +public Point toControl(Point point) { + checkWidget(); + if (point == null) + error(SWT.ERROR_NULL_ARGUMENT); + return toControl(point.x, point.y); +} + +/** + * Returns a point which is the result of converting the argument, which is + * specified in coordinates relative to the receiver, to display relative + * coordinates. + *

+ * + * @param x + * the x coordinate to be translated + * @param y + * the y coordinate to be translated + * @return the translated coordinates + * + * @exception SWTException + *

+ * + * @since 2.1 + */ +public Point toDisplay(int x, int y) { + checkWidget(); + if(isMirrored()) { + x = getClientWidth() - x; + } + return OS.QWidget_mapToGlobal(handle, x, y); +} + +/** + * Returns a point which is the result of converting the argument, which is + * specified in coordinates relative to the receiver, to display relative + * coordinates. + *

+ * + * @param point + * the point to be translated (must not be null) + * @return the translated coordinates + * + * @exception IllegalArgumentException + *

+ * @exception SWTException + * + */ +public Point toDisplay(Point point) { + checkWidget(); + if (point == null) + error(SWT.ERROR_NULL_ARGUMENT); + return toDisplay(point.x, point.y); +} + +/** + * Based on the argument, perform one of the expected platform traversal action. + * The argument should be one of the constants: SWT.TRAVERSE_ESCAPE + * , SWT.TRAVERSE_RETURN, SWT.TRAVERSE_TAB_NEXT, + * SWT.TRAVERSE_TAB_PREVIOUS, SWT.TRAVERSE_ARROW_NEXT + * and SWT.TRAVERSE_ARROW_PREVIOUS. + * + * @param traversal + * the type of traversal + * @return true if the traversal succeeded + * + * @exception SWTException + * + */ +public boolean traverse(int traversal) { + checkWidget(); + Event event = new Event(); + event.doit = true; + event.detail = traversal; + sendEvent(SWT.Traverse, event); + if (isDisposed()) + return true; + + // It doesn't make sense to activate mnemonic traversal by calling this + // but if it's done then traversal is attempted relative to this control. + // Normally it would be done relative to the control that had the + // shortcut event. + Display.mnemonicControl = this; + + return doTraversal(event); +} + +boolean traverseEscape() { + // Not implemented, in mobile devices there's usually no esc key + return false; +} + +boolean traverseGroup(boolean next) { + Control root = computeTabRoot(); + Control group = computeTabGroup(); + Control[] list = root.computeTabList(); + + // Find this Control, traversal is done respective to that + int length = list.length; + int index = 0; + while (index < length) { + if (list[index] == group) + break; + index++; + } + if (index >= length) + return false; + + // Traverse to the next or previous, looping around from the end or the + // beginning of the array. + int start = index, offset = (next) ? 1 : -1; + while ((index = ((index + offset + length) % length)) != start) { + Control control = list[index]; + if (!control.isDisposed() && + (control.packageProxy != null ? control.packageProxy.setTabGroupFocus() : control.setTabGroupFocus_pp())) { + return true; + } + } + if (group.isDisposed()) + return false; + return (group.packageProxy != null ? group.packageProxy.setTabGroupFocus() : group.setTabGroupFocus_pp()); +} + +boolean traverseItem(boolean next) { + // Mobile devices often don't have tab keys, only the arrows. + // Therefore the platform always suggests tab group traversal. + // However, it's possible to attempt item traversal by using + // TraverseEvents + // to override the default behavior or by calling the traverse method + // with + // item traversal type. + + // Find this Control, traversal is done respective to that + Control[] children = parent._getChildren(); + int length = children.length; + int index = 0; + while (index < length) { + if (children[index] == this) + break; + index++; + } + if (index == length) + return false; + + // Traverse to the next or previous, looping around from the end or the + // beginning of the array. + int start = index, offset = (next) ? 1 : -1; + while ((index = (index + offset + length) % length) != start) { + Control child = children[index]; + if (!child.isDisposed() && child.isTabItem()) { + if (child.setTabItemFocus()) + return true; + } + } + return false; +} + +/* + * Traverses to the next control of the control that received the last shortcut + * event. + */ +boolean traverseMnemonic(char key) { + + // SWT checks for mnemonic hit here + + if (Display.mnemonicControl == null) + return false; + Control nextControl = Display.mnemonicControl.findNextControl(false); + if (nextControl != null) { + nextControl.setFocus(OS.QT_TABFOCUSREASON); + return true; + } + return false; +} + +boolean traversePage(boolean next) { + // Not implemented, should implement for MultiPageDialog + return false; +} + +boolean traverseReturn() { + return menuShell().invokeDefaultButton(); +} + +/** + * Forces all outstanding paint requests for the widget to be processed before + * this method returns. If there are no outstanding paint request, this method + * does nothing. + *

+ * Note: This method does not cause a redraw. + *

+ * + * @exception SWTException + * + * + * @see #redraw() + * @see #redraw(int, int, int, int, boolean) + * @see PaintListener + * @see SWT#Paint + */ +public void update() { + checkWidget(); + _update(); +} + +void _update() { + // This has a problem that it dispatches other than paint events too. + OS.QCoreApplication_processEvents(Display.handle, + OS.QEVENTLOOP_EXCLUDEUSERINPUTEVENTS); + if (isDisposed()) + return; + OS.QCoreApplication_sendPostedEvents(Display.handle, handle, + OS.QEVENT_PAINT); +} + +private void updateAutoFillBackground() { + Control control = findBackgroundControl(); + boolean enabled = false; + if(control != null) { + enabled = (control.background != null || control.backgroundImage != null); + } + OS.QWidget_setAutoFillBackground(topHandle, enabled); +} + +void updateBackground() { + if(packageProxy != null) { + packageProxy.setBackground(); + } else { + setBackground_pp(); + } +} + +void updateBackgroundMode () { + int oldState = state & WidgetState.PARENT_BACKGROUND; + checkBackground (); + if (oldState != (state & WidgetState.PARENT_BACKGROUND)) { + if(packageProxy != null) { + packageProxy.setBackground(); + } else { + setBackground_pp (); + } + } +} + +void updateImages () { + // Override to update any images that should be updated after a settings change +} + +void updateLayout(boolean all) { + /* Do nothing */ +} + +void waitXRequestComplete() { + // Make XServer process all queued requests not discarding any events. + // Note that this is heavy and slow. Here goes everything, not only the + // one event we are waiting for. + OS.QApplication_syncX(); + // Make Qt process all XEvents. + Display.noInterrupt = true; + OS.QCoreApplication_processEvents(Display.handle, + OS.QEVENTLOOP_EXCLUDEUSERINPUTEVENTS); + Display.noInterrupt = false; +} +}