e3f77aa82e932b13cb864a6c9d66cf2f66dab1ff
[pspp-builds.git] / lib / gtk-contrib / psppire-sheet.h
1 /*
2    Copyright (C) 2006, 2008 Free Software Foundation
3
4    This program is free software: you can redistribute it and/or modify
5    it under the terms of the GNU General Public License as published by
6    the Free Software Foundation, either version 3 of the License, or
7    (at your option) any later version.
8
9    This program is distributed in the hope that it will be useful,
10    but WITHOUT ANY WARRANTY; without even the implied warranty of
11    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12    GNU General Public License for more details.
13
14    You should have received a copy of the GNU General Public License
15    along with this program.  If not, see <http://www.gnu.org/licenses/>.
16
17
18  This file is derived from the gtksheet.c and extensively modified for the
19  requirements of PSPPIRE.  The changes are copyright by the
20  Free Software Foundation.  The copyright notice for the original work is
21  below.
22
23
24  GtkSheet widget for Gtk+.
25  * Copyright (C) 1999-2001 Adrian E. Feiguin <adrian@ifir.ifir.edu.ar>
26  *
27  * Based on GtkClist widget by Jay Painter, but major changes.
28  * Memory allocation routines inspired on SC (Spreadsheet Calculator)
29  *
30  * This library is free software; you can redistribute it and/or
31  * modify it under the terms of the GNU Lesser General Public
32  * License as published by the Free Software Foundation; either
33  * version 2.1 of the License, or (at your option) any later version.
34  *
35  * This library is distributed in the hope that it will be useful,
36  * but WITHOUT ANY WARRANTY; without even the implied warranty of
37  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
38  * Lesser General Public License for more details.
39  *
40  * You should have received a copy of the GNU Lesser General Public
41  * License along with this library; if not, write to the Free Software
42  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
43  */
44
45 #ifndef __PSPPIRE_SHEET_H__
46 #define __PSPPIRE_SHEET_H__
47
48 #include <gtk/gtk.h>
49
50 #include "gtkextra-sheet.h"
51 #include <ui/gui/sheet/psppire-sheetmodel.h>
52 #include <ui/gui/sheet/psppire-axis.h>
53
54 G_BEGIN_DECLS
55
56 /* sheet->select_status */
57 enum
58 {
59   PSPPIRE_SHEET_NORMAL,
60   PSPPIRE_SHEET_ROW_SELECTED,
61   PSPPIRE_SHEET_COLUMN_SELECTED,
62   PSPPIRE_SHEET_RANGE_SELECTED
63 };
64
65
66 #define PSPPIRE_TYPE_SHEET_RANGE (psppire_sheet_range_get_type ())
67 #define PSPPIRE_TYPE_SHEET_CELL (psppire_sheet_cell_get_type ())
68 #define PSPPIRE_TYPE_SHEET (psppire_sheet_get_type ())
69
70 #define PSPPIRE_SHEET(obj)          GTK_CHECK_CAST (obj, psppire_sheet_get_type (), PsppireSheet)
71 #define PSPPIRE_SHEET_CLASS(klass)  GTK_CHECK_CLASS_CAST (klass, psppire_sheet_get_type (), PsppireSheetClass)
72 #define PSPPIRE_IS_SHEET(obj)       GTK_CHECK_TYPE (obj, psppire_sheet_get_type ())
73
74
75 typedef struct _PsppireSheetClass PsppireSheetClass;
76 typedef struct _PsppireSheetCellAttr     PsppireSheetCellAttr;
77
78 typedef struct _PsppireSheetHoverTitle PsppireSheetHoverTitle;
79
80
81 struct _PsppireSheetCellAttr
82 {
83   GtkJustification justification;
84   GdkColor foreground;
85   GdkColor background;
86   PsppireSheetCellBorder border;
87 };
88
89 struct _PsppireSheetHoverTitle
90 {
91   GtkWidget *window;
92   GtkWidget *label;
93   gint row, column;
94 };
95
96 enum
97   {
98     BG_COLOR,
99     GRID_COLOR,
100     n_COLORS
101   };
102
103 struct _PsppireSheet
104 {
105   GtkBin parent;
106
107   gboolean dispose_has_run;
108   PsppireAxis *haxis;
109   PsppireAxis *vaxis;
110
111   guint16 flags;
112
113   PsppireSheetModel *model;
114
115   GtkSelectionMode selection_mode;
116
117   /* Component colors */
118   GdkColor color[n_COLORS];
119   gboolean show_grid;
120
121   /* active cell */
122   PsppireSheetCell active_cell;
123
124   /* The GtkEntry used for editing the cells */
125   GtkWidget *entry_widget;
126
127   /* The type of entry_widget */
128   GtkType entry_type;
129
130   /* expanding selection */
131   PsppireSheetCell selection_cell;
132
133   /* global selection button */
134   GtkWidget *button;
135
136   /* sheet state */
137   gint select_status;
138
139   /* selected range */
140   PsppireSheetRange range;
141
142   /* The space between a cell's contents and its border */
143   GtkBorder *cell_padding;
144
145   /* the scrolling window and its height and width to
146    * make things a little speedier */
147   GdkWindow *sheet_window;
148
149   /* border shadow style */
150   GtkShadowType shadow_type;
151
152   /* Column Titles */
153   GdkRectangle column_title_area;
154   GdkWindow *column_title_window;
155   gboolean column_titles_visible;
156   /* TRUE if the cursor is over the column title window */
157   gboolean column_title_under;
158
159   /* Row Titles */
160   GdkRectangle row_title_area;
161   GdkWindow *row_title_window;
162   gboolean row_titles_visible;
163   /* TRUE if the cursor is over the row title window */
164   gboolean row_title_under;
165
166   /*scrollbars*/
167   GtkAdjustment *hadjustment;
168   GtkAdjustment *vadjustment;
169
170   /* xor GC for the verticle drag line */
171   GdkGC *xor_gc;
172
173   /* gc for drawing unselected cells */
174   GdkGC *fg_gc;
175   GdkGC *bg_gc;
176
177   /* cursor used to indicate dragging */
178   GdkCursor *cursor_drag;
179
180   /* the current x-pixel location of the xor-drag vline */
181   gint x_drag;
182
183   /* the current y-pixel location of the xor-drag hline */
184   gint y_drag;
185
186   /* current cell being dragged */
187   PsppireSheetCell drag_cell;
188   /* current range being dragged */
189   PsppireSheetRange drag_range;
190
191   /* Used for the subtitle (popups) */
192   gint motion_timer;
193   PsppireSheetHoverTitle *hover_window;
194
195   gulong update_handler_id;
196 };
197
198 struct _PsppireSheetClass
199 {
200   GtkBinClass parent_class;
201
202  gboolean (*set_scroll_adjustments) (PsppireSheet *sheet,
203                                  GtkAdjustment *hadjustment,
204                                  GtkAdjustment *vadjustment);
205
206  void (*select_row)             (PsppireSheet *sheet, gint row);
207
208  void (*select_column)          (PsppireSheet *sheet, gint column);
209
210  void (*select_range)           (PsppireSheet *sheet, PsppireSheetRange *range);
211
212  void (*resize_range)           (PsppireSheet *sheet,
213                                 PsppireSheetRange *old_range,
214                                 PsppireSheetRange *new_range);
215
216  void (*move_range)             (PsppireSheet *sheet,
217                                 PsppireSheetRange *old_range,
218                                 PsppireSheetRange *new_range);
219
220  gboolean (*traverse)           (PsppireSheet *sheet,
221                                 gint row, gint column,
222                                 gint *new_row, gint *new_column);
223
224  gboolean (*activate)           (PsppireSheet *sheet,
225                                 gint row, gint column);
226
227  void (*changed)                (PsppireSheet *sheet,
228                                 gint row, gint column);
229 };
230
231 GType psppire_sheet_get_type (void);
232 GtkType psppire_sheet_range_get_type (void);
233
234
235 /* create a new sheet */
236 GtkWidget * psppire_sheet_new (PsppireSheetModel *model);
237
238 /* create a new sheet with custom entry */
239 GtkWidget *
240 psppire_sheet_new_with_custom_entry (GtkType entry_type);
241
242 /* Change entry */
243 void psppire_sheet_change_entry         (PsppireSheet *sheet, GtkType entry_type);
244
245 GtkEntry *psppire_sheet_get_entry    (PsppireSheet *sheet);
246
247
248 void psppire_sheet_get_selected_range (PsppireSheet *sheet,
249                                          PsppireSheetRange *range);
250
251 void psppire_sheet_show_grid      (PsppireSheet *sheet,
252                                          gboolean show);
253
254 gboolean psppire_sheet_grid_visible   (PsppireSheet *sheet);
255
256
257 /* scroll the viewing area of the sheet to the given column
258  * and row; row_align and col_align are between 0-1 representing the
259  * location the row should appear on the screen, 0.0 being top or left,
260  * 1.0 being bottom or right; if row or column is negative then there
261  * is no change */
262 void psppire_sheet_moveto (PsppireSheet *sheet,
263                   gint row,
264                   gint column,
265                   gfloat row_align,
266                   gfloat col_align);
267
268
269 void psppire_sheet_show_row_titles              (PsppireSheet *sheet);
270 void psppire_sheet_hide_row_titles              (PsppireSheet *sheet);
271 void psppire_sheet_show_column_titles       (PsppireSheet *sheet);
272 void psppire_sheet_hide_column_titles   (PsppireSheet *sheet);
273
274 /* select the row. The range is then highlighted, and the bounds are stored
275  * in sheet->range  */
276 void psppire_sheet_select_row    (PsppireSheet * sheet,  gint row);
277
278 /* select the column. The range is then highlighted, and the bounds are stored
279  * in sheet->range  */
280 void psppire_sheet_select_column (PsppireSheet * sheet,  gint column);
281
282 /* highlight the selected range and store bounds in sheet->range */
283 void psppire_sheet_select_range (PsppireSheet *sheet, const PsppireSheetRange *range);
284
285 void psppire_sheet_get_visible_range (PsppireSheet *sheet, PsppireSheetRange *range);
286
287
288 /* obvious */
289 void psppire_sheet_unselect_range               (PsppireSheet *sheet);
290
291 /* set active cell where the entry will be displayed */
292 void psppire_sheet_set_active_cell (PsppireSheet *sheet,
293                                 gint row, gint column);
294
295 /* Sets *ROW and *COLUMN to be the coordinates of the active cell.
296    ROW and/or COLUMN may be null if the caller is not interested in their
297    values */
298 void psppire_sheet_get_active_cell (PsppireSheet *sheet,
299                                         gint *row, gint *column);
300
301 /* get cell contents */
302 gchar *psppire_sheet_cell_get_text (const PsppireSheet *sheet, gint row, gint col);
303
304
305 void psppire_sheet_set_model (PsppireSheet *sheet,
306                                    PsppireSheetModel *model);
307
308 PsppireSheetModel * psppire_sheet_get_model (const PsppireSheet *sheet);
309
310
311 G_END_DECLS
312
313
314 #endif /* __PSPPIRE_SHEET_H__ */
315
316