f6e420166af1a965c23747ed1c3004c91742e988
[pspp-builds.git] / lib / gtksheet / gtksheet.h
1 /* This version of GtkSheet has been heavily modified, for the specific
2    requirements of PSPPIRE. */
3
4
5 /* GtkSheet widget for Gtk+.
6  * Copyright (C) 1999-2001 Adrian E. Feiguin <adrian@ifir.ifir.edu.ar>
7  *
8  * Based on GtkClist widget by Jay Painter, but major changes.
9  * Memory allocation routines inspired on SC (Spreadsheet Calculator)
10  *
11  * This library is free software; you can redistribute it and/or
12  * modify it under the terms of the GNU Lesser General Public
13  * License as published by the Free Software Foundation; either
14  * version 2.1 of the License, or (at your option) any later version.
15  *
16  * This library is distributed in the hope that it will be useful,
17  * but WITHOUT ANY WARRANTY; without even the implied warranty of
18  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
19  * Lesser General Public License for more details.
20  *
21  * You should have received a copy of the GNU Lesser General Public
22  * License along with this library; if not, write to the Free Software
23  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
24  */
25
26 #ifndef __GTK_SHEET_H__
27 #define __GTK_SHEET_H__
28
29 #include <gtk/gtk.h>
30
31 #include "gtkextra-sheet.h"
32 #include "gsheetmodel.h"
33 #include "gsheet-column-iface.h"
34 #include "gsheet-row-iface.h"
35
36
37 #ifdef __cplusplus
38 extern "C" {
39 #endif /* __cplusplus */
40
41
42 typedef enum
43 {
44   GTK_SHEET_FOREGROUND,
45   GTK_SHEET_BACKGROUND,
46   GTK_SHEET_FONT,
47   GTK_SHEET_JUSTIFICATION,
48   GTK_SHEET_BORDER,
49   GTK_SHEET_BORDER_COLOR,
50   GTK_SHEET_IS_EDITABLE,
51   GTK_SHEET_IS_VISIBLE
52 } GtkSheetAttrType;
53
54 /* sheet->state */
55
56 enum
57 {
58   GTK_SHEET_NORMAL,
59   GTK_SHEET_ROW_SELECTED,
60   GTK_SHEET_COLUMN_SELECTED,
61   GTK_SHEET_RANGE_SELECTED
62 };
63
64
65 #define GTK_TYPE_SHEET_RANGE (gtk_sheet_range_get_type ())
66 #define GTK_TYPE_SHEET (gtk_sheet_get_type ())
67
68 #define GTK_SHEET(obj)          GTK_CHECK_CAST (obj, gtk_sheet_get_type (), GtkSheet)
69 #define GTK_SHEET_CLASS(klass)  GTK_CHECK_CLASS_CAST (klass, gtk_sheet_get_type (), GtkSheetClass)
70 #define GTK_IS_SHEET(obj)       GTK_CHECK_TYPE (obj, gtk_sheet_get_type ())
71
72 /* Public flags, for compatibility */
73
74 #define GTK_SHEET_ROW_FROZEN(sheet)      !gtk_sheet_rows_resizable (sheet)
75 #define GTK_SHEET_COLUMN_FROZEN(sheet)   !gtk_sheet_columns_resizable (sheet)
76 #define GTK_SHEET_AUTORESIZE(sheet)      gtk_sheet_autoresize (sheet)
77 #define GTK_SHEET_CLIP_TEXT(sheet)       gtk_sheet_clip_text (sheet)
78 #define GTK_SHEET_ROW_TITLES_VISIBLE(sheet)   gtk_sheet_row_titles_visible (sheet)
79 #define GTK_SHEET_COL_TITLES_VISIBLE(sheet)   gtk_sheet_column_titles_visible (sheet)
80 #define GTK_SHEET_AUTO_SCROLL(sheet)     gtk_sheet_autoscroll (sheet)
81 #define GTK_SHEET_JUSTIFY_ENTRY(sheet)   gtk_sheet_justify_entry (sheet)
82
83
84 typedef struct _GtkSheetClass GtkSheetClass;
85 typedef struct _GtkSheetCellAttr     GtkSheetCellAttr;
86 typedef struct _GtkSheetCell GtkSheetCell;
87
88
89 struct _GtkSheetCellAttr
90 {
91   GtkJustification justification;
92   const PangoFontDescription *font_desc;
93   GdkColor foreground;
94   GdkColor background;
95   GtkSheetCellBorder border;
96   gboolean is_editable;
97   gboolean is_visible;
98 };
99
100 struct _GtkSheetCell
101 {
102   gint row;
103   gint col;
104 };
105
106
107 struct _GtkSheet{
108   GtkContainer container;
109
110   GSheetColumn *column_geometry;
111   GSheetRow *row_geometry;
112
113   guint16 flags;
114
115   GSheetModel *model;
116
117   GtkSelectionMode selection_mode;
118   gboolean autoresize;
119   gboolean autoscroll;
120   gboolean clip_text;
121   gboolean justify_entry;
122
123   guint freeze_count;
124
125   /* Background colors */
126   GdkColor bg_color;
127   GdkColor grid_color;
128   gboolean show_grid;
129
130   /* sheet children */
131   GList *children;
132
133   /* allocation rectangle after the container_border_width
134      and the width of the shadow border */
135   GdkRectangle internal_allocation;
136
137   gchar *name;
138
139   gint16 column_requisition;
140   gint16 row_requisition;
141
142   gboolean rows_resizable;
143   gboolean columns_resizable;
144
145   /* Displayed range */
146   GtkSheetRange view;
147
148   /* active cell */
149   GtkSheetCell active_cell;
150   GtkWidget *sheet_entry;
151
152   GtkType entry_type;
153
154   /* expanding selection */
155   GtkSheetCell selection_cell;
156
157   /* timer for flashing clipped range */
158   gint32 clip_timer;
159   gint interval;
160
161   /* global selection button */
162   GtkWidget *button;
163
164   /* sheet state */
165   gint state;
166
167   /* selected range */
168   GtkSheetRange range;
169
170   /*the scrolling window and it's height and width to
171    * make things a little speedier */
172   GdkWindow *sheet_window;
173   guint sheet_window_width;
174   guint sheet_window_height;
175
176   /* sheet backing pixmap */
177   GdkPixmap *pixmap;
178
179   /* offsets for scrolling */
180   gint hoffset;
181   gint voffset;
182   gfloat old_hadjustment;
183   gfloat old_vadjustment;
184
185   /* border shadow style */
186   GtkShadowType shadow_type;
187
188   /* Column Titles */
189   GdkRectangle column_title_area;
190   GdkWindow *column_title_window;
191   gboolean column_titles_visible;
192
193   /* Row Titles */
194   GdkRectangle row_title_area;
195   GdkWindow *row_title_window;
196   gboolean row_titles_visible;
197
198   /*scrollbars*/
199   GtkAdjustment *hadjustment;
200   GtkAdjustment *vadjustment;
201
202   /* xor GC for the verticle drag line */
203   GdkGC *xor_gc;
204
205   /* gc for drawing unselected cells */
206   GdkGC *fg_gc;
207   GdkGC *bg_gc;
208
209   /* cursor used to indicate dragging */
210   GdkCursor *cursor_drag;
211
212   /* the current x-pixel location of the xor-drag vline */
213   gint x_drag;
214
215   /* the current y-pixel location of the xor-drag hline */
216   gint y_drag;
217
218   /* current cell being dragged */
219   GtkSheetCell drag_cell;
220   /* current range being dragged */
221   GtkSheetRange drag_range;
222
223   /* clipped range */
224   GtkSheetRange clip_range;
225 };
226
227 struct _GtkSheetClass
228 {
229  GtkContainerClass parent_class;
230
231  void (*set_scroll_adjustments) (GtkSheet *sheet,
232                                  GtkAdjustment *hadjustment,
233                                  GtkAdjustment *vadjustment);
234
235  void (*select_row)             (GtkSheet *sheet, gint row);
236
237  void (*select_column)          (GtkSheet *sheet, gint column);
238
239  void (*select_range)           (GtkSheet *sheet, GtkSheetRange *range);
240
241  void (*clip_range)             (GtkSheet *sheet, GtkSheetRange *clip_range);
242
243  void (*resize_range)           (GtkSheet *sheet,
244                                 GtkSheetRange *old_range,
245                                 GtkSheetRange *new_range);
246
247  void (*move_range)             (GtkSheet *sheet,
248                                 GtkSheetRange *old_range,
249                                 GtkSheetRange *new_range);
250
251  gboolean (*traverse)           (GtkSheet *sheet,
252                                 gint row, gint column,
253                                 gint *new_row, gint *new_column);
254
255  gboolean (*deactivate)         (GtkSheet *sheet,
256                                 gint row, gint column);
257
258  gboolean (*activate)           (GtkSheet *sheet,
259                                 gint row, gint column);
260
261  void (*set_cell)               (GtkSheet *sheet,
262                                 gint row, gint column);
263
264  void (*clear_cell)             (GtkSheet *sheet,
265                                 gint row, gint column);
266
267  void (*changed)                (GtkSheet *sheet,
268                                 gint row, gint column);
269
270  void (*new_column_width)       (GtkSheet *sheet,
271                                  gint col,
272                                  guint width);
273
274  void (*new_row_height)         (GtkSheet *sheet,
275                                  gint row,
276                                  guint height);
277
278 };
279
280 GType gtk_sheet_get_type (void);
281 GtkType gtk_sheet_range_get_type (void);
282
283
284 /* create a new sheet */
285 GtkWidget * gtk_sheet_new (GSheetRow *vgeo, GSheetColumn *hgeo,
286                            const gchar *title,
287                            GSheetModel *model);
288
289
290
291
292 /* create a new browser sheet. It cells can not be edited */
293 GtkWidget *
294 gtk_sheet_new_browser                   (guint rows, guint columns, const gchar *title);
295
296 void
297 gtk_sheet_construct_browser             (GtkSheet *sheet,
298                                          guint rows, guint columns, const gchar *title);
299
300 /* create a new sheet with custom entry */
301 GtkWidget *
302 gtk_sheet_new_with_custom_entry         (GSheetRow *vgeo,
303                                          GSheetColumn *hgeo,
304                                          const gchar *title,
305                                          GtkType entry_type);
306 void
307 gtk_sheet_construct_with_custom_entry   (GtkSheet *sheet,
308                                          GSheetRow *vgeo,
309                                          GSheetColumn *hgeo,
310                                          const gchar *title,
311                                          GtkType entry_type);
312 /* change scroll adjustments */
313 void
314 gtk_sheet_set_hadjustment               (GtkSheet *sheet,
315                                          GtkAdjustment *adjustment);
316 void
317 gtk_sheet_set_vadjustment               (GtkSheet *sheet,
318                                          GtkAdjustment *adjustment);
319 /* Change entry */
320 void
321 gtk_sheet_change_entry                  (GtkSheet *sheet, GtkType entry_type);
322
323 /* Returns sheet's entry widget */
324 GtkWidget *
325 gtk_sheet_get_entry                     (GtkSheet *sheet);
326 GtkWidget *
327 gtk_sheet_get_entry_widget              (GtkSheet *sheet);
328
329 /* Returns sheet->state
330  * Added by Steven Rostedt <steven.rostedt@lmco.com> */
331 gint
332 gtk_sheet_get_state                     (GtkSheet *sheet);
333
334 /* Returns sheet's ranges
335  * Added by Murray Cumming */
336 guint
337 gtk_sheet_get_columns_count             (GtkSheet *sheet);
338
339 guint
340 gtk_sheet_get_rows_count                (GtkSheet *sheet);
341
342 void
343 gtk_sheet_get_visible_range             (GtkSheet *sheet,
344                                          GtkSheetRange *range);
345 void
346 gtk_sheet_set_selection_mode            (GtkSheet *sheet, gint mode);
347
348 void
349 gtk_sheet_set_autoresize                (GtkSheet *sheet, gboolean autoresize);
350
351 gboolean
352 gtk_sheet_autoresize                    (GtkSheet *sheet);
353
354 void
355 gtk_sheet_set_autoscroll                (GtkSheet *sheet, gboolean autoscroll);
356
357 gboolean
358 gtk_sheet_autoscroll                    (GtkSheet *sheet);
359
360 void
361 gtk_sheet_set_clip_text                 (GtkSheet *sheet, gboolean clip_text);
362
363 gboolean
364 gtk_sheet_clip_text                     (GtkSheet *sheet);
365
366 void
367 gtk_sheet_set_justify_entry             (GtkSheet *sheet, gboolean justify);
368
369 gboolean
370 gtk_sheet_justify_entry                 (GtkSheet *sheet);
371
372 void
373 gtk_sheet_set_locked                    (GtkSheet *sheet, gboolean lock);
374
375 gboolean
376 gtk_sheet_locked                        (const GtkSheet *sheet);
377
378 /* set sheet title */
379 void
380 gtk_sheet_set_title                     (GtkSheet *sheet, const gchar *title);
381
382 /* freeze all visual updates of the sheet.
383  * Then thaw the sheet after you have made a number of changes.
384  * The updates will occure in a more efficent way than if
385  * you made them on a unfrozen sheet */
386 void
387 gtk_sheet_freeze                        (GtkSheet *sheet);
388 void
389 gtk_sheet_thaw                          (GtkSheet *sheet);
390 /* Background colors */
391 void
392 gtk_sheet_set_background                (GtkSheet *sheet,
393                                          GdkColor *bg_color);
394 void
395 gtk_sheet_set_grid                      (GtkSheet *sheet,
396                                          GdkColor *grid_color);
397 void
398 gtk_sheet_show_grid                     (GtkSheet *sheet,
399                                          gboolean show);
400 gboolean
401 gtk_sheet_grid_visible                  (GtkSheet *sheet);
402
403 /* set/get column title */
404 void
405 gtk_sheet_set_column_title              (GtkSheet * sheet,
406                                         gint column,
407                                         const gchar * title);
408
409 const gchar *
410 gtk_sheet_get_column_title              (GtkSheet * sheet,
411                                         gint column);
412
413 /* set/get row title */
414 void
415 gtk_sheet_set_row_title                 (GtkSheet * sheet,
416                                         gint row,
417                                         const gchar * title);
418 const gchar *
419 gtk_sheet_get_row_title                 (GtkSheet * sheet,
420                                         gint row);
421
422
423 /* set/get button label */
424 void
425 gtk_sheet_row_button_add_label          (GtkSheet *sheet,
426                                         gint row, const gchar *label);
427 const gchar *
428 gtk_sheet_row_button_get_label          (GtkSheet *sheet,
429                                         gint row);
430 void
431 gtk_sheet_row_button_justify            (GtkSheet *sheet,
432                                         gint row, GtkJustification justification);
433
434
435
436 /* scroll the viewing area of the sheet to the given column
437  * and row; row_align and col_align are between 0-1 representing the
438  * location the row should appear on the screen, 0.0 being top or left,
439  * 1.0 being bottom or right; if row or column is negative then there
440  * is no change */
441 void
442 gtk_sheet_moveto (GtkSheet *sheet,
443                   gint row,
444                   gint column,
445                   gfloat row_align,
446                   gfloat col_align);
447
448
449 void
450 gtk_sheet_show_row_titles               (GtkSheet *sheet);
451 void
452 gtk_sheet_hide_row_titles               (GtkSheet *sheet);
453 gboolean
454 gtk_sheet_row_titles_visible            (GtkSheet *sheet);
455
456
457 /* set row button sensitivity. If sensitivity is TRUE can be toggled,
458  * otherwise it acts as a title */
459 void
460 gtk_sheet_row_set_sensitivity           (GtkSheet *sheet,
461                                         gint row,  gboolean sensitive);
462
463 /* set sensitivity for all row buttons */
464 void
465 gtk_sheet_rows_set_sensitivity          (GtkSheet *sheet, gboolean sensitive);
466 void
467 gtk_sheet_rows_set_resizable            (GtkSheet *sheet, gboolean resizable);
468 gboolean
469 gtk_sheet_rows_resizable                (GtkSheet *sheet);
470
471 /* set row visibility. The default value is TRUE. If FALSE, the
472  * row is hidden */
473 void
474 gtk_sheet_row_set_visibility            (GtkSheet *sheet,
475                                          gint row, gboolean visible);
476 void
477 gtk_sheet_row_label_set_visibility      (GtkSheet *sheet,
478                                          gint row, gboolean visible);
479 void
480 gtk_sheet_rows_labels_set_visibility    (GtkSheet *sheet, gboolean visible);
481
482
483 /* select the row. The range is then highlighted, and the bounds are stored
484  * in sheet->range  */
485 void
486 gtk_sheet_select_row                    (GtkSheet * sheet,
487                                         gint row);
488
489 /* select the column. The range is then highlighted, and the bounds are stored
490  * in sheet->range  */
491 void
492 gtk_sheet_select_column                 (GtkSheet * sheet,
493                                         gint column);
494
495 /* save selected range to "clipboard" */
496 void
497 gtk_sheet_clip_range                    (GtkSheet *sheet, const GtkSheetRange *range);
498 /* free clipboard */
499 void
500 gtk_sheet_unclip_range                  (GtkSheet *sheet);
501
502 gboolean
503 gtk_sheet_in_clip                       (GtkSheet *sheet);
504
505 /* get scrollbars adjustment */
506 GtkAdjustment *
507 gtk_sheet_get_vadjustment               (GtkSheet * sheet);
508 GtkAdjustment *
509 gtk_sheet_get_hadjustment               (GtkSheet * sheet);
510
511 /* highlight the selected range and store bounds in sheet->range */
512 void gtk_sheet_select_range             (GtkSheet *sheet,
513                                          const GtkSheetRange *range);
514
515 /* obvious */
516 void gtk_sheet_unselect_range           (GtkSheet *sheet);
517
518 /* set active cell where the entry will be displayed
519  * returns FALSE if current cell can't be deactivated or
520  * requested cell can't be activated */
521 gboolean
522 gtk_sheet_set_active_cell               (GtkSheet *sheet,
523                                         gint row, gint column);
524 void
525 gtk_sheet_get_active_cell               (GtkSheet *sheet,
526                                         gint *row, gint *column);
527
528 /* set cell contents and allocate memory if needed */
529 void
530 gtk_sheet_set_cell                      (GtkSheet *sheet,
531                                         gint row, gint col,
532                                         GtkJustification justification,
533                                         const gchar *text);
534 void
535 gtk_sheet_set_cell_text                 (GtkSheet *sheet,
536                                         gint row, gint col,
537                                         const gchar *text);
538 /* get cell contents */
539 gchar *
540 gtk_sheet_cell_get_text                 (const GtkSheet *sheet, gint row, gint col);
541
542 /* clear cell contents */
543 void
544 gtk_sheet_cell_clear                    (GtkSheet *sheet, gint row, gint col);
545 /* clear cell contents and remove links */
546 void
547 gtk_sheet_cell_delete                   (GtkSheet *sheet, gint row, gint col);
548
549 /* clear range contents. If range==NULL the whole sheet will be cleared */
550 void
551 gtk_sheet_range_clear                   (GtkSheet *sheet,
552                                          const GtkSheetRange *range);
553 /* clear range contents and remove links */
554 void
555 gtk_sheet_range_delete                  (GtkSheet *sheet,
556                                          const GtkSheetRange *range);
557
558 /* get cell state: GTK_STATE_NORMAL, GTK_STATE_SELECTED */
559 GtkStateType
560 gtk_sheet_cell_get_state                (GtkSheet *sheet, gint row, gint col);
561
562 /* get row and column correspondig to the given position in the screen */
563 gboolean
564 gtk_sheet_get_pixel_info (GtkSheet * sheet,
565                           gint x,
566                           gint y,
567                           gint * row,
568                           gint * column);
569
570 /* get area of a given cell */
571 gboolean
572 gtk_sheet_get_cell_area (GtkSheet *sheet,
573                          gint row,
574                          gint column,
575                          GdkRectangle *area);
576
577 /* set row height */
578 void
579 gtk_sheet_set_row_height (GtkSheet * sheet,
580                           gint row,
581                           guint height);
582
583
584 /* delete nrows rows starting in row */
585 void
586 gtk_sheet_delete_rows                   (GtkSheet *sheet, guint row, guint nrows);
587
588 /* append nrows row to the end of the sheet */
589 void
590 gtk_sheet_add_row                       (GtkSheet *sheet, guint nrows);
591
592 /* insert nrows rows before the given row and pull right */
593 void
594 gtk_sheet_insert_rows                   (GtkSheet *sheet, guint row, guint nrows);
595
596 /* set abckground color of the given range */
597 void
598 gtk_sheet_range_set_background          (GtkSheet *sheet,
599                                         const GtkSheetRange *range,
600                                         const GdkColor *color);
601
602 /* set foreground color (text color) of the given range */
603 void
604 gtk_sheet_range_set_foreground          (GtkSheet *sheet,
605                                         const GtkSheetRange *range,
606                                         const GdkColor *color);
607
608 /* set text justification (GTK_JUSTIFY_LEFT, RIGHT, CENTER) of the given range.
609  * The default value is GTK_JUSTIFY_LEFT. If autoformat is on, the
610  * default justification for numbers is GTK_JUSTIFY_RIGHT */
611 void
612 gtk_sheet_range_set_justification       (GtkSheet *sheet,
613                                         const GtkSheetRange *range,
614                                         GtkJustification justification);
615 void
616 gtk_sheet_column_set_justification      (GtkSheet *sheet,
617                                         gint column,
618                                         GtkJustification justification);
619 /* set if cell contents can be edited or not in the given range:
620  * accepted values are TRUE or FALSE. */
621 void
622 gtk_sheet_range_set_editable            (GtkSheet *sheet,
623                                         const GtkSheetRange *range,
624                                         gint editable);
625
626 /* set if cell contents are visible or not in the given range:
627  * accepted values are TRUE or FALSE.*/
628 void
629 gtk_sheet_range_set_visible             (GtkSheet *sheet,
630                                         const GtkSheetRange *range,
631                                         gboolean visible);
632
633 /* set cell border style in the given range.
634  * mask values are CELL_LEFT_BORDER, CELL_RIGHT_BORDER, CELL_TOP_BORDER,
635  * CELL_BOTTOM_BORDER
636  * width is the width of the border line in pixels
637  * line_style is the line_style for the border line */
638 void
639 gtk_sheet_range_set_border              (GtkSheet *sheet,
640                                         const GtkSheetRange *range,
641                                         gint mask,
642                                         guint width,
643                                         gint line_style);
644
645 /* set border color for the given range */
646 void
647 gtk_sheet_range_set_border_color        (GtkSheet *sheet,
648                                         const GtkSheetRange *range,
649                                         const GdkColor *color);
650
651 /* set font for the given range */
652 void
653 gtk_sheet_range_set_font                (GtkSheet *sheet,
654                                         const GtkSheetRange *range,
655                                         PangoFontDescription *font);
656
657 /* get cell attributes of the given cell */
658 /* TRUE means that the cell is currently allocated */
659 gboolean
660 gtk_sheet_get_attributes                (const GtkSheet *sheet,
661                                         gint row, gint col,
662                                         GtkSheetCellAttr *attributes);
663
664
665 GtkSheetChild *
666 gtk_sheet_put                           (GtkSheet *sheet,
667                                          GtkWidget *widget,
668                                          gint x, gint y);
669 void
670 gtk_sheet_attach_floating               (GtkSheet *sheet,
671                                          GtkWidget *widget,
672                                          gint row, gint col);
673 void
674 gtk_sheet_attach_default                (GtkSheet *sheet,
675                                          GtkWidget *widget,
676                                          gint row, gint col);
677 void
678 gtk_sheet_attach                        (GtkSheet *sheet,
679                                          GtkWidget *widget,
680                                          gint row, gint col,
681                                          gint xoptions,
682                                          gint yoptions,
683                                          gint xpadding,
684                                          gint ypadding);
685
686
687 void
688 gtk_sheet_move_child                    (GtkSheet *sheet,
689                                          GtkWidget *widget,
690                                          gint x, gint y);
691
692 GtkSheetChild *
693 gtk_sheet_get_child_at                  (GtkSheet *sheet,
694                                          gint row, gint col);
695
696 void
697 gtk_sheet_button_attach                 (GtkSheet *sheet,
698                                          GtkWidget *widget,
699                                          gint row, gint col);
700
701
702
703 void           gtk_sheet_set_model (GtkSheet *sheet,
704                                    GSheetModel *model);
705
706 GSheetModel * gtk_sheet_get_model (const GtkSheet *sheet);
707
708
709 #ifdef __cplusplus
710 }
711 #endif /* __cplusplus */
712
713
714 #endif /* __GTK_SHEET_H__ */
715
716