1 
2 /*
3  * bltTreeView.h --
4  *
5  *	This module implements an hierarchy widget for the BLT toolkit.
6  *
7  * Copyright 1998-1999 Lucent Technologies, Inc.
8  *
9  * Permission to use, copy, modify, and distribute this software and
10  * its documentation for any purpose and without fee is hereby
11  * granted, provided that the above copyright notice appear in all
12  * copies and that both that the copyright notice and warranty
13  * disclaimer appear in supporting documentation, and that the names
14  * of Lucent Technologies or any of their entities not be used in
15  * advertising or publicity pertaining to distribution of the software
16  * without specific, written prior permission.
17  *
18  * Lucent Technologies disclaims all warranties with regard to this
19  * software, including all implied warranties of merchantability and
20  * fitness.  In no event shall Lucent Technologies be liable for any
21  * special, indirect or consequential damages or any damages
22  * whatsoever resulting from loss of use, data or profits, whether in
23  * an action of contract, negligence or other tortuous action, arising
24  * out of or in connection with the use or performance of this
25  * software.
26  *
27  *	The "treeview" widget was created by George A. Howlett.
28  *      Extensive cleanups and enhancements by Peter MacDonald.
29  */
30 
31 /*
32  * TODO:
33  *
34  * BUGS:
35  *   1.  "open" operation should change scroll offset so that as many
36  *	 new entries (up to half a screen) can be seen.
37  *   2.  "open" needs to adjust the scrolloffset so that the same entry
38  *	 is seen at the same place.
39  */
40 
41 #ifndef BLT_TREEVIEW_H
42 #define BLT_TREEVIEW_H
43 
44 #include "bltImage.h"
45 #include "bltHash.h"
46 #include "bltChain.h"
47 #include "bltTree.h"
48 #include "bltTile.h"
49 #include "bltBind.h"
50 #include "bltObjConfig.h"
51 
52 #define ITEM_ENTRY		(ClientData)0
53 #define ITEM_ENTRY_BUTTON	(ClientData)1
54 #define ITEM_COLUMN_TITLE	(ClientData)2
55 #define ITEM_COLUMN_RULE	(ClientData)3
56 #define ITEM_STYLE		(ClientData)0x10004
57 
58 #if HAVE_UTF
59 #else
60 #define Tcl_NumUtfChars(s,n)	(((n) == -1) ? strlen((s)) : (n))
61 #define Tcl_UtfAtIndex(s,i)	((s) + (i))
62 #endif
63 
64 #define ODD(x)			((x) | 0x01)
65 
66 #define END			(-1)
67 #define SEPARATOR_LIST		((char *)NULL)
68 #define SEPARATOR_NONE		((char *)-1)
69 
70 #define SEARCH_Y		1
71 
72 typedef char *UID;
73 
74 /*
75  * The macro below is used to modify a "char" value (e.g. by casting
76  * it to an unsigned character) so that it can be used safely with
77  * macros such as isspace.
78  */
79 #define UCHAR(c)	((unsigned char) (c))
80 
81 #define TOGGLE(x, mask) (((x) & (mask)) ? ((x) & ~(mask)) : ((x) | (mask)))
82 
83 
84 #define SCREENX(h, wx)	((wx) - (h)->xOffset + (h)->insetX)
85 #define SCREENY(h, wy)	((wy) - (h)->yOffset + (h)->insetY + (h)->titleHeight)
86 
87 #define WORLDX(h, sx)	((sx) - (h)->insetX + (h)->xOffset)
88 #define WORLDY(h, sy)	((sy) - ((h)->insetY + (h)->titleHeight) + (h)->yOffset)
89 
90 #define VPORTWIDTH(h)	(Tk_Width((h)->tkwin) - 2 * (h)->insetX)
91 #define VPORTHEIGHT(h) \
92 	(Tk_Height((h)->tkwin) - (h)->titleHeight - 2 * (h)->insetY)
93 
94 #define ICONWIDTH(d)	(tvPtr->levelInfo[(d)].iconWidth)
95 #define LEVELX(d)	(tvPtr->levelInfo[(d)].x)
96 
97 #define DEPTH(h, n)	\
98 		(((h)->flatView) ? 0 : Blt_TreeNodeDepth((h)->tree, (n)))
99 
100 #define SELECT_FG(t)	\
101    (((((t)->flags & TV_FOCUS)) || ((t)->selOutFocusFgColor == NULL)) \
102 	? (t)->selInFocusFgColor : (t)->selOutFocusFgColor)
103 #define SELECT_BORDER(t)	\
104    (((((t)->flags & TV_FOCUS)) || ((t)->selOutFocusBorder == NULL)) \
105 	? (t)->selInFocusBorder : (t)->selOutFocusBorder)
106 
107 #define FLATIND(tvPtr, n) ((tvPtr->flatArr == NULL) || (n) >= tvPtr->nEntries ? NULL : tvPtr->flatArr[n])
108 
109 #define SELECT_MODE_SINGLE	(1<<0)
110 #define SELECT_MODE_MULTIPLE	(1<<1)
111 #define SELECT_MODE_NONE	(1<<2)
112 #define SELECT_MODE_CELL	(1<<3)
113 #define SELECT_MODE_MCELL	(1<<4)
114 #define SELECT_MODE_CELLMASK	(SELECT_MODE_CELL|SELECT_MODE_MCELL)
115 
116 /*
117  * ----------------------------------------------------------------------------
118  *
119  *  Internal treeview widget flags:
120  *
121  *	TV_LAYOUT	The layout of the hierarchy needs to be recomputed.
122  *
123  *	TV_REDRAW	A redraw request is pending for the widget.
124  *
125  *	TV_XSCROLL	X-scroll request is pending.
126  *
127  *	TV_YSCROLL	Y-scroll request is pending.
128  *
129  *	TV_SCROLL	Both X-scroll and  Y-scroll requests are pending.
130  *
131  *	TV_FOCUS	The widget is receiving keyboard events.
132  *			Draw the focus highlight border around the widget.
133  *
134  *	TV_DIRTY	The hierarchy has changed. It may invalidate
135  *			the locations and pointers to entries.  The widget
136  *			will need to recompute its layout.
137  *
138  *	TV_RESORT	The tree has changed such that the view needs to
139  *			be resorted.  This can happen when an entry is
140  *			open or closed, it's label changes, a column value
141  *			changes, etc.
142  *
143  *	TV_BORDERS      The borders of the widget (highlight ring and
144  *			3-D border) need to be redrawn.
145  *
146  *	TV_VIEWPORT     Indicates that the viewport has changed in some
147  *			way: the size of the viewport, the location of
148  *			the viewport, or the contents of the viewport.
149  *
150  */
151 
152 #define TV_LAYOUT	(1<<0)
153 #define TV_REDRAW	(1<<1)
154 #define TV_XSCROLL	(1<<2)
155 #define TV_YSCROLL	(1<<3)
156 #define TV_SCROLL	(TV_XSCROLL | TV_YSCROLL)
157 #define TV_FOCUS	(1<<4)
158 #define TV_DIRTY	(1<<5)
159 #define TV_UPDATE	(1<<6)
160 #define TV_RESORT	(1<<7)
161 #define TV_SORTED	(1<<8)
162 #define TV_SORT_PENDING (1<<9)
163 #define TV_BORDERS	(1<<10)
164 #define TV_VIEWPORT	(1<<11)
165 #define TV_DIRTYALL	(1<<12)
166 #define TV_PICKING	(1<<13)
167 #define TV_ATTACH	(1<<14)
168 
169 /*
170  *  Rule related flags: Rules are XOR-ed lines. We need to track whether
171  *			they have been drawn or not.
172  *
173  *	TV_RULE_ACTIVE  Indicates that a rule is currently being drawn
174  *			for a column.
175  *
176  *
177  *	TV_RULE_NEEDED  Indicates that a rule is needed (but not yet
178  *			drawn) for a column.
179  */
180 
181 #define TV_RULE_ACTIVE	(1<<15)
182 #define TV_RULE_NEEDED	(1<<16)
183 
184 /*
185  *  Selection related flags:
186  *
187  *	TV_SELECT_EXPORT	Export the selection to X11.
188  *
189  *	TV_SELECT_PENDING	A "selection" command idle task is pending.
190  *
191  *	TV_SELECT_CLEAR		Clear selection flag of entry.
192  *
193  *	TV_SELECT_SET		Set selection flag of entry.
194  *
195  *	TV_SELECT_TOGGLE	Toggle selection flag of entry.
196  *
197  *	TV_SELECT_MASK		Mask of selection set/clear/toggle flags.
198  *
199  *	TV_SELECT_SORTED	Indicates if the entries in the selection
200  *				should be sorted or displayed in the order
201  *				they were selected.
202  *
203  */
204 #define TV_SELECT_CLEAR		(1<<16)
205 #define TV_SELECT_EXPORT	(1<<17)
206 #define TV_SELECT_PENDING	(1<<18)
207 #define TV_SELECT_SET		(1<<19)
208 #define TV_SELECT_TOGGLE	(TV_SELECT_SET | TV_SELECT_CLEAR)
209 #define TV_SELECT_MASK		(TV_SELECT_SET | TV_SELECT_CLEAR)
210 #define TV_SELECT_SORTED	(1<<20)
211 
212 /*
213  *  Miscellaneous flags:
214  *
215  *	TV_ALLOW_DUPLICATES	When inserting new entries, create
216  *			        duplicate entries.
217  *
218  *	TV_FILL_ANCESTORS	Automatically create ancestor entries
219  *				as needed when inserting a new entry.
220  *
221  *	TV_HIDE_ROOT		Don't display the root entry.
222  *
223  *	TV_HIDE_LEAVES		Don't display entries that are leaves.
224  *
225  *	TV_SHOW_COLUMN_TITLES	Indicates whether to draw titles over each
226  *				column.
227  *
228  */
229 #define TV_ALLOW_DUPLICATES	(1<<21)
230 #define TV_FILL_ANCESTORS	(1<<22)
231 #define TV_HIDE_ROOT		(1<<23)
232 #define TV_HIDE_LEAVES		(1<<24)
233 #define TV_SHOW_COLUMN_TITLES	(1<<25)
234 #define TV_SORT_AUTO		(1<<26)
235 #define TV_NEW_TAGS		(1<<27)
236 #define TV_NOAUTO_CLOSE_LEAF		(1<<28)
237 /* #define TV_HIGHLIGHT_CELLS	(1<<28) */
238 #define TV_HIDE_ICONS	(1<<29)
239 #define TV_FILL_NULL	(1<<30)
240 #define TV_DELETED	(1<<31)
241 
242 #define TV_ITEM_COLUMN	1
243 #define TV_ITEM_RULE	2
244 
245 #define TV_WINDOW_CLEAR 1
246 #define TV_WINDOW_UNMAP 2
247 #define TV_WINDOW_DRAW 4
248 
249 
250 /*
251  * -------------------------------------------------------------------------
252  *
253  *  Internal entry flags:
254  *
255  *	ENTRY_HAS_BUTTON	Indicates that a button needs to be
256  *				drawn for this entry.
257  *
258  *	ENTRY_CLOSED		Indicates that the entry is closed and
259  *				its subentries are not displayed.
260  *
261  *	ENTRY_HIDDEN		Indicates that the entry is hidden (i.e.
262  *				can not be viewed by opening or scrolling).
263  *
264  *	BUTTON_AUTO
265  *	BUTTON_SHOW
266  *	BUTTON_MASK
267  *
268  * -------------------------------------------------------------------------
269  */
270 #define ENTRY_CLOSED		(1<<0)
271 #define ENTRY_HIDDEN		(1<<1)
272 #define ENTRY_NOT_LEAF		(1<<2)
273 #define ENTRY_MASK		(ENTRY_CLOSED | ENTRY_HIDDEN)
274 
275 #define ENTRY_HAS_BUTTON	(1<<3)
276 #define ENTRY_ICON		(1<<4)
277 #define ENTRY_REDRAW		(1<<5)
278 #define ENTRY_LAYOUT_PENDING	(1<<6)
279 #define ENTRY_DATA_CHANGED	(1<<7)
280 #define ENTRY_DIRTY		(ENTRY_DATA_CHANGED | ENTRY_LAYOUT_PENDING)
281 
282 #define BUTTON_AUTO		(1<<8)
283 #define BUTTON_SHOW		(1<<9)
284 #define BUTTON_MASK		(BUTTON_AUTO | BUTTON_SHOW)
285 #define ENTRY_ALTROW		(1<<10)
286 #define ENTRY_IS_TREE		(1<<11)
287 #define ENTRY_ONLYHIDDEN		(1<<12)
288 #define ENTRY_DATA_WINDOW		(1<<13)
289 #define ENTRY_WINDOW		(1<<14)
290 #define ENTRY_DELETED		(1<<15)
291 
292 #define COLUMN_RULE_PICKED	(1<<1)
293 #define COLUMN_DIRTY		(1<<2)
294 #define COLUMN_DELETED		(1<<3)
295 
296 #define STYLE_TEXTBOX		(0)
297 #define STYLE_COMBOBOX		(1)
298 #define STYLE_CHECKBOX		(2)
299 #define STYLE_WINDOWBOX		(4)
300 #define STYLE_BARBOX		(8)
301 #define STYLE_TYPE		0x15
302 
303 #define STYLE_HIGHLIGHT		(1<<10)
304 #define STYLE_USER		(1<<11)
305 #define STYLE_LAYOUT		(1<<12)
306 #define STYLE_DIRTY		(1<<13)
307 
308 #define STYLEFLAG_NOCLEAR (1<<0)
309 #define STYLEFLAG_ALTSTYLE (1<<1)
310 #define STYLEFLAG_EMPTYSTYLE (1<<2)
311 #define STYLEFLAG_SUBSTYLE (1<<3)
312 #define STYLEFLAG_TITLESTYLE (1<<4)
313 
314 
315 typedef struct TreeViewColumnStruct TreeViewColumn;
316 typedef struct TreeViewComboboxStruct TreeViewCombobox;
317 typedef struct TreeViewEntryStruct TreeViewEntry;
318 typedef struct TreeViewStruct TreeView;
319 typedef struct TreeViewStyleClassStruct TreeViewStyleClass;
320 typedef struct TreeViewStyleStruct TreeViewStyle;
321 
322 typedef int (TreeViewCompareProc) _ANSI_ARGS_((Tcl_Interp *interp,
323         char  *name, Tcl_Obj *pattern, int nocase));
324 
325 typedef TreeViewEntry *(TreeViewIterProc) _ANSI_ARGS_((TreeViewEntry *entryPtr,
326 	unsigned int mask));
327 
328 typedef struct {
329     int init;
330     int tagType;
331     TreeView *tvPtr;
332     Blt_HashSearch cursor;
333     TreeViewEntry *entryPtr;
334     char *tagName;
335     Tcl_Obj **objv, *objPtr;
336     int objc;
337     int idx;
338     int refCount;
339     Blt_TreeTagEntry* tPtr;
340     Blt_TreeNode node;
341     unsigned int inode;
342 } TreeViewTagInfo;
343 
344 /*
345  * TreeViewIcon --
346  *
347  *	Since instances of the same Tk image can be displayed in
348  *	different windows with possibly different color palettes, Tk
349  *	internally stores each instance in a linked list.  But if
350  *	the instances are used in the same widget and therefore use
351  *	the same color palette, this adds a lot of overhead,
352  *	especially when deleting instances from the linked list.
353  *
354  *	For the treeview widget, we never need more than a single
355  *	instance of an image, regardless of how many times it's used.
356  *	Cache the image, maintaining a reference count for each
357  *	image used in the widget.  It's likely that the treeview
358  *	widget will use many instances of the same image (for example
359  *	the open/close icons).
360  */
361 
362 typedef struct TreeViewIconStruct {
363     Tk_Image tkImage;		/* The Tk image being cached. */
364 
365     int refCount;		/* Reference count for this image. */
366 
367     short int width, height;	/* Dimensions of the cached image. */
368 
369     Blt_HashEntry *hashPtr;	/* Hash table pointer to the image. */
370     TreeView *tvPtr;
371     int count;  /* Count number of times displayed. */
372 
373 } *TreeViewIcon;
374 
375 #define TreeViewIconHeight(icon)	((icon)->height)
376 #define TreeViewIconWidth(icon)	((icon)->width)
377 #define TreeViewIconBits(icon)	((icon)->tkImage)
378 struct TreeViewValueStruct;
379 /*
380  * TreeViewColumn --
381  *
382  *	A column describes how to display a field of data in the tree.
383  *	It may display a title that you can bind to. It may display a
384  *	rule for resizing the column.  Columns may be hidden, and have
385  *	attributes (foreground color, background color, font, etc)
386  *	that override those designated globally for the treeview
387  *	widget.
388  */
389 struct TreeViewColumnStruct {
390     int type;			/* Always TV_COLUMN */
391     Blt_TreeKey key;		/* Data cell identifier for current tree. */
392     char *name;		    /* Global key lookup */
393     int position;		/* Position of column in list.  Used
394 				 * to indicate the first and last
395 				 * columns. */
396     UID tagsUid;		/* List of binding tags for this
397 				 * entry.  UID, not a string, because
398 				 * in the typical case most columns
399 				 * will have the same bindtags. */
400 
401     TreeView *tvPtr;
402     unsigned int flags;
403 
404     /* Title-related information */
405     char *title;		/* Text displayed in column heading as its
406 				 * title. By default, this is the same as
407 				 * the data cell name. */
408     Tk_Font titleFont;		/* Font to draw title in. */
409     Shadow titleShadow;
410 
411     XColor *titleFgColor;	/* Foreground color of text displayed in
412 				 * the heading */
413     Tk_3DBorder titleBorder;	/* Background color of the column's heading. */
414 
415     GC titleGC;
416     GC textGC;
417 
418     XColor *activeTitleFgColor;	/* Foreground color of text heading when
419 				 * the column is activated.*/
420     XColor *fgColor;		/* Foreground color. */
421     Tk_Font font;
422     Tk_3DBorder activeTitleBorder;
423 
424     int titleBorderWidth;
425     int titleRelief;
426 
427     GC activeTitleGC;
428 
429     TextLayout *titleTextPtr;
430     short int titleWidth, titleHeight;
431 
432     TreeViewIcon titleIcon;	/* Icon displayed in column heading */
433     char *titleCmd;		/* Tcl script to be executed by the
434 				 * column's "invoke" operation. */
435 
436     char *sortCmd;		/* Tcl script used to compare two
437 				 * columns. */
438 
439     /* General information. */
440     int hidden;			/* Indicates if the column is
441 				 * displayed */
442     int state;			/* Indicates if column title can
443 				 * invoked. */
444     int editable;		/* Indicates if column can be
445 				 * edited. */
446 
447     int max;			/* Maximum space allowed for column. */
448     int reqMin, reqMax;		/* Requested bounds on the width of
449 				 * column.  Does not include any
450 				 * padding or the borderwidth of
451 				 * column.  If non-zero, overrides the
452 				 * computed width of the column. */
453 
454     int reqWidth;		/* User-requested width of
455 				 * column. Does not include any
456 				 * padding or the borderwidth of
457 				 * column.  If non-zero, overrides the
458 				 * computed column width. */
459 
460     int maxWidth;		/* Width of the widest entry in the
461 				 * column. */
462 
463     int worldX;			/* Starting world x-coordinate of the
464 				 * column. */
465 
466     double weight;		/* Growth factor for column.  Zero
467 				 * indicates that the column can not
468 				 * be resized. */
469 
470     int width;			/* Computed width of column. */
471 
472     TreeViewStyle *stylePtr;	/* Default style for column. */
473 
474     Tk_3DBorder border;		/* Background color of column. */
475     int borderWidth;		/* Border width of the column. */
476     int relief;			/* Relief of the column. */
477     Blt_Pad pad;		/* Horizontal padding on either side
478 				 * of the column. */
479 
480     Tk_Justify justify;		/* Indicates how the text or icon is
481 				 * justified within the column. */
482 
483     Blt_ChainLink *linkPtr;
484 
485     int ruleLineWidth;
486     Blt_Dashes ruleDashes;
487     GC ruleGC;
488     Blt_Tile tile;		/* Tiled background */
489     int scrollTile;		/* Adjust the tile along with viewport
490 				 * offsets as the widget is
491 				 * scrolled. */
492     int hasbg;                  /* A -bg was specified. */
493     int hasttlbg;               /* A -titlebackground was specified. */
494     struct TreeViewValueStruct * defValue;   /* Default empty value. */
495     char *validCmd;            /* Command for post checking edits */
496     char *editOpts;            /* Options used for builtin editing. */
497     Tk_Justify titleJustify;		/* Indicates how the text or icon is
498 				 * justified within the title. */
499     short iX, iY, iW, iH;  /* Needed by "nearest" to determine if over icon/label*/
500     short tX, tY, tW, tH;
501     int underline;
502     Blt_TreeTrace trace;
503     Tcl_Obj *fillCmd;
504     TreeViewStyle *titleStylePtr;	/* Default style for column title. */
505     int drawArrow;
506     int autoWidth;    /* If contents exceed this then set as width, if width 0. */
507     int sortType;		/* Type of sorting to be performed. */
508     /* The following colorPats/colorRegex change the fg color by pattern match. */
509     Tcl_Obj *colorPats;  /* List of string match pattern/attribute pairs */
510     Tcl_Obj *colorRegex;  /* List of regex pattern/attribute pairs */
511     Tcl_Obj *formatCmd;
512     Tcl_Obj *sortAltColumns;
513 };
514 
515 
516 #define TREEVIEW_STYLE_COMMON \
517     int refCount;		/* Usage reference count.  A reference \
518 				 * count of zero indicates that the \
519 				 * style may be freed. */ \
520     unsigned int flags;		/* Bit field containing both the style \
521 				 * type and various flags. */ \
522     char *name;			/* Instance name. */ \
523     TreeViewStyleClass *classPtr; \
524 				/* Contains class-specific information such \
525 				 * as configuration specifications and \
526 				 * configure, draw, etc. routines. */ \
527     Blt_HashEntry *hashPtr;	/* If non-NULL, points to the hash \
528 				 * table entry for the style.  A style \
529 				 * that's been deleted, but still in \
530 				 * use (non-zero reference count) will \
531 				 * have no hash table entry. \
532 				 */ \
533     /* General style fields. */ \
534     Tk_Cursor cursor;		/* X Cursor */ \
535     TreeViewIcon icon;		/* If non-NULL, is a Tk_Image to be drawn \
536 				 * in the cell. */ \
537     int gap;			/* # pixels gap between icon and text. */ \
538     Tk_Font font; \
539     XColor *fgColor;		/* Normal foreground color of cell. */ \
540     Tk_3DBorder border;		/* Normal background color of cell. */ \
541     XColor *highlightFgColor;	/* Foreground color of cell when \
542 				 * highlighted. */ \
543     Tk_3DBorder highlightBorder;/* Background color of cell when \
544 				 * highlighted. */ \
545     XColor *activeFgColor;	/* Foreground color of cell when active. */ \
546     Tk_3DBorder activeBorder;	/* Background color of cell when active. */ \
547     int priority;       /* Priority order for bg/fg/font. */ \
548     Blt_Tile tile; \
549     Blt_Tile fillTile; \
550     Shadow shadow; \
551     int hidden;     /* Hidden value or subtext. */ \
552     GC gc; \
553     GC highlightGC; \
554     GC activeGC; \
555     int noteditable; \
556     char *editOpts;
557 
558 
559 struct TreeViewStyleStruct {
560     TREEVIEW_STYLE_COMMON
561 };
562 
563 typedef struct TreeViewValueStruct {
564     TreeViewColumn *columnPtr;	/* Column in which the value is located. */
565     TreeViewEntry *entryPtr;   /* Entry for value. */
566     short int width, height;	/* Dimensions of value. */
567     TreeViewStyle *stylePtr;	/* Style information for cell
568 				 * displaying value. */
569     char *string;		/* Raw text string. */
570     TextLayout *textPtr;	/* Processes string to be displayed .*/
571     struct TreeViewValueStruct *nextPtr;
572     short iX, iY, iW, iH;  /* Needed by "nearest" to determine if over icon/label*/
573     short tX, tY, tW, tH;
574     short selected;
575 } TreeViewValue;
576 
577 typedef void (StyleConfigProc) _ANSI_ARGS_((TreeView *tvPtr,
578 	TreeViewStyle *stylePtr));
579 typedef void (StyleDrawProc) _ANSI_ARGS_((TreeView *tvPtr, Drawable drawable,
580 	TreeViewEntry *entryPtr, TreeViewValue *valuePtr,
581          TreeViewStyle *stylePtr, TreeViewIcon icon, int x, int y));
582 typedef int (StyleEditProc) _ANSI_ARGS_((TreeView *tvPtr,
583 	TreeViewEntry *entryPtr, TreeViewValue *valuePtr,
584 	TreeViewStyle *stylePtr, int x, int y, int *retVal));
585 typedef void (StyleFreeProc) _ANSI_ARGS_((TreeView *tvPtr,
586 	TreeViewStyle *stylePtr));
587 typedef void (StyleMeasureProc) _ANSI_ARGS_((TreeView *tvPtr,
588 	TreeViewStyle *stylePtr, TreeViewValue *valuePtr));
589 typedef int (StylePickProc) _ANSI_ARGS_((TreeViewEntry *entryPtr,
590 	TreeViewValue *valuePtr, TreeViewStyle *stylePtr, int worldX,
591 	int worldY));
592 
593 struct TreeViewStyleClassStruct {
594     char *className;		/* Class name of the style */
595     Blt_ConfigSpec *specsPtr;	/* Style configuration specifications */
596     StyleConfigProc *configProc;/* Sets the GCs for style. */
597     StyleMeasureProc *measProc;	/* Measures the area needed for the value
598 				 * with this style. */
599     StyleDrawProc *drawProc;	/* Draw the value in it's style. */
600     StylePickProc *pickProc;	/* Routine to pick the style's button.
601 				 * Indicates if the mouse pointer is over
602 				 * the style's button (if it has one). */
603     StyleEditProc *editProc;	/* Routine to edit the style's value. */
604     StyleFreeProc *freeProc;	/* Routine to free the style's resources. */
605 };
606 
607 /*
608  * TreeViewEntry --
609  *
610  *	Contains data-specific information how to represent the data
611  *	of a node of the hierarchy.
612  *
613  */
614 struct TreeViewEntryStruct {
615     Blt_TreeNode node;		/* Node containing entry */
616     int worldX, worldY;		/* X-Y position in world coordinates
617 				 * where the entry is positioned. */
618 
619     short int width, height;	/* Dimensions of the entry. This
620 				 * includes the size of its
621 				 * columns. */
622 
623     int reqHeight;		/* Requested height of the entry.
624 				 * Overrides computed height. */
625 
626     int vertLineLength;		/* Length of the vertical line
627 				 * segment. */
628 
629     int lineHeight;		/* Height of first line of text. */
630     unsigned int flags;		/* Flags for this entry. For the
631 				 * definitions of the various bit
632 				 * fields see below. */
633 
634     UID tagsUid;		/* List of binding tags for this
635 				 * entry.  UID, not a string, because
636 				 * in the typical case most entries
637 				 * will have the same bindtags. */
638     TreeView *tvPtr;
639 
640     UID openCmd, closeCmd;	/* Tcl commands to invoke when entries
641 				 * are opened or closed. They override
642 				 * those specified globally. */
643     /*
644      * Button information:
645      */
646     short int buttonX, buttonY; /* X-Y coordinate offsets from to
647 				 * upper left corner of the entry to
648 				 * the upper-left corner of the
649 				 * button.  Used to pick the
650 				 * button quickly */
651 
652     TreeViewIcon *icons;	/* Tk images displayed for the entry.
653 				 * The first image is the icon
654 				 * displayed to the left of the
655 				 * entry's label. The second is icon
656 				 * displayed when entry is "open". */
657 
658     TreeViewIcon *activeIcons;	/* Tk images displayed for the entry.
659 				 * The first image is the icon
660 				 * displayed to the left of the
661 				 * entry's label. The second is icon
662 				 * displayed when entry is "open". */
663 
664     short int iconWidth;
665     short int iconHeight;	/* Maximum dimensions for icons and
666 				 * buttons for this entry. This is
667 				 * used to align the button, icon, and
668 				 * text. */
669     /*
670      * Label information:
671      */
672     TextLayout *textPtr;
673 
674     short int labelWidth;
675     short int labelHeight;
676 
677     UID labelUid;		/* Text displayed right of the icon. */
678 
679     Tk_Font font;		/* Font of label. Overrides global
680 				 * font specification. */
681     char *fullName;
682 
683     int flatIndex;
684 
685     Tcl_Obj *dataObjPtr;	/* pre-fetched data for sorting */
686 
687     XColor *color;		/* Color of label. Overrides default
688 				 * text color specification. */
689     GC gc;
690 
691     Shadow shadow;
692 
693     TreeViewValue *values;	/* List of column-related information
694 				 * for each data value in the node.
695 				 * Non-NULL only if there are value
696 				 * entries. */
697     TreeViewStyle *stylePtr;	/* Effective style for entry. */
698     int hide;                /* Entry is hidden. */
699     int underline;
700     Tk_3DBorder border;		/* Normal background color of entry. */
701     char *userData;		/* user data. */
702     TextLayout *subTextPtr;
703     char *subLabel;
704     TreeViewStyle *realStylePtr;	/* Default style for entry. */
705     int state;
706 };
707 
708 /*
709  * TreeViewButton --
710  *
711  *	A button is the open/close indicator at the far left of the
712  *	entry.  It is displayed as a plus or minus in a solid
713  *	colored box with optionally an border. It has both "active"
714  *	and "normal" colors.
715  */
716 typedef struct {
717     XColor *fgColor;		/* Foreground color. */
718 
719     Tk_3DBorder border;		/* Background color. */
720 
721     XColor *activeFgColor;	/* Active foreground color. */
722 
723     Tk_3DBorder activeBorder;	/* Active background color. */
724 
725     GC normalGC;
726     GC activeGC;
727 
728     int reqSize;
729 
730     int borderWidth;
731 
732     int openRelief, closeRelief;
733 
734     int width, height;
735 
736     TreeViewIcon *icons;
737     TreeViewIcon *activeicons;
738 } TreeViewButton;
739 
740 /*
741  * LevelInfo --
742  *
743  */
744 typedef struct {
745     int x;
746     int iconWidth;
747     int labelWidth;
748 } LevelInfo;
749 
750 /*
751  * TreeView --
752  *
753  *	A TreeView is a widget that displays an hierarchical table
754  *	of one or more entries.
755  *
756  *	Entries are positioned in "world" coordinates, referring to
757  *	the virtual treeview.  Coordinate 0,0 is the upper-left corner
758  *	of the root entry and the bottom is the end of the last entry.
759  *	The widget's Tk window acts as view port into this virtual
760  *	space. The treeview's xOffset and yOffset fields specify the
761  *	location of the view port in the virtual world.  Scrolling the
762  *	viewport is therefore simply changing the xOffset and/or
763  *	yOffset fields and redrawing.
764  *
765  *	Note that world coordinates are integers, not signed short
766  *	integers like X11 screen coordinates.  It's very easy to
767  *	create a hierarchy taller than 0x7FFF pixels.
768  */
769 struct TreeViewStruct {
770     Tcl_Interp *interp;
771 
772     Tcl_Command cmdToken;	/* Token for widget's Tcl command. */
773 
774     Blt_Tree tree;		/* Token holding internal tree. */
775     Blt_Tree freeTree;		/* Tree to free in configure. */
776 
777     Blt_HashEntry *hashPtr;
778 
779     /* TreeView specific fields. */
780 
781     Tk_Window tkwin;		/* Window that embodies the widget.
782                                  * NULL means that the window has been
783                                  * destroyed but the data structures
784                                  * haven't yet been cleaned up.*/
785 
786     Display *display;		/* Display containing widget; needed,
787                                  * among other things, to release
788                                  * resources after tkwin has already
789                                  * gone away. */
790 
791     Blt_HashTable entryTable;	/* Table of entry information, keyed by
792 				 * the node pointer. */
793 
794     Blt_HashTable columnTable;	/* Table of column information. */
795     Blt_Chain *colChainPtr;	/* Chain of columns. Same as the hash
796 				 * table above but maintains the order
797 				 * in which columns are displayed. */
798 
799     unsigned int flags;		/* For bitfield definitions, see below */
800 
801     int insetX, insetY;			/* Total width of all borders,
802 				 * including traversal highlight and
803 				 * 3-D border.  Indicates how much
804 				 * interior stuff must be offset from
805 				 * outside edges to leave room for
806 				 * borders. */
807 
808     Tk_Font font;
809     Tk_Font titleFont;
810     XColor *fgColor;
811 
812     Tk_3DBorder border;		/* 3D border surrounding the window
813 				 * (viewport). */
814 
815     int borderWidth;		/* Width of 3D border. */
816 
817     int relief;			/* 3D border relief. */
818 
819 
820     int highlightWidth;		/* Width in pixels of highlight to
821 				 * draw around widget when it has the
822 				 * focus.  <= 0 means don't draw a
823 				 * highlight. */
824 
825     XColor *highlightBgColor;	/* Color for drawing traversal
826 				 * highlight area when highlight is
827 				 * off. */
828 
829     XColor *highlightColor;	/* Color for drawing traversal highlight. */
830 
831     char *pathSep;		/* Pathname separators */
832 
833     char *trimLeft;		/* Leading characters to trim from
834 				 * pathnames */
835 
836     /*
837      * Entries are connected by horizontal and vertical lines. They
838      * may be drawn dashed or solid.
839      */
840     int lineWidth;		/* Width of lines connecting entries */
841 
842     int dashes;			/* Dash on-off value. */
843 
844     XColor *lineColor;		/* Color of connecting lines. */
845 
846     /*
847      * Button Information:
848      *
849      * The button is the open/close indicator at the far left of the
850      * entry.  It is usually displayed as a plus or minus in a solid
851      * colored box with optionally an border. It has both "active" and
852      * "normal" colors.
853      */
854     TreeViewButton button;
855 
856     /*
857      * Selection Information:
858      *
859      * The selection is the rectangle that contains a selected entry.
860      * There may be many selected entries.  It is displayed as a solid
861      * colored box with optionally a 3D border.
862      */
863     int selRelief;		/* Relief of selected items. Currently
864 				 * is always raised. */
865 
866     int selBorderWidth;		/* Border width of a selected entry.*/
867 
868     XColor *selInFocusFgColor;	/* Text color of a selected entry. */
869     XColor *selOutFocusFgColor;
870 
871     Tk_3DBorder selInFocusBorder;
872     Tk_3DBorder selOutFocusBorder;
873 
874 
875     TreeViewEntry *selAnchorPtr; /* Fixed end of selection (i.e. entry
876 				  * at which selection was started.) */
877     TreeViewEntry *selMarkPtr;
878     TreeViewColumn *selAnchorCol; /* Column for anchor */
879 
880     int	selectMode;		/* Selection style: "single" or
881 				 * "multiple".  */
882 
883     char *selectCmd;		/* Tcl script that's invoked whenever
884 				 * the selection changes. */
885 
886     Blt_HashTable selectTable;	/* Hash table of currently selected
887 				 * entries. */
888 
889     Blt_Chain *selChainPtr;	/* Chain of currently selected
890 				 * entries.  Contains the same
891 				 * information as the above hash
892 				 * table, but maintains the order in
893 				 * which entries are selected.
894 				 */
895 
896     int leader;			/* Number of pixels padding between
897 				 * entries. */
898 
899     Tk_Cursor cursor;		/* X Cursor */
900 
901     Tk_Cursor resizeCursor;	/* Resize Cursor */
902 
903     int reqWidth, reqHeight;	/* Requested dimensions of the
904 				 * treeview widget's window. */
905 
906     GC lineGC;			/* GC for drawing dotted line between
907 				 * entries. */
908 
909     XColor *disabledColor;
910     GC disabledGC;			/* Graphics context for the disabled */
911     XColor *focusColor;
912     Tk_3DBorder disabledBorder;
913 
914     Blt_Dashes focusDashes;	/* Dash on-off value. */
915 
916     GC focusGC;			/* Graphics context for the active
917 				 * label. */
918 
919     Tk_Window comboWin;
920 
921     TreeViewEntry *activePtr;	/* Last active entry. */
922 
923     TreeViewEntry *focusPtr;	/* Entry that currently has focus. */
924 
925     TreeViewEntry *activeButtonPtr; /* Pointer to last active button */
926 
927     TreeViewEntry *fromPtr;
928 
929     struct TreeViewValueStruct *activeValuePtr;/* Last active value. */
930 
931     int xScrollUnits, yScrollUnits; /* # of pixels per scroll unit. */
932 
933     /* Command strings to control horizontal and vertical
934      * scrollbars. */
935     char *xScrollCmdPrefix, *yScrollCmdPrefix;
936 
937     int scrollMode;		/* Selects mode of scrolling: either
938 				 * BLT_SCROLL_MODE_HIERBOX,
939 				 * BLT_SCROLL_MODE_LISTBOX,
940 				 * or BLT_SCROLL_MODE_CANVAS. */
941     /*
942      * Total size of all "open" entries. This represents the range of
943      * world coordinates.
944      */
945     int worldWidth, worldHeight;
946 
947     int xOffset, yOffset;	/* Translation between view port and
948 				 * world origin. */
949 
950     short int minHeight;	/* Minimum entry height. Used to to
951 				 * compute what the y-scroll unit
952 				 * should be. */
953     short int titleHeight;	/* Height of column titles. */
954 
955     LevelInfo *levelInfo;
956 
957     /*
958      * Scanning information:
959      */
960     int scanAnchorX, scanAnchorY;
961     /* Scan anchor in screen coordinates. */
962     int scanX, scanY;		/* X-Y world coordinate where the scan
963 				 * started. */
964 
965     Blt_HashTable iconTable;	/* Table of Tk images */
966 
967     Blt_HashTable uidTable;	/* Table of strings. */
968 
969     Blt_HashTable styleTable;	/* Table of cell styles. */
970 
971     TreeViewEntry *rootPtr;	/* Root entry of tree. */
972 
973     TreeViewEntry **visibleArr;	/* Array of visible entries */
974 
975     int nVisible;		/* Number of entries in the above array */
976 
977     int nEntries;		/* Number of entries in tree. */
978     int treeWidth;		/* Computed width of the tree. */
979 
980     int buttonFlags;		/* Global button indicator for all
981 				 * entries.  This may be overridden by
982 				 * the entry's -button option. */
983 
984     char *openCmd, *closeCmd;	/* Tcl commands to invoke when entries
985 				 * are opened or closed. */
986 
987     TreeViewIcon *icons;	/* Tk images displayed for the entry.
988 				 * The first image is the icon
989 				 * displayed to the left of the
990 				 * entry's label. The second is icon
991 				 * displayed when entry is "open". */
992     TreeViewIcon *activeIcons;	/* Tk images displayed for the entry.
993 				 * The first image is the icon
994 				 * displayed to the left of the
995 				 * entry's label. The second is icon
996 				 * displayed when entry is "open". */
997     TreeViewIcon *leafIcons;	/* Tk images displayed for the leaf entry. */
998     TreeViewIcon *activeLeafIcons;/* Tk images displayed for the active leaf. */
999     char *takeFocus;
1000 
1001     ClientData clientData;
1002 
1003     Blt_BindTable bindTable;	/* Binding information for entries. */
1004 
1005     Blt_HashTable entryTagTable;
1006     Blt_HashTable buttonTagTable;
1007     Blt_HashTable columnTagTable;
1008     Blt_HashTable styleTagTable;
1009 
1010     TreeViewStyle *stylePtr;	/* Default style for text cells */
1011 
1012     TreeViewColumn treeColumn;
1013 
1014     TreeViewColumn *activeColumnPtr;
1015     TreeViewColumn *activeTitleColumnPtr;
1016 				/* Column title currently active. */
1017 
1018     TreeViewColumn *resizeColumnPtr;
1019 				/* Column that is being resized. */
1020 
1021     int depth;
1022 
1023     int flatView;		/* Indicates if the view of the tree
1024 				 * has been flattened. */
1025 
1026     TreeViewEntry **flatArr;	/* Flattened array of entries. */
1027 
1028     char *sortField;		/* Field to be sorted. */
1029 
1030     int sortType;		/* Type of sorting to be performed. See
1031 				 * below for valid values. */
1032 
1033     char *sortCmd;		/* Sort command. */
1034 
1035     int sortDecreasing;		/* Indicates entries should be sorted
1036 				 * in decreasing order. */
1037 
1038     int viewIsDecreasing;	/* Current sorting direction */
1039 
1040     TreeViewColumn *sortColumnPtr;/* Column to use for sorting criteria. */
1041 
1042 #ifdef notdef
1043     Pixmap drawable;		/* Pixmap used to cache the entries
1044 				 * displayed.  The pixmap is saved so
1045 				 * that only selected elements can be
1046 				 * drawn quicky. */
1047 
1048     short int drawWidth, drawHeight;
1049 #endif
1050     short int ruleAnchor, ruleMark;
1051 
1052     Blt_Pool entryPool;
1053     Blt_Pool valuePool;
1054     Blt_Tile tile;		/* Tiled background */
1055     int scrollTile;		/* Adjust the tile along with viewport
1056 				 * offsets as the widget is
1057 				 * scrolled. */
1058     int ruleWidth;		/* Width of rule under entries */
1059     GC solidGC;
1060     TreeViewStyle *altStylePtr;	/* Default style for odd row text cells */
1061 
1062     int nAbove;
1063     TreeViewStyle *emptyStylePtr;	/* Style for empty text cells */
1064     int inlineImg;
1065     int openAnchor;
1066     int insertFirst;  /* Preceeding lookups before doing reverse search of tree. */
1067     int actCol;      /* Show active column in active color on select. */
1068     int actEntry;      /* Show entry in active color on select. */
1069     int rootNodeNum;  /* Node in tree to act as root. */
1070     Blt_TreeNode rootNode;  /* Node in tree to act as root. */
1071     int reqMin;
1072     Blt_HashTable winTable;	/* Table of all windows. */
1073     Blt_HashTable winCellTable;	/* Table of windows indexed by cell. */
1074     char *styleCmd;		/* Tcl script invoked when @style is created */
1075     int hideStyleIcons;
1076     int hideStyleText;
1077     Blt_Tile selectTile;		/* Tiled background for selection. */
1078     int nextIdx;
1079     int nextSubIdx;
1080     int focusHeight;
1081     int showFull;
1082     TreeViewStyle *subStylePtr;	/* Style for sublabel */
1083     int titlePad;
1084     int setFlatView;		/* Indicates sort auto-switched tree to flat. */
1085     char *treePath;
1086     int levelPad;
1087     TreeViewStyle **levelStyles;	/* List of styles for entries begining at level 1. */
1088     Tcl_Obj *imageCmd;
1089     Tcl_Obj *formatCmd;
1090     Tk_OptionTable buttonOptions;
1091     int noScroll;
1092     int padX, padY;
1093 };
1094 
1095 
1096 extern UID Blt_TreeViewGetUid _ANSI_ARGS_((TreeView *tvPtr,
1097 	CONST char *string));
1098 extern void Blt_TreeViewFreeUid _ANSI_ARGS_((TreeView *tvPtr, UID uid));
1099 
1100 extern void Blt_TreeViewEventuallyRedraw _ANSI_ARGS_((TreeView *tvPtr));
1101 extern Tcl_ObjCmdProc Blt_TreeViewWidgetInstCmd;
1102 extern TreeViewEntry *Blt_TreeViewNearestEntry _ANSI_ARGS_((TreeView *tvPtr,
1103 	int x, int y, int flags));
1104 extern char *Blt_TreeViewGetFullName _ANSI_ARGS_((TreeView *tvPtr,
1105 	TreeViewEntry *entryPtr, int checkEntryLabel, Tcl_DString *dsPtr));
1106 extern void Blt_TreeViewSelectCmdProc _ANSI_ARGS_((ClientData clientData));
1107 extern void Blt_TreeViewInsertText _ANSI_ARGS_((TreeView *tvPtr,
1108 	TreeViewEntry *entryPtr, char *string, int extra, int insertPos));
1109 extern int Blt_TreeViewComputeLayout _ANSI_ARGS_((TreeView *tvPtr));
1110 extern void Blt_TreeViewPercentSubst _ANSI_ARGS_((TreeView *tvPtr,
1111 	TreeViewEntry *entryPtr, TreeViewColumn *columnPtr,
1112 	char *command, char *value, Tcl_DString *resultPtr));
1113 extern int Blt_TreeViewDrawButton _ANSI_ARGS_((TreeView *tvPtr,
1114 	TreeViewEntry *entryPtr, Drawable drawable, int x, int y));
1115 extern void Blt_TreeViewDrawValue _ANSI_ARGS_((TreeView *tvPtr,
1116     TreeViewEntry *entryPtr, TreeViewValue *valuePtr, Drawable drawable,
1117     int x, int y, int altRow, int ishid));
1118 extern void Blt_TreeViewDrawOuterBorders _ANSI_ARGS_((TreeView *tvPtr,
1119 	Drawable drawable));
1120 extern int Blt_TreeViewDrawIcon _ANSI_ARGS_((TreeView *tvPtr,
1121 	TreeViewEntry *entryPtr, Drawable drawable, int x, int y, int clear));
1122 extern void Blt_TreeViewDrawHeadings _ANSI_ARGS_((TreeView *tvPtr,
1123 	Drawable drawable));
1124 extern void Blt_TreeViewDrawRule _ANSI_ARGS_((TreeView *tvPtr,
1125 	TreeViewColumn *columnPtr, Drawable drawable));
1126 extern int Blt_TreeViewTextbox _ANSI_ARGS_((TreeView *tvPtr,
1127 	TreeViewEntry *entryPtr, TreeViewColumn *columnPtr));
1128 
1129 extern void Blt_TreeViewConfigureButtons _ANSI_ARGS_((TreeView *tvPtr));
1130 extern int Blt_TreeViewUpdateWidget _ANSI_ARGS_((Tcl_Interp *interp,
1131 	TreeView *tvPtr));
1132 extern int Blt_TreeViewScreenToIndex _ANSI_ARGS_((TreeView *tvPtr,
1133 	int x, int y));
1134 
1135 extern void Blt_TreeViewFreeIcon _ANSI_ARGS_((TreeView *tvPtr,
1136 	TreeViewIcon icon));
1137 extern TreeViewIcon Blt_TreeViewGetIcon _ANSI_ARGS_((TreeView *tvPtr,
1138 	CONST char *iconName));
1139 extern void Blt_TreeViewAddValue _ANSI_ARGS_((TreeViewEntry *entryPtr,
1140 	TreeViewColumn *columnPtr));
1141 extern int Blt_TreeViewCreateColumn _ANSI_ARGS_((TreeView *tvPtr,
1142 	TreeViewColumn *columnPtr, char *name, char *defaultLabel));
1143 extern void Blt_TreeViewDestroyValue _ANSI_ARGS_((TreeView *tvPtr,
1144 	 TreeViewEntry *entryPtr, TreeViewValue *valuePtr));
1145 extern void Blt_TreeViewDeleteValue(TreeViewEntry* entryPtr, Blt_TreeKey key);
1146 extern TreeViewValue *Blt_TreeViewFindValue _ANSI_ARGS_((
1147 	TreeViewEntry *entryPtr, TreeViewColumn *columnPtr));
1148 extern void Blt_TreeViewConfigureColumns _ANSI_ARGS_((TreeView *tvPtr));
1149 extern void Blt_TreeViewDestroyColumns _ANSI_ARGS_((TreeView *tvPtr));
1150 extern void Blt_TreeViewAllocateColumnUids _ANSI_ARGS_((TreeView *tvPtr));
1151 extern void Blt_TreeViewFreeColumnUids _ANSI_ARGS_((TreeView *tvPtr));
1152 extern void Blt_TreeViewUpdateColumnGCs _ANSI_ARGS_((TreeView *tvPtr,
1153 	TreeViewColumn *columnPtr));
1154 extern TreeViewColumn *Blt_TreeViewNearestColumn _ANSI_ARGS_((TreeView *tvPtr,
1155 	int x, int y, ClientData *contextPtr));
1156 
1157 extern void Blt_TreeViewDrawRule _ANSI_ARGS_((TreeView *tvPtr,
1158 	TreeViewColumn *columnPtr, Drawable drawable));
1159 extern int Blt_TreeViewTextOp _ANSI_ARGS_((TreeView *tvPtr, Tcl_Interp *interp,
1160 	int objc, Tcl_Obj *CONST *objv));
1161 extern int Blt_TreeViewCombobox _ANSI_ARGS_((TreeView *tvPtr,
1162 	TreeViewEntry *entryPtr, TreeViewColumn *columnPtr));
1163 extern int Blt_TreeViewCreateEntry _ANSI_ARGS_((TreeView *tvPtr,
1164 	Blt_TreeNode node, int objc, Tcl_Obj *CONST *objv, int flags));
1165 extern int Blt_TreeViewConfigureEntry _ANSI_ARGS_((TreeView *tvPtr,
1166 	TreeViewEntry *entryPtr, int objc, Tcl_Obj *CONST *objv, int flags));
1167 extern int Blt_TreeViewOpenEntry _ANSI_ARGS_((TreeView *tvPtr,
1168 	TreeViewEntry *entryPtr));
1169 extern int Blt_TreeViewCloseEntry _ANSI_ARGS_((TreeView *tvPtr,
1170 	TreeViewEntry *entryPtr));
1171 extern TreeViewEntry *Blt_TreeViewNextEntry _ANSI_ARGS_((
1172 	TreeViewEntry *entryPtr, unsigned int mask));
1173 extern TreeViewEntry *Blt_TreeViewPrevEntry _ANSI_ARGS_((
1174 	TreeViewEntry *entryPtr, unsigned int mask));
1175 extern int Blt_TreeViewGetEntry _ANSI_ARGS_((TreeView *tvPtr, Tcl_Obj *objPtr,
1176 	TreeViewEntry **entryPtrPtr));
1177 extern int Blt_TreeViewEntryIsHidden _ANSI_ARGS_((TreeViewEntry *entryPtr));
1178 extern int Blt_TreeViewEntryIsMapped _ANSI_ARGS_((TreeViewEntry *entryPtr));
1179 extern TreeViewEntry *Blt_TreeViewNextSibling _ANSI_ARGS_((
1180 	TreeViewEntry *entryPtr, unsigned int mask));
1181 extern TreeViewEntry *Blt_TreeViewPrevSibling _ANSI_ARGS_((
1182 	TreeViewEntry *entryPtr, unsigned int mask));
1183 extern TreeViewEntry *Blt_TreeViewFirstChild _ANSI_ARGS_((
1184 	TreeViewEntry *parentPtr, unsigned int mask));
1185 extern TreeViewEntry *Blt_TreeViewLastChild _ANSI_ARGS_((
1186 	TreeViewEntry *entryPtr, unsigned int mask));
1187 extern TreeViewEntry *Blt_TreeViewParentEntry _ANSI_ARGS_((
1188 	TreeViewEntry *entryPtr));
1189 
1190 typedef int (TreeViewApplyProc) _ANSI_ARGS_((TreeView *tvPtr,
1191 	TreeViewEntry *entryPtr));
1192 
1193 extern int Blt_TreeViewApply _ANSI_ARGS_((TreeView *tvPtr,
1194 	TreeViewEntry *entryPtr, TreeViewApplyProc *proc, unsigned int mask));
1195 
1196 extern int Blt_TreeViewColumnOp _ANSI_ARGS_((TreeView *tvPtr,
1197 	Tcl_Interp *interp, int objc, Tcl_Obj *CONST *objv));
1198 extern int Blt_TreeViewSortOp _ANSI_ARGS_((TreeView *tvPtr, Tcl_Interp *interp,
1199 	int objc, Tcl_Obj *CONST *objv));
1200 extern int Blt_TreeViewGetColumn _ANSI_ARGS_((Tcl_Interp *interp,
1201 	TreeView *tvPtr, Tcl_Obj *objPtr, TreeViewColumn **columnPtrPtr));
1202 extern int Blt_TreeViewGetColumnKey _ANSI_ARGS_((Tcl_Interp *interp,
1203 	TreeView *tvPtr, Tcl_Obj *objPtr, TreeViewColumn **columnPtrPtr, char **keyPtrPtr));
1204 
1205 extern void Blt_TreeViewSortFlatView _ANSI_ARGS_((TreeView *tvPtr));
1206 extern void Blt_TreeViewSortTreeView _ANSI_ARGS_((TreeView *tvPtr));
1207 
1208 extern int Blt_TreeViewEntryIsSelected _ANSI_ARGS_((TreeView *tvPtr,
1209 	TreeViewEntry *entryPtr, TreeViewColumn *columnPtr));
1210 extern void Blt_TreeViewSelectEntry _ANSI_ARGS_((TreeView *tvPtr,
1211 	TreeViewEntry *entryPtr, TreeViewColumn *columnPtr));
1212 extern void Blt_TreeViewDeselectEntry _ANSI_ARGS_((TreeView *tvPtr,
1213 	TreeViewEntry *entryPtr, TreeViewColumn *columnPtr));
1214 extern void Blt_TreeViewPruneSelection _ANSI_ARGS_((TreeView *tvPtr,
1215 	TreeViewEntry *entryPtr));
1216 extern void Blt_TreeViewClearSelection _ANSI_ARGS_((TreeView *tvPtr));
1217 extern void Blt_TreeViewClearTags _ANSI_ARGS_((TreeView *tvPtr,
1218 	TreeViewEntry *entryPtr));
1219 extern int Blt_TreeViewFindTaggedEntries _ANSI_ARGS_((TreeView *tvPtr,
1220 	Tcl_Obj *objPtr, TreeViewTagInfo *infoPtr));
1221 extern int Blt_TreeViewDoneTaggedEntries _ANSI_ARGS_((TreeViewTagInfo *infoPtr));
1222 extern TreeViewEntry *Blt_TreeViewFirstTaggedEntry _ANSI_ARGS_((
1223 	TreeViewTagInfo *infoPtr));
1224 extern TreeViewEntry *Blt_TreeViewNextTaggedEntry _ANSI_ARGS_((
1225 	TreeViewTagInfo *infoPtr));
1226 extern ClientData Blt_TreeViewButtonTag _ANSI_ARGS_((TreeView *tvPtr,
1227     CONST char *string));
1228 extern ClientData Blt_TreeViewEntryTag _ANSI_ARGS_((TreeView *tvPtr,
1229     CONST char *string));
1230 extern ClientData Blt_TreeViewColumnTag _ANSI_ARGS_((TreeView *tvPtr,
1231     CONST char *string));
1232 extern void Blt_TreeViewGetTags _ANSI_ARGS_((Tcl_Interp *interp,
1233 	TreeView *tvPtr, TreeViewEntry *entryPtr, Blt_List list));
1234 extern void Blt_TreeViewTraceColumn _ANSI_ARGS_((TreeView *tvPtr,
1235 	TreeViewColumn *columnPtr));
1236 extern TreeViewIcon Blt_TreeViewGetEntryIcon _ANSI_ARGS_((TreeView *tvPtr,
1237 	TreeViewEntry *entryPtr));
1238 extern int Blt_TreeViewStyleIsFmt _ANSI_ARGS_((TreeView *tvPtr,
1239 	TreeViewStyle *stylePtr));
1240 extern void Blt_TreeViewSetStyleIcon _ANSI_ARGS_((TreeView *tvPtr,
1241 	TreeViewStyle *stylePtr, TreeViewIcon icon));
1242 extern int Blt_TreeViewGetStyle _ANSI_ARGS_((Tcl_Interp *interp,
1243 	TreeView *tvPtr, char *styleName, TreeViewStyle **stylePtrPtr));
1244 extern int Blt_TreeViewGetStyleMake _ANSI_ARGS_((Tcl_Interp *interp,
1245 	TreeView *tvPtr, char *styleName, TreeViewStyle **stylePtrPtr,
1246 	TreeViewColumn *columnPtr, TreeViewEntry *entryPtr, TreeViewValue *valuePtr));
1247 extern void Blt_TreeViewFreeStyle _ANSI_ARGS_((TreeView *tvPtr,
1248 	TreeViewStyle *stylePtr));
1249 extern TreeViewStyle *Blt_TreeViewCreateStyle _ANSI_ARGS_((Tcl_Interp *interp,
1250 	TreeView *tvPtr, int type, char *styleName));
1251 extern void Blt_TreeViewUpdateStyleGCs _ANSI_ARGS_((TreeView *tvPtr,
1252 	TreeViewStyle *stylePtr));
1253 extern void Blt_TreeViewUpdateStyles _ANSI_ARGS_((TreeView *tvPtr));
1254 extern Tk_3DBorder Blt_TreeViewGetStyleBorder _ANSI_ARGS_((TreeView *tvPtr,
1255 	TreeViewStyle *stylePtr));
1256 extern GC Blt_TreeViewGetStyleGC _ANSI_ARGS_((TreeView *tvPtr,TreeViewStyle *stylePtr));
1257 extern Tk_Font Blt_TreeViewGetStyleFont _ANSI_ARGS_((TreeView *tvPtr,
1258         TreeViewColumn *columnPtr, TreeViewStyle *stylePtr));
1259 extern XColor *Blt_TreeViewGetStyleFg _ANSI_ARGS_((TreeView *tvPtr,
1260         TreeViewColumn *columnPtr, TreeViewStyle *stylePtr));
1261 extern TreeViewEntry *Blt_NodeToEntry _ANSI_ARGS_((TreeView *tvPtr,
1262 	Blt_TreeNode node));
1263 extern int Blt_TreeViewStyleOp _ANSI_ARGS_((TreeView *tvPtr, Tcl_Interp *interp,
1264 	int objc, Tcl_Obj *CONST *objv));
1265 extern void Blt_TreeViewTileChangedProc( ClientData clientData, Blt_Tile tile);
1266 extern void Blt_TreeViewMakeStyleDirty(	TreeView *tvPtr );
1267 TreeViewValue * Blt_TreeViewMakeValue(TreeView *tvPtr, TreeViewColumn *columnPtr, TreeViewEntry *entryPtr);
1268 void Blt_TreeViewRelayout(TreeView *tvPtr);
1269 extern void Blt_TreeViewFill3DTile _ANSI_ARGS_((TreeView *tvPtr,
1270     Drawable drawable, Tk_3DBorder border, int x, int y, int width, int height,
1271     int borderWidth, int relief, Blt_Tile tile, int scrollTile, int flags));
1272 extern int Blt_TreeViewIsLeaf(TreeViewEntry *entryPtr);
1273 extern void Blt_TreeViewFreeWindows( TreeView *tvPtr);
1274 extern void Blt_TreeViewMarkWindows( TreeView *tvPtr, int flag);
1275 extern void Blt_TreeViewWindowUpdate(TreeViewEntry *entryPtr, TreeViewColumn *columnPtr);
1276 extern void Blt_TreeViewWindowRelease(TreeViewEntry *entryPtr, TreeViewColumn *columnPtr);
1277 extern  void Blt_TreeViewColumnRekey(TreeView *tvPtr);
1278 extern  void Blt_TreeViewChanged(TreeView *tvPtr);
1279 extern int Blt_TreeViewRerawIcon(TreeView *tvPtr,  TreeViewEntry *entryPtr,
1280     TreeViewColumn *columnPtr, TreeViewIcon icon, int imageX,
1281     int imageY, int width, int height, Drawable drawable,
1282     int drawableX, int drawableY);
1283 
1284 extern void Blt_GetPriorityStyle _ANSI_ARGS_(( TreeViewStyle *stylePtr,
1285     TreeView *tvPtr, TreeViewColumn *columnPtr, TreeViewEntry *entryPtr,
1286     TreeViewValue *valuePtr, TreeViewStyle *inStylePtr, int flags));
1287 extern int Blt_TreeViewRedrawIcon  _ANSI_ARGS_((TreeView *tvPtr, TreeViewEntry *entryPtr,
1288     TreeViewColumn *columnPtr, TreeViewIcon icon, int imageX,
1289     int imageY, int width, int height, Drawable drawable,
1290     int drawableX, int drawableY));
1291 void Blt_TreeViewFreeEntry _ANSI_ARGS_((TreeView *tvPtr, TreeViewEntry *entryPtr));
1292 
1293 #define CHOOSE(default, override)	\
1294 	(((override) == NULL) ? (default) : (override))
1295 
1296 #define CHOOSE3(default, override2, override1)	\
1297          (((override1) == NULL) ? (CHOOSE(default, override2)) : (override1))
1298 
1299 #define CHOOSE4(default, override3, override2, override1)	\
1300          (((override1) == NULL) ? (CHOOSE3(default, override3, override2)) : (override1))
1301 
1302 #define GETLABEL(e)		\
1303 	(((e)->labelUid != NULL) ? (e)->labelUid : Blt_TreeNodeLabel((e)->node))
1304 
1305 #define Blt_TreeViewGetData(entryPtr, key, objPtrPtr) \
1306 	Blt_TreeGetValueByKey((Tcl_Interp *)NULL, (entryPtr)->tvPtr->tree, \
1307 	      (entryPtr)->node, key, objPtrPtr)
1308 
1309 extern Blt_CustomOption bltTreeViewUidOption;
1310 extern Blt_CustomOption bltTreeViewIconOption;
1311 extern Blt_CustomOption bltTreeViewStyleOption;
1312 extern Blt_CustomOption bltTreeViewStylesOption;
1313 extern Blt_CustomOption bltTreeViewTreeOption;
1314 extern Blt_CustomOption bltTreeViewColumnOption;
1315 extern Blt_CustomOption bltTreeViewLabelOption;
1316 extern Blt_CustomOption bltTreeViewDataOption;
1317 extern void Blt_TreeViewOptsInit(TreeView* tvPtr);
1318 
1319 
1320 
1321 #endif /* BLT_TREEVIEW_H */
1322