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; }
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()); }
/** * 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); } } }
/** * 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); } } }
void releaseWidget() { super.releaseWidget(); if (parent.currentFocusItem == this) parent.currentFocusItem = null; parent = null; control = null; hotImage = disabledImage = null; toolTipText = null; }
/** * 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(); }
/** * 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); }
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; }
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; }
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; }
/** * 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(text)) return; super.setText(string); long /*int*/ hwnd = parent.handle; TBBUTTONINFO info = new TBBUTTONINFO(); info.cbSize = TBBUTTONINFO.sizeof; info.dwMask = OS.TBIF_TEXT | OS.TBIF_STYLE; info.fsStyle = (byte) (widgetStyle() | OS.BTNS_AUTOSIZE); long /*int*/ hHeap = OS.GetProcessHeap(), pszText = 0; if (string.length() != 0) { info.fsStyle |= OS.BTNS_SHOWTEXT; TCHAR buffer = new TCHAR(parent.getCodePage(), string, true); int byteCount = buffer.length() * TCHAR.sizeof; pszText = OS.HeapAlloc(hHeap, OS.HEAP_ZERO_MEMORY, byteCount); OS.MoveMemory(pszText, buffer, byteCount); info.pszText = pszText; } OS.SendMessage(hwnd, OS.TB_SETBUTTONINFO, id, info); if (pszText != 0) OS.HeapFree(hHeap, 0, pszText); /* * Bug in Windows. For some reason, when the font is set * before any tool item has text, the tool items resize to * a very small size. Also, a tool item will only show text * when text has already been set on one item and then a new * item is created. The fix is to use WM_SETFONT to force * the tool bar to redraw and layout. */ parent.setDropDownItems(false); long /*int*/ hFont = OS.SendMessage(hwnd, OS.WM_GETFONT, 0, 0); OS.SendMessage(hwnd, OS.WM_SETFONT, hFont, 0); parent.setDropDownItems(true); parent.layoutItems(); }
/** * Sets the receiver's hot image to the argument, which may be null indicating that no hot image * should be displayed. * * <p>The hot image is displayed when the mouse enters the receiver. * * @param image the hot image to display on the receiver (may be null) * @exception IllegalArgumentException * <ul> * <li>ERROR_INVALID_ARGUMENT - if the image has been disposed * </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 setHotImage(Image image) { checkWidget(); if ((style & SWT.SEPARATOR) != 0) return; hotImage = 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*/ gtk_enter_notify_event(long /*int*/ widget, long /*int*/ event) { parent.gtk_enter_notify_event(widget, event); drawHotImage = (parent.style & SWT.FLAT) != 0 && hotImage != null; if (drawHotImage) { ImageList imageList = parent.imageList; if (imageList != null) { int index = imageList.indexOf(hotImage); if (index != -1 && imageHandle != 0) { long /*int*/ pixbuf = imageList.getPixbuf(index); OS.gtk_image_set_from_pixbuf(imageHandle, pixbuf); } } } return 0; }
long /*int*/ gtk_event_after(long /*int*/ widget, long /*int*/ gdkEvent) { GdkEvent event = new GdkEvent(); OS.memmove(event, gdkEvent, GdkEvent.sizeof); switch (event.type) { case OS.GDK_BUTTON_PRESS: { GdkEventButton gdkEventButton = new GdkEventButton(); OS.memmove(gdkEventButton, gdkEvent, GdkEventButton.sizeof); if (gdkEventButton.button == 3) { parent.showMenu((int) gdkEventButton.x_root, (int) gdkEventButton.y_root); } break; } } return 0; }
long /*int*/ gtk_leave_notify_event(long /*int*/ widget, long /*int*/ event) { parent.gtk_leave_notify_event(widget, event); if (drawHotImage) { drawHotImage = false; if (image != null) { ImageList imageList = parent.imageList; if (imageList != null) { int index = imageList.indexOf(image); if (index != -1 && imageHandle != 0) { long /*int*/ pixbuf = imageList.getPixbuf(index); OS.gtk_image_set_from_pixbuf(imageHandle, pixbuf); } } } } return 0; }
/** * Sets the receiver's tool tip text to the argument, which may be null indicating that the * default tool tip for the control will be shown. For a control that has a default tool tip, such * as the Tree control on Windows, setting the tool tip text to an empty string replaces the * default, causing no tool tip text to be shown. * * <p>The mnemonic indicator (character '&') is not displayed in a tool tip. To display a * single '&' in the tool tip, the character '&' can be escaped by doubling it in the * string. * * @param string the new tool tip text (or null) * @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 setToolTipText(String string) { checkWidget(); if (parent.toolTipText == null) { Shell shell = parent._getShell(); setToolTipText(shell, string); } toolTipText = string; /* * Since tooltip text of a tool-item is used in overflow * menu when images are not shown, it is required to * reset the proxy menu when the tooltip text changes. * Otherwise, the old menuItem appears in the overflow * menu as a blank item. */ 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); } }
/** * 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*/ 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_ENABLED) != 0) == enabled) return; if (enabled) { fsState |= OS.TBSTATE_ENABLED; state &= ~DISABLED; } else { fsState &= ~OS.TBSTATE_ENABLED; state |= DISABLED; } OS.SendMessage(hwnd, OS.TB_SETSTATE, id, fsState); if ((style & SWT.SEPARATOR) == 0) { if (image != null) updateImages(enabled && parent.getEnabled()); } }
/** * Returns <code>true</code> if the receiver is enabled and all of the receiver's ancestors are * enabled, and <code>false</code> otherwise. A disabled control is typically not selectable from * the user interface and draws with an inactive or "grayed" look. * * @return the receiver's enabled state * @exception SWTException * <ul> * <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed * <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver * </ul> * * @see #getEnabled */ public boolean isEnabled() { checkWidget(); return getEnabled() && parent.isEnabled(); }
/** * Constructs a new instance of this class given its parent (which must be a <code>ToolBar</code>) * and a style value describing its behavior and appearance. The item is added to the end of 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 * @exception IllegalArgumentException * <ul> * <li>ERROR_NULL_ARGUMENT - if the parent is null * </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) { super(parent, checkStyle(style)); this.parent = parent; createWidget(parent.getItemCount()); }
long /*int*/ gtk_mnemonic_activate(long /*int*/ widget, long /*int*/ arg1) { return parent.gtk_mnemonic_activate(widget, arg1); }
long /*int*/ gtk_map(long /*int*/ widget) { parent.fixZOrder(); return 0; }