1/* 2 * tkTable.h -- 3 * 4 * This is the header file for the module that implements 5 * table widgets for the Tk toolkit. 6 * 7 * Copyright (c) 1997-2002 Jeffrey Hobbs 8 * 9 * See the file "license.txt" for information on usage and redistribution 10 * of this file, and for a DISCLAIMER OF ALL WARRANTIES. 11 * 12 * RCS: @(#) $Id: tkTable.h,v 1.18 2010/08/05 23:23:20 hobbs Exp $ 13 */ 14 15#ifndef _TKTABLE_H_ 16#define _TKTABLE_H_ 17 18#include <string.h> 19#include <stdlib.h> 20#include <ctype.h> 21#include <tk.h> 22#ifdef MAC_TCL 23# include <Xatom.h> 24#else 25# include <X11/Xatom.h> 26#endif /* MAC_TCL */ 27 28#if (TCL_MAJOR_VERSION == 8) && (TCL_MINOR_VERSION == 0) /* Tcl8.0 stuff */ 29#define Tcl_GetString(objPtr) Tcl_GetStringFromObj(objPtr, (int *)NULL) 30#endif 31 32#if (TCL_MAJOR_VERSION > 8) || ((TCL_MAJOR_VERSION == 8) && (TCL_MINOR_VERSION >= 4)) 33# define HAVE_TCL84 34#endif 35 36/* 37 * Tcl/Tk 8.4 introduced better CONST-ness in the APIs, but we use CONST84 in 38 * some cases for compatibility with earlier Tcl headers to prevent warnings. 39 */ 40#ifndef CONST84 41# define CONST84 42#endif 43 44/* This EXTERN declaration is needed for Tcl < 8.0.3 */ 45#ifndef EXTERN 46# ifdef __cplusplus 47# define EXTERN extern "C" 48# else 49# define EXTERN extern 50# endif 51#endif 52 53#ifdef TCL_STORAGE_CLASS 54# undef TCL_STORAGE_CLASS 55#endif 56#ifdef BUILD_Tktable 57# define TCL_STORAGE_CLASS DLLEXPORT 58#else 59# define TCL_STORAGE_CLASS DLLIMPORT 60#endif 61 62#ifdef WIN32 63# define WIN32_LEAN_AND_MEAN 64# include <windows.h> 65# undef WIN32_LEAN_AND_MEAN 66/* VC++ has an entry point called DllMain instead of DllEntryPoint */ 67# if defined(_MSC_VER) 68# define DllEntryPoint DllMain 69# endif 70#endif 71 72#if defined(WIN32) || defined(MAC_TCL) || defined(MAC_OSX_TK) 73/* XSync call defined in the internals for some reason */ 74# ifndef XSync 75# define XSync(display, bool) {display->request++;} 76# endif 77#endif /* defn of XSync */ 78 79#ifndef NORMAL_BG 80# ifdef WIN32 81# define NORMAL_BG "SystemButtonFace" 82# define ACTIVE_BG NORMAL_BG 83# define SELECT_BG "SystemHighlight" 84# define SELECT_FG "SystemHighlightText" 85# define DISABLED "SystemDisabledText" 86# define HIGHLIGHT "SystemWindowFrame" 87# define DEF_TABLE_FONT "{MS Sans Serif} 8" 88# elif defined(MAC_TCL) || defined(MAC_OSX_TK) 89# define NORMAL_BG "systemWindowBody" 90# define ACTIVE_BG "#ececec" 91# define SELECT_BG "systemHighlight" 92# define SELECT_FG "systemHighlightText" 93# define DISABLED "#a3a3a3" 94# define HIGHLIGHT "Black" 95# define DEF_TABLE_FONT "Helvetica 12" 96# else 97# define NORMAL_BG "#d9d9d9" 98# define ACTIVE_BG "#fcfcfc" 99# define SELECT_BG "#c3c3c3" 100# define SELECT_FG "Black" 101# define DISABLED "#a3a3a3" 102# define HIGHLIGHT "Black" 103# define DEF_TABLE_FONT "Helvetica -12" 104# endif 105#endif /* NORMAL_BG */ 106 107#define MAX(A,B) (((A)>(B))?(A):(B)) 108#define MIN(A,B) (((A)>(B))?(B):(A)) 109#define BETWEEN(val,min,max) ( ((val)<(min)) ? (min) : \ 110 ( ((val)>(max)) ? (max) : (val) ) ) 111#define CONSTRAIN(val,min,max) if ((val) < (min)) { (val) = MIN(min,max); } \ 112 else if ((val) > (max)) { (val) = (max); } 113#define STREQ(s1, s2) (strcmp((s1), (s2)) == 0) 114#define ARSIZE(A) (sizeof(A)/sizeof(*A)) 115#define INDEX_BUFSIZE 32 /* max size of buffer for indices */ 116#define TEST_KEY "#TEST KEY#" /* index for testing array existence */ 117 118/* 119 * Assigned bits of "flags" fields of Table structures, and what those 120 * bits mean: 121 * 122 * REDRAW_PENDING: Non-zero means a DoWhenIdle handler has 123 * already been queued to redisplay the table. 124 * REDRAW_BORDER: Non-zero means 3-D border must be redrawn 125 * around window during redisplay. Normally 126 * only text portion needs to be redrawn. 127 * CURSOR_ON: Non-zero means insert cursor is displayed at 128 * present. 0 means it isn't displayed. 129 * TEXT_CHANGED: Non-zero means the active cell text is being edited. 130 * HAS_FOCUS: Non-zero means this window has the input focus. 131 * HAS_ACTIVE: Non-zero means the active cell is set. 132 * HAS_ANCHOR: Non-zero means the anchor cell is set. 133 * BROWSE_CMD: Non-zero means we're evaluating the -browsecommand. 134 * VALIDATING: Non-zero means we are in a valCmd 135 * SET_ACTIVE: About to set the active array element internally 136 * ACTIVE_DISABLED: Non-zero means the active cell is -state disabled 137 * OVER_BORDER: Non-zero means we are over a table cell border 138 * REDRAW_ON_MAP: Forces a redraw on the unmap 139 * AVOID_SPANS: prevent cell spans from being used 140 * 141 * FIX - consider adding UPDATE_SCROLLBAR a la entry 142 */ 143#define REDRAW_PENDING (1L<<0) 144#define CURSOR_ON (1L<<1) 145#define HAS_FOCUS (1L<<2) 146#define TEXT_CHANGED (1L<<3) 147#define HAS_ACTIVE (1L<<4) 148#define HAS_ANCHOR (1L<<5) 149#define BROWSE_CMD (1L<<6) 150#define REDRAW_BORDER (1L<<7) 151#define VALIDATING (1L<<8) 152#define SET_ACTIVE (1L<<9) 153#define ACTIVE_DISABLED (1L<<10) 154#define OVER_BORDER (1L<<11) 155#define REDRAW_ON_MAP (1L<<12) 156#define AVOID_SPANS (1L<<13) 157 158/* Flags for TableInvalidate && TableRedraw */ 159#define ROW (1L<<0) 160#define COL (1L<<1) 161#define CELL (1L<<2) 162 163#define CELL_BAD (1<<0) 164#define CELL_OK (1<<1) 165#define CELL_SPAN (1<<2) 166#define CELL_HIDDEN (1<<3) 167#define CELL_VIEWABLE (CELL_OK|CELL_SPAN) 168 169#define INV_FILL (1L<<3) /* use for Redraw when the affected 170 * row/col will affect neighbors */ 171#define INV_FORCE (1L<<4) 172#define INV_HIGHLIGHT (1L<<5) 173#define INV_NO_ERR_MSG (1L<<5) /* Don't leave an error message */ 174 175/* These alter how the selection set/clear commands behave */ 176#define SEL_ROW (1<<0) 177#define SEL_COL (1<<1) 178#define SEL_BOTH (1<<2) 179#define SEL_CELL (1<<3) 180#define SEL_NONE (1<<4) 181 182/* 183 * Definitions for tablePtr->dataSource, by bit 184 */ 185#define DATA_NONE 0 186#define DATA_CACHE (1<<1) 187#define DATA_ARRAY (1<<2) 188#define DATA_COMMAND (1<<3) 189 190/* 191 * Definitions for configuring -borderwidth 192 */ 193#define BD_TABLE 0 194#define BD_TABLE_TAG (1<<1) 195#define BD_TABLE_WIN (1<<2) 196 197/* 198 * Possible state values for tags 199 */ 200typedef enum { 201 STATE_UNUSED, STATE_UNKNOWN, STATE_HIDDEN, 202 STATE_NORMAL, STATE_DISABLED, STATE_ACTIVE, STATE_LAST 203} TableState; 204 205/* 206 * Structure for use in parsing table commands/values. 207 * Accessor functions defined in tkTableUtil.c 208 */ 209typedef struct { 210 char *name; /* name of the command/value */ 211 int value; /* >0 because 0 represents an error or proc */ 212} Cmd_Struct; 213 214/* 215 * The tag structure 216 */ 217typedef struct { 218 Tk_3DBorder bg; /* background color */ 219 Tk_3DBorder fg; /* foreground color */ 220 221 char * borderStr; /* border style */ 222 int borders; /* number of borders specified (1, 2 or 4) */ 223 int bd[4]; /* cell border width */ 224 225 int relief; /* relief type */ 226 Tk_Font tkfont; /* Information about text font, or NULL. */ 227 Tk_Anchor anchor; /* default anchor point */ 228 char * imageStr; /* name of image */ 229 Tk_Image image; /* actual pointer to image, if any */ 230 TableState state; /* state of the cell */ 231 Tk_Justify justify; /* justification of text in the cell */ 232 int multiline; /* wrapping style of multiline text */ 233 int wrap; /* wrapping style of multiline text */ 234 int showtext; /* whether to display text over image */ 235 char * ellipsis; /* ellipsis to display on clipped text */ 236} TableTag; 237 238/* The widget structure for the table Widget */ 239 240typedef struct { 241 /* basic information about the window and the interpreter */ 242 Tk_Window tkwin; 243 Display *display; 244 Tcl_Interp *interp; 245 Tcl_Command widgetCmd; /* Token for entry's widget command. */ 246 247 /* 248 * Configurable Options 249 */ 250 int autoClear; 251 char *selectMode; /* single, browse, multiple, or extended */ 252 int selectType; /* row, col, both, or cell */ 253 int selectTitles; /* whether to do automatic title selection */ 254 int rows, cols; /* number of rows and columns */ 255 int defRowHeight; /* default row height in chars (positive) 256 * or pixels (negative) */ 257 int defColWidth; /* default column width in chars (positive) 258 * or pixels (negative) */ 259 int maxReqCols; /* the requested # cols to display */ 260 int maxReqRows; /* the requested # rows to display */ 261 int maxReqWidth; /* the maximum requested width in pixels */ 262 int maxReqHeight; /* the maximum requested height in pixels */ 263 char *arrayVar; /* name of traced array variable */ 264 char *rowSep; /* separator string to place between 265 * rows when getting selection */ 266 char *colSep; /* separator string to place between 267 * cols when getting selection */ 268 TableTag defaultTag; /* the default tag colors/fonts etc */ 269 char *yScrollCmd; /* the y-scroll command */ 270 char *xScrollCmd; /* the x-scroll command */ 271 char *browseCmd; /* the command that is called when the 272 * active cell changes */ 273 int caching; /* whether to cache values of table */ 274 char *command; /* A command to eval when get/set occurs 275 * for table values */ 276 int useCmd; /* Signals whether to use command or the 277 * array variable, will be 0 if command errs */ 278 char *selCmd; /* the command that is called to when a 279 * [selection get] call occurs for a table */ 280 char *valCmd; /* Command prefix to use when invoking 281 * validate command. NULL means don't 282 * invoke commands. Malloc'ed. */ 283 int validate; /* Non-zero means try to validate */ 284 Tk_3DBorder insertBg; /* the cursor color */ 285 Tk_Cursor cursor; /* the regular mouse pointer */ 286 Tk_Cursor bdcursor; /* the mouse pointer when over borders */ 287#ifdef TITLE_CURSOR 288 Tk_Cursor titleCursor; /* the mouse pointer when over titles */ 289#endif 290 int exportSelection; /* Non-zero means tie internal table 291 * to X selection. */ 292 TableState state; /* Normal or disabled. Table is read-only 293 * when disabled. */ 294 int insertWidth; /* Total width of insert cursor. */ 295 int insertBorderWidth; /* Width of 3-D border around insert cursor. */ 296 int insertOnTime; /* Number of milliseconds cursor should spend 297 * in "on" state for each blink. */ 298 int insertOffTime; /* Number of milliseconds cursor should spend 299 * in "off" state for each blink. */ 300 int invertSelected; /* Whether to draw selected cells swapping 301 * foreground and background */ 302 int colStretch; /* The way to stretch columns if the window 303 * is too large */ 304 int rowStretch; /* The way to stretch rows if the window is 305 * too large */ 306 int colOffset; /* X index of leftmost col in the display */ 307 int rowOffset; /* Y index of topmost row in the display */ 308 int drawMode; /* The mode to use when redrawing */ 309 int flashMode; /* Specifies whether flashing is enabled */ 310 int flashTime; /* The number of ms to flash a cell for */ 311 int resize; /* -resizeborders option for interactive 312 * resizing of borders */ 313 int sparse; /* Whether to use "sparse" arrays by 314 * deleting empty array elements (default) */ 315 char *rowTagCmd, *colTagCmd;/* script to eval for getting row/tag cmd */ 316 int highlightWidth; /* Width in pixels of highlight to draw 317 * around widget when it has the focus. 318 * <= 0 means don't draw a highlight. */ 319 XColor *highlightBgColorPtr;/* Color for drawing traversal highlight 320 * area when highlight is off. */ 321 XColor *highlightColorPtr; /* Color for drawing traversal highlight. */ 322 char *takeFocus; /* Used only in Tcl to check if this 323 * widget will accept focus */ 324 int padX, padY; /* Extra space around text (pixels to leave 325 * on each side). Ignored for bitmaps and 326 * images. */ 327 int ipadX, ipadY; /* Space to leave empty around cell borders. 328 * This differs from pad* in that it is always 329 * present for the cell (except windows). */ 330 331 /* 332 * Cached Information 333 */ 334#ifdef TITLE_CURSOR 335 Tk_Cursor *lastCursorPtr; /* pointer to last cursor defined. */ 336#endif 337 int titleRows, titleCols; /* the number of rows|cols to use as a title */ 338 /* these are kept in real coords */ 339 int topRow, leftCol; /* The topleft cell to display excluding the 340 * fixed title rows. This is just the 341 * config request. The actual cell used may 342 * be different to keep the screen full */ 343 int anchorRow, anchorCol; /* the row,col of the anchor cell */ 344 int activeRow, activeCol; /* the row,col of the active cell */ 345 int oldTopRow, oldLeftCol; /* cached by TableAdjustParams */ 346 int oldActRow, oldActCol; /* cached by TableAdjustParams */ 347 int icursor; /* The index of the insertion cursor in the 348 * active cell */ 349 int flags; /* An or'ed combination of flags concerning 350 * redraw/cursor etc. */ 351 int dataSource; /* where our data comes from: 352 * DATA_{NONE,CACHE,ARRAY,COMMAND} */ 353 int maxWidth, maxHeight; /* max width|height required in pixels */ 354 int charWidth, charHeight; /* size of a character in the default font */ 355 int *colPixels, *rowPixels; /* Array of the pixel widths/heights */ 356 int *colStarts, *rowStarts; /* Array of start pixels for rows|columns */ 357 int scanMarkX, scanMarkY; /* Used by "scan" and "border" to mark */ 358 int scanMarkRow, scanMarkCol;/* necessary information for dragto */ 359 /* values in these are kept in user coords */ 360 Tcl_HashTable *cache; /* value cache */ 361 362 /* 363 * colWidths and rowHeights are indexed from 0, so always adjust numbers 364 * by the appropriate *Offset factor 365 */ 366 Tcl_HashTable *colWidths; /* hash table of non default column widths */ 367 Tcl_HashTable *rowHeights; /* hash table of non default row heights */ 368 Tcl_HashTable *spanTbl; /* table for spans */ 369 Tcl_HashTable *spanAffTbl; /* table for cells affected by spans */ 370 Tcl_HashTable *tagTable; /* table for style tags */ 371 Tcl_HashTable *winTable; /* table for embedded windows */ 372 Tcl_HashTable *rowStyles; /* table for row styles */ 373 Tcl_HashTable *colStyles; /* table for col styles */ 374 Tcl_HashTable *cellStyles; /* table for cell styles */ 375 Tcl_HashTable *flashCells; /* table of flashing cells */ 376 Tcl_HashTable *selCells; /* table of selected cells */ 377 Tcl_TimerToken cursorTimer; /* timer token for the cursor blinking */ 378 Tcl_TimerToken flashTimer; /* timer token for the cell flashing */ 379 char *activeBuf; /* buffer where the selection is kept 380 * for editing the active cell */ 381 char **tagPrioNames; /* list of tag names in priority order */ 382 TableTag **tagPrios; /* list of tag pointers in priority order */ 383 TableTag *activeTagPtr; /* cache of active composite tag */ 384 int activeX, activeY; /* cache offset of active layout in cell */ 385 int tagPrioSize; /* size of tagPrios list */ 386 int tagPrioMax; /* max allocated size of tagPrios list */ 387 388 /* The invalid rectangle if there is an update pending */ 389 int invalidX, invalidY, invalidWidth, invalidHeight; 390 int seen[4]; /* see TableUndisplay */ 391 392#ifdef POSTSCRIPT 393 /* Pointer to information used for generating Postscript for the canvas. 394 * NULL means no Postscript is currently being generated. */ 395 struct TkPostscriptInfo *psInfoPtr; 396#endif 397 398#ifdef PROCS 399 Tcl_HashTable *inProc; /* cells where proc is being evaled */ 400 int showProcs; /* whether to show embedded proc (1) or 401 * its calculated value (0) */ 402 int hasProcs; /* whether table has embedded procs or not */ 403#endif 404} Table; 405 406/* 407 * HEADERS FOR EMBEDDED WINDOWS 408 */ 409 410/* 411 * A structure of the following type holds information for each window 412 * embedded in a table widget. 413 */ 414 415typedef struct TableEmbWindow { 416 Table *tablePtr; /* Information about the overall table 417 * widget. */ 418 Tk_Window tkwin; /* Window for this segment. NULL means that 419 * the window hasn't been created yet. */ 420 Tcl_HashEntry *hPtr; /* entry into winTable */ 421 char *create; /* Script to create window on-demand. 422 * NULL means no such script. 423 * Malloc-ed. */ 424 Tk_3DBorder bg; /* background color */ 425 426 char *borderStr; /* border style */ 427 int borders; /* number of borders specified (1, 2 or 4) */ 428 int bd[4]; /* border width for cell around window */ 429 430 int relief; /* relief type */ 431 int sticky; /* How to align window in space */ 432 int padX, padY; /* Padding to leave around each side 433 * of window, in pixels. */ 434 int displayed; /* Non-zero means that the window has been 435 * displayed on the screen recently. */ 436} TableEmbWindow; 437 438extern Tk_ConfigSpec tableSpecs[]; 439 440extern void EmbWinDisplay(Table *tablePtr, Drawable window, 441 TableEmbWindow *ewPtr, TableTag *tagPtr, 442 int x, int y, int width, int height); 443extern void EmbWinUnmap(register Table *tablePtr, 444 int rlo, int rhi, int clo, int chi); 445extern void EmbWinDelete(register Table *tablePtr, TableEmbWindow *ewPtr); 446extern int Table_WinMove(register Table *tablePtr, 447 char *CONST srcPtr, char *CONST destPtr, int flags); 448extern int Table_WinDelete(register Table *tablePtr, char *CONST idxPtr); 449extern int Table_WindowCmd(ClientData clientData, 450 Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]); 451extern int TableValidateChange(Table *tablePtr, int r, 452 int c, char *oldVal, char *newVal, int idx); 453extern void TableLostSelection(ClientData clientData); 454extern void TableSetActiveIndex(register Table *tablePtr); 455 456/* 457 * HEADERS IN tkTableCmds.c 458 */ 459 460extern int Table_ActivateCmd(ClientData clientData, 461 Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]); 462extern int Table_AdjustCmd(ClientData clientData, 463 Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]); 464extern int Table_BboxCmd(ClientData clientData, 465 Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]); 466extern int Table_BorderCmd(ClientData clientData, 467 Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]); 468extern int Table_ClearCmd(ClientData clientData, 469 Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]); 470extern int Table_CurselectionCmd(ClientData clientData, 471 Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]); 472extern int Table_CurvalueCmd(ClientData clientData, 473 Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]); 474extern int Table_GetCmd(ClientData clientData, 475 Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]); 476extern int Table_ScanCmd(ClientData clientData, 477 Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]); 478extern int Table_SeeCmd(ClientData clientData, 479 Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]); 480extern int Table_SelAnchorCmd(ClientData clientData, 481 Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]); 482extern int Table_SelClearCmd(ClientData clientData, 483 Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]); 484extern int Table_SelIncludesCmd(ClientData clientData, 485 Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]); 486extern int Table_SelSetCmd(ClientData clientData, 487 Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]); 488extern int Table_ViewCmd(ClientData clientData, 489 Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]); 490 491/* 492 * HEADERS IN tkTableEdit.c 493 */ 494 495extern int Table_EditCmd(ClientData clientData, 496 Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]); 497extern void TableDeleteChars(register Table *tablePtr, 498 int idx, int count); 499extern void TableInsertChars(register Table *tablePtr, 500 int idx, char *string); 501 502/* 503 * HEADERS IN tkTableTag.c 504 */ 505 506extern TableTag *TableNewTag(Table *tablePtr); 507extern void TableResetTag(Table *tablePtr, TableTag *tagPtr); 508extern void TableMergeTag(Table *tablePtr, TableTag *baseTag, 509 TableTag *addTag); 510extern void TableInvertTag(TableTag *baseTag); 511extern int TableGetTagBorders(TableTag *tagPtr, 512 int *left, int *right, int *top, int *bottom); 513extern void TableInitTags(Table *tablePtr); 514extern TableTag *FindRowColTag(Table *tablePtr, 515 int cell, int type); 516extern void TableCleanupTag(Table *tablePtr, 517 TableTag *tagPtr); 518extern int Table_TagCmd(ClientData clientData, 519 Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]); 520 521/* 522 * HEADERS IN tkTableUtil.c 523 */ 524 525extern void Table_ClearHashTable(Tcl_HashTable *hashTblPtr); 526extern int TableOptionBdSet(ClientData clientData, 527 Tcl_Interp *interp, Tk_Window tkwin, 528 CONST84 char *value, char *widgRec, int offset); 529extern char * TableOptionBdGet(ClientData clientData, 530 Tk_Window tkwin, char *widgRec, int offset, 531 Tcl_FreeProc **freeProcPtr); 532extern int TableTagConfigureBd(Table *tablePtr, 533 TableTag *tagPtr, char *oldValue, int nullOK); 534extern int Cmd_OptionSet(ClientData clientData, 535 Tcl_Interp *interp, 536 Tk_Window unused, CONST84 char *value, 537 char *widgRec, int offset); 538extern char * Cmd_OptionGet(ClientData clientData, 539 Tk_Window unused, char *widgRec, 540 int offset, Tcl_FreeProc **freeProcPtr); 541 542/* 543 * HEADERS IN tkTableCell.c 544 */ 545 546extern int TableTrueCell(Table *tablePtr, int row, int col, 547 int *trow, int *tcol); 548extern int TableCellCoords(Table *tablePtr, int row, 549 int col, int *rx, int *ry, int *rw, int *rh); 550extern int TableCellVCoords(Table *tablePtr, int row, 551 int col, int *rx, int *ry, 552 int *rw, int *rh, int full); 553extern void TableWhatCell(register Table *tablePtr, 554 int x, int y, int *row, int *col); 555extern int TableAtBorder(Table *tablePtr, int x, int y, 556 int *row, int *col); 557extern char * TableGetCellValue(Table *tablePtr, int r, int c); 558extern int TableSetCellValue(Table *tablePtr, int r, int c, 559 char *value); 560extern int TableMoveCellValue(Table *tablePtr, 561 int fromr, int fromc, char *frombuf, 562 int tor, int toc, char *tobuf, int outOfBounds); 563 564extern int TableGetIcursor(Table *tablePtr, char *arg, 565 int *posn); 566#define TableGetIcursorObj(tablePtr, objPtr, posnPtr) \ 567 TableGetIcursor(tablePtr, Tcl_GetString(objPtr), posnPtr) 568extern int TableGetIndex(register Table *tablePtr, 569 char *str, int *row_p, int *col_p); 570#define TableGetIndexObj(tablePtr, objPtr, rowPtr, colPtr) \ 571 TableGetIndex(tablePtr, Tcl_GetString(objPtr), rowPtr, colPtr) 572extern int Table_SetCmd(ClientData clientData, 573 Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]); 574extern int Table_HiddenCmd(ClientData clientData, 575 Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]); 576extern int Table_SpanCmd(ClientData clientData, 577 Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]); 578extern void TableSpanSanCheck(register Table *tablePtr); 579 580/* 581 * HEADERS IN TKTABLECELLSORT 582 */ 583/* 584 * We keep the old CellSort true because it is used for grabbing 585 * the selection, so we really want them ordered 586 */ 587extern char * TableCellSort(Table *tablePtr, char *str); 588#ifdef NO_SORT_CELLS 589# define TableCellSortObj(interp, objPtr) (objPtr) 590#else 591extern Tcl_Obj* TableCellSortObj(Tcl_Interp *interp, Tcl_Obj *listObjPtr); 592#endif 593 594/* 595 * HEADERS IN TKTABLEPS 596 */ 597 598#ifdef POSTSCRIPT 599extern int Table_PostscriptCmd(ClientData clientData, 600 Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]); 601extern void Tcl_DStringAppendAllTCL_VARARGS(Tcl_DString *, arg1); 602#endif 603 604/* 605 * HEADERS IN TKTABLE 606 */ 607 608EXTERN int Tktable_Init(Tcl_Interp *interp); 609EXTERN int Tktable_SafeInit(Tcl_Interp *interp); 610 611extern void TableGetActiveBuf(register Table *tablePtr); 612extern void ExpandPercents(Table *tablePtr, char *before, 613 int r, int c, char *oldVal, char *newVal, int idx, 614 Tcl_DString *dsPtr, int cmdType); 615extern void TableInvalidate(Table *tablePtr, int x, int y, 616 int width, int height, int force); 617extern void TableRefresh(register Table *tablePtr, 618 int arg1, int arg2, int mode); 619extern void TableGeometryRequest(Table *tablePtr); 620extern void TableAdjustActive(register Table *tablePtr); 621extern void TableAdjustParams(register Table *tablePtr); 622extern void TableConfigCursor(register Table *tablePtr); 623extern void TableAddFlash(Table *tablePtr, int row, int col); 624 625 626#define TableInvalidateAll(tablePtr, flags) \ 627 TableInvalidate((tablePtr), 0, 0, Tk_Width((tablePtr)->tkwin),\ 628 Tk_Height((tablePtr)->tkwin), (flags)) 629 630 /* 631 * Turn row/col into an index into the table 632 */ 633#define TableMakeArrayIndex(r, c, i) sprintf((i), "%d,%d", (r), (c)) 634 635 /* 636 * Turn array index back into row/col 637 * return the number of args parsed (should be two) 638 */ 639#define TableParseArrayIndex(r, c, i) sscanf((i), "%d,%d", (r), (c)) 640 641 /* 642 * Macro for finding the last cell of the table 643 */ 644#define TableGetLastCell(tablePtr, rowPtr, colPtr) \ 645 TableWhatCell((tablePtr),\ 646 Tk_Width((tablePtr)->tkwin)-(tablePtr)->highlightWidth-1,\ 647 Tk_Height((tablePtr)->tkwin)-(tablePtr)->highlightWidth-1,\ 648 (rowPtr), (colPtr)) 649 650/* 651 * end of header 652 * reset TCL_STORAGE_CLASS to DLLIMPORT. 653 */ 654#undef TCL_STORAGE_CLASS 655#define TCL_STORAGE_CLASS DLLIMPORT 656 657#endif /* _TKTABLE_H_ */ 658 659