void setSelection(int index, boolean notify) { if (index < 0) return; int oldIndex = OS.gtk_notebook_get_current_page(handle); if (oldIndex == index) return; if (oldIndex != -1) { TabItem item = items[oldIndex]; Control control = item.control; if (control != null && !control.isDisposed()) { control.setVisible(false); } } OS.g_signal_handlers_block_matched(handle, OS.G_SIGNAL_MATCH_DATA, 0, 0, 0, 0, SWITCH_PAGE); OS.gtk_notebook_set_current_page(handle, index); OS.g_signal_handlers_unblock_matched(handle, OS.G_SIGNAL_MATCH_DATA, 0, 0, 0, 0, SWITCH_PAGE); int newIndex = OS.gtk_notebook_get_current_page(handle); if (newIndex != -1) { TabItem item = items[newIndex]; Control control = item.control; if (control != null && !control.isDisposed()) { control.setBounds(getClientArea()); control.setVisible(true); } if (notify) { Event event = new Event(); event.item = item; sendSelectionEvent(SWT.Selection, event, true); } } }
void destroyItem(TabItem item) { int index = 0; int itemCount = getItemCount(); while (index < itemCount) { if (items[index] == item) break; index++; } if (index == itemCount) error(SWT.ERROR_ITEM_NOT_REMOVED); int oldIndex = OS.gtk_notebook_get_current_page(handle); OS.g_signal_handlers_block_matched(handle, OS.G_SIGNAL_MATCH_DATA, 0, 0, 0, 0, SWITCH_PAGE); OS.gtk_notebook_remove_page(handle, index); OS.g_signal_handlers_unblock_matched(handle, OS.G_SIGNAL_MATCH_DATA, 0, 0, 0, 0, SWITCH_PAGE); System.arraycopy(items, index + 1, items, index, --itemCount - index); items[itemCount] = null; if (index == oldIndex) { int newIndex = OS.gtk_notebook_get_current_page(handle); if (newIndex != -1) { Control control = items[newIndex].getControl(); if (control != null && !control.isDisposed()) { control.setBounds(getClientArea()); control.setVisible(true); } Event event = new Event(); event.item = items[newIndex]; sendSelectionEvent(SWT.Selection, event, true); // the widget could be destroyed at this point } } }
long /*int*/ gtk_switch_page(long /*int*/ widget, long /*int*/ page, long /*int*/ page_num) { int index = OS.gtk_notebook_get_current_page(handle); if (index != -1) { Control control = items[index].getControl(); if (control != null && !control.isDisposed()) { control.setVisible(false); } } TabItem item = items[(int) /*64*/ page_num]; Control control = item.getControl(); if (control != null && !control.isDisposed()) { control.setBounds(getClientArea()); control.setVisible(true); } Event event = new Event(); event.item = item; sendSelectionEvent(SWT.Selection, event, false); return 0; }
/** * Sets the control that is shown when the item is expanded. * * @param control the new control (or null) * @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 (this.control == control) return; this.control = control; if (control != null) { control.setVisible(expanded); } parent.layoutItems(0, true); }
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); } }