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 tree_column->button = NULL;
216 tree_column->justification = GTK_JUSTIFY_LEFT;
217 tree_column->width = 1;
218 tree_column->min_width = -1;
219 tree_column->max_width = -1;
220 tree_column->cell = NULL;
221 tree_column->attributes = NULL;
222 tree_column->column_type = GTK_TREE_VIEW_COLUMN_AUTOSIZE;
223 tree_column->visible = TRUE;
224 tree_column->button_active = FALSE;
225 tree_column->dirty = TRUE;
229 gtk_tree_view_column_set_property (GObject *object,
233 const gchar *trailer)
235 GtkTreeViewColumn *tree_column;
237 tree_column = GTK_TREE_VIEW_COLUMN (object);
241 case PROP_CELL_RENDERER:
242 gtk_tree_view_column_set_cell_renderer (tree_column,
244 g_value_get_object (value));
248 gtk_tree_view_column_set_visible (tree_column,
249 g_value_get_boolean (value));
253 gtk_tree_view_column_set_sizing (tree_column,
254 g_value_get_enum (value));
258 gtk_tree_view_column_set_width (tree_column,
259 g_value_get_int (value));
263 gtk_tree_view_column_set_min_width (tree_column,
264 g_value_get_int (value));
268 gtk_tree_view_column_set_max_width (tree_column,
269 g_value_get_int (value));
273 gtk_tree_view_column_set_title (tree_column,
274 g_value_get_string (value));
278 gtk_tree_view_column_set_clickable (tree_column,
279 g_value_get_boolean (value));
283 gtk_tree_view_column_set_widget (tree_column,
284 (GtkWidget*) g_value_get_object (value));
287 case PROP_JUSTIFICATION:
288 gtk_tree_view_column_set_justification (tree_column,
289 g_value_get_enum (value));
293 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
299 gtk_tree_view_column_get_property (GObject *object,
303 const gchar *trailer)
305 GtkTreeViewColumn *tree_column;
307 tree_column = GTK_TREE_VIEW_COLUMN (object);
311 case PROP_CELL_RENDERER:
312 g_value_set_object (value, (GObject*) tree_column->cell);
316 g_value_set_boolean (value, tree_column->visible);
320 g_value_set_enum (value, tree_column->column_type);
324 g_value_set_int (value, tree_column->width);
328 g_value_set_int (value, tree_column->min_width);
332 g_value_set_int (value, tree_column->max_width);
336 g_value_set_string (value, tree_column->title);
340 g_value_set_boolean (value, tree_column->button_active);
347 case PROP_JUSTIFICATION:
348 g_value_set_enum (value, tree_column->justification);
352 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
358 /* used to make the buttons 'unclickable' */
361 gtk_tree_view_passive_func (GtkWidget *widget,
365 g_return_val_if_fail (event != NULL, FALSE);
369 case GDK_MOTION_NOTIFY:
370 case GDK_BUTTON_PRESS:
371 case GDK_2BUTTON_PRESS:
372 case GDK_3BUTTON_PRESS:
373 case GDK_BUTTON_RELEASE:
374 case GDK_ENTER_NOTIFY:
375 case GDK_LEAVE_NOTIFY:
384 gtk_real_tree_column_clicked (GtkTreeViewColumn *tree_column)
386 g_return_if_fail (tree_column != NULL);
387 g_return_if_fail (GTK_IS_TREE_VIEW_COLUMN (tree_column));
392 * gtk_tree_view_column_new:
394 * Creates a new #GtkTreeViewColumn.
396 * Return value: A newly created #GtkTreeViewColumn.
399 gtk_tree_view_column_new (void)
401 GtkTreeViewColumn *retval;
403 retval = GTK_TREE_VIEW_COLUMN (gtk_type_new (GTK_TYPE_TREE_COLUMN));
409 * gtk_tree_view_column_new_with_attributes:
410 * @title: The title to set the header to.
411 * @cell: The #GtkCellRenderer.
412 * @Varargs: A NULL terminated list of attributes.
414 * Creates a new #GtkTreeViewColumn with a number of default values. This is
415 * equivalent to calling @gtk_tree_view_column_set_title,
416 * @gtk_tree_view_column_set_cell_renderer, and
417 * @gtk_tree_view_column_set_attributes on the newly created #GtkTreeViewColumn.
419 * Return value: A newly created #GtkTreeViewColumn.
422 gtk_tree_view_column_new_with_attributes (gchar *title,
423 GtkCellRenderer *cell,
426 GtkTreeViewColumn *retval;
429 retval = gtk_tree_view_column_new ();
431 gtk_tree_view_column_set_title (retval, title);
432 gtk_tree_view_column_set_cell_renderer (retval, cell);
434 va_start (args, cell);
435 gtk_tree_view_column_set_attributesv (retval, args);
442 * gtk_tree_view_column_set_cell_renderer:
443 * @tree_column: A #GtkTreeViewColumn.
444 * @cell: The #GtkCellRenderer, or NULL.
446 * Sets the cell renderer of the @tree_column. If there is a cell
447 * renderer already set, then it is removed. If @cell is NULL, then
448 * the cell renderer is unset.
451 gtk_tree_view_column_set_cell_renderer (GtkTreeViewColumn *tree_column,
452 GtkCellRenderer *cell)
454 g_return_if_fail (tree_column != NULL);
455 g_return_if_fail (GTK_IS_TREE_VIEW_COLUMN (tree_column));
457 g_return_if_fail (GTK_IS_CELL_RENDERER (cell));
460 g_object_ref (G_OBJECT (cell));
462 if (tree_column->cell)
463 g_object_unref (G_OBJECT (tree_column->cell));
465 tree_column->cell = cell;
467 g_object_notify (G_OBJECT (tree_column), "cell_renderer");
471 * gtk_tree_view_column_add_attribute:
472 * @tree_column: A #GtkTreeViewColumn.
473 * @attribute: An attribute on the columns cell
474 * @column: The column position on the model to get the attribute from.
476 * Adds an attribute mapping to the list in @tree_column. The @column is the
477 * column position on the model to get a value from, and the @attribute is the
478 * parameter on the @tree_column's cell renderer to set that value to.
481 gtk_tree_view_column_add_attribute (GtkTreeViewColumn *tree_column,
485 g_return_if_fail (tree_column != NULL);
486 g_return_if_fail (GTK_IS_TREE_VIEW_COLUMN (tree_column));
488 tree_column->attributes = g_slist_prepend (tree_column->attributes,
489 GINT_TO_POINTER (column));
490 tree_column->attributes = g_slist_prepend (tree_column->attributes,
491 g_strdup (attribute));
495 gtk_tree_view_column_set_attributesv (GtkTreeViewColumn *tree_column,
502 g_return_if_fail (tree_column != NULL);
503 g_return_if_fail (GTK_IS_TREE_VIEW_COLUMN (tree_column));
505 attribute = va_arg (args, gchar *);
507 list = tree_column->attributes;
509 while (list && list->next)
512 list = list->next->next;
514 g_slist_free (tree_column->attributes);
515 tree_column->attributes = NULL;
517 while (attribute != NULL)
519 column = va_arg (args, gint);
520 gtk_tree_view_column_add_attribute (tree_column,
523 attribute = va_arg (args, gchar *);
528 * gtk_tree_view_column_set_attributes:
529 * @tree_column: A #GtkTreeViewColumn.
530 * @Varargs: A NULL terminated listing of attributes.
532 * Sets the attributes in the list as the attributes of @tree_column.
533 * The attributes should be in attribute/column order, as in
534 * @gtk_tree_view_column_add_attribute. All existing attributes
535 * are removed, and replaced with the new attributes.
538 gtk_tree_view_column_set_attributes (GtkTreeViewColumn *tree_column,
543 g_return_if_fail (tree_column != NULL);
544 g_return_if_fail (GTK_IS_TREE_VIEW_COLUMN (tree_column));
546 va_start (args, tree_column);
548 gtk_tree_view_column_set_attributesv (tree_column, args);
554 * gtk_tree_view_column_set_cell_data:
555 * @tree_column: A #GtkTreeViewColumn.
556 * @tree_model: The #GtkTreeModel to to get the cell renderers attributes from.
557 * @iter: The #GtkTreeIter to to get the cell renderer's attributes from.
559 * Sets the cell renderer based on the @tree_model and @tree_node. That is, for
560 * every attribute mapping in @tree_column, it will get a value from the set
561 * column on the @tree_node, and use that value to set the attribute on the cell
565 gtk_tree_view_column_set_cell_data (GtkTreeViewColumn *tree_column,
566 GtkTreeModel *tree_model,
570 GValue value = { 0, };
573 g_return_if_fail (tree_column != NULL);
574 g_return_if_fail (GTK_IS_TREE_VIEW_COLUMN (tree_column));
575 g_return_if_fail (tree_column->cell != NULL);
577 if (tree_model == NULL)
580 if (tree_column->func && (* tree_column->func) (tree_column,
583 tree_column->func_data))
586 cell = (GObject *) tree_column->cell;
587 list = tree_column->attributes;
589 while (list && list->next)
591 gtk_tree_model_get_value (tree_model, iter,
592 GPOINTER_TO_INT (list->next->data),
594 g_object_set_property (cell, (gchar *) list->data, &value);
595 g_value_unset (&value);
596 list = list->next->next;
600 /* Options for manipulating the columns */
603 * gtk_tree_view_column_set_visible:
604 * @tree_column: A #GtkTreeViewColumn.
605 * @visible: TRUE if the @tree_column is visible.
607 * Sets the visibility of @tree_column.
610 gtk_tree_view_column_set_visible (GtkTreeViewColumn *tree_column,
613 g_return_if_fail (tree_column != NULL);
614 g_return_if_fail (GTK_IS_TREE_VIEW_COLUMN (tree_column));
616 visible = !! visible;
618 if (tree_column->visible == visible)
621 tree_column->visible = visible;
625 gtk_widget_show (tree_column->button);
626 if (GTK_WIDGET_REALIZED (tree_column->tree_view))
627 gdk_window_show (tree_column->window);
631 gtk_widget_hide (tree_column->button);
632 if (GTK_WIDGET_REALIZED (tree_column->tree_view))
633 gdk_window_hide (tree_column->window);
636 if (GTK_WIDGET_REALIZED (tree_column->tree_view))
637 _gtk_tree_view_set_size (GTK_TREE_VIEW (tree_column->tree_view), -1, -1);
639 g_object_notify (G_OBJECT (tree_column), "visible");
643 * gtk_tree_view_column_get_visible:
644 * @tree_column: A #GtkTreeViewColumn.
646 * Returns TRUE if @tree_column is visible.
648 * Return value: whether the column is visible or not. If it is visible, then
649 * the tree will show the column.
652 gtk_tree_view_column_get_visible (GtkTreeViewColumn *tree_column)
654 g_return_val_if_fail (tree_column != NULL, FALSE);
655 g_return_val_if_fail (GTK_IS_TREE_VIEW_COLUMN (tree_column), FALSE);
657 return tree_column->visible;
661 * gtk_tree_view_column_set_sizing:
662 * @tree_column: A #GtkTreeViewColumn.
663 * @type: The #GtkTreeViewColumnSizing.
665 * Sets the growth behavior of @tree_column to @type.
668 gtk_tree_view_column_set_sizing (GtkTreeViewColumn *tree_column,
669 GtkTreeViewColumnSizing type)
671 g_return_if_fail (tree_column != NULL);
672 g_return_if_fail (GTK_IS_TREE_VIEW_COLUMN (tree_column));
674 if (type == tree_column->column_type)
677 tree_column->column_type = type;
680 case GTK_TREE_VIEW_COLUMN_AUTOSIZE:
681 tree_column->dirty = TRUE;
682 case GTK_TREE_VIEW_COLUMN_FIXED:
683 if (GTK_WIDGET_REALIZED (tree_column->tree_view))
684 gdk_window_hide (tree_column->window);
687 if (GTK_WIDGET_REALIZED (tree_column->tree_view))
689 gdk_window_show (tree_column->window);
690 gdk_window_raise (tree_column->window);
695 gtk_widget_queue_resize (tree_column->tree_view);
697 g_object_notify (G_OBJECT (tree_column), "sizing");
701 * gtk_tree_view_column_get_sizing:
702 * @tree_column: A #GtkTreeViewColumn.
704 * Returns the current type of @tree_column.
706 * Return value: The type of @tree_column.
709 gtk_tree_view_column_get_sizing (GtkTreeViewColumn *tree_column)
711 g_return_val_if_fail (tree_column != NULL, 0);
712 g_return_val_if_fail (GTK_IS_TREE_VIEW_COLUMN (tree_column), 0);
714 return tree_column->column_type;
718 * gtk_tree_view_column_get_size:
719 * @tree_column: A #GtkTreeViewColumn.
721 * Returns the current size of the @tree_column in pixels.
723 * Return value: The current size of the @tree_column.
726 gtk_tree_view_column_get_size (GtkTreeViewColumn *tree_column)
728 g_return_val_if_fail (tree_column != NULL, 0);
729 g_return_val_if_fail (GTK_IS_TREE_VIEW_COLUMN (tree_column), 0);
731 return tree_column->width;
735 * gtk_tree_view_column_set_width:
736 * @tree_column: A #GtkTreeViewColumn.
737 * @size: The size to set the @tree_column to.
739 * Sets the size of the column in pixels, unless the the column type is
740 * #GTK_TREE_VIEW_COLUMN_AUTOSIZE. In this case, the value is discarded as the
741 * size of the column is based on the calculated width of the column. The
742 * width is clamped to the min/max width for the column.
745 gtk_tree_view_column_set_width (GtkTreeViewColumn *tree_column,
748 g_return_if_fail (tree_column != NULL);
749 g_return_if_fail (GTK_IS_TREE_VIEW_COLUMN (tree_column));
750 g_return_if_fail (size > 0);
752 if (tree_column->min_width != -1 &&
753 size < tree_column->min_width)
754 size = tree_column->min_width;
755 else if (tree_column->max_width != -1 &&
756 size > tree_column->max_width)
757 size = tree_column->max_width;
759 if (tree_column->width == size)
762 tree_column->width = size;
764 if (GTK_WIDGET_REALIZED (tree_column->tree_view))
765 gtk_widget_queue_resize (tree_column->tree_view);
767 g_object_notify (G_OBJECT (tree_column), "width");
771 * gtk_tree_view_column_set_min_width:
772 * @tree_column: A #GtkTreeViewColumn.
773 * @min_width: The minimum width of the column in pixels, or -1.
775 * Sets the minimum width of the @tree_column. If @min_width is -1, then the
776 * minimum width is unset.
779 gtk_tree_view_column_set_min_width (GtkTreeViewColumn *tree_column,
784 g_return_if_fail (tree_column != NULL);
785 g_return_if_fail (GTK_IS_TREE_VIEW_COLUMN (tree_column));
786 g_return_if_fail (min_width >= -1);
788 if (min_width == tree_column->min_width)
791 real_min_width = (tree_column->min_width == -1) ?
792 tree_column->button->requisition.width : tree_column->min_width;
794 /* We want to queue a resize if the either the old min_size or the
795 * new min_size determined the size of the column */
796 if (GTK_WIDGET_REALIZED (tree_column->tree_view) &&
797 ((tree_column->min_width > tree_column->width) ||
798 (tree_column->min_width == -1 &&
799 tree_column->button->requisition.width > tree_column->width) ||
800 (min_width > tree_column->width) ||
802 tree_column->button->requisition.width > tree_column->width)))
803 gtk_widget_queue_resize (tree_column->tree_view);
805 if (tree_column->max_width != -1 &&
806 tree_column->max_width < real_min_width)
807 tree_column->max_width = real_min_width;
809 tree_column->min_width = min_width;
811 g_object_notify (G_OBJECT (tree_column), "min_width");
815 * gtk_tree_view_column_get_min_width:
816 * @tree_column: A #GtkTreeViewColumn.
818 * Returns the minimum width in pixels of the @tree_column, or -1 if no minimum
821 * Return value: The minimum width of the @tree_column.
824 gtk_tree_view_column_get_min_width (GtkTreeViewColumn *tree_column)
826 g_return_val_if_fail (tree_column != NULL, -1);
827 g_return_val_if_fail (GTK_IS_TREE_VIEW_COLUMN (tree_column), -1);
829 return tree_column->min_width;
833 * gtk_tree_view_column_set_max_width:
834 * @tree_column: A #GtkTreeViewColumn.
835 * @max_width: The maximum width of the column in pixels, or -1.
837 * Sets the maximum width of the @tree_column. If @max_width is -1, then the
838 * maximum width is unset.
841 gtk_tree_view_column_set_max_width (GtkTreeViewColumn *tree_column,
846 g_return_if_fail (tree_column != NULL);
847 g_return_if_fail (GTK_IS_TREE_VIEW_COLUMN (tree_column));
848 g_return_if_fail (max_width >= -1);
850 if (max_width == tree_column->max_width)
853 real_min_width = tree_column->min_width == -1 ?
854 tree_column->button->requisition.width : tree_column->min_width;
856 if (GTK_WIDGET_REALIZED (tree_column->tree_view) &&
857 ((tree_column->max_width < tree_column->width) ||
858 (max_width != -1 && max_width < tree_column->width)))
859 gtk_widget_queue_resize (tree_column->tree_view);
861 tree_column->max_width = max_width;
863 if (real_min_width > max_width)
864 tree_column->min_width = max_width;
866 g_object_notify (G_OBJECT (tree_column), "max_width");
870 * gtk_tree_view_column_get_max_width:
871 * @tree_column: A #GtkTreeViewColumn.
873 * Returns the maximum width in pixels of the @tree_column, or -1 if no maximum
876 * Return value: The maximum width of the @tree_column.
879 gtk_tree_view_column_get_max_width (GtkTreeViewColumn *tree_column)
881 g_return_val_if_fail (tree_column != NULL, -1);
882 g_return_val_if_fail (GTK_IS_TREE_VIEW_COLUMN (tree_column), -1);
884 return tree_column->max_width;
888 * gtk_tree_view_column_clicked:
889 * @tree_column: a #GtkTreeViewColumn
891 * Emits the "clicked" signal on the column.
894 gtk_tree_view_column_clicked (GtkTreeViewColumn *tree_column)
896 g_return_if_fail (GTK_IS_TREE_VIEW_COLUMN (tree_column));
898 gtk_signal_emit (GTK_OBJECT (tree_column), tree_column_signals[CLICKED]);
902 * gtk_tree_view_column_set_title:
903 * @tree_column: A #GtkTreeViewColumn.
904 * @title: The title of the @tree_column.
906 * Sets the title of the @tree_column. If a custom widget has been set, then
907 * this value is ignored.
910 gtk_tree_view_column_set_title (GtkTreeViewColumn *tree_column,
913 g_return_if_fail (tree_column != NULL);
914 g_return_if_fail (GTK_IS_TREE_VIEW_COLUMN (tree_column));
916 g_free (tree_column->title);
918 tree_column->title = g_strdup (title);
920 tree_column->title = NULL;
922 /* Hmmm. This is a little ugly... */
923 if (tree_column->button)
925 if (GTK_BIN (tree_column->button)->child &&
926 GTK_IS_ALIGNMENT (GTK_BIN (tree_column->button)->child))
928 if (GTK_BIN (GTK_BIN (tree_column->button)->child)->child &&
929 GTK_IS_LABEL (GTK_BIN (GTK_BIN (tree_column->button)->child)->child))
931 gtk_label_set_text (GTK_LABEL (GTK_BIN (GTK_BIN (tree_column->button)->child)->child),
937 g_object_notify (G_OBJECT (tree_column), "title");
941 * gtk_tree_view_column_get_title:
942 * @tree_column: A #GtkTreeViewColumn.
944 * Returns the title of the widget. This value should not be modified.
946 * Return value: the title of the column.
949 gtk_tree_view_column_get_title (GtkTreeViewColumn *tree_column)
951 g_return_val_if_fail (tree_column != NULL, NULL);
952 g_return_val_if_fail (GTK_IS_TREE_VIEW_COLUMN (tree_column), NULL);
954 return tree_column->title;
958 * gtk_tree_view_column_set_clickable:
959 * @tree_column: A #GtkTreeViewColumn.
960 * @active: TRUE if the header is active.
962 * Sets the header to be active if @active is TRUE. When the header is active,
963 * then it can take keyboard focus, and can be clicked.
966 gtk_tree_view_column_set_clickable (GtkTreeViewColumn *tree_column,
969 g_return_if_fail (tree_column != NULL);
970 g_return_if_fail (GTK_IS_TREE_VIEW_COLUMN (tree_column));
972 if (!tree_column->button)
975 if (tree_column->button_active == active)
978 tree_column->button_active = active;
981 gtk_signal_disconnect_by_func (GTK_OBJECT (tree_column->button),
982 (GtkSignalFunc) gtk_tree_view_passive_func,
985 GTK_WIDGET_SET_FLAGS (tree_column->button, GTK_CAN_FOCUS);
987 if (GTK_WIDGET_VISIBLE (tree_column->tree_view))
988 gtk_widget_queue_draw (tree_column->button);
992 gtk_signal_connect (GTK_OBJECT (tree_column->button),
994 (GtkSignalFunc) gtk_tree_view_passive_func,
997 GTK_WIDGET_UNSET_FLAGS (tree_column->button, GTK_CAN_FOCUS);
999 if (GTK_WIDGET_VISIBLE (tree_column->tree_view))
1000 gtk_widget_queue_draw (tree_column->button);
1003 g_object_notify (G_OBJECT (tree_column), "clickable");
1007 * gtk_tree_view_column_get_clickable:
1008 * @tree_column: a #GtkTreeViewColumn
1010 * Returns %TRUE if the user can click on the header for the column.
1012 * Return value: whether the user can click the column header
1015 gtk_tree_view_column_get_clickable (GtkTreeViewColumn *tree_column)
1017 g_return_val_if_fail (GTK_IS_TREE_VIEW_COLUMN (tree_column), FALSE);
1019 return tree_column->button_active;
1023 * gtk_tree_view_column_set_widget:
1024 * @tree_column: A #GtkTreeViewColumn.
1025 * @widget: A child #GtkWidget, or NULL.
1027 * Sets the widget in the header to be @widget. If widget is NULL, then the
1028 * header button is set with a #GtkLabel set to the title of @tree_column.
1031 gtk_tree_view_column_set_widget (GtkTreeViewColumn *tree_column,
1034 /* FIXME: Implement this function. */
1036 gint new_button = 0;
1037 GtkWidget *old_widget;
1039 g_return_if_fail (tree_view != NULL);
1040 g_return_if_fail (GTK_IS_TREE_VIEW (tree_view));
1042 if (column < 0 || column >= tree_view->priv->columns)
1045 /* if the column button doesn't currently exist,
1046 * it has to be created first */
1047 if (!column->button)
1049 column_button_create (tree_view, column);
1053 column_title_new (clist, column, NULL);
1055 /* remove and destroy the old widget */
1056 old_widget = GTK_BIN (clist->column[column].button)->child;
1058 gtk_container_remove (GTK_CONTAINER (clist->column[column].button),
1061 /* add and show the widget */
1064 gtk_container_add (GTK_CONTAINER (clist->column[column].button), widget);
1065 gtk_widget_show (widget);
1068 /* if this button didn't previously exist, then the
1069 * column button positions have to be re-computed */
1070 if (GTK_WIDGET_VISIBLE (clist) && new_button)
1071 size_allocate_title_buttons (clist);
1074 g_object_notify (G_OBJECT (tree_column), "widget");
1078 * gtk_tree_view_column_get_widget:
1079 * @tree_column: A #GtkTreeViewColumn.
1081 * Returns the #GtkWidget in the button in the column header. If a custom
1082 * widget has not been set, then this will be a #GtkAlignment with a #GtkLabel
1085 * Return value: The #GtkWidget in the column header.
1088 gtk_tree_view_column_get_widget (GtkTreeViewColumn *tree_column)
1090 g_return_val_if_fail (tree_column != NULL, NULL);
1091 g_return_val_if_fail (GTK_IS_TREE_VIEW_COLUMN (tree_column), NULL);
1093 if (tree_column->button)
1094 return GTK_BUTTON (tree_column->button)->child;
1100 * gtk_tree_view_column_set_justification:
1101 * @tree_column: A #GtkTreeViewColumn.
1102 * @justification: The justification of the title.
1104 * Sets the justification of the title inside the column header. If a custom
1105 * widget has been set, then this value is discarded.
1108 gtk_tree_view_column_set_justification (GtkTreeViewColumn *tree_column,
1109 GtkJustification justification)
1111 GtkWidget *alignment;
1113 g_return_if_fail (tree_column != NULL);
1114 g_return_if_fail (GTK_IS_TREE_VIEW_COLUMN (tree_column));
1116 if (tree_column->justification == justification)
1119 tree_column->justification = justification;
1121 /* change the alignment of the button title if it's not a
1123 alignment = GTK_BIN (tree_column->button)->child;
1125 if (GTK_IS_ALIGNMENT (alignment))
1127 switch (tree_column->justification)
1129 case GTK_JUSTIFY_LEFT:
1130 gtk_alignment_set (GTK_ALIGNMENT (alignment), 0.0, 0.5, 0.0, 0.0);
1133 case GTK_JUSTIFY_RIGHT:
1134 gtk_alignment_set (GTK_ALIGNMENT (alignment), 1.0, 0.5, 0.0, 0.0);
1137 case GTK_JUSTIFY_CENTER:
1138 gtk_alignment_set (GTK_ALIGNMENT (alignment), 0.5, 0.5, 0.0, 0.0);
1141 case GTK_JUSTIFY_FILL:
1142 gtk_alignment_set (GTK_ALIGNMENT (alignment), 0.5, 0.5, 0.0, 0.0);
1150 g_object_notify (G_OBJECT (tree_column), "justification");