void releaseImages() { TBBUTTONINFO info = new TBBUTTONINFO(); info.cbSize = TBBUTTONINFO.sizeof; info.dwMask = OS.TBIF_IMAGE | OS.TBIF_STYLE; long /*int*/ hwnd = parent.handle; OS.SendMessage(hwnd, OS.TB_GETBUTTONINFO, id, info); /* * Feature in Windows. For some reason, a tool item that has * the style BTNS_SEP does not return I_IMAGENONE when queried * for an image index, despite the fact that no attempt has been * made to assign an image to the item. As a result, operations * on an image list that use the wrong index cause random results. * The fix is to ensure that the tool item is not a separator * before using the image index. Since separators cannot have * an image and one is never assigned, this is not a problem. */ if ((info.fsStyle & OS.BTNS_SEP) == 0 && info.iImage != OS.I_IMAGENONE) { ImageList imageList = parent.getImageList(); ImageList hotImageList = parent.getHotImageList(); ImageList disabledImageList = parent.getDisabledImageList(); if (imageList != null) imageList.put(info.iImage, null); if (hotImageList != null) hotImageList.put(info.iImage, null); if (disabledImageList != null) disabledImageList.put(info.iImage, null); } }
public void setImage(Image image) { checkWidget(); if ((style & SWT.SEPARATOR) != 0) return; super.setImage(image); if (image != null) { ImageList imageList = parent.imageList; if (imageList == null) imageList = parent.imageList = new ImageList(); int imageIndex = imageList.indexOf(image); if (imageIndex == -1) { imageIndex = imageList.add(image); } else { imageList.put(imageIndex, image); } long /*int*/ pixbuf = imageList.getPixbuf(imageIndex); OS.gtk_image_set_from_pixbuf(imageHandle, pixbuf); } else { OS.gtk_image_set_from_pixbuf(imageHandle, 0); } /* * If Text/Image of a tool-item changes, then it is * required to reset the proxy menu. Otherwise, the * old menuItem appears in the overflow menu. */ if ((style & SWT.DROP_DOWN) != 0) { proxyMenuItem = 0; proxyMenuItem = OS.gtk_tool_item_retrieve_proxy_menu_item(handle); OS.g_signal_connect( proxyMenuItem, OS.activate, ToolBar.menuItemSelectedFunc.getAddress(), handle); } parent.relayout(); }
void click(boolean dropDown) { long /*int*/ hwnd = parent.handle; if (OS.GetKeyState(OS.VK_LBUTTON) < 0) return; int index = (int) /*64*/ OS.SendMessage(hwnd, OS.TB_COMMANDTOINDEX, id, 0); RECT rect = new RECT(); OS.SendMessage(hwnd, OS.TB_GETITEMRECT, index, rect); int hotIndex = (int) /*64*/ OS.SendMessage(hwnd, OS.TB_GETHOTITEM, 0, 0); /* * In order to emulate all the processing that * happens when a mnemonic key is pressed, fake * a mouse press and release. This will ensure * that radio and pull down items are handled * properly. */ int y = rect.top + (rect.bottom - rect.top) / 2; long /*int*/ lParam = OS.MAKELPARAM(dropDown ? rect.right - 1 : rect.left, y); parent.ignoreMouse = true; OS.SendMessage(hwnd, OS.WM_LBUTTONDOWN, 0, lParam); OS.SendMessage(hwnd, OS.WM_LBUTTONUP, 0, lParam); parent.ignoreMouse = false; if (hotIndex != -1) { OS.SendMessage(hwnd, OS.TB_SETHOTITEM, hotIndex, 0); } }
long /*int*/ gtk_clicked(long /*int*/ widget) { Event event = new Event(); if ((style & SWT.DROP_DOWN) != 0) { long /*int*/ eventPtr = OS.gtk_get_current_event(); if (eventPtr != 0) { GdkEvent gdkEvent = new GdkEvent(); OS.memmove(gdkEvent, eventPtr, GdkEvent.sizeof); long /*int*/ topHandle = topHandle(); switch (gdkEvent.type) { case OS.GDK_KEY_RELEASE: // Fall Through.. case OS.GDK_BUTTON_PRESS: case OS.GDK_2BUTTON_PRESS: case OS.GDK_BUTTON_RELEASE: { boolean isArrow = false; if (OS.GTK_VERSION < OS.VERSION(2, 6, 0)) { double[] x_win = new double[1]; double[] y_win = new double[1]; OS.gdk_event_get_coords(eventPtr, x_win, y_win); int x = OS.GTK_WIDGET_X(arrowHandle) - OS.GTK_WIDGET_X(handle); int width = OS.GTK_WIDGET_WIDTH(arrowHandle); if ((((parent.style & SWT.RIGHT_TO_LEFT) == 0) && x <= (int) x_win[0]) || (((parent.style & SWT.RIGHT_TO_LEFT) != 0) && (int) x_win[0] <= x + width)) { isArrow = true; } } else if (widget == arrowHandle) { isArrow = true; topHandle = widget; /* * Feature in GTK. ArrowButton stays in toggled state if there is no popup menu. * It is required to set back the state of arrow to normal state after it is clicked. */ OS.g_signal_handlers_block_matched( widget, OS.G_SIGNAL_MATCH_DATA, 0, 0, 0, 0, CLICKED); OS.gtk_toggle_button_set_active(widget, false); OS.g_signal_handlers_unblock_matched( widget, OS.G_SIGNAL_MATCH_DATA, 0, 0, 0, 0, CLICKED); } if (isArrow) { event.detail = SWT.ARROW; event.x = OS.GTK_WIDGET_X(topHandle); if ((parent.style & SWT.MIRRORED) != 0) event.x = parent.getClientWidth() - OS.GTK_WIDGET_WIDTH(topHandle) - event.x; event.y = OS.GTK_WIDGET_Y(topHandle) + OS.GTK_WIDGET_HEIGHT(topHandle); } break; } } OS.gdk_event_free(eventPtr); } } if ((style & SWT.RADIO) != 0) { if ((parent.getStyle() & SWT.NO_RADIO_GROUP) == 0) { selectRadio(); } } sendSelectionEvent(SWT.Selection, event, false); return 0; }
/** * Returns a rectangle describing the receiver's size and location relative to its parent. * * @return the receiver's bounding rectangle * @exception SWTException * <ul> * <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver * </ul> */ public Rectangle getBounds() { checkWidget(); parent.forceResize(); long /*int*/ topHandle = topHandle(); int x, y, width, height; x = OS.GTK_WIDGET_X(topHandle); y = OS.GTK_WIDGET_Y(topHandle); width = OS.GTK_WIDGET_WIDTH(topHandle); height = OS.GTK_WIDGET_HEIGHT(topHandle); if ((parent.style & SWT.MIRRORED) != 0) x = parent.getClientWidth() - width - x; if ((style & SWT.SEPARATOR) != 0 && control != null) height = Math.max(height, 23); return new Rectangle(x, y, width, height); }
boolean isTabGroup() { ToolItem[] tabList = parent._getTabItemList(); if (tabList != null) { for (int i = 0; i < tabList.length; i++) { if (tabList[i] == this) return true; } } if ((style & SWT.SEPARATOR) != 0) return true; int index = parent.indexOf(this); if (index == 0) return true; ToolItem previous = parent.getItem(index - 1); return (previous.getStyle() & SWT.SEPARATOR) != 0; }
void createHandle(int index) { int parentHandle = parent.handle; if ((style & SWT.SEPARATOR) != 0) { int orientation = (parent.style & SWT.HORIZONTAL) != 0 ? OS.XmVERTICAL : OS.XmHORIZONTAL; int[] argList = { OS.XmNheight, orientation == OS.XmVERTICAL ? DEFAULT_HEIGHT : DEFAULT_SEPARATOR_WIDTH, OS.XmNwidth, orientation == OS.XmHORIZONTAL ? DEFAULT_WIDTH : DEFAULT_SEPARATOR_WIDTH, OS.XmNancestorSensitive, 1, OS.XmNpositionIndex, index, OS.XmNorientation, orientation, OS.XmNseparatorType, (parent.style & SWT.FLAT) != 0 ? OS.XmSHADOW_ETCHED_IN : OS.XmSHADOW_ETCHED_OUT, }; handle = OS.XmCreateSeparator(parentHandle, null, argList, argList.length / 2); if (handle == 0) error(SWT.ERROR_NO_HANDLES); return; } int[] argList = { OS.XmNwidth, DEFAULT_WIDTH, OS.XmNheight, DEFAULT_HEIGHT, OS.XmNrecomputeSize, 0, OS.XmNhighlightThickness, (parent.style & SWT.NO_FOCUS) != 0 ? 0 : 1, OS.XmNmarginWidth, 2, OS.XmNmarginHeight, 1, OS.XmNtraversalOn, (parent.style & SWT.NO_FOCUS) != 0 ? 0 : 1, OS.XmNpositionIndex, index, OS.XmNshadowType, OS.XmSHADOW_OUT, OS.XmNancestorSensitive, 1, }; handle = OS.XmCreateDrawnButton(parentHandle, null, argList, argList.length / 2); if (handle == 0) error(SWT.ERROR_NO_HANDLES); Control control = parent.findBackgroundControl(); if (control == null) control = parent; setBackgroundPixel(parent.getBackgroundPixel()); }
/** * Sets the receiver's text. The string may include the mnemonic character. * * <p>Mnemonics are indicated by an '&' that causes the next character to be the mnemonic. * When the user presses a key sequence that matches the mnemonic, a selection event occurs. On * most platforms, the mnemonic appears underlined but may be emphasised in a platform specific * manner. The mnemonic indicator character '&' can be escaped by doubling it in the string, * causing a single '&' to be displayed. * * @param string the new text * @exception IllegalArgumentException * <ul> * <li>ERROR_NULL_ARGUMENT - if the text is null * </ul> * * @exception SWTException * <ul> * <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver * </ul> */ public void setText(String string) { checkWidget(); if (string == null) error(SWT.ERROR_NULL_ARGUMENT); if ((style & SWT.SEPARATOR) != 0) return; if (string.equals(this.text)) return; super.setText(string); if (labelHandle == 0) return; char[] chars = fixMnemonic(string); byte[] buffer = Converter.wcsToMbcs(null, chars, true); OS.gtk_label_set_text_with_mnemonic(labelHandle, buffer); if ((style & SWT.DROP_DOWN) != 0 && OS.GTK_VERSION < OS.VERSION(2, 6, 0)) { if (string.length() != 0) { OS.gtk_widget_show(labelHandle); } else { OS.gtk_widget_hide(labelHandle); } } /* * If Text/Image of a tool-item changes, then it is * required to reset the proxy menu. Otherwise, the * old menuItem appears in the overflow menu. */ if ((style & SWT.DROP_DOWN) != 0) { proxyMenuItem = 0; proxyMenuItem = OS.gtk_tool_item_retrieve_proxy_menu_item(handle); OS.g_signal_connect( proxyMenuItem, OS.activate, ToolBar.menuItemSelectedFunc.getAddress(), handle); } parent.relayout(); }
/** * Sets the selection state of the receiver. * * <p>When the receiver is of type <code>CHECK</code> or <code>RADIO</code>, it is selected when * it is checked (which some platforms draw as a pushed in button). * * @param selected the new selection state * @exception SWTException * <ul> * <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver * </ul> */ public void setSelection(boolean selected) { checkWidget(); if ((style & (SWT.CHECK | SWT.RADIO)) == 0) return; long /*int*/ hwnd = parent.handle; int fsState = (int) /*64*/ OS.SendMessage(hwnd, OS.TB_GETSTATE, id, 0); /* * Feature in Windows. When TB_SETSTATE is used to set the * state of a tool item, the item redraws even when the state * has not changed. The fix is to detect this case and avoid * setting the state. */ if (((fsState & OS.TBSTATE_CHECKED) != 0) == selected) return; if (selected) { fsState |= OS.TBSTATE_CHECKED; } else { fsState &= ~OS.TBSTATE_CHECKED; } OS.SendMessage(hwnd, OS.TB_SETSTATE, id, fsState); /* * Bug in Windows. When a tool item with the style * BTNS_CHECK or BTNS_CHECKGROUP is selected and then * disabled, the item does not draw using the disabled * image. The fix is to use the disabled image in all * image lists for the item. * * NOTE: This means that the image list must be updated * when the selection changes in a disabled tool item. */ if ((style & (SWT.CHECK | SWT.RADIO)) != 0) { if (!getEnabled() || !parent.getEnabled()) { updateImages(false); } } }
public void setImage(Image image) { checkWidget(); if ((style & SWT.SEPARATOR) != 0) return; if (image != null && image.isDisposed()) error(SWT.ERROR_INVALID_ARGUMENT); super.setImage(image); updateImages(getEnabled() && parent.getEnabled()); }
int XKeyPress(int w, int client_data, int call_data, int continue_to_dispatch) { int result = 0; XKeyEvent xEvent = new XKeyEvent(); OS.memmove(xEvent, call_data, XKeyEvent.sizeof); int[] keysym = new int[1]; OS.XLookupString(xEvent, null, 0, keysym, null); keysym[0] &= 0xFFFF; switch (keysym[0]) { case OS.XK_space: click(false, xEvent.state); result = 1; break; case OS.XK_Down: if ((style & SWT.DROP_DOWN) != 0) { click(true, xEvent.state); result = 1; } break; } /* * Forward the key event to the parent. * This is necessary so that key listeners * in the parent will be called, despite the * fact that the event did not really occur * in X in the parent. This is done to be * compatible with Windows. */ xEvent.window = OS.XtWindow(parent.handle); // OS.memmove (callData, xEvent, XKeyEvent.sizeof); parent.XKeyPress(w, client_data, call_data, continue_to_dispatch); if (result == 1) { OS.memmove(continue_to_dispatch, new int[1], 4); } return result; }
/** * Sets the width of the receiver, for <code>SEPARATOR</code> ToolItems. * * @param width the new width * @exception SWTException * <ul> * <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver * </ul> */ public void setWidth(int width) { checkWidget(); if ((style & SWT.SEPARATOR) == 0) return; if (width < 0 || this.width == width) return; this.width = width; parent.relayout(); }
int XPointerMotion(int w, int client_data, int call_data, int continue_to_dispatch) { display.addMouseHoverTimeOut(handle); /* * Forward the mouse event to the parent. * This is necessary so that mouse listeners * in the parent will be called, despite the * fact that the event did not really occur * in X in the parent. This is done to be * compatible with Windows. */ XMotionEvent xEvent = new XMotionEvent(); OS.memmove(xEvent, call_data, XMotionEvent.sizeof); int[] argList = {OS.XmNx, 0, OS.XmNy, 0}; OS.XtGetValues(handle, argList, argList.length / 2); xEvent.window = OS.XtWindow(parent.handle); xEvent.x += argList[1]; xEvent.y += argList[3]; /* * This code is intentionally commented. * Currently, the implementation of the * mouse move code in the parent interferes * with tool tips for tool items. */ // OS.memmove (callData, xEvent, XButtonEvent.sizeof); // parent.XPointerMotion (w, client_data, call_data, continue_to_dispatch); if (!parent.sendMouseEvent(SWT.MouseMove, xEvent)) { OS.memmove(continue_to_dispatch, new int[1], 4); return 1; } return 0; }
int XButtonRelease(int w, int client_data, int call_data, int continue_to_dispatch) { display.hideToolTip(); XButtonEvent xEvent = new XButtonEvent(); OS.memmove(xEvent, call_data, XButtonEvent.sizeof); /* * Forward the mouse event to the parent. * This is necessary so that mouse listeners * in the parent will be called, despite the * fact that the event did not really occur * in X in the parent. This is done to be * compatible with Windows. */ int[] argList = {OS.XmNx, 0, OS.XmNy, 0}; OS.XtGetValues(handle, argList, argList.length / 2); xEvent.window = OS.XtWindow(parent.handle); xEvent.x += argList[1]; xEvent.y += argList[3]; OS.memmove(call_data, xEvent, XButtonEvent.sizeof); int result = parent.XButtonRelease(w, client_data, call_data, continue_to_dispatch); xEvent.x -= argList[1]; xEvent.y -= argList[3]; if (result == 0 && xEvent.button == 1) { int[] argList2 = {OS.XmNwidth, 0, OS.XmNheight, 0}; OS.XtGetValues(handle, argList2, argList2.length / 2); int width = argList2[1], height = argList2[3]; if (0 <= xEvent.x && xEvent.x < width && 0 <= xEvent.y && xEvent.y < height) { click(xEvent.x > width - 12, xEvent.state); } setDrawPressed(set); } return result; }
/** * Enables the receiver if the argument is <code>true</code>, and disables it otherwise. * * <p>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>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver * </ul> */ public void setEnabled(boolean enabled) { checkWidget(); long /*int*/ topHandle = topHandle(); if (OS.GTK_WIDGET_SENSITIVE(topHandle) == enabled) return; OS.gtk_widget_set_sensitive(topHandle, enabled); if (enabled) { /* * Bug in GTK. GtkButton requires an enter notify before it * allows the button to be pressed, but events are dropped when * widgets are insensitive. The fix is to hide and show the * button if the pointer is within its bounds. */ int[] x = new int[1], y = new int[1]; OS.gdk_window_get_pointer(parent.paintWindow(), x, y, null); if (getBounds().contains(x[0], y[0])) { OS.gtk_widget_hide(handle); OS.gtk_widget_show(handle); } } else { /* * Bug in GTK. Starting with 2.14, if a button is disabled * through on a button press, the field which keeps track * whether the pointer is currently in the button is never updated. * As a result, when it is re-enabled it automatically enters * a PRELIGHT state. The fix is to set a NORMAL state. */ if (OS.GTK_VERSION >= OS.VERSION(2, 14, 0)) { OS.gtk_widget_set_state(topHandle, OS.GTK_STATE_NORMAL); } } }
/** * Sets the control that is used to fill the bounds of the item when the item is a <code>SEPARATOR * </code>. * * @param control the new control * @exception IllegalArgumentException * <ul> * <li>ERROR_INVALID_ARGUMENT - if the control has been disposed * <li>ERROR_INVALID_PARENT - if the control is not in the same widget tree * </ul> * * @exception SWTException * <ul> * <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver * </ul> */ public void setControl(Control control) { checkWidget(); if (control != null) { if (control.isDisposed()) error(SWT.ERROR_INVALID_ARGUMENT); if (control.parent != parent) error(SWT.ERROR_INVALID_PARENT); } if ((style & SWT.SEPARATOR) == 0) return; if (this.control == control) return; this.control = control; int[] argList = { OS.XmNseparatorType, control == null ? ((parent.style & SWT.FLAT) != 0 ? OS.XmSHADOW_ETCHED_IN : OS.XmSHADOW_ETCHED_OUT) : OS.XmNO_LINE, }; OS.XtSetValues(handle, argList, argList.length / 2); if (control != null && !control.isDisposed()) { /* * It is possible that the control was created with a * z-order below that of the current tool item. In this * case, the control is not visible because it is * obscured by the tool item. The fix is to move the * control above this tool item in the z-order. * The code below is similar to the code found in * setZOrder. */ int xDisplay = OS.XtDisplay(handle); if (xDisplay == 0) return; if (!OS.XtIsRealized(handle)) { Shell shell = parent.getShell(); shell.realizeWidget(); } int topHandle1 = control.topHandle(); int window1 = OS.XtWindow(topHandle1); if (window1 == 0) return; int topHandle2 = this.topHandle(); int window2 = OS.XtWindow(topHandle2); if (window2 == 0) return; XWindowChanges struct = new XWindowChanges(); struct.sibling = window2; struct.stack_mode = OS.Above; int screen = OS.XDefaultScreen(xDisplay); int flags = OS.CWStackMode | OS.CWSibling; OS.XReconfigureWMWindow(xDisplay, window1, screen, flags, struct); } parent.relayout(); }
void releaseWidget() { super.releaseWidget(); if (parent.currentFocusItem == this) parent.currentFocusItem = null; parent = null; control = null; hotImage = disabledImage = null; toolTipText = null; }
/** * Enables the receiver if the argument is <code>true</code>, and disables it otherwise. * * <p>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>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver * </ul> */ public void setEnabled(boolean enabled) { checkWidget(); OS.UIElement_IsEnabled(handle, enabled); updateImages(enabled && parent.getEnabled()); if (arrowHandle != 0) { OS.UIElement_Opacity(arrowHandle, enabled ? 1 : 0.4); } }
/** * Sets the width of the receiver, for <code>SEPARATOR</code> ToolItems. * * @param width the new width. If the new value is <code>SWT.DEFAULT</code>, the width is a * fixed-width area whose amount is determined by the platform. If the new value is 0 a * vertical or horizontal line will be drawn, depending on the setting of the corresponding * style bit (<code>SWT.VERTICAL</code> or <code>SWT.HORIZONTAL</code>). If the new value is * <code>SWT.SEPARATOR_FILL</code> a variable-width space is inserted that acts as a spring * between the two adjoining items which will push them out to the extent of the containing * ToolBar. * @exception SWTException * <ul> * <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver * </ul> */ public void setWidth(int width) { checkWidget(); if ((style & SWT.SEPARATOR) == 0) return; if (width < 0) return; boolean isVertical = (parent.style & SWT.VERTICAL) != 0; OS.gtk_widget_set_size_request(handle, width, isVertical ? 6 : 15); parent.relayout(); }
/** * Sets the receiver's text. The string may include the mnemonic character. * * <p>Mnemonics are indicated by an '&' that causes the next character to be the mnemonic. * When the user presses a key sequence that matches the mnemonic, a selection event occurs. On * most platforms, the mnemonic appears underlined but may be emphasised in a platform specific * manner. The mnemonic indicator character '&' can be escaped by doubling it in the string, * causing a single '&' to be displayed. * * @param string the new text * @exception IllegalArgumentException * <ul> * <li>ERROR_NULL_ARGUMENT - if the text is null * </ul> * * @exception SWTException * <ul> * <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver * </ul> */ public void setText(String string) { checkWidget(); if (string == null) error(SWT.ERROR_NULL_ARGUMENT); if ((style & SWT.SEPARATOR) != 0) return; super.setText(string); parent.relayout(); redraw(); }
void releaseWidget() { super.releaseWidget(); display.releaseToolTipHandle(handle); if (parent.lastFocus == this) parent.lastFocus = null; control = null; toolTipText = null; image = disabledImage = hotImage = null; }
public void setImage(Image image) { checkWidget(); if (image != null && image.isDisposed()) error(SWT.ERROR_INVALID_ARGUMENT); if ((style & SWT.SEPARATOR) != 0) return; super.setImage(image); parent.relayout(); redraw(); }
int hoverProc(int id) { boolean showTip = toolTipText != null; parent.hoverProc(id, !showTip); if (showTip) { display.showToolTip(handle, toolTipText); } return 0; }
boolean setTabItemFocus() { if (parent.setTabItemFocus()) { long /*int*/ hwnd = parent.handle; int index = (int) /*64*/ OS.SendMessage(hwnd, OS.TB_COMMANDTOINDEX, id, 0); OS.SendMessage(hwnd, OS.TB_SETHOTITEM, index, 0); return true; } return false; }
LRESULT wmCommandChild(long /*int*/ wParam, long /*int*/ lParam) { if ((style & SWT.RADIO) != 0) { if ((parent.getStyle() & SWT.NO_RADIO_GROUP) == 0) { selectRadio(); } } sendSelectionEvent(SWT.Selection); return null; }
/** * Constructs a new instance of this class given its parent (which must be a <code>ToolBar</code> * ), a style value describing its behavior and appearance, and the index at which to place it in * the items maintained by its parent. * * <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. * * @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 * @param index the zero-relative index to store the receiver in its parent * @exception IllegalArgumentException * <ul> * <li>ERROR_NULL_ARGUMENT - if the parent is null * <li>ERROR_INVALID_RANGE - if the index is not between 0 and the number of elements in the * parent (inclusive) * </ul> * * @exception SWTException * <ul> * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the parent * <li>ERROR_INVALID_SUBCLASS - if this class is not an allowed subclass * </ul> * * @see SWT#PUSH * @see SWT#CHECK * @see SWT#RADIO * @see SWT#SEPARATOR * @see SWT#DROP_DOWN * @see Widget#checkSubclass * @see Widget#getStyle */ public ToolItem(ToolBar parent, int style, int index) { super(parent, checkStyle(style)); this.parent = parent; int count = parent.getItemCount(); if (!(0 <= index && index <= count)) { error(SWT.ERROR_INVALID_RANGE); } createWidget(index); }
void selectRadio() { int index = 0; ToolItem[] items = parent.getItems(); while (index < items.length && items[index] != this) index++; int i = index - 1; while (i >= 0 && items[i].setRadioSelection(false)) --i; int j = index + 1; while (j < items.length && items[j].setRadioSelection(false)) j++; setSelection(true); }
/** * Sets the control that is used to fill the bounds of the item when the item is a <code>SEPARATOR * </code>. * * @param control the new control * @exception IllegalArgumentException * <ul> * <li>ERROR_INVALID_ARGUMENT - if the control has been disposed * <li>ERROR_INVALID_PARENT - if the control is not in the same widget tree * </ul> * * @exception SWTException * <ul> * <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver * </ul> */ public void setControl(Control control) { checkWidget(); if (control != null) { if (control.isDisposed()) error(SWT.ERROR_INVALID_ARGUMENT); if (control.parent != parent) error(SWT.ERROR_INVALID_PARENT); } if ((style & SWT.SEPARATOR) == 0) return; if (this.control == control) return; this.control = control; parent.relayout(); }
/** * Sets the width of the receiver, for <code>SEPARATOR</code> ToolItems. * * @param width the new width. If the new value is <code>SWT.DEFAULT</code>, the width is a * fixed-width area whose amount is determined by the platform. If the new value is 0 a * vertical or horizontal line will be drawn, depending on the setting of the corresponding * style bit (<code>SWT.VERTICAL</code> or <code>SWT.HORIZONTAL</code>). If the new value is * <code>SWT.SEPARATOR_FILL</code> a variable-width space is inserted that acts as a spring * between the two adjoining items which will push them out to the extent of the containing * ToolBar. * @exception SWTException * <ul> * <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver * </ul> */ public void setWidth(int width) { checkWidget(); if ((style & SWT.SEPARATOR) == 0) return; if (width < 0) return; long /*int*/ hwnd = parent.handle; TBBUTTONINFO info = new TBBUTTONINFO(); info.cbSize = TBBUTTONINFO.sizeof; info.dwMask = OS.TBIF_SIZE; info.cx = cx = (short) width; OS.SendMessage(hwnd, OS.TB_SETBUTTONINFO, id, info); parent.layoutItems(); }
long /*int*/ gtk_button_release_event(long /*int*/ widget, long /*int*/ event) { GdkEventButton gdkEvent = new GdkEventButton(); OS.memmove(gdkEvent, event, GdkEventButton.sizeof); double x = gdkEvent.x; gdkEvent.x += OS.GTK_WIDGET_X(handle); double y = gdkEvent.y; gdkEvent.y += OS.GTK_WIDGET_Y(handle); OS.memmove(event, gdkEvent, GdkEventButton.sizeof); long /*int*/ result = parent.gtk_button_release_event(widget, event); gdkEvent.x = x; gdkEvent.y = y; OS.memmove(event, gdkEvent, GdkEventButton.sizeof); return result; }