2 * Copyright (C) 2000 Red Hat, Inc., Jonathan Blandford <jrb@redhat.com>
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Library General Public
6 * License as published by the Free Software Foundation; either
7 * version 2 of the License, or (at your option) any later version.
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Library General Public License for more details.
14 * You should have received a copy of the GNU Library General Public
15 * License along with this library; if not, write to the
16 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
17 * Boston, MA 02111-1307, USA.
20 #include "gtktreeviewcolumn.h"
21 #include "gtktreeprivate.h"
22 #include "gtksignal.h"
23 #include "gtkbutton.h"
24 #include "gtkalignment.h"
51 static void gtk_tree_view_column_init (GtkTreeViewColumn *tree_column);
52 static void gtk_tree_view_column_class_init (GtkTreeViewColumnClass *klass);
53 static void gtk_tree_view_column_set_attributesv (GtkTreeViewColumn *tree_column,
55 static void gtk_real_tree_column_clicked (GtkTreeViewColumn *tree_column);
56 static void gtk_tree_view_column_set_property (GObject *object,
60 const gchar *trailer);
61 static void gtk_tree_view_column_get_property (GObject *object,
65 const gchar *trailer);
69 static GtkObjectClass *parent_class = NULL;
70 static guint tree_column_signals[LAST_SIGNAL] = { 0 };
74 gtk_tree_view_column_get_type (void)
76 static GtkType tree_column_type = 0;
78 if (!tree_column_type)
80 static const GTypeInfo tree_column_info =
82 sizeof (GtkTreeViewColumnClass),
84 NULL, /* base_finalize */
85 (GClassInitFunc) gtk_tree_view_column_class_init,
86 NULL, /* class_finalize */
87 NULL, /* class_data */
88 sizeof (GtkTreeViewColumn),
90 (GInstanceInitFunc) gtk_tree_view_column_init,
93 tree_column_type = g_type_register_static (GTK_TYPE_OBJECT, "GtkTreeViewColumn", &tree_column_info, 0);
96 return tree_column_type;
100 gtk_tree_view_column_class_init (GtkTreeViewColumnClass *class)
102 GObjectClass *object_class;
104 object_class = (GObjectClass*) class;
106 parent_class = g_type_class_peek_parent (class);
108 class->clicked = gtk_real_tree_column_clicked;
110 object_class->set_property = gtk_tree_view_column_set_property;
111 object_class->get_property = gtk_tree_view_column_get_property;
113 tree_column_signals[CLICKED] =
114 g_signal_newc ("clicked",
115 GTK_CLASS_TYPE (object_class),
117 G_STRUCT_OFFSET (GtkTreeViewColumnClass, clicked),
119 gtk_marshal_VOID__VOID,
122 g_object_class_install_property (object_class,
124 g_param_spec_object ("cell_renderer",
126 _("Cell renderer object to use for rendering the cell"),
127 GTK_TYPE_CELL_RENDERER,
128 G_PARAM_READABLE | G_PARAM_WRITABLE));
130 g_object_class_install_property (object_class,
132 g_param_spec_boolean ("visible",
134 _("Whether to display the colomn"),
136 G_PARAM_READABLE | G_PARAM_WRITABLE));
138 g_object_class_install_property (object_class,
140 g_param_spec_enum ("sizing",
142 _("Resize mode of the column"),
143 GTK_TYPE_TREE_VIEW_COLUMN_SIZING,
144 GTK_TREE_VIEW_COLUMN_AUTOSIZE,
145 G_PARAM_READABLE | G_PARAM_WRITABLE));
147 g_object_class_install_property (object_class,
149 g_param_spec_int ("width",
151 _("Current width of the column"),
155 G_PARAM_READABLE | G_PARAM_WRITABLE));
157 g_object_class_install_property (object_class,
159 g_param_spec_int ("min_width",
161 _("Minimum allowed width of the column"),
165 G_PARAM_READABLE | G_PARAM_WRITABLE));
167 g_object_class_install_property (object_class,
169 g_param_spec_int ("max_width",
171 _("Maximum allowed width of the column"),
175 G_PARAM_READABLE | G_PARAM_WRITABLE));
177 g_object_class_install_property (object_class,
179 g_param_spec_string ("title",
181 _("Title to appear in column header"),
183 G_PARAM_READABLE | G_PARAM_WRITABLE));
185 g_object_class_install_property (object_class,
187 g_param_spec_boolean ("clickable",
189 _("Whether the header can be clicked"),
191 G_PARAM_READABLE | G_PARAM_WRITABLE));
194 g_object_class_install_property (object_class,
196 g_param_spec_object ("widget",
198 _("Widget to put in column header button instead of column title"),
200 G_PARAM_READABLE | G_PARAM_WRITABLE));
202 g_object_class_install_property (object_class,
204 g_param_spec_enum ("justification",
206 _("Justification of the column"),
207 GTK_TYPE_JUSTIFICATION,
209 G_PARAM_READABLE | G_PARAM_WRITABLE));
213 gtk_tree_view_column_init (GtkTreeViewColumn *tree_column)
215 /* FIXME remove on port to GtkObject */
216 gtk_object_ref (GTK_OBJECT (tree_column));
217 gtk_object_sink (GTK_OBJECT (tree_column));
219 tree_column->button = NULL;
220 tree_column->justification = GTK_JUSTIFY_LEFT;
221 tree_column->width = 1;
222 tree_column->min_width = -1;
223 tree_column->max_width = -1;
224 tree_column->cell = NULL;
225 tree_column->attributes = NULL;
226 tree_column->column_type = GTK_TREE_VIEW_COLUMN_AUTOSIZE;
227 tree_column->visible = TRUE;
228 tree_column->button_active = FALSE;
229 tree_column->dirty = TRUE;
233 gtk_tree_view_column_set_property (GObject *object,
237 const gchar *trailer)
239 GtkTreeViewColumn *tree_column;
241 tree_column = GTK_TREE_VIEW_COLUMN (object);
245 case PROP_CELL_RENDERER:
246 gtk_tree_view_column_set_cell_renderer (tree_column,
248 g_value_get_object (value));
252 gtk_tree_view_column_set_visible (tree_column,
253 g_value_get_boolean (value));
257 gtk_tree_view_column_set_sizing (tree_column,
258 g_value_get_enum (value));
262 gtk_tree_view_column_set_width (tree_column,
263 g_value_get_int (value));
267 gtk_tree_view_column_set_min_width (tree_column,
268 g_value_get_int (value));
272 gtk_tree_view_column_set_max_width (tree_column,
273 g_value_get_int (value));
277 gtk_tree_view_column_set_title (tree_column,
278 g_value_get_string (value));
282 gtk_tree_view_column_set_clickable (tree_column,
283 g_value_get_boolean (value));
287 gtk_tree_view_column_set_widget (tree_column,
288 (GtkWidget*) g_value_get_object (value));
291 case PROP_JUSTIFICATION:
292 gtk_tree_view_column_set_justification (tree_column,
293 g_value_get_enum (value));
297 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
303 gtk_tree_view_column_get_property (GObject *object,
307 const gchar *trailer)
309 GtkTreeViewColumn *tree_column;
311 tree_column = GTK_TREE_VIEW_COLUMN (object);
315 case PROP_CELL_RENDERER:
316 g_value_set_object (value, (GObject*) tree_column->cell);
320 g_value_set_boolean (value, tree_column->visible);
324 g_value_set_enum (value, tree_column->column_type);
328 g_value_set_int (value, tree_column->width);
332 g_value_set_int (value, tree_column->min_width);
336 g_value_set_int (value, tree_column->max_width);
340 g_value_set_string (value, tree_column->title);
344 g_value_set_boolean (value, tree_column->button_active);
351 case PROP_JUSTIFICATION:
352 g_value_set_enum (value, tree_column->justification);
356 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
362 /* used to make the buttons 'unclickable' */
365 gtk_tree_view_passive_func (GtkWidget *widget,
369 g_return_val_if_fail (event != NULL, FALSE);
373 case GDK_MOTION_NOTIFY:
374 case GDK_BUTTON_PRESS:
375 case GDK_2BUTTON_PRESS:
376 case GDK_3BUTTON_PRESS:
377 case GDK_BUTTON_RELEASE:
378 case GDK_ENTER_NOTIFY:
379 case GDK_LEAVE_NOTIFY:
388 gtk_real_tree_column_clicked (GtkTreeViewColumn *tree_column)
390 g_return_if_fail (tree_column != NULL);
391 g_return_if_fail (GTK_IS_TREE_VIEW_COLUMN (tree_column));
396 * gtk_tree_view_column_new:
398 * Creates a new #GtkTreeViewColumn.
400 * Return value: A newly created #GtkTreeViewColumn.
403 gtk_tree_view_column_new (void)
405 GtkTreeViewColumn *retval;
407 retval = GTK_TREE_VIEW_COLUMN (gtk_type_new (GTK_TYPE_TREE_COLUMN));
413 * gtk_tree_view_column_new_with_attributes:
414 * @title: The title to set the header to.
415 * @cell: The #GtkCellRenderer.
416 * @Varargs: A NULL terminated list of attributes.
418 * Creates a new #GtkTreeViewColumn with a number of default values. This is
419 * equivalent to calling @gtk_tree_view_column_set_title,
420 * @gtk_tree_view_column_set_cell_renderer, and
421 * @gtk_tree_view_column_set_attributes on the newly created #GtkTreeViewColumn.
423 * Return value: A newly created #GtkTreeViewColumn.
426 gtk_tree_view_column_new_with_attributes (gchar *title,
427 GtkCellRenderer *cell,
430 GtkTreeViewColumn *retval;
433 retval = gtk_tree_view_column_new ();
435 gtk_tree_view_column_set_title (retval, title);
436 gtk_tree_view_column_set_cell_renderer (retval, cell);
438 va_start (args, cell);
439 gtk_tree_view_column_set_attributesv (retval, args);
446 * gtk_tree_view_column_set_cell_renderer:
447 * @tree_column: A #GtkTreeViewColumn.
448 * @cell: The #GtkCellRenderer, or NULL.
450 * Sets the cell renderer of the @tree_column. If there is a cell
451 * renderer already set, then it is removed. If @cell is NULL, then
452 * the cell renderer is unset.
455 gtk_tree_view_column_set_cell_renderer (GtkTreeViewColumn *tree_column,
456 GtkCellRenderer *cell)
458 g_return_if_fail (tree_column != NULL);
459 g_return_if_fail (GTK_IS_TREE_VIEW_COLUMN (tree_column));
461 g_return_if_fail (GTK_IS_CELL_RENDERER (cell));
464 g_object_ref (G_OBJECT (cell));
466 if (tree_column->cell)
467 g_object_unref (G_OBJECT (tree_column->cell));
469 tree_column->cell = cell;
471 g_object_notify (G_OBJECT (tree_column), "cell_renderer");
475 * gtk_tree_view_column_add_attribute:
476 * @tree_column: A #GtkTreeViewColumn.
477 * @attribute: An attribute on the columns cell
478 * @column: The column position on the model to get the attribute from.
480 * Adds an attribute mapping to the list in @tree_column. The @column is the
481 * column position on the model to get a value from, and the @attribute is the
482 * parameter on the @tree_column's cell renderer to set that value to.
485 gtk_tree_view_column_add_attribute (GtkTreeViewColumn *tree_column,
489 g_return_if_fail (tree_column != NULL);
490 g_return_if_fail (GTK_IS_TREE_VIEW_COLUMN (tree_column));
492 tree_column->attributes = g_slist_prepend (tree_column->attributes,
493 GINT_TO_POINTER (column));
494 tree_column->attributes = g_slist_prepend (tree_column->attributes,
495 g_strdup (attribute));
499 gtk_tree_view_column_set_attributesv (GtkTreeViewColumn *tree_column,
505 g_return_if_fail (tree_column != NULL);
506 g_return_if_fail (GTK_IS_TREE_VIEW_COLUMN (tree_column));
508 attribute = va_arg (args, gchar *);
510 gtk_tree_view_column_clear_attributes (tree_column);
512 while (attribute != NULL)
514 column = va_arg (args, gint);
515 gtk_tree_view_column_add_attribute (tree_column,
518 attribute = va_arg (args, gchar *);
523 * gtk_tree_view_column_set_attributes:
524 * @tree_column: A #GtkTreeViewColumn.
525 * @Varargs: A NULL terminated listing of attributes.
527 * Sets the attributes in the list as the attributes of @tree_column.
528 * The attributes should be in attribute/column order, as in
529 * @gtk_tree_view_column_add_attribute. All existing attributes
530 * are removed, and replaced with the new attributes.
533 gtk_tree_view_column_set_attributes (GtkTreeViewColumn *tree_column,
538 g_return_if_fail (tree_column != NULL);
539 g_return_if_fail (GTK_IS_TREE_VIEW_COLUMN (tree_column));
541 va_start (args, tree_column);
543 gtk_tree_view_column_set_attributesv (tree_column, args);
549 * gtk_tree_view_column_clear_attributes:
550 * @tree_column: a #GtkTreeViewColumn
552 * Clears all existing attributes previously set with
553 * gtk_tree_view_column_set_attributes().
556 gtk_tree_view_column_clear_attributes (GtkTreeViewColumn *tree_column)
560 g_return_if_fail (GTK_IS_TREE_VIEW_COLUMN (tree_column));
562 list = tree_column->attributes;
564 while (list && list->next)
567 list = list->next->next;
569 g_slist_free (tree_column->attributes);
570 tree_column->attributes = NULL;
574 * gtk_tree_view_column_set_cell_data:
575 * @tree_column: A #GtkTreeViewColumn.
576 * @tree_model: The #GtkTreeModel to to get the cell renderers attributes from.
577 * @iter: The #GtkTreeIter to to get the cell renderer's attributes from.
579 * Sets the cell renderer based on the @tree_model and @tree_node. That is, for
580 * every attribute mapping in @tree_column, it will get a value from the set
581 * column on the @tree_node, and use that value to set the attribute on the cell
585 gtk_tree_view_column_set_cell_data (GtkTreeViewColumn *tree_column,
586 GtkTreeModel *tree_model,
590 GValue value = { 0, };
593 g_return_if_fail (tree_column != NULL);
594 g_return_if_fail (GTK_IS_TREE_VIEW_COLUMN (tree_column));
595 g_return_if_fail (tree_column->cell != NULL);
597 if (tree_model == NULL)
600 if (tree_column->func && (* tree_column->func) (tree_column,
603 tree_column->func_data))
606 cell = (GObject *) tree_column->cell;
607 list = tree_column->attributes;
609 while (list && list->next)
611 gtk_tree_model_get_value (tree_model, iter,
612 GPOINTER_TO_INT (list->next->data),
614 g_object_set_property (cell, (gchar *) list->data, &value);
615 g_value_unset (&value);
616 list = list->next->next;
620 /* Options for manipulating the columns */
623 * gtk_tree_view_column_set_visible:
624 * @tree_column: A #GtkTreeViewColumn.
625 * @visible: TRUE if the @tree_column is visible.
627 * Sets the visibility of @tree_column.
630 gtk_tree_view_column_set_visible (GtkTreeViewColumn *tree_column,
633 g_return_if_fail (tree_column != NULL);
634 g_return_if_fail (GTK_IS_TREE_VIEW_COLUMN (tree_column));
636 visible = !! visible;
638 if (tree_column->visible == visible)
641 tree_column->visible = visible;
645 gtk_widget_show (tree_column->button);
646 if (GTK_WIDGET_REALIZED (tree_column->tree_view))
647 gdk_window_show (tree_column->window);
651 gtk_widget_hide (tree_column->button);
652 if (GTK_WIDGET_REALIZED (tree_column->tree_view))
653 gdk_window_hide (tree_column->window);
656 if (GTK_WIDGET_REALIZED (tree_column->tree_view))
657 _gtk_tree_view_set_size (GTK_TREE_VIEW (tree_column->tree_view), -1, -1);
659 g_object_notify (G_OBJECT (tree_column), "visible");
663 * gtk_tree_view_column_get_visible:
664 * @tree_column: A #GtkTreeViewColumn.
666 * Returns TRUE if @tree_column is visible.
668 * Return value: whether the column is visible or not. If it is visible, then
669 * the tree will show the column.
672 gtk_tree_view_column_get_visible (GtkTreeViewColumn *tree_column)
674 g_return_val_if_fail (tree_column != NULL, FALSE);
675 g_return_val_if_fail (GTK_IS_TREE_VIEW_COLUMN (tree_column), FALSE);
677 return tree_column->visible;
681 * gtk_tree_view_column_set_sizing:
682 * @tree_column: A #GtkTreeViewColumn.
683 * @type: The #GtkTreeViewColumnSizing.
685 * Sets the growth behavior of @tree_column to @type.
688 gtk_tree_view_column_set_sizing (GtkTreeViewColumn *tree_column,
689 GtkTreeViewColumnSizing type)
691 g_return_if_fail (tree_column != NULL);
692 g_return_if_fail (GTK_IS_TREE_VIEW_COLUMN (tree_column));
694 if (type == tree_column->column_type)
697 tree_column->column_type = type;
700 case GTK_TREE_VIEW_COLUMN_AUTOSIZE:
701 tree_column->dirty = TRUE;
702 case GTK_TREE_VIEW_COLUMN_FIXED:
703 if (GTK_WIDGET_REALIZED (tree_column->tree_view))
704 gdk_window_hide (tree_column->window);
707 if (GTK_WIDGET_REALIZED (tree_column->tree_view))
709 gdk_window_show (tree_column->window);
710 gdk_window_raise (tree_column->window);
715 gtk_widget_queue_resize (tree_column->tree_view);
717 g_object_notify (G_OBJECT (tree_column), "sizing");
721 * gtk_tree_view_column_get_sizing:
722 * @tree_column: A #GtkTreeViewColumn.
724 * Returns the current type of @tree_column.
726 * Return value: The type of @tree_column.
729 gtk_tree_view_column_get_sizing (GtkTreeViewColumn *tree_column)
731 g_return_val_if_fail (tree_column != NULL, 0);
732 g_return_val_if_fail (GTK_IS_TREE_VIEW_COLUMN (tree_column), 0);
734 return tree_column->column_type;
738 * gtk_tree_view_column_get_size:
739 * @tree_column: A #GtkTreeViewColumn.
741 * Returns the current size of the @tree_column in pixels.
743 * Return value: The current size of the @tree_column.
746 gtk_tree_view_column_get_size (GtkTreeViewColumn *tree_column)
748 g_return_val_if_fail (tree_column != NULL, 0);
749 g_return_val_if_fail (GTK_IS_TREE_VIEW_COLUMN (tree_column), 0);
751 return tree_column->width;
755 * gtk_tree_view_column_set_width:
756 * @tree_column: A #GtkTreeViewColumn.
757 * @size: The size to set the @tree_column to.
759 * Sets the size of the column in pixels, unless the the column type is
760 * #GTK_TREE_VIEW_COLUMN_AUTOSIZE. In this case, the value is discarded as the
761 * size of the column is based on the calculated width of the column. The
762 * width is clamped to the min/max width for the column.
765 gtk_tree_view_column_set_width (GtkTreeViewColumn *tree_column,
768 g_return_if_fail (tree_column != NULL);
769 g_return_if_fail (GTK_IS_TREE_VIEW_COLUMN (tree_column));
770 g_return_if_fail (size > 0);
772 if (tree_column->min_width != -1 &&
773 size < tree_column->min_width)
774 size = tree_column->min_width;
775 else if (tree_column->max_width != -1 &&
776 size > tree_column->max_width)
777 size = tree_column->max_width;
779 if (tree_column->width == size)
782 tree_column->width = size;
784 if (GTK_WIDGET_REALIZED (tree_column->tree_view))
785 gtk_widget_queue_resize (tree_column->tree_view);
787 g_object_notify (G_OBJECT (tree_column), "width");
791 * gtk_tree_view_column_set_min_width:
792 * @tree_column: A #GtkTreeViewColumn.
793 * @min_width: The minimum width of the column in pixels, or -1.
795 * Sets the minimum width of the @tree_column. If @min_width is -1, then the
796 * minimum width is unset.
799 gtk_tree_view_column_set_min_width (GtkTreeViewColumn *tree_column,
804 g_return_if_fail (tree_column != NULL);
805 g_return_if_fail (GTK_IS_TREE_VIEW_COLUMN (tree_column));
806 g_return_if_fail (min_width >= -1);
808 if (min_width == tree_column->min_width)
811 real_min_width = (tree_column->min_width == -1) ?
812 tree_column->button->requisition.width : tree_column->min_width;
814 /* We want to queue a resize if the either the old min_size or the
815 * new min_size determined the size of the column */
816 if (GTK_WIDGET_REALIZED (tree_column->tree_view) &&
817 ((tree_column->min_width > tree_column->width) ||
818 (tree_column->min_width == -1 &&
819 tree_column->button->requisition.width > tree_column->width) ||
820 (min_width > tree_column->width) ||
822 tree_column->button->requisition.width > tree_column->width)))
823 gtk_widget_queue_resize (tree_column->tree_view);
825 if (tree_column->max_width != -1 &&
826 tree_column->max_width < real_min_width)
827 tree_column->max_width = real_min_width;
829 tree_column->min_width = min_width;
831 g_object_notify (G_OBJECT (tree_column), "min_width");
835 * gtk_tree_view_column_get_min_width:
836 * @tree_column: A #GtkTreeViewColumn.
838 * Returns the minimum width in pixels of the @tree_column, or -1 if no minimum
841 * Return value: The minimum width of the @tree_column.
844 gtk_tree_view_column_get_min_width (GtkTreeViewColumn *tree_column)
846 g_return_val_if_fail (tree_column != NULL, -1);
847 g_return_val_if_fail (GTK_IS_TREE_VIEW_COLUMN (tree_column), -1);
849 return tree_column->min_width;
853 * gtk_tree_view_column_set_max_width:
854 * @tree_column: A #GtkTreeViewColumn.
855 * @max_width: The maximum width of the column in pixels, or -1.
857 * Sets the maximum width of the @tree_column. If @max_width is -1, then the
858 * maximum width is unset.
861 gtk_tree_view_column_set_max_width (GtkTreeViewColumn *tree_column,
866 g_return_if_fail (tree_column != NULL);
867 g_return_if_fail (GTK_IS_TREE_VIEW_COLUMN (tree_column));
868 g_return_if_fail (max_width >= -1);
870 if (max_width == tree_column->max_width)
873 real_min_width = tree_column->min_width == -1 ?
874 tree_column->button->requisition.width : tree_column->min_width;
876 if (GTK_WIDGET_REALIZED (tree_column->tree_view) &&
877 ((tree_column->max_width < tree_column->width) ||
878 (max_width != -1 && max_width < tree_column->width)))
879 gtk_widget_queue_resize (tree_column->tree_view);
881 tree_column->max_width = max_width;
883 if (real_min_width > max_width)
884 tree_column->min_width = max_width;
886 g_object_notify (G_OBJECT (tree_column), "max_width");
890 * gtk_tree_view_column_get_max_width:
891 * @tree_column: A #GtkTreeViewColumn.
893 * Returns the maximum width in pixels of the @tree_column, or -1 if no maximum
896 * Return value: The maximum width of the @tree_column.
899 gtk_tree_view_column_get_max_width (GtkTreeViewColumn *tree_column)
901 g_return_val_if_fail (tree_column != NULL, -1);
902 g_return_val_if_fail (GTK_IS_TREE_VIEW_COLUMN (tree_column), -1);
904 return tree_column->max_width;
908 * gtk_tree_view_column_clicked:
909 * @tree_column: a #GtkTreeViewColumn
911 * Emits the "clicked" signal on the column.
914 gtk_tree_view_column_clicked (GtkTreeViewColumn *tree_column)
916 g_return_if_fail (GTK_IS_TREE_VIEW_COLUMN (tree_column));
918 gtk_signal_emit (GTK_OBJECT (tree_column), tree_column_signals[CLICKED]);
922 update_button_contents (GtkTreeViewColumn *tree_column)
924 if (tree_column->button)
926 GtkWidget *alignment = GTK_BIN (tree_column->button)->child;
927 GtkWidget *current_child = GTK_BIN (alignment)->child;
929 if (tree_column->child)
931 if (current_child != tree_column->child)
933 gtk_container_remove (GTK_CONTAINER (alignment),
936 gtk_container_add (GTK_CONTAINER (alignment),
942 if (current_child == NULL)
944 current_child = gtk_label_new (NULL);
946 gtk_widget_show (current_child);
948 gtk_container_add (GTK_CONTAINER (alignment),
952 g_return_if_fail (GTK_IS_LABEL (current_child));
954 if (tree_column->title)
955 gtk_label_set_text (GTK_LABEL (current_child),
958 gtk_label_set_text (GTK_LABEL (current_child),
965 * gtk_tree_view_column_set_title:
966 * @tree_column: A #GtkTreeViewColumn.
967 * @title: The title of the @tree_column.
969 * Sets the title of the @tree_column. If a custom widget has been set, then
970 * this value is ignored.
973 gtk_tree_view_column_set_title (GtkTreeViewColumn *tree_column,
976 g_return_if_fail (tree_column != NULL);
977 g_return_if_fail (GTK_IS_TREE_VIEW_COLUMN (tree_column));
979 g_free (tree_column->title);
981 tree_column->title = g_strdup (title);
983 tree_column->title = NULL;
985 update_button_contents (tree_column);
987 g_object_notify (G_OBJECT (tree_column), "title");
991 * gtk_tree_view_column_get_title:
992 * @tree_column: A #GtkTreeViewColumn.
994 * Returns the title of the widget. This value should not be modified.
996 * Return value: the title of the column.
999 gtk_tree_view_column_get_title (GtkTreeViewColumn *tree_column)
1001 g_return_val_if_fail (tree_column != NULL, NULL);
1002 g_return_val_if_fail (GTK_IS_TREE_VIEW_COLUMN (tree_column), NULL);
1004 return tree_column->title;
1008 * gtk_tree_view_column_set_clickable:
1009 * @tree_column: A #GtkTreeViewColumn.
1010 * @active: TRUE if the header is active.
1012 * Sets the header to be active if @active is TRUE. When the header is active,
1013 * then it can take keyboard focus, and can be clicked.
1016 gtk_tree_view_column_set_clickable (GtkTreeViewColumn *tree_column,
1019 g_return_if_fail (tree_column != NULL);
1020 g_return_if_fail (GTK_IS_TREE_VIEW_COLUMN (tree_column));
1022 if (!tree_column->button)
1025 if (tree_column->button_active == active)
1028 tree_column->button_active = active;
1031 gtk_signal_disconnect_by_func (GTK_OBJECT (tree_column->button),
1032 (GtkSignalFunc) gtk_tree_view_passive_func,
1035 GTK_WIDGET_SET_FLAGS (tree_column->button, GTK_CAN_FOCUS);
1037 if (GTK_WIDGET_VISIBLE (tree_column->tree_view))
1038 gtk_widget_queue_draw (tree_column->button);
1042 gtk_signal_connect (GTK_OBJECT (tree_column->button),
1044 (GtkSignalFunc) gtk_tree_view_passive_func,
1047 GTK_WIDGET_UNSET_FLAGS (tree_column->button, GTK_CAN_FOCUS);
1049 if (GTK_WIDGET_VISIBLE (tree_column->tree_view))
1050 gtk_widget_queue_draw (tree_column->button);
1053 g_object_notify (G_OBJECT (tree_column), "clickable");
1057 * gtk_tree_view_column_get_clickable:
1058 * @tree_column: a #GtkTreeViewColumn
1060 * Returns %TRUE if the user can click on the header for the column.
1062 * Return value: whether the user can click the column header
1065 gtk_tree_view_column_get_clickable (GtkTreeViewColumn *tree_column)
1067 g_return_val_if_fail (GTK_IS_TREE_VIEW_COLUMN (tree_column), FALSE);
1069 return tree_column->button_active;
1073 * gtk_tree_view_column_set_widget:
1074 * @tree_column: A #GtkTreeViewColumn.
1075 * @widget: A child #GtkWidget, or NULL.
1077 * Sets the widget in the header to be @widget. If widget is NULL, then the
1078 * header button is set with a #GtkLabel set to the title of @tree_column.
1081 gtk_tree_view_column_set_widget (GtkTreeViewColumn *tree_column,
1084 g_return_if_fail (GTK_IS_TREE_VIEW_COLUMN (tree_column));
1085 g_return_if_fail (widget == NULL || GTK_IS_WIDGET (widget));
1089 gtk_object_ref (GTK_OBJECT (widget));
1090 gtk_object_sink (GTK_OBJECT (widget));
1093 if (tree_column->child)
1094 gtk_object_unref (GTK_OBJECT (tree_column->child));
1096 tree_column->child = widget;
1098 update_button_contents (tree_column);
1100 g_object_notify (G_OBJECT (tree_column), "widget");
1104 * gtk_tree_view_column_get_widget:
1105 * @tree_column: A #GtkTreeViewColumn.
1107 * Returns the #GtkWidget in the button in the column header. If a custom
1108 * widget has not been set, then this will be a #GtkAlignment with a #GtkLabel
1111 * Return value: The #GtkWidget in the column header.
1114 gtk_tree_view_column_get_widget (GtkTreeViewColumn *tree_column)
1116 g_return_val_if_fail (tree_column != NULL, NULL);
1117 g_return_val_if_fail (GTK_IS_TREE_VIEW_COLUMN (tree_column), NULL);
1119 return tree_column->child;
1123 * gtk_tree_view_column_set_justification:
1124 * @tree_column: A #GtkTreeViewColumn.
1125 * @justification: The justification of the title.
1127 * Sets the justification of the title inside the column header. If a custom
1128 * widget has been set, then this value is discarded.
1131 gtk_tree_view_column_set_justification (GtkTreeViewColumn *tree_column,
1132 GtkJustification justification)
1134 GtkWidget *alignment;
1136 g_return_if_fail (tree_column != NULL);
1137 g_return_if_fail (GTK_IS_TREE_VIEW_COLUMN (tree_column));
1139 if (tree_column->justification == justification)
1142 tree_column->justification = justification;
1144 alignment = GTK_BIN (tree_column->button)->child;
1146 if (GTK_IS_ALIGNMENT (alignment))
1148 switch (tree_column->justification)
1150 case GTK_JUSTIFY_LEFT:
1151 gtk_alignment_set (GTK_ALIGNMENT (alignment), 0.0, 0.5, 0.0, 0.0);
1154 case GTK_JUSTIFY_RIGHT:
1155 gtk_alignment_set (GTK_ALIGNMENT (alignment), 1.0, 0.5, 0.0, 0.0);
1158 case GTK_JUSTIFY_CENTER:
1159 gtk_alignment_set (GTK_ALIGNMENT (alignment), 0.5, 0.5, 0.0, 0.0);
1162 case GTK_JUSTIFY_FILL:
1163 gtk_alignment_set (GTK_ALIGNMENT (alignment), 0.5, 0.5, 0.0, 0.0);
1171 g_object_notify (G_OBJECT (tree_column), "justification");