GETENV: check for proper UTF-8.
[gnumeric.git] / src / sheet.h
blob6c08d4285ab768f017dd8cc75f64c1fce5085537
1 /* vim: set sw=8: -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
2 #ifndef _GNM_SHEET_H_
3 # define _GNM_SHEET_H_
5 #include "gnumeric.h"
6 #include "colrow.h"
7 #include "position.h"
8 #include <pango/pango.h>
9 #include <goffice/goffice.h>
10 #include "libgnumeric.h"
12 G_BEGIN_DECLS
14 GNM_VAR_DECL Sheet *invalid_sheet;
16 struct _GnmSheetSize {
17 int max_cols, max_rows;
19 GType gnm_sheet_size_get_type (void);
21 typedef struct _SheetPrivate SheetPrivate;
22 GType gnm_sheet_type_get_type (void);
23 #define GNM_SHEET_TYPE_TYPE (gnm_sheet_type_get_type ())
25 GType gnm_sheet_visibility_get_type (void);
26 #define GNM_SHEET_VISIBILITY_TYPE (gnm_sheet_visibility_get_type ())
28 struct _Sheet {
29 GObject base;
31 int index_in_wb;
32 Workbook *workbook;
33 gboolean being_invalidated;
34 gboolean being_constructed;
36 GOUndoGroup *revive;
38 GPtrArray *sheet_views;
40 char *name_quoted;
41 char *name_unquoted;
42 char *name_unquoted_collate_key;
43 char *name_case_insensitive;
45 GnmSheetStyleData *style_data; /* See sheet-style.c */
47 ColRowCollection cols, rows;
49 GHashTable *cell_hash; /* The cells in hashed format */
51 GnmNamedExprCollection *names;
53 /* This should eventually be moved to the views. */
54 double last_zoom_factor_used;
55 GnmRenderedValueCollection *rendered_values;
57 GSList *sheet_objects; /* List of objects in this sheet */
58 GnmCellPos max_object_extent;
60 /* Sheet level preferences */
61 GnmConventions const *convs;
62 gboolean display_formulas;
63 gboolean hide_zero;
64 gboolean hide_grid;
65 gboolean hide_col_header;
66 gboolean hide_row_header;
67 gboolean is_protected;
68 struct {
69 gboolean edit_objects; /* TODO */
70 gboolean edit_scenarios; /* TODO */
71 gboolean cell_formatting; /* TODO */
72 gboolean column_formatting; /* TODO */
73 gboolean row_formatting; /* TODO */
74 gboolean insert_columns; /* TODO */
75 gboolean insert_rows; /* TODO */
76 gboolean insert_hyperlinks; /* TODO */
77 gboolean delete_columns; /* TODO */
78 gboolean delete_rows; /* TODO */
79 gboolean select_locked_cells; /* Partial : TODO range selection */
80 gboolean sort_ranges; /* TODO */
81 gboolean edit_auto_filters; /* TODO */
82 gboolean edit_pivottable; /* TODO */
83 gboolean select_unlocked_cells; /* Partial : TODO range selection */
84 } protected_allow;
86 GnmSheetVisibility visibility;
88 gboolean display_outlines;
89 gboolean outline_symbols_below;
90 gboolean outline_symbols_right;
91 gboolean text_is_rtl;
93 gboolean has_filtered_rows;
95 GnmSolverParameters *solver_parameters;
96 GList *scenarios;
97 GHashTable *sort_setups;
99 gint simulation_round;
101 GnmDepContainer *deps;
103 GSList *slicers;
104 GSList *filters;
105 GSList *list_merged;
106 GHashTable *hash_merged;
107 SheetPrivate *priv;
108 GnmPrintInformation *print_info;
109 GnmColor *tab_color;
110 GnmColor *tab_text_color;
111 GnmSheetType sheet_type;
113 GnmSheetSize size;
115 /* tile related data */
116 int tile_top_level;
119 #define GNM_SHEET_TYPE (gnm_sheet_get_type ())
120 #define SHEET(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GNM_SHEET_TYPE, Sheet))
121 #define IS_SHEET(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), GNM_SHEET_TYPE))
122 #define GNM_SHEET_CLASS(k) (G_TYPE_CHECK_CLASS_CAST ((k), GNM_SHEET_TYPE, GnmSheetClass))
123 GType gnm_sheet_get_type (void);
125 Sheet *sheet_new (Workbook *wb, char const *name, int columns, int rows);
126 Sheet *sheet_new_with_type (Workbook *wb, char const *name,
127 GnmSheetType type, int columns, int rows);
128 Sheet *sheet_dup (Sheet const *source_sheet);
129 void sheet_destroy_contents (Sheet *sheet);
131 gboolean gnm_sheet_valid_size (int cols, int rows);
132 void gnm_sheet_suggest_size (int *cols, int *rows);
134 GOUndo *gnm_sheet_resize (Sheet *sheet, int cols, int rows,
135 GOCmdContext *cc, gboolean *perr);
137 GnmSheetSize const *gnm_sheet_get_size (Sheet const *sheet);
138 GnmSheetSize const *gnm_sheet_get_size2 (Sheet const *sheet,
139 Workbook const *wb);
140 #define gnm_sheet_get_max_rows(sheet) (gnm_sheet_get_size(sheet)->max_rows)
141 #define gnm_sheet_get_max_cols(sheet) (gnm_sheet_get_size(sheet)->max_cols)
142 #define gnm_sheet_get_last_col(sheet) (gnm_sheet_get_max_cols(sheet) - 1)
143 #define gnm_sheet_get_last_row(sheet) (gnm_sheet_get_max_rows(sheet) - 1)
145 /* GnmCell management */
146 GnmCell *sheet_cell_get (Sheet const *sheet, int col, int row);
147 GnmCell *sheet_cell_fetch (Sheet *sheet, int col, int row);
148 GnmCell *sheet_cell_create (Sheet *sheet, int col, int row);
149 void sheet_cell_remove (Sheet *sheet, GnmCell *cell,
150 gboolean redraw, gboolean queue_recalc);
151 /* TODO TODO TODO
152 * Merge with sheet_cell_foreach
155 struct _GnmCellIter {
156 GnmCell *cell;
157 GnmParsePos pp;
158 ColRowInfo *ci, *ri;
160 GnmValue *sheet_foreach_cell_in_range (Sheet *sheet, CellIterFlags flags,
161 int start_col, int start_row,
162 int end_col, int end_row,
163 CellIterFunc callback,
164 gpointer closure);
165 void sheet_cell_foreach (Sheet const *sheet,
166 GHFunc callback, gpointer data);
167 unsigned sheet_cells_count (Sheet const *sheet);
168 GPtrArray *sheet_cell_positions (Sheet *sheet, gboolean comments);
170 GPtrArray *sheet_cells (Sheet *sheet, const GnmRange *r);
172 void sheet_recompute_spans_for_col (Sheet *sheet, int col);
174 gboolean sheet_is_region_empty (Sheet *sheet, GnmRange const *r);
175 gboolean sheet_is_cell_empty (Sheet *sheet, int col, int row);
177 gboolean sheet_col_is_hidden (Sheet const *sheet, int col);
178 gboolean sheet_row_is_hidden (Sheet const *sheet, int row);
180 GnmComment *sheet_get_comment (Sheet const *sheet,
181 GnmCellPos const *pos);
183 int sheet_find_boundary_horizontal (Sheet *sheet, int col, int move_row,
184 int base_row, int count,
185 gboolean jump_to_boundaries);
186 int sheet_find_boundary_vertical (Sheet *sheet, int move_col, int row,
187 int base_col, int count,
188 gboolean jump_to_boundaries);
190 ColRowInfo const *sheet_colrow_get_default (Sheet const *sheet,
191 gboolean is_cols);
193 void sheet_colrow_optimize (Sheet *sheet);
195 /* Returns a pointer to a ColRowInfo: existing or NULL */
196 ColRowInfo *sheet_col_get (Sheet const *sheet, int col);
197 ColRowInfo *sheet_row_get (Sheet const *sheet, int row);
198 ColRowInfo *sheet_colrow_get (Sheet const *sheet,
199 int colrow, gboolean is_cols);
200 /* Returns a pointer to a ColRowInfo: existing or freshly created */
201 ColRowInfo *sheet_col_fetch (Sheet *sheet, int col);
202 ColRowInfo *sheet_row_fetch (Sheet *sheet, int row);
203 ColRowInfo *sheet_colrow_fetch (Sheet *sheet,
204 int colrow, gboolean is_cols);
205 /* Returns a pointer to a ColRowInfo: existing or default */
206 ColRowInfo const *sheet_col_get_info (Sheet const *sheet, int col);
207 ColRowInfo const *sheet_row_get_info (Sheet const *sheet, int row);
208 ColRowInfo const *sheet_colrow_get_info (Sheet const *sheet,
209 int colrow, gboolean is_cols);
212 * Definitions of row/col size terminology :
214 * _pixels == measurments are in screen pixels.
215 * _pts == measurments are in 'points' and should be the same size on all displays
216 * (printers and monitors).
218 * distance == pixels from the leading edge of the 'from' col/row
219 * to the leading edge of the 'to' col/row
220 * INCLUDING all internal margins.
221 * INCLUDING the leading grid line
222 * EXCLUDING the trailing grid line.
224 * _default == The size of all cols/rows that do not have explicit sizes.
226 /* Col width */
227 double sheet_col_get_distance_pts (Sheet const *sheet, int from_col, int to_col);
228 int sheet_col_get_distance_pixels (Sheet const *sheet, int from_col, int to_col);
229 void sheet_col_set_size_pts (Sheet *sheet, int col, double width_pts,
230 gboolean set_by_user);
231 void sheet_col_set_size_pixels (Sheet *sheet, int col, int width_pixels,
232 gboolean set_by_user);
233 double sheet_col_get_default_size_pts (Sheet const *sheet);
234 int sheet_col_get_default_size_pixels (Sheet const *sheet);
235 void sheet_col_set_default_size_pts (Sheet *sheet, double width_pts);
236 void sheet_col_set_default_size_pixels (Sheet *sheet, int width_pixels);
238 /* Row height */
239 double sheet_row_get_distance_pts (Sheet const *sheet, int from_row, int to_row);
240 int sheet_row_get_distance_pixels (Sheet const *sheet, int from, int to);
241 void sheet_row_set_size_pts (Sheet *sheet, int row, double height_pts,
242 gboolean set_by_user);
243 void sheet_row_set_size_pixels (Sheet *sheet, int row, int height_pixels,
244 gboolean set_by_user);
245 double sheet_row_get_default_size_pts (Sheet const *sheet);
246 int sheet_row_get_default_size_pixels (Sheet const *sheet);
247 void sheet_row_set_default_size_pts (Sheet *sheet, double height_pts);
248 void sheet_row_set_default_size_pixels (Sheet *sheet, int height_pixels);
250 /* Find minimum pixel size to display contents (including margins and far grid line) */
251 int sheet_col_size_fit_pixels (Sheet *sheet, int col,
252 int srow, int erow,
253 gboolean ignore_strings);
254 int sheet_row_size_fit_pixels (Sheet *sheet, int row,
255 int scol, int ecol,
256 gboolean ignore_strings);
258 gboolean sheet_colrow_can_group (Sheet *sheet, GnmRange const *r,
259 gboolean is_cols);
260 gboolean sheet_colrow_group_ungroup (Sheet *sheet, GnmRange const *r,
261 gboolean is_cols, gboolean inc);
262 void sheet_colrow_gutter (Sheet *sheet,
263 gboolean is_cols, int max_outline);
265 gboolean sheet_range_splits_array (Sheet const *sheet,
266 GnmRange const *r, GnmRange const *ignore,
267 GOCmdContext *cc, char const *cmd);
268 gboolean sheet_range_splits_region (Sheet const *sheet,
269 GnmRange const *r, GnmRange const *ignore,
270 GOCmdContext *cc, char const *cmd);
271 gboolean sheet_ranges_split_region (Sheet const *sheet, GSList const *ranges,
272 GOCmdContext *cc, char const *cmd);
273 gboolean sheet_range_contains_merges_or_arrays (Sheet const *sheet,
274 GnmRange const *r,
275 GOCmdContext *cc,
276 char const *cmd,
277 gboolean merges,
278 gboolean arrays);
279 void sheet_range_bounding_box (Sheet const *sheet, GnmRange *r);
280 gboolean sheet_range_trim (Sheet const *sheet, GnmRange *r,
281 gboolean cols, gboolean rows);
282 gboolean sheet_range_has_heading (Sheet const *sheet, GnmRange const *src,
283 gboolean top, gboolean ignore_styles);
286 void gnm_sheet_foreach_name (Sheet const *sheet, GHFunc func, gpointer data);
288 void gnm_sheet_set_solver_params (Sheet *sheet, GnmSolverParameters *param);
290 GnmScenario *gnm_sheet_scenario_new (Sheet *sheet, const char *name);
291 GnmScenario *gnm_sheet_scenario_find (Sheet *sheet, const char *name);
292 void gnm_sheet_scenario_add (Sheet *sheet, GnmScenario *sc);
293 void gnm_sheet_scenario_remove (Sheet *sheet, GnmScenario *sc);
295 GHashTable *gnm_sheet_get_sort_setups (Sheet *sheet);
296 void gnm_sheet_add_sort_setup (Sheet *sheet, char *key, gpointer setup);
297 gconstpointer gnm_sheet_find_sort_setup (Sheet *sheet, char const *key);
299 /* Redraw */
300 #define sheet_is_visible(_sheet) ((_sheet)->visibility == GNM_SHEET_VISIBILITY_VISIBLE)
301 void sheet_redraw_all (Sheet const *sheet, gboolean header);
302 void sheet_redraw_range (Sheet const *sheet, GnmRange const *r);
303 void sheet_redraw_region (Sheet const *sheet,
304 int start_col, int start_row,
305 int end_col, int end_row);
307 void sheet_flag_status_update_cell (GnmCell const *cell);
308 void sheet_flag_status_update_range (Sheet const *sheet, GnmRange const *range);
309 void sheet_flag_style_update_range (Sheet const *sheet, GnmRange const *range);
310 void sheet_flag_recompute_spans (Sheet const *sheet);
311 void sheet_update_only_grid (Sheet const *sheet);
312 void sheet_update (Sheet const *sheet);
313 void sheet_scrollbar_config (Sheet const *sheet);
315 void sheet_mark_dirty (Sheet *sheet);
316 GnmRange sheet_get_extent (Sheet const *sheet,
317 gboolean spans_and_merges_extend,
318 gboolean include_hidden);
319 GnmRange sheet_get_cells_extent (Sheet const *sheet);
320 GnmRange sheet_get_printarea (Sheet const *sheet,
321 gboolean include_styles,
322 gboolean ignore_printarea);
323 GnmRange *sheet_get_nominal_printarea (Sheet const *sheet);
326 * Utilities to set cell contents, queueing recalcs,
327 * redraws and rendering as required. Does NOT check for
328 * division of arrays.
330 void sheet_cell_set_expr (GnmCell *cell, GnmExprTop const *texpr);
331 void sheet_cell_set_value (GnmCell *cell, GnmValue *v);
332 void sheet_cell_set_text (GnmCell *cell, char const *str,
333 PangoAttrList *markup);
334 GnmValue const *sheet_cell_get_value(Sheet *sheet, int col, int row);
335 void sheet_range_set_text (GnmParsePos const *pos,
336 GnmRange const *r, char const *str);
337 GOUndo * sheet_range_set_text_undo (GnmSheetRange *sr,
338 char const *text);
339 GOUndo * sheet_range_set_expr_undo (GnmSheetRange *sr,
340 GnmExprTop const *texpr);
341 GOUndo * sheet_range_set_markup_undo (GnmSheetRange *sr,
342 PangoAttrList *markup);
343 void sheet_apply_style (Sheet *sheet, GnmRange const *range, GnmStyle *mstyle);
344 GOUndo * sheet_apply_style_undo (GnmSheetRange *sr,
345 GnmStyle *style);
346 void sheet_apply_border (Sheet *sheet, GnmRange const *range, GnmBorder **borders);
347 void sheet_queue_respan (Sheet const *sheet, int start_row, int end_row);
348 void sheet_cell_queue_respan (GnmCell *cell);
349 void sheet_range_calc_spans (Sheet *sheet, GnmRange const *r, GnmSpanCalcFlags flags);
351 void sheet_set_outline_direction (Sheet *sheet, gboolean is_cols);
352 gboolean sheet_selection_is_allowed (Sheet const *sheet, GnmCellPos const *pos);
354 GnmConventions const *sheet_get_conventions (Sheet const *sheet);
356 gboolean sheet_insert_cols (Sheet *sheet, int col, int count,
357 GOUndo **pundo, GOCmdContext *cc);
358 gboolean sheet_delete_cols (Sheet *sheet, int col, int count,
359 GOUndo **pundo, GOCmdContext *cc);
360 gboolean sheet_insert_rows (Sheet *sheet, int row, int count,
361 GOUndo **pundo, GOCmdContext *cc);
362 gboolean sheet_delete_rows (Sheet *sheet, int row, int count,
363 GOUndo **pundo, GOCmdContext *cc);
364 void sheet_move_range (GnmExprRelocateInfo const *rinfo,
365 GOUndo **pundo, GOCmdContext *cc);
367 typedef enum {
368 CLEAR_VALUES = 0x01,
369 CLEAR_FORMATS = 0x02,
370 CLEAR_COMMENTS = 0x04,
371 CLEAR_NOCHECKARRAY = 0x08,
372 CLEAR_NORESPAN = 0x10,
373 CLEAR_RECALC_DEPS = 0x20,
374 CLEAR_MERGES = 0x40,
375 CLEAR_OBJECTS = 0x80,
376 CLEAR_FILTERED_ONLY = 0x100
377 } SheetClearFlags;
379 void sheet_clear_region (Sheet *sheet,
380 int start_col, int start_row,
381 int end_col, int end_row,
382 int clear_flags, GOCmdContext *cc);
384 GOUndo *sheet_clear_region_undo (GnmSheetRange *sr,
385 int clear_flags);
387 SheetView *sheet_get_view (Sheet const *sheet, WorkbookView const *wbv);
389 #define SHEET_FOREACH_VIEW(sheet, view, code) \
390 do { \
391 int InD; \
392 GPtrArray *views = (sheet)->sheet_views; \
393 if (views != NULL) /* Reverse is important during destruction */ \
394 for (InD = views->len; InD-- > 0; ) { \
395 SheetView *view = g_ptr_array_index (views, InD); \
396 code \
398 } while (0)
400 #define SHEET_FOREACH_CONTROL(sheet, view, control, code) \
401 SHEET_FOREACH_VIEW((sheet), view, \
402 SHEET_VIEW_FOREACH_CONTROL(view, control, code);)
405 * Walk the dependents. WARNING: Note, that it is only valid to muck with
406 * the current dependency in the code.
408 #define SHEET_FOREACH_DEPENDENT(sheet, dep, code) \
409 do { \
410 /* Maybe external deps here. */ \
412 if ((sheet)->deps) { \
413 DEPENDENT_CONTAINER_FOREACH_DEPENDENT ((sheet)->deps, dep, code); \
415 } while (0)
417 G_END_DECLS
419 #endif /* _GNM_SHEET_H_ */