sheet.h 11.5 KB
Newer Older
Arturo Espinosa's avatar
Arturo Espinosa committed
1
2
#ifndef SHEET_H
#define SHEET_H
3

4
5
6
#define SHEET_MAX_ROWS (16 * 1024)
#define SHEET_MAX_COLS 256

7
8
typedef GList ColStyleList;

9
10
11
12
13
14
15
16
17
18
19
typedef struct {
	int start_col, start_row;
	int end_col, end_row;
} Range;

gboolean   range_contains (Range *range, int col, int row);

typedef struct {
	Range  range;
	Style  *style;
} StyleRegion;
20
21

typedef struct {
22
23
	char       *filename;
	
Arturo Espinosa's avatar
Arturo Espinosa committed
24
25
	GtkWidget  *toplevel;
	GtkWidget  *notebook;
26
27
28
29
30
31
	GtkWidget  *table;

	/* Edit area */
	GtkWidget  *ea_status;
	GtkWidget  *ea_button_box;
	GtkWidget  *ea_input;
Arturo Espinosa's avatar
Arturo Espinosa committed
32
33
34

	/* The auto-expression */
	ExprTree   *auto_expr;
35
	String     *auto_expr_desc;
Arturo Espinosa's avatar
Arturo Espinosa committed
36
	GnomeCanvasItem  *auto_expr_label;
Arturo Espinosa's avatar
Arturo Espinosa committed
37
	
Arturo Espinosa's avatar
Arturo Espinosa committed
38
	/* Styles */
Arturo Espinosa's avatar
Arturo Espinosa committed
39
	Style      style;
40
41

	/* The sheets */ 
Arturo Espinosa's avatar
Arturo Espinosa committed
42
	GHashTable *sheets;	/* keeps a list of the Sheets on this workbook */
43

44
	
45
46
47
	/* A list with all of the formulas */
	GList      *formula_cell_list;

Arturo Espinosa's avatar
Arturo Espinosa committed
48
49
	/* A queue with the cells to be evaluated */
	GList      *eval_queue;
50
	int        max_iterations;
51

52
53
	int        generation;
	
54
55
	/* The clipboard for this workbook */
	CellRegion *clipboard_contents;
Arturo Espinosa's avatar
Arturo Espinosa committed
56
57
} Workbook;

58
59
60
61
62
63
typedef struct {
	int        base_col, base_row;
	int        start_col, start_row;
	int        end_col, end_row;
} SheetSelection;

64
65
66
67
68
typedef enum {
	SHEET_MODE_SHEET,
	SHEET_MODE_CREATE_LINE,
	SHEET_MODE_CREATE_BOX,
	SHEET_MODE_CREATE_OVAL,
Miguel de Icaza's avatar
New:    
Miguel de Icaza committed
69
70
	SHEET_MODE_CREATE_ARROW,
	SHEET_MODE_OBJECT_SELECTED,
71
72
} SheetModeType;

Arturo Espinosa's avatar
Arturo Espinosa committed
73
typedef struct {
74
75
	int        signature;
	
Arturo Espinosa's avatar
Arturo Espinosa committed
76
	Workbook   *workbook;
Arturo Espinosa's avatar
Today:    
Arturo Espinosa committed
77
	GList      *sheet_views;
78
	
79
	char       *name;
80
81

	GList      *style_list;	/* The list of styles applied to the sheets */
82

83
	ColRowInfo default_col_style;
84
	GList      *cols_info;
85

86
	ColRowInfo default_row_style;
87
	GList      *rows_info;
Arturo Espinosa's avatar
Arturo Espinosa committed
88

89
	GHashTable *cell_hash;	/* The cells in hashed format */
90
91
92
93
94

	GList      *selections;

	int        max_col_used;
	int        max_row_used;
95

Arturo Espinosa's avatar
Today:    
Arturo Espinosa committed
96
97
	int         cursor_col, cursor_row;
	
98
99
	/* The list of formulas */
	GList      *formula_cell_list;
100

Arturo Espinosa's avatar
Today:    
Arturo Espinosa committed
101
102
	double     last_zoom_factor_used;

103
104
105
106
	/* Objects */
	SheetModeType mode;	/* Sheet mode */
	GList      *objects;	/* List of objects in the spreadsheet */
	GList      *coords;	/* During creation time: keeps click coordinates */
107
	void       *current_object;
108
	
Arturo Espinosa's avatar
Today:    
Arturo Espinosa committed
109
110
111
112
113
114
115
116
	/*
	 * When editing a cell: the cell (may be NULL) and
	 * the original text of the cell
	 */
	String    *editing_saved_text;
	Cell      *editing_cell;
	int        editing;
	
117
118
119
120
	/* For walking trough a selection */
	struct {
		SheetSelection *current;
	} walk_info;
121
122
} Sheet;

123
124
125
#define SHEET_SIGNATURE 0x12349876
#define IS_SHEET(x) (((Sheet *) x)->signature == SHEET_SIGNATURE)

Arturo Espinosa's avatar
Arturo Espinosa committed
126
127
128
typedef  void (*sheet_col_row_callback)(Sheet *sheet, ColRowInfo *ci,
					void *user_data);

Arturo Espinosa's avatar
Arturo Espinosa committed
129
130
typedef  int (*sheet_cell_foreach_callback)(Sheet *sheet, int col, int row,
					    Cell *cell, void *user_data);
131

Arturo Espinosa's avatar
Arturo Espinosa committed
132
133
134
135
136
137
138
139
140
Sheet      *sheet_new                  	 (Workbook *wb, char *name);
void        sheet_destroy              	 (Sheet *sheet);
void        sheet_foreach_col          	 (Sheet *sheet,
					  sheet_col_row_callback callback,
					  void *user_data);
void        sheet_foreach_row          	 (Sheet *sheet,
					  sheet_col_row_callback,
					  void *user_data);
void        sheet_set_zoom_factor      	 (Sheet *sheet, double factor);
Arturo Espinosa's avatar
Arturo Espinosa committed
141
142
143
144
void        sheet_cursor_set             (Sheet *sheet,
					  int start_col, int start_row,
					  int end_col,   int end_row);
void        sheet_cursor_move            (Sheet *sheet, int col, int row);
145
146

/* Selection management */
147
void        sheet_select_all             (Sheet *sheet);
148
int         sheet_is_all_selected        (Sheet *sheet);
149
150
void        sheet_selection_append       (Sheet *sheet, int col, int row);
void        sheet_selection_extend_to    (Sheet *sheet, int col, int row);
Arturo Espinosa's avatar
Today:    
Arturo Espinosa committed
151
152
void        sheet_selection_reset        (Sheet *sheet);
void        sheet_selection_reset_only   (Sheet *sheet);
153
int         sheet_selection_equal        (SheetSelection *a, SheetSelection *b);
Arturo Espinosa's avatar
Arturo Espinosa committed
154
155
void        sheet_selection_append_range (Sheet *sheet,
					  int base_col,  int base_row,
156
157
					  int start_col, int start_row,
					  int end_col,   int end_row);
Miguel de Icaza's avatar
Today:    
Miguel de Icaza committed
158
CellList   *sheet_selection_to_list      (Sheet *sheet);
159

Arturo Espinosa's avatar
Today:    
Arturo Espinosa committed
160
/* Operations on the selection */
161
162
163
void        sheet_selection_clear_content     (Sheet *sheet);
void        sheet_selection_clear_formats     (Sheet *sheet);
void        sheet_selection_clear             (Sheet *sheet);
Arturo Espinosa's avatar
Today:    
Arturo Espinosa committed
164

165
/* Cut/Copy/Paste on the workbook selection */
166
167
168
169
170
171
172
173
174
gboolean    sheet_selection_copy              (Sheet *sheet);
gboolean    sheet_selection_cut               (Sheet *sheet);
void        sheet_selection_paste             (Sheet *sheet,
					       int dest_col, int dest_row,
					       int paste_flags);
int         sheet_selection_walk_step         (Sheet *sheet,
					       int   forward,     int horizontal,
					       int   current_col, int current_row,
					       int   *new_col,    int *new_row);
175
176
177
void        sheet_selection_extend_horizontal (Sheet *sheet, int count);
void        sheet_selection_extend_vertical   (Sheet *sheet, int count);
int         sheet_selection_is_cell_selected  (Sheet *sheet, int col, int row);
Arturo Espinosa's avatar
Arturo Espinosa committed
178

Miguel de Icaza's avatar
Today:    
Miguel de Icaza committed
179
180
gboolean    sheet_verify_selection_simple     (Sheet *sheet, char *command_name);

Arturo Espinosa's avatar
Arturo Espinosa committed
181
/* Cell management */
Miguel de Icaza's avatar
Miguel de Icaza committed
182
183
void        sheet_set_text                (Sheet *sheet, int col, int row,
					   char *str);
184
185
186
187
188
189
190
191
192
193
194
195
Cell       *sheet_cell_new                (Sheet *sheet, int col, int row);
void        sheet_cell_add                (Sheet *sheet, Cell *cell,
				           int col, int row);
void        sheet_cell_remove             (Sheet *sheet, Cell *cell);
int         sheet_cell_foreach_range      (Sheet *sheet, int only_existing,
				           int start_col, int start_row,
				           int end_col, int end_row,
				           sheet_cell_foreach_callback callback,
				           void *closure);
Cell       *sheet_cell_get                (Sheet *sheet, int col, int row);
void        sheet_cell_formula_link       (Cell *cell);
void        sheet_cell_formula_unlink     (Cell *cell);
Arturo Espinosa's avatar
Arturo Espinosa committed
196

Arturo Espinosa's avatar
Arturo Espinosa committed
197
/* Create new ColRowInfos from the default sheet style */
198
199
200
201
ColRowInfo *sheet_col_new                  (Sheet *sheet);
ColRowInfo *sheet_row_new                  (Sheet *sheet);
int         sheet_row_check_bound          (int row, int diff);
int         sheet_col_check_bound          (int col, int diff);
Arturo Espinosa's avatar
Arturo Espinosa committed
202
203

/* Duplicates the information of a col/row */
204
ColRowInfo *sheet_duplicate_colrow        (ColRowInfo *original);
Arturo Espinosa's avatar
Arturo Espinosa committed
205
206

/* Retrieve information from a col/row */
207
208
ColRowInfo *sheet_col_get_info            (Sheet *sheet, int col);
ColRowInfo *sheet_row_get_info            (Sheet *sheet, int row);
Arturo Espinosa's avatar
Arturo Espinosa committed
209

Arturo Espinosa's avatar
Arturo Espinosa committed
210
/* Returns a pointer to a ColRowInfo: existed or freshly created */
211
212
ColRowInfo *sheet_row_get                 (Sheet *sheet, int pos);
ColRowInfo *sheet_col_get                 (Sheet *sheet, int pos);
Arturo Espinosa's avatar
Arturo Espinosa committed
213

Arturo Espinosa's avatar
Arturo Espinosa committed
214
/* Add a ColRowInfo to the Sheet */
215
216
void        sheet_col_add                 (Sheet *sheet, ColRowInfo *cp);
void        sheet_row_add                 (Sheet *sheet, ColRowInfo *cp);
Arturo Espinosa's avatar
Arturo Espinosa committed
217
218

/* Measure distances in pixels from one col/row to another */
219
220
int         sheet_col_get_distance        (Sheet *sheet, int from_col, int to_col);
int         sheet_row_get_distance        (Sheet *sheet, int from_row, int to_row);
Arturo Espinosa's avatar
Arturo Espinosa committed
221
 
222
223
224
225
226
227
228
229
230
void        sheet_clear_region            (Sheet *sheet,
				           int start_col, int start_row,
				           int end_col,   int end_row);
void        sheet_clear_region_formats    (Sheet *sheet,
				           int start_col, int start_row,
				           int end_col,   int end_row);
void        sheet_clear_region_content    (Sheet *sheet,
				           int start_col, int start_row,
				           int end_col,   int end_row);
Arturo Espinosa's avatar
Arturo Espinosa committed
231
232

/* Sets the width/height of a column row in terms of pixels */
233
234
235
236
237
238
239
240
241
242
void        sheet_col_set_width           (Sheet *sheet,
				           int col, int width);
void        sheet_row_set_height          (Sheet *sheet,
				           int row, int width,
				           gboolean height_set_by_user);
void        sheet_row_set_internal_height (Sheet *sheet, ColRowInfo *ri, int height);
void        sheet_col_set_selection       (Sheet *sheet,
					   ColRowInfo *ci, int value);
void        sheet_row_set_selection       (Sheet *sheet,
					   ColRowInfo *ri, int value);
Arturo Espinosa's avatar
Today:    
Arturo Espinosa committed
243
				       
244
Style      *sheet_style_compute           (Sheet *sheet, int col, int row);
Arturo Espinosa's avatar
Arturo Espinosa committed
245

246
/* Redraw */
247
248
249
250
251
252
void        sheet_compute_visible_ranges  (Sheet *sheet);
void        sheet_redraw_cell_region      (Sheet *sheet,
				           int start_col, int start_row,
				           int end_col,   int end_row);
void        sheet_redraw_selection        (Sheet *sheet, SheetSelection *ss);
void        sheet_redraw_all              (Sheet *sheet);
Arturo Espinosa's avatar
Today:    
Arturo Espinosa committed
253
				       
254
void        sheet_update_auto_expr        (Sheet *sheet);
255

256
/* Sheet information manipulation */
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
void        sheet_insert_col              (Sheet *sheet,  int col, int count);
void        sheet_delete_col              (Sheet *sheet,  int col, int count);
void        sheet_insert_row              (Sheet *sheet,  int row, int count);
void        sheet_delete_row              (Sheet *sheet,  int row, int count);
void        sheet_shift_row               (Sheet *sheet,  int col, int row, int count);
void        sheet_shift_rows              (Sheet *sheet,  int col,
				           int start_row, int end_row, int count);
void        sheet_shift_col               (Sheet *sheet,  int col, int row, int count);
void        sheet_shift_cols              (Sheet *sheet,
				           int start_col, int end_col,
				           int row,       int count);

void        sheet_style_attach            (Sheet *sheet,
					   int    start_col, int start_row,
					   int    end_col,   int end_row,
					   Style  *style);
Arturo Espinosa's avatar
Today:    
Arturo Espinosa committed
273
274
275
276
277
278

/*
 * Sheet visual editing
 */
void        sheet_start_editing_at_cursor (Sheet *sheet);
void        sheet_set_current_value       (Sheet *sheet);
279
void        sheet_accept_pending_input    (Sheet *sheet);
Arturo Espinosa's avatar
Today:    
Arturo Espinosa committed
280
281
282
283
284
void        sheet_cancel_pending_input    (Sheet *sheet);
void        sheet_load_cell_val           (Sheet *sheet);
void        sheet_selection_col_extend_to (Sheet *sheet, int col);
void        sheet_selection_row_extend_to (Sheet *sheet, int row);

285
286
287
288
289
290
/*
 * Event state manipulation (for mode operation)
 */
void        sheet_set_mode_type           (Sheet *sheet, SheetModeType type);


Miguel de Icaza's avatar
Miguel de Icaza committed
291
292
293
294
295
/*
 * Callback routines.
 */
void        sheet_fill_selection_with     (Sheet *sheet, char *text);

Miguel de Icaza's avatar
New:    
Miguel de Icaza committed
296
297
298
299
300
301
/*
 * Hiding/showing the cursor
 */
void        sheet_show_cursor             (Sheet *sheet);
void        sheet_hide_cursor             (Sheet *sheet);

Arturo Espinosa's avatar
Arturo Espinosa committed
302
303
304
/*
 * Workbook
 */
305
Workbook   *workbook_new                 (void);
Arturo Espinosa's avatar
Arturo Espinosa committed
306
void        workbook_destroy             (Workbook *wb);
307
Workbook   *workbook_new_with_sheets     (int sheet_count);
308
309
310

void        workbook_save_as             (Workbook *);
void        workbook_save                (Workbook *);
311
312
void        workbook_attach_sheet        (Workbook *, Sheet *);
Sheet      *workbook_focus_current_sheet (Workbook *wb);
Arturo Espinosa's avatar
Arturo Espinosa committed
313
Sheet      *workbook_get_current_sheet   (Workbook *wb);
314
void        workbook_auto_expr_label_set (Workbook *wb, char *text);
315
void        workbook_next_generation     (Workbook *wb);
316
317
void        workbook_set_region_status   (Workbook *wb, char *str);
int         workbook_parse_and_jump      (Workbook *wb, char *text);
Arturo Espinosa's avatar
Arturo Espinosa committed
318

Arturo Espinosa's avatar
Arturo Espinosa committed
319
320
321
322
/*
 * Does any pending recalculations
 */
void        workbook_recalc              (Workbook *wb);
323
void        workbook_recalc_all          (Workbook *wb);
Arturo Espinosa's avatar
Arturo Espinosa committed
324

325
326
327
328
/*
 * Callback routine: invoked when the first view ItemGrid
 * is realized to allocate the default styles
 */
329
void     workbook_realized            (Workbook *, GdkWindow *);
330

Miguel de Icaza's avatar
New:    
Miguel de Icaza committed
331
332
333
334
335
336
337
338
339
340
341
342
/*
 * Feedback routines
 */
typedef enum {
	WORKBOOK_FEEDBACK_BOLD,
	WORKBOOK_FEEDBACK_ITALIC
} WorkbookFeedbackType;

void     workbook_feedback_set        (Workbook *,
				       WorkbookFeedbackType type,
				       void *data);

343
extern   Workbook *current_workbook;
344
#endif
Miguel de Icaza's avatar
New:    
Miguel de Icaza committed
345