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