56dcbca85e45c12c9fedbac5c88223d5e8c90dc6
[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 glong
177 g_sheet_column_get_column_count (const GSheetColumn *geo)
178 {
179   g_return_val_if_fail (G_IS_SHEET_COLUMN (geo), -1);
180
181   g_assert  ( G_SHEET_COLUMN_GET_IFACE (geo)->get_column_count);
182
183   return (G_SHEET_COLUMN_GET_IFACE (geo)->get_column_count) (geo);
184 }
185
186 gint
187 g_sheet_column_start_pixel (const GSheetColumn *geo, glong col)
188 {
189   gint i;
190   gint start_pixel = 0;
191
192   g_return_val_if_fail (G_IS_SHEET_COLUMN (geo), -1);
193   g_return_val_if_fail (col <= g_sheet_column_get_column_count (geo), -1);
194
195   for (i = 0; i < col; ++i)
196     {
197       start_pixel += g_sheet_column_get_width (geo, i);
198     }
199
200   return start_pixel;
201 }
202
203
204
205 void
206 g_sheet_column_columns_changed (GSheetColumn *geo,
207                                  glong first, glong n_columns)
208 {
209   g_return_if_fail (G_IS_SHEET_COLUMN (geo));
210
211   g_signal_emit (geo, sheet_column_signals[COLUMNS_CHANGED], 0,
212                  first, n_columns);
213 }
214