sheet.h 7.28 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 9 10 11
typedef GList ColStyleList;

struct Workbook;

typedef struct {
Arturo Espinosa's avatar
Arturo Espinosa committed
12 13
	GtkWidget  *toplevel;
	GtkWidget  *notebook;
14 15 16 17 18 19
	GtkWidget  *table;

	/* Edit area */
	GtkWidget  *ea_status;
	GtkWidget  *ea_button_box;
	GtkWidget  *ea_input;
Arturo Espinosa's avatar
Arturo Espinosa committed
20 21 22

	/* The auto-expression */
	ExprTree   *auto_expr;
23
	String     *auto_expr_desc;
Arturo Espinosa's avatar
Arturo Espinosa committed
24
	GnomeCanvasItem  *auto_expr_label;
Arturo Espinosa's avatar
Arturo Espinosa committed
25
	
Arturo Espinosa's avatar
Arturo Espinosa committed
26
	/* Styles */
Arturo Espinosa's avatar
Arturo Espinosa committed
27 28
	Style      style;
	GHashTable *sheets;	/* keeps a list of the Sheets on this workbook */
29 30 31 32

	/* A list with all of the formulas */
	GList      *formula_cell_list;

Arturo Espinosa's avatar
Arturo Espinosa committed
33 34
	/* A queue with the cells to be evaluated */
	GList      *eval_queue;
35
	int        max_iterations;
36
	guchar     generation;
37 38 39

	/* The clipboard for this workbook */
	CellRegion *clipboard_contents;
Arturo Espinosa's avatar
Arturo Espinosa committed
40 41
} Workbook;

42 43 44 45 46 47
typedef struct {
	int        base_col, base_row;
	int        start_col, start_row;
	int        end_col, end_row;
} SheetSelection;

Arturo Espinosa's avatar
Arturo Espinosa committed
48
typedef struct {
49 50
	int        signature;
	
Arturo Espinosa's avatar
Arturo Espinosa committed
51
	Workbook   *workbook;
52
	GtkWidget  *toplevel, *col_canvas, *row_canvas;
Arturo Espinosa's avatar
Arturo Espinosa committed
53
	GtkWidget  *sheet_view;
54 55 56
	GnomeCanvasItem *col_item, *row_item;
	
	double     last_zoom_factor_used;
57 58 59
	char       *name;
		   
	Style      style;
60

61
	ColRowInfo default_col_style;
62
	GList      *cols_info;
63

64
	ColRowInfo default_row_style;
65
	GList      *rows_info;
Arturo Espinosa's avatar
Arturo Espinosa committed
66

67
	GHashTable *cell_hash;	/* The cells in hashed format */
68 69 70 71 72 73 74 75 76

	GList      *selections;

	/* Scrolling information */
	GtkWidget  *vs, *hs;	/* The scrollbars */
	GtkObject  *va, *ha;    /* The adjustments */
	
	int        max_col_used;
	int        max_row_used;
77 78 79

	/* The list of formulas */
	GList      *formula_cell_list;
80 81 82 83 84

	/* For walking trough a selection */
	struct {
		SheetSelection *current;
	} walk_info;
85 86
} Sheet;

87 88 89
#define SHEET_SIGNATURE 0x12349876
#define IS_SHEET(x) (((Sheet *) x)->signature == SHEET_SIGNATURE)

Arturo Espinosa's avatar
Arturo Espinosa committed
90 91 92
typedef  void (*sheet_col_row_callback)(Sheet *sheet, ColRowInfo *ci,
					void *user_data);

Arturo Espinosa's avatar
Arturo Espinosa committed
93 94
typedef  int (*sheet_cell_foreach_callback)(Sheet *sheet, int col, int row,
					    Cell *cell, void *user_data);
95

Arturo Espinosa's avatar
Arturo Espinosa committed
96 97 98 99 100 101 102 103 104 105 106 107 108
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);
void        sheet_get_cell_bounds      	 (Sheet *sheet,
					  ColType col, RowType row, 
				       	  int *x, int *y,
				       	  int *w, int *h);
109 110

/* Selection management */
111
void        sheet_select_all             (Sheet *sheet);
112 113 114 115 116
void        sheet_selection_append       (Sheet *sheet, int col, int row);
void        sheet_selection_extend_to    (Sheet *sheet, int col, int row);
void        sheet_selection_clear        (Sheet *sheet);
void        sheet_selection_clear_only   (Sheet *sheet);
int         sheet_selection_equal        (SheetSelection *a, SheetSelection *b);
Arturo Espinosa's avatar
Arturo Espinosa committed
117 118
void        sheet_selection_append_range (Sheet *sheet,
					  int base_col,  int base_row,
119 120
					  int start_col, int start_row,
					  int end_col,   int end_row);
121

122 123 124 125 126 127
/* Cut/Copy/Paste on the workbook selection */
void        sheet_selection_copy         (Sheet *sheet);
void        sheet_selection_cut          (Sheet *sheet);
void        sheet_selection_paste        (Sheet *sheet,
					  int dest_col, int dest_row,
					  int paste_flags);
128 129 130 131
int         sheet_selection_walk_step    (Sheet *sheet,
					  int   forward,     int horizontal,
					  int   current_col, int current_row,
					  int   *new_col,    int *new_row);
132 133 134
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
135 136 137

/* Cell management */
Cell       *sheet_cell_new            (Sheet *sheet, int col, int row);
138 139
void        sheet_cell_add            (Sheet *sheet, Cell *cell,
				       int col, int row);
Arturo Espinosa's avatar
Arturo Espinosa committed
140
void        sheet_cell_remove         (Sheet *sheet, Cell *cell);
Arturo Espinosa's avatar
Arturo Espinosa committed
141
int         sheet_cell_foreach_range  (Sheet *sheet, int only_existing,
Arturo Espinosa's avatar
Arturo Espinosa committed
142 143 144 145 146
				       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);
147 148
void        sheet_cell_formula_link   (Cell *cell);
void        sheet_cell_formula_unlink (Cell *cell);
Arturo Espinosa's avatar
Arturo Espinosa committed
149

Arturo Espinosa's avatar
Arturo Espinosa committed
150
/* Create new ColRowInfos from the default sheet style */
151 152
ColRowInfo *sheet_col_new             (Sheet *sheet);
ColRowInfo *sheet_row_new             (Sheet *sheet);
153 154
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
155 156

/* Duplicates the information of a col/row */
157
ColRowInfo *sheet_duplicate_colrow    (ColRowInfo *original);
Arturo Espinosa's avatar
Arturo Espinosa committed
158 159

/* Retrieve information from a col/row */
160 161
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
162

Arturo Espinosa's avatar
Arturo Espinosa committed
163 164 165 166
/* Returns a pointer to a ColRowInfo: existed or freshly created */
ColRowInfo *sheet_row_get             (Sheet *sheet, int pos);
ColRowInfo *sheet_col_get             (Sheet *sheet, int pos);

Arturo Espinosa's avatar
Arturo Espinosa committed
167
/* Add a ColRowInfo to the Sheet */
168 169
void        sheet_col_add             (Sheet *sheet, ColRowInfo *cp);
void        sheet_row_add             (Sheet *sheet, ColRowInfo *cp);
Arturo Espinosa's avatar
Arturo Espinosa committed
170 171

/* Measure distances in pixels from one col/row to another */
172 173
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
174 175 176 177
 
void        sheet_clear_region        (Sheet *sheet,
				       int start_col, int start_row,
				       int end_col,   int end_row);
Arturo Espinosa's avatar
Arturo Espinosa committed
178 179

/* Sets the width/height of a column row in terms of pixels */
Arturo Espinosa's avatar
Arturo Espinosa committed
180 181 182 183 184 185 186 187
void        sheet_col_set_width       (Sheet *sheet,
				       int col, int width);
void        sheet_row_set_height      (Sheet *sheet,
				       int row, int width);
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
Arturo Espinosa committed
188

Arturo Espinosa's avatar
Arturo Espinosa committed
189 190
Style      *sheet_style_compute       (Sheet *sheet, int col, int row);

191
/* Redraw */
Arturo Espinosa's avatar
Arturo Espinosa committed
192 193 194
void        sheet_redraw_cell_region  (Sheet *sheet,
				       int start_col, int start_row,
				       int end_col,   int end_row);
195
void        sheet_redraw_selection    (Sheet *sheet, SheetSelection *ss);
Arturo Espinosa's avatar
Arturo Espinosa committed
196
void        sheet_redraw_all          (Sheet *sheet);
Arturo Espinosa's avatar
Arturo Espinosa committed
197

198 199
void        sheet_update_auto_expr    (Sheet *sheet);

Arturo Espinosa's avatar
Arturo Espinosa committed
200 201 202
/*
 * Workbook
 */
203 204 205 206
Workbook   *workbook_new                 (void);
Workbook   *workbook_new_with_sheets     (int sheet_count);
void        workbook_attach_sheet        (Workbook *, Sheet *);
Sheet      *workbook_focus_current_sheet (Workbook *wb);
Arturo Espinosa's avatar
Arturo Espinosa committed
207
Sheet      *workbook_get_current_sheet   (Workbook *wb);
208
void        workbook_auto_expr_label_set (Workbook *wb, char *text);
209
void        workbook_next_generation     (Workbook *wb);
Arturo Espinosa's avatar
Arturo Espinosa committed
210

Arturo Espinosa's avatar
Arturo Espinosa committed
211 212 213 214 215
/*
 * Does any pending recalculations
 */
void        workbook_recalc              (Workbook *wb);

216 217 218 219
/*
 * Callback routine: invoked when the first view ItemGrid
 * is realized to allocate the default styles
 */
220
void     workbook_realized            (Workbook *, GdkWindow *);
221

222
extern   Workbook *current_workbook;
223
#endif