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