Remove unnecessary variable
[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   /* global selection button */
131   GtkWidget *button;
132
133   /* sheet state */
134   gint select_status;
135
136   /* selected range */
137   PsppireSheetRange range;
138
139   /* The space between a cell's contents and its border */
140   GtkBorder *cell_padding;
141
142   /* the scrolling window and its height and width to
143    * make things a little speedier */
144   GdkWindow *sheet_window;
145
146   /* border shadow style */
147   GtkShadowType shadow_type;
148
149   /* Column Titles */
150   GdkRectangle column_title_area;
151   GdkWindow *column_title_window;
152   gboolean column_titles_visible;
153   /* TRUE if the cursor is over the column title window */
154   gboolean column_title_under;
155
156   /* Row Titles */
157   GdkRectangle row_title_area;
158   GdkWindow *row_title_window;
159   gboolean row_titles_visible;
160   /* TRUE if the cursor is over the row title window */
161   gboolean row_title_under;
162
163   /*scrollbars*/
164   GtkAdjustment *hadjustment;
165   GtkAdjustment *vadjustment;
166
167   /* xor GC for the verticle drag line */
168   GdkGC *xor_gc;
169
170   /* gc for drawing unselected cells */
171   GdkGC *fg_gc;
172   GdkGC *bg_gc;
173
174   /* cursor used to indicate dragging */
175   GdkCursor *cursor_drag;
176
177   /* the current x-pixel location of the xor-drag vline */
178   gint x_drag;
179
180   /* the current y-pixel location of the xor-drag hline */
181   gint y_drag;
182
183   /* current cell being dragged */
184   PsppireSheetCell drag_cell;
185   /* current range being dragged */
186   PsppireSheetRange drag_range;
187
188   /* Used for the subtitle (popups) */
189   gint motion_timer;
190   PsppireSheetHoverTitle *hover_window;
191
192   gulong update_handler_id;
193 };
194
195 struct _PsppireSheetClass
196 {
197   GtkBinClass parent_class;
198
199  gboolean (*set_scroll_adjustments) (PsppireSheet *sheet,
200                                  GtkAdjustment *hadjustment,
201                                  GtkAdjustment *vadjustment);
202
203  void (*select_row)             (PsppireSheet *sheet, gint row);
204
205  void (*select_column)          (PsppireSheet *sheet, gint column);
206
207  void (*select_range)           (PsppireSheet *sheet, PsppireSheetRange *range);
208
209  void (*resize_range)           (PsppireSheet *sheet,
210                                 PsppireSheetRange *old_range,
211                                 PsppireSheetRange *new_range);
212
213  void (*move_range)             (PsppireSheet *sheet,
214                                 PsppireSheetRange *old_range,
215                                 PsppireSheetRange *new_range);
216
217  gboolean (*traverse)           (PsppireSheet *sheet,
218                                 gint row, gint column,
219                                 gint *new_row, gint *new_column);
220
221  gboolean (*activate)           (PsppireSheet *sheet,
222                                 gint row, gint column);
223
224  void (*changed)                (PsppireSheet *sheet,
225                                 gint row, gint column);
226 };
227
228 GType psppire_sheet_get_type (void);
229 GtkType psppire_sheet_range_get_type (void);
230
231
232 /* create a new sheet */
233 GtkWidget * psppire_sheet_new (PsppireSheetModel *model);
234
235 /* create a new sheet with custom entry */
236 GtkWidget *
237 psppire_sheet_new_with_custom_entry (GtkType entry_type);
238
239 /* Change entry */
240 void psppire_sheet_change_entry         (PsppireSheet *sheet, GtkType entry_type);
241
242 GtkEntry *psppire_sheet_get_entry    (PsppireSheet *sheet);
243
244
245 void psppire_sheet_get_selected_range (PsppireSheet *sheet,
246                                          PsppireSheetRange *range);
247
248 void psppire_sheet_show_grid      (PsppireSheet *sheet,
249                                          gboolean show);
250
251 gboolean psppire_sheet_grid_visible   (PsppireSheet *sheet);
252
253
254 /* scroll the viewing area of the sheet to the given column
255  * and row; row_align and col_align are between 0-1 representing the
256  * location the row should appear on the screen, 0.0 being top or left,
257  * 1.0 being bottom or right; if row or column is negative then there
258  * is no change */
259 void psppire_sheet_moveto (PsppireSheet *sheet,
260                   gint row,
261                   gint column,
262                   gfloat row_align,
263                   gfloat col_align);
264
265
266 void psppire_sheet_show_row_titles              (PsppireSheet *sheet);
267 void psppire_sheet_hide_row_titles              (PsppireSheet *sheet);
268 void psppire_sheet_show_column_titles       (PsppireSheet *sheet);
269 void psppire_sheet_hide_column_titles   (PsppireSheet *sheet);
270
271 /* select the row. The range is then highlighted, and the bounds are stored
272  * in sheet->range  */
273 void psppire_sheet_select_row    (PsppireSheet * sheet,  gint row);
274
275 /* select the column. The range is then highlighted, and the bounds are stored
276  * in sheet->range  */
277 void psppire_sheet_select_column (PsppireSheet * sheet,  gint column);
278
279 /* highlight the selected range and store bounds in sheet->range */
280 void psppire_sheet_select_range (PsppireSheet *sheet, const PsppireSheetRange *range);
281
282 void psppire_sheet_get_visible_range (PsppireSheet *sheet, PsppireSheetRange *range);
283
284
285 /* obvious */
286 void psppire_sheet_unselect_range               (PsppireSheet *sheet);
287
288 /* set active cell where the entry will be displayed */
289 void psppire_sheet_set_active_cell (PsppireSheet *sheet,
290                                 gint row, gint column);
291
292 /* Sets *ROW and *COLUMN to be the coordinates of the active cell.
293    ROW and/or COLUMN may be null if the caller is not interested in their
294    values */
295 void psppire_sheet_get_active_cell (PsppireSheet *sheet,
296                                         gint *row, gint *column);
297
298 /* get cell contents */
299 gchar *psppire_sheet_cell_get_text (const PsppireSheet *sheet, gint row, gint col);
300
301
302 void psppire_sheet_set_model (PsppireSheet *sheet,
303                                    PsppireSheetModel *model);
304
305 PsppireSheetModel * psppire_sheet_get_model (const PsppireSheet *sheet);
306
307
308 G_END_DECLS
309
310
311 #endif /* __PSPPIRE_SHEET_H__ */
312
313