b228a1fbb517495644b19d2511085bfaa02b7556
[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_ROW_TITLES_VISIBLE(sheet)   gtk_sheet_row_titles_visible (sheet)
78 #define GTK_SHEET_COL_TITLES_VISIBLE(sheet)   gtk_sheet_column_titles_visible (sheet)
79 #define GTK_SHEET_AUTO_SCROLL(sheet)     gtk_sheet_autoscroll (sheet)
80 #define GTK_SHEET_JUSTIFY_ENTRY(sheet)   gtk_sheet_justify_entry (sheet)
81
82
83 typedef struct _GtkSheetClass GtkSheetClass;
84 typedef struct _GtkSheetCellAttr     GtkSheetCellAttr;
85 typedef struct _GtkSheetCell GtkSheetCell;
86 typedef struct _GtkSheetHoverTitle GtkSheetHoverTitle;
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 struct _GtkSheetHoverTitle
107 {
108   GtkWidget *window;
109   GtkWidget *label;
110   gint row, column;
111 };
112
113 struct _GtkSheet{
114   GtkContainer container;
115
116   GSheetColumn *column_geometry;
117   GSheetRow *row_geometry;
118
119   guint16 flags;
120
121   GSheetModel *model;
122
123   GtkSelectionMode selection_mode;
124   gboolean autoresize;
125   gboolean autoscroll;
126   gboolean justify_entry;
127
128   guint freeze_count;
129
130   /* Background colors */
131   GdkColor bg_color;
132   GdkColor grid_color;
133   gboolean show_grid;
134
135   /* sheet children */
136   GList *children;
137
138   /* allocation rectangle after the container_border_width
139      and the width of the shadow border */
140   GdkRectangle internal_allocation;
141
142   gchar *name;
143
144   gint16 column_requisition;
145   gint16 row_requisition;
146
147   gboolean rows_resizable;
148   gboolean columns_resizable;
149
150   /* active cell */
151   GtkSheetCell active_cell;
152   GtkWidget *sheet_entry;
153
154   GtkType entry_type;
155
156   /* expanding selection */
157   GtkSheetCell selection_cell;
158
159   /* global selection button */
160   GtkWidget *button;
161
162   /* sheet state */
163   gint state;
164
165   /* selected range */
166   GtkSheetRange range;
167
168   /*the scrolling window and it's height and width to
169    * make things a little speedier */
170   GdkWindow *sheet_window;
171   guint sheet_window_width;
172   guint sheet_window_height;
173
174   /* sheet backing pixmap */
175   GdkPixmap *pixmap;
176
177   /* offsets for scrolling */
178   gint hoffset;
179   gint voffset;
180   gfloat old_hadjustment;
181   gfloat old_vadjustment;
182
183   /* border shadow style */
184   GtkShadowType shadow_type;
185
186   /* Column Titles */
187   GdkRectangle column_title_area;
188   GdkWindow *column_title_window;
189   gboolean column_titles_visible;
190
191   /* Row Titles */
192   GdkRectangle row_title_area;
193   GdkWindow *row_title_window;
194   gboolean row_titles_visible;
195
196   /*scrollbars*/
197   GtkAdjustment *hadjustment;
198   GtkAdjustment *vadjustment;
199
200   /* xor GC for the verticle drag line */
201   GdkGC *xor_gc;
202
203   /* gc for drawing unselected cells */
204   GdkGC *fg_gc;
205   GdkGC *bg_gc;
206
207   /* cursor used to indicate dragging */
208   GdkCursor *cursor_drag;
209
210   /* the current x-pixel location of the xor-drag vline */
211   gint x_drag;
212
213   /* the current y-pixel location of the xor-drag hline */
214   gint y_drag;
215
216   /* current cell being dragged */
217   GtkSheetCell drag_cell;
218   /* current range being dragged */
219   GtkSheetRange drag_range;
220
221   /* Used for the subtitle (popups) */
222   gint motion_timer;
223   GtkSheetHoverTitle *hover_window;
224 };
225
226 struct _GtkSheetClass
227 {
228  GtkContainerClass parent_class;
229
230  void (*set_scroll_adjustments) (GtkSheet *sheet,
231                                  GtkAdjustment *hadjustment,
232                                  GtkAdjustment *vadjustment);
233
234  void (*select_row)             (GtkSheet *sheet, gint row);
235
236  void (*select_column)          (GtkSheet *sheet, gint column);
237
238  void (*select_range)           (GtkSheet *sheet, GtkSheetRange *range);
239
240  void (*resize_range)           (GtkSheet *sheet,
241                                 GtkSheetRange *old_range,
242                                 GtkSheetRange *new_range);
243
244  void (*move_range)             (GtkSheet *sheet,
245                                 GtkSheetRange *old_range,
246                                 GtkSheetRange *new_range);
247
248  gboolean (*traverse)           (GtkSheet *sheet,
249                                 gint row, gint column,
250                                 gint *new_row, gint *new_column);
251
252  gboolean (*deactivate)         (GtkSheet *sheet,
253                                 gint row, gint column);
254
255  gboolean (*activate)           (GtkSheet *sheet,
256                                 gint row, gint column);
257
258  void (*set_cell)               (GtkSheet *sheet,
259                                 gint row, gint column);
260
261  void (*clear_cell)             (GtkSheet *sheet,
262                                 gint row, gint column);
263
264  void (*changed)                (GtkSheet *sheet,
265                                 gint row, gint column);
266
267  void (*new_column_width)       (GtkSheet *sheet,
268                                  gint col,
269                                  guint width);
270
271  void (*new_row_height)         (GtkSheet *sheet,
272                                  gint row,
273                                  guint height);
274
275 };
276
277 GType gtk_sheet_get_type (void);
278 GtkType gtk_sheet_range_get_type (void);
279
280
281 /* create a new sheet */
282 GtkWidget * gtk_sheet_new (GSheetRow *vgeo, GSheetColumn *hgeo,
283                            const gchar *title,
284                            GSheetModel *model);
285
286
287
288
289 /* create a new browser sheet. It cells can not be edited */
290 GtkWidget *
291 gtk_sheet_new_browser                   (guint rows, guint columns, const gchar *title);
292
293 void
294 gtk_sheet_construct_browser             (GtkSheet *sheet,
295                                          guint rows, guint columns, const gchar *title);
296
297 /* create a new sheet with custom entry */
298 GtkWidget *
299 gtk_sheet_new_with_custom_entry         (GSheetRow *vgeo,
300                                          GSheetColumn *hgeo,
301                                          const gchar *title,
302                                          GtkType entry_type);
303 void
304 gtk_sheet_construct_with_custom_entry   (GtkSheet *sheet,
305                                          GSheetRow *vgeo,
306                                          GSheetColumn *hgeo,
307                                          const gchar *title,
308                                          GtkType entry_type);
309 /* change scroll adjustments */
310 void
311 gtk_sheet_set_hadjustment               (GtkSheet *sheet,
312                                          GtkAdjustment *adjustment);
313 void
314 gtk_sheet_set_vadjustment               (GtkSheet *sheet,
315                                          GtkAdjustment *adjustment);
316 /* Change entry */
317 void
318 gtk_sheet_change_entry                  (GtkSheet *sheet, GtkType entry_type);
319
320 /* Returns sheet's entry widget */
321 GtkWidget *
322 gtk_sheet_get_entry                     (GtkSheet *sheet);
323 GtkWidget *
324 gtk_sheet_get_entry_widget              (GtkSheet *sheet);
325
326 /* Returns sheet->state
327  * Added by Steven Rostedt <steven.rostedt@lmco.com> */
328 gint
329 gtk_sheet_get_state                     (GtkSheet *sheet);
330
331 /* Returns sheet's ranges
332  * Added by Murray Cumming */
333 guint
334 gtk_sheet_get_columns_count             (GtkSheet *sheet);
335
336 guint
337 gtk_sheet_get_rows_count                (GtkSheet *sheet);
338
339 void
340 gtk_sheet_get_visible_range             (GtkSheet *sheet,
341                                          GtkSheetRange *range);
342
343 void
344 gtk_sheet_get_selected_range            (GtkSheet *sheet,
345                                          GtkSheetRange *range);
346
347 void
348 gtk_sheet_set_selection_mode            (GtkSheet *sheet, gint mode);
349
350 void
351 gtk_sheet_set_autoresize                (GtkSheet *sheet, gboolean autoresize);
352
353 gboolean
354 gtk_sheet_autoresize                    (GtkSheet *sheet);
355
356 void
357 gtk_sheet_set_autoscroll                (GtkSheet *sheet, gboolean autoscroll);
358
359 gboolean
360 gtk_sheet_autoscroll                    (GtkSheet *sheet);
361
362 void
363 gtk_sheet_set_justify_entry             (GtkSheet *sheet, gboolean justify);
364
365 gboolean
366 gtk_sheet_justify_entry                 (GtkSheet *sheet);
367
368 void
369 gtk_sheet_set_locked                    (GtkSheet *sheet, gboolean lock);
370
371 gboolean
372 gtk_sheet_locked                        (const GtkSheet *sheet);
373
374 /* set sheet title */
375 void
376 gtk_sheet_set_title                     (GtkSheet *sheet, const gchar *title);
377
378 /* freeze all visual updates of the sheet.
379  * Then thaw the sheet after you have made a number of changes.
380  * The updates will occure in a more efficent way than if
381  * you made them on a unfrozen sheet */
382 void
383 gtk_sheet_freeze                        (GtkSheet *sheet);
384 void
385 gtk_sheet_thaw                          (GtkSheet *sheet);
386 /* Background colors */
387 void
388 gtk_sheet_set_background                (GtkSheet *sheet,
389                                          GdkColor *bg_color);
390 void
391 gtk_sheet_set_grid                      (GtkSheet *sheet,
392                                          GdkColor *grid_color);
393 void
394 gtk_sheet_show_grid                     (GtkSheet *sheet,
395                                          gboolean show);
396 gboolean
397 gtk_sheet_grid_visible                  (GtkSheet *sheet);
398
399 /* set/get column title */
400 void
401 gtk_sheet_set_column_title              (GtkSheet * sheet,
402                                         gint column,
403                                         const gchar * title);
404
405 const gchar *
406 gtk_sheet_get_column_title              (GtkSheet * sheet,
407                                         gint column);
408
409 /* set/get row title */
410 void
411 gtk_sheet_set_row_title                 (GtkSheet * sheet,
412                                         gint row,
413                                         const gchar * title);
414 const gchar *
415 gtk_sheet_get_row_title                 (GtkSheet * sheet,
416                                         gint row);
417
418
419 /* set/get button label */
420 void
421 gtk_sheet_row_button_add_label          (GtkSheet *sheet,
422                                         gint row, const gchar *label);
423 const gchar *
424 gtk_sheet_row_button_get_label          (GtkSheet *sheet,
425                                         gint row);
426 void
427 gtk_sheet_row_button_justify            (GtkSheet *sheet,
428                                         gint row, GtkJustification justification);
429
430
431
432 /* scroll the viewing area of the sheet to the given column
433  * and row; row_align and col_align are between 0-1 representing the
434  * location the row should appear on the screen, 0.0 being top or left,
435  * 1.0 being bottom or right; if row or column is negative then there
436  * is no change */
437 void
438 gtk_sheet_moveto (GtkSheet *sheet,
439                   gint row,
440                   gint column,
441                   gfloat row_align,
442                   gfloat col_align);
443
444
445 void
446 gtk_sheet_show_row_titles               (GtkSheet *sheet);
447 void
448 gtk_sheet_hide_row_titles               (GtkSheet *sheet);
449 gboolean
450 gtk_sheet_row_titles_visible            (GtkSheet *sheet);
451
452
453 /* set row button sensitivity. If sensitivity is TRUE can be toggled,
454  * otherwise it acts as a title */
455 void
456 gtk_sheet_row_set_sensitivity           (GtkSheet *sheet,
457                                         gint row,  gboolean sensitive);
458
459 /* set sensitivity for all row buttons */
460 void
461 gtk_sheet_rows_set_sensitivity          (GtkSheet *sheet, gboolean sensitive);
462 void
463 gtk_sheet_rows_set_resizable            (GtkSheet *sheet, gboolean resizable);
464 gboolean
465 gtk_sheet_rows_resizable                (GtkSheet *sheet);
466
467 /* set row visibility. The default value is TRUE. If FALSE, the
468  * row is hidden */
469 void
470 gtk_sheet_row_set_visibility            (GtkSheet *sheet,
471                                          gint row, gboolean visible);
472 void
473 gtk_sheet_row_label_set_visibility      (GtkSheet *sheet,
474                                          gint row, gboolean visible);
475 void
476 gtk_sheet_rows_labels_set_visibility    (GtkSheet *sheet, gboolean visible);
477
478
479 /* select the row. The range is then highlighted, and the bounds are stored
480  * in sheet->range  */
481 void
482 gtk_sheet_select_row                    (GtkSheet * sheet,
483                                         gint row);
484
485 /* select the column. The range is then highlighted, and the bounds are stored
486  * in sheet->range  */
487 void
488 gtk_sheet_select_column                 (GtkSheet * sheet,
489                                         gint column);
490
491 /* get scrollbars adjustment */
492 GtkAdjustment *
493 gtk_sheet_get_vadjustment               (GtkSheet * sheet);
494 GtkAdjustment *
495 gtk_sheet_get_hadjustment               (GtkSheet * sheet);
496
497 /* highlight the selected range and store bounds in sheet->range */
498 void gtk_sheet_select_range             (GtkSheet *sheet,
499                                          const GtkSheetRange *range);
500
501 /* obvious */
502 void gtk_sheet_unselect_range           (GtkSheet *sheet);
503
504 /* set active cell where the entry will be displayed
505  * returns FALSE if current cell can't be deactivated or
506  * requested cell can't be activated */
507 gboolean
508 gtk_sheet_set_active_cell               (GtkSheet *sheet,
509                                         gint row, gint column);
510
511 /* Sets *ROW and *COLUMN to be the coordinates of the active cell.
512    ROW and/or COLUMN may be null if the caller is not interested in their
513    values */
514 void
515 gtk_sheet_get_active_cell               (GtkSheet *sheet,
516                                         gint *row, gint *column);
517
518 /* set cell contents and allocate memory if needed */
519 void
520 gtk_sheet_set_cell                      (GtkSheet *sheet,
521                                         gint row, gint col,
522                                         GtkJustification justification,
523                                         const gchar *text);
524 void
525 gtk_sheet_set_cell_text                 (GtkSheet *sheet,
526                                         gint row, gint col,
527                                         const gchar *text);
528 /* get cell contents */
529 gchar *
530 gtk_sheet_cell_get_text                 (const GtkSheet *sheet, gint row, gint col);
531
532 /* clear cell contents */
533 void
534 gtk_sheet_cell_clear                    (GtkSheet *sheet, gint row, gint col);
535
536 /* clear range contents. If range==NULL the whole sheet will be cleared */
537 void
538 gtk_sheet_range_clear                   (GtkSheet *sheet,
539                                          const GtkSheetRange *range);
540
541 /* get cell state: GTK_STATE_NORMAL, GTK_STATE_SELECTED */
542 GtkStateType
543 gtk_sheet_cell_get_state                (GtkSheet *sheet, gint row, gint col);
544
545 /* get row and column correspondig to the given position in the screen */
546 gboolean
547 gtk_sheet_get_pixel_info (GtkSheet * sheet,
548                           gint x,
549                           gint y,
550                           gint * row,
551                           gint * column);
552
553 /* get area of a given cell */
554 gboolean
555 gtk_sheet_get_cell_area (GtkSheet *sheet,
556                          gint row,
557                          gint column,
558                          GdkRectangle *area);
559
560 /* set row height */
561 void
562 gtk_sheet_set_row_height (GtkSheet * sheet,
563                           gint row,
564                           guint height);
565
566
567 /* delete nrows rows starting in row */
568 void
569 gtk_sheet_delete_rows                   (GtkSheet *sheet, guint row, guint nrows);
570
571 /* append nrows row to the end of the sheet */
572 void
573 gtk_sheet_add_row                       (GtkSheet *sheet, guint nrows);
574
575 /* insert nrows rows before the given row and pull right */
576 void
577 gtk_sheet_insert_rows                   (GtkSheet *sheet, guint row, guint nrows);
578
579 /* set abckground color of the given range */
580 void
581 gtk_sheet_range_set_background          (GtkSheet *sheet,
582                                         const GtkSheetRange *range,
583                                         const GdkColor *color);
584
585 /* set foreground color (text color) of the given range */
586 void
587 gtk_sheet_range_set_foreground          (GtkSheet *sheet,
588                                         const GtkSheetRange *range,
589                                         const GdkColor *color);
590
591 /* set text justification (GTK_JUSTIFY_LEFT, RIGHT, CENTER) of the given range.
592  * The default value is GTK_JUSTIFY_LEFT. If autoformat is on, the
593  * default justification for numbers is GTK_JUSTIFY_RIGHT */
594 void
595 gtk_sheet_range_set_justification       (GtkSheet *sheet,
596                                         const GtkSheetRange *range,
597                                         GtkJustification justification);
598 void
599 gtk_sheet_column_set_justification      (GtkSheet *sheet,
600                                         gint column,
601                                         GtkJustification justification);
602 /* set if cell contents can be edited or not in the given range:
603  * accepted values are TRUE or FALSE. */
604 void
605 gtk_sheet_range_set_editable            (GtkSheet *sheet,
606                                         const GtkSheetRange *range,
607                                         gint editable);
608
609 /* set if cell contents are visible or not in the given range:
610  * accepted values are TRUE or FALSE.*/
611 void
612 gtk_sheet_range_set_visible             (GtkSheet *sheet,
613                                         const GtkSheetRange *range,
614                                         gboolean visible);
615
616 /* set cell border style in the given range.
617  * mask values are CELL_LEFT_BORDER, CELL_RIGHT_BORDER, CELL_TOP_BORDER,
618  * CELL_BOTTOM_BORDER
619  * width is the width of the border line in pixels
620  * line_style is the line_style for the border line */
621 void
622 gtk_sheet_range_set_border              (GtkSheet *sheet,
623                                         const GtkSheetRange *range,
624                                         gint mask,
625                                         guint width,
626                                         gint line_style);
627
628 /* set border color for the given range */
629 void
630 gtk_sheet_range_set_border_color        (GtkSheet *sheet,
631                                         const GtkSheetRange *range,
632                                         const GdkColor *color);
633
634 /* set font for the given range */
635 void
636 gtk_sheet_range_set_font                (GtkSheet *sheet,
637                                         const GtkSheetRange *range,
638                                         PangoFontDescription *font);
639
640 /* get cell attributes of the given cell */
641 /* TRUE means that the cell is currently allocated */
642 gboolean
643 gtk_sheet_get_attributes                (const GtkSheet *sheet,
644                                         gint row, gint col,
645                                         GtkSheetCellAttr *attributes);
646
647
648 GtkSheetChild *
649 gtk_sheet_put                           (GtkSheet *sheet,
650                                          GtkWidget *widget,
651                                          gint x, gint y);
652 void
653 gtk_sheet_attach_floating               (GtkSheet *sheet,
654                                          GtkWidget *widget,
655                                          gint row, gint col);
656 void
657 gtk_sheet_attach_default                (GtkSheet *sheet,
658                                          GtkWidget *widget,
659                                          gint row, gint col);
660 void
661 gtk_sheet_attach                        (GtkSheet *sheet,
662                                          GtkWidget *widget,
663                                          gint row, gint col,
664                                          gint xoptions,
665                                          gint yoptions,
666                                          gint xpadding,
667                                          gint ypadding);
668
669
670 void
671 gtk_sheet_move_child                    (GtkSheet *sheet,
672                                          GtkWidget *widget,
673                                          gint x, gint y);
674
675 GtkSheetChild *
676 gtk_sheet_get_child_at                  (GtkSheet *sheet,
677                                          gint row, gint col);
678
679 void
680 gtk_sheet_button_attach                 (GtkSheet *sheet,
681                                          GtkWidget *widget,
682                                          gint row, gint col);
683
684
685
686 void           gtk_sheet_set_model (GtkSheet *sheet,
687                                    GSheetModel *model);
688
689 GSheetModel * gtk_sheet_get_model (const GtkSheet *sheet);
690
691
692 #ifdef __cplusplus
693 }
694 #endif /* __cplusplus */
695
696
697 #endif /* __GTK_SHEET_H__ */
698
699