(display_variables): Fix DISPLAY LABELS. Thanks to Guido Gay
[pspp] / 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 <config.h>
22
23 #include <stdlib.h>
24 #include <string.h>
25 #include <glib.h>
26 #include <glib/gprintf.h>
27 #include <gobject/gvaluecollector.h>
28 #include "gsheet-column-iface.h"
29 #include "gtkextra-marshal.h"
30 #include "gtkextra-sheet.h"
31
32 enum {
33   COLUMNS_CHANGED,
34   LAST_SIGNAL
35 };
36
37 static guint sheet_column_signals[LAST_SIGNAL];
38
39
40
41 static void      g_sheet_column_base_init   (gpointer g_class);
42
43
44 inline GType
45 g_sheet_column_get_type (void)
46 {
47   static GType sheet_column_type = 0;
48
49   if (! sheet_column_type)
50     {
51       static const GTypeInfo sheet_column_info =
52
53       {
54         sizeof (GSheetColumnIface), /* class_size */
55         g_sheet_column_base_init,   /* base_init */
56         NULL,           /* base_finalize */
57         NULL,
58         NULL,           /* class_finalize */
59         NULL,           /* class_data */
60         0,
61         0,              /* n_preallocs */
62         NULL
63       };
64
65       sheet_column_type =
66         g_type_register_static (G_TYPE_INTERFACE, "GSheetColumn",
67                                 &sheet_column_info, 0);
68
69       g_assert(sheet_column_type);
70
71       g_type_interface_add_prerequisite (sheet_column_type, G_TYPE_OBJECT);
72     }
73
74   return sheet_column_type;
75 }
76
77
78 static void
79 g_sheet_column_base_init (gpointer g_class)
80 {
81   static gboolean initialized = FALSE;
82
83   if (! initialized)
84     {
85
86       sheet_column_signals[COLUMNS_CHANGED] =
87         g_signal_new ("columns_changed",
88                       G_TYPE_SHEET_COLUMN,
89                       G_SIGNAL_RUN_LAST,
90                       G_STRUCT_OFFSET (GSheetColumnIface, columns_changed),
91                       NULL, NULL,
92                       gtkextra_VOID__INT_INT,
93                       G_TYPE_NONE, 2,
94                       G_TYPE_INT,
95                       G_TYPE_INT);
96
97
98       initialized = TRUE;
99     }
100 }
101
102
103 inline void
104 g_sheet_column_set_width (GSheetColumn *column, glong col, gint size)
105 {
106   g_return_if_fail (G_IS_SHEET_COLUMN (column));
107
108   if ((G_SHEET_COLUMN_GET_IFACE (column)->set_width) )
109     (G_SHEET_COLUMN_GET_IFACE (column)->set_width) (column, col, size);
110 }
111
112
113 inline gint
114 g_sheet_column_get_width (const GSheetColumn *column, glong col)
115 {
116   g_return_val_if_fail (G_IS_SHEET_COLUMN (column), -1);
117
118   g_assert (G_SHEET_COLUMN_GET_IFACE (column)->get_width);
119
120   return (G_SHEET_COLUMN_GET_IFACE (column)->get_width) (column, col);
121 }
122
123
124
125 inline gboolean
126 g_sheet_column_get_visibility(const GSheetColumn *column,
127                                             glong col)
128 {
129   g_return_val_if_fail (G_IS_SHEET_COLUMN (column), FALSE);
130
131   g_assert (G_SHEET_COLUMN_GET_IFACE (column)->get_visibility);
132
133   return (G_SHEET_COLUMN_GET_IFACE (column)->get_visibility) (column,
134                                                                   col);
135
136 }
137
138 inline gboolean
139 g_sheet_column_get_sensitivity(const GSheetColumn *column,
140                                              glong col)
141 {
142   g_return_val_if_fail (G_IS_SHEET_COLUMN (column), FALSE);
143
144   g_assert (G_SHEET_COLUMN_GET_IFACE (column)->get_sensitivity);
145
146   return (G_SHEET_COLUMN_GET_IFACE (column)->get_sensitivity) (column,
147                                                                    col);
148
149 }
150
151
152 inline GtkSheetButton *
153 g_sheet_column_get_button(const GSheetColumn *column,
154                               glong col)
155 {
156   GtkSheetButton *button = gtk_sheet_button_new();
157
158   GSheetColumnIface *iface = G_SHEET_COLUMN_GET_IFACE (column);
159
160   g_return_val_if_fail (G_IS_SHEET_COLUMN (column), FALSE);
161
162   if ( iface->get_button_label)
163     button->label = iface->get_button_label(column, col);
164
165   return button;
166 }
167
168 inline GtkJustification
169 g_sheet_column_get_justification(const GSheetColumn *column,
170                                      glong col)
171 {
172   g_return_val_if_fail (G_IS_SHEET_COLUMN (column), FALSE);
173
174   g_assert (G_SHEET_COLUMN_GET_IFACE (column)->get_justification);
175
176   return (G_SHEET_COLUMN_GET_IFACE (column)->get_justification) (column, col);
177 }
178
179 inline gchar *
180 g_sheet_column_get_subtitle (const GSheetColumn *column, glong col)
181 {
182   g_return_val_if_fail (G_IS_SHEET_COLUMN (column), NULL);
183
184   if  ( ! G_SHEET_COLUMN_GET_IFACE (column)->get_subtitle)
185     return NULL;
186
187   return (G_SHEET_COLUMN_GET_IFACE (column)->get_subtitle) (column, col);
188 }
189
190
191
192 inline gint
193 g_sheet_column_get_left_text_column (const GSheetColumn *column,
194                                          glong col)
195 {
196   g_return_val_if_fail (G_IS_SHEET_COLUMN (column), -1);
197
198   if  ( ! G_SHEET_COLUMN_GET_IFACE (column)->get_left_text_column)
199     return col;
200
201   return (G_SHEET_COLUMN_GET_IFACE (column)->get_left_text_column) (column, col);
202
203 }
204
205 inline gint
206 g_sheet_column_get_right_text_column (const GSheetColumn *column,
207                                           glong col)
208 {
209   g_return_val_if_fail (G_IS_SHEET_COLUMN (column), -1);
210
211   if  ( ! G_SHEET_COLUMN_GET_IFACE (column)->get_right_text_column)
212     return col;
213
214   return (G_SHEET_COLUMN_GET_IFACE (column)->get_right_text_column) (column, col);
215
216 }
217
218 inline void
219 g_sheet_column_set_left_text_column (const GSheetColumn *column,
220                                          glong col, gint i)
221 {
222   g_return_if_fail (G_IS_SHEET_COLUMN (column));
223
224   if  ( G_SHEET_COLUMN_GET_IFACE (column)->set_left_text_column)
225     (G_SHEET_COLUMN_GET_IFACE (column)->set_left_text_column) (column, col, i);
226
227 }
228
229
230 inline void
231 g_sheet_column_set_right_text_column (const GSheetColumn *column,
232                                           glong col, gint i)
233 {
234   g_return_if_fail (G_IS_SHEET_COLUMN (column));
235
236   if  ( G_SHEET_COLUMN_GET_IFACE (column)->set_right_text_column)
237     (G_SHEET_COLUMN_GET_IFACE (column)->set_right_text_column) (column, col, i);
238 }
239
240 inline glong
241 g_sheet_column_get_column_count(const GSheetColumn *geo)
242 {
243   g_return_val_if_fail (G_IS_SHEET_COLUMN (geo), -1);
244
245   g_assert  ( G_SHEET_COLUMN_GET_IFACE (geo)->get_column_count);
246
247   return (G_SHEET_COLUMN_GET_IFACE (geo)->get_column_count) (geo);
248 }
249
250 inline gint
251 g_sheet_column_start_pixel(const GSheetColumn *geo, glong col)
252 {
253   gint i;
254   gint start_pixel = 0;
255
256   g_return_val_if_fail (G_IS_SHEET_COLUMN (geo), -1);
257   g_return_val_if_fail (col <
258                         g_sheet_column_get_column_count(geo),-1);
259
260   for ( i = 0 ; i < col ; ++i )
261     {
262       if ( g_sheet_column_get_visibility(geo, i))
263         start_pixel += g_sheet_column_get_width(geo, i);
264     }
265
266   return start_pixel;
267
268 }
269
270
271
272 inline void
273 g_sheet_column_columns_changed(GSheetColumn *geo,
274                                  glong first, glong n_columns)
275 {
276   g_return_if_fail (G_IS_SHEET_COLUMN (geo));
277
278   g_signal_emit (geo, sheet_column_signals[COLUMNS_CHANGED], 0,
279                  first, n_columns);
280 }
281
282
283
284