sheet.h 16.7 KB
Newer Older
1 2
#ifndef GNUMERIC_SHEET_H
#define GNUMERIC_SHEET_H
3

4 5 6
typedef struct _Workbook Workbook;
typedef struct _Sheet Sheet;

7 8 9 10
#ifdef ENABLE_BONOBO
#    include <bonobo/gnome-container.h>
#endif

11
#include "solver.h"
12 13 14 15 16
#include "style.h"
#include "expr.h"
#include "str.h"
#include "symbol.h"
#include "cell.h"
17

18 19 20
#define SHEET_MAX_ROWS (16 * 1024)
#define SHEET_MAX_COLS 256

21 22
typedef GList ColStyleList;

23 24 25 26 27 28 29 30 31 32 33
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;
34

35 36 37 38
/* Forward declaration */
struct _PrintInformation;
typedef struct _PrintInformation PrintInformation;

39
struct _Workbook {
40
	char       *filename;
41 42

        GtkWidget  *toplevel; 
Arturo Espinosa's avatar
Arturo Espinosa committed
43
	GtkWidget  *notebook;
44 45 46 47 48 49
	GtkWidget  *table;

	/* Edit area */
	GtkWidget  *ea_status;
	GtkWidget  *ea_button_box;
	GtkWidget  *ea_input;
Arturo Espinosa's avatar
Arturo Espinosa committed
50

51 52 53
        /* The status bar */
        GnomeAppBar * appbar;
  
Arturo Espinosa's avatar
Arturo Espinosa committed
54
	/* The auto-expression */
55 56
	char       *auto_expr_text;
	ExprTree   *auto_expr_tree;
57
	String     *auto_expr_desc;
Arturo Espinosa's avatar
Arturo Espinosa committed
58
	GnomeCanvasItem  *auto_expr_label;
Arturo Espinosa's avatar
Arturo Espinosa committed
59
	
Arturo Espinosa's avatar
Arturo Espinosa committed
60
	/* Styles */
Arturo Espinosa's avatar
Arturo Espinosa committed
61
	Style      style;
62 63

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

66
	
67 68 69
	/* A list with all of the formulas */
	GList      *formula_cell_list;

Arturo Espinosa's avatar
Arturo Espinosa committed
70 71
	/* A queue with the cells to be evaluated */
	GList      *eval_queue;
72
	int        max_iterations;
73

74
	int        generation;
75

76 77
	/* The clipboard for this workbook */
	CellRegion *clipboard_contents;
78 79

	gboolean   have_x_selection;
80

Miguel de Icaza's avatar
Miguel de Icaza committed
81 82 83
	/* The Symbol table used for naming cell ranges in the workbook */
	SymbolTable *symbol_names;
	
84 85 86 87 88
	/*
	 * This is  used during the clipboard paste command to pass information
	 * to the asyncronous paste callback
	 */
	void       *clipboard_paste_callback_data;
89

90 91
	PrintInformation *print_info;

92
	void       *toolbar;
93

94 95
#ifdef ENABLE_BONOBO
	/* A GnomeContainer */
96
	GnomeContainer *gnome_container;
97
	
98
#endif
99
	void       *corba_server;
100
};
Arturo Espinosa's avatar
Arturo Espinosa committed
101

102 103 104 105 106 107
typedef struct {
	int        base_col, base_row;
	int        start_col, start_row;
	int        end_col, end_row;
} SheetSelection;

108
typedef enum {
109
	/* Normal editing mode of the Sheet */
110
	SHEET_MODE_SHEET,
111 112

	/* Drawing object creation */
113 114 115
	SHEET_MODE_CREATE_LINE,
	SHEET_MODE_CREATE_BOX,
	SHEET_MODE_CREATE_OVAL,
Miguel de Icaza's avatar
New:  
Miguel de Icaza committed
116
	SHEET_MODE_CREATE_ARROW,
117 118 119 120 121

	/* Selection for the region for a Graphics object */
	SHEET_MODE_CREATE_GRAPHIC,

	/* Object is selected */
Miguel de Icaza's avatar
New:  
Miguel de Icaza committed
122
	SHEET_MODE_OBJECT_SELECTED,
123 124
} SheetModeType;

125
struct _Sheet {
Miguel de Icaza's avatar
Miguel de Icaza committed
126
	int         signature;
127
	
Miguel de Icaza's avatar
Miguel de Icaza committed
128 129
	Workbook    *workbook;
	GList       *sheet_views;
130
	
Miguel de Icaza's avatar
Miguel de Icaza committed
131
	char        *name;
132

Miguel de Icaza's avatar
Miguel de Icaza committed
133
	GList       *style_list;	/* The list of styles applied to the sheets */
134

Miguel de Icaza's avatar
Miguel de Icaza committed
135 136
	ColRowInfo  default_col_style;
	GList       *cols_info;
137

Miguel de Icaza's avatar
Miguel de Icaza committed
138 139
	ColRowInfo  default_row_style;
	GList       *rows_info;
Arturo Espinosa's avatar
Arturo Espinosa committed
140

Miguel de Icaza's avatar
Miguel de Icaza committed
141
	GHashTable  *cell_hash;	/* The cells in hashed format */
142

Miguel de Icaza's avatar
Miguel de Icaza committed
143
	GList       *selections;
144

Miguel de Icaza's avatar
Miguel de Icaza committed
145 146
	int         max_col_used;
	int         max_row_used;
147

Arturo Espinosa's avatar
Today:  
Arturo Espinosa committed
148 149
	int         cursor_col, cursor_row;
	
150 151 152
	/* The list of cells that have a comment */
	GList       *comment_list;
	
Miguel de Icaza's avatar
Miguel de Icaza committed
153
	double      last_zoom_factor_used;
Arturo Espinosa's avatar
Today:  
Arturo Espinosa committed
154

155 156
	/* Objects */
	SheetModeType mode;	/* Sheet mode */
Miguel de Icaza's avatar
Miguel de Icaza committed
157 158 159 160
	GList       *objects;	/* List of objects in the spreadsheet */
	GList       *coords;	/* During creation time: keeps click coordinates */
	void        *current_object;

Arturo Espinosa's avatar
Today:  
Arturo Espinosa committed
161 162 163 164
	/*
	 * When editing a cell: the cell (may be NULL) and
	 * the original text of the cell
	 */
Miguel de Icaza's avatar
Miguel de Icaza committed
165 166 167
	String      *editing_saved_text;
	Cell        *editing_cell;
	int         editing;
Arturo Espinosa's avatar
Today:  
Arturo Espinosa committed
168
	
Miguel de Icaza's avatar
Miguel de Icaza committed
169
	gboolean    modified;
170
	
171 172 173 174
	/* For walking trough a selection */
	struct {
		SheetSelection *current;
	} walk_info;
175 176 177

        /* Solver parameters */
        SolverParameters solver_parameters;
178 179

	void         *corba_server;
180
};
181

182
#define SHEET_SIGNATURE 0x12349876
183
#define IS_SHEET(x) ((x)->signature == SHEET_SIGNATURE)
184

Arturo Espinosa's avatar
Arturo Espinosa committed
185 186 187
typedef  void (*sheet_col_row_callback)(Sheet *sheet, ColRowInfo *ci,
					void *user_data);

Arturo Espinosa's avatar
Arturo Espinosa committed
188 189
typedef  int (*sheet_cell_foreach_callback)(Sheet *sheet, int col, int row,
					    Cell *cell, void *user_data);
190

191
Sheet      *sheet_new                  	 (Workbook *wb, const char *name);
Miguel de Icaza's avatar
Miguel de Icaza committed
192
void        sheet_rename                 (Sheet *sheet, const char *new_name);
Arturo Espinosa's avatar
Arturo Espinosa committed
193 194 195 196 197 198 199 200
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
201
void        sheet_cursor_set             (Sheet *sheet,
202
					  int base_col,  int base_row,
Arturo Espinosa's avatar
Arturo Espinosa committed
203 204 205
					  int start_col, int start_row,
					  int end_col,   int end_row);
void        sheet_cursor_move            (Sheet *sheet, int col, int row);
206
void        sheet_make_cell_visible      (Sheet *sheet, int col, int row);
207 208

/* Selection management */
209
void        sheet_select_all             (Sheet *sheet);
210
int         sheet_is_all_selected        (Sheet *sheet);
211 212
void        sheet_selection_append       (Sheet *sheet, int col, int row);
void        sheet_selection_extend_to    (Sheet *sheet, int col, int row);
213 214 215
void	    sheet_selection_set		 (Sheet *sheet,
					  int start_col, int start_row,
					  int end_col, int end_row);
Arturo Espinosa's avatar
Today:  
Arturo Espinosa committed
216 217
void        sheet_selection_reset        (Sheet *sheet);
void        sheet_selection_reset_only   (Sheet *sheet);
218
int         sheet_selection_equal        (SheetSelection *a, SheetSelection *b);
Arturo Espinosa's avatar
Arturo Espinosa committed
219 220
void        sheet_selection_append_range (Sheet *sheet,
					  int base_col,  int base_row,
221 222
					  int start_col, int start_row,
					  int end_col,   int end_row);
223 224 225 226
int         sheet_selection_first_range  (Sheet *sheet,
					  int *base_col,  int *base_row,
					  int *start_col, int *start_row,
					  int *end_col,   int *end_row);
Miguel de Icaza's avatar
Today:  
Miguel de Icaza committed
227
CellList   *sheet_selection_to_list      (Sheet *sheet);
228
char       *sheet_selection_to_string    (Sheet *sheet, gboolean include_sheet_name_prefix);
229

Arturo Espinosa's avatar
Today:  
Arturo Espinosa committed
230
/* Operations on the selection */
231
void        sheet_selection_clear             (Sheet *sheet);
232
void        sheet_selection_clear_content     (Sheet *sheet);
233
void        sheet_selection_clear_comments    (Sheet *sheet);
234
void        sheet_selection_clear_formats     (Sheet *sheet);
Arturo Espinosa's avatar
Today:  
Arturo Espinosa committed
235

236
/* Cut/Copy/Paste on the workbook selection */
237 238 239
gboolean    sheet_selection_copy              (Sheet *sheet);
gboolean    sheet_selection_cut               (Sheet *sheet);
void        sheet_selection_paste             (Sheet *sheet,
240
					       int dest_col,    int dest_row,
Miguel de Icaza's avatar
Miguel de Icaza committed
241
					       int paste_flags, guint32 time32);
242 243 244 245
int         sheet_selection_walk_step         (Sheet *sheet,
					       int   forward,     int horizontal,
					       int   current_col, int current_row,
					       int   *new_col,    int *new_row);
246 247 248
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);
249
gboolean    sheet_verify_selection_simple     (Sheet *sheet, const char *command_name);
Miguel de Icaza's avatar
Today:  
Miguel de Icaza committed
250

Arturo Espinosa's avatar
Arturo Espinosa committed
251
/* Cell management */
Miguel de Icaza's avatar
Miguel de Icaza committed
252
void        sheet_set_text                (Sheet *sheet, int col, int row,
253
					   const char *str);
254 255 256 257 258 259 260 261 262
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);
263
 /* Returns NULL if doesn't exist */
264
Cell       *sheet_cell_get                (Sheet *sheet, int col, int row);
265
 /* Returns new Cell if doesn't exist */
266
Cell       *sheet_cell_fetch              (Sheet *sheet, int col, int row);
267 268 269
void        sheet_cell_comment_link       (Cell *cell);
void        sheet_cell_comment_unlink     (Cell *cell);

270 271
void        sheet_cell_formula_link       (Cell *cell);
void        sheet_cell_formula_unlink     (Cell *cell);
272 273
gboolean    sheet_is_region_empty_or_selected (Sheet *sheet, int start_col, int start_row,
					       int end_col, int end_row);
Arturo Espinosa's avatar
Arturo Espinosa committed
274

Arturo Espinosa's avatar
Arturo Espinosa committed
275
/* Create new ColRowInfos from the default sheet style */
276 277 278 279
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
280 281

/* Duplicates the information of a col/row */
282
ColRowInfo *sheet_duplicate_colrow        (ColRowInfo *original);
Arturo Espinosa's avatar
Arturo Espinosa committed
283 284

/* Retrieve information from a col/row */
285 286
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
287

Arturo Espinosa's avatar
Arturo Espinosa committed
288
/* Returns a pointer to a ColRowInfo: existed or freshly created */
289 290
ColRowInfo *sheet_row_get                 (Sheet *sheet, int pos);
ColRowInfo *sheet_col_get                 (Sheet *sheet, int pos);
Arturo Espinosa's avatar
Arturo Espinosa committed
291

Arturo Espinosa's avatar
Arturo Espinosa committed
292
/* Add a ColRowInfo to the Sheet */
293 294
void        sheet_col_add                 (Sheet *sheet, ColRowInfo *cp);
void        sheet_row_add                 (Sheet *sheet, ColRowInfo *cp);
Arturo Espinosa's avatar
Arturo Espinosa committed
295 296

/* Measure distances in pixels from one col/row to another */
297 298
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);
299 300
double      sheet_row_get_unit_distance   (Sheet *sheet, int from_row, int to_row);
double      sheet_col_get_unit_distance   (Sheet *sheet, int from_col, int to_col);
Arturo Espinosa's avatar
Arturo Espinosa committed
301
 
302 303 304 305 306 307 308 309 310
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);
311 312 313
void        sheet_clear_region_comments   (Sheet *sheet,
				           int start_col, int start_row,
				           int end_col,   int end_row);	
Arturo Espinosa's avatar
Arturo Espinosa committed
314 315

/* Sets the width/height of a column row in terms of pixels */
316 317
void        sheet_col_set_width           (Sheet *sheet,
				           int col, int width);
318 319
void        sheet_col_info_set_width      (Sheet *sheet,
				           ColRowInfo *ci, int width);
320 321 322
void        sheet_row_set_height          (Sheet *sheet,
				           int row, int width,
				           gboolean height_set_by_user);
323 324 325
void        sheet_row_info_set_height     (Sheet *sheet,
				           ColRowInfo *ri, int width,
				           gboolean height_set_by_user);
326 327 328 329 330
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
331
				       
332 333 334
Style      *sheet_style_compute           (Sheet *sheet,
					   int col, int row,
					   int *non_default_style_flags);
Arturo Espinosa's avatar
Arturo Espinosa committed
335

336
/* Redraw */
337 338 339 340 341 342
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
343
				       
344
void        sheet_update_auto_expr        (Sheet *sheet);
345

346
void        sheet_mark_clean              (Sheet *sheet);
347
void        sheet_set_dirty               (Sheet *sheet, gboolean is_dirty);
348
/* Sheet information manipulation */
349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364
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);
365
Sheet      *sheet_lookup_by_name          (Sheet *base, const char *name);
Arturo Espinosa's avatar
Today:  
Arturo Espinosa committed
366 367 368 369

/*
 * Sheet visual editing
 */
370
void        sheet_start_editing_at_cursor (Sheet *sheet, gboolean blankp, gboolean cursorp);
Arturo Espinosa's avatar
Today:  
Arturo Espinosa committed
371
void        sheet_set_current_value       (Sheet *sheet);
372
void        sheet_accept_pending_input    (Sheet *sheet);
Arturo Espinosa's avatar
Today:  
Arturo Espinosa committed
373 374
void        sheet_cancel_pending_input    (Sheet *sheet);
void        sheet_load_cell_val           (Sheet *sheet);
375 376 377

int         sheet_col_selection_type      (Sheet *sheet, int col);
int         sheet_row_selection_type      (Sheet *sheet, int row);
Arturo Espinosa's avatar
Today:  
Arturo Espinosa committed
378

379 380 381 382 383 384
/*
 * Event state manipulation (for mode operation)
 */
void        sheet_set_mode_type           (Sheet *sheet, SheetModeType type);


Miguel de Icaza's avatar
Miguel de Icaza committed
385 386 387
/*
 * Callback routines.
 */
388
void        sheet_fill_selection_with     (Sheet *sheet, const char *text);
Miguel de Icaza's avatar
Miguel de Icaza committed
389

Miguel de Icaza's avatar
New:  
Miguel de Icaza committed
390 391 392 393 394 395
/*
 * Hiding/showing the cursor
 */
void        sheet_show_cursor             (Sheet *sheet);
void        sheet_hide_cursor             (Sheet *sheet);

396
char        *cellref_name                 (CellRef *cell_ref,
397 398 399 400
					   Sheet *eval_sheet,
					   int eval_col,
					   int eval_row);

401 402 403 404 405
/*
 * Sheet, Bobobo objects
 */
void sheet_insert_object (Sheet *sheet, char *repoid);

Arturo Espinosa's avatar
Arturo Espinosa committed
406 407 408
/*
 * Workbook
 */
409
Workbook   *workbook_new                 (void);
Arturo Espinosa's avatar
Arturo Espinosa committed
410
void        workbook_destroy             (Workbook *wb);
411
Workbook   *workbook_new_with_sheets     (int sheet_count);
412

413 414
void        workbook_set_filename        (Workbook *, const char *);
void        workbook_set_title           (Workbook *, const char *);
415
Workbook   *workbook_read                (const char *filename);
416

417 418
void        workbook_save_as             (Workbook *);
void        workbook_save                (Workbook *);
419
void        workbook_print               (Workbook *);
420
void        workbook_attach_sheet        (Workbook *, Sheet *);
421
gboolean    workbook_detach_sheet        (Workbook *, Sheet *, gboolean);
422
Sheet      *workbook_focus_current_sheet (Workbook *wb);
Michael Meeks's avatar
Michael Meeks committed
423
void        workbook_focus_sheet         (Sheet *sheet);
Arturo Espinosa's avatar
Arturo Espinosa committed
424
Sheet      *workbook_get_current_sheet   (Workbook *wb);
425
char       *workbook_sheet_get_free_name (Workbook *wb);
426
void        workbook_auto_expr_label_set (Workbook *wb, const char *text);
427 428 429
char       *workbook_set_auto_expr       (Workbook *wb, Sheet *sheet,
					  const char *description,
					  const char *expression);
430
void        workbook_next_generation     (Workbook *wb);
431 432
void        workbook_set_region_status   (Workbook *wb, const char *str);
int         workbook_parse_and_jump      (Workbook *wb, const char *text);
433
Sheet      *workbook_sheet_lookup        (Workbook *wb, const char *sheet_name);
434
void        workbook_mark_clean          (Workbook *wb);
435
void        workbook_set_dirty           (Workbook *wb, gboolean is_dirty);
436
gboolean    workbook_rename_sheet        (Workbook *wb,
Miguel de Icaza's avatar
Miguel de Icaza committed
437 438
					  const char *old_name,
					  const char *new_name);
439
int         workbook_sheet_count         (Workbook *wb);
Arturo Espinosa's avatar
Arturo Espinosa committed
440
gboolean    workbook_can_detach_sheet    (Workbook *wb, Sheet *sheet);
441
GList      *workbook_sheets              (Workbook *wb);
442
char       *workbook_selection_to_string (Workbook *wb, Sheet *base_sheet);
Arturo Espinosa's avatar
Arturo Espinosa committed
443

Arturo Espinosa's avatar
Arturo Espinosa committed
444 445 446 447
/*
 * Does any pending recalculations
 */
void        workbook_recalc              (Workbook *wb);
448
void        workbook_recalc_all          (Workbook *wb);
Arturo Espinosa's avatar
Arturo Espinosa committed
449

450 451 452 453
/*
 * Callback routine: invoked when the first view ItemGrid
 * is realized to allocate the default styles
 */
454
void     workbook_realized            (Workbook *, GdkWindow *);
455

456 457 458 459 460
typedef gboolean (*WorkbookCallback)(Workbook *, gpointer data);

void     workbook_foreach             (WorkbookCallback cback,
				       gpointer data);

461 462
void	workbook_fixup_references	(Workbook *wb, Sheet *sheet,
					 int col, int row,
463
					 int coldelta, int rowdelta);
464 465
void	workbook_invalidate_references	(Workbook *wb, Sheet *sheet,
					 int col, int row,
466 467
					 int colcount, int rowcount);

468

Miguel de Icaza's avatar
New:  
Miguel de Icaza committed
469 470 471 472 473 474 475 476 477 478 479 480
/*
 * Feedback routines
 */
typedef enum {
	WORKBOOK_FEEDBACK_BOLD,
	WORKBOOK_FEEDBACK_ITALIC
} WorkbookFeedbackType;

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

481
extern   Workbook *current_workbook;
482 483 484 485 486 487 488 489 490

/*
 * Hooks for CORBA bootstrap: they create the 
 */
void workbook_corba_setup    (Workbook *);
void workbook_corba_shutdown (Workbook *);

void sheet_corba_setup       (Sheet *);
void sheet_corba_shutdown    (Sheet *);
491
#endif /* GNUMERIC_SHEET_H */
Miguel de Icaza's avatar
New:  
Miguel de Icaza committed
492