2 Copyright (C) 2006, 2008 Free Software Foundation
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.
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.
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/>.
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
24 GtkSheet widget for Gtk+.
25 * Copyright (C) 1999-2001 Adrian E. Feiguin <adrian@ifir.ifir.edu.ar>
27 * Based on GtkClist widget by Jay Painter, but major changes.
28 * Memory allocation routines inspired on SC (Spreadsheet Calculator)
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.
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.
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
45 #ifndef __PSPPIRE_SHEET_H__
46 #define __PSPPIRE_SHEET_H__
50 #include "gtkextra-sheet.h"
51 #include <ui/gui/sheet/psppire-sheetmodel.h>
52 #include <ui/gui/sheet/psppire-axis.h>
60 PSPPIRE_SHEET_ROW_SELECTED,
61 PSPPIRE_SHEET_COLUMN_SELECTED,
62 PSPPIRE_SHEET_RANGE_SELECTED
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 ())
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 ())
75 typedef struct _PsppireSheetClass PsppireSheetClass;
76 typedef struct _PsppireSheetCellAttr PsppireSheetCellAttr;
78 typedef struct _PsppireSheetHoverTitle PsppireSheetHoverTitle;
81 struct _PsppireSheetCellAttr
83 GtkJustification justification;
86 PsppireSheetCellBorder border;
90 struct _PsppireSheetHoverTitle
108 gboolean dispose_has_run;
114 PsppireSheetModel *model;
116 GtkSelectionMode selection_mode;
118 /* Component colors */
119 GdkColor color[n_COLORS];
123 PsppireSheetCell active_cell;
125 /* The GtkEntry used for editing the cells */
126 GtkWidget *entry_widget;
128 /* The type of entry_widget */
131 /* expanding selection */
132 PsppireSheetCell selection_cell;
134 /* global selection button */
141 PsppireSheetRange range;
143 /* the scrolling window and its height and width to
144 * make things a little speedier */
145 GdkWindow *sheet_window;
147 /* border shadow style */
148 GtkShadowType shadow_type;
151 GdkRectangle column_title_area;
152 GdkWindow *column_title_window;
153 gboolean column_titles_visible;
154 /* TRUE if the cursor is over the column title window */
155 gboolean column_title_under;
158 GdkRectangle row_title_area;
159 GdkWindow *row_title_window;
160 gboolean row_titles_visible;
161 /* TRUE if the cursor is over the row title window */
162 gboolean row_title_under;
165 GtkAdjustment *hadjustment;
166 GtkAdjustment *vadjustment;
168 /* xor GC for the verticle drag line */
171 /* gc for drawing unselected cells */
175 /* cursor used to indicate dragging */
176 GdkCursor *cursor_drag;
178 /* the current x-pixel location of the xor-drag vline */
181 /* the current y-pixel location of the xor-drag hline */
184 /* current cell being dragged */
185 PsppireSheetCell drag_cell;
186 /* current range being dragged */
187 PsppireSheetRange drag_range;
189 /* Used for the subtitle (popups) */
191 PsppireSheetHoverTitle *hover_window;
193 gulong update_handler_id;
196 struct _PsppireSheetClass
198 GtkBinClass parent_class;
200 gboolean (*set_scroll_adjustments) (PsppireSheet *sheet,
201 GtkAdjustment *hadjustment,
202 GtkAdjustment *vadjustment);
204 void (*select_row) (PsppireSheet *sheet, gint row);
206 void (*select_column) (PsppireSheet *sheet, gint column);
208 void (*select_range) (PsppireSheet *sheet, PsppireSheetRange *range);
210 void (*resize_range) (PsppireSheet *sheet,
211 PsppireSheetRange *old_range,
212 PsppireSheetRange *new_range);
214 void (*move_range) (PsppireSheet *sheet,
215 PsppireSheetRange *old_range,
216 PsppireSheetRange *new_range);
218 gboolean (*traverse) (PsppireSheet *sheet,
219 gint row, gint column,
220 gint *new_row, gint *new_column);
222 gboolean (*activate) (PsppireSheet *sheet,
223 gint row, gint column);
225 void (*changed) (PsppireSheet *sheet,
226 gint row, gint column);
229 GType psppire_sheet_get_type (void);
230 GtkType psppire_sheet_range_get_type (void);
233 /* create a new sheet */
234 GtkWidget * psppire_sheet_new (PsppireSheetModel *model);
236 /* create a new sheet with custom entry */
238 psppire_sheet_new_with_custom_entry (GtkType entry_type);
241 void psppire_sheet_change_entry (PsppireSheet *sheet, GtkType entry_type);
243 GtkEntry *psppire_sheet_get_entry (PsppireSheet *sheet);
246 void psppire_sheet_get_selected_range (PsppireSheet *sheet,
247 PsppireSheetRange *range);
249 void psppire_sheet_show_grid (PsppireSheet *sheet,
252 gboolean psppire_sheet_grid_visible (PsppireSheet *sheet);
255 /* scroll the viewing area of the sheet to the given column
256 * and row; row_align and col_align are between 0-1 representing the
257 * location the row should appear on the screen, 0.0 being top or left,
258 * 1.0 being bottom or right; if row or column is negative then there
260 void psppire_sheet_moveto (PsppireSheet *sheet,
267 void psppire_sheet_show_row_titles (PsppireSheet *sheet);
268 void psppire_sheet_hide_row_titles (PsppireSheet *sheet);
269 void psppire_sheet_show_column_titles (PsppireSheet *sheet);
270 void psppire_sheet_hide_column_titles (PsppireSheet *sheet);
272 /* select the row. The range is then highlighted, and the bounds are stored
274 void psppire_sheet_select_row (PsppireSheet * sheet, gint row);
276 /* select the column. The range is then highlighted, and the bounds are stored
278 void psppire_sheet_select_column (PsppireSheet * sheet, gint column);
280 /* highlight the selected range and store bounds in sheet->range */
281 void psppire_sheet_select_range (PsppireSheet *sheet, const PsppireSheetRange *range);
283 void psppire_sheet_get_visible_range (PsppireSheet *sheet, PsppireSheetRange *range);
287 void psppire_sheet_unselect_range (PsppireSheet *sheet);
289 /* set active cell where the entry will be displayed */
290 void psppire_sheet_set_active_cell (PsppireSheet *sheet,
291 gint row, gint column);
293 /* Sets *ROW and *COLUMN to be the coordinates of the active cell.
294 ROW and/or COLUMN may be null if the caller is not interested in their
296 void psppire_sheet_get_active_cell (PsppireSheet *sheet,
297 gint *row, gint *column);
299 /* get cell contents */
300 gchar *psppire_sheet_cell_get_text (const PsppireSheet *sheet, gint row, gint col);
303 /* get cell attributes of the given cell */
304 /* TRUE means that the cell is currently allocated */
305 gboolean psppire_sheet_get_attributes (const PsppireSheet *sheet,
307 PsppireSheetCellAttr *attributes);
309 void psppire_sheet_set_model (PsppireSheet *sheet,
310 PsppireSheetModel *model);
312 PsppireSheetModel * psppire_sheet_get_model (const PsppireSheet *sheet);
318 #endif /* __PSPPIRE_SHEET_H__ */