Allow ranges with left to right and bottom to top sense to be selected.
[pspp-builds.git] / src / ui / gui / checkbox-treeview.c
1 /* PSPPIRE - a graphical user interface for PSPP.
2    Copyright (C) 2007  Free Software Foundation
3
4    This program is free software: you can redistribute it and/or modify
5    it under the terms of the GNU General Public License as published by
6    the Free Software Foundation, either version 3 of the License, or
7    (at your option) any later version.
8
9    This program 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
12    GNU General Public License for more details.
13
14    You should have received a copy of the GNU General Public License
15    along with this program.  If not, see <http://www.gnu.org/licenses/>. */
16
17 #include <config.h>
18
19 #include "checkbox-treeview.h"
20 #include <gtk/gtk.h>
21
22 #include "gettext.h"
23 #define _(msgid) gettext (msgid)
24 #define N_(msgid) msgid
25
26
27 /* Callback for checkbox cells in the statistics tree view.
28    Toggles the checkbox. */
29 static void
30 toggle (GtkCellRendererToggle *cell_renderer, gchar *path_str, gpointer data)
31 {
32   GtkTreeView *tv = GTK_TREE_VIEW (data);
33   GtkTreeModel *model = gtk_tree_view_get_model (tv);
34   GtkTreeIter iter;
35   GtkTreePath *path = gtk_tree_path_new_from_string (path_str);
36   gboolean selected;
37
38   gtk_tree_model_get_iter (model, &iter, path);
39   gtk_tree_model_get (model, &iter, CHECKBOX_COLUMN_SELECTED, &selected, -1);
40   gtk_list_store_set (GTK_LIST_STORE (model), &iter, CHECKBOX_COLUMN_SELECTED,
41                       !selected, -1);
42   gtk_tree_path_free (path);
43 }
44
45
46 static void
47 treeview_create_checkbox_model (GtkTreeView *treeview,
48                                 guint default_items,
49                                 gint n_items,
50                                 const struct checkbox_entry_item *items
51                                 )
52 {
53   GtkListStore *list;
54   size_t i;
55
56   list = gtk_list_store_new (N_CHECKBOX_COLUMNS,
57                              G_TYPE_STRING, G_TYPE_BOOLEAN);
58   gtk_tree_view_set_model (GTK_TREE_VIEW (treeview), GTK_TREE_MODEL (list));
59
60   for (i = 0; i < n_items; i++)
61     {
62       GtkTreeIter iter;
63       gtk_list_store_append (list, &iter);
64       gtk_list_store_set (list, &iter,
65                           CHECKBOX_COLUMN_LABEL, items[i].label,
66                           CHECKBOX_COLUMN_SELECTED,
67                           (default_items & (1u << i)) != 0,
68                           -1);
69     }
70 }
71
72 static void
73 treeview_checkbox_populate (GtkTreeView *treeview)
74 {
75   GtkTreeViewColumn *col;
76   GtkCellRenderer *renderer;
77
78   /* Checkbox column. */
79   col = gtk_tree_view_column_new ();
80   renderer = gtk_cell_renderer_toggle_new ();
81
82   gtk_tree_view_column_pack_start (col, renderer, TRUE);
83
84   gtk_tree_view_append_column (treeview, col);
85
86   gtk_tree_view_column_add_attribute  (col, renderer, "active", CHECKBOX_COLUMN_SELECTED);
87
88   g_signal_connect (renderer, "toggled", G_CALLBACK (toggle), treeview);
89
90   /* Label column. */
91   col = gtk_tree_view_column_new ();
92   gtk_tree_view_column_set_title (col, _("Statistic"));
93   renderer = gtk_cell_renderer_text_new ();
94   gtk_tree_view_column_pack_start (col, renderer, TRUE);
95
96   gtk_tree_view_column_add_attribute  (col, renderer, "text", CHECKBOX_COLUMN_LABEL);
97
98   g_object_set (renderer, "ellipsize-set", TRUE, NULL);
99   g_object_set (renderer, "ellipsize", PANGO_ELLIPSIZE_END, NULL);
100   gtk_tree_view_column_set_min_width (col, 200);
101   gtk_tree_view_column_set_sizing (col, GTK_TREE_VIEW_COLUMN_AUTOSIZE);
102   gtk_tree_view_column_set_resizable (col, TRUE);
103   gtk_tree_view_append_column (treeview, col);
104 }
105
106
107 void
108 put_checkbox_items_in_treeview (GtkTreeView *treeview,
109                                 guint default_items,
110                                 gint n_items,
111                                 const struct checkbox_entry_item *items
112                                 )
113 {
114   treeview_create_checkbox_model (treeview, default_items, n_items, items);
115   treeview_checkbox_populate (treeview);
116 }