1 #ifndef _GNM_SHEET_VIEW_H_
2 # define _GNM_SHEET_VIEW_H_
3 
4 #include <gnumeric.h>
5 #include <glib-object.h>
6 
7 G_BEGIN_DECLS
8 
9 typedef enum {
10 	GNM_SHEET_VIEW_NORMAL_MODE,
11 	GNM_SHEET_VIEW_PAGE_BREAK_MODE,
12 	GNM_SHEET_VIEW_LAYOUT_MODE
13 } GnmSheetViewMode;
14 
15 struct _SheetView {
16 	GObject  base;
17 
18 	Sheet		*sheet;
19 	WorkbookView	*sv_wbv;
20 	GPtrArray	*controls;
21 
22 	GList		*ants;	/* animated cursors */
23 
24 	/* an ordered list of Ranges, the first of which corresponds to the
25 	 * a normalized version of SheetView::{cursor.base_corner:move_corner}
26 	 */
27 	GSList		*selections;
28 	GSList		*selections_simplified;
29 	int              selection_mode; /* GnmSelectionMode */
30 
31 	GnmCellPos	 edit_pos;	/* Cell that would be edited */
32 	GnmCellPos	 edit_pos_real;	/* Even in the middle of a merged cell */
33 	int		 first_tab_col;	/* where to jump to after an Enter */
34 
35 	struct {
36 		/* Static corner to rubber band the selection range around */
37 		GnmCellPos	 base_corner;
38 		/* Corner that is moved when the selection range is extended */
39 		GnmCellPos	 move_corner;
40 	} cursor;
41 
42 	GnmCellPos initial_top_left;
43 	GnmCellPos frozen_top_left;
44 	GnmCellPos unfrozen_top_left;
45 
46 	/* state flags */
47 	unsigned char enable_insert_rows;
48 	unsigned char enable_insert_cols;
49 	unsigned char enable_insert_cells;
50 	unsigned char reposition_selection;
51 
52 	GnmSheetViewMode	view_mode;
53 
54 	/* TODO : these should be replaced with Dependents when we support
55 	 * format based dependents
56 	 */
57 	unsigned char selection_content_changed;
58 	struct {
59 		unsigned char location;
60 		unsigned char content; /* entered content NOT value */
61 		unsigned char style;
62 	} edit_pos_changed;
63 	guint            auto_expr_timer;
64 };
65 
66 typedef struct {
67 	GObjectClass parent_class;
68 } SheetViewClass;
69 
70 #define GNM_SHEET_VIEW_TYPE     (gnm_sheet_view_get_type ())
71 #define GNM_SHEET_VIEW(obj)     (G_TYPE_CHECK_INSTANCE_CAST ((obj), GNM_SHEET_VIEW_TYPE, SheetView))
72 #define GNM_IS_SHEET_VIEW(o)    (G_TYPE_CHECK_INSTANCE_TYPE ((o), GNM_SHEET_VIEW_TYPE))
73 
74 /* Lifecycle */
75 GType	      gnm_sheet_view_get_type (void);
76 SheetView    *gnm_sheet_view_new	  (Sheet *sheet, WorkbookView *wbv);
77 void	      gnm_sheet_view_attach_control  (SheetView *sv, SheetControl *sc);
78 void	      gnm_sheet_view_detach_control  (SheetView *sv, SheetControl *sc);
79 void	      gnm_sheet_view_weak_ref	  (SheetView *sv, SheetView **ptr);
80 void	      gnm_sheet_view_weak_unref	  (SheetView **ptr);
81 void	      gnm_sheet_view_update	  (SheetView *sv);
82 void          gnm_sheet_view_dispose      (SheetView *sv);
83 
84 /* Information */
85 Sheet	     *sv_sheet		(SheetView const *sv);
86 WorkbookView *sv_wbv		(SheetView const *sv);
87 gboolean      gnm_sheet_view_is_frozen	(SheetView const *sv);
88 
89 GnmFilter      *gnm_sheet_view_editpos_in_filter (SheetView const *sv);
90 GnmFilter      *gnm_sheet_view_selection_intersects_filter_rows (SheetView const *sv);
91 GnmRange       *gnm_sheet_view_selection_extends_filter (SheetView const *sv,
92 					     GnmFilter const *f);
93 GnmSheetSlicer *gnm_sheet_view_editpos_in_slicer (SheetView const *sv);
94 
95 /* Manipulation */
96 void	 gnm_sheet_view_flag_status_update_pos   (SheetView *sv, GnmCellPos const *pos);
97 void	 gnm_sheet_view_flag_status_update_range (SheetView *sv, GnmRange const *range);
98 void	 gnm_sheet_view_flag_style_update_range  (SheetView *sv, GnmRange const *range);
99 void	 gnm_sheet_view_flag_selection_change    (SheetView *sv);
100 
101 void	 gnm_sheet_view_unant	     (SheetView *sv);
102 void	 gnm_sheet_view_ant	     (SheetView *sv, GList *ranges);
103 gboolean gnm_sheet_view_selection_copy	(SheetView *sv, WorkbookControl *wbc);
104 gboolean gnm_sheet_view_selection_cut	(SheetView *sv, WorkbookControl *wbc);
105 
106 void	 gnm_sheet_view_make_cell_visible	(SheetView *sv, int col, int row,
107 				 gboolean couple_panes);
108 void	 gnm_sheet_view_redraw_range	(SheetView *sv, GnmRange const *r);
109 void	 gnm_sheet_view_redraw_headers	(SheetView const *sheet,
110 				 gboolean col, gboolean row,
111 				 GnmRange const* r);
112 void     gnm_sheet_view_resize		(SheetView *sv, gboolean force_scroll);
113 void     gnm_sheet_view_cursor_set		(SheetView *sv,
114 				 GnmCellPos const *edit,
115 				 int base_col, int base_row,
116 				 int move_col, int move_row,
117 				 GnmRange const *bound);
118 void     gnm_sheet_view_set_edit_pos	(SheetView *sv, GnmCellPos const *pos);
119 
120 void	 gnm_sheet_view_freeze_panes	(SheetView *sv,
121 				 GnmCellPos const *frozen_top_left,
122 				 GnmCellPos const *unfrozen_top_left);
123 void	 gnm_sheet_view_panes_insdel_colrow (SheetView *sv, gboolean is_cols,
124 				 gboolean is_insert, int start, int count);
125 void	 gnm_sheet_view_set_initial_top_left(SheetView *sv, int col, int row);
126 
127 #define SHEET_VIEW_FOREACH_CONTROL(sv, control, code)		\
128 do {								\
129 	int ctrlno;						\
130 	GPtrArray *controls = (sv)->controls;			\
131 	for (ctrlno = controls->len; ctrlno-- > 0 ;) {		\
132 		SheetControl *control =				\
133 			g_ptr_array_index (controls, ctrlno);	\
134 		code						\
135 	}							\
136 } while (0)
137 
138 G_END_DECLS
139 
140 #endif /* _GNM_SHEET_VIEW_H_ */
141