/*****************************************************************************/
/*                           Jean-Eloi Dussartre                             */
/*                          M.I.T. Project Athena.                           */
/*                              January 1990.                                */
/*                   The Spreadsheet Widget implementation.                  */
/*                     The AtTable Object implementation.                    */
/*****************************************************************************/


/* Preliminary remarks:
 * All name prefixed by A (like in Athena) are public.
 * Table are indexed as follow :
 * Upper left corner is (irow = 0, icol = 0), row index increases downward,
 * column index increases from left to right. The last cell is (nrow -1,
 * ncol - 1).
 * Procedures parameters are usually in the following order :
 *           - ATable (usually named t).
 *           - Row value (either irow for index, or nrow for dimension).
 *           - Column value (either icol for index, or ncol for dimension).
 *           - Range value (trow for top row, lcol for left column,
 *                          brow for bottom row, rcol for right column).
 *           - Value (usually v).
 */

#ifndef AtTable_H



#define AtTable_H     /* Sign up in the preprocessor */



/* Type definition */

typedef struct AtTableRec_             *AtTable;
typedef unsigned char                  AtTableEvent;
typedef void (*AtTableEventHandler) (void *,
				     AtTable,      /* table object      */
				     AtTableEvent, /* Events to see     */
				     short int,    /* Row top           */
				     short int,    /* Column left       */
				     short int,    /* Row bottom        */
				     short int);   /* Column right      */






/* Macro definition */

#define AtTableFirstRow(T)        0
#define AtTableLastRow(T)        (AtTableGetRowNum(T) - 1)
#define AtTableFirstColumn(T)     0
#define AtTableLastColumn(T)     (AtTableGetColumnNum(T) - 1)

/* Clear macro relies on clear range and set cell */

#define AtTableClearCell(T, NROW, NCELL)        \
			AtTableSetCell(T, NROW, NCELL, AtTableEmptyCell)
#define AtTableClearCol(T, NCOL)                \
		 AtTableClearRange(T, 0, NCOL, AtTableLastRow(T), NCOL)
#define AtTableClearRow(T, NROW)                \
		 AtTableClearRange(T, NROW, 0, NROW, AtTableLastColumn(T))
#define AtTableClearAll(T)                      \
		 AtTableClearRange(T,                                 \
				   0, 0,                              \
				   AtTableLastRow(T), AtTableLastColumn(T))

/* Deletion relies on delete columns and delete rows */

#define AtTableDelRow(T, IROW)    AtTableDeleteRows(t, IROW, IROW)
#define AtTableDelColumn(T, ICOL) AtTableDeleteColumns(t, ICOL, ICOL)




  /*  Variables */
extern char *AtTableEmptyCell;   /* This is the empty cell */
extern int  AtTableLastError;    /* This is the error var. */


  /* Events Registration definitions */

#define AtTableEventRowSize         0x01
#define AtTableEventColumnSize      0x02
#define AtTableEventRangeSet        0x04
#define AtTableEventRangeGet	    0x08
#define AtTableEventActivation      0x10
#define AtTableEventDeactivation    0x20
#define AtTableEventAll             0xFF



  /* Entry Points */

extern AtTable AtTableCreate(short int nrow, short int ncol);
extern void AtTableDestroy(AtTable t);
extern void AtTableSubscribe(AtTable             t,
			     AtTableEvent        e,
			     void                *p,
			     AtTableEventHandler f);
extern Boolean AtTableCancel(AtTable, void *, AtTableEventHandler);
extern Boolean AtTableAddEvent(AtTable, void *, AtTableEventHandler, AtTableEvent);
extern Boolean AtTableDropEvent(AtTable, void *, AtTableEventHandler, AtTableEvent);
extern AtTableEvent AtTableGetEventMask(AtTable, void *, AtTableEventHandler);
extern Boolean AtTableChangeId(AtTable, void *, AtTableEventHandler, void *);
extern Boolean AtTableSetCell (AtTable, short int, short int, char *);
extern char *AtTableGetCell(AtTable, short int, short int);
extern Boolean AtTableClearRange(AtTable,
				 short int,
				 short int,
				 short int,
				 short int);
extern short int AtTableGetRowNum(AtTable);
extern short int AtTableGetColumnNum(AtTable);
extern Boolean   AtTableSetRange(AtTable,
				 short int,
				 short int,
				 short int,
				 short int,
				 char *);
extern Boolean AtTableDeleteRows(AtTable,
				 short int,
				 short int);
extern Boolean AtTableDeleteColumns(AtTable,
				    short int,
				    short int);
extern Boolean AtTableInsertRows(AtTable,
				 short int,
				 short int);
extern Boolean AtTableInsertColumns(AtTable, short int, short int);
extern Boolean AtTableMoveRange(AtTable,
				short int, short int, short int, short int,
				short int, short int, short int, short int);
extern Boolean AtTableCopyRange(AtTable,
				short int, short int, short int, short int,
				short int, short int, short int, short int);

extern char *AtTableGetRowLabel(AtTable, short int);
extern char *AtTableGetColumnLabel(AtTable, short int);

/* DO NOT ADD ANYTHING AFTER THIS LINE */
#endif /* TABLE_H */





