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