diff options
author | Silenio Quarti <silenio> | 2006-02-06 22:50:04 +0000 |
---|---|---|
committer | Silenio Quarti <silenio> | 2006-02-06 22:50:04 +0000 |
commit | 9b5a11c3e5885ebf39634af29467f32493457d20 (patch) | |
tree | 4aff2e2a76d8acc25c29b39c05dcb412df3aff7e | |
parent | 1da7e46ba972577e1130737ac65587e286329111 (diff) | |
download | eclipse.platform.swt-9b5a11c3e5885ebf39634af29467f32493457d20.tar.gz eclipse.platform.swt-9b5a11c3e5885ebf39634af29467f32493457d20.tar.xz eclipse.platform.swt-9b5a11c3e5885ebf39634af29467f32493457d20.zip |
owner draw Tree/Table
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. |