/** * Returns a rectangle describing the receiver's size and location relative to its parent at a * column in the table. * * @param index the index that specifies the column * @return the receiver's bounding column 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(int index) { checkWidget(); if (!parent.checkData(this)) error(SWT.ERROR_WIDGET_DISPOSED); int /*long*/ parentHandle = parent.handle; int /*long*/ column = 0; if (index >= 0 && index < parent.columnCount) { column = parent.columns[index].handle; } else { column = OS.gtk_tree_view_get_column(parentHandle, index); } if (column == 0) return new Rectangle(0, 0, 0, 0); int /*long*/ path = OS.gtk_tree_model_get_path(parent.modelHandle, handle); OS.gtk_widget_realize(parentHandle); GdkRectangle rect = new GdkRectangle(); OS.gtk_tree_view_get_cell_area(parentHandle, path, column, rect); OS.gtk_tree_path_free(path); if ((parent.getStyle() & SWT.MIRRORED) != 0) rect.x = parent.getClientWidth() - rect.width - rect.x; if (index == 0 && (parent.style & SWT.CHECK) != 0) { if (OS.GTK_VERSION >= OS.VERSION(2, 1, 3)) { int[] x = new int[1], w = new int[1]; OS.gtk_tree_view_column_cell_get_position(column, parent.checkRenderer, x, w); rect.x += x[0] + w[0]; rect.width -= x[0] + w[0]; } else { int[] w = new int[1]; OS.gtk_cell_renderer_get_size( parent.checkRenderer, parentHandle, null, null, null, w, null); int[] buffer = new int[1]; OS.gtk_widget_style_get(parentHandle, OS.horizontal_separator, buffer, 0); rect.x += w[0] + buffer[0]; rect.width -= w[0] + buffer[0]; } } int width = OS.gtk_tree_view_column_get_visible(column) ? rect.width + 1 : 0; return new Rectangle(rect.x, rect.y, width, rect.height + 1); }
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 a rectangle describing the size and location relative to its parent of the text at a * column in the table. An empty rectangle is returned if index exceeds the index of the table's * last column. * * @param index the index that specifies the column * @return the receiver's bounding text 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> * * @since 3.3 */ public Rectangle getTextBounds(int index) { checkWidget(); if (!parent.checkData(this)) error(SWT.ERROR_WIDGET_DISPOSED); int count = Math.max(1, parent.getColumnCount()); if (0 > index || index > count - 1) return new Rectangle(0, 0, 0, 0); // TODO fully test on early and later versions of GTK // shifted a bit too far right on later versions of GTK - however, old Tree also had this // problem int /*long*/ parentHandle = parent.handle; int /*long*/ column = 0; if (index >= 0 && index < parent.columnCount) { column = parent.columns[index].handle; } else { column = OS.gtk_tree_view_get_column(parentHandle, index); } if (column == 0) return new Rectangle(0, 0, 0, 0); int /*long*/ textRenderer = parent.getTextRenderer(column); int /*long*/ pixbufRenderer = parent.getPixbufRenderer(column); if (textRenderer == 0 || pixbufRenderer == 0) return new Rectangle(0, 0, 0, 0); int /*long*/ path = OS.gtk_tree_model_get_path(parent.modelHandle, handle); OS.gtk_widget_realize(parentHandle); boolean isExpander = OS.gtk_tree_model_iter_n_children(parent.modelHandle, handle) > 0; boolean isExpanded = OS.gtk_tree_view_row_expanded(parentHandle, path); OS.gtk_tree_view_column_cell_set_cell_data( column, parent.modelHandle, handle, isExpander, isExpanded); GdkRectangle rect = new GdkRectangle(); OS.gtk_tree_view_get_cell_area(parentHandle, path, column, rect); OS.gtk_tree_path_free(path); if ((parent.getStyle() & SWT.MIRRORED) != 0) rect.x = parent.getClientWidth() - rect.width - rect.x; int right = rect.x + rect.width; int[] x = new int[1], w = new int[1]; parent.ignoreSize = true; OS.gtk_cell_renderer_get_size(textRenderer, parentHandle, null, null, null, w, null); parent.ignoreSize = false; int[] buffer = new int[1]; if (OS.gtk_tree_view_get_expander_column(parentHandle) == column) { OS.gtk_widget_style_get(parentHandle, OS.expander_size, buffer, 0); rect.x += buffer[0] + TreeItem.EXPANDER_EXTRA_PADDING; } OS.gtk_widget_style_get(parentHandle, OS.horizontal_separator, buffer, 0); int horizontalSeparator = buffer[0]; rect.x += horizontalSeparator; if (OS.GTK_VERSION >= OS.VERSION(2, 1, 3)) { OS.gtk_tree_view_column_cell_get_position(column, textRenderer, x, null); rect.x += x[0]; } else { if ((parent.style & SWT.CHECK) != 0) { OS.gtk_cell_renderer_get_size( parent.checkRenderer, parentHandle, null, null, null, w, null); rect.x += w[0] + horizontalSeparator; } OS.gtk_cell_renderer_get_size(pixbufRenderer, parentHandle, null, null, null, w, null); rect.x += w[0] + horizontalSeparator; } if (parent.columnCount > 0) { if (rect.x + rect.width > right) { rect.width = Math.max(0, right - rect.x); } } int width = OS.gtk_tree_view_column_get_visible(column) ? rect.width + 1 : 0; return new Rectangle(rect.x, rect.y, width, rect.height + 1); }