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