Plugged memory leaks in GUI, and converted most of the strings to UTF8, so that
[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,
103                                 gint col, gint size, const GtkSheet *sheet)
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, 
109                                                         size, sheet);
110 }
111
112
113 inline gint 
114 g_sheet_column_get_width     (const GSheetColumn *column, 
115                                     gint col, const GtkSheet *sheet)
116 {
117   g_return_val_if_fail (G_IS_SHEET_COLUMN (column), -1);
118
119   g_assert (G_SHEET_COLUMN_GET_IFACE (column)->get_width);
120   
121   return (G_SHEET_COLUMN_GET_IFACE (column)->get_width) (column, col, 
122                                                              sheet);
123 }
124
125
126
127 inline gboolean  
128 g_sheet_column_get_visibility(const GSheetColumn *column,
129                                             gint col, const GtkSheet *sheet)
130 {
131   g_return_val_if_fail (G_IS_SHEET_COLUMN (column), FALSE);
132
133   g_assert (G_SHEET_COLUMN_GET_IFACE (column)->get_visibility);
134   
135   return (G_SHEET_COLUMN_GET_IFACE (column)->get_visibility) (column, 
136                                                                   col, sheet);
137
138 }
139
140 inline gboolean  
141 g_sheet_column_get_sensitivity(const GSheetColumn *column,
142                                              gint col, const GtkSheet *sheet)
143 {
144   g_return_val_if_fail (G_IS_SHEET_COLUMN (column), FALSE);
145
146   g_assert (G_SHEET_COLUMN_GET_IFACE (column)->get_sensitivity);
147   
148   return (G_SHEET_COLUMN_GET_IFACE (column)->get_sensitivity) (column, 
149                                                                    col, sheet);
150
151 }
152
153
154 inline GtkSheetButton *
155 g_sheet_column_get_button(const GSheetColumn *column,
156                               gint col, const GtkSheet *sheet)
157 {
158   GtkSheetButton *button = gtk_sheet_button_new();
159
160   GSheetColumnIface *iface = G_SHEET_COLUMN_GET_IFACE (column);
161
162   g_return_val_if_fail (G_IS_SHEET_COLUMN (column), FALSE);
163
164   if ( iface->get_button_label)
165     button->label = iface->get_button_label(column, col, sheet);
166
167   return button;
168 }
169
170 inline GtkJustification 
171 g_sheet_column_get_justification(const GSheetColumn *column, 
172                                      gint col, const GtkSheet *sheet)
173 {
174   g_return_val_if_fail (G_IS_SHEET_COLUMN (column), FALSE);
175
176   g_assert (G_SHEET_COLUMN_GET_IFACE (column)->get_justification);
177   
178   return (G_SHEET_COLUMN_GET_IFACE (column)->get_justification) (column, col, sheet);
179 }
180
181
182
183
184 inline gint  
185 g_sheet_column_get_left_text_column (const GSheetColumn *column,
186                                          gint col, const GtkSheet *sheet)
187 {
188   g_return_val_if_fail (G_IS_SHEET_COLUMN (column), -1);
189
190   if  ( ! G_SHEET_COLUMN_GET_IFACE (column)->get_left_text_column)
191     return col;
192   
193   return (G_SHEET_COLUMN_GET_IFACE (column)->get_left_text_column) (column, col, sheet);
194
195 }
196
197 inline gint  
198 g_sheet_column_get_right_text_column (const GSheetColumn *column,
199                                           gint col, const GtkSheet *sheet)
200 {
201   g_return_val_if_fail (G_IS_SHEET_COLUMN (column), -1);
202
203   if  ( ! G_SHEET_COLUMN_GET_IFACE (column)->get_right_text_column)
204     return col;
205   
206   return (G_SHEET_COLUMN_GET_IFACE (column)->get_right_text_column) (column, col, sheet);
207
208 }
209
210 inline void 
211 g_sheet_column_set_left_text_column (const GSheetColumn *column,
212                                          gint col, gint i, const GtkSheet *sheet)
213 {
214   g_return_if_fail (G_IS_SHEET_COLUMN (column));
215
216   if  ( G_SHEET_COLUMN_GET_IFACE (column)->set_left_text_column)
217     (G_SHEET_COLUMN_GET_IFACE (column)->set_left_text_column) (column, col, i, sheet);
218
219 }
220
221
222 inline void 
223 g_sheet_column_set_right_text_column (const GSheetColumn *column,
224                                           gint col, gint i, const GtkSheet *sheet)
225 {
226   g_return_if_fail (G_IS_SHEET_COLUMN (column));
227
228   if  ( G_SHEET_COLUMN_GET_IFACE (column)->set_right_text_column)
229     (G_SHEET_COLUMN_GET_IFACE (column)->set_right_text_column) (column, col, i, sheet);
230 }
231
232 inline gint  
233 g_sheet_column_get_column_count(const GSheetColumn *geo, const GtkSheet *sheet)
234 {
235   g_return_val_if_fail (G_IS_SHEET_COLUMN (geo), -1);
236
237   g_assert  ( G_SHEET_COLUMN_GET_IFACE (geo)->get_column_count);
238
239   return (G_SHEET_COLUMN_GET_IFACE (geo)->get_column_count) (geo, sheet);
240 }
241
242 inline gint  
243 g_sheet_column_start_pixel(const GSheetColumn *geo, gint col, const GtkSheet *sheet)
244 {
245   gint i;
246   gint start_pixel = 0;
247
248   g_return_val_if_fail (G_IS_SHEET_COLUMN (geo), -1);
249   g_return_val_if_fail (col < 
250                         g_sheet_column_get_column_count(geo, sheet),-1);
251
252   for ( i = 0 ; i < col ; ++i ) 
253     {
254       if ( g_sheet_column_get_visibility(geo, i, sheet))
255         start_pixel += g_sheet_column_get_width(geo, i, sheet);
256     }
257   
258   return start_pixel;
259
260 }
261
262
263
264 inline void
265 g_sheet_column_columns_deleted(GSheetColumn *geo, 
266                                  gint first, gint n_columns)
267 {
268   g_return_if_fail (G_IS_SHEET_COLUMN (geo));
269
270   g_signal_emit (geo, sheet_column_signals[COLUMNS_CHANGED], 0, 
271                  first, n_columns);
272 }