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