1/* gtktreesortable.h
2 * Copyright (C) 2001 Red Hat, Inc.
3 *
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.
8 *
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.
13 *
14 * You should have received a copy of the GNU Library General Public
15 * License along with this library. If not, see <http://www.gnu.org/licenses/>.
16 */
17
18#ifndef __GTK_TREE_SORTABLE_H__
19#define __GTK_TREE_SORTABLE_H__
20
21
22#if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION)
23#error "Only <gtk/gtk.h> can be included directly."
24#endif
25
26#include <gtk/gtkenums.h>
27#include <gtk/gtktreemodel.h>
28
29
30G_BEGIN_DECLS
31
32#define GTK_TYPE_TREE_SORTABLE (gtk_tree_sortable_get_type ())
33#define GTK_TREE_SORTABLE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GTK_TYPE_TREE_SORTABLE, GtkTreeSortable))
34#define GTK_TREE_SORTABLE_CLASS(obj) (G_TYPE_CHECK_CLASS_CAST ((obj), GTK_TYPE_TREE_SORTABLE, GtkTreeSortableIface))
35#define GTK_IS_TREE_SORTABLE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GTK_TYPE_TREE_SORTABLE))
36#define GTK_TREE_SORTABLE_GET_IFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE ((obj), GTK_TYPE_TREE_SORTABLE, GtkTreeSortableIface))
37
38/**
39 * GTK_TREE_SORTABLE_DEFAULT_SORT_COLUMN_ID:
40 *
41 * The GTK_TREE_SORTABLE_DEFAULT_SORT_COLUMN_ID can be used to make a
42 * #GtkTreeSortable use the default sort function.
43 *
44 * See also gtk_tree_sortable_set_sort_column_id()
45 */
46#define GTK_TREE_SORTABLE_DEFAULT_SORT_COLUMN_ID (-1)
47
48/**
49 * GTK_TREE_SORTABLE_UNSORTED_SORT_COLUMN_ID:
50 *
51 * The GTK_TREE_SORTABLE_DEFAULT_SORT_COLUMN_ID can be used to make a
52 * #GtkTreeSortable use no sorting.
53 *
54 * See also gtk_tree_sortable_set_sort_column_id()
55 */
56#define GTK_TREE_SORTABLE_UNSORTED_SORT_COLUMN_ID (-2)
57
58typedef struct _GtkTreeSortable GtkTreeSortable; /* Dummy typedef */
59typedef struct _GtkTreeSortableIface GtkTreeSortableIface;
60
61/**
62 * GtkTreeIterCompareFunc:
63 * @model: The #GtkTreeModel the comparison is within
64 * @a: A #GtkTreeIter in @model
65 * @b: Another #GtkTreeIter in @model
66 * @user_data: Data passed when the compare func is assigned e.g. by
67 * gtk_tree_sortable_set_sort_func()
68 *
69 * A GtkTreeIterCompareFunc should return a negative integer, zero, or a positive
70 * integer if @a sorts before @b, @a sorts with @b, or @a sorts after @b
71 * respectively. If two iters compare as equal, their order in the sorted model
72 * is undefined. In order to ensure that the #GtkTreeSortable behaves as
73 * expected, the GtkTreeIterCompareFunc must define a partial order on
74 * the model, i.e. it must be reflexive, antisymmetric and transitive.
75 *
76 * For example, if @model is a product catalogue, then a compare function
77 * for the “price” column could be one which returns
78 * `price_of(@a) - price_of(@b)`.
79 *
80 * Returns: a negative integer, zero or a positive integer depending on whether
81 * @a sorts before, with or after @b
82 */
83typedef gint (* GtkTreeIterCompareFunc) (GtkTreeModel *model,
84 GtkTreeIter *a,
85 GtkTreeIter *b,
86 gpointer user_data);
87
88
89/**
90 * GtkTreeSortableIface:
91 * @sort_column_changed: Signal emitted when the sort column or sort
92 * order of sortable is changed.
93 * @get_sort_column_id: Fills in sort_column_id and order with the
94 * current sort column and the order.
95 * @set_sort_column_id: Sets the current sort column to be
96 * sort_column_id.
97 * @set_sort_func: Sets the comparison function used when sorting to
98 * be sort_func.
99 * @set_default_sort_func: Sets the default comparison function used
100 * when sorting to be sort_func.
101 * @has_default_sort_func: %TRUE if the model has a default sort
102 * function.
103 */
104struct _GtkTreeSortableIface
105{
106 /*< private >*/
107 GTypeInterface g_iface;
108
109 /*< public >*/
110
111 /* signals */
112 void (* sort_column_changed) (GtkTreeSortable *sortable);
113
114 /* virtual table */
115 gboolean (* get_sort_column_id) (GtkTreeSortable *sortable,
116 gint *sort_column_id,
117 GtkSortType *order);
118 void (* set_sort_column_id) (GtkTreeSortable *sortable,
119 gint sort_column_id,
120 GtkSortType order);
121 void (* set_sort_func) (GtkTreeSortable *sortable,
122 gint sort_column_id,
123 GtkTreeIterCompareFunc sort_func,
124 gpointer user_data,
125 GDestroyNotify destroy);
126 void (* set_default_sort_func) (GtkTreeSortable *sortable,
127 GtkTreeIterCompareFunc sort_func,
128 gpointer user_data,
129 GDestroyNotify destroy);
130 gboolean (* has_default_sort_func) (GtkTreeSortable *sortable);
131};
132
133
134GDK_AVAILABLE_IN_ALL
135GType gtk_tree_sortable_get_type (void) G_GNUC_CONST;
136
137GDK_AVAILABLE_IN_ALL
138void gtk_tree_sortable_sort_column_changed (GtkTreeSortable *sortable);
139GDK_AVAILABLE_IN_ALL
140gboolean gtk_tree_sortable_get_sort_column_id (GtkTreeSortable *sortable,
141 gint *sort_column_id,
142 GtkSortType *order);
143GDK_AVAILABLE_IN_ALL
144void gtk_tree_sortable_set_sort_column_id (GtkTreeSortable *sortable,
145 gint sort_column_id,
146 GtkSortType order);
147GDK_AVAILABLE_IN_ALL
148void gtk_tree_sortable_set_sort_func (GtkTreeSortable *sortable,
149 gint sort_column_id,
150 GtkTreeIterCompareFunc sort_func,
151 gpointer user_data,
152 GDestroyNotify destroy);
153GDK_AVAILABLE_IN_ALL
154void gtk_tree_sortable_set_default_sort_func (GtkTreeSortable *sortable,
155 GtkTreeIterCompareFunc sort_func,
156 gpointer user_data,
157 GDestroyNotify destroy);
158GDK_AVAILABLE_IN_ALL
159gboolean gtk_tree_sortable_has_default_sort_func (GtkTreeSortable *sortable);
160
161G_END_DECLS
162
163#endif /* __GTK_TREE_SORTABLE_H__ */
164