1/* 2 * tkTreeCtrl.h -- 3 * 4 * This module is the header for treectrl widgets for the Tk toolkit. 5 * 6 * Copyright (c) 2002-2009 Tim Baker 7 * Copyright (c) 2002-2003 Christian Krone 8 * Copyright (c) 2003 ActiveState Corporation 9 * 10 * RCS: @(#) $Id: tkTreeCtrl.h,v 1.103 2010/03/21 20:47:06 treectrl Exp $ 11 */ 12 13#include "tkPort.h" 14#include "default.h" 15#include "tclInt.h" 16#include "tkInt.h" 17#include "qebind.h" 18 19/* 20 * Used to tag functions that are only to be visible within the module being 21 * built and not outside it (where this is supported by the linker). 22 */ 23 24#ifndef MODULE_SCOPE 25# ifdef __cplusplus 26# define MODULE_SCOPE extern "C" 27# else 28# define MODULE_SCOPE extern 29# endif 30#endif 31 32#ifdef PLATFORM_SDL 33#undef WIN32 34#endif 35 36#define dbwin TreeCtrl_dbwin 37#define dbwin_add_interp TreeCtrl_dbwin_add_interp 38MODULE_SCOPE void dbwin(char *fmt, ...); 39MODULE_SCOPE void dbwin_add_interp(Tcl_Interp *interp); 40 41#ifndef TRUE 42#define TRUE 1 43#define FALSE 0 44#endif 45 46#ifdef WIN32 47#define vsnprintf _vsnprintf 48#endif 49 50#ifndef MIN 51#define MIN(a,b) ((a) < (b) ? (a) : (b)) 52#endif 53#ifndef MAX 54#define MAX(a,b) ((a) > (b) ? (a) : (b)) 55#endif 56 57#define SELECTION_VISIBLE 58#define ALLOC_HAX 59#define DEPRECATED 60/* #define DRAG_PIXMAP */ 61/* #define DRAGIMAGE_STYLE */ /* Use an item style as the dragimage instead of XOR rectangles. */ 62 63typedef struct TreeCtrl TreeCtrl; 64typedef struct TreeColumn_ *TreeColumn; 65typedef struct TreeColumnDInfo_ *TreeColumnDInfo; 66typedef struct TreeDInfo_ *TreeDInfo; 67typedef struct TreeDragImage_ *TreeDragImage; 68typedef struct TreeItem_ *TreeItem; 69typedef struct TreeItemColumn_ *TreeItemColumn; 70typedef struct TreeItemDInfo_ *TreeItemDInfo; 71typedef struct TreeMarquee_ *TreeMarquee; 72typedef struct TreeItemRInfo_ *TreeItemRInfo; 73typedef struct TreeStyle_ *TreeStyle; 74typedef struct TreeElement_ *TreeElement; 75typedef struct TreeThemeData_ *TreeThemeData; 76 77/*****/ 78 79typedef struct PerStateInfo PerStateInfo; 80typedef struct PerStateData PerStateData; 81typedef struct PerStateType PerStateType; 82 83/* There is one of these for each XColor, Tk_Font, Tk_Image etc */ 84struct PerStateData 85{ 86 int stateOff; 87 int stateOn; 88 /* Type-specific fields go here */ 89}; 90 91struct PerStateInfo 92{ 93#ifdef TREECTRL_DEBUG 94 PerStateType *type; 95#endif 96 Tcl_Obj *obj; 97 int count; 98 PerStateData *data; 99}; 100 101typedef int (*PerStateType_FromObjProc)(TreeCtrl *, Tcl_Obj *, PerStateData *); 102typedef void (*PerStateType_FreeProc)(TreeCtrl *, PerStateData *); 103 104struct PerStateType 105{ 106 CONST char *name; 107 int size; 108 PerStateType_FromObjProc fromObjProc; 109 PerStateType_FreeProc freeProc; 110}; 111 112/*****/ 113 114typedef struct 115{ 116 Drawable drawable; 117 int width; 118 int height; 119} TreeDrawable; 120 121typedef struct 122{ 123 int x, y; 124 int width, height; 125} TreeRectangle; 126 127typedef struct GCCache GCCache; 128struct GCCache 129{ 130 unsigned long mask; 131 XGCValues gcValues; 132 GC gc; 133 GCCache *next; 134}; 135 136/* 137 * A TreePtrList is used for dynamically-growing lists of ClientData pointers. 138 * A TreePtrList is NULL-terminated. 139 * Based on Tcl_DString code. 140 */ 141#define TIL_STATIC_SPACE 128 142typedef struct TreePtrList TreePtrList; 143typedef TreePtrList TreeItemList; 144typedef TreePtrList TreeColumnList; 145struct TreePtrList { 146#ifdef TREECTRL_DEBUG 147 char magic[4]; 148#endif 149 TreeCtrl *tree; 150 ClientData *pointers; /* NULL-terminated list of pointers. */ 151 int count; /* Number of items. */ 152 int space; /* Number of slots pointed to by pointers[]. */ 153 ClientData pointerSpace[TIL_STATIC_SPACE]; /* Space to use in common case 154 * where the list is small. */ 155}; 156 157enum { LEFT, TOP, RIGHT, BOTTOM }; 158 159struct TreeCtrlDebug 160{ 161 Tk_OptionTable optionTable; 162 int enable; /* Turn all debugging on/off */ 163 int data; /* Debug data structures */ 164 int display; /* Debug display routines */ 165 int span; /* Debug column spanning */ 166 int textLayout; /* Debug text layout */ 167 int displayDelay; /* Delay between copy/draw operations */ 168 XColor *eraseColor; /* Erase "invalidated" areas */ 169 GC gcErase; /* for eraseColor */ 170 XColor *drawColor; /* Erase about-to-be-drawn areas */ 171 GC gcDraw; /* for eraseColor */ 172}; 173 174struct TreeCtrlColumnDrag 175{ 176 Tk_OptionTable optionTable; 177 int enable; /* -enable */ 178 TreeColumn column; /* -imagecolumn */ 179 Tcl_Obj *offsetObj; /* -imageoffset */ 180 int offset; /* -imageoffset */ 181 XColor *color; /* -imagecolor */ 182 int alpha; /* -imagealpha */ 183 TreeColumn indColumn; /* -indicatorcolumn */ 184 XColor *indColor; /* -indicatorcolor */ 185 int indSide; /* -indicatorside */ 186}; 187 188struct TreeCtrl 189{ 190 /* Standard stuff */ 191 Tk_Window tkwin; 192 Display *display; 193 Tcl_Interp *interp; 194 Tcl_Command widgetCmd; 195 Tk_OptionTable optionTable; 196 197 /* Configuration options */ 198 Tcl_Obj *fgObj; /* -foreground */ 199 XColor *fgColorPtr; /* -foreground */ 200 Tcl_Obj *borderWidthObj; /* -borderwidth */ 201 int borderWidth; /* -borderwidth */ 202 Tk_3DBorder border; /* -background */ 203 Tk_Cursor cursor; /* Current cursor for window, or None. */ 204 int relief; /* -relief */ 205 Tcl_Obj *highlightWidthObj; /* -highlightthickness */ 206 int highlightWidth; /* -highlightthickness */ 207 XColor *highlightBgColorPtr; /* -highlightbackground */ 208 XColor *highlightColorPtr; /* -highlightcolor */ 209 char *xScrollCmd; /* -xscrollcommand */ 210 char *yScrollCmd; /* -yscrollcommand */ 211 Tcl_Obj *xScrollDelay; /* -xscrolldelay: used by scripts */ 212 Tcl_Obj *yScrollDelay; /* -yscrolldelay: used by scripts */ 213 int xScrollIncrement; /* -xscrollincrement */ 214 int yScrollIncrement; /* -yscrollincrement */ 215 Tcl_Obj *scrollMargin; /* -scrollmargin: used by scripts */ 216 char *takeFocus; /* -takfocus */ 217 Tcl_Obj *fontObj; /* -font */ 218 Tk_Font tkfont; /* -font */ 219 int showButtons; /* boolean: Draw expand/collapse buttons */ 220 int showLines; /* boolean: Draw lines connecting parent to 221 * child */ 222 int showRootLines; /* boolean: Draw lines connecting children 223 * of the root item */ 224 int showRoot; /* boolean: Draw the unique root item */ 225 int showRootButton; /* boolean: Draw expand/collapse button for 226 * root item */ 227 int showRootChildButtons; /* boolean: Draw expand/collapse buttons for 228 * children of the root item */ 229 int showHeader; /* boolean: show column titles */ 230 Tcl_Obj *indentObj; /* pixels: offset of child relative to 231 * parent */ 232 int indent; /* pixels: offset of child relative to 233 * parent */ 234 char *selectMode; /* -selectmode: used by scripts only */ 235 Tcl_Obj *itemHeightObj; /* -itemheight: Fixed height for all items 236 (unless overridden) */ 237 int itemHeight; /* -itemheight */ 238 Tcl_Obj *minItemHeightObj; /* -minitemheight: Minimum height for all items */ 239 int minItemHeight; /* -minitemheight */ 240 Tcl_Obj *itemWidthObj; /* -itemwidth */ 241 int itemWidth; /* -itemwidth */ 242 int itemWidthEqual; /* -itemwidthequal */ 243 Tcl_Obj *itemWidMultObj; /* -itemwidthmultiple */ 244 int itemWidMult; /* -itemwidthmultiple */ 245 Tcl_Obj *widthObj; /* -width */ 246 int width; /* -width */ 247 Tcl_Obj *heightObj; /* -height */ 248 int height; /* -height */ 249 TreeColumn columnTree; /* column where buttons/lines are drawn */ 250#define DOUBLEBUFFER_NONE 0 251#define DOUBLEBUFFER_ITEM 1 252#define DOUBLEBUFFER_WINDOW 2 253 int doubleBuffer; /* -doublebuffer */ 254 XColor *buttonColor; /* -buttoncolor */ 255 Tcl_Obj *buttonSizeObj; /* -buttonSize */ 256 int buttonSize; /* -buttonsize */ 257 Tcl_Obj *buttonThicknessObj;/* -buttonthickness */ 258 int buttonThickness; /* -buttonthickness */ 259 XColor *lineColor; /* -linecolor */ 260 Tcl_Obj *lineThicknessObj; /* -linethickness */ 261 int lineThickness; /* -linethickness */ 262#define LINE_STYLE_DOT 0 263#define LINE_STYLE_SOLID 1 264 int lineStyle; /* -linestyle */ 265 int vertical; /* -orient */ 266 Tcl_Obj *wrapObj; /* -wrap */ 267 PerStateInfo buttonImage; /* -buttonimage */ 268 PerStateInfo buttonBitmap; /* -buttonbitmap */ 269 char *backgroundImageString; /* -backgroundimage */ 270 int useIndent; /* MAX of open/closed button width and 271 * indent */ 272#define BG_MODE_COLUMN 0 273#define BG_MODE_ORDER 1 274#define BG_MODE_ORDERVIS 2 275#define BG_MODE_ROW 3 276#ifdef DEPRECATED 277#define BG_MODE_INDEX 4 /* compatibility */ 278#define BG_MODE_VISINDEX 5 /* compatibility */ 279#endif /* DEPRECATED */ 280 int backgroundMode; /* -backgroundmode */ 281 int columnResizeMode; /* -columnresizemode */ 282 int *itemPadX; /* -itempadx */ 283 Tcl_Obj *itemPadXObj; /* -itempadx */ 284 int *itemPadY; /* -itempady */ 285 Tcl_Obj *itemPadYObj; /* -itempady */ 286 287 struct TreeCtrlDebug debug; 288 struct TreeCtrlColumnDrag columnDrag; 289 290 /* Other stuff */ 291 int gotFocus; /* flag */ 292 int deleted; /* flag */ 293 int updateIndex; /* flag */ 294 int isActive; /* flag: mac & win "active" toplevel */ 295 struct { 296 int left; 297 int top; 298 int right; 299 int bottom; 300 } inset; /* borderWidth + highlightWidth */ 301 int xOrigin; /* offset from content x=0 to window x=0 */ 302 int yOrigin; /* offset from content y=0 to window y=0 */ 303 GC copyGC; 304 GC textGC; 305 GC buttonGC; 306 GC lineGC; 307 Tk_Image backgroundImage; /* -backgroundimage */ 308 int useTheme; /* -usetheme */ 309 char *itemPrefix; /* -itemprefix */ 310 char *columnPrefix; /* -columnprefix */ 311 312 int prevWidth; 313 int prevHeight; 314 int drawableXOrigin; 315 int drawableYOrigin; 316 317 TreeColumn columns; /* List of columns */ 318 TreeColumn columnLast; /* Last in list of columns */ 319 TreeColumn columnTail; /* Last infinitely-wide column */ 320 TreeColumn columnVis; /* First visible column */ 321 int columnCount; /* Number of columns */ 322 int columnCountVis; /* Number of visible columns */ 323 int headerHeight; /* Height of column titles */ 324 int widthOfColumns; /* Sum of column widths */ 325 int columnTreeLeft; /* left of column where buttons/lines are 326 * drawn */ 327 int columnTreeVis; /* TRUE if columnTree is visible */ 328 int columnBgCnt; /* Max -itembackground colors */ 329 330#define COLUMN_LOCK_LEFT 0 331#define COLUMN_LOCK_NONE 1 332#define COLUMN_LOCK_RIGHT 2 333 TreeColumn columnLockLeft; /* First left-locked column */ 334 TreeColumn columnLockNone; /* First unlocked column */ 335 TreeColumn columnLockRight; /* First right-locked column */ 336 int widthOfColumnsLeft; /* Sum of left-locked column widths */ 337 int widthOfColumnsRight; /* Sum of right-locked column widths */ 338 int columnCountVisLeft; /* Number of visible left-locked columns */ 339 int columnCountVisRight; /* Number of visible right-locked columns */ 340 341#define UNIFORM_GROUP 342#ifdef UNIFORM_GROUP 343 Tcl_HashTable uniformGroupHash; /* -uniform -> UniformGroup */ 344#endif 345 346 TreeItem root; 347 TreeItem activeItem; 348 TreeItem anchorItem; 349 int nextItemId; 350 int nextColumnId; 351 Tcl_HashTable itemHash; /* TreeItem.id -> TreeItem */ 352 Tcl_HashTable itemSpansHash; /* TreeItem -> nothing */ 353 Tcl_HashTable elementHash; /* Element.name -> Element */ 354 Tcl_HashTable styleHash; /* Style.name -> Style */ 355 Tcl_HashTable imageNameHash; /* image name -> TreeImageRef */ 356 Tcl_HashTable imageTokenHash; /* Tk_Image -> TreeImageRef */ 357 int depth; /* max depth of items under root */ 358 int itemCount; /* Total number of items */ 359 int itemVisCount; /* Total number of ReallyVisible() items */ 360 int itemWrapCount; /* ReallyVisible() items with -wrap=true */ 361 QE_BindingTable bindingTable; 362 TreeDragImage dragImage; 363 TreeMarquee marquee; 364 TreeDInfo dInfo; 365 int selectCount; /* Number of selected items */ 366 Tcl_HashTable selection; /* Selected items */ 367 368#define TREE_WRAP_NONE 0 369#define TREE_WRAP_ITEMS 1 370#define TREE_WRAP_PIXELS 2 371#define TREE_WRAP_WINDOW 3 372 int wrapMode; /* TREE_WRAP_xxx */ 373 int wrapArg; /* Number of items, number of pixels */ 374 375 int totalWidth; /* Max/Sum of all TreeRanges */ 376 int totalHeight; /* Max/Sum of all TreeRanges */ 377 378 struct { 379 Tcl_Obj *xObj; 380 int x; /* Window coords */ 381 int sx; /* Window coords */ 382 int onScreen; 383 } columnProxy; 384 385 char *stateNames[32]; /* Names of static and dynamic item states */ 386 387 int scanX; /* [scan mark] and [scan dragto] */ 388 int scanY; 389 int scanXOrigin; 390 int scanYOrigin; 391 392 Tk_OptionTable styleOptionTable; 393#ifdef DEPRECATED 394 struct { 395 Tcl_Obj *stylesObj; 396 TreeStyle *styles; 397 int numStyles; 398 } defaultStyle; 399#endif /* DEPRECATED */ 400 Tk_OptionTable itemOptionTable; 401 int itemPrefixLen; /* -itemprefix */ 402 int columnPrefixLen; /* -columnprefix */ 403#ifdef ALLOC_HAX 404 ClientData allocData; 405#endif 406 int preserveItemRefCnt; /* Ref count so items-in-use aren't freed. */ 407 TreeItemList preserveItemList; /* List of items to be deleted when 408 * preserveItemRefCnt==0. */ 409 410 struct { 411 Tcl_Obj *yObj; 412 int y; /* Window coords */ 413 int sy; /* Window coords */ 414 int onScreen; 415 } rowProxy; 416 417 char *optionHax[64]; /* Used by OptionHax_xxx */ 418 int optionHaxCnt; /* Used by OptionHax_xxx */ 419 420 TreeThemeData themeData; 421 GCCache *gcCache; /* Graphics contexts for elements. */ 422 423 TkRegion regionStack[8]; /* Temp region stack. */ 424 int regionStackLen; /* Number of unused regions in regionStack. */ 425 426 int itemTagExpr; /* Enable/disable operators in item tags */ 427 int columnTagExpr; /* Enable/disable operators in column tags */ 428}; 429 430#define TREE_CONF_FONT 0x0001 431#define TREE_CONF_ITEMSIZE 0x0002 432#define TREE_CONF_INDENT 0x0004 433#define TREE_CONF_WRAP 0x0008 434#define TREE_CONF_BUTIMG 0x0010 435#define TREE_CONF_BUTBMP 0x0020 436#define TREE_CONF_BORDERS 0x0040 437/* xxx */ 438#define TREE_CONF_RELAYOUT 0x0100 439#define TREE_CONF_REDISPLAY 0x0200 440#define TREE_CONF_FG 0x0400 441#define TREE_CONF_PROXY 0x0800 442#define TREE_CONF_BUTTON 0x1000 443#define TREE_CONF_LINE 0x2000 444#define TREE_CONF_DEFSTYLE 0x4000 445#define TREE_CONF_BG_IMAGE 0x8000 446#define TREE_CONF_THEME 0x00010000 447 448MODULE_SCOPE void Tree_AddItem(TreeCtrl *tree, TreeItem item); 449MODULE_SCOPE void Tree_RemoveItem(TreeCtrl *tree, TreeItem item); 450MODULE_SCOPE Tk_Image Tree_GetImage(TreeCtrl *tree, char *imageName); 451MODULE_SCOPE void Tree_FreeImage(TreeCtrl *tree, Tk_Image image); 452MODULE_SCOPE void Tree_UpdateScrollbarX(TreeCtrl *tree); 453MODULE_SCOPE void Tree_UpdateScrollbarY(TreeCtrl *tree); 454MODULE_SCOPE void Tree_AddToSelection(TreeCtrl *tree, TreeItem item); 455MODULE_SCOPE void Tree_RemoveFromSelection(TreeCtrl *tree, TreeItem item); 456MODULE_SCOPE void Tree_PreserveItems(TreeCtrl *tree); 457MODULE_SCOPE void Tree_ReleaseItems(TreeCtrl *tree); 458 459#define STATE_OP_ON 0 460#define STATE_OP_OFF 1 461#define STATE_OP_TOGGLE 2 462#define SFO_NOT_OFF 0x0001 463#define SFO_NOT_TOGGLE 0x0002 464#define SFO_NOT_STATIC 0x0004 465MODULE_SCOPE int Tree_StateFromObj(TreeCtrl *tree, Tcl_Obj *obj, int states[3], int *indexPtr, int flags); 466MODULE_SCOPE int Tree_StateFromListObj(TreeCtrl *tree, Tcl_Obj *obj, int states[3], int flags); 467 468#define Tree_BorderLeft(tree) \ 469 tree->inset.left 470#define Tree_BorderTop(tree) \ 471 tree->inset.top 472#define Tree_BorderRight(tree) \ 473 (Tk_Width(tree->tkwin) - tree->inset.right) 474#define Tree_BorderBottom(tree) \ 475 (Tk_Height(tree->tkwin) - tree->inset.bottom) 476 477#define Tree_HeaderLeft(tree) \ 478 Tree_BorderLeft(tree) 479#define Tree_HeaderTop(tree) \ 480 Tree_BorderTop(tree) 481#define Tree_HeaderRight(tree) \ 482 Tree_BorderRight(tree) 483#define Tree_HeaderBottom(tree) \ 484 (Tree_BorderTop(tree) + Tree_HeaderHeight(tree)) 485#define Tree_HeaderWidth(tree) \ 486 (Tree_HeaderRight(tree) - Tree_HeaderLeft(tree)) 487 488#define Tree_ContentLeft(tree) \ 489 (Tree_BorderLeft(tree) + Tree_WidthOfLeftColumns(tree)) 490#define Tree_ContentTop(tree) \ 491 (Tree_BorderTop(tree) + Tree_HeaderHeight(tree)) 492#define Tree_ContentRight(tree) \ 493 (Tree_BorderRight(tree) - Tree_WidthOfRightColumns(tree)) 494#define Tree_ContentBottom(tree) \ 495 Tree_BorderBottom(tree) 496 497#define Tree_ContentWidth(tree) \ 498 (Tree_ContentRight(tree) - Tree_ContentLeft(tree)) 499#define Tree_ContentHeight(tree) \ 500 (Tree_ContentBottom(tree) - Tree_ContentTop(tree)) 501 502/* tkTreeItem.c */ 503 504#define ITEM_ALL ((TreeItem) -1) 505#define IFO_NOT_MANY 0x0001 /* ItemFromObj flag: > 1 item is not ok */ 506#define IFO_NOT_NULL 0x0002 /* ItemFromObj flag: can't be NULL */ 507#define IFO_NOT_ROOT 0x0004 /* ItemFromObj flag: "root" is forbidden */ 508#define IFO_NOT_ORPHAN 0x0008 /* ItemFromObj flag: item must have a parent */ 509#define IFO_LIST_ALL 0x0010 /* ItemFromObj flag: return "all" as list */ 510MODULE_SCOPE int TreeItemList_FromObj(TreeCtrl *tree, Tcl_Obj *objPtr, TreeItemList *items, int flags); 511MODULE_SCOPE int TreeItem_FromObj(TreeCtrl *tree, Tcl_Obj *objPtr, TreeItem *itemPtr, int flags); 512 513typedef struct ItemForEach ItemForEach; 514struct ItemForEach { 515 TreeCtrl *tree; 516 int error; 517 int all; 518 Tcl_HashSearch search; 519 TreeItem last; 520 TreeItem item; 521 TreeItemList *items; 522 int index; 523}; 524MODULE_SCOPE TreeItem TreeItemForEach_Start(TreeItemList *items, TreeItemList *item2s, 525 ItemForEach *iter); 526MODULE_SCOPE TreeItem TreeItemForEach_Next(ItemForEach *iter); 527#define ITEM_FOR_EACH(item, items, item2s, iter) \ 528 for (item = TreeItemForEach_Start(items, item2s, iter); \ 529 item != NULL; \ 530 item = TreeItemForEach_Next(iter)) 531 532#define FormatResult TreeCtrl_FormatResult 533MODULE_SCOPE void FormatResult(Tcl_Interp *interp, char *fmt, ...); 534#define DStringAppendf TreeCtrl_DStringAppendf 535MODULE_SCOPE void DStringAppendf(Tcl_DString *dString, char *fmt, ...); 536MODULE_SCOPE void Tree_Debug(TreeCtrl *tree); 537 538MODULE_SCOPE int TreeItem_Init(TreeCtrl *tree); 539MODULE_SCOPE int TreeItem_Debug(TreeCtrl *tree, TreeItem item); 540MODULE_SCOPE void TreeItem_OpenClose(TreeCtrl *tree, TreeItem item, int mode); 541MODULE_SCOPE void TreeItem_Delete(TreeCtrl *tree, TreeItem item); 542MODULE_SCOPE int TreeItem_Deleted(TreeCtrl *tree, TreeItem item); 543 544#define STATE_OPEN 0x0001 545#define STATE_SELECTED 0x0002 546#define STATE_ENABLED 0x0004 547#define STATE_ACTIVE 0x0008 548#define STATE_FOCUS 0x0010 549#define STATE_USER 6 /* first user bit */ 550MODULE_SCOPE int TreeItem_GetState(TreeCtrl *tree, TreeItem item_); 551 552#define CS_DISPLAY 0x01 553#define CS_LAYOUT 0x02 554MODULE_SCOPE int TreeItem_ChangeState(TreeCtrl *tree, TreeItem item_, int stateOff, int stateOn); 555 556MODULE_SCOPE void TreeItem_UndefineState(TreeCtrl *tree, TreeItem item_, int state); 557 558MODULE_SCOPE int TreeItem_HasButton(TreeCtrl *tree, TreeItem item_); 559MODULE_SCOPE int TreeItem_GetDepth(TreeCtrl *tree, TreeItem item_); 560MODULE_SCOPE int TreeItem_GetID(TreeCtrl *tree, TreeItem item_); 561MODULE_SCOPE int TreeItem_SetID(TreeCtrl *tree, TreeItem item_, int id); 562MODULE_SCOPE int TreeItem_GetEnabled(TreeCtrl *tree, TreeItem item_); 563MODULE_SCOPE int TreeItem_GetSelected(TreeCtrl *tree, TreeItem item_); 564MODULE_SCOPE int TreeItem_GetWrap(TreeCtrl *tree, TreeItem item_); 565MODULE_SCOPE TreeItem TreeItem_GetParent(TreeCtrl *tree, TreeItem item); 566MODULE_SCOPE TreeItem TreeItem_GetNextSibling(TreeCtrl *tree, TreeItem item); 567MODULE_SCOPE TreeItem TreeItem_NextSiblingVisible(TreeCtrl *tree, TreeItem item); 568MODULE_SCOPE void TreeItem_SetDInfo(TreeCtrl *tree, TreeItem item, TreeItemDInfo dInfo); 569MODULE_SCOPE TreeItemDInfo TreeItem_GetDInfo(TreeCtrl *tree, TreeItem item); 570MODULE_SCOPE void TreeItem_SetRInfo(TreeCtrl *tree, TreeItem item, TreeItemRInfo rInfo); 571MODULE_SCOPE TreeItemRInfo TreeItem_GetRInfo(TreeCtrl *tree, TreeItem item); 572 573MODULE_SCOPE void TreeItem_AppendChild(TreeCtrl *tree, TreeItem self, TreeItem child); 574MODULE_SCOPE void TreeItem_RemoveFromParent(TreeCtrl *tree, TreeItem self); 575MODULE_SCOPE int TreeItem_FirstAndLast(TreeCtrl *tree, TreeItem *first, TreeItem *last); 576MODULE_SCOPE void TreeItem_ListDescendants(TreeCtrl *tree, TreeItem item_, TreeItemList *items); 577MODULE_SCOPE void TreeItem_UpdateDepth(TreeCtrl *tree, TreeItem item); 578MODULE_SCOPE void TreeItem_AddToParent(TreeCtrl *tree, TreeItem item); 579MODULE_SCOPE int TreeItem_Height(TreeCtrl *tree, TreeItem self); 580MODULE_SCOPE int TreeItem_TotalHeight(TreeCtrl *tree, TreeItem self); 581MODULE_SCOPE void TreeItem_InvalidateHeight(TreeCtrl *tree, TreeItem self); 582MODULE_SCOPE void TreeItem_SpansInvalidate(TreeCtrl *tree, TreeItem item_); 583MODULE_SCOPE int TreeItem_SpansRedo(TreeCtrl *tree, TreeItem item_); 584MODULE_SCOPE void TreeItem_SpansRedoIfNeeded(TreeCtrl *tree, TreeItem item_); 585MODULE_SCOPE int *TreeItem_GetSpans(TreeCtrl *tree, TreeItem item_); 586MODULE_SCOPE void TreeItem_Draw(TreeCtrl *tree, TreeItem self, int lock, int x, int y, int width, int height, TreeDrawable td, int minX, int maxX, int index); 587MODULE_SCOPE void TreeItem_DrawLines(TreeCtrl *tree, TreeItem self, int x, int y, int width, int height, TreeDrawable td); 588MODULE_SCOPE void TreeItem_DrawButton(TreeCtrl *tree, TreeItem self, int x, int y, int width, int height, TreeDrawable td); 589MODULE_SCOPE int TreeItem_ReallyVisible(TreeCtrl *tree, TreeItem self); 590MODULE_SCOPE void TreeItem_FreeResources(TreeCtrl *tree, TreeItem self); 591MODULE_SCOPE void TreeItem_Release(TreeCtrl *tree, TreeItem item); 592MODULE_SCOPE TreeItem TreeItem_RootAncestor(TreeCtrl *tree, TreeItem item_); 593MODULE_SCOPE int TreeItem_IsAncestor(TreeCtrl *tree, TreeItem item1, TreeItem item2); 594MODULE_SCOPE Tcl_Obj *TreeItem_ToObj(TreeCtrl *tree, TreeItem item); 595MODULE_SCOPE void TreeItem_ToIndex(TreeCtrl *tree, TreeItem item, int *absolute, int *visible); 596MODULE_SCOPE TreeItem TreeItem_Next(TreeCtrl *tree, TreeItem item); 597MODULE_SCOPE TreeItem TreeItem_NextVisible(TreeCtrl *tree, TreeItem item); 598MODULE_SCOPE TreeItem TreeItem_Prev(TreeCtrl *tree, TreeItem item); 599MODULE_SCOPE TreeItem TreeItem_PrevVisible(TreeCtrl *tree, TreeItem item); 600MODULE_SCOPE void TreeItem_Identify(TreeCtrl *tree, TreeItem item_, int lock, int x, int y, char *buf); 601MODULE_SCOPE void TreeItem_Identify2(TreeCtrl *tree, TreeItem item_, 602 int x1, int y1, int x2, int y2, Tcl_Obj *listObj); 603MODULE_SCOPE int TreeItem_GetRects(TreeCtrl *tree, TreeItem item_, 604 TreeColumn treeColumn, int objc, Tcl_Obj *CONST objv[], TreeRectangle rects[]); 605MODULE_SCOPE int TreeItem_Indent(TreeCtrl *tree, TreeItem item_); 606MODULE_SCOPE void Tree_UpdateItemIndex(TreeCtrl *tree); 607MODULE_SCOPE void Tree_DeselectHidden(TreeCtrl *tree); 608MODULE_SCOPE int TreeItemCmd(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]); 609MODULE_SCOPE void TreeItem_UpdateWindowPositions(TreeCtrl *tree, TreeItem item_, 610 int lock, int x, int y, int width, int height); 611MODULE_SCOPE void TreeItem_OnScreen(TreeCtrl *tree, TreeItem item_, int onScreen); 612 613MODULE_SCOPE TreeItemColumn TreeItem_GetFirstColumn(TreeCtrl *tree, TreeItem item); 614MODULE_SCOPE TreeItemColumn TreeItemColumn_GetNext(TreeCtrl *tree, TreeItemColumn column); 615MODULE_SCOPE void TreeItemColumn_InvalidateSize(TreeCtrl *tree, TreeItemColumn column); 616MODULE_SCOPE TreeStyle TreeItemColumn_GetStyle(TreeCtrl *tree, TreeItemColumn column); 617MODULE_SCOPE int TreeItemColumn_Index(TreeCtrl *tree, TreeItem item_, TreeItemColumn column_); 618MODULE_SCOPE void TreeItemColumn_ForgetStyle(TreeCtrl *tree, TreeItemColumn column_); 619MODULE_SCOPE int TreeItemColumn_NeededWidth(TreeCtrl *tree, TreeItem item_, TreeItemColumn column_); 620MODULE_SCOPE TreeItemColumn TreeItem_FindColumn(TreeCtrl *tree, TreeItem item, int columnIndex); 621MODULE_SCOPE int TreeItem_ColumnFromObj(TreeCtrl *tree, TreeItem item, Tcl_Obj *obj, TreeItemColumn *columnPtr, int *indexPtr); 622MODULE_SCOPE void TreeItem_RemoveColumns(TreeCtrl *tree, TreeItem item_, int first, int last); 623MODULE_SCOPE void TreeItem_RemoveAllColumns(TreeCtrl *tree, TreeItem item_); 624MODULE_SCOPE void TreeItem_MoveColumn(TreeCtrl *tree, TreeItem item_, int columnIndex, int beforeIndex); 625 626/* tkTreeElem.c */ 627MODULE_SCOPE int TreeElement_Init(Tcl_Interp *interp); 628MODULE_SCOPE int TreeStateFromObj(TreeCtrl *tree, Tcl_Obj *obj, int *stateOff, int *stateOn); 629MODULE_SCOPE int StringTableCO_Init(Tk_OptionSpec *optionTable, CONST char *optionName, CONST char **tablePtr); 630 631typedef struct StyleDrawArgs StyleDrawArgs; 632struct StyleDrawArgs 633{ 634 TreeCtrl *tree; 635 TreeStyle style; 636 int indent; 637 int x; 638 int y; 639 int width; 640 int height; 641 TreeDrawable td; 642 int state; /* STATE_xxx */ 643 Tk_Justify justify; 644 int bounds[4]; 645}; 646 647/* tkTreeStyle.c */ 648MODULE_SCOPE int TreeStyle_Init(TreeCtrl *tree); 649MODULE_SCOPE int TreeStyle_NeededWidth(TreeCtrl *tree, TreeStyle style_, int state); 650MODULE_SCOPE int TreeStyle_NeededHeight(TreeCtrl *tree, TreeStyle style_, int state); 651MODULE_SCOPE int TreeStyle_UseHeight(StyleDrawArgs *drawArgs); 652MODULE_SCOPE void TreeStyle_Draw(StyleDrawArgs *args); 653MODULE_SCOPE void TreeStyle_FreeResources(TreeCtrl *tree, TreeStyle style_); 654MODULE_SCOPE void TreeStyle_Free(TreeCtrl *tree); 655MODULE_SCOPE int TreeElement_FromObj(TreeCtrl *tree, Tcl_Obj *obj, TreeElement *elemPtr); 656MODULE_SCOPE int TreeElement_IsType(TreeCtrl *tree, TreeElement elem, CONST char *type); 657MODULE_SCOPE int TreeStyle_FromObj(TreeCtrl *tree, Tcl_Obj *obj, TreeStyle *stylePtr); 658MODULE_SCOPE Tcl_Obj *TreeStyle_ToObj(TreeStyle style_); 659MODULE_SCOPE Tcl_Obj *TreeStyle_GetImage(TreeCtrl *tree, TreeStyle style_); 660MODULE_SCOPE Tcl_Obj *TreeStyle_GetText(TreeCtrl *tree, TreeStyle style_); 661MODULE_SCOPE int TreeStyle_SetImage(TreeCtrl *tree, TreeItem item, TreeItemColumn column, TreeStyle style_, Tcl_Obj *textObj); 662MODULE_SCOPE int TreeStyle_SetText(TreeCtrl *tree, TreeItem item, TreeItemColumn column, TreeStyle style_, Tcl_Obj *textObj); 663MODULE_SCOPE int TreeStyle_FindElement(TreeCtrl *tree, TreeStyle style_, TreeElement elem, int *index); 664MODULE_SCOPE TreeStyle TreeStyle_NewInstance(TreeCtrl *tree, TreeStyle master); 665MODULE_SCOPE int TreeStyle_ElementActual(TreeCtrl *tree, TreeStyle style_, int state, Tcl_Obj *elemObj, Tcl_Obj *obj); 666MODULE_SCOPE int TreeStyle_ElementCget(TreeCtrl *tree, TreeItem item, TreeItemColumn column, TreeStyle style_, Tcl_Obj *elemObj, Tcl_Obj *obj); 667MODULE_SCOPE int TreeStyle_ElementConfigure(TreeCtrl *tree, TreeItem item, TreeItemColumn column, TreeStyle style_, Tcl_Obj *elemObj, int objc, Tcl_Obj **objv, int *eMask); 668MODULE_SCOPE void TreeStyle_ListElements(TreeCtrl *tree, TreeStyle style_); 669MODULE_SCOPE TreeStyle TreeStyle_GetMaster(TreeCtrl *tree, TreeStyle style_); 670MODULE_SCOPE char *TreeStyle_Identify(StyleDrawArgs *drawArgs, int x, int y); 671MODULE_SCOPE void TreeStyle_Identify2(StyleDrawArgs *drawArgs, 672 int x1, int y1, int x2, int y2, Tcl_Obj *listObj); 673MODULE_SCOPE int TreeStyle_Remap(TreeCtrl *tree, TreeStyle styleFrom_, TreeStyle styleTo_, int objc, Tcl_Obj *CONST objv[]); 674MODULE_SCOPE void TreeStyle_TreeChanged(TreeCtrl *tree, int flagT); 675#define SORT_ASCII 0 676#define SORT_DICT 1 677#define SORT_DOUBLE 2 678#define SORT_LONG 3 679#define SORT_COMMAND 4 680MODULE_SCOPE int TreeStyle_GetSortData(TreeCtrl *tree, TreeStyle style_, int elemIndex, int type, long *lv, double *dv, char **sv); 681#if 0 682MODULE_SCOPE int TreeStyle_ValidateElements(TreeCtrl *tree, TreeStyle style_, int objc, Tcl_Obj *CONST objv[]); 683#endif 684MODULE_SCOPE int TreeStyle_GetElemRects(StyleDrawArgs *drawArgs, int objc, Tcl_Obj *CONST objv[], TreeRectangle rects[]); 685MODULE_SCOPE int TreeElementCmd(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]); 686MODULE_SCOPE int TreeStyleCmd(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]); 687MODULE_SCOPE int TreeStyle_ChangeState(TreeCtrl *tree, TreeStyle style_, int state1, int state2); 688MODULE_SCOPE void Tree_UndefineState(TreeCtrl *tree, int state); 689MODULE_SCOPE int TreeStyle_NumElements(TreeCtrl *tree, TreeStyle style_); 690MODULE_SCOPE void TreeStyle_UpdateWindowPositions(StyleDrawArgs *drawArgs); 691MODULE_SCOPE void TreeStyle_OnScreen(TreeCtrl *tree, TreeStyle style_, int onScreen); 692 693MODULE_SCOPE int Tree_ButtonMaxWidth(TreeCtrl *tree); 694MODULE_SCOPE int Tree_ButtonHeight(TreeCtrl *tree, int state); 695 696/* tkTreeNotify.c */ 697MODULE_SCOPE int TreeNotify_Init(TreeCtrl *tree); 698MODULE_SCOPE void TreeNotify_OpenClose(TreeCtrl *tree, TreeItem item, int isOpen, int before); 699MODULE_SCOPE void TreeNotify_Selection(TreeCtrl *tree, TreeItemList *select, TreeItemList *deselect); 700MODULE_SCOPE int TreeNotifyCmd(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]); 701MODULE_SCOPE void TreeNotify_ActiveItem(TreeCtrl *tree, TreeItem itemOld, TreeItem itemNew); 702MODULE_SCOPE void TreeNotify_Scroll(TreeCtrl *tree, double fractions[2], int vertical); 703MODULE_SCOPE void TreeNotify_ItemDeleted(TreeCtrl *tree, TreeItemList *items); 704MODULE_SCOPE void TreeNotify_ItemVisibility(TreeCtrl *tree, TreeItemList *v, TreeItemList *h); 705 706/* tkTreeColumn.c */ 707MODULE_SCOPE Tk_ObjCustomOption TreeCtrlCO_column; 708MODULE_SCOPE Tk_ObjCustomOption TreeCtrlCO_column_NOT_TAIL; 709MODULE_SCOPE int TreeColumn_InitInterp(Tcl_Interp *interp); 710MODULE_SCOPE void Tree_InitColumns(TreeCtrl *tree); 711MODULE_SCOPE TreeColumn Tree_FindColumn(TreeCtrl *tree, int columnIndex); 712MODULE_SCOPE int TreeColumn_FirstAndLast(TreeColumn *first, TreeColumn *last); 713 714#define COLUMN_ALL ((TreeColumn) -1) /* Every column. */ 715#define COLUMN_NTAIL ((TreeColumn) -2) /* Every column but the tail. */ 716#define CFO_NOT_MANY 0x01 717#define CFO_NOT_NULL 0x02 718#define CFO_NOT_TAIL 0x04 719#define CFO_LIST_ALL 0x08 720MODULE_SCOPE int TreeColumnList_FromObj(TreeCtrl *tree, Tcl_Obj *objPtr, TreeColumnList *columns, int flags); 721MODULE_SCOPE int TreeColumn_FromObj(TreeCtrl *tree, Tcl_Obj *objPtr, TreeColumn *columnPtr, int flags); 722 723typedef struct ColumnForEach ColumnForEach; 724struct ColumnForEach { 725 TreeCtrl *tree; 726 int error; 727 int all; 728 int ntail; 729 TreeColumn current; 730 TreeColumn next; 731 TreeColumn last; 732 TreeColumnList *list; 733 int index; 734}; 735MODULE_SCOPE TreeColumn TreeColumnForEach_Start(TreeColumnList *columns, 736 TreeColumnList *column2s, ColumnForEach *iter); 737MODULE_SCOPE TreeColumn TreeColumnForEach_Next(ColumnForEach *iter); 738#define COLUMN_FOR_EACH(column, columns, column2s, iter) \ 739 for (column = TreeColumnForEach_Start(columns, column2s, iter); \ 740 column != NULL; \ 741 column = TreeColumnForEach_Next(iter)) 742 743MODULE_SCOPE Tcl_Obj *TreeColumn_ToObj(TreeCtrl *tree, TreeColumn column_); 744MODULE_SCOPE int TreeColumnCmd(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]); 745MODULE_SCOPE int TreeColumn_GetID(TreeColumn column_); 746MODULE_SCOPE int TreeColumn_Index(TreeColumn column_); 747MODULE_SCOPE TreeColumn TreeColumn_Next(TreeColumn column_); 748MODULE_SCOPE TreeColumn TreeColumn_Prev(TreeColumn column_); 749MODULE_SCOPE int TreeColumn_FixedWidth(TreeColumn column_); 750MODULE_SCOPE int TreeColumn_MinWidth(TreeColumn column_); 751MODULE_SCOPE int TreeColumn_MaxWidth(TreeColumn column_); 752MODULE_SCOPE int TreeColumn_NeededWidth(TreeColumn column_); 753MODULE_SCOPE int TreeColumn_NeededHeight(TreeColumn column_); 754MODULE_SCOPE int TreeColumn_UseWidth(TreeColumn column_); 755MODULE_SCOPE int TreeColumn_Offset(TreeColumn column_); 756MODULE_SCOPE Tk_Justify TreeColumn_ItemJustify(TreeColumn column_); 757#ifdef DEPRECATED 758MODULE_SCOPE int TreeColumn_WidthHack(TreeColumn column_); 759MODULE_SCOPE int TreeColumn_StepWidth(TreeColumn column_); 760#endif 761MODULE_SCOPE TreeStyle TreeColumn_ItemStyle(TreeColumn column_); 762MODULE_SCOPE void TreeColumn_StyleDeleted(TreeColumn column_, TreeStyle style); 763MODULE_SCOPE int TreeColumn_Visible(TreeColumn column_); 764MODULE_SCOPE int TreeColumn_Squeeze(TreeColumn column_); 765MODULE_SCOPE int TreeColumn_BackgroundCount(TreeColumn column_); 766MODULE_SCOPE GC TreeColumn_BackgroundGC(TreeColumn column_, int which); 767MODULE_SCOPE void Tree_DrawHeader(TreeCtrl *tree, TreeDrawable td, int x, int y); 768MODULE_SCOPE int TreeColumn_WidthOfItems(TreeColumn column_); 769MODULE_SCOPE void TreeColumn_InvalidateWidth(TreeColumn column_); 770MODULE_SCOPE void TreeColumn_Init(TreeCtrl *tree); 771MODULE_SCOPE void Tree_FreeColumns(TreeCtrl *tree); 772MODULE_SCOPE void Tree_InvalidateColumnWidth(TreeCtrl *tree, TreeColumn column); 773MODULE_SCOPE void Tree_InvalidateColumnHeight(TreeCtrl *tree, TreeColumn column); 774MODULE_SCOPE int Tree_HeaderHeight(TreeCtrl *tree); 775MODULE_SCOPE int TreeColumn_Bbox(TreeColumn column, int *x, int *y, int *w, int *h); 776MODULE_SCOPE TreeColumn Tree_HeaderUnderPoint(TreeCtrl *tree, int *x_, int *y_, int *w, int *h, int nearest); 777MODULE_SCOPE int TreeColumn_Lock(TreeColumn column_); 778MODULE_SCOPE int Tree_WidthOfColumns(TreeCtrl *tree); 779MODULE_SCOPE int Tree_WidthOfLeftColumns(TreeCtrl *tree); 780MODULE_SCOPE int Tree_WidthOfRightColumns(TreeCtrl *tree); 781MODULE_SCOPE void TreeColumn_TreeChanged(TreeCtrl *tree, int flagT); 782MODULE_SCOPE void TreeColumn_SetDInfo(TreeColumn column, TreeColumnDInfo dInfo); 783MODULE_SCOPE TreeColumnDInfo TreeColumn_GetDInfo(TreeColumn column); 784 785/* tkTreeDrag.c */ 786MODULE_SCOPE int TreeDragImage_Init(TreeCtrl *tree); 787MODULE_SCOPE void TreeDragImage_Free(TreeDragImage dragImage_); 788MODULE_SCOPE int TreeDragImage_IsXOR(TreeDragImage dragImage_); 789MODULE_SCOPE int TreeDragImage_IsVisible(TreeDragImage dragImage_); 790MODULE_SCOPE void TreeDragImage_Display(TreeDragImage dragImage_); 791MODULE_SCOPE void TreeDragImage_Undisplay(TreeDragImage dragImage_); 792MODULE_SCOPE void TreeDragImage_DrawXOR(TreeDragImage dragImage_, Drawable drawable, int x, int y); 793MODULE_SCOPE void TreeDragImage_Draw(TreeDragImage dragImage, TreeDrawable td); 794MODULE_SCOPE int TreeDragImageCmd(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]); 795 796/* tkTreeMarquee.c */ 797MODULE_SCOPE int TreeMarquee_Init(TreeCtrl *tree); 798MODULE_SCOPE void TreeMarquee_Free(TreeMarquee marquee_); 799MODULE_SCOPE int TreeMarquee_IsXOR(TreeMarquee marquee_); 800MODULE_SCOPE int TreeMarquee_IsVisible(TreeMarquee marquee_); 801MODULE_SCOPE void TreeMarquee_DrawXOR(TreeMarquee marquee_, Drawable drawable, int x, int y); 802MODULE_SCOPE void TreeMarquee_Display(TreeMarquee marquee_); 803MODULE_SCOPE void TreeMarquee_Undisplay(TreeMarquee marquee_); 804MODULE_SCOPE void TreeMarquee_Draw(TreeMarquee marquee_, TreeDrawable td); 805MODULE_SCOPE int TreeMarqueeCmd(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]); 806 807/* tkTreeDisplay.c */ 808MODULE_SCOPE int Tree_TotalWidth(TreeCtrl *tree); 809MODULE_SCOPE int Tree_TotalHeight(TreeCtrl *tree); 810MODULE_SCOPE TreeItem Tree_ItemUnderPoint(TreeCtrl *tree, int *x, int *y, int nearest); 811MODULE_SCOPE void Tree_FreeItemRInfo(TreeCtrl *tree, TreeItem item); 812MODULE_SCOPE int Tree_ItemBbox(TreeCtrl *tree, TreeItem item, int lock, int *x, int *y, int *w, int *h); 813MODULE_SCOPE TreeItem Tree_ItemLARB(TreeCtrl *tree, TreeItem item, int vertical, int prev); 814MODULE_SCOPE TreeItem Tree_ItemAbove(TreeCtrl *tree, TreeItem item); 815MODULE_SCOPE TreeItem Tree_ItemBelow(TreeCtrl *tree, TreeItem item); 816MODULE_SCOPE TreeItem Tree_ItemLeft(TreeCtrl *tree, TreeItem item); 817MODULE_SCOPE TreeItem Tree_ItemRight(TreeCtrl *tree, TreeItem item); 818MODULE_SCOPE TreeItem Tree_ItemFL(TreeCtrl *tree, TreeItem item, int vertical, int first); 819MODULE_SCOPE TreeItem Tree_ItemTop(TreeCtrl *tree, TreeItem item); 820MODULE_SCOPE TreeItem Tree_ItemBottom(TreeCtrl *tree, TreeItem item); 821MODULE_SCOPE TreeItem Tree_ItemLeftMost(TreeCtrl *tree, TreeItem item); 822MODULE_SCOPE TreeItem Tree_ItemRightMost(TreeCtrl *tree, TreeItem item); 823MODULE_SCOPE int Tree_ItemToRNC(TreeCtrl *tree, TreeItem item, int *row, int *col); 824MODULE_SCOPE TreeItem Tree_RNCToItem(TreeCtrl *tree, int row, int col); 825MODULE_SCOPE int Tree_AreaBbox(TreeCtrl *tree, int area, int *x1_, int *y1_, int *x2_, int *y2_); 826 827enum { 828TREE_AREA_NONE = 0, 829TREE_AREA_HEADER, 830TREE_AREA_CONTENT, 831TREE_AREA_LEFT, 832TREE_AREA_RIGHT 833}; 834MODULE_SCOPE int Tree_HitTest(TreeCtrl *tree, int x, int y); 835 836MODULE_SCOPE void TreeDInfo_Init(TreeCtrl *tree); 837MODULE_SCOPE void TreeDInfo_Free(TreeCtrl *tree); 838MODULE_SCOPE void Tree_EventuallyRedraw(TreeCtrl *tree); 839MODULE_SCOPE void Tree_GetScrollFractionsX(TreeCtrl *tree, double fractions[2]); 840MODULE_SCOPE void Tree_GetScrollFractionsY(TreeCtrl *tree, double fractions[2]); 841MODULE_SCOPE int Increment_FindX(TreeCtrl *tree, int offset); 842MODULE_SCOPE int Increment_FindY(TreeCtrl *tree, int offset); 843MODULE_SCOPE int Increment_ToOffsetX(TreeCtrl *tree, int index); 844MODULE_SCOPE int Increment_ToOffsetY(TreeCtrl *tree, int index); 845MODULE_SCOPE int B_XviewCmd(TreeCtrl *tree, int objc, Tcl_Obj *CONST objv[]); 846MODULE_SCOPE int B_YviewCmd(TreeCtrl *tree, int objc, Tcl_Obj *CONST objv[]); 847MODULE_SCOPE void Tree_SetOriginX(TreeCtrl *tree, int xOrigin); 848MODULE_SCOPE void Tree_SetOriginY(TreeCtrl *tree, int yOrigin); 849MODULE_SCOPE int Tree_GetOriginX(TreeCtrl *tree); 850MODULE_SCOPE int Tree_GetOriginY(TreeCtrl *tree); 851MODULE_SCOPE void Tree_RelayoutWindow(TreeCtrl *tree); 852MODULE_SCOPE void Tree_FreeItemDInfo(TreeCtrl *tree, TreeItem item1, TreeItem item2); 853MODULE_SCOPE void Tree_InvalidateItemDInfo(TreeCtrl *tree, TreeColumn column, TreeItem item1, TreeItem item2); 854MODULE_SCOPE void TreeDisplay_ItemDeleted(TreeCtrl *tree, TreeItem item); 855MODULE_SCOPE void TreeDisplay_ColumnDeleted(TreeCtrl *tree, TreeColumn column); 856MODULE_SCOPE void TreeDisplay_FreeColumnDInfo(TreeCtrl *tree, TreeColumn column); 857MODULE_SCOPE int Tree_ShouldDisplayLockedColumns(TreeCtrl *tree); 858MODULE_SCOPE void TreeDisplay_GetReadyForTrouble(TreeCtrl *tree, int *requestsPtr); 859MODULE_SCOPE int TreeDisplay_WasThereTrouble(TreeCtrl *tree, int requests); 860MODULE_SCOPE void Tree_InvalidateArea(TreeCtrl *tree, int x1, int y1, int x2, int y2); 861MODULE_SCOPE void Tree_InvalidateItemArea(TreeCtrl *tree, int x1, int y1, int x2, int y2); 862MODULE_SCOPE void Tree_InvalidateRegion(TreeCtrl *tree, TkRegion region); 863MODULE_SCOPE void Tree_RedrawArea(TreeCtrl *tree, int x1, int y1, int x2, int y2); 864MODULE_SCOPE void Tree_ExposeArea(TreeCtrl *tree, int x1, int y1, int x2, int y2); 865MODULE_SCOPE void Tree_FocusChanged(TreeCtrl *tree, int gotFocus); 866MODULE_SCOPE void Tree_Activate(TreeCtrl *tree, int isActive); 867MODULE_SCOPE void Tree_ItemsInArea(TreeCtrl *tree, TreeItemList *items, int minX, int minY, int maxX, int maxY); 868MODULE_SCOPE void TreeColumnProxy_Undisplay(TreeCtrl *tree); 869MODULE_SCOPE void TreeColumnProxy_Display(TreeCtrl *tree); 870MODULE_SCOPE void TreeRowProxy_Undisplay(TreeCtrl *tree); 871MODULE_SCOPE void TreeRowProxy_Display(TreeCtrl *tree); 872MODULE_SCOPE void Tree_DrawTiledImage(TreeCtrl *tree, Drawable drawable, Tk_Image image, 873 int x1, int y1, int x2, int y2, int xOffset, int yOffset); 874 875#define DINFO_OUT_OF_DATE 0x0001 876#define DINFO_CHECK_COLUMN_WIDTH 0x0002 877#define DINFO_DRAW_HEADER 0x0004 878#define DINFO_SET_ORIGIN_X 0x0008 879#define DINFO_UPDATE_SCROLLBAR_X 0x0010 880#define DINFO_REDRAW_PENDING 0x00020 881#define DINFO_INVALIDATE 0x0040 882#define DINFO_DRAW_HIGHLIGHT 0x0080 883#define DINFO_DRAW_BORDER 0x0100 884#define DINFO_REDO_RANGES 0x0200 885#define DINFO_SET_ORIGIN_Y 0x0400 886#define DINFO_UPDATE_SCROLLBAR_Y 0x0800 887#define DINFO_REDO_INCREMENTS 0x1000 888#define DINFO_REDO_COLUMN_WIDTH 0x2000 889#define DINFO_REDO_SELECTION 0x4000 890#define DINFO_DRAW_WHITESPACE 0x8000 891MODULE_SCOPE void Tree_DInfoChanged(TreeCtrl *tree, int flags); 892 893MODULE_SCOPE void Tree_TheWorldHasChanged(Tcl_Interp *interp); 894MODULE_SCOPE int Tree_DumpDInfo(TreeCtrl *tree, int objc, Tcl_Obj *CONST objv[]); 895 896/* tkTreeTheme.c */ 897MODULE_SCOPE int TreeTheme_InitInterp(Tcl_Interp *interp); 898MODULE_SCOPE void TreeTheme_ThemeChanged(TreeCtrl *tree); 899MODULE_SCOPE int TreeTheme_Init(TreeCtrl *tree); 900MODULE_SCOPE int TreeTheme_Free(TreeCtrl *tree); 901MODULE_SCOPE int TreeTheme_DrawHeaderItem(TreeCtrl *tree, Drawable drawable, 902 int state, int arrow, int visIndex, int x, int y, int width, int height); 903MODULE_SCOPE int TreeTheme_GetHeaderFixedHeight(TreeCtrl *tree, int *heightPtr); 904MODULE_SCOPE int TreeTheme_GetHeaderContentMargins(TreeCtrl *tree, int state, int arrow, int bounds[4]); 905MODULE_SCOPE int TreeTheme_DrawHeaderArrow(TreeCtrl *tree, Drawable drawable, int up, int x, int y, int width, int height); 906MODULE_SCOPE int TreeTheme_DrawButton(TreeCtrl *tree, Drawable drawable, int open, int x, int y, int width, int height); 907MODULE_SCOPE int TreeTheme_GetButtonSize(TreeCtrl *tree, Drawable drawable, int open, int *widthPtr, int *heightPtr); 908MODULE_SCOPE int TreeTheme_GetArrowSize(TreeCtrl *tree, Drawable drawable, int up, int *widthPtr, int *heightPtr); 909MODULE_SCOPE int TreeTheme_SetBorders(TreeCtrl *tree); 910MODULE_SCOPE int TreeTheme_DrawBorders(TreeCtrl *tree, Drawable drawable); 911MODULE_SCOPE void TreeTheme_Relayout(TreeCtrl *tree); 912MODULE_SCOPE int TreeTheme_IsDesktopComposited(TreeCtrl *tree); 913 914/* tkTreeUtils.c */ 915#ifdef TREECTRL_DEBUG 916#define WIPE(p,s) memset((char *) p, 0xAA, s) 917#else 918#define WIPE(p,s) 919#endif 920#define CWIPE(p,t,c) WIPE(p, sizeof(t) * (c)) 921#define WIPEFREE(p,s) { WIPE(p, s); ckfree((char *) p); } 922#define WFREE(p,t) WIPEFREE(p, sizeof(t)) 923#define WCFREE(p,t,c) WIPEFREE(p, sizeof(t) * (c)) 924 925MODULE_SCOPE int Tree_Ellipsis(Tk_Font tkfont, char *string, int numBytes, int *maxPixels, char *ellipsis, int force); 926MODULE_SCOPE void Tree_HDotLine(TreeCtrl *tree, Drawable drawable, GC gc, int x1, int y1, int x2); 927MODULE_SCOPE void Tree_VDotLine(TreeCtrl *tree, Drawable drawable, GC gc, int x1, int y1, int y2); 928MODULE_SCOPE void Tree_DrawActiveOutline(TreeCtrl *tree, Drawable drawable, int x, int y, int width, int height, int open); 929typedef struct DotState 930{ 931 void *stuff[10]; 932} DotState; 933MODULE_SCOPE void TreeDotRect_Setup(TreeCtrl *tree, Drawable drawable, DotState *dotState); 934MODULE_SCOPE void TreeDotRect_Draw(DotState *dotState, int x, int y, int width, int height); 935MODULE_SCOPE void TreeDotRect_Restore(DotState *dotState); 936typedef struct TextLayout_ *TextLayout; 937MODULE_SCOPE TextLayout TextLayout_Compute(Tk_Font tkfont, CONST char *string, 938 int numChars, int wrapLength, Tk_Justify justify, int maxLines, 939 int lMargin1, int lMargin2, int flags); 940MODULE_SCOPE void TextLayout_Free(TextLayout textLayout); 941MODULE_SCOPE void TextLayout_Size(TextLayout textLayout, int *widthPtr, int *heightPtr); 942MODULE_SCOPE int TextLayout_TotalWidth(TextLayout textLayout); 943MODULE_SCOPE void TextLayout_Draw(Display *display, Drawable drawable, GC gc, 944 TextLayout layout, int x, int y, int firstChar, int lastChar, 945 int underline); 946#ifdef MAC_TK_CARBON 947MODULE_SCOPE void DrawXORLine(Display *display, Drawable drawable, int x1, int y1, 948 int x2, int y2); 949#endif 950MODULE_SCOPE void Tree_RedrawImage(Tk_Image image, int imageX, int imageY, 951 int width, int height, TreeDrawable td, int drawableX, int drawableY); 952MODULE_SCOPE void Tree_DrawBitmapWithGC(TreeCtrl *tree, Pixmap bitmap, Drawable drawable, 953 GC gc, int src_x, int src_y, int width, int height, int dest_x, int dest_y); 954MODULE_SCOPE void Tree_DrawBitmap(TreeCtrl *tree, Pixmap bitmap, Drawable drawable, 955 XColor *fg, XColor *bg, 956 int src_x, int src_y, int width, int height, int dest_x, int dest_y); 957MODULE_SCOPE TkRegion Tree_GetRegion(TreeCtrl *tree); 958MODULE_SCOPE void Tree_FreeRegion(TreeCtrl *tree, TkRegion region); 959MODULE_SCOPE void Tree_FillRegion(Display *display, Drawable drawable, GC gc, TkRegion rgn); 960MODULE_SCOPE void Tree_OffsetRegion(TkRegion region, int xOffset, int yOffset); 961MODULE_SCOPE void Tree_SetEmptyRegion(TkRegion region); 962MODULE_SCOPE void Tree_SetRectRegion(TkRegion region, XRectangle *rect); 963MODULE_SCOPE void Tree_UnionRegion(TkRegion rgnA, TkRegion rgnB, TkRegion rgnOut); 964MODULE_SCOPE int Tree_ScrollWindow(TreeCtrl *tree, GC gc, int x, int y, 965 int width, int height, int dx, int dy, TkRegion damageRgn); 966MODULE_SCOPE void Tree_UnsetClipMask(TreeCtrl *tree, Drawable drawable, GC gc); 967MODULE_SCOPE void Tree_XImage2Photo(Tcl_Interp *interp, Tk_PhotoHandle photoH, 968 XImage *ximage, unsigned long trans, int alpha); 969 970#define PAD_TOP_LEFT 0 971#define PAD_BOTTOM_RIGHT 1 972MODULE_SCOPE Tk_ObjCustomOption TreeCtrlCO_pad; 973 974MODULE_SCOPE int TreeCtrl_GetPadAmountFromObj(Tcl_Interp *interp, 975 Tk_Window tkwin, Tcl_Obj *padObj, 976 int *topLeftPtr, int *bottomRightPtr); 977MODULE_SCOPE Tcl_Obj *TreeCtrl_NewPadAmountObj(int *padAmounts); 978 979/*****/ 980 981#define ObjectIsEmpty TreeCtrl_ObjectIsEmpty 982MODULE_SCOPE int ObjectIsEmpty(Tcl_Obj *obj); 983 984#define pstBitmap TreeCtrl_pstBitmap 985#define pstBoolean TreeCtrl_pstBoolean 986#define pstBorder TreeCtrl_pstBorder 987#define pstColor TreeCtrl_pstColor 988#define pstFont TreeCtrl_pstFont 989#define pstImage TreeCtrl_pstImage 990#define pstRelief TreeCtrl_pstRelief 991MODULE_SCOPE PerStateType pstBitmap; 992MODULE_SCOPE PerStateType pstBoolean; 993MODULE_SCOPE PerStateType pstBorder; 994MODULE_SCOPE PerStateType pstColor; 995MODULE_SCOPE PerStateType pstFont; 996MODULE_SCOPE PerStateType pstImage; 997MODULE_SCOPE PerStateType pstRelief; 998 999#define MATCH_NONE 0 1000#define MATCH_ANY 1 1001#define MATCH_PARTIAL 2 1002#define MATCH_EXACT 3 1003 1004MODULE_SCOPE void PerStateInfo_Free(TreeCtrl *tree, PerStateType *typePtr, 1005 PerStateInfo *pInfo); 1006typedef int (*StateFromObjProc)(TreeCtrl *tree, Tcl_Obj *obj, int *stateOff, int *stateOn); 1007MODULE_SCOPE int PerStateInfo_FromObj(TreeCtrl *tree, StateFromObjProc proc, 1008 PerStateType *typePtr, PerStateInfo *pInfo); 1009MODULE_SCOPE PerStateData *PerStateInfo_ForState(TreeCtrl *tree, 1010 PerStateType *typePtr, PerStateInfo *pInfo, int state, int *match); 1011MODULE_SCOPE Tcl_Obj *PerStateInfo_ObjForState(TreeCtrl *tree, PerStateType *typePtr, 1012 PerStateInfo *pInfo, int state, int *match); 1013MODULE_SCOPE int PerStateInfo_Undefine(TreeCtrl *tree, PerStateType *typePtr, 1014 PerStateInfo *pInfo, int state); 1015 1016MODULE_SCOPE GC Tree_GetGC(TreeCtrl *tree, unsigned long mask, XGCValues *gcValues); 1017MODULE_SCOPE void Tree_FreeAllGC(TreeCtrl *tree); 1018 1019MODULE_SCOPE Pixmap PerStateBitmap_ForState(TreeCtrl *tree, PerStateInfo *pInfo, 1020 int state, int *match); 1021MODULE_SCOPE void PerStateBitmap_MaxSize(TreeCtrl *tree, PerStateInfo *pInfo, 1022 int *widthPtr, int *heightPtr); 1023MODULE_SCOPE int PerStateBoolean_ForState(TreeCtrl *tree, PerStateInfo *pInfo, 1024 int state, int *match); 1025MODULE_SCOPE Tk_3DBorder PerStateBorder_ForState(TreeCtrl *tree, PerStateInfo *pInfo, 1026 int state, int *match); 1027MODULE_SCOPE XColor *PerStateColor_ForState(TreeCtrl *tree, PerStateInfo *pInfo, 1028 int state, int *match); 1029MODULE_SCOPE Tk_Font PerStateFont_ForState(TreeCtrl *tree, PerStateInfo *pInfo, 1030 int state, int *match); 1031MODULE_SCOPE Tk_Image PerStateImage_ForState(TreeCtrl *tree, PerStateInfo *pInfo, 1032 int state, int *match); 1033MODULE_SCOPE void PerStateImage_MaxSize(TreeCtrl *tree, PerStateInfo *pInfo, 1034 int *widthPtr, int *heightPtr); 1035MODULE_SCOPE int PerStateRelief_ForState(TreeCtrl *tree, PerStateInfo *pInfo, 1036 int state, int *match); 1037 1038MODULE_SCOPE void PSTSave(PerStateInfo *pInfo, PerStateInfo *pSave); 1039MODULE_SCOPE void PSTRestore(TreeCtrl *tree, PerStateType *typePtr, 1040 PerStateInfo *pInfo, PerStateInfo *pSave); 1041 1042#ifdef ALLOC_HAX 1043MODULE_SCOPE ClientData TreeAlloc_Init(void); 1044MODULE_SCOPE void TreeAlloc_Finalize(ClientData data); 1045MODULE_SCOPE char *TreeAlloc_Alloc(ClientData data, Tk_Uid id, int size); 1046MODULE_SCOPE char *TreeAlloc_CAlloc(ClientData data, Tk_Uid id, int size, int count, int roundUp); 1047MODULE_SCOPE char *TreeAlloc_Realloc(ClientData data, Tk_Uid id, char *ptr, int size1, int size2); 1048MODULE_SCOPE void TreeAlloc_Free(ClientData data, Tk_Uid id, char *ptr, int size); 1049MODULE_SCOPE void TreeAlloc_CFree(ClientData data, Tk_Uid id, char *ptr, int size, int count, int roundUp); 1050MODULE_SCOPE void TreeAlloc_Stats(Tcl_Interp *interp, ClientData data); 1051#endif 1052 1053/*****/ 1054 1055MODULE_SCOPE void TreePtrList_Init(TreeCtrl *tree, TreePtrList *tilPtr, int count); 1056MODULE_SCOPE void TreePtrList_Grow(TreePtrList *tilPtr, int count); 1057MODULE_SCOPE ClientData *TreePtrList_Append(TreePtrList *tilPtr, ClientData ptr); 1058MODULE_SCOPE ClientData *TreePtrList_Concat(TreePtrList *tilPtr, TreePtrList *til2Ptr); 1059MODULE_SCOPE void TreePtrList_Free(TreePtrList *tilPtr); 1060 1061#define TreeItemList_Init TreePtrList_Init 1062#define TreeItemList_Append TreePtrList_Append 1063#define TreeItemList_Concat TreePtrList_Concat 1064#define TreeItemList_Free TreePtrList_Free 1065#define TreeItemList_Items(L) ((TreeItem *) (L)->pointers) 1066#define TreeItemList_Nth(L,n) ((TreeItem) (L)->pointers[n]) 1067#define TreeItemList_Count(L) ((L)->count) 1068MODULE_SCOPE void TreeItemList_Sort(TreeItemList *items); 1069 1070#define TreeColumnList_Init TreePtrList_Init 1071#define TreeColumnList_Append TreePtrList_Append 1072#define TreeColumnList_Concat TreePtrList_Concat 1073#define TreeColumnList_Free TreePtrList_Free 1074#define TreeColumnList_Nth(L,n) ((TreeColumn) (L)->pointers[n]) 1075#define TreeColumnList_Count(L) ((L)->count) 1076 1077/*****/ 1078 1079/* 1080 * This structure holds a list of tags. 1081 */ 1082typedef struct TagInfo TagInfo; 1083struct TagInfo { 1084 int numTags; /* Number of tag slots actually used 1085 * at tagPtr. */ 1086 int tagSpace; /* Total amount of tag space available 1087 * at tagPtr. */ 1088#define TREE_TAG_SPACE 3 1089 Tk_Uid tagPtr[TREE_TAG_SPACE]; /* Array of tags. The actual size will 1090 * be tagSpace. THIS FIELD MUST BE THE 1091 * LAST IN THE STRUCTURE. */ 1092}; 1093 1094MODULE_SCOPE TagInfo *TagInfo_Add(TreeCtrl *tree, TagInfo *tagInfo, Tk_Uid tags[], int numTags); 1095MODULE_SCOPE TagInfo *TagInfo_Remove(TreeCtrl *tree, TagInfo *tagInfo, Tk_Uid tags[], int numTags); 1096MODULE_SCOPE Tk_Uid *TagInfo_Names(TreeCtrl *tree, TagInfo *tagInfo, Tk_Uid *tags, int *numTagsPtr, int *tagSpacePtr); 1097MODULE_SCOPE TagInfo *TagInfo_Copy(TreeCtrl *tree, TagInfo *tagInfo); 1098MODULE_SCOPE void TagInfo_Free(TreeCtrl *tree, TagInfo *tagInfo); 1099MODULE_SCOPE int TagInfo_FromObj(TreeCtrl *tree, Tcl_Obj *objPtr, TagInfo **tagInfoPtr); 1100MODULE_SCOPE Tk_ObjCustomOption TreeCtrlCO_tagInfo; 1101 1102/* 1103 * This struct holds information about a tag expression. 1104 */ 1105typedef struct TagExpr { 1106 TreeCtrl *tree; 1107 1108 Tk_Uid *uids; /* expresion compiled to an array of uids */ 1109 Tk_Uid staticUids[15]; 1110 int allocated; /* available space for array of uids */ 1111 int length; /* number of uids */ 1112 int index; /* current position in expression evaluation */ 1113 1114 int simple; /* TRUE if expr is single tag */ 1115 Tk_Uid uid; /* single tag if 'simple' is TRUE */ 1116 1117 char *string; /* tag expression string */ 1118 int stringIndex; /* current position in string scan */ 1119 int stringLength; /* length of tag expression string */ 1120 1121 char *rewritebuffer; /* tag string (after removing escapes) */ 1122 char staticRWB[100]; 1123} TagExpr; 1124 1125MODULE_SCOPE int TagExpr_Init(TreeCtrl *tree, Tcl_Obj *exprObj, TagExpr *expr); 1126MODULE_SCOPE int TagExpr_Scan(TagExpr *expr); 1127MODULE_SCOPE int TagExpr_Eval(TagExpr *expr, TagInfo *tags); 1128MODULE_SCOPE void TagExpr_Free(TagExpr *expr); 1129 1130MODULE_SCOPE Tk_OptionSpec *Tree_FindOptionSpec(Tk_OptionSpec *optionTable, CONST char *optionName); 1131 1132MODULE_SCOPE Tk_ObjCustomOption *PerStateCO_Alloc(CONST char *optionName, 1133 PerStateType *typePtr, StateFromObjProc proc); 1134MODULE_SCOPE int PerStateCO_Init(Tk_OptionSpec *optionTable, CONST char *optionName, 1135 PerStateType *typePtr, StateFromObjProc proc); 1136 1137/*****/ 1138 1139typedef struct DynamicOptionSpec DynamicOptionSpec; 1140typedef struct DynamicOption DynamicOption; 1141 1142struct DynamicOption 1143{ 1144 int id; /* Unique id. */ 1145 DynamicOption *next; /* Linked list. */ 1146 char data[1]; /* Actual size will be > 1 */ 1147}; 1148 1149typedef void (DynamicOptionInitProc)(void *data); 1150 1151MODULE_SCOPE DynamicOption *DynamicOption_AllocIfNeeded(TreeCtrl *tree, 1152 DynamicOption **firstPtr, int id, int size, DynamicOptionInitProc *init); 1153MODULE_SCOPE void *DynamicOption_FindData(DynamicOption *first, int id); 1154MODULE_SCOPE void DynamicOption_Free(TreeCtrl *tree, DynamicOption *first, 1155 Tk_OptionSpec *optionTable); 1156MODULE_SCOPE void DynamicOption_Free1(TreeCtrl *tree, DynamicOption **firstPtr, 1157 int id, int size); 1158MODULE_SCOPE int DynamicCO_Init(Tk_OptionSpec *optionTable, CONST char *optionName, 1159 int id, int size, int objOffset, int internalOffset, 1160 Tk_ObjCustomOption *custom, DynamicOptionInitProc *init); 1161 1162MODULE_SCOPE int BooleanFlagCO_Init(Tk_OptionSpec *optionTable, CONST char *optionName, 1163 int theFlag); 1164MODULE_SCOPE int ItemButtonCO_Init(Tk_OptionSpec *optionTable, CONST char *optionName, 1165 int flag1, int flag2); 1166 1167MODULE_SCOPE int Tree_GetIntForIndex(TreeCtrl *tree, Tcl_Obj *objPtr, int *indexPtr, 1168 int *endRelativePtr); 1169 1170MODULE_SCOPE Tk_ObjCustomOption TreeCtrlCO_pixels; 1171MODULE_SCOPE Tk_ObjCustomOption TreeCtrlCO_string; 1172MODULE_SCOPE Tk_ObjCustomOption TreeCtrlCO_style; 1173 1174/*****/ 1175 1176#define STATIC_SIZE 20 1177#define STATIC_ALLOC(P,T,C) \ 1178 if (C > STATIC_SIZE) \ 1179 P = (T *) ckalloc(sizeof(T) * (C)) 1180#define STATIC_FREE(P,T,C) \ 1181 CWIPE(P, T, C); \ 1182 if (C > STATIC_SIZE) \ 1183 ckfree((char *) P) 1184#define STATIC_FREE2(P,P2) \ 1185 if (P != P2) \ 1186 ckfree((char *) P) 1187 1188