1 /* 2 * tkTreeCtrl.h -- 3 * 4 * This module is the header for treectrl widgets for the Tk toolkit. 5 * 6 * Copyright (c) 2002-2011 Tim Baker 7 * Copyright (c) 2002-2003 Christian Krone 8 * Copyright (c) 2003 ActiveState Corporation 9 */ 10 11 #include "tkPort.h" 12 #include "default.h" 13 #include "tclInt.h" 14 #include "tkInt.h" 15 #include "qebind.h" 16 17 /* 18 * Used to tag functions that are only to be visible within the module being 19 * built and not outside it (where this is supported by the linker). 20 */ 21 22 #ifndef MODULE_SCOPE 23 # ifdef __cplusplus 24 # define MODULE_SCOPE extern "C" 25 # else 26 # define MODULE_SCOPE extern 27 # endif 28 #endif 29 30 /* 31 * Macros used to cast between pointers and integers (e.g. when storing an int 32 * in ClientData), on 64-bit architectures they avoid gcc warning about "cast 33 * to/from pointer from/to integer of different size". 34 */ 35 36 #if !defined(INT2PTR) && !defined(PTR2INT) 37 # if defined(HAVE_INTPTR_T) || defined(intptr_t) 38 # define INT2PTR(p) ((void *)(intptr_t)(p)) 39 # define PTR2INT(p) ((int)(intptr_t)(p)) 40 # else 41 # define INT2PTR(p) ((void *)(p)) 42 # define PTR2INT(p) ((int)(p)) 43 # endif 44 #endif 45 46 #ifdef PLATFORM_SDL 47 #undef WIN32 48 #endif 49 50 #define dbwin TreeCtrl_dbwin 51 #define dbwin_add_interp TreeCtrl_dbwin_add_interp 52 MODULE_SCOPE void dbwin(char *fmt, ...); 53 MODULE_SCOPE void dbwin_add_interp(Tcl_Interp *interp); 54 55 #ifndef TRUE 56 #define TRUE 1 57 #define FALSE 0 58 #endif 59 60 #ifdef WIN32 61 #define vsnprintf _vsnprintf 62 #endif 63 64 #ifndef MIN 65 #define MIN(a,b) ((a) < (b) ? (a) : (b)) 66 #endif 67 #ifndef MAX 68 #define MAX(a,b) ((a) > (b) ? (a) : (b)) 69 #endif 70 71 #define SELECTION_VISIBLE 72 #define ALLOC_HAX 73 #define DEPRECATED 74 /* #define DRAG_PIXMAP */ 75 /* #define DRAGIMAGE_STYLE */ /* Use an item style as the dragimage instead of XOR rectangles. */ 76 #define USE_ITEM_PIXMAP 1 77 #define COLUMNGRID 1 78 79 typedef struct TreeCtrl TreeCtrl; 80 typedef struct TreeColumn_ *TreeColumn; 81 typedef struct TreeColumnPriv_ *TreeColumnPriv; 82 typedef struct TreeColumnDInfo_ *TreeColumnDInfo; 83 typedef struct TreeDInfo_ *TreeDInfo; 84 typedef struct TreeDragImage_ *TreeDragImage; 85 typedef struct TreeItem_ *TreeItem; 86 typedef struct TreeItemColumn_ *TreeItemColumn; 87 typedef struct TreeItemDInfo_ *TreeItemDInfo; 88 typedef struct TreeMarquee_ *TreeMarquee; 89 typedef struct TreeItemRInfo_ *TreeItemRInfo; 90 typedef struct TreeStyle_ *TreeStyle; 91 typedef struct TreeElement_ *TreeElement; 92 typedef struct TreeThemeData_ *TreeThemeData; 93 typedef struct TreeGradient_ *TreeGradient; 94 typedef struct TreeHeader_ *TreeHeader; 95 typedef struct TreeHeaderColumn_ *TreeHeaderColumn; 96 97 typedef struct StyleDrawArgs StyleDrawArgs; 98 typedef struct TagInfo TagInfo; 99 100 /*****/ 101 102 typedef struct PerStateInfo PerStateInfo; 103 typedef struct PerStateData PerStateData; 104 typedef struct PerStateType PerStateType; 105 106 /* A structure of the following type is kept for each {value stateList} pair 107 * for a single per-state option. */ 108 struct PerStateData 109 { 110 int stateOff; /* States that must be off. */ 111 int stateOn; /* States that must be on. */ 112 /* Type-specific fields go here. */ 113 /* See PerStateDataBorder, PerStateDataFont, etc. */ 114 }; 115 116 /* A structure of the following type represents the value of a per-state 117 * option. */ 118 struct PerStateInfo 119 { 120 #ifdef TREECTRL_DEBUG 121 PerStateType *type; 122 #endif 123 Tcl_Obj *obj; /* The configured option value, a list object 124 * of the form {value stateList ...}. 125 * Each 'value' is a font, color etc. 126 * Each 'stateList' is a list of state names 127 * possibly preceded by "!". */ 128 int count; /* The number of entries in 'data'. */ 129 PerStateData *data; /* malloc'd array parsed from 'obj'. */ 130 }; 131 132 typedef int (*PerStateType_FromObjProc)(TreeCtrl *, Tcl_Obj *, PerStateData *); 133 typedef void (*PerStateType_FreeProc)(TreeCtrl *, PerStateData *); 134 135 /* A structure of the following type is kept for each per-state data type. */ 136 struct PerStateType 137 { 138 CONST char *name; /* Name for debugging purposes. */ 139 int size; /* Size of PerStateData + type-specific 140 * fields. */ 141 PerStateType_FromObjProc fromObjProc; /* Convert a Tcl_Obj to this type's 142 * PerStateData internal representation, 143 * a Tk_Font, XColor, etc. */ 144 PerStateType_FreeProc freeProc; /* Free the internal representation. */ 145 }; 146 147 /*****/ 148 149 typedef struct 150 { 151 XColor *color; 152 #if 0 153 double opacity; 154 #endif 155 TreeGradient gradient; 156 } TreeColor; 157 158 #define TREECOLOR_CMP2(a,b) (((a)->color!=(b)->color)||((a)->gradient!=(b)->gradient)) 159 #define TREECOLOR_CMP(a,b) ((!(a)!=!(b))||(((a)&&(b))&&TREECOLOR_CMP2(a,b))) 160 161 /* A structure of the following type is used to remember a drawable and its 162 * dimensions. Some drawing operations must be clipped to the actual bounds 163 * of a drawable (on X11 only?). */ 164 typedef struct 165 { 166 Drawable drawable; 167 int width; 168 int height; 169 } TreeDrawable; 170 171 /* A structure of the following type represents a rectangle. XRectangle 172 * uses short integers which often aren't large enough. */ 173 typedef struct 174 { 175 int x, y; 176 int width, height; 177 } TreeRectangle; 178 179 #define TreeRect_Left(tr) ((tr).x) 180 #define TreeRect_Top(tr) ((tr).y) 181 #define TreeRect_Right(tr) ((tr).x + (tr).width) 182 #define TreeRect_Bottom(tr) ((tr).y + (tr).height) 183 #define TreeRect_Width(tr) ((tr).width) 184 #define TreeRect_Height(tr) ((tr).height) 185 #define TreeRect_XYWH(tr,X,Y,W,H) ((*X)=TreeRect_Left(tr),(*Y)=TreeRect_Top(tr),\ 186 (*W)=TreeRect_Width(tr),(*H)=TreeRect_Height(tr)) 187 #define TreeRect_SetXYWH(tr,X,Y,W,H) ((tr).x=(X),(tr).y=(Y),\ 188 (tr).width=(W),(tr).height=(H)) 189 #define TreeRect_XYXY(tr,X1,Y1,X2,Y2) ((*X1)=TreeRect_Left(tr),(*Y1)=TreeRect_Top(tr),\ 190 (*X2)=TreeRect_Right(tr),(*Y2)=TreeRect_Bottom(tr)) 191 #define TreeRect_SetXYXY(tr,X1,Y1,X2,Y2) ((tr).x=(X1),(tr).y=(Y1),\ 192 (tr).width=(X2)-(X1),(tr).height=(Y2)-(Y1)) 193 194 #define TreeRect_ClipPoint(tr,XP,YP) \ 195 do { \ 196 if ((*XP) < (tr).x) (*XP)=(tr).x; \ 197 if ((*XP) >= TreeRect_Right(tr)) (*XP) = TreeRect_Right(tr) - 1; \ 198 if ((*YP) < (tr).y) (*YP)=(tr).y; \ 199 if ((*YP) >= TreeRect_Bottom(tr)) (*YP) = TreeRect_Bottom(tr) - 1; \ 200 } while (0) 201 202 #define TreeRect_FromXRect(xr,trp) ((trp)->x=(xr).x, (trp)->y=(xr).y, \ 203 (trp)->width=(xr).width, (trp)->height=(xr).height) 204 #define TreeRect_ToXRect(tr,xrp) ((xrp)->x=(tr).x, (xrp)->y=(tr).y, \ 205 (xrp)->width=(tr).width, (xrp)->height=(tr).height) 206 207 typedef struct GCCache GCCache; 208 struct GCCache 209 { 210 unsigned long mask; 211 XGCValues gcValues; 212 GC gc; 213 GCCache *next; 214 }; 215 216 /* 217 * A TreePtrList is used for dynamically-growing lists of ClientData pointers. 218 * A TreePtrList is NULL-terminated. 219 * Based on Tcl_DString code. 220 */ 221 #define TIL_STATIC_SPACE 128 222 typedef struct TreePtrList TreePtrList; 223 typedef TreePtrList TreeItemList; 224 typedef TreePtrList TreeColumnList; 225 struct TreePtrList { 226 #ifdef TREECTRL_DEBUG 227 char magic[4]; 228 #endif 229 TreeCtrl *tree; 230 ClientData *pointers; /* NULL-terminated list of pointers. */ 231 int count; /* Number of items. */ 232 int space; /* Number of slots pointed to by pointers[]. */ 233 ClientData pointerSpace[TIL_STATIC_SPACE]; /* Space to use in common case 234 * where the list is small. */ 235 }; 236 237 enum { LEFT, TOP, RIGHT, BOTTOM }; 238 239 /* A structure of the following type is kept for each TreeCtrl to hold the 240 * values of debug-related configuration options and other related fields. */ 241 struct TreeCtrlDebug 242 { 243 Tk_OptionTable optionTable; 244 int enable; /* Turn all debugging on/off */ 245 int data; /* Debug data structures */ 246 int display; /* Debug display routines */ 247 int span; /* Debug column spanning */ 248 int textLayout; /* Debug text layout */ 249 int displayDelay; /* Delay between copy/draw operations */ 250 XColor *eraseColor; /* Erase "invalidated" areas */ 251 GC gcErase; /* for eraseColor */ 252 XColor *drawColor; /* Erase about-to-be-drawn areas */ 253 GC gcDraw; /* for eraseColor */ 254 }; 255 256 /* A structure of the following type is kept for each TreeCtrl to hold the 257 * values of header drag-and-drop configuration options and other related 258 * fields. */ 259 struct TreeCtrlColumnDrag 260 { 261 Tk_OptionTable optionTable; 262 int enable; /* -enable */ 263 TreeColumn column; /* -imagecolumn */ 264 Tcl_Obj *offsetObj; /* -imageoffset */ 265 int offset; /* -imageoffset */ 266 XColor *color; /* -imagecolor */ 267 int alpha; /* -imagealpha */ 268 int span; /* -imagespan */ 269 TreeColumn indColumn; /* -indicatorcolumn */ 270 XColor *indColor; /* -indicatorcolor */ 271 int indSide; /* -indicatorside */ 272 int indSpan; /* -indicatorspan */ 273 int imageEpoch; 274 }; 275 276 /* A structure of the following type is kept for each TreeCtrl to hold the 277 * names of static and dynamic states in each STATE_DOMAIN_XXX. */ 278 typedef struct TreeStateDomain TreeStateDomain; 279 struct TreeStateDomain 280 { 281 CONST char *name; /* Human-readable name of this domain. */ 282 char *stateNames[32]; /* Sparse array of state names. */ 283 int staticCount; /* Number of static states. */ 284 }; 285 286 /* A structure of the following type represents a unique signature for each 287 * TreeStyle that is managed privately for use in column headers. A different 288 * header style is needed to for some header configuration options, such as 289 * -justify, but not for others, such as -arrow which are handled by the 290 * 'header' element type. */ 291 typedef struct HeaderStyleParams HeaderStyleParams; 292 struct HeaderStyleParams 293 { 294 Tk_Justify justify; /* -justify */ 295 int bitmap; /* 1 if -bitmap is specified, 0 if -bitmap 296 * is unspecified or -image is specified. */ 297 int image; /* 1 if -image is specified. */ 298 int imagePadX[2]; /* -imagepadx */ 299 int imagePadY[2]; /* -imagepady */ 300 int text; /* 1 if -text is specified, 0 otherwise. */ 301 int textPadX[2]; /* -textpadx */ 302 int textPadY[2]; /* -textpady */ 303 }; 304 305 /* A structure of the following type is kept for each TreeStyle that is 306 * managed privately for use in column headers. */ 307 typedef struct HeaderStyle HeaderStyle; 308 struct HeaderStyle 309 { 310 TreeStyle style; /* A master style for use in a column 311 * header. */ 312 HeaderStyleParams params; /* Unique signature for this style. */ 313 HeaderStyle *next; /* Linked list of all header styles. */ 314 }; 315 316 /* A structure of the following type is kept for each treectrl widget. */ 317 struct TreeCtrl 318 { 319 /* Standard stuff */ 320 Tk_Window tkwin; 321 Display *display; 322 Tcl_Interp *interp; 323 Tcl_Command widgetCmd; 324 Tk_OptionTable optionTable; 325 326 /* Configuration options */ 327 Tcl_Obj *fgObj; /* -foreground */ 328 XColor *fgColorPtr; /* -foreground */ 329 Tcl_Obj *borderWidthObj; /* -borderwidth */ 330 int borderWidth; /* -borderwidth */ 331 Tk_3DBorder border; /* -background */ 332 Tk_Cursor cursor; /* Current cursor for window, or None. */ 333 int relief; /* -relief */ 334 Tcl_Obj *highlightWidthObj; /* -highlightthickness */ 335 int highlightWidth; /* -highlightthickness */ 336 XColor *highlightBgColorPtr; /* -highlightbackground */ 337 XColor *highlightColorPtr; /* -highlightcolor */ 338 char *xScrollCmd; /* -xscrollcommand */ 339 char *yScrollCmd; /* -yscrollcommand */ 340 Tcl_Obj *xScrollDelay; /* -xscrolldelay: used by scripts */ 341 Tcl_Obj *yScrollDelay; /* -yscrolldelay: used by scripts */ 342 int xScrollIncrement; /* -xscrollincrement */ 343 int yScrollIncrement; /* -yscrollincrement */ 344 int xScrollSmoothing; /* -xscrollsmoothing */ 345 int yScrollSmoothing; /* -yscrollsmoothing */ 346 #define SMOOTHING_X 0x01 347 #define SMOOTHING_Y 0x02 348 int scrollSmoothing; /* */ 349 Tcl_Obj *scrollMargin; /* -scrollmargin: used by scripts */ 350 char *takeFocus; /* -takfocus */ 351 Tcl_Obj *fontObj; /* -font */ 352 Tk_Font tkfont; /* -font */ 353 Tcl_Obj *headerFontObj; /* -headerfont */ 354 Tk_Font tkfontHeader; /* -headerfont */ 355 int showButtons; /* boolean: Draw expand/collapse buttons */ 356 int showLines; /* boolean: Draw lines connecting parent to 357 * child */ 358 int showRootLines; /* boolean: Draw lines connecting children 359 * of the root item */ 360 int showRoot; /* boolean: Draw the unique root item */ 361 int showRootButton; /* boolean: Draw expand/collapse button for 362 * root item */ 363 int showRootChildButtons; /* boolean: Draw expand/collapse buttons for 364 * children of the root item */ 365 int showHeader; /* boolean: show column titles */ 366 Tcl_Obj *indentObj; /* pixels: offset of child relative to 367 * parent */ 368 int indent; /* pixels: offset of child relative to 369 * parent */ 370 char *selectMode; /* -selectmode: used by scripts only */ 371 Tcl_Obj *itemHeightObj; /* -itemheight: Fixed height for all items 372 (unless overridden) */ 373 int itemHeight; /* -itemheight */ 374 Tcl_Obj *minItemHeightObj; /* -minitemheight: Minimum height for all items */ 375 int minItemHeight; /* -minitemheight */ 376 Tcl_Obj *itemWidthObj; /* -itemwidth */ 377 int itemWidth; /* -itemwidth */ 378 int itemWidthEqual; /* -itemwidthequal */ 379 Tcl_Obj *itemWidMultObj; /* -itemwidthmultiple */ 380 int itemWidMult; /* -itemwidthmultiple */ 381 Tcl_Obj *widthObj; /* -width */ 382 int width; /* -width */ 383 Tcl_Obj *heightObj; /* -height */ 384 int height; /* -height */ 385 TreeColumn columnTree; /* column where buttons/lines are drawn */ 386 #define DOUBLEBUFFER_NONE 0 387 #define DOUBLEBUFFER_ITEM 1 388 #define DOUBLEBUFFER_WINDOW 2 389 int doubleBuffer; /* -doublebuffer */ 390 XColor *buttonColor; /* -buttoncolor */ 391 Tcl_Obj *buttonSizeObj; /* -buttonSize */ 392 int buttonSize; /* -buttonsize */ 393 Tcl_Obj *buttonThicknessObj;/* -buttonthickness */ 394 int buttonThickness; /* -buttonthickness */ 395 int buttonTracking; /* -buttontracking */ 396 XColor *lineColor; /* -linecolor */ 397 Tcl_Obj *lineThicknessObj; /* -linethickness */ 398 int lineThickness; /* -linethickness */ 399 #define LINE_STYLE_DOT 0 400 #define LINE_STYLE_SOLID 1 401 int lineStyle; /* -linestyle */ 402 int vertical; /* -orient */ 403 Tcl_Obj *wrapObj; /* -wrap */ 404 PerStateInfo buttonImage; /* -buttonimage */ 405 PerStateInfo buttonBitmap; /* -buttonbitmap */ 406 char *backgroundImageString; /* -backgroundimage */ 407 Tk_Anchor bgImageAnchor; /* -bgimageanchor */ 408 int bgImageOpaque; /* -bgimageopaque */ 409 #define BGIMG_SCROLL_X 0x01 410 #define BGIMG_SCROLL_Y 0x02 411 Tcl_Obj *bgImageScrollObj; /* -bgimagescroll */ 412 int bgImageScroll; /* -bgimagescroll */ 413 #define BGIMG_TILE_X 0x01 414 #define BGIMG_TILE_Y 0x02 415 Tcl_Obj *bgImageTileObj; /* -bgimagetile */ 416 int bgImageTile; /* -bgimagetile */ 417 int useIndent; /* MAX of open/closed button width and 418 * indent */ 419 int buttonHeightMax; /* Maximum height of a button in any state. */ 420 #define BG_MODE_COLUMN 0 421 #define BG_MODE_ORDER 1 422 #define BG_MODE_ORDERVIS 2 423 #define BG_MODE_ROW 3 424 #ifdef DEPRECATED 425 #define BG_MODE_INDEX 4 /* compatibility */ 426 #define BG_MODE_VISINDEX 5 /* compatibility */ 427 #endif /* DEPRECATED */ 428 int backgroundMode; /* -backgroundmode */ 429 int columnResizeMode; /* -columnresizemode */ 430 431 int *canvasPadX; /* -canvaspadx */ 432 Tcl_Obj *canvasPadXObj; /* -canvaspadx */ 433 int *canvasPadY; /* -canvaspady */ 434 Tcl_Obj *canvasPadYObj; /* -canvaspady */ 435 436 int itemGapX; /* -itemgapx */ 437 Tcl_Obj *itemGapXObj; /* -itemgapx */ 438 int itemGapY; /* -itemgapy */ 439 Tcl_Obj *itemGapYObj; /* -itemgapy */ 440 441 struct TreeCtrlDebug debug; 442 struct TreeCtrlColumnDrag columnDrag; 443 444 /* Other stuff */ 445 int gotFocus; /* flag */ 446 int deleted; /* flag */ 447 int updateIndex; /* flag */ 448 int isActive; /* flag: mac & win "active" toplevel */ 449 struct { 450 int left; 451 int top; 452 int right; 453 int bottom; 454 } inset; /* borderWidth + highlightWidth */ 455 int xOrigin; /* offset from content x=0 to window x=0 */ 456 int yOrigin; /* offset from content y=0 to window y=0 */ 457 GC copyGC; 458 GC textGC; 459 GC headerTextGC; 460 GC buttonGC; 461 GC lineGC[2]; 462 Tk_Image backgroundImage; /* -backgroundimage */ 463 int useTheme; /* -usetheme */ 464 char *itemPrefix; /* -itemprefix */ 465 char *columnPrefix; /* -columnprefix */ 466 467 int prevWidth; 468 int prevHeight; 469 int drawableXOrigin; 470 int drawableYOrigin; 471 472 TreeColumn columns; /* List of columns */ 473 TreeColumn columnLast; /* Last in list of columns */ 474 TreeColumn columnTail; /* Last infinitely-wide column */ 475 TreeColumn columnVis; /* First visible non-locked column */ 476 int columnCount; /* Number of columns */ 477 int columnCountVis; /* Number of visible columns */ 478 int headerHeight; /* Height of column titles */ 479 int themeHeaderHeight; /* Fixed theme height of column titles */ 480 int widthOfColumns; /* Sum of column widths */ 481 int columnTreeLeft; /* left of column where buttons/lines are 482 * drawn */ 483 int columnTreeVis; /* TRUE if columnTree is visible */ 484 int columnBgCnt; /* Max -itembackground colors */ 485 #if COLUMNGRID == 1 486 int columnsWithGridLines; /* # visible columns with grid lines. */ 487 #endif 488 489 #define COLUMN_LOCK_LEFT 0 490 #define COLUMN_LOCK_NONE 1 491 #define COLUMN_LOCK_RIGHT 2 492 TreeColumn columnLockLeft; /* First left-locked column */ 493 TreeColumn columnLockNone; /* First unlocked column */ 494 TreeColumn columnLockRight; /* First right-locked column */ 495 int widthOfColumnsLeft; /* Sum of left-locked column widths */ 496 int widthOfColumnsRight; /* Sum of right-locked column widths */ 497 int columnCountVisLeft; /* Number of visible left-locked columns */ 498 int columnCountVisRight; /* Number of visible right-locked columns */ 499 int displayLockedColumns; /* Last seen value of 500 * Tree_ShouldDisplayLockedColumns() */ 501 502 #define UNIFORM_GROUP 503 #ifdef UNIFORM_GROUP 504 Tcl_HashTable uniformGroupHash; /* -uniform -> UniformGroup */ 505 #endif 506 507 Tcl_Obj *headerFgObj; /* -headerforeground */ 508 XColor *defHeaderTextColor; /* Default column header text color when 509 * the column's -textcolor option 510 * is not specified and the system theme 511 * doesn't specify a color. */ 512 513 TreeItem root; 514 TreeItem activeItem; 515 TreeItem anchorItem; 516 int nextItemId; 517 int nextColumnId; 518 Tcl_HashTable itemHash; /* TreeItem.id -> TreeItem */ 519 Tcl_HashTable itemSpansHash; /* TreeItem -> nothing */ 520 Tcl_HashTable elementHash; /* Element.name -> Element */ 521 Tcl_HashTable styleHash; /* Style.name -> Style */ 522 Tcl_HashTable imageNameHash; /* image name -> TreeImageRef */ 523 Tcl_HashTable imageTokenHash; /* Tk_Image -> TreeImageRef */ 524 int depth; /* max depth of items under root */ 525 int itemCount; /* Total number of items */ 526 int itemVisCount; /* Total number of ReallyVisible() items */ 527 int itemWrapCount; /* ReallyVisible() items with -wrap=true */ 528 QE_BindingTable bindingTable; 529 TreeDragImage dragImage; 530 TreeMarquee marquee; 531 TreeDInfo dInfo; 532 int selectCount; /* Number of selected items */ 533 Tcl_HashTable selection; /* Selected items */ 534 535 #define TREE_WRAP_NONE 0 536 #define TREE_WRAP_ITEMS 1 537 #define TREE_WRAP_PIXELS 2 538 #define TREE_WRAP_WINDOW 3 539 int wrapMode; /* TREE_WRAP_xxx */ 540 int wrapArg; /* Number of items, number of pixels */ 541 542 int totalWidth; /* Max/Sum of all TreeRanges */ 543 int totalHeight; /* Max/Sum of all TreeRanges */ 544 545 struct { 546 Tcl_Obj *xObj; 547 int x; /* Window coords */ 548 int sx; /* Window coords */ 549 int onScreen; 550 } columnProxy; 551 552 #define STATE_DOMAIN_ITEM 0 553 #define STATE_DOMAIN_HEADER 1 554 TreeStateDomain stateDomain[2]; 555 int configStateDomain; 556 557 int scanX; /* [scan mark] and [scan dragto] */ 558 int scanY; 559 int scanXOrigin; 560 int scanYOrigin; 561 562 Tk_OptionTable styleOptionTable; 563 #ifdef DEPRECATED 564 struct { 565 Tcl_Obj *stylesObj; 566 TreeStyle *styles; 567 int numStyles; 568 } defaultStyle; 569 #endif /* DEPRECATED */ 570 Tk_OptionTable itemOptionTable; 571 int itemPrefixLen; /* -itemprefix */ 572 int columnPrefixLen; /* -columnprefix */ 573 #ifdef ALLOC_HAX 574 ClientData allocData; 575 #endif 576 int preserveItemRefCnt; /* Ref count so items-in-use aren't freed. */ 577 TreeItemList preserveItemList; /* List of items to be deleted when 578 * preserveItemRefCnt==0. */ 579 580 struct { 581 Tcl_Obj *yObj; 582 int y; /* Window coords */ 583 int sy; /* Window coords */ 584 int onScreen; 585 } rowProxy; 586 587 char *optionHax[64]; /* Used by OptionHax_xxx */ 588 int optionHaxCnt; /* Used by OptionHax_xxx */ 589 590 TreeThemeData themeData; 591 GCCache *gcCache; /* Graphics contexts for elements. */ 592 593 TkRegion regionStack[8]; /* Temp region stack. */ 594 int regionStackLen; /* Number of unused regions in regionStack. */ 595 596 int itemTagExpr; /* Enable/disable operators in item tags */ 597 int columnTagExpr; /* Enable/disable operators in column tags */ 598 599 Tk_OptionTable gradientOptionTable; 600 Tcl_HashTable gradientHash; /* TreeGradient.name -> TreeGradient */ 601 int nativeGradients; /* Preference, not availability. */ 602 603 Tk_OptionTable headerOptionTable; 604 Tk_OptionTable headerColumnOptionTable; 605 Tk_OptionTable headerDragOptionTable; 606 TreeItem headerItems; 607 int headerCount; 608 int nextHeaderId; 609 Tcl_HashTable headerHash; /* TreeItem.id -> TreeItem */ 610 int tailExtend; /* This is the distance the tail column 611 * extends past the right edge of the 612 * content area. */ 613 614 struct { 615 int nextId; /* Next unique id number for a header style. */ 616 HeaderStyle *first; /* First in linked list of header styles. */ 617 TreeElement headerElem; /* Master element used by header styles. */ 618 TreeElement bitmapElem; /* Master element used by header styles. */ 619 TreeElement imageElem; /* Master element used by header styles. */ 620 TreeElement textElem; /* Master element used by header styles. */ 621 } headerStyle; 622 623 /* These two options contain "-image" and "-text". 624 * They are used by the [item image] and [item text] commands. 625 * Originally these were static globals but that isn't thread safe. */ 626 Tcl_Obj *imageOptionNameObj; 627 Tcl_Obj *textOptionNameObj; 628 629 /* Originally these were static globals but that isn't thread safe. */ 630 Tcl_Obj *formatFloatObj; /* %g */ 631 Tcl_Obj *formatIntObj; /* %d */ 632 Tcl_Obj *formatLongObj; /* %ld */ 633 Tcl_Obj *formatStringObj; /* %s */ 634 Tcl_Obj *stringClockObj; /* clock */ 635 Tcl_Obj *stringFormatObj; /* format */ 636 Tcl_Obj *optionFormatObj; /* -format */ 637 638 TreeColumnPriv columnPriv; 639 ClientData itemSpanPriv; 640 641 #ifdef TREECTRL_DEBUG 642 struct { 643 int inLayoutColumns; 644 } debugCheck; 645 #endif 646 }; 647 648 #define TREE_CONF_FONT 0x0001 649 #define TREE_CONF_ITEMSIZE 0x0002 650 #define TREE_CONF_INDENT 0x0004 651 #define TREE_CONF_WRAP 0x0008 652 #define TREE_CONF_BUTIMG 0x0010 653 #define TREE_CONF_BUTBMP 0x0020 654 #define TREE_CONF_BORDERS 0x0040 655 #define TREE_CONF_BGIMGOPT 0x0080 656 #define TREE_CONF_RELAYOUT 0x0100 657 #define TREE_CONF_REDISPLAY 0x0200 658 #define TREE_CONF_FG 0x0400 659 #define TREE_CONF_PROXY 0x0800 660 #define TREE_CONF_BUTTON 0x1000 661 #define TREE_CONF_LINE 0x2000 662 #define TREE_CONF_DEFSTYLE 0x4000 663 #define TREE_CONF_BG_IMAGE 0x8000 664 #define TREE_CONF_THEME 0x00010000 665 666 MODULE_SCOPE void Tree_AddItem(TreeCtrl *tree, TreeItem item); 667 MODULE_SCOPE void Tree_RemoveItem(TreeCtrl *tree, TreeItem item); 668 MODULE_SCOPE void Tree_AddHeader(TreeCtrl *tree, TreeItem item); 669 MODULE_SCOPE void Tree_RemoveHeader(TreeCtrl *tree, TreeItem item); 670 MODULE_SCOPE Tk_Image Tree_GetImage(TreeCtrl *tree, char *imageName); 671 MODULE_SCOPE void Tree_FreeImage(TreeCtrl *tree, Tk_Image image); 672 MODULE_SCOPE void Tree_UpdateScrollbarX(TreeCtrl *tree); 673 MODULE_SCOPE void Tree_UpdateScrollbarY(TreeCtrl *tree); 674 MODULE_SCOPE void Tree_AddToSelection(TreeCtrl *tree, TreeItem item); 675 MODULE_SCOPE void Tree_RemoveFromSelection(TreeCtrl *tree, TreeItem item); 676 MODULE_SCOPE void Tree_PreserveItems(TreeCtrl *tree); 677 MODULE_SCOPE void Tree_ReleaseItems(TreeCtrl *tree); 678 679 MODULE_SCOPE int TreeArea_FromObj(TreeCtrl *tree, Tcl_Obj *objPtr, 680 int *areaPtr); 681 682 #define STATE_OP_ON 0 683 #define STATE_OP_OFF 1 684 #define STATE_OP_TOGGLE 2 685 #define SFO_NOT_OFF 0x0001 686 #define SFO_NOT_TOGGLE 0x0002 687 #define SFO_NOT_STATIC 0x0004 688 MODULE_SCOPE int Tree_StateFromObj(TreeCtrl *tree, int domain, Tcl_Obj *obj, int states[3], int *indexPtr, int flags); 689 MODULE_SCOPE int Tree_StateFromListObj(TreeCtrl *tree, int domain, Tcl_Obj *obj, int states[3], int flags); 690 691 MODULE_SCOPE int Tree_StateCmd(TreeCtrl *tree, int domain, int objc, Tcl_Obj *CONST objv[]); 692 693 #define Tree_BorderLeft(tree) \ 694 tree->inset.left 695 #define Tree_BorderTop(tree) \ 696 tree->inset.top 697 #define Tree_BorderRight(tree) \ 698 (Tk_Width(tree->tkwin) - tree->inset.right) 699 #define Tree_BorderBottom(tree) \ 700 (Tk_Height(tree->tkwin) - tree->inset.bottom) 701 702 #define Tree_HeaderLeft(tree) \ 703 Tree_BorderLeft(tree) 704 #define Tree_HeaderTop(tree) \ 705 Tree_BorderTop(tree) 706 #define Tree_HeaderRight(tree) \ 707 Tree_BorderRight(tree) 708 #define Tree_HeaderBottom(tree) \ 709 (Tree_BorderTop(tree) + Tree_HeaderHeight(tree)) 710 #define Tree_HeaderWidth(tree) \ 711 (Tree_HeaderRight(tree) - Tree_HeaderLeft(tree)) 712 713 #define Tree_ContentLeft(tree) \ 714 (Tree_BorderLeft(tree) + Tree_WidthOfLeftColumns(tree)) 715 #define Tree_ContentTop(tree) \ 716 (Tree_BorderTop(tree) + Tree_HeaderHeight(tree)) 717 #define Tree_ContentRight(tree) \ 718 (Tree_BorderRight(tree) - Tree_WidthOfRightColumns(tree)) 719 #define Tree_ContentBottom(tree) \ 720 Tree_BorderBottom(tree) 721 722 #define Tree_ContentWidth(tree) \ 723 (Tree_ContentRight(tree) - Tree_ContentLeft(tree)) 724 #define Tree_ContentHeight(tree) \ 725 (Tree_ContentBottom(tree) - Tree_ContentTop(tree)) 726 727 /* tkTreeHeader.c */ 728 729 MODULE_SCOPE int TreeHeader_InitWidget(TreeCtrl *tree); 730 MODULE_SCOPE void TreeHeader_FreeWidget(TreeCtrl *tree); 731 MODULE_SCOPE int TreeHeaderCmd(ClientData clientData, Tcl_Interp *interp, 732 int objc, Tcl_Obj *CONST objv[]); 733 MODULE_SCOPE int TreeHeaderList_FromObj(TreeCtrl *tree, Tcl_Obj *objPtr, TreeItemList *items, int flags); 734 MODULE_SCOPE void TreeHeader_TreeChanged(TreeCtrl *tree, int flagT); 735 MODULE_SCOPE int TreeHeader_ColumnDragOrder(TreeHeader header, 736 TreeColumn column, int index); 737 MODULE_SCOPE int TreeHeader_IsDraggedColumn(TreeHeader header, 738 TreeColumn column); 739 MODULE_SCOPE int TreeHeader_GetDraggedColumns(TreeHeader header, int lock, 740 TreeColumn *first, TreeColumn *last); 741 MODULE_SCOPE int TreeHeaderColumn_NeededHeight(TreeHeader header, TreeHeaderColumn column, int fixedWidth); 742 MODULE_SCOPE void TreeHeaders_RequestWidthInColumns(TreeCtrl *tree, 743 TreeColumn columnMin, TreeColumn columnMax); 744 MODULE_SCOPE int Tree_HeaderHeight(TreeCtrl *tree); 745 MODULE_SCOPE TreeItem TreeHeader_GetItem(TreeHeader header); 746 MODULE_SCOPE void TreeHeader_ColumnDeleted(TreeCtrl *tree, TreeColumn treeColumn); 747 748 MODULE_SCOPE Tcl_Obj *TreeHeaderColumn_GetImageOrText(TreeHeader header, 749 TreeHeaderColumn column, int isImage); 750 MODULE_SCOPE int TreeHeaderColumn_SetImageOrText(TreeHeader header, 751 TreeHeaderColumn column, TreeColumn treeColumn, Tcl_Obj *valueObj, 752 int isImage); 753 754 MODULE_SCOPE int TreeHeaderColumn_EnsureStyleExists(TreeHeader header, 755 TreeHeaderColumn column, TreeColumn treeColumn); 756 MODULE_SCOPE int TreeHeader_ConsumeColumnCget(TreeCtrl *tree, 757 TreeColumn treeColumn, Tcl_Obj *objPtr); 758 MODULE_SCOPE int TreeHeader_ConsumeColumnConfig(TreeCtrl *tree, 759 TreeColumn treeColumn, int objc, Tcl_Obj *CONST objv[], int createFlag); 760 MODULE_SCOPE Tcl_Obj *TreeHeader_ConsumeColumnOptionInfo(TreeCtrl *tree, 761 TreeColumn treeColumn, Tcl_Obj *objPtr); 762 MODULE_SCOPE TreeHeader TreeHeader_CreateWithItem(TreeCtrl *tree, 763 TreeItem item); 764 MODULE_SCOPE void TreeHeader_FreeResources(TreeHeader header); 765 MODULE_SCOPE TreeHeaderColumn TreeHeaderColumn_CreateWithItemColumn( 766 TreeHeader header, TreeItemColumn itemColumn); 767 MODULE_SCOPE void TreeHeaderColumn_FreeResources(TreeCtrl *tree, 768 TreeHeaderColumn column); 769 MODULE_SCOPE int TreeHeaderColumn_StateChanged(TreeHeader header, 770 TreeHeaderColumn column, TreeColumn treeColumn, int state1, int state2); 771 MODULE_SCOPE int TreeHeaderColumn_DragBounds(TreeHeader header, 772 TreeHeaderColumn column, StyleDrawArgs *drawArgs, int dragPosition); 773 MODULE_SCOPE void TreeHeaderColumn_Draw(TreeHeader header, 774 TreeHeaderColumn column, int visIndex, StyleDrawArgs *drawArgs, 775 int dragPosition); 776 MODULE_SCOPE int TreeHeaderColumn_NeededWidth(TreeHeader header, 777 TreeHeaderColumn column); 778 MODULE_SCOPE TreeItem Tree_HeaderUnderPoint(TreeCtrl *tree, int *x_, int *y_, int *lock); 779 MODULE_SCOPE int TreeHeader_FromObj(TreeCtrl *tree, Tcl_Obj *objPtr, 780 TreeHeader *headerPtr); 781 MODULE_SCOPE Tcl_Obj* TreeHeader_ToObj(TreeHeader header); 782 MODULE_SCOPE Tk_Justify TreeHeaderColumn_Justify(TreeHeader header, 783 TreeHeaderColumn column); 784 785 MODULE_SCOPE Tk_ObjCustomOption TreeCtrlCO_header; 786 787 /* tkTreeItem.c */ 788 789 #define ITEM_ALL ((TreeItem) -1) 790 #define IFO_NOT_MANY 0x0001 /* ItemFromObj flag: > 1 item is not ok */ 791 #define IFO_NOT_NULL 0x0002 /* ItemFromObj flag: can't be NULL */ 792 #define IFO_NOT_ROOT 0x0004 /* ItemFromObj flag: "root" is forbidden */ 793 #define IFO_NOT_ORPHAN 0x0008 /* ItemFromObj flag: item must have a parent */ 794 #define IFO_LIST_ALL 0x0010 /* ItemFromObj flag: return "all" as list */ 795 MODULE_SCOPE int TreeItemList_FromObj(TreeCtrl *tree, Tcl_Obj *objPtr, TreeItemList *items, int flags); 796 MODULE_SCOPE int TreeItem_FromObj(TreeCtrl *tree, Tcl_Obj *objPtr, TreeItem *itemPtr, int flags); 797 798 typedef struct ItemForEach ItemForEach; 799 struct ItemForEach { 800 TreeCtrl *tree; 801 int error; 802 int all; 803 Tcl_HashSearch search; 804 TreeItem last; 805 TreeItem item; 806 TreeItemList *items; 807 int index; 808 }; 809 MODULE_SCOPE TreeItem TreeItemForEach_Start(TreeItemList *items, TreeItemList *item2s, 810 ItemForEach *iter); 811 MODULE_SCOPE TreeItem TreeItemForEach_Next(ItemForEach *iter); 812 #define ITEM_FOR_EACH(item, items, item2s, iter) \ 813 for (item = TreeItemForEach_Start(items, item2s, iter); \ 814 item != NULL; \ 815 item = TreeItemForEach_Next(iter)) 816 817 #ifdef TREECTRL_DEBUG 818 #define BreakIntoDebugger() TreeCtrl_BreakIntoDebugger(__FILE__, __LINE__) 819 MODULE_SCOPE void TreeCtrl_BreakIntoDebugger(const char *file, int line); 820 #endif 821 822 #define FormatResult TreeCtrl_FormatResult 823 MODULE_SCOPE void FormatResult(Tcl_Interp *interp, char *fmt, ...); 824 #define DStringAppendf TreeCtrl_DStringAppendf 825 MODULE_SCOPE void DStringAppendf(Tcl_DString *dString, char *fmt, ...); 826 MODULE_SCOPE void Tree_Debug(TreeCtrl *tree); 827 828 MODULE_SCOPE int TreeItem_InitWidget(TreeCtrl *tree); 829 MODULE_SCOPE void TreeItem_FreeWidget(TreeCtrl *tree); 830 MODULE_SCOPE int TreeItem_Debug(TreeCtrl *tree, TreeItem item); 831 MODULE_SCOPE void TreeItem_OpenClose(TreeCtrl *tree, TreeItem item, int mode); 832 MODULE_SCOPE void TreeItem_Delete(TreeCtrl *tree, TreeItem item); 833 MODULE_SCOPE int TreeItem_Deleted(TreeCtrl *tree, TreeItem item); 834 835 #define STATE_ITEM_OPEN 0x0001 836 #define STATE_ITEM_SELECTED 0x0002 837 #define STATE_ITEM_ENABLED 0x0004 838 #define STATE_ITEM_ACTIVE 0x0008 839 #define STATE_ITEM_FOCUS 0x0010 840 841 #define STATE_HEADER_BG 0x0001 842 #define STATE_HEADER_FOCUS 0x0002 843 #define STATE_HEADER_ACTIVE 0x0004 844 #define STATE_HEADER_NORMAL 0x0008 845 #define STATE_HEADER_PRESSED 0x0010 846 #define STATE_HEADER_SORT_UP 0x0020 847 #define STATE_HEADER_SORT_DOWN 0x0040 848 MODULE_SCOPE int TreeItem_GetState(TreeCtrl *tree, TreeItem item_); 849 MODULE_SCOPE int TreeItemColumn_GetState(TreeCtrl *tree, TreeItemColumn itemColumn); 850 851 /* State flags for button state, needed by themes */ 852 /* FIXME: These may conflict with [state define] states */ 853 #define BUTTON_STATE_ACTIVE (1<<30) 854 #define BUTTON_STATE_PRESSED (1<<31) 855 856 #define CS_DISPLAY 0x01 857 #define CS_LAYOUT 0x02 858 MODULE_SCOPE int TreeItem_ChangeState(TreeCtrl *tree, TreeItem item_, int stateOff, int stateOn); 859 MODULE_SCOPE int TreeItemColumn_ChangeState(TreeCtrl *tree, TreeItem item, 860 TreeItemColumn column_, TreeColumn treeColumn, int stateOff, int stateOn); 861 MODULE_SCOPE void TreeItem_UndefineState(TreeCtrl *tree, TreeItem item_, int state); 862 863 MODULE_SCOPE int TreeItem_HasButton(TreeCtrl *tree, TreeItem item_); 864 MODULE_SCOPE int TreeItem_IsPointInButton(TreeCtrl *tree, TreeItem item_, int x, int y); 865 MODULE_SCOPE int TreeItem_GetDepth(TreeCtrl *tree, TreeItem item_); 866 MODULE_SCOPE int TreeItem_GetID(TreeCtrl *tree, TreeItem item_); 867 MODULE_SCOPE int TreeItem_SetID(TreeCtrl *tree, TreeItem item_, int id); 868 MODULE_SCOPE int TreeItem_GetEnabled(TreeCtrl *tree, TreeItem item_); 869 MODULE_SCOPE int TreeItem_GetSelected(TreeCtrl *tree, TreeItem item_); 870 MODULE_SCOPE int TreeItem_CanAddToSelection(TreeCtrl *tree, TreeItem item_); 871 MODULE_SCOPE int TreeItem_GetWrap(TreeCtrl *tree, TreeItem item_); 872 MODULE_SCOPE TreeItem TreeItem_GetParent(TreeCtrl *tree, TreeItem item); 873 MODULE_SCOPE TreeItem TreeItem_GetNextSibling(TreeCtrl *tree, TreeItem item); 874 MODULE_SCOPE TreeItem TreeItem_NextSiblingVisible(TreeCtrl *tree, TreeItem item); 875 MODULE_SCOPE void TreeItem_SetDInfo(TreeCtrl *tree, TreeItem item, TreeItemDInfo dInfo); 876 MODULE_SCOPE TreeItemDInfo TreeItem_GetDInfo(TreeCtrl *tree, TreeItem item); 877 MODULE_SCOPE void TreeItem_SetRInfo(TreeCtrl *tree, TreeItem item, TreeItemRInfo rInfo); 878 MODULE_SCOPE TreeItemRInfo TreeItem_GetRInfo(TreeCtrl *tree, TreeItem item); 879 880 MODULE_SCOPE TagInfo *TreeItem_GetTagInfo(TreeCtrl *tree, TreeItem item); 881 MODULE_SCOPE int TreeItem_HasTag(TreeItem, Tk_Uid tag); 882 MODULE_SCOPE TreeItemColumn TreeItem_MakeColumnExist(TreeCtrl *tree, 883 TreeItem item, int columnIndex); 884 MODULE_SCOPE TreeItem TreeItem_CreateHeader(TreeCtrl *tree); 885 MODULE_SCOPE TreeHeader TreeItem_GetHeader(TreeCtrl *tree, TreeItem item_); 886 MODULE_SCOPE TreeHeaderColumn TreeItemColumn_GetHeaderColumn(TreeCtrl *tree, TreeItemColumn itemColumn); 887 MODULE_SCOPE int TreeItem_ConsumeHeaderCget(TreeCtrl *tree, TreeItem item, 888 Tcl_Obj *objPtr); 889 MODULE_SCOPE int TreeItem_ConsumeHeaderConfig(TreeCtrl *tree, TreeItem item, 890 int objc, Tcl_Obj *CONST objv[]); 891 MODULE_SCOPE int TreeItem_GetHeaderOptionInfo(TreeCtrl *tree, 892 TreeHeader header, Tcl_Obj *objPtr, Tcl_Obj *resultObjPtr); 893 MODULE_SCOPE int TreeItemCmd_Bbox(TreeCtrl *tree, int objc, 894 Tcl_Obj *CONST objv[], int doHeaders); 895 MODULE_SCOPE int TreeItemCmd_Element(TreeCtrl *tree, int objc, 896 Tcl_Obj *CONST objv[], int doHeaders); 897 MODULE_SCOPE int TreeItemCmd_Span(TreeCtrl *tree, int objc, 898 Tcl_Obj *CONST objv[], int doHeaders); 899 MODULE_SCOPE int TreeItemCmd_State(TreeCtrl *tree, int objc, 900 Tcl_Obj *CONST objv[], int doHeaders); 901 MODULE_SCOPE int TreeItemCmd_Style(TreeCtrl *tree, int objc, 902 Tcl_Obj *CONST objv[], int doHeaders); 903 MODULE_SCOPE int TreeItemCmd_ImageOrText(TreeCtrl *tree, int objc, 904 Tcl_Obj *CONST objv[], int doImage, int doHeaders); 905 MODULE_SCOPE int TreeItemCmd_Tag(TreeCtrl *tree, int objc, 906 Tcl_Obj *CONST objv[], int doHeaders); 907 908 MODULE_SCOPE void TreeItem_AppendChild(TreeCtrl *tree, TreeItem self, TreeItem child); 909 MODULE_SCOPE void TreeItem_RemoveFromParent(TreeCtrl *tree, TreeItem self); 910 MODULE_SCOPE int TreeItem_FirstAndLast(TreeCtrl *tree, TreeItem *first, TreeItem *last); 911 MODULE_SCOPE void TreeItem_ListDescendants(TreeCtrl *tree, TreeItem item_, TreeItemList *items); 912 MODULE_SCOPE void TreeItem_UpdateDepth(TreeCtrl *tree, TreeItem item); 913 MODULE_SCOPE void TreeItem_AddToParent(TreeCtrl *tree, TreeItem item); 914 MODULE_SCOPE int TreeItem_Height(TreeCtrl *tree, TreeItem self); 915 MODULE_SCOPE int TreeItem_TotalHeight(TreeCtrl *tree, TreeItem self); 916 MODULE_SCOPE void TreeItem_InvalidateHeight(TreeCtrl *tree, TreeItem self); 917 MODULE_SCOPE void TreeItem_SpansInvalidate(TreeCtrl *tree, TreeItem item_); 918 MODULE_SCOPE int TreeItem_SpansRedo(TreeCtrl *tree, TreeItem item_); 919 MODULE_SCOPE void TreeItem_SpansRedoIfNeeded(TreeCtrl *tree, TreeItem item_); 920 MODULE_SCOPE int *TreeItem_GetSpans(TreeCtrl *tree, TreeItem item_); 921 MODULE_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); 922 MODULE_SCOPE void TreeItem_DrawLines(TreeCtrl *tree, TreeItem self, int x, int y, int width, int height, TreeDrawable td, TreeStyle style); 923 MODULE_SCOPE void TreeItem_DrawButton(TreeCtrl *tree, TreeItem self, int x, int y, int width, int height, TreeDrawable td, TreeStyle style); 924 MODULE_SCOPE int TreeItem_ReallyVisible(TreeCtrl *tree, TreeItem self); 925 MODULE_SCOPE void TreeItem_FreeResources(TreeCtrl *tree, TreeItem self); 926 MODULE_SCOPE void TreeItem_Release(TreeCtrl *tree, TreeItem item); 927 MODULE_SCOPE TreeItem TreeItem_RootAncestor(TreeCtrl *tree, TreeItem item_); 928 MODULE_SCOPE int TreeItem_IsAncestor(TreeCtrl *tree, TreeItem item1, TreeItem item2); 929 MODULE_SCOPE Tcl_Obj *TreeItem_ToObj(TreeCtrl *tree, TreeItem item); 930 MODULE_SCOPE void TreeItem_ToIndex(TreeCtrl *tree, TreeItem item, int *absolute, int *visible); 931 MODULE_SCOPE TreeItem TreeItem_Next(TreeCtrl *tree, TreeItem item); 932 MODULE_SCOPE TreeItem TreeItem_NextVisible(TreeCtrl *tree, TreeItem item); 933 MODULE_SCOPE TreeItem TreeItem_Prev(TreeCtrl *tree, TreeItem item); 934 MODULE_SCOPE TreeItem TreeItem_PrevVisible(TreeCtrl *tree, TreeItem item); 935 MODULE_SCOPE void TreeItem_Identify(TreeCtrl *tree, TreeItem item_, int lock, int x, int y, TreeColumn *columnPtr, TreeElement *elemPtr); 936 MODULE_SCOPE void TreeItem_Identify2(TreeCtrl *tree, TreeItem item_, 937 int x1, int y1, int x2, int y2, Tcl_Obj *listObj); 938 MODULE_SCOPE int TreeItem_GetRects(TreeCtrl *tree, TreeItem item_, 939 TreeColumn treeColumn, int objc, Tcl_Obj *CONST objv[], TreeRectangle rects[]); 940 MODULE_SCOPE int TreeItem_Indent(TreeCtrl *tree, TreeColumn column, TreeItem item_); 941 MODULE_SCOPE void Tree_UpdateItemIndex(TreeCtrl *tree); 942 MODULE_SCOPE void Tree_DeselectHidden(TreeCtrl *tree); 943 MODULE_SCOPE int TreeItemCmd(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]); 944 MODULE_SCOPE void TreeItem_UpdateWindowPositions(TreeCtrl *tree, TreeItem item_, 945 int lock, int x, int y, int width, int height); 946 MODULE_SCOPE void TreeItem_GetOnScreenColumns(TreeCtrl *tree, TreeItem item_, 947 int lock, int x, int y, int width, int height, TreeColumnList *columns); 948 MODULE_SCOPE void TreeItem_OnScreen(TreeCtrl *tree, TreeItem item_, int onScreen); 949 950 MODULE_SCOPE TreeItemColumn TreeItem_GetFirstColumn(TreeCtrl *tree, TreeItem item); 951 MODULE_SCOPE TreeItemColumn TreeItemColumn_GetNext(TreeCtrl *tree, TreeItemColumn column); 952 MODULE_SCOPE void TreeItemColumn_InvalidateSize(TreeCtrl *tree, TreeItemColumn column); 953 MODULE_SCOPE TreeStyle TreeItemColumn_GetStyle(TreeCtrl *tree, TreeItemColumn column); 954 MODULE_SCOPE void TreeItemColumn_SetStyle(TreeCtrl *tree, TreeItemColumn column, TreeStyle style); 955 MODULE_SCOPE int TreeItemColumn_Index(TreeCtrl *tree, TreeItem item_, TreeItemColumn column_); 956 MODULE_SCOPE void TreeItemColumn_ForgetStyle(TreeCtrl *tree, TreeItemColumn column_); 957 MODULE_SCOPE int TreeItemColumn_NeededWidth(TreeCtrl *tree, TreeItem item_, TreeItemColumn column_); 958 MODULE_SCOPE TreeItemColumn TreeItem_FindColumn(TreeCtrl *tree, TreeItem item, int columnIndex); 959 MODULE_SCOPE int TreeItem_ColumnFromObj(TreeCtrl *tree, TreeItem item, 960 Tcl_Obj *obj, TreeItemColumn *columnPtr, TreeColumn *treeColumnPtr, 961 int *indexPtr, int flags); 962 MODULE_SCOPE void TreeItem_RemoveColumns(TreeCtrl *tree, TreeItem item_, int first, int last); 963 MODULE_SCOPE void TreeItem_RemoveAllColumns(TreeCtrl *tree, TreeItem item_); 964 MODULE_SCOPE void TreeItem_MoveColumn(TreeCtrl *tree, TreeItem item_, int columnIndex, int beforeIndex); 965 966 MODULE_SCOPE void TreeItem_RequestWidthInColumns(TreeCtrl *tree, 967 TreeItem item, TreeColumn columnMin, TreeColumn columnMax); 968 MODULE_SCOPE void TreeItems_RequestWidthInColumns(TreeCtrl *tree, 969 TreeColumn columnMin, TreeColumn columnMax); 970 971 /* tkTreeElem.c */ 972 MODULE_SCOPE int TreeElement_InitInterp(Tcl_Interp *interp); 973 MODULE_SCOPE int TreeElement_InitWidget(TreeCtrl *tree); 974 MODULE_SCOPE void TreeElement_FreeWidget(TreeCtrl *tree); 975 MODULE_SCOPE int TreeStateFromObj(TreeCtrl *tree, int domain, Tcl_Obj *obj, int *stateOff, int *stateOn); 976 MODULE_SCOPE int StringTableCO_Init(Tk_OptionSpec *optionTable, CONST char *optionName, CONST char **tablePtr); 977 978 struct StyleDrawArgs 979 { 980 TreeCtrl *tree; 981 TreeColumn column; 982 TreeItem item; 983 TreeStyle style; 984 int indent; 985 int x; /* Display area of the style. */ 986 int y; /* ^ */ 987 int width; /* ^ */ 988 int height; /* ^ */ 989 int spanIndex; /* 0-based index in the list of visible spans. */ 990 TreeDrawable td; /* Where to draw. */ 991 int state; /* STATE_xxx */ 992 Tk_Justify justify; /* How to justify the style within 'bounds'. */ 993 TreeRectangle bounds; /* TREE_AREA_XXX bounds. */ 994 }; 995 996 /* tkTreeStyle.c */ 997 MODULE_SCOPE int TreeStyle_InitWidget(TreeCtrl *tree); 998 MODULE_SCOPE int TreeStyle_NeededWidth(TreeCtrl *tree, TreeStyle style_, int state); 999 MODULE_SCOPE int TreeStyle_NeededHeight(TreeCtrl *tree, TreeStyle style_, int state); 1000 MODULE_SCOPE int TreeStyle_UseHeight(StyleDrawArgs *drawArgs); 1001 MODULE_SCOPE void TreeStyle_Draw(StyleDrawArgs *args); 1002 MODULE_SCOPE void TreeStyle_FreeResources(TreeCtrl *tree, TreeStyle style_); 1003 MODULE_SCOPE void TreeStyle_FreeWidget(TreeCtrl *tree); 1004 MODULE_SCOPE Tcl_Obj *TreeElement_ToObj(TreeElement elem); 1005 MODULE_SCOPE int TreeElement_FromObj(TreeCtrl *tree, Tcl_Obj *obj, TreeElement *elemPtr); 1006 MODULE_SCOPE int TreeElement_IsType(TreeCtrl *tree, TreeElement elem, CONST char *type); 1007 MODULE_SCOPE int TreeStyle_FromObj(TreeCtrl *tree, Tcl_Obj *obj, TreeStyle *stylePtr); 1008 MODULE_SCOPE Tcl_Obj *TreeStyle_ToObj(TreeStyle style_); 1009 MODULE_SCOPE Tcl_Obj *TreeStyle_GetImage(TreeCtrl *tree, TreeStyle style_, TreeElement *elemPtr); 1010 MODULE_SCOPE Tcl_Obj *TreeStyle_GetText(TreeCtrl *tree, TreeStyle style_, TreeElement *elemPtr); 1011 MODULE_SCOPE int TreeStyle_SetImage(TreeCtrl *tree, TreeItem item, TreeItemColumn column, TreeStyle style_, Tcl_Obj *imageObj, TreeElement *elemPtr); 1012 MODULE_SCOPE int TreeStyle_SetText(TreeCtrl *tree, TreeItem item, TreeItemColumn column, TreeStyle style_, Tcl_Obj *textObj, TreeElement *elemPtr); 1013 MODULE_SCOPE int TreeStyle_FindElement(TreeCtrl *tree, TreeStyle style_, TreeElement elem, int *index); 1014 MODULE_SCOPE TreeStyle TreeStyle_NewInstance(TreeCtrl *tree, TreeStyle master); 1015 MODULE_SCOPE int TreeStyle_ElementActual(TreeCtrl *tree, TreeStyle style_, int state, Tcl_Obj *elemObj, Tcl_Obj *obj); 1016 MODULE_SCOPE int TreeStyle_ElementCget(TreeCtrl *tree, TreeItem item, TreeItemColumn column, TreeStyle style_, Tcl_Obj *elemObj, Tcl_Obj *obj); 1017 MODULE_SCOPE int TreeStyle_ElementConfigure(TreeCtrl *tree, TreeItem item, 1018 TreeItemColumn column, TreeStyle style_, TreeElement elem, int objc, 1019 Tcl_Obj **objv, int *eMask); 1020 MODULE_SCOPE int TreeStyle_ElementConfigureFromObj(TreeCtrl *tree, 1021 TreeItem item, TreeItemColumn column, TreeStyle style_, Tcl_Obj *elemObj, 1022 int objc, Tcl_Obj **objv, int *eMask); 1023 MODULE_SCOPE void TreeStyle_ListElements(TreeCtrl *tree, TreeStyle style_); 1024 MODULE_SCOPE int TreeStyle_GetButtonY(TreeCtrl *tree, TreeStyle style_); 1025 MODULE_SCOPE TreeStyle TreeStyle_GetMaster(TreeCtrl *tree, TreeStyle style_); 1026 MODULE_SCOPE CONST char *TreeStyle_GetName(TreeCtrl *tree, TreeStyle style_); 1027 MODULE_SCOPE int TreeStyle_GetStateDomain(TreeCtrl *tree, TreeStyle style_); 1028 MODULE_SCOPE TreeElement TreeStyle_Identify(StyleDrawArgs *drawArgs, int x, int y); 1029 MODULE_SCOPE void TreeStyle_Identify2(StyleDrawArgs *drawArgs, 1030 int x1, int y1, int x2, int y2, Tcl_Obj *listObj); 1031 MODULE_SCOPE int TreeStyle_Remap(TreeCtrl *tree, TreeStyle styleFrom_, TreeStyle styleTo_, int objc, Tcl_Obj *CONST objv[]); 1032 MODULE_SCOPE void TreeStyle_TreeChanged(TreeCtrl *tree, int flagT); 1033 #define SORT_ASCII 0 1034 #define SORT_DICT 1 1035 #define SORT_DOUBLE 2 1036 #define SORT_LONG 3 1037 #define SORT_COMMAND 4 1038 MODULE_SCOPE int TreeStyle_GetSortData(TreeCtrl *tree, TreeStyle style_, int elemIndex, int type, long *lv, double *dv, char **sv); 1039 #if 0 1040 MODULE_SCOPE int TreeStyle_ValidateElements(TreeCtrl *tree, TreeStyle style_, int objc, Tcl_Obj *CONST objv[]); 1041 #endif 1042 MODULE_SCOPE int TreeStyle_GetElemRects(StyleDrawArgs *drawArgs, int objc, Tcl_Obj *CONST objv[], TreeRectangle rects[]); 1043 MODULE_SCOPE int TreeElementCmd(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]); 1044 MODULE_SCOPE int TreeStyleCmd(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]); 1045 MODULE_SCOPE int TreeStyle_ChangeState(TreeCtrl *tree, TreeStyle style_, int state1, int state2); 1046 MODULE_SCOPE void Tree_UndefineState(TreeCtrl *tree, int domain, int state); 1047 MODULE_SCOPE int TreeStyle_NumElements(TreeCtrl *tree, TreeStyle style_); 1048 MODULE_SCOPE int TreeStyle_IsHeaderStyle(TreeCtrl *tree, TreeStyle style); 1049 MODULE_SCOPE int TreeStyle_HasHeaderElement(TreeCtrl *tree, TreeStyle style); 1050 MODULE_SCOPE TreeStyle Tree_MakeHeaderStyle(TreeCtrl *tree, HeaderStyleParams *params); 1051 MODULE_SCOPE void TreeStyle_UpdateWindowPositions(StyleDrawArgs *drawArgs); 1052 MODULE_SCOPE void TreeStyle_OnScreen(TreeCtrl *tree, TreeStyle style_, int onScreen); 1053 1054 MODULE_SCOPE void Tree_ButtonMaxSize(TreeCtrl *tree, int *maxWidth, int *maxHeight); 1055 MODULE_SCOPE int Tree_ButtonHeight(TreeCtrl *tree, int state); 1056 1057 /* tkTreeNotify.c */ 1058 MODULE_SCOPE int TreeNotify_InitWidget(TreeCtrl *tree); 1059 MODULE_SCOPE void TreeNotify_OpenClose(TreeCtrl *tree, TreeItem item, int isOpen, int before); 1060 MODULE_SCOPE void TreeNotify_Selection(TreeCtrl *tree, TreeItemList *select, TreeItemList *deselect); 1061 MODULE_SCOPE int TreeNotifyCmd(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]); 1062 MODULE_SCOPE void TreeNotify_ActiveItem(TreeCtrl *tree, TreeItem itemOld, TreeItem itemNew); 1063 MODULE_SCOPE void TreeNotify_Scroll(TreeCtrl *tree, double fractions[2], int vertical); 1064 MODULE_SCOPE void TreeNotify_ItemDeleted(TreeCtrl *tree, TreeItemList *items); 1065 MODULE_SCOPE void TreeNotify_ItemVisibility(TreeCtrl *tree, TreeItemList *v, TreeItemList *h); 1066 1067 /* tkTreeColumn.c */ 1068 MODULE_SCOPE Tk_ObjCustomOption TreeCtrlCO_column; 1069 MODULE_SCOPE Tk_ObjCustomOption TreeCtrlCO_column_NOT_TAIL; 1070 MODULE_SCOPE int TreeColumn_InitInterp(Tcl_Interp *interp); 1071 MODULE_SCOPE void TreeColumn_InitWidget(TreeCtrl *tree); 1072 MODULE_SCOPE TreeColumn Tree_FindColumn(TreeCtrl *tree, int columnIndex); 1073 MODULE_SCOPE int TreeColumn_FirstAndLast(TreeColumn *first, TreeColumn *last); 1074 1075 #define COLUMN_ALL ((TreeColumn) -1) /* Every column. */ 1076 #define COLUMN_NTAIL ((TreeColumn) -2) /* Every column but the tail. */ 1077 #define CFO_NOT_MANY 0x01 1078 #define CFO_NOT_NULL 0x02 1079 #define CFO_NOT_TAIL 0x04 1080 #define CFO_LIST_ALL 0x08 1081 MODULE_SCOPE int TreeColumnList_FromObj(TreeCtrl *tree, Tcl_Obj *objPtr, TreeColumnList *columns, int flags); 1082 MODULE_SCOPE int TreeColumn_FromObj(TreeCtrl *tree, Tcl_Obj *objPtr, TreeColumn *columnPtr, int flags); 1083 1084 /* Values for TreeColumn -arrow option, needed by themes */ 1085 #define COLUMN_ARROW_NONE 0 1086 #define COLUMN_ARROW_UP 1 1087 #define COLUMN_ARROW_DOWN 2 1088 1089 /* Values for TreeColumn -state option, needed by themes */ 1090 #define COLUMN_STATE_NORMAL 0 1091 #define COLUMN_STATE_ACTIVE 1 1092 #define COLUMN_STATE_PRESSED 2 1093 1094 typedef struct ColumnForEach ColumnForEach; 1095 struct ColumnForEach { 1096 TreeCtrl *tree; 1097 int error; 1098 int all; 1099 int ntail; 1100 TreeColumn current; 1101 TreeColumn next; 1102 TreeColumn last; 1103 TreeColumnList *list; 1104 int index; 1105 }; 1106 MODULE_SCOPE TreeColumn TreeColumnForEach_Start(TreeColumnList *columns, 1107 TreeColumnList *column2s, ColumnForEach *iter); 1108 MODULE_SCOPE TreeColumn TreeColumnForEach_Next(ColumnForEach *iter); 1109 #define COLUMN_FOR_EACH(column, columns, column2s, iter) \ 1110 for (column = TreeColumnForEach_Start(columns, column2s, iter); \ 1111 column != NULL; \ 1112 column = TreeColumnForEach_Next(iter)) 1113 1114 MODULE_SCOPE Tcl_Obj *TreeColumn_ToObj(TreeCtrl *tree, TreeColumn column_); 1115 MODULE_SCOPE int TreeColumnCmd(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]); 1116 MODULE_SCOPE int TreeColumn_GetID(TreeColumn column_); 1117 MODULE_SCOPE int TreeColumn_Index(TreeColumn column_); 1118 MODULE_SCOPE int TreeColumn_VisIndex(TreeColumn column_); 1119 MODULE_SCOPE TreeColumn Tree_FirstColumn(TreeCtrl *tree, int lock, int tailOK); 1120 MODULE_SCOPE TreeColumn Tree_ColumnToTheRight(TreeColumn column_, int displayOrder, int tailOK); 1121 MODULE_SCOPE TreeColumn TreeColumn_Next(TreeColumn column_); 1122 MODULE_SCOPE TreeColumn TreeColumn_Prev(TreeColumn column_); 1123 MODULE_SCOPE int TreeColumn_FixedWidth(TreeColumn column_); 1124 MODULE_SCOPE int TreeColumn_MinWidth(TreeColumn column_); 1125 MODULE_SCOPE int TreeColumn_MaxWidth(TreeColumn column_); 1126 MODULE_SCOPE int TreeColumn_NeededWidth(TreeColumn column_); 1127 MODULE_SCOPE int TreeColumn_NeededHeight(TreeColumn column_); 1128 MODULE_SCOPE int TreeColumn_UseWidth(TreeColumn column_); 1129 MODULE_SCOPE int TreeColumn_Offset(TreeColumn column_); 1130 MODULE_SCOPE Tk_Justify TreeColumn_ItemJustify(TreeColumn column_); 1131 #ifdef DEPRECATED 1132 MODULE_SCOPE int TreeColumn_WidthHack(TreeColumn column_); 1133 MODULE_SCOPE int TreeColumn_StepWidth(TreeColumn column_); 1134 #endif 1135 MODULE_SCOPE TreeStyle TreeColumn_ItemStyle(TreeColumn column_); 1136 MODULE_SCOPE void TreeColumn_StyleDeleted(TreeColumn column_, TreeStyle style); 1137 MODULE_SCOPE int TreeColumn_Visible(TreeColumn column_); 1138 MODULE_SCOPE int TreeColumn_Squeeze(TreeColumn column_); 1139 MODULE_SCOPE int TreeColumn_BackgroundCount(TreeColumn column_); 1140 MODULE_SCOPE TreeColor *TreeColumn_BackgroundColor(TreeColumn column_, int which); 1141 #if COLUMNGRID==1 1142 MODULE_SCOPE int TreeColumn_GridColors(TreeColumn column, TreeColor **leftColorPtr, 1143 TreeColor **rightColorPtr, int *leftWidthPtr, int *rightWidthPtr); 1144 #endif 1145 MODULE_SCOPE void Tree_DrawHeader(TreeCtrl *tree, TreeDrawable td, int x, int y); 1146 MODULE_SCOPE int TreeColumn_WidthOfItems(TreeColumn column_); 1147 MODULE_SCOPE int TreeColumn_WidthOfHeaders(TreeColumn column_); 1148 MODULE_SCOPE void TreeColumn_InvalidateWidth(TreeColumn column_); 1149 MODULE_SCOPE void TreeColumn_FreeWidget(TreeCtrl *tree); 1150 MODULE_SCOPE void TreeColumns_InvalidateWidthOfItems(TreeCtrl *tree, TreeColumn column); 1151 MODULE_SCOPE void TreeColumns_InvalidateWidth(TreeCtrl *tree); 1152 MODULE_SCOPE void TreeColumns_InvalidateSpans(TreeCtrl *tree); 1153 MODULE_SCOPE int TreeColumn_Bbox(TreeColumn column, int *x, int *y, int *w, int *h); 1154 MODULE_SCOPE int TreeColumn_Lock(TreeColumn column_); 1155 MODULE_SCOPE int Tree_WidthOfColumns(TreeCtrl *tree); 1156 MODULE_SCOPE int Tree_WidthOfLeftColumns(TreeCtrl *tree); 1157 MODULE_SCOPE int Tree_WidthOfRightColumns(TreeCtrl *tree); 1158 MODULE_SCOPE void TreeColumns_UpdateCounts(TreeCtrl *tree); 1159 MODULE_SCOPE void TreeColumns_InvalidateCounts(TreeCtrl *tree); 1160 MODULE_SCOPE void TreeColumn_SetDInfo(TreeColumn column, TreeColumnDInfo dInfo); 1161 MODULE_SCOPE TreeColumnDInfo TreeColumn_GetDInfo(TreeColumn column); 1162 1163 /* tkTreeDrag.c */ 1164 MODULE_SCOPE int TreeDragImage_InitWidget(TreeCtrl *tree); 1165 MODULE_SCOPE void TreeDragImage_FreeWidget(TreeCtrl *tree); 1166 MODULE_SCOPE int TreeDragImage_IsXOR(TreeDragImage dragImage_); 1167 MODULE_SCOPE int TreeDragImage_IsVisible(TreeDragImage dragImage_); 1168 MODULE_SCOPE void TreeDragImage_Display(TreeDragImage dragImage_); 1169 MODULE_SCOPE void TreeDragImage_Undisplay(TreeDragImage dragImage_); 1170 MODULE_SCOPE void TreeDragImage_DrawXOR(TreeDragImage dragImage_, Drawable drawable, int x, int y); 1171 MODULE_SCOPE void TreeDragImage_Draw(TreeDragImage dragImage, TreeDrawable td); 1172 MODULE_SCOPE int TreeDragImageCmd(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]); 1173 1174 /* tkTreeMarquee.c */ 1175 MODULE_SCOPE int TreeMarquee_InitWidget(TreeCtrl *tree); 1176 MODULE_SCOPE void TreeMarquee_FreeWidget(TreeCtrl *tree); 1177 MODULE_SCOPE int TreeMarquee_IsXOR(TreeMarquee marquee_); 1178 MODULE_SCOPE int TreeMarquee_IsVisible(TreeMarquee marquee_); 1179 MODULE_SCOPE void TreeMarquee_DrawXOR(TreeMarquee marquee_, Drawable drawable, int x, int y); 1180 MODULE_SCOPE void TreeMarquee_Display(TreeMarquee marquee_); 1181 MODULE_SCOPE void TreeMarquee_Undisplay(TreeMarquee marquee_); 1182 MODULE_SCOPE void TreeMarquee_Draw(TreeMarquee marquee_, TreeDrawable td); 1183 MODULE_SCOPE int TreeMarqueeCmd(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]); 1184 1185 /* tkTreeDisplay.c */ 1186 MODULE_SCOPE int Tree_CanvasWidth(TreeCtrl *tree); 1187 MODULE_SCOPE int Tree_CanvasHeight(TreeCtrl *tree); 1188 MODULE_SCOPE TreeItem Tree_ItemUnderPoint(TreeCtrl *tree, int *x, int *y, int *lock, int nearest); 1189 MODULE_SCOPE void Tree_FreeItemRInfo(TreeCtrl *tree, TreeItem item); 1190 MODULE_SCOPE int Tree_ItemBbox(TreeCtrl *tree, TreeItem item, int lock, TreeRectangle *tr); 1191 MODULE_SCOPE TreeItem Tree_ItemLARB(TreeCtrl *tree, TreeItem item, int vertical, int prev); 1192 MODULE_SCOPE TreeItem Tree_ItemAbove(TreeCtrl *tree, TreeItem item); 1193 MODULE_SCOPE TreeItem Tree_ItemBelow(TreeCtrl *tree, TreeItem item); 1194 MODULE_SCOPE TreeItem Tree_ItemLeft(TreeCtrl *tree, TreeItem item); 1195 MODULE_SCOPE TreeItem Tree_ItemRight(TreeCtrl *tree, TreeItem item); 1196 MODULE_SCOPE TreeItem Tree_ItemFL(TreeCtrl *tree, TreeItem item, int vertical, int first); 1197 MODULE_SCOPE TreeItem Tree_ItemTop(TreeCtrl *tree, TreeItem item); 1198 MODULE_SCOPE TreeItem Tree_ItemBottom(TreeCtrl *tree, TreeItem item); 1199 MODULE_SCOPE TreeItem Tree_ItemLeftMost(TreeCtrl *tree, TreeItem item); 1200 MODULE_SCOPE TreeItem Tree_ItemRightMost(TreeCtrl *tree, TreeItem item); 1201 MODULE_SCOPE int Tree_ItemToRNC(TreeCtrl *tree, TreeItem item, int *row, int *col); 1202 MODULE_SCOPE TreeItem Tree_RNCToItem(TreeCtrl *tree, int row, int col); 1203 MODULE_SCOPE int Tree_AreaBbox(TreeCtrl *tree, int area, TreeRectangle *tr); 1204 1205 enum { 1206 TREE_AREA_NONE = 0, 1207 TREE_AREA_HEADER, 1208 TREE_AREA_CONTENT, 1209 TREE_AREA_LEFT, 1210 TREE_AREA_RIGHT, 1211 TREE_AREA_HEADER_LEFT, 1212 TREE_AREA_HEADER_NONE, 1213 TREE_AREA_HEADER_RIGHT 1214 }; 1215 MODULE_SCOPE int Tree_HitTest(TreeCtrl *tree, int x, int y); 1216 1217 MODULE_SCOPE void TreeDisplay_InitWidget(TreeCtrl *tree); 1218 MODULE_SCOPE void TreeDisplay_FreeWidget(TreeCtrl *tree); 1219 MODULE_SCOPE void Tree_EventuallyRedraw(TreeCtrl *tree); 1220 MODULE_SCOPE void Tree_GetScrollFractionsX(TreeCtrl *tree, double fractions[2]); 1221 MODULE_SCOPE void Tree_GetScrollFractionsY(TreeCtrl *tree, double fractions[2]); 1222 MODULE_SCOPE int Tree_FakeCanvasWidth(TreeCtrl *tree); 1223 MODULE_SCOPE int Tree_FakeCanvasHeight(TreeCtrl *tree); 1224 MODULE_SCOPE void Tree_SetScrollSmoothingX(TreeCtrl *tree, int smooth); 1225 MODULE_SCOPE void Tree_SetScrollSmoothingY(TreeCtrl *tree, int smooth); 1226 MODULE_SCOPE int Increment_FindX(TreeCtrl *tree, int offset); 1227 MODULE_SCOPE int Increment_FindY(TreeCtrl *tree, int offset); 1228 MODULE_SCOPE int Increment_ToOffsetX(TreeCtrl *tree, int index); 1229 MODULE_SCOPE int Increment_ToOffsetY(TreeCtrl *tree, int index); 1230 MODULE_SCOPE int TreeXviewCmd(TreeCtrl *tree, int objc, Tcl_Obj *CONST objv[]); 1231 MODULE_SCOPE int TreeYviewCmd(TreeCtrl *tree, int objc, Tcl_Obj *CONST objv[]); 1232 MODULE_SCOPE void Tree_SetOriginX(TreeCtrl *tree, int xOrigin); 1233 MODULE_SCOPE void Tree_SetOriginY(TreeCtrl *tree, int yOrigin); 1234 MODULE_SCOPE int Tree_GetOriginX(TreeCtrl *tree); 1235 MODULE_SCOPE int Tree_GetOriginY(TreeCtrl *tree); 1236 MODULE_SCOPE void Tree_RelayoutWindow(TreeCtrl *tree); 1237 MODULE_SCOPE void Tree_FreeItemDInfo(TreeCtrl *tree, TreeItem item1, TreeItem item2); 1238 MODULE_SCOPE void Tree_InvalidateItemDInfo(TreeCtrl *tree, TreeColumn column, TreeItem item1, TreeItem item2); 1239 MODULE_SCOPE void TreeDisplay_ItemDeleted(TreeCtrl *tree, TreeItem item); 1240 MODULE_SCOPE void TreeDisplay_ColumnDeleted(TreeCtrl *tree, TreeColumn column); 1241 MODULE_SCOPE void TreeDisplay_FreeColumnDInfo(TreeCtrl *tree, TreeColumn column); 1242 MODULE_SCOPE int Tree_ShouldDisplayLockedColumns(TreeCtrl *tree); 1243 MODULE_SCOPE void TreeDisplay_GetReadyForTrouble(TreeCtrl *tree, int *requestsPtr); 1244 MODULE_SCOPE int TreeDisplay_WasThereTrouble(TreeCtrl *tree, int requests); 1245 MODULE_SCOPE void Tree_InvalidateArea(TreeCtrl *tree, int x1, int y1, int x2, int y2); 1246 MODULE_SCOPE void Tree_InvalidateItemArea(TreeCtrl *tree, int x1, int y1, int x2, int y2); 1247 MODULE_SCOPE void Tree_InvalidateItemOnScrollX(TreeCtrl *tree, TreeItem item); 1248 MODULE_SCOPE void Tree_InvalidateItemOnScrollY(TreeCtrl *tree, TreeItem item); 1249 MODULE_SCOPE void Tree_InvalidateRegion(TreeCtrl *tree, TkRegion region); 1250 MODULE_SCOPE void Tree_RedrawArea(TreeCtrl *tree, int x1, int y1, int x2, int y2); 1251 MODULE_SCOPE void Tree_ExposeArea(TreeCtrl *tree, int x1, int y1, int x2, int y2); 1252 MODULE_SCOPE void Tree_FocusChanged(TreeCtrl *tree, int gotFocus); 1253 MODULE_SCOPE void Tree_Activate(TreeCtrl *tree, int isActive); 1254 MODULE_SCOPE void Tree_ItemsInArea(TreeCtrl *tree, TreeItemList *items, int minX, int minY, int maxX, int maxY); 1255 MODULE_SCOPE void TreeColumnProxy_Undisplay(TreeCtrl *tree); 1256 MODULE_SCOPE void TreeColumnProxy_Display(TreeCtrl *tree); 1257 MODULE_SCOPE void TreeRowProxy_Undisplay(TreeCtrl *tree); 1258 MODULE_SCOPE void TreeRowProxy_Display(TreeCtrl *tree); 1259 MODULE_SCOPE int Tree_DrawTiledImage(TreeCtrl *tree, TreeDrawable td, 1260 Tk_Image image, TreeRectangle tr, int xOffset, int yOffset, 1261 int tileX, int tileY); 1262 MODULE_SCOPE int Tree_IsBgImageOpaque(TreeCtrl *tree); 1263 MODULE_SCOPE int Tree_DrawBgImage(TreeCtrl *tree, TreeDrawable td, 1264 TreeRectangle tr, int xOrigin, int yOrigin); 1265 1266 MODULE_SCOPE int TreeRect_Intersect(TreeRectangle *resultPtr, 1267 CONST TreeRectangle *r1, CONST TreeRectangle *r2); 1268 1269 #define DINFO_OUT_OF_DATE 0x0001 1270 #define DINFO_CHECK_COLUMN_WIDTH 0x0002 1271 #define DINFO_DRAW_HEADER 0x0004 1272 #define DINFO_SET_ORIGIN_X 0x0008 1273 #define DINFO_UPDATE_SCROLLBAR_X 0x0010 1274 #define DINFO_REDRAW_PENDING 0x00020 1275 #define DINFO_INVALIDATE 0x0040 1276 #define DINFO_DRAW_HIGHLIGHT 0x0080 1277 #define DINFO_DRAW_BORDER 0x0100 1278 #define DINFO_REDO_RANGES 0x0200 1279 #define DINFO_SET_ORIGIN_Y 0x0400 1280 #define DINFO_UPDATE_SCROLLBAR_Y 0x0800 1281 #define DINFO_REDO_INCREMENTS 0x1000 1282 #define DINFO_REDO_COLUMN_WIDTH 0x2000 1283 #define DINFO_REDO_SELECTION 0x4000 1284 #define DINFO_DRAW_WHITESPACE 0x8000 1285 MODULE_SCOPE void Tree_DInfoChanged(TreeCtrl *tree, int flags); 1286 1287 MODULE_SCOPE void Tree_TheWorldHasChanged(Tcl_Interp *interp); 1288 MODULE_SCOPE int Tree_DumpDInfo(TreeCtrl *tree, int objc, Tcl_Obj *CONST objv[]); 1289 1290 /* tkTreeTheme.c */ 1291 MODULE_SCOPE int TreeTheme_InitInterp(Tcl_Interp *interp); 1292 MODULE_SCOPE void TreeTheme_ThemeChanged(TreeCtrl *tree); 1293 MODULE_SCOPE int TreeTheme_InitWidget(TreeCtrl *tree); 1294 MODULE_SCOPE int TreeTheme_FreeWidget(TreeCtrl *tree); 1295 MODULE_SCOPE int TreeTheme_DrawHeaderItem(TreeCtrl *tree, TreeDrawable td, 1296 int state, int arrow, int visIndex, int x, int y, int width, int height); 1297 MODULE_SCOPE int TreeTheme_GetHeaderFixedHeight(TreeCtrl *tree, int *heightPtr); 1298 MODULE_SCOPE int TreeTheme_GetHeaderContentMargins(TreeCtrl *tree, int state, int arrow, int bounds[4]); 1299 MODULE_SCOPE int TreeTheme_DrawHeaderArrow(TreeCtrl *tree, TreeDrawable td, int state, int up, int x, int y, int width, int height); 1300 MODULE_SCOPE int TreeTheme_DrawButton(TreeCtrl *tree, TreeDrawable td, TreeItem item, int state, int x, int y, int width, int height); 1301 MODULE_SCOPE int TreeTheme_GetButtonSize(TreeCtrl *tree, Drawable drawable, int open, int *widthPtr, int *heightPtr); 1302 MODULE_SCOPE int TreeTheme_GetArrowSize(TreeCtrl *tree, Drawable drawable, int up, int *widthPtr, int *heightPtr); 1303 MODULE_SCOPE int TreeTheme_SetBorders(TreeCtrl *tree); 1304 MODULE_SCOPE int TreeTheme_DrawBorders(TreeCtrl *tree, Drawable drawable); 1305 MODULE_SCOPE int TreeTheme_GetHeaderTextColor(TreeCtrl *tree, int state, XColor **xColorPtr); 1306 MODULE_SCOPE int TreeTheme_AnimateButtonStart(TreeCtrl *tree, TreeItem item); 1307 MODULE_SCOPE int TreeTheme_ItemDeleted(TreeCtrl *tree, TreeItem item); 1308 MODULE_SCOPE void TreeTheme_Relayout(TreeCtrl *tree); 1309 MODULE_SCOPE int TreeTheme_IsDesktopComposited(TreeCtrl *tree); 1310 MODULE_SCOPE int TreeThemeCmd(TreeCtrl *tree, int objc, Tcl_Obj *CONST objv[]); 1311 MODULE_SCOPE void TreeTheme_SetOptionDefault(Tk_OptionSpec *specPtr); 1312 1313 /* tkTreeUtils.c */ 1314 #ifdef TREECTRL_DEBUG 1315 #define WIPE(p,s) memset((char *) p, 0xAA, s) 1316 #else 1317 #define WIPE(p,s) 1318 #endif 1319 #define CWIPE(p,t,c) WIPE(p, sizeof(t) * (c)) 1320 #define WIPEFREE(p,s) { WIPE(p, s); ckfree((char *) p); } 1321 #define WFREE(p,t) WIPEFREE(p, sizeof(t)) 1322 #define WCFREE(p,t,c) WIPEFREE(p, sizeof(t) * (c)) 1323 1324 MODULE_SCOPE int Tree_Ellipsis(Tk_Font tkfont, char *string, int numBytes, int *maxPixels, char *ellipsis, int force); 1325 MODULE_SCOPE void Tree_HDotLine(TreeCtrl *tree, Drawable drawable, int x1, int y1, int x2); 1326 MODULE_SCOPE void Tree_VDotLine(TreeCtrl *tree, Drawable drawable, int x1, int y1, int y2); 1327 MODULE_SCOPE void Tree_DrawActiveOutline(TreeCtrl *tree, Drawable drawable, int x, int y, int width, int height, int open); 1328 typedef struct DotState 1329 { 1330 void *stuff[10]; 1331 } DotState; 1332 MODULE_SCOPE void TreeDotRect_Setup(TreeCtrl *tree, Drawable drawable, DotState *dotState); 1333 MODULE_SCOPE void TreeDotRect_Draw(DotState *dotState, int x, int y, int width, int height); 1334 MODULE_SCOPE void TreeDotRect_Restore(DotState *dotState); 1335 typedef struct TextLayout_ *TextLayout; 1336 MODULE_SCOPE TextLayout TextLayout_Compute(Tk_Font tkfont, CONST char *string, 1337 int numChars, int wrapLength, Tk_Justify justify, int maxLines, 1338 int lMargin1, int lMargin2, int flags); 1339 MODULE_SCOPE void TextLayout_Free(TextLayout textLayout); 1340 MODULE_SCOPE void TextLayout_Size(TextLayout textLayout, int *widthPtr, int *heightPtr); 1341 MODULE_SCOPE int TextLayout_TotalWidth(TextLayout textLayout); 1342 MODULE_SCOPE void TextLayout_Draw(Display *display, Drawable drawable, GC gc, 1343 TextLayout layout, int x, int y, int firstChar, int lastChar, 1344 int underline); 1345 MODULE_SCOPE void Tree_RedrawImage(Tk_Image image, int imageX, int imageY, 1346 int width, int height, TreeDrawable td, int drawableX, int drawableY); 1347 MODULE_SCOPE void Tree_DrawBitmapWithGC(TreeCtrl *tree, Pixmap bitmap, Drawable drawable, 1348 GC gc, int src_x, int src_y, int width, int height, int dest_x, int dest_y); 1349 MODULE_SCOPE void Tree_DrawBitmap(TreeCtrl *tree, Pixmap bitmap, Drawable drawable, 1350 XColor *fg, XColor *bg, 1351 int src_x, int src_y, int width, int height, int dest_x, int dest_y); 1352 MODULE_SCOPE TkRegion Tree_GetRegion(TreeCtrl *tree); 1353 MODULE_SCOPE void Tree_FreeRegion(TreeCtrl *tree, TkRegion region); 1354 MODULE_SCOPE void Tree_FillRegion(Display *display, Drawable drawable, GC gc, TkRegion rgn); 1355 MODULE_SCOPE void Tree_OffsetRegion(TkRegion region, int xOffset, int yOffset); 1356 MODULE_SCOPE void Tree_SetEmptyRegion(TkRegion region); 1357 MODULE_SCOPE TkRegion Tree_GetRectRegion(TreeCtrl *tree, const TreeRectangle *rect); 1358 MODULE_SCOPE void Tree_SetRectRegion(TkRegion region, const TreeRectangle *rect); 1359 MODULE_SCOPE void Tree_GetRegionBounds(TkRegion region, TreeRectangle *rect); 1360 MODULE_SCOPE void Tree_UnionRegion(TkRegion rgnA, TkRegion rgnB, TkRegion rgnOut); 1361 MODULE_SCOPE int Tree_ScrollWindow(TreeCtrl *tree, GC gc, int x, int y, 1362 int width, int height, int dx, int dy, TkRegion damageRgn); 1363 MODULE_SCOPE void Tree_UnsetClipMask(TreeCtrl *tree, Drawable drawable, GC gc); 1364 MODULE_SCOPE void Tree_XImage2Photo(Tcl_Interp *interp, Tk_PhotoHandle photoH, 1365 XImage *ximage, unsigned long trans, int alpha); 1366 1367 #define PAD_TOP_LEFT 0 1368 #define PAD_BOTTOM_RIGHT 1 1369 MODULE_SCOPE Tk_ObjCustomOption TreeCtrlCO_pad; 1370 1371 MODULE_SCOPE int TreeCtrl_GetPadAmountFromObj(Tcl_Interp *interp, 1372 Tk_Window tkwin, Tcl_Obj *padObj, 1373 int *topLeftPtr, int *bottomRightPtr); 1374 MODULE_SCOPE Tcl_Obj *TreeCtrl_NewPadAmountObj(int *padAmounts); 1375 1376 /*****/ 1377 1378 #define ObjectIsEmpty TreeCtrl_ObjectIsEmpty 1379 MODULE_SCOPE int ObjectIsEmpty(Tcl_Obj *obj); 1380 1381 #define pstBitmap TreeCtrl_pstBitmap 1382 #define pstBoolean TreeCtrl_pstBoolean 1383 #define pstBorder TreeCtrl_pstBorder 1384 #define pstColor TreeCtrl_pstColor 1385 #define pstFlags TreeCtrl_pstFlags 1386 #define pstFont TreeCtrl_pstFont 1387 #define pstImage TreeCtrl_pstImage 1388 #define pstRelief TreeCtrl_pstRelief 1389 MODULE_SCOPE PerStateType pstBitmap; 1390 MODULE_SCOPE PerStateType pstBoolean; 1391 MODULE_SCOPE PerStateType pstBorder; 1392 MODULE_SCOPE PerStateType pstColor; 1393 MODULE_SCOPE PerStateType pstFlags; 1394 MODULE_SCOPE PerStateType pstFont; 1395 MODULE_SCOPE PerStateType pstImage; 1396 MODULE_SCOPE PerStateType pstRelief; 1397 1398 #define MATCH_NONE 0 1399 #define MATCH_ANY 1 1400 #define MATCH_PARTIAL 2 1401 #define MATCH_EXACT 3 1402 1403 MODULE_SCOPE void PerStateInfo_Free(TreeCtrl *tree, PerStateType *typePtr, 1404 PerStateInfo *pInfo); 1405 typedef int (*StateFromObjProc)(TreeCtrl *tree, int domain, Tcl_Obj *obj, int *stateOff, int *stateOn); 1406 MODULE_SCOPE int PerStateInfo_FromObj(TreeCtrl *tree, int domain, StateFromObjProc proc, 1407 PerStateType *typePtr, PerStateInfo *pInfo); 1408 MODULE_SCOPE PerStateData *PerStateInfo_ForState(TreeCtrl *tree, 1409 PerStateType *typePtr, PerStateInfo *pInfo, int state, int *match); 1410 MODULE_SCOPE Tcl_Obj *PerStateInfo_ObjForState(TreeCtrl *tree, PerStateType *typePtr, 1411 PerStateInfo *pInfo, int state, int *match); 1412 MODULE_SCOPE int PerStateInfo_Undefine(TreeCtrl *tree, PerStateType *typePtr, 1413 PerStateInfo *pInfo, int domain, int state); 1414 1415 MODULE_SCOPE GC Tree_GetGC(TreeCtrl *tree, unsigned long mask, XGCValues *gcValues); 1416 MODULE_SCOPE void Tree_FreeAllGC(TreeCtrl *tree); 1417 1418 MODULE_SCOPE Pixmap PerStateBitmap_ForState(TreeCtrl *tree, PerStateInfo *pInfo, 1419 int state, int *match); 1420 MODULE_SCOPE void PerStateBitmap_MaxSize(TreeCtrl *tree, PerStateInfo *pInfo, 1421 int *widthPtr, int *heightPtr); 1422 MODULE_SCOPE int PerStateBoolean_ForState(TreeCtrl *tree, PerStateInfo *pInfo, 1423 int state, int *match); 1424 MODULE_SCOPE Tk_3DBorder PerStateBorder_ForState(TreeCtrl *tree, PerStateInfo *pInfo, 1425 int state, int *match); 1426 MODULE_SCOPE TreeColor *PerStateColor_ForState(TreeCtrl *tree, PerStateInfo *pInfo, 1427 int state, int *match); 1428 MODULE_SCOPE int PerStateFlags_ForState(TreeCtrl *tree, PerStateInfo *pInfo, 1429 int state, int *match); 1430 MODULE_SCOPE Tk_Font PerStateFont_ForState(TreeCtrl *tree, PerStateInfo *pInfo, 1431 int state, int *match); 1432 MODULE_SCOPE Tk_Image PerStateImage_ForState(TreeCtrl *tree, PerStateInfo *pInfo, 1433 int state, int *match); 1434 MODULE_SCOPE void PerStateImage_MaxSize(TreeCtrl *tree, PerStateInfo *pInfo, 1435 int *widthPtr, int *heightPtr); 1436 MODULE_SCOPE int PerStateRelief_ForState(TreeCtrl *tree, PerStateInfo *pInfo, 1437 int state, int *match); 1438 1439 MODULE_SCOPE void PSTSave(PerStateInfo *pInfo, PerStateInfo *pSave); 1440 MODULE_SCOPE void PSTRestore(TreeCtrl *tree, PerStateType *typePtr, 1441 PerStateInfo *pInfo, PerStateInfo *pSave); 1442 1443 typedef struct CharFlag { 1444 char flagChar; 1445 int flagBit; 1446 } CharFlag; 1447 1448 MODULE_SCOPE int Tree_GetFlagsFromString(TreeCtrl *tree, const char *string, 1449 int length, const char *typeStr, const CharFlag flags[], int *flagsPtr); 1450 MODULE_SCOPE int Tree_GetFlagsFromObj(TreeCtrl *tree, Tcl_Obj *obj, 1451 const char *typeStr, const CharFlag flags[], int *flagsPtr); 1452 1453 #ifdef ALLOC_HAX 1454 MODULE_SCOPE ClientData TreeAlloc_Init(void); 1455 MODULE_SCOPE void TreeAlloc_Finalize(ClientData data); 1456 MODULE_SCOPE char *TreeAlloc_Alloc(ClientData data, Tk_Uid id, int size); 1457 MODULE_SCOPE char *TreeAlloc_CAlloc(ClientData data, Tk_Uid id, int size, int count, int roundUp); 1458 MODULE_SCOPE char *TreeAlloc_Realloc(ClientData data, Tk_Uid id, char *ptr, int size1, int size2); 1459 MODULE_SCOPE void TreeAlloc_Free(ClientData data, Tk_Uid id, char *ptr, int size); 1460 MODULE_SCOPE void TreeAlloc_CFree(ClientData data, Tk_Uid id, char *ptr, int size, int count, int roundUp); 1461 MODULE_SCOPE void TreeAlloc_Stats(Tcl_Interp *interp, ClientData data); 1462 #endif 1463 1464 /*****/ 1465 1466 MODULE_SCOPE void TreePtrList_Init(TreeCtrl *tree, TreePtrList *tilPtr, int count); 1467 MODULE_SCOPE void TreePtrList_Grow(TreePtrList *tilPtr, int count); 1468 MODULE_SCOPE ClientData *TreePtrList_Append(TreePtrList *tilPtr, ClientData ptr); 1469 MODULE_SCOPE ClientData *TreePtrList_Concat(TreePtrList *tilPtr, TreePtrList *til2Ptr); 1470 MODULE_SCOPE void TreePtrList_Free(TreePtrList *tilPtr); 1471 1472 #define TreeItemList_Init TreePtrList_Init 1473 #define TreeItemList_Append TreePtrList_Append 1474 #define TreeItemList_Concat TreePtrList_Concat 1475 #define TreeItemList_Free TreePtrList_Free 1476 #define TreeItemList_Items(L) ((TreeItem *) (L)->pointers) 1477 #define TreeItemList_Nth(L,n) ((TreeItem) (L)->pointers[n]) 1478 #define TreeItemList_Count(L) ((L)->count) 1479 MODULE_SCOPE void TreeItemList_Sort(TreeItemList *items); 1480 1481 #define TreeColumnList_Init TreePtrList_Init 1482 #define TreeColumnList_Append TreePtrList_Append 1483 #define TreeColumnList_Concat TreePtrList_Concat 1484 #define TreeColumnList_Free TreePtrList_Free 1485 #define TreeColumnList_Nth(L,n) ((TreeColumn) (L)->pointers[n]) 1486 #define TreeColumnList_Count(L) ((L)->count) 1487 1488 /*****/ 1489 1490 /* 1491 * This structure holds a list of tags. 1492 */ 1493 struct TagInfo { 1494 int numTags; /* Number of tag slots actually used 1495 * at tagPtr. */ 1496 int tagSpace; /* Total amount of tag space available 1497 * at tagPtr. */ 1498 #define TREE_TAG_SPACE 3 1499 Tk_Uid tagPtr[TREE_TAG_SPACE]; /* Array of tags. The actual size will 1500 * be tagSpace. THIS FIELD MUST BE THE 1501 * LAST IN THE STRUCTURE. */ 1502 }; 1503 1504 MODULE_SCOPE TagInfo *TagInfo_Add(TreeCtrl *tree, TagInfo *tagInfo, Tk_Uid tags[], int numTags); 1505 MODULE_SCOPE TagInfo *TagInfo_Remove(TreeCtrl *tree, TagInfo *tagInfo, Tk_Uid tags[], int numTags); 1506 MODULE_SCOPE Tk_Uid *TagInfo_Names(TreeCtrl *tree, TagInfo *tagInfo, Tk_Uid *tags, int *numTagsPtr, int *tagSpacePtr); 1507 MODULE_SCOPE TagInfo *TagInfo_Copy(TreeCtrl *tree, TagInfo *tagInfo); 1508 MODULE_SCOPE void TagInfo_Free(TreeCtrl *tree, TagInfo *tagInfo); 1509 MODULE_SCOPE int TagInfo_FromObj(TreeCtrl *tree, Tcl_Obj *objPtr, TagInfo **tagInfoPtr); 1510 MODULE_SCOPE Tk_ObjCustomOption TreeCtrlCO_tagInfo; 1511 1512 /* 1513 * This struct holds information about a tag expression. 1514 */ 1515 typedef struct TagExpr { 1516 TreeCtrl *tree; 1517 1518 Tk_Uid *uids; /* expresion compiled to an array of uids */ 1519 Tk_Uid staticUids[15]; 1520 int allocated; /* available space for array of uids */ 1521 int length; /* number of uids */ 1522 int index; /* current position in expression evaluation */ 1523 1524 int simple; /* TRUE if expr is single tag */ 1525 Tk_Uid uid; /* single tag if 'simple' is TRUE */ 1526 1527 char *string; /* tag expression string */ 1528 int stringIndex; /* current position in string scan */ 1529 int stringLength; /* length of tag expression string */ 1530 1531 char *rewritebuffer; /* tag string (after removing escapes) */ 1532 char staticRWB[100]; 1533 } TagExpr; 1534 1535 MODULE_SCOPE int TagExpr_Init(TreeCtrl *tree, Tcl_Obj *exprObj, TagExpr *expr); 1536 MODULE_SCOPE int TagExpr_Scan(TagExpr *expr); 1537 MODULE_SCOPE int TagExpr_Eval(TagExpr *expr, TagInfo *tags); 1538 MODULE_SCOPE void TagExpr_Free(TagExpr *expr); 1539 1540 MODULE_SCOPE Tk_OptionSpec *Tree_FindOptionSpec(Tk_OptionSpec *optionTable, CONST char *optionName); 1541 1542 MODULE_SCOPE Tk_ObjCustomOption *PerStateCO_Alloc(CONST char *optionName, 1543 PerStateType *typePtr, StateFromObjProc proc); 1544 MODULE_SCOPE int PerStateCO_Init(Tk_OptionSpec *optionTable, CONST char *optionName, 1545 PerStateType *typePtr, StateFromObjProc proc); 1546 1547 /*****/ 1548 1549 typedef struct DynamicOptionSpec DynamicOptionSpec; 1550 typedef struct DynamicOption DynamicOption; 1551 1552 struct DynamicOption 1553 { 1554 int id; /* Unique id. */ 1555 DynamicOption *next; /* Linked list. */ 1556 char data[1]; /* Actual size will be > 1 */ 1557 }; 1558 1559 typedef void (DynamicOptionInitProc)(void *data); 1560 1561 MODULE_SCOPE DynamicOption *DynamicOption_AllocIfNeeded(TreeCtrl *tree, 1562 DynamicOption **firstPtr, int id, int size, DynamicOptionInitProc *init); 1563 MODULE_SCOPE void *DynamicOption_FindData(DynamicOption *first, int id); 1564 MODULE_SCOPE void DynamicOption_Free(TreeCtrl *tree, DynamicOption *first, 1565 Tk_OptionSpec *optionTable); 1566 MODULE_SCOPE void DynamicOption_Free1(TreeCtrl *tree, DynamicOption **firstPtr, 1567 int id, int size); 1568 MODULE_SCOPE int DynamicCO_Init(Tk_OptionSpec *optionTable, CONST char *optionName, 1569 int id, int size, int objOffset, int internalOffset, 1570 Tk_ObjCustomOption *custom, DynamicOptionInitProc *init); 1571 1572 /*****/ 1573 1574 MODULE_SCOPE int Tree_InitOptions(TreeCtrl *tree, int domain, void *recordPtr, 1575 Tk_OptionTable optionTable); 1576 MODULE_SCOPE int Tree_SetOptions(TreeCtrl *tree, int domain, void *recordPtr, 1577 Tk_OptionTable optionTable, int objc, Tcl_Obj *CONST objv[], 1578 Tk_SavedOptions *savePtr, int *maskPtr); 1579 1580 MODULE_SCOPE int BooleanFlagCO_Init(Tk_OptionSpec *optionTable, CONST char *optionName, 1581 int theFlag); 1582 MODULE_SCOPE int ItemButtonCO_Init(Tk_OptionSpec *optionTable, CONST char *optionName, 1583 int flag1, int flag2); 1584 MODULE_SCOPE void TreeStyleCO_Init(Tk_OptionSpec *optionTable, CONST char *optionName, 1585 int domain); 1586 1587 MODULE_SCOPE int Tree_GetIntForIndex(TreeCtrl *tree, Tcl_Obj *objPtr, int *indexPtr, 1588 int *endRelativePtr); 1589 1590 MODULE_SCOPE Tk_ObjCustomOption TreeCtrlCO_pixels; 1591 MODULE_SCOPE Tk_ObjCustomOption TreeCtrlCO_string; 1592 MODULE_SCOPE Tk_ObjCustomOption TreeCtrlCO_style; 1593 MODULE_SCOPE Tk_ObjCustomOption TreeCtrlCO_treecolor; 1594 1595 /*****/ 1596 1597 #define STATIC_SIZE 20 1598 #define STATIC_ALLOC(P,T,C) \ 1599 do { \ 1600 if (C > STATIC_SIZE) \ 1601 P = (T *) ckalloc(sizeof(T) * (C)); \ 1602 } while (0) 1603 #define STATIC_FREE(P,T,C) \ 1604 do { \ 1605 CWIPE(P, T, C); \ 1606 if (C > STATIC_SIZE) \ 1607 ckfree((char *) P); \ 1608 } while (0) 1609 #define STATIC_FREE2(P,P2) \ 1610 do { \ 1611 if (P != P2) \ 1612 ckfree((char *) P); \ 1613 } while (0) 1614 1615 MODULE_SCOPE TreeColor *Tree_AllocColorFromObj(TreeCtrl *tree, Tcl_Obj *obj); 1616 MODULE_SCOPE void Tree_FreeColor(TreeCtrl *tree, TreeColor *tc); 1617 MODULE_SCOPE Tcl_Obj *TreeColor_ToObj(TreeCtrl *tree, TreeColor *tc); 1618 MODULE_SCOPE int TreeColor_IsOpaque(TreeCtrl *tree, TreeColor *tc); 1619 1620 #define pstGradient TreeCtrl_pstGradient 1621 MODULE_SCOPE PerStateType pstGradient; 1622 MODULE_SCOPE TreeGradient PerStateGradient_ForState(TreeCtrl *tree, PerStateInfo *pInfo, 1623 int state, int *match); 1624 1625 /*****/ 1626 1627 typedef struct GradientCoord GradientCoord; 1628 1629 /* 1630 * Records for gradient fills. 1631 * We need a separate GradientStopArray to simplify option parsing. 1632 */ 1633 1634 typedef struct GradientStop { 1635 double offset; 1636 XColor *color; 1637 double opacity; 1638 } GradientStop; 1639 1640 typedef struct GradientStopArray { 1641 int nstops; 1642 GradientStop **stops; /* Array of pointers to GradientStop. */ 1643 } GradientStopArray; 1644 1645 typedef struct TreeGradient_ 1646 { 1647 int refCount; /* Number of users of gradient. */ 1648 int deletePending; /* Non-zero if gradient should be deleted when 1649 * last reference goes away. */ 1650 Tk_Uid name; 1651 Tcl_Obj *stopsObj; /* -stops */ 1652 GradientStopArray *stopArrPtr; /* -stops */ 1653 int vertical; /* -orient */ 1654 1655 int steps; /* -steps */ 1656 int nStepColors; /* length of stepColors */ 1657 XColor **stepColors; /* calculated from color1,color2,steps */ 1658 1659 GradientCoord *left, *right, *top, *bottom; 1660 Tcl_Obj *leftObj, *rightObj, *topObj, *bottomObj; 1661 } TreeGradient_; 1662 1663 MODULE_SCOPE void TreeGradient_InitWidget(TreeCtrl *tree); 1664 MODULE_SCOPE void TreeGradient_FreeWidget(TreeCtrl *tree); 1665 MODULE_SCOPE int TreeGradientCmd(ClientData clientData, Tcl_Interp *interp, 1666 int objc, Tcl_Obj *CONST objv[]); 1667 MODULE_SCOPE int TreeGradient_FromObj(TreeCtrl *tree, Tcl_Obj *objPtr, 1668 TreeGradient *gradientPtr); 1669 MODULE_SCOPE void TreeGradient_Release(TreeCtrl *tree, TreeGradient gradient); 1670 MODULE_SCOPE int TreeGradient_IsOpaque(TreeCtrl *tree, TreeGradient gradient); 1671 MODULE_SCOPE int Tree_HasNativeGradients(TreeCtrl *tree); 1672 1673 MODULE_SCOPE int TreeGradient_GetBrushBounds(TreeCtrl *tree, 1674 TreeGradient gradient, const TreeRectangle *trPaint, 1675 TreeRectangle *trBrush, TreeColumn column, TreeItem item); 1676 MODULE_SCOPE void TreeGradient_IsRelativeToCanvas(TreeGradient gradient, 1677 int *relX, int *relY); 1678 MODULE_SCOPE void TreeColor_GetBrushBounds(TreeCtrl *tree, TreeColor *tc, 1679 TreeRectangle trPaint, int xOrigin, int yOrigin, TreeColumn column, 1680 TreeItem item, TreeRectangle *trBrush); 1681 1682 MODULE_SCOPE void TreeGradient_ColumnDeleted(TreeCtrl *tree, 1683 TreeColumn column); 1684 MODULE_SCOPE void TreeGradient_ItemDeleted(TreeCtrl *tree, TreeItem item); 1685 1686 /*****/ 1687 1688 typedef enum { 1689 TREE_CLIP_REGION, 1690 TREE_CLIP_RECT, 1691 TREE_CLIP_AREA 1692 } TreeClipType; 1693 1694 typedef struct { 1695 TreeClipType type; 1696 TkRegion region; 1697 TreeRectangle tr; 1698 int area; 1699 } TreeClip; 1700 1701 #define RECT_OPEN_W 0x01 1702 #define RECT_OPEN_N 0x02 1703 #define RECT_OPEN_E 0x04 1704 #define RECT_OPEN_S 0x08 1705 #define RECT_OPEN_WNES (RECT_OPEN_W|RECT_OPEN_N|RECT_OPEN_E|RECT_OPEN_S) 1706 1707 MODULE_SCOPE void Tree_FillRectangle(TreeCtrl *tree, TreeDrawable td, 1708 TreeClip *clip, GC gc, TreeRectangle tr); 1709 1710 1711 #if USE_ITEM_PIXMAP == 0 1712 MODULE_SCOPE void Tree_DrawArc(TreeCtrl *tree, TreeDrawable td, TreeClip *clip, 1713 GC gc, int x, int y, unsigned int width, unsigned int height, 1714 int start, int extent); 1715 MODULE_SCOPE void Tree_FillArc(TreeCtrl *tree, TreeDrawable td, TreeClip *clip, 1716 GC gc, int x, int y, unsigned int width, unsigned int height, 1717 int start, int extent); 1718 1719 MODULE_SCOPE void Tree_Draw3DRectangle(TreeCtrl *tree, TreeDrawable td, 1720 TreeClip *clip, Tk_3DBorder border, int x, int y, int width, int height, 1721 int borderWidth, int relief); 1722 MODULE_SCOPE void Tree_Fill3DRectangle(TreeCtrl *tree, TreeDrawable td, 1723 TreeClip *clip, Tk_3DBorder border, int x, int y, int width, int height, 1724 int borderWidth, int relief); 1725 #else /* USE_ITEM_PIXMAP == 1 */ 1726 #define Tree_DrawArc(tree,td,clip,gc,x,y,width,height,start,extent) \ 1727 XDrawArc(tree->display,td.drawable,gc,x,y,width,height,start,extent); 1728 #define Tree_FillArc(tree,td,clip,gc,x,y,width,height,start,extent) \ 1729 XFillArc(tree->display,td.drawable,gc,x,y,width,height,start,extent); 1730 #endif /* USE_ITEM_PIXMAP == 1 */ 1731 1732 MODULE_SCOPE void Tree_DrawRoundRectX11(TreeCtrl *tree, TreeDrawable td, 1733 TreeClip *clip, GC gc, TreeRectangle tr, int outlineWidth, 1734 int rx, int ry, int open); 1735 MODULE_SCOPE void Tree_FillRoundRectX11(TreeCtrl *tree, TreeDrawable td, 1736 TreeClip *clip, GC gc, TreeRectangle tr, int rx, int ry, int open); 1737 MODULE_SCOPE void TreeGradient_DrawRectX11(TreeCtrl *tree, TreeDrawable td, 1738 TreeClip *clip, TreeGradient gradient, TreeRectangle trBrush, TreeRectangle tr, 1739 int outlineWidth, int open); 1740 MODULE_SCOPE void TreeGradient_FillRectX11(TreeCtrl *tree, TreeDrawable td, 1741 TreeClip *clip, TreeGradient gradient, TreeRectangle trBrush, 1742 TreeRectangle tr); 1743 MODULE_SCOPE void TreeGradient_FillRoundRectX11(TreeCtrl *tree, TreeDrawable td, 1744 TreeClip *clip, TreeGradient gradient, TreeRectangle trBrush, 1745 TreeRectangle tr, int rx, int ry, int open); 1746 1747 MODULE_SCOPE void Tree_DrawRoundRect(TreeCtrl *tree, TreeDrawable td, 1748 TreeClip *clip, XColor *xcolor, TreeRectangle tr, int outlineWidth, 1749 int rx, int ry, int open); 1750 MODULE_SCOPE void Tree_FillRoundRect(TreeCtrl *tree, TreeDrawable td, 1751 TreeClip *clip, XColor *xcolor, TreeRectangle tr, int rx, int ry, int open); 1752 1753 MODULE_SCOPE void TreeGradient_DrawRect(TreeCtrl *tree, TreeDrawable td, 1754 TreeClip *clip, TreeGradient gradient, TreeRectangle trBrush, 1755 TreeRectangle tr, int outlineWidth, int open); 1756 MODULE_SCOPE void TreeGradient_DrawRoundRect(TreeCtrl *tree, TreeDrawable td, 1757 TreeClip *clip, TreeGradient gradient, TreeRectangle trBrush, 1758 TreeRectangle tr, int outlineWidth, int rx, int ry, int open); 1759 MODULE_SCOPE void TreeGradient_FillRect(TreeCtrl *tree, TreeDrawable td, 1760 TreeClip *clip, TreeGradient gradient, TreeRectangle trBrush, 1761 TreeRectangle tr); 1762 MODULE_SCOPE void TreeGradient_FillRoundRect(TreeCtrl *tree, TreeDrawable td, 1763 TreeClip *clip, TreeGradient gradient, TreeRectangle trBrush, 1764 TreeRectangle tr, int rx, int ry, int open); 1765 1766 MODULE_SCOPE void TreeColor_DrawRect(TreeCtrl *tree, TreeDrawable td, 1767 TreeClip *clip, TreeColor *tc, TreeRectangle trBrush, TreeRectangle tr, 1768 int outlineWidth, int open); 1769 MODULE_SCOPE void TreeColor_FillRect(TreeCtrl *tree, TreeDrawable td, 1770 TreeClip *clip, TreeColor *tc, TreeRectangle trBrush, TreeRectangle tr); 1771 MODULE_SCOPE void TreeColor_DrawRoundRect(TreeCtrl *tree, TreeDrawable td, 1772 TreeClip *clip, TreeColor *tc, TreeRectangle trBrush, TreeRectangle tr, 1773 int outlineWidth, int rx, int ry, int open); 1774 MODULE_SCOPE void TreeColor_FillRoundRect(TreeCtrl *tree, TreeDrawable td, 1775 TreeClip *clip, TreeColor *tc, TreeRectangle trBrush, TreeRectangle tr, 1776 int rx, int ry, int open); 1777 1778 MODULE_SCOPE int TreeDraw_InitInterp(Tcl_Interp *interp); 1779