diff options
author | Xi Yan | 2018-07-04 20:50:22 +0000 |
---|---|---|
committer | Xi Yan | 2018-07-10 14:01:04 +0000 |
commit | 90b11d0439eaf39696ee5c80da07e42a77c9ce34 (patch) | |
tree | 027b8adc86ca8e7dc511c24491196ba183ca64b4 /bundles/org.eclipse.swt/Eclipse SWT | |
parent | 2ef6954b2724f4b0e6be7d10562b1cdac3ce7206 (diff) | |
download | eclipse.platform.swt-90b11d0439eaf39696ee5c80da07e42a77c9ce34.tar.gz eclipse.platform.swt-90b11d0439eaf39696ee5c80da07e42a77c9ce34.tar.xz eclipse.platform.swt-90b11d0439eaf39696ee5c80da07e42a77c9ce34.zip |
Bug 531882 (Snippet230_tableCol_icon_packing) - [Gtk3] Snippet230,
tablecolumn icons on right size get cut off
1) In GTK3, event.width in PaintItem is the same as the one previously
set in MeasureItem. Snippet230 paints icons at the default event.width
position on the right of text in PaintItem, so the icons were painted
too far right as a result. This was fixed by explicitly setting
event.width to be used in PaintItem to the default event.width using
gtk_cell_renderer_set_fixed_size.
2) Custom drawn icons in the expander column of Tree is not positioned
correctly. Fixed by adding expander arrow indent in the x position.
3) Calling TreeColumn#pack() for the first time do not account for the
indent in the expander column because
gtk_tree_view_get_expander_column() returns 0 if expander column is not
visible. This was fixed by setting column to visible beforehand in
Tree#calculateWidth.
Change-Id: I04a26c94ff716c1a52c84d2dbe8ef96386b17035
Signed-off-by: Xi Yan <xixiyan@redhat.com>
Diffstat (limited to 'bundles/org.eclipse.swt/Eclipse SWT')
-rw-r--r-- | bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Table.java | 2 | ||||
-rw-r--r-- | bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Tree.java | 32 |
2 files changed, 29 insertions, 5 deletions
diff --git a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Table.java b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Table.java index 354719a79d..c34d6ba611 100644 --- a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Table.java +++ b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Table.java @@ -2864,7 +2864,7 @@ void sendMeasureEvent (long /*int*/ cell, long /*int*/ width, long /*int*/ heigh if (width != 0) C.memmove (width, contentWidth, 4); if (height != 0) C.memmove (height, contentHeight, 4); if (GTK.GTK3) { - GTK.gtk_cell_renderer_set_fixed_size (cell, contentWidth [0], contentHeight [0]); + GTK.gtk_cell_renderer_set_fixed_size (cell, -1, contentHeight [0]); } } } diff --git a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Tree.java b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Tree.java index 4de1357b69..49200c04c9 100644 --- a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Tree.java +++ b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Tree.java @@ -427,7 +427,19 @@ int calculateWidth (long /*int*/ column, long /*int*/ iter, boolean recurse) { int [] w = new int [1]; long /*int*/ path = 0; - if (GTK.gtk_tree_view_get_expander_column (handle) == column) { + /* + * gtk_tree_view_get_expander_column() returns 0 if the expander column is not visible. + * When pack is called for the first time, the expander arrow indent is not added to + * the width for the expander column. The fix is to always get the expander column as if + * it is visible. + */ + long /*int*/ expander_column = GTK.gtk_tree_view_get_expander_column(handle); + if (expander_column == 0 && !GTK.gtk_tree_view_column_get_visible(column)) { + GTK.gtk_tree_view_column_set_visible(column, true); + expander_column = GTK.gtk_tree_view_get_expander_column(handle); + GTK.gtk_tree_view_column_set_visible(column, false); + } + if (expander_column == column) { /* indent */ GdkRectangle rect = new GdkRectangle (); GTK.gtk_widget_realize (handle); @@ -435,8 +447,10 @@ int calculateWidth (long /*int*/ column, long /*int*/ iter, boolean recurse) { GTK.gtk_tree_view_get_cell_area (handle, path, column, rect); width += rect.x; /* expander */ - GTK.gtk_widget_style_get (handle, OS.expander_size, w, 0); - width += w [0] + TreeItem.EXPANDER_EXTRA_PADDING; + if (!GTK.gtk_tree_view_column_get_visible(column)) { + GTK.gtk_widget_style_get (handle, OS.expander_size, w, 0); + width += w [0] + TreeItem.EXPANDER_EXTRA_PADDING; + } } GTK.gtk_widget_style_get(handle, OS.focus_line_width, w, 0); width += 2 * w [0]; @@ -2923,7 +2937,7 @@ void sendMeasureEvent (long /*int*/ cell, long /*int*/ width, long /*int*/ heigh if (width != 0) C.memmove (width, contentWidth, 4); if (height != 0) C.memmove (height, contentHeight, 4); if (GTK.GTK3) { - GTK.gtk_cell_renderer_set_fixed_size (cell, contentWidth [0], contentHeight [0]); + GTK.gtk_cell_renderer_set_fixed_size (cell, -1, contentHeight [0]); } } } @@ -3169,6 +3183,16 @@ void rendererRender (long /*int*/ cell, long /*int*/ cr, long /*int*/ window, lo } contentX [0] -= imageWidth; contentWidth [0] += imageWidth; + + // Account for the expander arrow offset in x position + if (GTK.gtk_tree_view_get_expander_column (handle) == columnHandle) { + /* indent */ + GdkRectangle rect3 = new GdkRectangle (); + GTK.gtk_widget_realize (handle); + path = GTK.gtk_tree_model_get_path (modelHandle, iter); + GTK.gtk_tree_view_get_cell_area (handle, path, columnHandle, rect3); + contentX[0] += rect3.x; + } GC gc = getGC(cr); if ((drawState & SWT.SELECTED) != 0) { Color background, foreground; |