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