Basic model
[pspp] / src / ui / gui / psppire-spreadsheet-model.c
1 /* PSPPIRE - a graphical user interface for PSPP.
2    Copyright (C) 2013  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
18 #include <config.h>
19 #include <glib.h>
20
21 #include "psppire-spreadsheet-model.h"
22
23 static void psppire_spreadsheet_model_init           (PsppireSpreadsheetModel *spreadsheetModel);
24 static void psppire_spreadsheet_model_class_init     (PsppireSpreadsheetModelClass *class);
25
26 static void psppire_spreadsheet_model_finalize       (GObject   *object);
27 static void psppire_spreadsheet_model_dispose        (GObject   *object);
28
29 static GObjectClass *parent_class = NULL;
30
31
32 static void spreadsheet_tree_model_init (GtkTreeModelIface *iface);
33
34
35 GType
36 psppire_spreadsheet_model_get_type (void)
37 {
38   static GType object_type = 0;
39
40   if (!object_type)
41     {
42       static const GTypeInfo spreadsheet_model_info =
43       {
44         sizeof (PsppireSpreadsheetModelClass),
45         NULL,           /* base_init */
46         NULL,           /* base_finalize */
47         (GClassInitFunc) psppire_spreadsheet_model_class_init,
48         NULL,           /* class_finalize */
49         NULL,           /* class_data */
50         sizeof (PsppireSpreadsheetModel),
51         0,
52         (GInstanceInitFunc) psppire_spreadsheet_model_init,
53       };
54
55       static const GInterfaceInfo tree_model_info = {
56         (GInterfaceInitFunc) spreadsheet_tree_model_init,
57         NULL,
58         NULL
59       };
60       
61       object_type = g_type_register_static (G_TYPE_OBJECT,
62                                                 "PsppireSpreadsheetModel",
63                                                 &spreadsheet_model_info, 0);
64
65       g_type_add_interface_static (object_type, GTK_TYPE_TREE_MODEL,
66                                    &tree_model_info);
67
68     }
69
70   return object_type;
71 }
72
73
74 static void
75 psppire_spreadsheet_model_dispose  (GObject *object)
76 {
77 }
78
79 static void
80 psppire_spreadsheet_model_finalize (GObject *object)
81 {
82   //  PsppireSpreadsheetModel *spreadsheetModel = PSPPIRE_SPREADSHEET_MODEL (object);
83 }
84
85 static void
86 psppire_spreadsheet_model_class_init (PsppireSpreadsheetModelClass *class)
87 {
88   GObjectClass *object_class;
89
90   parent_class = g_type_class_peek_parent (class);
91   object_class = (GObjectClass*) class;
92
93   object_class->finalize = psppire_spreadsheet_model_finalize;
94   object_class->dispose = psppire_spreadsheet_model_dispose;
95 }
96
97
98 static void
99 psppire_spreadsheet_model_init (PsppireSpreadsheetModel *spreadsheetModel)
100 {
101   spreadsheetModel->dispose_has_run = FALSE;
102   spreadsheetModel->stamp = g_random_int ();
103 }
104
105
106 GtkTreeModel*
107 psppire_spreadsheet_model_new (void)
108 {
109   return g_object_new (psppire_spreadsheet_model_get_type (), NULL);
110 }
111
112
113
114
115 \f
116
117 static const gint N_COLS = 2;
118
119 static gint 
120 tree_model_n_columns (GtkTreeModel *model)
121 {
122   g_print ("%s\n", __FUNCTION__);
123   return N_COLS;
124 }
125
126 static GtkTreeModelFlags
127 tree_model_get_flags (GtkTreeModel *model)
128 {
129   g_print ("%s\n", __FUNCTION__);
130   g_return_val_if_fail (PSPPIRE_IS_SPREADSHEET_MODEL (model), (GtkTreeModelFlags) 0);
131
132   return GTK_TREE_MODEL_LIST_ONLY;
133 }
134
135 static GType
136 tree_model_column_type (GtkTreeModel *model, gint index)
137 {
138   g_print ("%s %d\n", __FUNCTION__, index);
139   g_return_val_if_fail (PSPPIRE_IS_SPREADSHEET_MODEL (model), (GType) 0);
140   g_return_val_if_fail (index < N_COLS, (GType) 0);
141  
142   return G_TYPE_STRING;
143 }
144
145
146 static gboolean
147 tree_model_get_iter (GtkTreeModel *model, GtkTreeIter *iter, GtkTreePath *path)
148 {
149   gint *indices, depth;
150
151   PsppireSpreadsheetModel *spreadsheetModel = PSPPIRE_SPREADSHEET_MODEL (model);
152
153   g_return_val_if_fail (path, FALSE);
154
155   indices = gtk_tree_path_get_indices (path);
156
157   depth = gtk_tree_path_get_depth (path);
158
159   g_return_val_if_fail (depth == 1, FALSE);
160
161   g_print ("%s %d\n", __FUNCTION__, *indices);
162
163   iter->stamp = spreadsheetModel->stamp;
164   iter->user_data = *indices; // kludge
165
166   return TRUE;
167 }
168
169 static gboolean
170 tree_model_iter_next (GtkTreeModel *model, GtkTreeIter *iter)
171 {
172   PsppireSpreadsheetModel *spreadsheetModel = PSPPIRE_SPREADSHEET_MODEL (model);
173   g_return_val_if_fail (iter->stamp == spreadsheetModel->stamp, FALSE);
174
175   g_print ("%s %d\n", __FUNCTION__, iter->user_data);
176
177   if ( iter->user_data >= 5 - 1)
178     return FALSE;
179
180   iter->user_data++;
181
182   return TRUE;
183 }
184
185
186 static void
187 tree_model_get_value (GtkTreeModel *model, GtkTreeIter *iter,
188                       gint column, GValue *value)
189 {
190   PsppireSpreadsheetModel *spreadsheetModel = PSPPIRE_SPREADSHEET_MODEL (model);
191   g_return_if_fail (column < N_COLS);
192   g_return_if_fail (iter->stamp == spreadsheetModel->stamp);
193   g_print ("%s col %d\n", __FUNCTION__, column);
194
195   g_value_init (value, G_TYPE_STRING);
196   if ( column > 0)
197     g_value_set_string (value, "foo");
198   else
199     g_value_set_string (value, "bar");
200 }
201
202
203 static gboolean
204 tree_model_nth_child (GtkTreeModel *model, GtkTreeIter *iter,
205                       GtkTreeIter *parent, gint n)
206 {
207   PsppireSpreadsheetModel *spreadsheetModel = PSPPIRE_SPREADSHEET_MODEL (model);
208
209   if ( parent )
210     return FALSE;
211
212   if ( n >= 5)
213     return FALSE;
214
215   iter->stamp = spreadsheetModel->stamp;
216   /*
217   iter->user_data = psppire_dict_get_variable (dict, n);
218
219   if ( !iter->user_data)
220     return FALSE;
221   */
222
223   return TRUE;
224 }
225
226
227 static void
228 spreadsheet_tree_model_init (GtkTreeModelIface *iface)
229 {
230   iface->get_flags = tree_model_get_flags;
231   iface->get_n_columns = tree_model_n_columns;
232   iface->get_column_type = tree_model_column_type;
233   iface->get_iter = tree_model_get_iter;
234   iface->iter_next = tree_model_iter_next;
235
236   iface->get_value = tree_model_get_value;
237
238 #if 0
239   iface->get_path = tree_model_get_path;
240   iface->iter_children = tree_model_iter_children ;
241   iface->iter_has_child = tree_model_iter_has_child ;
242   iface->iter_n_children = tree_model_n_children ;
243
244   iface->iter_parent = tree_model_iter_parent ;
245 #endif
246
247   iface->iter_nth_child = tree_model_nth_child ;
248 }