Implemented data-store using a casefile instead of an array of cases.
[pspp-builds.git] / lib / gtksheet / gsheet-column-iface.c
1 /* GSheetColumn --- an abstract model of the column geometry of a 
2    GSheet widget.
3
4  * Copyright (C) 2006 Free Software Foundation
5  *
6  * This library is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Lesser General Public
8  * License as published by the Free Software Foundation; either
9  * version 2.1 of the License, or (at your option) any later version.
10  *
11  * This library is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14  * Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public
17  * License along with this library; if not, write to the Free Software
18  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
19  */
20
21 #include <stdlib.h>
22 #include <string.h>
23 #include <glib.h>
24 #include <glib/gprintf.h>
25 #include <gobject/gvaluecollector.h>
26 #include "gsheet-column-iface.h"
27 #include "gtkextra-marshal.h"
28 #include "gtkextra-sheet.h"
29
30 enum {
31   COLUMNS_CHANGED,
32   LAST_SIGNAL
33 };
34
35 static guint sheet_column_signals[LAST_SIGNAL];
36
37
38
39 static void      g_sheet_column_base_init   (gpointer g_class);
40
41
42 inline GType
43 g_sheet_column_get_type (void)
44 {
45   static GType sheet_column_type = 0;
46
47   if (! sheet_column_type)
48     {
49       static const GTypeInfo sheet_column_info =
50
51       {
52         sizeof (GSheetColumnIface), /* class_size */
53         g_sheet_column_base_init,   /* base_init */
54         NULL,           /* base_finalize */
55         NULL,
56         NULL,           /* class_finalize */
57         NULL,           /* class_data */
58         0,
59         0,              /* n_preallocs */
60         NULL
61       };
62
63       sheet_column_type =
64         g_type_register_static (G_TYPE_INTERFACE, "GSheetColumn",
65                                 &sheet_column_info, 0);
66
67       g_assert(sheet_column_type);
68
69       g_type_interface_add_prerequisite (sheet_column_type, G_TYPE_OBJECT);
70     }
71
72   return sheet_column_type;
73 }
74
75
76 static void
77 g_sheet_column_base_init (gpointer g_class)
78 {
79   static gboolean initialized = FALSE;
80
81   if (! initialized)
82     {
83
84       sheet_column_signals[COLUMNS_CHANGED] =
85         g_signal_new ("columns_changed",
86                       G_TYPE_SHEET_COLUMN,
87                       G_SIGNAL_RUN_LAST,
88                       G_STRUCT_OFFSET (GSheetColumnIface, columns_changed),
89                       NULL, NULL,
90                       gtkextra_VOID__INT_INT,
91                       G_TYPE_NONE, 2,
92                       G_TYPE_INT,
93                       G_TYPE_INT);
94
95
96       initialized = TRUE;
97     }
98 }
99
100
101 inline void  
102 g_sheet_column_set_width (GSheetColumn *column, gint col, gint size, 
103                           gpointer data)
104 {
105   g_return_if_fail (G_IS_SHEET_COLUMN (column));
106
107   if ((G_SHEET_COLUMN_GET_IFACE (column)->set_width) ) 
108     (G_SHEET_COLUMN_GET_IFACE (column)->set_width) (column, col, size, data);
109 }
110
111
112 inline gint 
113 g_sheet_column_get_width (const GSheetColumn *column, gint col, gpointer data)
114 {
115   g_return_val_if_fail (G_IS_SHEET_COLUMN (column), -1);
116
117   g_assert (G_SHEET_COLUMN_GET_IFACE (column)->get_width);
118   
119   return (G_SHEET_COLUMN_GET_IFACE (column)->get_width) (column, col, data);
120 }
121
122
123
124 inline gboolean  
125 g_sheet_column_get_visibility(const GSheetColumn *column,
126                                             gint col, gpointer data)
127 {
128   g_return_val_if_fail (G_IS_SHEET_COLUMN (column), FALSE);
129
130   g_assert (G_SHEET_COLUMN_GET_IFACE (column)->get_visibility);
131   
132   return (G_SHEET_COLUMN_GET_IFACE (column)->get_visibility) (column, 
133                                                                   col, data);
134
135 }
136
137 inline gboolean  
138 g_sheet_column_get_sensitivity(const GSheetColumn *column,
139                                              gint col, gpointer data)
140 {
141   g_return_val_if_fail (G_IS_SHEET_COLUMN (column), FALSE);
142
143   g_assert (G_SHEET_COLUMN_GET_IFACE (column)->get_sensitivity);
144   
145   return (G_SHEET_COLUMN_GET_IFACE (column)->get_sensitivity) (column, 
146                                                                    col, data);
147
148 }
149
150
151 inline GtkSheetButton *
152 g_sheet_column_get_button(const GSheetColumn *column,
153                               gint col, gpointer data)
154 {
155   GtkSheetButton *button = gtk_sheet_button_new();
156
157   GSheetColumnIface *iface = G_SHEET_COLUMN_GET_IFACE (column);
158
159   g_return_val_if_fail (G_IS_SHEET_COLUMN (column), FALSE);
160
161   if ( iface->get_button_label)
162     button->label = iface->get_button_label(column, col, data);
163
164   return button;
165 }
166
167 inline GtkJustification 
168 g_sheet_column_get_justification(const GSheetColumn *column, 
169                                      gint col, gpointer data)
170 {
171   g_return_val_if_fail (G_IS_SHEET_COLUMN (column), FALSE);
172
173   g_assert (G_SHEET_COLUMN_GET_IFACE (column)->get_justification);
174   
175   return (G_SHEET_COLUMN_GET_IFACE (column)->get_justification) (column, col, data);
176 }
177
178
179
180
181 inline gint  
182 g_sheet_column_get_left_text_column (const GSheetColumn *column,
183                                          gint col, gpointer data)
184 {
185   g_return_val_if_fail (G_IS_SHEET_COLUMN (column), -1);
186
187   if  ( ! G_SHEET_COLUMN_GET_IFACE (column)->get_left_text_column)
188     return col;
189   
190   return (G_SHEET_COLUMN_GET_IFACE (column)->get_left_text_column) (column, col, data);
191
192 }
193
194 inline gint  
195 g_sheet_column_get_right_text_column (const GSheetColumn *column,
196                                           gint col, gpointer data)
197 {
198   g_return_val_if_fail (G_IS_SHEET_COLUMN (column), -1);
199
200   if  ( ! G_SHEET_COLUMN_GET_IFACE (column)->get_right_text_column)
201     return col;
202   
203   return (G_SHEET_COLUMN_GET_IFACE (column)->get_right_text_column) (column, col, data);
204
205 }
206
207 inline void 
208 g_sheet_column_set_left_text_column (const GSheetColumn *column,
209                                          gint col, gint i, gpointer data)
210 {
211   g_return_if_fail (G_IS_SHEET_COLUMN (column));
212
213   if  ( G_SHEET_COLUMN_GET_IFACE (column)->set_left_text_column)
214     (G_SHEET_COLUMN_GET_IFACE (column)->set_left_text_column) (column, col, i, data);
215
216 }
217
218
219 inline void 
220 g_sheet_column_set_right_text_column (const GSheetColumn *column,
221                                           gint col, gint i, gpointer data)
222 {
223   g_return_if_fail (G_IS_SHEET_COLUMN (column));
224
225   if  ( G_SHEET_COLUMN_GET_IFACE (column)->set_right_text_column)
226     (G_SHEET_COLUMN_GET_IFACE (column)->set_right_text_column) (column, col, i, data);
227 }
228
229 inline gint  
230 g_sheet_column_get_column_count(const GSheetColumn *geo, gpointer data)
231 {
232   g_return_val_if_fail (G_IS_SHEET_COLUMN (geo), -1);
233
234   g_assert  ( G_SHEET_COLUMN_GET_IFACE (geo)->get_column_count);
235
236   return (G_SHEET_COLUMN_GET_IFACE (geo)->get_column_count) (geo, data);
237 }
238
239 inline gint  
240 g_sheet_column_start_pixel(const GSheetColumn *geo, gint col, gpointer data)
241 {
242   gint i;
243   gint start_pixel = 0;
244
245   g_return_val_if_fail (G_IS_SHEET_COLUMN (geo), -1);
246   g_return_val_if_fail (col < 
247                         g_sheet_column_get_column_count(geo, data),-1);
248
249   for ( i = 0 ; i < col ; ++i ) 
250     {
251       if ( g_sheet_column_get_visibility(geo, i, data))
252         start_pixel += g_sheet_column_get_width(geo, i, data);
253     }
254   
255   return start_pixel;
256
257 }
258
259
260
261 inline void
262 g_sheet_column_columns_changed(GSheetColumn *geo, 
263                                  gint first, gint n_columns)
264 {
265   g_return_if_fail (G_IS_SHEET_COLUMN (geo));
266
267   g_signal_emit (geo, sheet_column_signals[COLUMNS_CHANGED], 0, 
268                  first, n_columns);
269 }
270
271
272
273