summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSilenio Quarti <silenio>2006-02-06 22:50:04 +0000
committerSilenio Quarti <silenio>2006-02-06 22:50:04 +0000
commit9b5a11c3e5885ebf39634af29467f32493457d20 (patch)
tree4aff2e2a76d8acc25c29b39c05dcb412df3aff7e
parent1da7e46ba972577e1130737ac65587e286329111 (diff)
downloadeclipse.platform.swt-9b5a11c3e5885ebf39634af29467f32493457d20.tar.gz
eclipse.platform.swt-9b5a11c3e5885ebf39634af29467f32493457d20.tar.xz
eclipse.platform.swt-9b5a11c3e5885ebf39634af29467f32493457d20.zip
owner draw Tree/Table
-rw-r--r--bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Display.java124
-rw-r--r--bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/ExpandBar.java8
-rw-r--r--bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/ScrollBar.java2
-rw-r--r--bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Scrollable.java10
-rw-r--r--bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Table.java515
-rw-r--r--bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/TableItem.java12
-rw-r--r--bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Tree.java481
-rw-r--r--bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/TreeItem.java14
-rw-r--r--bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Widget.java30
9 files changed, 832 insertions, 364 deletions
diff --git a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Display.java b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Display.java
index 359a9001c0..585bcc022e 100644
--- a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Display.java
+++ b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Display.java
@@ -120,9 +120,15 @@ public class Display extends Device {
Widget [] widgetTable;
final static int GROW_SIZE = 1024;
static final int SWT_OBJECT_INDEX;
+ static final int SWT_OBJECT_INDEX1;
+ static final int SWT_OBJECT_INDEX2;
static {
byte [] buffer = Converter.wcsToMbcs (null, "SWT_OBJECT_INDEX", true);
SWT_OBJECT_INDEX = OS.g_quark_from_string (buffer);
+ buffer = Converter.wcsToMbcs (null, "SWT_OBJECT_INDEX1", true);
+ SWT_OBJECT_INDEX1 = OS.g_quark_from_string (buffer);
+ buffer = Converter.wcsToMbcs (null, "SWT_OBJECT_INDEX2", true);
+ SWT_OBJECT_INDEX2 = OS.g_quark_from_string (buffer);
}
/* Focus */
@@ -184,10 +190,8 @@ public class Display extends Device {
int treeSelectionLength;
int /*long*/ treeSelectionProc;
Callback treeSelectionCallback;
- int /*long*/ textCellDataProc;
- Callback textCellDataCallback;
- int /*long*/ pixbufCellDataProc;
- Callback pixbufCellDataCallback;
+ int /*long*/ cellDataProc;
+ Callback cellDataCallback;
/* Set direction callback */
int /*long*/ setDirectionProc;
@@ -243,6 +247,12 @@ public class Display extends Device {
static Callback fixedClassInitCallback, fixedMapCallback;
static int /*long*/ fixedClassInitProc, fixedMapProc;
+ /* Renderer Subclass */
+ static int /*long*/ text_renderer_type, pixbuf_renderer_type, toggle_renderer_type;
+ static int /*long*/ text_renderer_info_ptr, pixbuf_renderer_info_ptr, toggle_renderer_info_ptr;
+ static Callback rendererClassInitCallback, rendererRenderCallback, rendererGetSizeCallback;
+ static int /*long*/ rendererClassInitProc, rendererRenderProc, rendererGetSizeProc;
+
/* Key Mappings */
static final int [] [] KeyTable = {
@@ -634,6 +644,12 @@ public void beep () {
}
}
+int /*long*/ cellDataProc (int /*long*/ tree_column, int /*long*/ cell, int /*long*/ tree_model, int /*long*/ iter, int /*long*/ data) {
+ Widget widget = getWidget (data);
+ if (widget == null) return 0;
+ return widget.cellDataProc (tree_column, cell, tree_model, iter, data);
+}
+
protected void checkDevice () {
if (thread == null) error (SWT.ERROR_WIDGET_DISPOSED);
if (thread != Thread.currentThread ()) error (SWT.ERROR_THREAD_INVALID_ACCESS);
@@ -796,7 +812,45 @@ synchronized void createDisplay (DeviceData data) {
fixed_info_ptr = OS.g_malloc (GTypeInfo.sizeof);
OS.memmove (fixed_info_ptr, fixed_info, GTypeInfo.sizeof);
fixed_type = OS.g_type_register_static (OS.GTK_TYPE_FIXED (), type_name, fixed_info_ptr, 0);
+ }
+ rendererClassInitCallback = new Callback (getClass (), "rendererClassInitProc", 2);
+ rendererClassInitProc = rendererClassInitCallback.getAddress ();
+ if (rendererClassInitProc == 0) SWT.error (SWT.ERROR_NO_MORE_CALLBACKS);
+ rendererRenderCallback = new Callback (getClass (), "rendererRenderProc", 7);
+ rendererRenderProc = rendererRenderCallback.getAddress ();
+ rendererGetSizeCallback = new Callback (getClass (), "rendererGetSizeProc", 7);
+ rendererGetSizeProc = rendererGetSizeCallback.getAddress ();
+ if (rendererRenderProc == 0) SWT.error (SWT.ERROR_NO_MORE_CALLBACKS);
+ if (text_renderer_type == 0) {
+ GTypeInfo renderer_info = new GTypeInfo ();
+ renderer_info.class_size = (short) OS.GtkCellRendererTextClass_sizeof ();
+ renderer_info.class_init = rendererClassInitProc;
+ renderer_info.instance_size = (short) OS.GtkCellRendererText_sizeof ();
+ text_renderer_info_ptr = OS.g_malloc (GTypeInfo.sizeof);
+ OS.memmove (text_renderer_info_ptr, renderer_info, GTypeInfo.sizeof);
+ byte [] type_name = Converter.wcsToMbcs (null, "SwtTextRenderer", true);
+ text_renderer_type = OS.g_type_register_static (OS.GTK_TYPE_CELL_RENDERER_TEXT (), type_name, text_renderer_info_ptr, 0);
+ }
+ if (pixbuf_renderer_type == 0) {
+ GTypeInfo renderer_info = new GTypeInfo ();
+ renderer_info.class_size = (short) OS.GtkCellRendererPixbufClass_sizeof ();
+ renderer_info.class_init = rendererClassInitProc;
+ renderer_info.instance_size = (short) OS.GtkCellRendererPixbuf_sizeof ();
+ pixbuf_renderer_info_ptr = OS.g_malloc (GTypeInfo.sizeof);
+ OS.memmove (pixbuf_renderer_info_ptr, renderer_info, GTypeInfo.sizeof);
+ byte [] type_name = Converter.wcsToMbcs (null, "SwtPixbufRenderer", true);
+ pixbuf_renderer_type = OS.g_type_register_static (OS.GTK_TYPE_CELL_RENDERER_PIXBUF (), type_name, pixbuf_renderer_info_ptr, 0);
}
+ if (toggle_renderer_type == 0) {
+ GTypeInfo renderer_info = new GTypeInfo ();
+ renderer_info.class_size = (short) OS.GtkCellRendererToggleClass_sizeof ();
+ renderer_info.class_init = rendererClassInitProc;
+ renderer_info.instance_size = (short) OS.GtkCellRendererToggle_sizeof ();
+ toggle_renderer_info_ptr = OS.g_malloc (GTypeInfo.sizeof);
+ OS.memmove (toggle_renderer_info_ptr, renderer_info, GTypeInfo.sizeof);
+ byte [] type_name = Converter.wcsToMbcs (null, "SwtToggleRenderer", true);
+ toggle_renderer_type = OS.g_type_register_static (OS.GTK_TYPE_CELL_RENDERER_TOGGLE (), type_name, toggle_renderer_info_ptr, 0);
+ }
OS.gtk_widget_set_default_direction (OS.GTK_TEXT_DIR_LTR);
OS.gdk_rgb_init ();
byte [] buffer = Converter.wcsToMbcs (null, APP_NAME, true);
@@ -1137,6 +1191,29 @@ static int /*long*/ fixedMapProc (int /*long*/ handle) {
return 0;
}
+static int /*long*/ rendererClassInitProc (int /*long*/ g_class, int /*long*/ class_data) {
+ GtkCellRendererClass klass = new GtkCellRendererClass ();
+ OS.memmove (klass, g_class);
+ klass.render = rendererRenderProc;
+ klass.get_size = rendererGetSizeProc;
+ OS.memmove (g_class, klass);
+ return 0;
+}
+
+static int /*long*/ rendererGetSizeProc (int /*long*/ cell, int /*long*/ handle, int /*long*/ cell_area, int /*long*/ x_offset, int /*long*/ y_offset, int /*long*/ width, int /*long*/ height) {
+ Display display = getCurrent ();
+ Widget widget = display.getWidget (handle);
+ if (widget != null) return widget.rendererGetSizeProc (cell, handle, cell_area, x_offset, y_offset, width, height);
+ return 0;
+}
+
+static int /*long*/ rendererRenderProc (int /*long*/ cell, int /*long*/ window, int /*long*/ handle, int /*long*/ background_area, int /*long*/ cell_area, int /*long*/ expose_area, int flags) {
+ Display display = getCurrent ();
+ Widget widget = display.getWidget (handle);
+ if (widget != null) return widget.rendererRenderProc (cell, window, handle, background_area, cell_area, expose_area, flags);
+ return 0;
+}
+
void flushExposes (int /*long*/ window, boolean all) {
OS.gdk_flush ();
OS.gdk_flush ();
@@ -1410,6 +1487,18 @@ int /*long*/ gtk_fixed_get_type () {
return fixed_type;
}
+int /*long*/ gtk_cell_renderer_text_get_type () {
+ return text_renderer_type;
+}
+
+int /*long*/ gtk_cell_renderer_pixbuf_get_type () {
+ return pixbuf_renderer_type;
+}
+
+int /*long*/ gtk_cell_renderer_toggle_get_type () {
+ return toggle_renderer_type;
+}
+
/**
* Returns the default display. One is created (making the
* thread that invokes this method its user-interface thread)
@@ -2216,13 +2305,9 @@ void initializeCallbacks () {
treeSelectionProc = treeSelectionCallback.getAddress();
if (treeSelectionProc == 0) error (SWT.ERROR_NO_MORE_CALLBACKS);
- textCellDataCallback = new Callback (this, "textCellDataProc", 5);
- textCellDataProc = textCellDataCallback.getAddress ();
- if (textCellDataProc == 0) error (SWT.ERROR_NO_MORE_CALLBACKS);
-
- pixbufCellDataCallback = new Callback (this, "pixbufCellDataProc", 5);
- pixbufCellDataProc = pixbufCellDataCallback.getAddress ();
- if (pixbufCellDataProc == 0) error (SWT.ERROR_NO_MORE_CALLBACKS);
+ cellDataCallback = new Callback (this, "cellDataProc", 5);
+ cellDataProc = cellDataCallback.getAddress ();
+ if (cellDataProc == 0) error (SWT.ERROR_NO_MORE_CALLBACKS);
setDirectionCallback = new Callback (this, "setDirectionProc", 2);
setDirectionProc = setDirectionCallback.getAddress ();
@@ -2841,10 +2926,8 @@ void releaseDisplay () {
/* Dispose GtkTreeView callbacks */
treeSelectionCallback.dispose (); treeSelectionCallback = null;
treeSelectionProc = 0;
- textCellDataCallback.dispose (); textCellDataCallback = null;
- textCellDataProc = 0;
- pixbufCellDataCallback.dispose (); pixbufCellDataCallback = null;
- pixbufCellDataProc = 0;
+ cellDataCallback.dispose (); cellDataCallback = null;
+ cellDataProc = 0;
/* Dispose the set direction callback */
setDirectionCallback.dispose (); setDirectionCallback = null;
@@ -3521,17 +3604,6 @@ int /*long*/ caretProc (int /*long*/ clientData) {
return 0;
}
-int /*long*/ pixbufCellDataProc (int /*long*/ tree_column, int /*long*/ cell, int /*long*/ tree_model, int /*long*/ iter, int /*long*/ data) {
- Widget widget = getWidget (data);
- if (widget == null) return 0;
- return widget.pixbufCellDataProc (tree_column, cell, tree_model, iter, data);
-}
-int /*long*/ textCellDataProc (int /*long*/ tree_column, int /*long*/ cell, int /*long*/ tree_model, int /*long*/ iter, int /*long*/ data) {
- Widget widget = getWidget (data);
- if (widget == null) return 0;
- return widget.textCellDataProc (tree_column, cell, tree_model, iter, data);
-}
-
int /*long*/ sizeAllocateProc (int /*long*/ handle, int /*long*/ arg0, int /*long*/ user_data) {
Widget widget = getWidget (user_data);
if (widget == null) return 0;
diff --git a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/ExpandBar.java b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/ExpandBar.java
index b15dfc2cb6..f84df10e83 100644
--- a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/ExpandBar.java
+++ b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/ExpandBar.java
@@ -135,14 +135,14 @@ public void removeExpandListener(ExpandListener listener) {
eventTable.unhook (SWT.Collapse, listener);
}
-void setScrollBarValue (ScrollBar bar) {
- relayout ();
-}
-
public void setSpacing (int spacing) {
checkWidget ();
if (spacing < 0) return;
OS.gtk_box_set_spacing (handle, spacing);
OS.gtk_container_set_border_width (handle, spacing);
}
+
+void updateScrollBarValue (ScrollBar bar) {
+ relayout ();
+}
}
diff --git a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/ScrollBar.java b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/ScrollBar.java
index 45d4787184..220a2595de 100644
--- a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/ScrollBar.java
+++ b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/ScrollBar.java
@@ -367,7 +367,7 @@ int /*long*/ gtk_value_changed (int /*long*/ adjustment) {
}
detail = OS.GTK_SCROLL_NONE;
postEvent (SWT.Selection, event);
- parent.setScrollBarValue (this);
+ parent.updateScrollBarValue (this);
return 0;
}
diff --git a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Scrollable.java b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Scrollable.java
index 5c9a588dd5..8cf344c029 100644
--- a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Scrollable.java
+++ b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Scrollable.java
@@ -293,6 +293,9 @@ boolean setScrollBarVisible (ScrollBar bar, boolean visible) {
return true;
}
+void redrawBackgroundImage () {
+}
+
void redrawWidget (int x, int y, int width, int height, boolean redrawAll, boolean all, boolean trim) {
super.redrawWidget (x, y, width, height, redrawAll, all, trim);
if ((OS.GTK_WIDGET_FLAGS (handle) & OS.GTK_REALIZED) == 0) return;
@@ -342,9 +345,6 @@ void resizeHandle (int width, int height) {
OS.gtk_widget_set_size_request (scrolledHandle != 0 ? scrolledHandle : handle, width, height);
}
-void setScrollBarValue (ScrollBar bar) {
-}
-
void showWidget () {
super.showWidget ();
if (scrolledHandle != 0) OS.gtk_widget_show (scrolledHandle);
@@ -356,6 +356,10 @@ int /*long*/ topHandle () {
return super.topHandle ();
}
+void updateScrollBarValue (ScrollBar bar) {
+ parent.redrawBackgroundImage ();
+}
+
int vScrollBarWidth() {
if (verticalBar == null) return 0;
int /*long*/ vBarHandle = OS.GTK_SCROLLED_WINDOW_VSCROLLBAR(scrolledHandle);
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 582db2877d..4eaae9cd09 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
@@ -44,13 +44,15 @@ import org.eclipse.swt.events.*;
public class Table extends Composite {
int /*long*/ modelHandle, checkRenderer;
int itemCount, columnCount, lastIndexOf, sortDirection;
- int /*long*/ ignoreTextCell, ignorePixbufCell;
+ int /*long*/ ignoreCell;
TableItem [] items;
TableColumn [] columns;
TableItem currentItem;
TableColumn sortColumn;
ImageList imageList, headerImageList;
boolean firstCustomDraw;
+ int /*long*/ drawFlags;
+ boolean ownerDraw, ignoreDraw, ignoreSize;
static final int CHECKED_COLUMN = 0;
static final int GRAYED_COLUMN = 1;
@@ -102,6 +104,20 @@ public Table (Composite parent, int style) {
super (parent, checkStyle (style));
}
+void _addListener (int eventType, Listener listener) {
+ super._addListener (eventType, listener);
+ if (!ownerDraw) {
+ switch (eventType) {
+ case SWT.MeasureItem:
+ case SWT.EraseItem:
+ case SWT.PaintItem:
+ ownerDraw = true;
+ recreateRenderers ();
+ break;
+ }
+ }
+}
+
TableItem _getItem (int index) {
if ((style & SWT.VIRTUAL) == 0) return items [index];
if (items [index] != null) return items [index];
@@ -118,6 +134,106 @@ static int checkStyle (int style) {
return checkBits (style, SWT.SINGLE, SWT.MULTI, 0, 0, 0, 0);
}
+int /*long*/ cellDataProc (int /*long*/ tree_column, int /*long*/ cell, int /*long*/ tree_model, int /*long*/ iter, int /*long*/ data) {
+ if (cell == ignoreCell) return 0;
+ int /*long*/ path = OS.gtk_tree_model_get_path (tree_model, iter);
+ int [] buffer = new int [1];
+ OS.memmove (buffer, OS.gtk_tree_path_get_indices (path), 4);
+ int index = buffer [0];
+ TableItem item = _getItem (index);
+ OS.gtk_tree_path_free (path);
+ if (item != null) OS.g_object_set_qdata (cell, Display.SWT_OBJECT_INDEX2, item.handle);
+ boolean isPixbuf = OS.GTK_IS_CELL_RENDERER_PIXBUF (cell);
+ if (!(isPixbuf || OS.GTK_IS_CELL_RENDERER_TEXT (cell))) return 0;
+ int modelIndex = -1;
+ boolean customDraw = false;
+ if (columnCount == 0) {
+ modelIndex = Table.FIRST_COLUMN;
+ customDraw = firstCustomDraw;
+ } else {
+ TableColumn column = (TableColumn) display.getWidget (tree_column);
+ if (column != null) {
+ modelIndex = column.modelIndex;
+ customDraw = column.customDraw;
+ }
+ }
+ if (modelIndex == -1) return 0;
+ boolean setData = false;
+ if ((style & SWT.VIRTUAL) != 0) {
+ /*
+ * Feature in GTK. On GTK before 2.4, fixed_height_mode is not
+ * supported, and the tree asks for the data of all items. The
+ * fix is to only provide the data if the row is visible.
+ */
+ if (OS.GTK_VERSION < OS.VERSION (2, 3, 2)) {
+ OS.gtk_widget_realize (handle);
+ GdkRectangle visible = new GdkRectangle ();
+ OS.gtk_tree_view_get_visible_rect (handle, visible);
+ GdkRectangle area = new GdkRectangle ();
+ path = OS.gtk_tree_model_get_path (tree_model, iter);
+ OS.gtk_tree_view_get_cell_area (handle, path, tree_column, area);
+ OS.gtk_tree_path_free (path);
+ if (area.y + area.height < 0 || area.y + visible.y > visible.y + visible.height) {
+ /* Give an image from the image list to make sure the row has
+ * the correct height.
+ */
+ if (imageList != null && imageList.pixbufs.length > 0) {
+ OS.g_object_set (cell, OS.pixbuf, imageList.pixbufs [0], 0);
+ }
+ return 0;
+ }
+ }
+ if (!item.cached) {
+ lastIndexOf = index;
+ setData = checkData (item);
+ }
+ }
+ if (setData) {
+ buffer [0] = 0;
+ if (isPixbuf) {
+ OS.gtk_tree_model_get (tree_model, iter, modelIndex + CELL_PIXBUF, buffer, -1);
+ OS.g_object_set (cell, OS.pixbuf, buffer [0], 0);
+ } else {
+ OS.gtk_tree_model_get (tree_model, iter, modelIndex + CELL_TEXT, buffer, -1);
+ if (buffer [0] != 0) {
+ OS.g_object_set (cell, OS.text, buffer [0], 0);
+ OS.g_free (buffer [0]);
+ }
+ }
+ }
+ if (customDraw) {
+ /*
+ * Bug on GTK. Gtk renders the background on top of the checkbox and pixbuf.
+ * This only happens in version 2.2.1 and earlier. The fix is not to set the background.
+ */
+ if (OS.GTK_VERSION > OS.VERSION (2, 2, 1)) {
+ buffer [0] = 0;
+ OS.gtk_tree_model_get (tree_model, iter, modelIndex + CELL_BACKGROUND, buffer, -1);
+ if (buffer [0] != 0) {
+ OS.g_object_set (cell, OS.cell_background_gdk, buffer [0], 0);
+ }
+ }
+ if (!isPixbuf) {
+ buffer [0] = 0;
+ OS.gtk_tree_model_get (tree_model, iter, modelIndex + CELL_FOREGROUND, buffer, -1);
+ if (buffer [0] != 0) {
+ OS.g_object_set (cell, OS.foreground_gdk, buffer [0], 0);
+ }
+ buffer [0] = 0;
+ OS.gtk_tree_model_get (tree_model, iter, modelIndex + CELL_FONT, buffer, -1);
+ if (buffer [0] != 0) {
+ OS.g_object_set (cell, OS.font_desc, buffer [0], 0);
+ }
+ }
+ }
+ if (setData) {
+ ignoreCell = cell;
+ setScrollWidth (tree_column, iter);
+ ignoreCell = 0;
+ }
+ return 0;
+}
+
boolean checkData (TableItem item) {
if (item.cached) return true;
if ((style & SWT.VIRTUAL) != 0) {
@@ -573,12 +689,21 @@ void createRenderers (int /*long*/ columnHandle, int modelIndex, boolean check,
if (OS.GTK_VERSION > OS.VERSION (2, 2, 1)) {
OS.gtk_tree_view_column_add_attribute (columnHandle, checkRenderer, OS.cell_background_gdk, BACKGROUND_COLUMN);
}
+ if (ownerDraw) {
+ OS.gtk_tree_view_column_set_cell_data_func (columnHandle, checkRenderer, display.cellDataProc, handle, 0);
+ OS.g_object_set_qdata (checkRenderer, Display.SWT_OBJECT_INDEX1, columnHandle);
+ }
}
- int /*long*/ pixbufRenderer = OS.gtk_cell_renderer_pixbuf_new ();
+ int /*long*/ pixbufRenderer = ownerDraw ? OS.g_object_new (display.gtk_cell_renderer_pixbuf_get_type (), 0) : OS.gtk_cell_renderer_pixbuf_new ();
if (pixbufRenderer == 0) error (SWT.ERROR_NO_HANDLES);
- int /*long*/ textRenderer = OS.gtk_cell_renderer_text_new ();
+ int /*long*/ textRenderer = ownerDraw ? OS.g_object_new (display.gtk_cell_renderer_text_get_type (), 0) : OS.gtk_cell_renderer_text_new ();
if (textRenderer == 0) error (SWT.ERROR_NO_HANDLES);
+ if (ownerDraw) {
+ OS.g_object_set_qdata (pixbufRenderer, Display.SWT_OBJECT_INDEX1, columnHandle);
+ OS.g_object_set_qdata (textRenderer, Display.SWT_OBJECT_INDEX1, columnHandle);
+ }
+
/*
* Feature in GTK. When a tree view column contains only one activatable
* cell renderer such as a toggle renderer, mouse clicks anywhere in a cell
@@ -629,9 +754,9 @@ void createRenderers (int /*long*/ columnHandle, int modelIndex, boolean check,
}
}
}
- if ((style & SWT.VIRTUAL) != 0 || customDraw) {
- OS.gtk_tree_view_column_set_cell_data_func (columnHandle, textRenderer, display.textCellDataProc, handle, 0);
- OS.gtk_tree_view_column_set_cell_data_func (columnHandle, pixbufRenderer, display.pixbufCellDataProc, handle, 0);
+ if ((style & SWT.VIRTUAL) != 0 || customDraw || ownerDraw) {
+ OS.gtk_tree_view_column_set_cell_data_func (columnHandle, textRenderer, display.cellDataProc, handle, 0);
+ OS.gtk_tree_view_column_set_cell_data_func (columnHandle, pixbufRenderer, display.cellDataProc, handle, 0);
}
}
@@ -1837,81 +1962,31 @@ int /*long*/ paintWindow () {
return OS.gtk_tree_view_get_bin_window (handle);
}
-int /*long*/ pixbufCellDataProc (int /*long*/ tree_column, int /*long*/ cell, int /*long*/ tree_model, int /*long*/ iter, int /*long*/ data) {
- if (cell == ignorePixbufCell) return 0;
- int modelIndex = -1;
- boolean customDraw = false;
+void recreateRenderers () {
+ if (checkRenderer != 0) {
+ display.removeWidget (checkRenderer);
+ OS.g_object_unref (checkRenderer);
+ checkRenderer = ownerDraw ? OS.g_object_new (display.gtk_cell_renderer_toggle_get_type(), 0) : OS.gtk_cell_renderer_toggle_new ();
+ if (checkRenderer == 0) error (SWT.ERROR_NO_HANDLES);
+ OS.g_object_ref (checkRenderer);
+ display.addWidget (checkRenderer, this);
+ OS.g_signal_connect_closure (checkRenderer, OS.toggled, display.closures [TOGGLED], false);
+ }
if (columnCount == 0) {
- modelIndex = Table.FIRST_COLUMN;
- customDraw = firstCustomDraw;
+ createRenderers (OS.gtk_tree_view_get_column (handle, 0), Tree.FIRST_COLUMN, true, 0);
} else {
- for (int i = 0; i < columns.length; i++) {
- if (columns [i] != null && columns [i].handle == tree_column) {
- modelIndex = columns [i].modelIndex;
- customDraw = columns [i].customDraw;
- break;
- }
- }
- }
- if (modelIndex == -1) return 0;
- boolean setData = false;
- if ((style & SWT.VIRTUAL) != 0) {
- int /*long*/ path = OS.gtk_tree_model_get_path (tree_model, iter);
- /*
- * Feature in GTK. On GTK before 2.4, fixed_height_mode is not
- * supported, and the tree asks for the data of all items. The
- * fix is to only provide the data if the row is visible.
- */
- if (OS.GTK_VERSION < OS.VERSION (2, 3, 2)) {
- OS.gtk_widget_realize (handle);
- GdkRectangle visible = new GdkRectangle ();
- OS.gtk_tree_view_get_visible_rect (handle, visible);
- GdkRectangle area = new GdkRectangle ();
- OS.gtk_tree_view_get_cell_area (handle, path, tree_column, area);
- if (area.y + area.height < 0 || area.y + visible.y > visible.y + visible.height) {
- /* Give an image from the image list to make sure the row has
- * the correct height.
- */
- if (imageList != null && imageList.pixbufs.length > 0) {
- OS.g_object_set (cell, OS.pixbuf, imageList.pixbufs [0], 0);
- }
- OS.gtk_tree_path_free (path);
- return 0;
- }
- }
- int [] index = new int [1];
- OS.memmove (index, OS.gtk_tree_path_get_indices (path), 4);
- TableItem item = _getItem (index [0]);
- if (!item.cached) {
- lastIndexOf = index [0];
- setData = checkData (item);
- }
- OS.gtk_tree_path_free (path);
- }
- int /*long*/ [] ptr = new int /*long*/ [1];
- if (setData) {
- OS.gtk_tree_model_get (tree_model, iter, modelIndex + CELL_PIXBUF, ptr, -1);
- OS.g_object_set(cell, OS.pixbuf, ptr[0], 0);
- ptr = new int /*long*/ [1];
- }
- if (customDraw) {
- /*
- * Bug on GTK. Gtk renders the background on top of the checkbox and pixbuf.
- * This only happens in version 2.2.1 and earlier. The fix is not to set the background.
- */
- if (OS.GTK_VERSION > OS.VERSION (2, 2, 1)) {
- OS.gtk_tree_model_get (tree_model, iter, modelIndex + CELL_BACKGROUND, ptr, -1);
- if (ptr [0] != 0) {
- OS.g_object_set(cell, OS.cell_background_gdk, ptr[0], 0);
- }
+ for (int i = 0; i < columnCount; i++) {
+ TableColumn column = columns [i];
+ createRenderers (column.handle, column.modelIndex, i == 0, column.style);
}
}
- if (setData) {
- ignorePixbufCell = cell;
- setScrollWidth (tree_column, iter);
- ignorePixbufCell = 0;
+}
+
+void redrawBackgroundImage () {
+ Control control = findBackgroundControl ();
+ if (control != null && control.backgroundImage != null) {
+ redrawWidget (0, 0, 0, 0, true, false, false);
}
- return 0;
}
void register () {
@@ -2164,6 +2239,198 @@ public void removeSelectionListener(SelectionListener listener) {
eventTable.unhook (SWT.DefaultSelection,listener);
}
+int /*long*/ rendererGetSizeProc (int /*long*/ cell, int /*long*/ widget, int /*long*/ cell_area, int /*long*/ x_offset, int /*long*/ y_offset, int /*long*/ width, int /*long*/ height) {
+ int /*long*/ g_class = OS.g_type_class_peek_parent (OS.G_OBJECT_GET_CLASS (cell));
+ GtkCellRendererClass klass = new GtkCellRendererClass ();
+ OS.memmove (klass, g_class);
+ int result = OS.call (klass.get_size, cell, handle, cell_area, x_offset, y_offset, width, height);
+ if (!ignoreSize && OS.GTK_IS_CELL_RENDERER_TEXT (cell)) {
+ int /*long*/ iter = OS.g_object_get_qdata (cell, Display.SWT_OBJECT_INDEX2);
+ TableItem item = null;
+ if (iter != 0) {
+ int /*long*/ path = OS.gtk_tree_model_get_path (modelHandle, iter);
+ int [] buffer = new int [1];
+ OS.memmove (buffer, OS.gtk_tree_path_get_indices (path), 4);
+ int index = buffer [0];
+ item = _getItem (index);
+ OS.gtk_tree_path_free (path);
+ }
+ if (item != null) {
+ int columnIndex = 0;
+ if (columnCount > 0) {
+ int /*long*/ columnHandle = OS.g_object_get_qdata (cell, Display.SWT_OBJECT_INDEX1);
+ for (int i = 0; i < columnCount; i++) {
+ if (columns [i].handle == columnHandle) {
+ columnIndex = i;
+ break;
+ }
+ }
+ }
+ if (hooks (SWT.MeasureItem)) {
+ int [] contentWidth = new int [1], contentHeight = new int [1];
+ if (width != 0) OS.memmove (contentWidth, width, 4);
+ if (height != 0) OS.memmove (contentHeight, height, 4);
+ Image image = item.getImage (columnIndex);
+ Rectangle bounds = image.getBounds ();
+ contentWidth [0] += bounds.width;
+ GC gc = new GC (this);
+ gc.setFont (item.getFont (columnIndex));
+ Event event = new Event ();
+ event.item = item;
+ event.index = columnIndex;
+ event.gc = gc;
+ event.width = contentWidth [0];
+ event.height = contentHeight [0];
+ sendEvent (SWT.MeasureItem, event);
+ gc.dispose ();
+ contentWidth [0] = event.width - bounds.width;
+ contentHeight [0] = event.height;
+ if (width != 0) OS.memmove (width, contentWidth, 4);
+ if (height != 0) OS.memmove (height, contentHeight, 4);
+ }
+ }
+ }
+ return result;
+}
+
+int /*long*/ rendererRenderProc (int /*long*/ cell, int /*long*/ window, int /*long*/ widget, int /*long*/ background_area, int /*long*/ cell_area, int /*long*/ expose_area, int flags) {
+ TableItem item = null;
+ int /*long*/ iter = OS.g_object_get_qdata (cell, Display.SWT_OBJECT_INDEX2);
+ int /*long*/ columnHandle = OS.g_object_get_qdata (cell, Display.SWT_OBJECT_INDEX1);
+ if (iter != 0) {
+ int /*long*/ path = OS.gtk_tree_model_get_path (modelHandle, iter);
+ int [] buffer = new int [1];
+ OS.memmove (buffer, OS.gtk_tree_path_get_indices (path), 4);
+ int index = buffer [0];
+ item = _getItem (index);
+ OS.gtk_tree_path_free (path);
+ }
+// if (checkRenderer != 0) {
+// if ((flags & OS.GTK_CELL_RENDERER_FOCUSED) != 0) {
+// OS.gtk_tree_view_column_focus_cell (columnHandle, checkRenderer);
+// }
+// }
+ int columnIndex = 0;
+ boolean draw = !ignoreDraw;
+ if (item != null) {
+ if (columnCount > 0) {
+ for (int i = 0; i < columnCount; i++) {
+ if (columns [i].handle == columnHandle) {
+ columnIndex = i;
+ break;
+ }
+ }
+ }
+ GdkRectangle rect = new GdkRectangle ();
+ int /*long*/ path = OS.gtk_tree_model_get_path (modelHandle, iter);
+ OS.gtk_tree_view_get_background_area (handle, path, columnHandle, rect);
+ OS.gtk_tree_path_free (path);
+ if (OS.GTK_IS_CELL_RENDERER_TOGGLE (cell) || (OS.GTK_IS_CELL_RENDERER_PIXBUF (cell) && (columnIndex != 0 || (style & SWT.CHECK) == 0))) {
+ draw = true;
+ ignoreDraw = !draw;
+ drawFlags = flags;
+
+ if ((flags & OS.GTK_CELL_RENDERER_SELECTED) == 0) {
+ Control control = findBackgroundControl ();
+ if (control != null && control.backgroundImage != null) {
+ OS.gdk_window_clear_area (window, rect.x, rect.y, rect.width, rect.height);
+ }
+ }
+
+ if (hooks (SWT.EraseItem)) {
+ if ((flags & OS.GTK_CELL_RENDERER_SELECTED) != 0) {
+ OS.gdk_window_clear_area (window, rect.x, rect.y, rect.width, rect.height);
+ }
+ GC gc = new GC (this);
+ gc.setClipping (rect.x, rect.y, rect.width, rect.height);
+ Event event = new Event ();
+ event.item = item;
+ event.index = columnIndex;
+ event.gc = gc;
+ event.x = rect.x;
+ event.y = rect.y;
+ event.width = rect.width;
+ event.height = rect.height;
+ if ((flags & OS.GTK_CELL_RENDERER_SELECTED) != 0) event.detail |= SWT.SELECTED;
+ if ((flags & OS.GTK_CELL_RENDERER_FOCUSED) != 0) event.detail |= SWT.FOCUSED;
+ sendEvent (SWT.EraseItem, event);
+ gc.dispose();
+ flags &= ~(OS.GTK_CELL_RENDERER_SELECTED | OS.GTK_CELL_RENDERER_FOCUSED);
+ if ((event.detail & SWT.SELECTED) != 0) flags |= OS.GTK_CELL_RENDERER_SELECTED;
+ if ((event.detail & SWT.FOCUSED) != 0) flags |= OS.GTK_CELL_RENDERER_FOCUSED;
+ drawFlags = flags;
+ draw = event.doit;
+ ignoreDraw = !draw;
+ if ((flags & OS.GTK_CELL_RENDERER_SELECTED) != 0) {
+ int /*long*/ style = OS.gtk_widget_get_style (widget);
+ OS.gtk_paint_flat_box (style, window, OS.GTK_STATE_SELECTED, OS.GTK_SHADOW_NONE, rect, widget, null, rect.x, rect.y, rect.width, rect.height);
+ }
+ }
+ }
+ }
+ int /*long*/ result = 0;
+ if (draw || OS.GTK_IS_CELL_RENDERER_TOGGLE (cell)) {
+ int /*long*/ g_class = OS.g_type_class_peek_parent (OS.G_OBJECT_GET_CLASS (cell));
+ GtkCellRendererClass klass = new GtkCellRendererClass ();
+ OS.memmove (klass, g_class);
+ result = OS.call (klass.render, cell, window, handle, background_area, cell_area, expose_area, drawFlags);
+ }
+ if (item != null) {
+ if (OS.GTK_IS_CELL_RENDERER_TEXT (cell)) {
+ if (hooks (SWT.PaintItem)) {
+ GdkRectangle rect = new GdkRectangle ();
+ int /*long*/ path = OS.gtk_tree_model_get_path (modelHandle, iter);
+ OS.gtk_tree_view_get_background_area (handle, path, columnHandle, rect);
+ OS.gtk_tree_path_free (path);
+ if (OS.gtk_tree_view_get_expander_column (handle) == columnHandle) {
+ int [] buffer = new int [1];
+ OS.gtk_widget_style_get (handle, OS.expander_size, buffer, 0);
+ rect.x += buffer [0] + TreeItem.EXPANDER_EXTRA_PADDING;
+ rect.width -= buffer [0] + TreeItem.EXPANDER_EXTRA_PADDING;
+ //OS.gtk_widget_style_get (parentHandle, OS.horizontal_separator, buffer, 0);
+ //int horizontalSeparator = buffer[0];
+ //rect.x += horizontalSeparator;
+ }
+ ignoreSize = true;
+ int [] contentX = new int [1], contentWidth = new int [1];
+ OS.gtk_cell_renderer_get_size (cell, handle, null, null, null, contentWidth, null);
+ OS.gtk_tree_view_column_cell_get_position (columnHandle, cell, contentX, null);
+ ignoreSize = false;
+ Image image = item.getImage (columnIndex);
+ Rectangle bounds = image.getBounds ();
+ contentX [0] -= bounds.width;
+ contentWidth [0] += bounds.width;
+ GC gc = new GC (this);
+ if ((drawFlags & OS.GTK_CELL_RENDERER_SELECTED) != 0) {
+ gc.setBackground (display.getSystemColor (SWT.COLOR_LIST_SELECTION));
+ gc.setForeground (display.getSystemColor (SWT.COLOR_LIST_SELECTION_TEXT));
+ } else {
+ gc.setBackground (item.getBackground (columnIndex));
+ gc.setForeground (item.getForeground (columnIndex));
+ }
+ gc.setFont (item.getFont (columnIndex));
+ gc.setClipping (rect.x, rect.y, rect.width, rect.height);
+ Event event = new Event ();
+ event.item = item;
+ event.index = columnIndex;
+ event.gc = gc;
+ event.x = rect.x + contentX [0];
+ event.y = rect.y;
+ event.width = contentWidth [0];
+ event.height = rect.height;
+ if ((drawFlags & OS.GTK_CELL_RENDERER_SELECTED) != 0) event.detail |= SWT.SELECTED;
+ if ((drawFlags & OS.GTK_CELL_RENDERER_FOCUSED) != 0) event.detail |= SWT.FOCUSED;
+ sendEvent (SWT.PaintItem, event);
+ gc.dispose();
+ }
+ draw = true;
+ ignoreDraw = !draw;
+ drawFlags = 0;
+ }
+ }
+ return result;
+}
+
void resetCustomDraw () {
if ((style & SWT.VIRTUAL) != 0) return;
int end = Math.max (1, columnCount);
@@ -2349,6 +2616,12 @@ void setBackgroundColor (GdkColor color) {
OS.gtk_widget_modify_base (handle, 0, color);
}
+void setBackgroundPixmap (int /*long*/ pixmap) {
+ super.setBackgroundPixmap (pixmap);
+ int /*long*/ window = paintWindow ();
+ if (window != 0) OS.gdk_window_set_back_pixmap (window, 0, true);
+}
+
int setBounds (int x, int y, int width, int height, boolean move, boolean resize) {
int result = super.setBounds (x, y, width, height, move, resize);
/*
@@ -2511,6 +2784,12 @@ public void setLinesVisible (boolean show) {
OS.gtk_tree_view_set_rules_hint (handle, show);
}
+void setParentBackground () {
+ super.setParentBackground ();
+ int /*long*/ window = paintWindow ();
+ if (window != 0) OS.gdk_window_set_back_pixmap (window, 0, true);
+}
+
void setParentWindow (int /*long*/ widget) {
int /*long*/ window = eventWindow ();
OS.gtk_widget_set_parent_window (widget, window);
@@ -2882,90 +3161,6 @@ public void showSelection () {
showItem (item.handle);
}
-int /*long*/ textCellDataProc (int /*long*/ tree_column, int /*long*/ cell, int /*long*/ tree_model, int /*long*/ iter, int /*long*/ data) {
- if (cell == ignoreTextCell) return 0;
- int modelIndex = -1;
- boolean customDraw = false;
- if (columnCount == 0) {
- modelIndex = Table.FIRST_COLUMN;
- customDraw = firstCustomDraw;
- } else {
- for (int i = 0; i < columns.length; i++) {
- if (columns [i] != null && columns [i].handle == tree_column) {
- modelIndex = columns [i].modelIndex;
- customDraw = columns [i].customDraw;
- break;
- }
- }
- }
- if (modelIndex == -1) return 0;
- boolean setData = false;
- if ((style & SWT.VIRTUAL) != 0) {
- int /*long*/ path = OS.gtk_tree_model_get_path (tree_model, iter);
- /*
- * Feature in GTK. On GTK before 2.4, fixed_height_mode is not
- * supported, and the tree asks for the data of all items. The
- * fix is to only provide the data if the row is visible.
- */
- if (OS.GTK_VERSION < OS.VERSION (2, 3, 2)) {
- OS.gtk_widget_realize (handle);
- GdkRectangle visible = new GdkRectangle ();
- OS.gtk_tree_view_get_visible_rect (handle, visible);
- GdkRectangle area = new GdkRectangle ();
- OS.gtk_tree_view_get_cell_area (handle, path, tree_column, area);
- if (area.y + area.height < 0 || area.y + visible.y > visible.y + visible.height ) {
- OS.gtk_tree_path_free (path);
- return 0;
- }
- }
- int [] index = new int [1];
- OS.memmove (index, OS.gtk_tree_path_get_indices (path), 4);
- TableItem item = _getItem (index [0]);
- if (!item.cached) {
- lastIndexOf = index [0];
- setData = checkData (item);
- }
- OS.gtk_tree_path_free (path);
- }
- int /*long*/ [] ptr = new int /*long*/ [1];
- if (setData) {
- OS.gtk_tree_model_get (tree_model, iter, modelIndex + CELL_TEXT, ptr, -1);
- if (ptr [0] != 0) {
- OS.g_object_set(cell, OS.text, ptr[0], 0);
- OS.g_free (ptr[0]);
- }
- ptr = new int /*long*/ [1];
- }
- if (customDraw) {
- OS.gtk_tree_model_get (tree_model, iter, modelIndex + CELL_FOREGROUND, ptr, -1);
- if (ptr [0] != 0) {
- OS.g_object_set(cell, OS.foreground_gdk, ptr[0], 0);
- }
- /*
- * Bug on GTK. Gtk renders the background of the text renderer on top of the pixbuf renderer.
- * This only happens in version 2.2.1 and earlier. The fix is not to set the background.
- */
- if (OS.GTK_VERSION > OS.VERSION (2, 2, 1)) {
- ptr = new int /*long*/ [1];
- OS.gtk_tree_model_get (tree_model, iter, modelIndex + CELL_BACKGROUND, ptr, -1);
- if (ptr [0] != 0) {
- OS.g_object_set(cell, OS.background_gdk, ptr[0], 0);
- }
- }
- ptr = new int /*long*/ [1];
- OS.gtk_tree_model_get (tree_model, iter, modelIndex + CELL_FONT, ptr, -1);
- if (ptr [0] != 0) {
- OS.g_object_set(cell, OS.font_desc, ptr[0], 0);
- }
- }
- if (setData) {
- ignoreTextCell = cell;
- setScrollWidth (tree_column, iter);
- ignoreTextCell = 0;
- }
- return 0;
-}
-
int /*long*/ treeSelectionProc (int /*long*/ model, int /*long*/ path, int /*long*/ iter, int[] selection, int length) {
if (selection != null) {
int /*long*/ indices = OS.gtk_tree_path_get_indices (path);
diff --git a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/TableItem.java b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/TableItem.java
index 1a211ab06b..6a865550c3 100644
--- a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/TableItem.java
+++ b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/TableItem.java
@@ -639,8 +639,8 @@ public void setBackground (int index, Color color) {
if (column == 0) return;
int /*long*/ textRenderer = parent.getTextRenderer (column);
int /*long*/ imageRenderer = parent.getPixbufRenderer (column);
- OS.gtk_tree_view_column_set_cell_data_func (column, textRenderer, display.textCellDataProc, parentHandle, 0);
- OS.gtk_tree_view_column_set_cell_data_func (column, imageRenderer, display.pixbufCellDataProc, parentHandle, 0);
+ OS.gtk_tree_view_column_set_cell_data_func (column, textRenderer, display.cellDataProc, parentHandle, 0);
+ OS.gtk_tree_view_column_set_cell_data_func (column, imageRenderer, display.cellDataProc, parentHandle, 0);
}
if (parent.columnCount == 0) {
parent.firstCustomDraw = true;
@@ -757,8 +757,8 @@ public void setFont (int index, Font font) {
if (column == 0) return;
int /*long*/ textRenderer = parent.getTextRenderer (column);
int /*long*/ imageRenderer = parent.getPixbufRenderer (column);
- OS.gtk_tree_view_column_set_cell_data_func (column, textRenderer, display.textCellDataProc, parentHandle, 0);
- OS.gtk_tree_view_column_set_cell_data_func (column, imageRenderer, display.pixbufCellDataProc, parentHandle, 0);
+ OS.gtk_tree_view_column_set_cell_data_func (column, textRenderer, display.cellDataProc, parentHandle, 0);
+ OS.gtk_tree_view_column_set_cell_data_func (column, imageRenderer, display.cellDataProc, parentHandle, 0);
}
if (parent.columnCount == 0) {
parent.firstCustomDraw = true;
@@ -840,8 +840,8 @@ public void setForeground (int index, Color color){
if (column == 0) return;
int /*long*/ textRenderer = parent.getTextRenderer (column);
int /*long*/ imageRenderer = parent.getPixbufRenderer (column);
- OS.gtk_tree_view_column_set_cell_data_func (column, textRenderer, display.textCellDataProc, parentHandle, 0);
- OS.gtk_tree_view_column_set_cell_data_func (column, imageRenderer, display.pixbufCellDataProc, parentHandle, 0);
+ OS.gtk_tree_view_column_set_cell_data_func (column, textRenderer, display.cellDataProc, parentHandle, 0);
+ OS.gtk_tree_view_column_set_cell_data_func (column, imageRenderer, display.cellDataProc, parentHandle, 0);
}
if (parent.columnCount == 0) {
parent.firstCustomDraw = true;
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 32745b1c29..8362311260 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
@@ -43,7 +43,7 @@ import org.eclipse.swt.events.*;
public class Tree extends Composite {
int /*long*/ modelHandle, checkRenderer;
int columnCount, sortDirection;
- int /*long*/ ignoreTextCell, ignorePixbufCell;
+ int /*long*/ ignoreCell;
TreeItem[] items;
TreeColumn [] columns;
TreeColumn sortColumn;
@@ -52,6 +52,8 @@ public class Tree extends Composite {
boolean firstCustomDraw;
boolean modelChanged;
boolean expandAll;
+ int /*long*/ drawFlags;
+ boolean ownerDraw, ignoreDraw, ignoreSize;
static final int ID_COLUMN = 0;
static final int CHECKED_COLUMN = 1;
@@ -102,6 +104,20 @@ public Tree (Composite parent, int style) {
super (parent, checkStyle (style));
}
+void _addListener (int eventType, Listener listener) {
+ super._addListener (eventType, listener);
+ if (!ownerDraw) {
+ switch (eventType) {
+ case SWT.MeasureItem:
+ case SWT.EraseItem:
+ case SWT.PaintItem:
+ ownerDraw = true;
+ recreateRenderers ();
+ break;
+ }
+ }
+}
+
TreeItem _getItem (int /*long*/ iter) {
int id = getId (iter, true);
if (items [id] != null) return items [id];
@@ -158,6 +174,97 @@ static int checkStyle (int style) {
return checkBits (style, SWT.SINGLE, SWT.MULTI, 0, 0, 0, 0);
}
+int /*long*/ cellDataProc (int /*long*/ tree_column, int /*long*/ cell, int /*long*/ tree_model, int /*long*/ iter, int /*long*/ data) {
+ if (cell == ignoreCell) return 0;
+ TreeItem item = _getItem (iter);
+ if (item != null) OS.g_object_set_qdata (cell, Display.SWT_OBJECT_INDEX2, item.handle);
+ boolean isPixbuf = OS.GTK_IS_CELL_RENDERER_PIXBUF (cell);
+ if (!(isPixbuf || OS.GTK_IS_CELL_RENDERER_TEXT (cell))) return 0;
+ int modelIndex = -1;
+ boolean customDraw = false;
+ if (columnCount == 0) {
+ modelIndex = Tree.FIRST_COLUMN;
+ customDraw = firstCustomDraw;
+ } else {
+ TreeColumn column = (TreeColumn) display.getWidget (tree_column);
+ if (column != null) {
+ modelIndex = column.modelIndex;
+ customDraw = column.customDraw;
+ }
+ }
+ if (modelIndex == -1) return 0;
+ boolean setData = false;
+ if ((style & SWT.VIRTUAL) != 0) {
+ /*
+ * Feature in GTK. On GTK before 2.4, fixed_height_mode is not
+ * supported, and the tree asks for the data of all items. The
+ * fix is to only provide the data if the row is visible.
+ */
+ if (OS.GTK_VERSION < OS.VERSION (2, 3, 2)) {
+ int /*long*/ path = OS.gtk_tree_model_get_path (tree_model, iter);
+ OS.gtk_widget_realize (handle);
+ GdkRectangle visible = new GdkRectangle ();
+ OS.gtk_tree_view_get_visible_rect (handle, visible);
+ GdkRectangle area = new GdkRectangle ();
+ OS.gtk_tree_view_get_cell_area (handle, path, tree_column, area);
+ OS.gtk_tree_path_free (path);
+ if (area.y + area.height < 0 || area.y + visible.y > visible.y + visible.height ) {
+ return 0;
+ }
+ }
+ if (!item.cached) {
+ //lastIndexOf = index [0];
+ setData = checkData (item);
+ }
+ }
+ int /*long*/ [] ptr = new int /*long*/ [1];
+ if (setData) {
+ if (isPixbuf) {
+ ptr [0] = 0;
+ OS.gtk_tree_model_get (tree_model, iter, modelIndex + CELL_PIXBUF, ptr, -1);
+ OS.g_object_set (cell, OS.pixbuf, ptr[0], 0);
+ } else {
+ ptr [0] = 0;
+ OS.gtk_tree_model_get (tree_model, iter, modelIndex + CELL_TEXT, ptr, -1);
+ if (ptr [0] != 0) {
+ OS.g_object_set (cell, OS.text, ptr[0], 0);
+ OS.g_free (ptr[0]);
+ }
+ }
+ }
+ if (customDraw) {
+ /*
+ * Bug on GTK. Gtk renders the background on top of the checkbox and pixbuf.
+ * This only happens in version 2.2.1 and earlier. The fix is not to set the background.
+ */
+ if (OS.GTK_VERSION > OS.VERSION (2, 2, 1)) {
+ ptr [0] = 0;
+ OS.gtk_tree_model_get (tree_model, iter, modelIndex + CELL_BACKGROUND, ptr, -1);
+ if (ptr [0] != 0) {
+ OS.g_object_set (cell, OS.cell_background_gdk, ptr[0], 0);
+ }
+ }
+ if (!isPixbuf) {
+ ptr [0] = 0;
+ OS.gtk_tree_model_get (tree_model, iter, modelIndex + CELL_FOREGROUND, ptr, -1);
+ if (ptr [0] != 0) {
+ OS.g_object_set (cell, OS.foreground_gdk, ptr[0], 0);
+ }
+ ptr [0] = 0;
+ OS.gtk_tree_model_get (tree_model, iter, modelIndex + CELL_FONT, ptr, -1);
+ if (ptr [0] != 0) {
+ OS.g_object_set (cell, OS.font_desc, ptr[0], 0);
+ }
+ }
+ }
+ if (setData) {
+ ignoreCell = cell;
+ setScrollWidth (tree_column, iter);
+ ignoreCell = 0;
+ }
+ return 0;
+}
+
boolean checkData (TreeItem item) {
if (item.cached) return true;
if ((style & SWT.VIRTUAL) != 0) {
@@ -594,12 +701,21 @@ void createRenderers (int /*long*/ columnHandle, int modelIndex, boolean check,
if (OS.GTK_VERSION > OS.VERSION (2, 2, 1)) {
OS.gtk_tree_view_column_add_attribute (columnHandle, checkRenderer, OS.cell_background_gdk, BACKGROUND_COLUMN);
}
+ if (ownerDraw) {
+ OS.gtk_tree_view_column_set_cell_data_func (columnHandle, checkRenderer, display.cellDataProc, handle, 0);
+ OS.g_object_set_qdata (checkRenderer, Display.SWT_OBJECT_INDEX1, columnHandle);
+ }
}
- int /*long*/ pixbufRenderer = OS.gtk_cell_renderer_pixbuf_new ();
+ int /*long*/ pixbufRenderer = ownerDraw ? OS.g_object_new (display.gtk_cell_renderer_pixbuf_get_type (), 0) : OS.gtk_cell_renderer_pixbuf_new ();
if (pixbufRenderer == 0) error (SWT.ERROR_NO_HANDLES);
- int /*long*/ textRenderer = OS.gtk_cell_renderer_text_new ();
+ int /*long*/ textRenderer = ownerDraw ? OS.g_object_new (display.gtk_cell_renderer_text_get_type (), 0) : OS.gtk_cell_renderer_text_new ();
if (textRenderer == 0) error (SWT.ERROR_NO_HANDLES);
+ if (ownerDraw) {
+ OS.g_object_set_qdata (pixbufRenderer, Display.SWT_OBJECT_INDEX1, columnHandle);
+ OS.g_object_set_qdata (textRenderer, Display.SWT_OBJECT_INDEX1, columnHandle);
+ }
+
/*
* Feature in GTK. When a tree view column contains only one activatable
* cell renderer such as a toggle renderer, mouse clicks anywhere in a cell
@@ -650,9 +766,9 @@ void createRenderers (int /*long*/ columnHandle, int modelIndex, boolean check,
}
}
}
- if ((style & SWT.VIRTUAL) != 0 || customDraw) {
- OS.gtk_tree_view_column_set_cell_data_func (columnHandle, textRenderer, display.textCellDataProc, handle, 0);
- OS.gtk_tree_view_column_set_cell_data_func (columnHandle, pixbufRenderer, display.pixbufCellDataProc, handle, 0);
+ if ((style & SWT.VIRTUAL) != 0 || customDraw || ownerDraw) {
+ OS.gtk_tree_view_column_set_cell_data_func (columnHandle, textRenderer, display.cellDataProc, handle, 0);
+ OS.gtk_tree_view_column_set_cell_data_func (columnHandle, pixbufRenderer, display.cellDataProc, handle, 0);
}
}
@@ -1813,73 +1929,33 @@ int /*long*/ paintWindow () {
return OS.gtk_tree_view_get_bin_window (handle);
}
-int /*long*/ pixbufCellDataProc (int /*long*/ tree_column, int /*long*/ cell, int /*long*/ tree_model, int /*long*/ iter, int /*long*/ data) {
- if (cell == ignorePixbufCell) return 0;
- int modelIndex = -1;
- boolean customDraw = false;
+void recreateRenderers () {
+ if (checkRenderer != 0) {
+ display.removeWidget (checkRenderer);
+ OS.g_object_unref (checkRenderer);
+ checkRenderer = ownerDraw ? OS.g_object_new (display.gtk_cell_renderer_toggle_get_type(), 0) : OS.gtk_cell_renderer_toggle_new ();
+ if (checkRenderer == 0) error (SWT.ERROR_NO_HANDLES);
+ OS.g_object_ref (checkRenderer);
+ display.addWidget (checkRenderer, this);
+ OS.g_signal_connect_closure (checkRenderer, OS.toggled, display.closures [TOGGLED], false);
+ }
if (columnCount == 0) {
- modelIndex = Tree.FIRST_COLUMN;
- customDraw = firstCustomDraw;
+ createRenderers (OS.gtk_tree_view_get_column (handle, 0), Tree.FIRST_COLUMN, true, 0);
} else {
- for (int i = 0; i < columns.length; i++) {
- if (columns [i] != null && columns [i].handle == tree_column) {
- modelIndex = columns [i].modelIndex;
- customDraw = columns [i].customDraw;
- break;
- }
- }
- }
- if (modelIndex == -1) return 0;
- boolean setData = false;
- if ((style & SWT.VIRTUAL) != 0) {
- /*
- * Feature in GTK. On GTK before 2.4, fixed_height_mode is not
- * supported, and the tree asks for the data of all items. The
- * fix is to only provide the data if the row is visible.
- */
- if (OS.GTK_VERSION < OS.VERSION (2, 3, 2)) {
- int /*long*/ path = OS.gtk_tree_model_get_path (tree_model, iter);
- OS.gtk_widget_realize (handle);
- GdkRectangle visible = new GdkRectangle ();
- OS.gtk_tree_view_get_visible_rect (handle, visible);
- GdkRectangle area = new GdkRectangle ();
- OS.gtk_tree_view_get_cell_area (handle, path, tree_column, area);
- OS.gtk_tree_path_free (path);
- if (area.y + area.height < 0 || area.y + visible.y > visible.y + visible.height ) {
- return 0;
- }
- }
- TreeItem item = _getItem (iter);
- if (!item.cached) {
- //lastIndexOf = index [0];
- setData = checkData (item);
- }
- }
- int /*long*/ [] ptr = new int /*long*/ [1];
- if (setData) {
- OS.gtk_tree_model_get (tree_model, iter, modelIndex + CELL_PIXBUF, ptr, -1);
- OS.g_object_set(cell, OS.pixbuf, ptr[0], 0);
- ptr = new int /*long*/ [1];
- }
- if (customDraw) {
- /*
- * Bug on GTK. Gtk renders the background on top of the checkbox and pixbuf.
- * This only happens in version 2.2.1 and earlier. The fix is not to set the background.
- */
- if (OS.GTK_VERSION > OS.VERSION (2, 2, 1)) {
- OS.gtk_tree_model_get (tree_model, iter, modelIndex + CELL_BACKGROUND, ptr, -1);
- if (ptr [0] != 0) {
- OS.g_object_set(cell, OS.cell_background_gdk, ptr[0], 0);
- }
+ for (int i = 0; i < columnCount; i++) {
+ TreeColumn column = columns [i];
+ createRenderers (column.handle, column.modelIndex, i == 0, column.style);
}
}
- if (setData) {
- ignorePixbufCell = cell;
- setScrollWidth (tree_column, iter);
- ignorePixbufCell = 0;
+}
+
+void redrawBackgroundImage () {
+ Control control = findBackgroundControl ();
+ if (control != null && control.backgroundImage != null) {
+ redrawWidget (0, 0, 0, 0, true, false, false);
}
- return 0;
}
+
void register () {
super.register ();
display.addWidget (OS.gtk_tree_view_get_selection (handle), this);
@@ -2066,6 +2142,184 @@ public void removeTreeListener(TreeListener listener) {
eventTable.unhook (SWT.Collapse, listener);
}
+int /*long*/ rendererGetSizeProc (int /*long*/ cell, int /*long*/ widget, int /*long*/ cell_area, int /*long*/ x_offset, int /*long*/ y_offset, int /*long*/ width, int /*long*/ height) {
+ int /*long*/ g_class = OS.g_type_class_peek_parent (OS.G_OBJECT_GET_CLASS (cell));
+ GtkCellRendererClass klass = new GtkCellRendererClass ();
+ OS.memmove (klass, g_class);
+ int result = OS.call (klass.get_size, cell, handle, cell_area, x_offset, y_offset, width, height);
+ if (!ignoreSize && OS.GTK_IS_CELL_RENDERER_TEXT (cell)) {
+ int /*long*/ iter = OS.g_object_get_qdata (cell, Display.SWT_OBJECT_INDEX2);
+ TreeItem item = null;
+ if (iter != 0) item = _getItem (iter);
+ if (item != null) {
+ int columnIndex = 0;
+ if (columnCount > 0) {
+ int /*long*/ columnHandle = OS.g_object_get_qdata (cell, Display.SWT_OBJECT_INDEX1);
+ for (int i = 0; i < columnCount; i++) {
+ if (columns [i].handle == columnHandle) {
+ columnIndex = i;
+ break;
+ }
+ }
+ }
+ if (hooks (SWT.MeasureItem)) {
+ int [] contentWidth = new int [1], contentHeight = new int [1];
+ if (width != 0) OS.memmove (contentWidth, width, 4);
+ if (height != 0) OS.memmove (contentHeight, height, 4);
+ Image image = item.getImage (columnIndex);
+ Rectangle bounds = image.getBounds ();
+ contentWidth [0] += bounds.width;
+ GC gc = new GC (this);
+ gc.setFont (item.getFont (columnIndex));
+ Event event = new Event ();
+ event.item = item;
+ event.index = columnIndex;
+ event.gc = gc;
+ event.width = contentWidth [0];
+ event.height = contentHeight [0];
+ sendEvent (SWT.MeasureItem, event);
+ gc.dispose ();
+ contentWidth [0] = event.width - bounds.width;
+ contentHeight [0] = event.height;
+ if (width != 0) OS.memmove (width, contentWidth, 4);
+ if (height != 0) OS.memmove (height, contentHeight, 4);
+ }
+ }
+ }
+ return result;
+}
+
+int /*long*/ rendererRenderProc (int /*long*/ cell, int /*long*/ window, int /*long*/ widget, int /*long*/ background_area, int /*long*/ cell_area, int /*long*/ expose_area, int flags) {
+ TreeItem item = null;
+ int /*long*/ iter = OS.g_object_get_qdata (cell, Display.SWT_OBJECT_INDEX2);
+ int /*long*/ columnHandle = OS.g_object_get_qdata (cell, Display.SWT_OBJECT_INDEX1);
+ if (iter != 0) item = _getItem (iter);
+// if (checkRenderer != 0) {
+// if ((flags & OS.GTK_CELL_RENDERER_FOCUSED) != 0) {
+// OS.gtk_tree_view_column_focus_cell (columnHandle, checkRenderer);
+// }
+// }
+ int columnIndex = 0;
+ boolean draw = !ignoreDraw;
+ if (item != null) {
+ if (columnCount > 0) {
+ for (int i = 0; i < columnCount; i++) {
+ if (columns [i].handle == columnHandle) {
+ columnIndex = i;
+ break;
+ }
+ }
+ }
+ GdkRectangle rect = new GdkRectangle ();
+ int /*long*/ path = OS.gtk_tree_model_get_path (modelHandle, iter);
+ OS.gtk_tree_view_get_background_area (handle, path, columnHandle, rect);
+ OS.gtk_tree_path_free (path);
+ if (OS.GTK_IS_CELL_RENDERER_TOGGLE (cell) || (OS.GTK_IS_CELL_RENDERER_PIXBUF (cell) && (columnIndex != 0 || (style & SWT.CHECK) == 0))) {
+ draw = true;
+ ignoreDraw = !draw;
+ drawFlags = flags;
+
+ if ((flags & OS.GTK_CELL_RENDERER_SELECTED) == 0) {
+ Control control = findBackgroundControl ();
+ if (control != null && control.backgroundImage != null) {
+ OS.gdk_window_clear_area (window, rect.x, rect.y, rect.width, rect.height);
+ }
+ }
+
+ if (hooks (SWT.EraseItem)) {
+ if ((flags & OS.GTK_CELL_RENDERER_SELECTED) != 0) {
+ OS.gdk_window_clear_area (window, rect.x, rect.y, rect.width, rect.height);
+ }
+ GC gc = new GC (this);
+ gc.setClipping (rect.x, rect.y, rect.width, rect.height);
+ Event event = new Event ();
+ event.item = item;
+ event.index = columnIndex;
+ event.gc = gc;
+ event.x = rect.x;
+ event.y = rect.y;
+ event.width = rect.width;
+ event.height = rect.height;
+ if ((flags & OS.GTK_CELL_RENDERER_SELECTED) != 0) event.detail |= SWT.SELECTED;
+ if ((flags & OS.GTK_CELL_RENDERER_FOCUSED) != 0) event.detail |= SWT.FOCUSED;
+ sendEvent (SWT.EraseItem, event);
+ gc.dispose();
+ flags &= ~(OS.GTK_CELL_RENDERER_SELECTED | OS.GTK_CELL_RENDERER_FOCUSED);
+ if ((event.detail & SWT.SELECTED) != 0) flags |= OS.GTK_CELL_RENDERER_SELECTED;
+ if ((event.detail & SWT.FOCUSED) != 0) flags |= OS.GTK_CELL_RENDERER_FOCUSED;
+ drawFlags = flags;
+ draw = event.doit;
+ ignoreDraw = !draw;
+ if ((flags & OS.GTK_CELL_RENDERER_SELECTED) != 0) {
+ int /*long*/ style = OS.gtk_widget_get_style (widget);
+ OS.gtk_paint_flat_box (style, window, OS.GTK_STATE_SELECTED, OS.GTK_SHADOW_NONE, rect, widget, null, rect.x, rect.y, rect.width, rect.height);
+ }
+ }
+ }
+ }
+ int /*long*/ result = 0;
+ if (draw || OS.GTK_IS_CELL_RENDERER_TOGGLE (cell)) {
+ int /*long*/ g_class = OS.g_type_class_peek_parent (OS.G_OBJECT_GET_CLASS (cell));
+ GtkCellRendererClass klass = new GtkCellRendererClass ();
+ OS.memmove (klass, g_class);
+ result = OS.call (klass.render, cell, window, handle, background_area, cell_area, expose_area, drawFlags);
+ }
+ if (item != null) {
+ if (OS.GTK_IS_CELL_RENDERER_TEXT (cell)) {
+ if (hooks (SWT.PaintItem)) {
+ GdkRectangle rect = new GdkRectangle ();
+ int /*long*/ path = OS.gtk_tree_model_get_path (modelHandle, iter);
+ OS.gtk_tree_view_get_background_area (handle, path, columnHandle, rect);
+ OS.gtk_tree_path_free (path);
+ if (OS.gtk_tree_view_get_expander_column (handle) == columnHandle) {
+ int [] buffer = new int [1];
+ OS.gtk_widget_style_get (handle, OS.expander_size, buffer, 0);
+ rect.x += buffer [0] + TreeItem.EXPANDER_EXTRA_PADDING;
+ rect.width -= buffer [0] + TreeItem.EXPANDER_EXTRA_PADDING;
+ //OS.gtk_widget_style_get (parentHandle, OS.horizontal_separator, buffer, 0);
+ //int horizontalSeparator = buffer[0];
+ //rect.x += horizontalSeparator;
+ }
+ ignoreSize = true;
+ int [] contentX = new int [1], contentWidth = new int [1];
+ OS.gtk_cell_renderer_get_size (cell, handle, null, null, null, contentWidth, null);
+ OS.gtk_tree_view_column_cell_get_position (columnHandle, cell, contentX, null);
+ ignoreSize = false;
+ Image image = item.getImage (columnIndex);
+ Rectangle bounds = image.getBounds ();
+ contentX [0] -= bounds.width;
+ contentWidth [0] += bounds.width;
+ GC gc = new GC (this);
+ if ((drawFlags & OS.GTK_CELL_RENDERER_SELECTED) != 0) {
+ gc.setBackground (display.getSystemColor (SWT.COLOR_LIST_SELECTION));
+ gc.setForeground (display.getSystemColor (SWT.COLOR_LIST_SELECTION_TEXT));
+ } else {
+ gc.setBackground (item.getBackground (columnIndex));
+ gc.setForeground (item.getForeground (columnIndex));
+ }
+ gc.setFont (item.getFont (columnIndex));
+ gc.setClipping (rect.x, rect.y, rect.width, rect.height);
+ Event event = new Event ();
+ event.item = item;
+ event.index = columnIndex;
+ event.gc = gc;
+ event.x = rect.x + contentX [0];
+ event.y = rect.y;
+ event.width = contentWidth [0];
+ event.height = rect.height;
+ if ((drawFlags & OS.GTK_CELL_RENDERER_SELECTED) != 0) event.detail |= SWT.SELECTED;
+ if ((drawFlags & OS.GTK_CELL_RENDERER_FOCUSED) != 0) event.detail |= SWT.FOCUSED;
+ sendEvent (SWT.PaintItem, event);
+ gc.dispose();
+ }
+ draw = true;
+ ignoreDraw = !draw;
+ drawFlags = 0;
+ }
+ }
+ return result;
+}
+
void resetCustomDraw () {
if ((style & SWT.VIRTUAL) != 0) return;
int end = Math.max (1, columnCount);
@@ -2170,6 +2424,12 @@ void setBackgroundColor (GdkColor color) {
OS.gtk_widget_modify_base (handle, 0, color);
}
+void setBackgroundPixmap (int /*long*/ pixmap) {
+ super.setBackgroundPixmap (pixmap);
+ int /*long*/ window = paintWindow ();
+ if (window != 0) OS.gdk_window_set_back_pixmap (window, 0, true);
+}
+
int setBounds (int x, int y, int width, int height, boolean move, boolean resize) {
int result = super.setBounds (x, y, width, height, move, resize);
/*
@@ -2300,6 +2560,12 @@ public void setLinesVisible (boolean show) {
OS.gtk_tree_view_set_rules_hint (handle, show);
}
+void setParentBackground () {
+ super.setParentBackground ();
+ int /*long*/ window = paintWindow ();
+ if (window != 0) OS.gdk_window_set_back_pixmap (window, 0, true);
+}
+
void setParentWindow (int /*long*/ widget) {
int /*long*/ window = eventWindow ();
OS.gtk_widget_set_parent_window (widget, window);
@@ -2592,87 +2858,6 @@ public void showItem (TreeItem item) {
OS.gtk_tree_path_free (path);
}
-int /*long*/ textCellDataProc (int /*long*/ tree_column, int /*long*/ cell, int /*long*/ tree_model, int /*long*/ iter, int /*long*/ data) {
- if (cell == ignoreTextCell) return 0;
- int modelIndex = -1;
- boolean customDraw = false;
- if (columnCount == 0) {
- modelIndex = Tree.FIRST_COLUMN;
- customDraw = firstCustomDraw;
- } else {
- for (int i = 0; i < columns.length; i++) {
- if (columns [i] != null && columns [i].handle == tree_column) {
- modelIndex = columns [i].modelIndex;
- customDraw = columns [i].customDraw;
- break;
- }
- }
- }
- if (modelIndex == -1) return 0;
- boolean setData = false;
- if ((style & SWT.VIRTUAL) != 0) {
- /*
- * Feature in GTK. On GTK before 2.4, fixed_height_mode is not
- * supported, and the tree asks for the data of all items. The
- * fix is to only provide the data if the row is visible.
- */
- if (OS.GTK_VERSION < OS.VERSION (2, 3, 2)) {
- int /*long*/ path = OS.gtk_tree_model_get_path (tree_model, iter);
- OS.gtk_widget_realize (handle);
- GdkRectangle visible = new GdkRectangle ();
- OS.gtk_tree_view_get_visible_rect (handle, visible);
- GdkRectangle area = new GdkRectangle ();
- OS.gtk_tree_view_get_cell_area (handle, path, tree_column, area);
- OS.gtk_tree_path_free (path);
- if (area.y + area.height < 0 || area.y + visible.y > visible.y + visible.height ) {
- return 0;
- }
- }
- TreeItem item = _getItem (iter);
- if (!item.cached) {
- //lastIndexOf = index [0];
- setData = checkData (item);
- }
- }
- int /*long*/ [] ptr = new int /*long*/ [1];
- if (setData) {
- OS.gtk_tree_model_get (tree_model, iter, modelIndex + CELL_TEXT, ptr, -1);
- if (ptr [0] != 0) {
- OS.g_object_set(cell, OS.text, ptr[0], 0);
- OS.g_free (ptr[0]);
- }
- ptr = new int /*long*/ [1];
- }
- if (customDraw) {
- OS.gtk_tree_model_get (tree_model, iter, modelIndex + CELL_FOREGROUND, ptr, -1);
- if (ptr [0] != 0) {
- OS.g_object_set(cell, OS.foreground_gdk, ptr[0], 0);
- }
- /*
- * Bug on GTK. Gtk renders the background of the text renderer on top of the pixbuf renderer.
- * This only happens in version 2.2.1 and earlier. The fix is not to set the background.
- */
- if (OS.GTK_VERSION > OS.VERSION (2, 2, 1)) {
- ptr = new int /*long*/ [1];
- OS.gtk_tree_model_get (tree_model, iter, modelIndex + CELL_BACKGROUND, ptr, -1);
- if (ptr [0] != 0) {
- OS.g_object_set(cell, OS.background_gdk, ptr[0], 0);
- }
- }
- ptr = new int /*long*/ [1];
- OS.gtk_tree_model_get (tree_model, iter, modelIndex + CELL_FONT, ptr, -1);
- if (ptr [0] != 0) {
- OS.g_object_set(cell, OS.font_desc, ptr[0], 0);
- }
- }
- if (setData) {
- ignoreTextCell = cell;
- setScrollWidth (tree_column, iter);
- ignoreTextCell = 0;
- }
- return 0;
-}
-
int /*long*/ treeSelectionProc (int /*long*/ model, int /*long*/ path, int /*long*/ iter, int[] selection, int length) {
if (selection != null) {
int [] index = new int [1];
diff --git a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/TreeItem.java b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/TreeItem.java
index 3e5467346b..7717eeb032 100644
--- a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/TreeItem.java
+++ b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/TreeItem.java
@@ -401,7 +401,9 @@ public Rectangle getBounds () {
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;
rect.width = w [0];
int [] buffer = new int [1];
if (OS.gtk_tree_view_get_expander_column (parentHandle) == column) {
@@ -1010,8 +1012,8 @@ public void setBackground (int index, Color color) {
if (column == 0) return;
int /*long*/ textRenderer = parent.getTextRenderer (column);
int /*long*/ imageRenderer = parent.getPixbufRenderer (column);
- OS.gtk_tree_view_column_set_cell_data_func (column, textRenderer, display.textCellDataProc, parentHandle, 0);
- OS.gtk_tree_view_column_set_cell_data_func (column, imageRenderer, display.pixbufCellDataProc, parentHandle, 0);
+ OS.gtk_tree_view_column_set_cell_data_func (column, textRenderer, display.cellDataProc, parentHandle, 0);
+ OS.gtk_tree_view_column_set_cell_data_func (column, imageRenderer, display.cellDataProc, parentHandle, 0);
}
if (parent.columnCount == 0) {
parent.firstCustomDraw = true;
@@ -1157,8 +1159,8 @@ public void setFont (int index, Font font) {
if (column == 0) return;
int /*long*/ textRenderer = parent.getTextRenderer (column);
int /*long*/ imageRenderer = parent.getPixbufRenderer (column);
- OS.gtk_tree_view_column_set_cell_data_func (column, textRenderer, display.textCellDataProc, parentHandle, 0);
- OS.gtk_tree_view_column_set_cell_data_func (column, imageRenderer, display.pixbufCellDataProc, parentHandle, 0);
+ OS.gtk_tree_view_column_set_cell_data_func (column, textRenderer, display.cellDataProc, parentHandle, 0);
+ OS.gtk_tree_view_column_set_cell_data_func (column, imageRenderer, display.cellDataProc, parentHandle, 0);
}
if (parent.columnCount == 0) {
parent.firstCustomDraw = true;
@@ -1243,8 +1245,8 @@ public void setForeground (int index, Color color){
if (column == 0) return;
int /*long*/ textRenderer = parent.getTextRenderer (column);
int /*long*/ imageRenderer = parent.getPixbufRenderer (column);
- OS.gtk_tree_view_column_set_cell_data_func (column, textRenderer, display.textCellDataProc, parentHandle, 0);
- OS.gtk_tree_view_column_set_cell_data_func (column, imageRenderer, display.pixbufCellDataProc, parentHandle, 0);
+ OS.gtk_tree_view_column_set_cell_data_func (column, textRenderer, display.cellDataProc, parentHandle, 0);
+ OS.gtk_tree_view_column_set_cell_data_func (column, imageRenderer, display.cellDataProc, parentHandle, 0);
}
if (parent.columnCount == 0) {
parent.firstCustomDraw = true;
diff --git a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Widget.java b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Widget.java
index 92312a0534..95fd0eb3c1 100644
--- a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Widget.java
+++ b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Widget.java
@@ -198,6 +198,11 @@ public Widget (Widget parent, int style) {
display = parent.display;
}
+void _addListener (int eventType, Listener listener) {
+ if (eventTable == null) eventTable = new EventTable ();
+ eventTable.hook (eventType, listener);
+}
+
/**
* Adds the listener to the collection of listeners who will
* be notifed when an event of the given type occurs. When the
@@ -218,11 +223,10 @@ public Widget (Widget parent, int style) {
* @see Listener
* @see #removeListener
*/
-public void addListener (int eventType, Listener handler) {
+public void addListener (int eventType, Listener listener) {
checkWidget ();
- if (handler == null) error (SWT.ERROR_NULL_ARGUMENT);
- if (eventTable == null) eventTable = new EventTable ();
- eventTable.hook (eventType, handler);
+ if (listener == null) error (SWT.ERROR_NULL_ARGUMENT);
+ _addListener (eventType, listener);
}
/**
@@ -251,15 +255,9 @@ public void addDisposeListener (DisposeListener listener) {
addListener (SWT.Dispose, typedListener);
}
-int /*long*/ textCellDataProc (int /*long*/ tree_column, int /*long*/ cell, int /*long*/ tree_model, int /*long*/ iter, int /*long*/ data) {
- return 0;
-}
int /*long*/ paintWindow () {
return 0;
}
-int /*long*/ pixbufCellDataProc (int /*long*/ tree_column, int /*long*/ cell, int /*long*/ tree_model, int /*long*/ iter, int /*long*/ data) {
- return 0;
-}
static int checkBits (int style, int int0, int int1, int int2, int int3, int int4, int int5) {
int mask = int0 | int1 | int2 | int3 | int4 | int5;
@@ -273,6 +271,10 @@ static int checkBits (int style, int int0, int int1, int int2, int int3, int int
return style;
}
+int /*long*/ cellDataProc (int /*long*/ tree_column, int /*long*/ cell, int /*long*/ tree_model, int /*long*/ iter, int /*long*/ data) {
+ return 0;
+}
+
void checkOpen () {
/* Do nothing */
}
@@ -1034,6 +1036,14 @@ protected void removeListener (int eventType, SWTEventListener handler) {
eventTable.unhook (eventType, handler);
}
+int /*long*/ rendererGetSizeProc (int /*long*/ cell, int /*long*/ handle, int /*long*/ cell_area, int /*long*/ x_offset, int /*long*/ y_offset, int /*long*/ width, int /*long*/ height) {
+ return 0;
+}
+
+int /*long*/ rendererRenderProc (int /*long*/ cell, int /*long*/ window, int /*long*/ handle, int /*long*/ background_area, int /*long*/ cell_area, int /*long*/ expose_area, int flags) {
+ return 0;
+}
+
/**
* Removes the listener from the collection of listeners who will
* be notifed when the widget is disposed.