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); }
void resizeControl(int yScroll) { if (control != null && !control.isDisposed()) { boolean visible = OS.gtk_expander_get_expanded(handle); if (visible) { int x = OS.GTK_WIDGET_X(clientHandle); int y = OS.GTK_WIDGET_Y(clientHandle); if (x != -1 && y != -1) { int width = OS.GTK_WIDGET_WIDTH(clientHandle); int height = OS.GTK_WIDGET_HEIGHT(clientHandle); int[] property = new int[1]; OS.gtk_widget_style_get(handle, OS.focus_line_width, property, 0); y += property[0] * 2; height -= property[0] * 2; /* * Feature in GTK. When the ExpandBar is resize too small the control * shows up on top of the vertical scrollbar. This happen because the * GtkExpander does not set the size of child smaller than the request * size of its parent and because the control is not parented in the * hierarchy of the GtkScrolledWindow. * The fix is calculate the width ourselves when the scrollbar is visible. */ ScrollBar vBar = parent.verticalBar; if (vBar != null) { if (OS.GTK_WIDGET_VISIBLE(vBar.handle)) { width = OS.GTK_WIDGET_WIDTH(parent.scrolledHandle) - parent.vScrollBarWidth() - 2 * parent.spacing; } } control.setBounds(x, y - yScroll, width, Math.max(0, height), true, true); } } control.setVisible(visible); } }
/** * Returns the height of the receiver's header * * @return the height of the header * @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 int getHeaderHeight() { checkWidget(); return OS.GTK_WIDGET_HEIGHT(handle) - (expanded ? height : 0); }