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