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