tkTreeCtrl.h

Go to the documentation of this file.
00001 /* 
00002  * tkTreeCtrl.h --
00003  *
00004  *  This module is the header for treectrl widgets for the Tk toolkit.
00005  *
00006  * Copyright (c) 2002-2006 Tim Baker
00007  * Copyright (c) 2002-2003 Christian Krone
00008  * Copyright (c) 2003 ActiveState Corporation
00009  *
00010  * RCS: @(#) $Id: tkTreeCtrl.h,v 1.3 2008-01-24 20:35:28 barre Exp $
00011  */
00012 
00013 #include "vtkTcl.h"
00014 #include "vtkTk.h"
00015 #include "vtkTkInternals.h"
00016 
00017 #ifdef MAC_OSX_TK
00018 #ifndef HAVE_LIMITS_H
00019 #define HAVE_LIMITS_H
00020 #endif
00021 #ifndef HAVE_UNISTD_H
00022 #define HAVE_UNISTD_H
00023 #endif
00024 #endif
00025 
00026 #include "tkPort.h"
00027 #include "default.h"
00028 #include "tkInt.h"
00029 #include "qebind.h"
00030 
00031 #ifdef HAVE_DBWIN_H
00032 #include "dbwin.h"
00033 #else /* HAVE_DBWIN_H */
00034 #define dbwin printf
00035 #endif /* HAVE_DBWIN_H */
00036 
00037 #ifndef TRUE
00038 #define TRUE 1
00039 #define FALSE 0
00040 #endif
00041 
00042 #ifndef MIN
00043 #define MIN(a,b) ((a) < (b) ? (a) : (b))
00044 #endif
00045 #ifndef MAX
00046 #define MAX(a,b) ((a) > (b) ? (a) : (b))
00047 #endif
00048 
00049 #define SELECTION_VISIBLE
00050 #define ALLOC_HAX
00051 #define DEPRECATED
00052 
00053 typedef struct TreeCtrl TreeCtrl;
00054 typedef struct TreeColumn_ *TreeColumn;
00055 typedef struct TreeDInfo_ *TreeDInfo;
00056 typedef struct TreeDragImage_ *TreeDragImage;
00057 typedef struct TreeItem_ *TreeItem;
00058 typedef struct TreeItemColumn_ *TreeItemColumn;
00059 typedef struct TreeItemDInfo_ *TreeItemDInfo;
00060 typedef struct TreeMarquee_ *TreeMarquee;
00061 typedef struct TreeItemRInfo_ *TreeItemRInfo;
00062 typedef struct TreeStyle_ *TreeStyle;
00063 typedef struct TreeElement_ *TreeElement;
00064 typedef struct TreeThemeData_ *TreeThemeData;
00065 
00066 /*****/
00067 
00068 typedef struct PerStateInfo PerStateInfo;
00069 typedef struct PerStateData PerStateData;
00070 typedef struct PerStateType PerStateType;
00071 
00072 /* There is one of these for each XColor, Tk_Font, Tk_Image etc */
00073 struct PerStateData
00074 {
00075     int stateOff;
00076     int stateOn;
00077     /* Type-specific fields go here */
00078 };
00079 
00080 struct PerStateInfo
00081 {
00082 #ifdef TREECTRL_DEBUG
00083     PerStateType *type;
00084 #endif
00085     Tcl_Obj *obj;
00086     int count;
00087     PerStateData *data;
00088 };
00089 
00090 typedef int (*PerStateType_FromObjProc)(TreeCtrl *, Tcl_Obj *, PerStateData *);
00091 typedef void (*PerStateType_FreeProc)(TreeCtrl *, PerStateData *);
00092 
00093 struct PerStateType
00094 {
00095     CONST char *name;
00096     int size;
00097     PerStateType_FromObjProc fromObjProc;
00098     PerStateType_FreeProc freeProc;
00099 };
00100 
00101 /*****/
00102 
00103 /*
00104  * A TreePtrList is used for dynamically-growing lists of ClientData pointers.
00105  * A TreePtrList is NULL-terminated.
00106  * Based on Tcl_DString code.
00107  */
00108 #define TIL_STATIC_SPACE 128
00109 typedef struct TreePtrList TreePtrList;
00110 typedef TreePtrList TreeItemList;
00111 typedef TreePtrList TreeColumnList;
00112 struct TreePtrList {
00113     TreeCtrl *tree;
00114     ClientData *pointers;  /* NULL-terminated list of pointers. */
00115     int count;      /* Number of items. */
00116     int space;      /* Number of slots pointed to by pointers[]. */
00117     ClientData pointerSpace[TIL_STATIC_SPACE]; /* Space to use in common case
00118          * where the list is small. */
00119 };
00120 
00121 enum { LEFT, TOP, RIGHT, BOTTOM };
00122 
00123 struct TreeCtrlDebug
00124 {
00125     Tk_OptionTable optionTable;
00126     int enable;      /* Turn all debugging on/off */
00127     int data;      /* Debug data structures */
00128     int display;    /* Debug display routines */
00129     int textLayout;    /* Debug text layout */
00130     int displayDelay;    /* Delay between copy/draw operations */
00131     XColor *eraseColor;    /* Erase "invalidated" areas */
00132     GC gcErase;      /* for eraseColor */
00133     XColor *drawColor;    /* Erase about-to-be-drawn areas */
00134     GC gcDraw;      /* for eraseColor */
00135 };
00136 
00137 struct TreeCtrlColumnDrag
00138 {
00139     Tk_OptionTable optionTable;
00140     int enable;      /* -enable */
00141     TreeColumn column;    /* -imagecolumn */
00142     Tcl_Obj *offsetObj;    /* -imageoffset */
00143     int offset;      /* -imageoffset */
00144     XColor *color;    /* -imagecolor */
00145     int alpha;      /* -imagealpha */
00146     TreeColumn indColumn;  /* -indicatorcolumn */
00147     XColor *indColor;    /* -indicatorcolor */
00148     int indSide;    /* -indicatorside */
00149 };
00150 
00151 struct TreeCtrl
00152 {
00153     /* Standard stuff */
00154     Tk_Window tkwin;
00155     Display *display;
00156     Tcl_Interp *interp;
00157     Tcl_Command widgetCmd;
00158     Tk_OptionTable optionTable;
00159 
00160     /* Configuration options */
00161     Tcl_Obj *fgObj;    /* -foreground */
00162     XColor *fgColorPtr;    /* -foreground */
00163     Tcl_Obj *borderWidthObj;  /* -borderwidth */
00164     int borderWidth;    /* -borderwidth */
00165     Tk_3DBorder border;    /* -background */
00166     Tk_Cursor cursor;    /* Current cursor for window, or None. */
00167     int relief;      /* -relief */
00168     Tcl_Obj *highlightWidthObj;  /* -highlightthickness */
00169     int highlightWidth;    /* -highlightthickness */
00170     XColor *highlightBgColorPtr; /* -highlightbackground */
00171     XColor *highlightColorPtr;  /* -highlightcolor */
00172     char *xScrollCmd;    /* -xscrollcommand */
00173     char *yScrollCmd;    /* -yscrollcommand */
00174     Tcl_Obj *xScrollDelay;  /* -xscrolldelay: used by scripts */
00175     Tcl_Obj *yScrollDelay;  /* -yscrolldelay: used by scripts */
00176     int xScrollIncrement;  /* -xscrollincrement */
00177     int yScrollIncrement;  /* -yscrollincrement */
00178     Tcl_Obj *scrollMargin;  /* -scrollmargin: used by scripts */
00179     char *takeFocus;    /* -takfocus */
00180     Tcl_Obj *fontObj;    /* -font */
00181     Tk_Font tkfont;    /* -font */
00182     int showButtons;    /* boolean: Draw expand/collapse buttons */
00183     int showLines;    /* boolean: Draw lines connecting parent to
00184          * child */
00185     int showRootLines;    /* boolean: Draw lines connecting children
00186          * of the root item */
00187     int showRoot;    /* boolean: Draw the unique root item */
00188     int showRootButton;    /* boolean: Draw expand/collapse button for
00189          * root item */
00190     int showHeader;    /* boolean: show column titles */
00191     Tcl_Obj *indentObj;    /* pixels: offset of child relative to
00192          * parent */
00193     int indent;      /* pixels: offset of child relative to
00194          * parent */
00195     char *selectMode;    /* -selectmode: used by scripts only */
00196     Tcl_Obj *itemHeightObj;  /* -itemheight: Fixed height for all items
00197                                     (unless overridden) */
00198     int itemHeight;    /* -itemheight */
00199     Tcl_Obj *minItemHeightObj;  /* -minitemheight: Minimum height for all items */
00200     int minItemHeight;    /* -minitemheight */
00201     Tcl_Obj *itemWidthObj;  /* -itemwidth */
00202     int itemWidth;    /* -itemwidth */
00203     int itemWidthEqual;    /* -itemwidthequal */
00204     Tcl_Obj *itemWidMultObj;  /* -itemwidthmultiple */
00205     int itemWidMult;    /* -itemwidthmultiple */
00206     Tcl_Obj *widthObj;    /* -width */
00207     int width;      /* -width */
00208     Tcl_Obj *heightObj;    /* -height */
00209     int height;      /* -height */
00210     TreeColumn columnTree;  /* column where buttons/lines are drawn */
00211 #define DOUBLEBUFFER_NONE 0
00212 #define DOUBLEBUFFER_ITEM 1
00213 #define DOUBLEBUFFER_WINDOW 2
00214     int doubleBuffer;    /* -doublebuffer */
00215     XColor *buttonColor;  /* -buttoncolor */
00216     Tcl_Obj *buttonSizeObj;  /* -buttonSize */
00217     int buttonSize;    /* -buttonsize */
00218     Tcl_Obj *buttonThicknessObj;/* -buttonthickness */
00219     int buttonThickness;  /* -buttonthickness */
00220     XColor *lineColor;    /* -linecolor */
00221     Tcl_Obj *lineThicknessObj;  /* -linethickness */
00222     int lineThickness;    /* -linethickness */
00223 #define LINE_STYLE_DOT 0
00224 #define LINE_STYLE_SOLID 1
00225     int lineStyle;    /* -linestyle */
00226     int vertical;    /* -orient */
00227     Tcl_Obj *wrapObj;    /* -wrap */
00228     PerStateInfo buttonImage;  /* -buttonimage */
00229     PerStateInfo buttonBitmap;  /* -buttonbitmap */
00230     char *backgroundImageString; /* -backgroundimage */
00231     int useIndent;    /* MAX of open/closed button width and
00232          * indent */
00233 #define BG_MODE_COLUMN 0
00234 #define BG_MODE_ORDER 1
00235 #define BG_MODE_ORDERVIS 2
00236 #define BG_MODE_ROW 3
00237 #ifdef DEPRECATED
00238 #define BG_MODE_INDEX 4    /* compatibility */
00239 #define BG_MODE_VISINDEX 5  /* compatibility */
00240 #endif /* DEPRECATED */
00241     int backgroundMode;    /* -backgroundmode */
00242     int columnResizeMode;  /* -columnresizemode */
00243     int *itemPadX;    /* -itempadx */
00244     Tcl_Obj *itemPadXObj;  /* -itempadx */
00245     int *itemPadY;    /* -itempady */
00246     Tcl_Obj *itemPadYObj;  /* -itempady */
00247 
00248     struct TreeCtrlDebug debug;
00249     struct TreeCtrlColumnDrag columnDrag;
00250 
00251     /* Other stuff */
00252     int gotFocus;    /* flag */
00253     int deleted;    /* flag */
00254     int updateIndex;    /* flag */
00255     int isActive;    /* flag: mac & win "active" toplevel */
00256     int inset;      /* borderWidth + highlightWidth */
00257     int xOrigin;    /* offset from content x=0 to window x=0 */
00258     int yOrigin;    /* offset from content y=0 to window y=0 */
00259     GC copyGC;
00260     GC textGC;
00261     GC buttonGC;
00262     GC lineGC;
00263     Tk_Image backgroundImage;  /* -backgroundimage */
00264     int useTheme;    /* -usetheme */
00265     char *itemPrefix;    /* -itemprefix */
00266     char *columnPrefix;    /* -columnprefix */
00267 
00268     int prevWidth;
00269     int prevHeight;
00270     int drawableXOrigin;
00271     int drawableYOrigin;
00272 
00273     TreeColumn columns;    /* List of columns */
00274     TreeColumn columnLast;  /* Last in list of columns */
00275     TreeColumn columnTail;  /* Last infinitely-wide column */
00276     TreeColumn columnVis;  /* First visible column */
00277     int columnCount;    /* Number of columns */
00278     int columnCountVis;    /* Number of visible columns */
00279     int headerHeight;    /* Height of column titles */
00280     int widthOfColumns;    /* Sum of column widths */
00281     int columnTreeLeft;    /* left of column where buttons/lines are
00282          * drawn */
00283     int columnTreeVis;    /* TRUE if columnTree is visible */
00284     int columnBgCnt;    /* Max -itembackground colors */
00285 
00286 #define COLUMN_LOCK_LEFT 0
00287 #define COLUMN_LOCK_NONE 1
00288 #define COLUMN_LOCK_RIGHT 2
00289     TreeColumn columnLockLeft;  /* First left-locked column */
00290     TreeColumn columnLockNone;  /* First unlocked column */
00291     TreeColumn columnLockRight;  /* First right-locked column */
00292     int widthOfColumnsLeft;  /* Sum of left-locked column widths */
00293     int widthOfColumnsRight;  /* Sum of right-locked column widths */
00294     int columnCountVisLeft;  /* Number of visible left-locked columns */
00295     int columnCountVisRight;  /* Number of visible right-locked columns */
00296 
00297 #define UNIFORM_GROUP
00298 #ifdef UNIFORM_GROUP
00299     Tcl_HashTable uniformGroupHash;  /* -uniform -> UniformGroup */
00300 #endif
00301 
00302     TreeItem root;
00303     TreeItem activeItem;
00304     TreeItem anchorItem;
00305     int nextItemId;
00306     int nextColumnId;
00307     Tcl_HashTable itemHash;  /* TreeItem.id -> TreeItem */
00308     Tcl_HashTable itemSpansHash; /* TreeItem -> nothing */
00309     Tcl_HashTable elementHash;  /* Element.name -> Element */
00310     Tcl_HashTable styleHash;  /* Style.name -> Style */
00311     Tcl_HashTable imageNameHash;  /* image name -> TreeImageRef */
00312     Tcl_HashTable imageTokenHash; /* Tk_Image -> TreeImageRef */
00313     int depth;      /* max depth of items under root */
00314     int itemCount;    /* Total number of items */
00315     int itemVisCount;    /* Total number of ReallyVisible() items */
00316     QE_BindingTable bindingTable;
00317     TreeDragImage dragImage;
00318     TreeMarquee marquee;
00319     TreeDInfo dInfo;
00320     int selectCount;    /* Number of selected items */
00321     Tcl_HashTable selection;  /* Selected items */
00322 
00323 #define TREE_WRAP_NONE 0
00324 #define TREE_WRAP_ITEMS 1
00325 #define TREE_WRAP_PIXELS 2
00326 #define TREE_WRAP_WINDOW 3
00327     int wrapMode;    /* TREE_WRAP_xxx */
00328     int wrapArg;    /* Number of items, number of pixels */
00329 
00330     int totalWidth;    /* Max/Sum of all TreeRanges */
00331     int totalHeight;    /* Max/Sum of all TreeRanges */
00332 
00333     struct {
00334   Tcl_Obj *xObj;
00335   int x;      /* Window coords */
00336   int sx;      /* Window coords */
00337   int onScreen;
00338     } columnProxy;
00339 
00340     char *stateNames[32];  /* Names of static and dynamic item states */
00341 
00342     int scanX;      /* [scan mark] and [scan dragto] */
00343     int scanY;
00344     int scanXOrigin;
00345     int scanYOrigin;
00346 
00347     Tk_OptionTable styleOptionTable;
00348 #ifdef DEPRECATED
00349     struct {
00350   Tcl_Obj *stylesObj;
00351   TreeStyle *styles;
00352   int numStyles;
00353     } defaultStyle;
00354 #endif /* DEPRECATED */
00355     Tk_OptionTable itemOptionTable;
00356     int itemPrefixLen;    /* -itemprefix */
00357     int columnPrefixLen;  /* -columnprefix */
00358 #ifdef ALLOC_HAX
00359     ClientData allocData;
00360 #endif
00361     int preserveItemRefCnt;  /* Ref count so items-in-use aren't freed. */
00362     TreeItemList preserveItemList;  /* List of items to be deleted when
00363          * preserveItemRefCnt==0. */
00364 
00365     struct {
00366   Tcl_Obj *yObj;
00367   int y;      /* Window coords */
00368   int sy;      /* Window coords */
00369   int onScreen;
00370     } rowProxy;
00371 
00372     char *optionHax[64];  /* Used by OptionHax_xxx */
00373     int optionHaxCnt;    /* Used by OptionHax_xxx */
00374 
00375     TreeThemeData themeData;
00376 };
00377 
00378 #define TREE_CONF_FONT 0x0001
00379 #define TREE_CONF_ITEMSIZE 0x0002
00380 #define TREE_CONF_INDENT 0x0004
00381 #define TREE_CONF_WRAP 0x0008
00382 #define TREE_CONF_BUTIMG 0x0010
00383 #define TREE_CONF_BUTBMP 0x0020
00384 /* ... */
00385 #define TREE_CONF_RELAYOUT 0x0100
00386 #define TREE_CONF_REDISPLAY 0x0200
00387 #define TREE_CONF_FG 0x0400
00388 #define TREE_CONF_PROXY 0x0800
00389 #define TREE_CONF_BUTTON 0x1000
00390 #define TREE_CONF_LINE 0x2000
00391 #define TREE_CONF_DEFSTYLE 0x4000
00392 #define TREE_CONF_BG_IMAGE 0x8000
00393 #define TREE_CONF_THEME 0x00010000
00394 
00395 extern void Tree_AddItem(TreeCtrl *tree, TreeItem item);
00396 extern void Tree_RemoveItem(TreeCtrl *tree, TreeItem item);
00397 extern Tk_Image Tree_GetImage(TreeCtrl *tree, char *imageName);
00398 extern void Tree_FreeImage(TreeCtrl *tree, Tk_Image image);
00399 extern void Tree_UpdateScrollbarX(TreeCtrl *tree);
00400 extern void Tree_UpdateScrollbarY(TreeCtrl *tree);
00401 extern void Tree_AddToSelection(TreeCtrl *tree, TreeItem item);
00402 extern void Tree_RemoveFromSelection(TreeCtrl *tree, TreeItem item);
00403 extern void Tree_PreserveItems(TreeCtrl *tree);
00404 extern void Tree_ReleaseItems(TreeCtrl *tree);
00405 
00406 #define STATE_OP_ON  0
00407 #define STATE_OP_OFF  1
00408 #define STATE_OP_TOGGLE  2
00409 #define SFO_NOT_OFF  0x0001
00410 #define SFO_NOT_TOGGLE  0x0002
00411 #define SFO_NOT_STATIC  0x0004
00412 extern int Tree_StateFromObj(TreeCtrl *tree, Tcl_Obj *obj, int states[3], int *indexPtr, int flags);
00413 extern int Tree_StateFromListObj(TreeCtrl *tree, Tcl_Obj *obj, int states[3], int flags);
00414 
00415 #define Tree_BorderLeft(tree) \
00416     tree->inset
00417 #define Tree_BorderTop(tree) \
00418     tree->inset
00419 #define Tree_BorderRight(tree) \
00420     (Tk_Width(tree->tkwin) - tree->inset)
00421 #define Tree_BorderBottom(tree) \
00422     (Tk_Height(tree->tkwin) - tree->inset)
00423 
00424 #define Tree_HeaderLeft(tree) \
00425     Tree_BorderLeft(tree)
00426 #define Tree_HeaderTop(tree) \
00427     Tree_BorderTop(tree)
00428 #define Tree_HeaderRight(tree) \
00429     Tree_BorderRight(tree)
00430 #define Tree_HeaderBottom(tree) \
00431     (Tree_BorderTop(tree) + Tree_HeaderHeight(tree))
00432 #define Tree_HeaderWidth(tree) \
00433     (Tree_HeaderRight(tree) - Tree_HeaderLeft(tree))
00434 
00435 #define Tree_ContentLeft(tree) \
00436     (Tree_BorderLeft(tree) + Tree_WidthOfLeftColumns(tree))
00437 #define Tree_ContentTop(tree) \
00438     (Tree_BorderTop(tree) + Tree_HeaderHeight(tree))
00439 #define Tree_ContentRight(tree) \
00440     (Tree_BorderRight(tree) - Tree_WidthOfRightColumns(tree))
00441 #define Tree_ContentBottom(tree) \
00442     Tree_BorderBottom(tree)
00443 
00444 #define Tree_ContentWidth(tree) \
00445     (Tree_ContentRight(tree) - Tree_ContentLeft(tree))
00446 #define Tree_ContentHeight(tree) \
00447     (Tree_ContentBottom(tree) - Tree_ContentTop(tree))
00448 
00449 /* tkTreeItem.c */
00450 
00451 #define ITEM_ALL ((TreeItem) -1)
00452 #define IFO_NOT_MANY  0x0001  /* ItemFromObj flag: > 1 item is not ok */
00453 #define IFO_NOT_NULL  0x0002  /* ItemFromObj flag: can't be NULL */
00454 #define IFO_NOT_ROOT  0x0004  /* ItemFromObj flag: "root" is forbidden */
00455 #define IFO_NOT_ORPHAN  0x0008  /* ItemFromObj flag: item must have a parent */
00456 #define IFO_LIST_ALL  0x0010  /* ItemFromObj flag: return "all" as list */
00457 extern int TreeItemList_FromObj(TreeCtrl *tree, Tcl_Obj *objPtr, TreeItemList *items, int flags);
00458 extern int TreeItem_FromObj(TreeCtrl *tree, Tcl_Obj *objPtr, TreeItem *itemPtr, int flags);
00459 
00460 typedef struct ItemForEach ItemForEach;
00461 struct ItemForEach {
00462     TreeCtrl *tree;
00463     int error;
00464     int all;
00465     Tcl_HashSearch search;
00466     TreeItem last;
00467     TreeItem item;
00468     TreeItemList *items;
00469     int index;
00470 };
00471 extern TreeItem ItemForEach_Start(TreeItemList *items, TreeItemList *item2s,
00472     ItemForEach *iter);
00473 extern TreeItem ItemForEach_Next(ItemForEach *iter);
00474 #define ITEM_FOR_EACH(item, items, item2s, iter) \
00475     for (item = ItemForEach_Start(items, item2s, iter); \
00476    item != NULL; \
00477    item = ItemForEach_Next(iter))
00478 
00479 extern void FormatResult(Tcl_Interp *interp, char *fmt, ...);
00480 extern void DStringAppendf(Tcl_DString *dString, char *fmt, ...);
00481 extern void Tree_Debug(TreeCtrl *tree);
00482 
00483 extern int TreeItem_Init(TreeCtrl *tree);
00484 extern int TreeItem_Debug(TreeCtrl *tree, TreeItem item);
00485 extern void TreeItem_OpenClose(TreeCtrl *tree, TreeItem item, int mode);
00486 extern void TreeItem_Delete(TreeCtrl *tree, TreeItem item);
00487 extern int TreeItem_Deleted(TreeCtrl *tree, TreeItem item);
00488 
00489 #define STATE_OPEN  0x0001
00490 #define STATE_SELECTED  0x0002
00491 #define STATE_ENABLED  0x0004
00492 #define STATE_ACTIVE  0x0008
00493 #define STATE_FOCUS  0x0010
00494 #define STATE_USER  6    /* first user bit */
00495 extern int TreeItem_GetState(TreeCtrl *tree, TreeItem item_);
00496 
00497 #define CS_DISPLAY 0x01
00498 #define CS_LAYOUT 0x02
00499 extern int TreeItem_ChangeState(TreeCtrl *tree, TreeItem item_, int stateOff, int stateOn);
00500 
00501 extern void TreeItem_UndefineState(TreeCtrl *tree, TreeItem item_, int state);
00502 
00503 extern int TreeItem_GetButton(TreeCtrl *tree, TreeItem item_);
00504 extern int TreeItem_GetDepth(TreeCtrl *tree, TreeItem item_);
00505 extern int TreeItem_GetID(TreeCtrl *tree, TreeItem item_);
00506 extern int TreeItem_SetID(TreeCtrl *tree, TreeItem item_, int id);
00507 extern int TreeItem_GetEnabled(TreeCtrl *tree, TreeItem item_);
00508 extern int TreeItem_GetSelected(TreeCtrl *tree, TreeItem item_);
00509 extern TreeItem TreeItem_GetParent(TreeCtrl *tree, TreeItem item);
00510 extern TreeItem TreeItem_GetNextSibling(TreeCtrl *tree, TreeItem item);
00511 extern TreeItem TreeItem_NextSiblingVisible(TreeCtrl *tree, TreeItem item);
00512 extern void TreeItem_SetDInfo(TreeCtrl *tree, TreeItem item, TreeItemDInfo dInfo);
00513 extern TreeItemDInfo TreeItem_GetDInfo(TreeCtrl *tree, TreeItem item);
00514 extern void TreeItem_SetRInfo(TreeCtrl *tree, TreeItem item, TreeItemRInfo rInfo);
00515 extern TreeItemRInfo TreeItem_GetRInfo(TreeCtrl *tree, TreeItem item);
00516 
00517 extern void TreeItem_AppendChild(TreeCtrl *tree, TreeItem self, TreeItem child);
00518 extern void TreeItem_RemoveFromParent(TreeCtrl *tree, TreeItem self);
00519 extern int TreeItem_FirstAndLast(TreeCtrl *tree, TreeItem *first, TreeItem *last);
00520 extern void TreeItem_ListDescendants(TreeCtrl *tree, TreeItem item_, TreeItemList *items);
00521 extern int TreeItem_Height(TreeCtrl *tree, TreeItem self);
00522 extern int TreeItem_TotalHeight(TreeCtrl *tree, TreeItem self);
00523 extern void TreeItem_InvalidateHeight(TreeCtrl *tree, TreeItem self);
00524 extern void TreeItem_SpansInvalidate(TreeCtrl *tree, TreeItem item_);
00525 extern int *TreeItem_GetSpans(TreeCtrl *tree, TreeItem item_);
00526 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);
00527 extern void TreeItem_DrawLines(TreeCtrl *tree, TreeItem self, int x, int y, int width, int height, Drawable drawable);
00528 extern void TreeItem_DrawButton(TreeCtrl *tree, TreeItem self, int x, int y, int width, int height, Drawable drawable);
00529 extern int TreeItem_ReallyVisible(TreeCtrl *tree, TreeItem self);
00530 extern void TreeItem_FreeResources(TreeCtrl *tree, TreeItem self);
00531 extern void TreeItem_Release(TreeCtrl *tree, TreeItem item);
00532 extern TreeItem TreeItem_RootAncestor(TreeCtrl *tree, TreeItem item_);
00533 extern int TreeItem_IsAncestor(TreeCtrl *tree, TreeItem item1, TreeItem item2);
00534 extern Tcl_Obj *TreeItem_ToObj(TreeCtrl *tree, TreeItem item);
00535 extern void TreeItem_ToIndex(TreeCtrl *tree, TreeItem item, int *absolute, int *visible);
00536 extern TreeItem TreeItem_Next(TreeCtrl *tree, TreeItem item);
00537 extern TreeItem TreeItem_NextVisible(TreeCtrl *tree, TreeItem item);
00538 extern TreeItem TreeItem_Prev(TreeCtrl *tree, TreeItem item);
00539 extern TreeItem TreeItem_PrevVisible(TreeCtrl *tree, TreeItem item);
00540 extern void TreeItem_Identify(TreeCtrl *tree, TreeItem item_, int lock, int x, int y, char *buf);
00541 extern void TreeItem_Identify2(TreeCtrl *tree, TreeItem item_,
00542   int x1, int y1, int x2, int y2, Tcl_Obj *listObj);
00543 extern int TreeItem_GetRects(TreeCtrl *tree, TreeItem item_,
00544     TreeColumn treeColumn, int objc, Tcl_Obj *CONST objv[], XRectangle rects[]);
00545 extern int TreeItem_Indent(TreeCtrl *tree, TreeItem item_);
00546 extern void Tree_UpdateItemIndex(TreeCtrl *tree);
00547 extern void Tree_DeselectHidden(TreeCtrl *tree);
00548 extern int TreeItemCmd(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]);
00549 extern void TreeItem_UpdateWindowPositions(TreeCtrl *tree, TreeItem item_,
00550     int lock, int x, int y, int width, int height);
00551 extern void TreeItem_OnScreen(TreeCtrl *tree, TreeItem item_, int onScreen);
00552 
00553 extern TreeItemColumn TreeItem_GetFirstColumn(TreeCtrl *tree, TreeItem item);
00554 extern TreeItemColumn TreeItemColumn_GetNext(TreeCtrl *tree, TreeItemColumn column);
00555 extern void TreeItemColumn_InvalidateSize(TreeCtrl *tree, TreeItemColumn column);
00556 extern TreeStyle TreeItemColumn_GetStyle(TreeCtrl *tree, TreeItemColumn column);
00557 extern int TreeItemColumn_Index(TreeCtrl *tree, TreeItem item_, TreeItemColumn column_);
00558 extern void TreeItemColumn_ForgetStyle(TreeCtrl *tree, TreeItemColumn column_);
00559 extern int TreeItemColumn_NeededWidth(TreeCtrl *tree, TreeItem item_, TreeItemColumn column_);
00560 extern TreeItemColumn TreeItem_FindColumn(TreeCtrl *tree, TreeItem item, int columnIndex);
00561 extern int TreeItem_ColumnFromObj(TreeCtrl *tree, TreeItem item, Tcl_Obj *obj, TreeItemColumn *columnPtr, int *indexPtr);
00562 extern void TreeItem_RemoveColumns(TreeCtrl *tree, TreeItem item_, int first, int last);
00563 extern void TreeItem_RemoveAllColumns(TreeCtrl *tree, TreeItem item_);
00564 extern void TreeItem_MoveColumn(TreeCtrl *tree, TreeItem item_, int columnIndex, int beforeIndex);
00565 
00566 /* tkTreeElem.c */
00567 extern int TreeElement_Init(Tcl_Interp *interp);
00568 extern int TreeStateFromObj(TreeCtrl *tree, Tcl_Obj *obj, int *stateOff, int *stateOn);
00569 extern int StringTableCO_Init(Tk_OptionSpec *optionTable, CONST char *optionName, CONST char **tablePtr);
00570 
00571 typedef struct StyleDrawArgs StyleDrawArgs;
00572 struct StyleDrawArgs
00573 {
00574     TreeCtrl *tree;
00575     TreeStyle style;
00576     int indent;
00577     int x;
00578     int y;
00579     int width;
00580     int height;
00581     Drawable drawable;
00582     int state;    /* STATE_xxx */
00583     Tk_Justify justify;
00584     int bounds[4];
00585 };
00586 
00587 /* tkTreeStyle.c */
00588 extern int TreeStyle_Init(TreeCtrl *tree);
00589 extern int TreeStyle_NeededWidth(TreeCtrl *tree, TreeStyle style_, int state);
00590 extern int TreeStyle_NeededHeight(TreeCtrl *tree, TreeStyle style_, int state);
00591 extern int TreeStyle_UseHeight(StyleDrawArgs *drawArgs);
00592 extern void TreeStyle_Draw(StyleDrawArgs *args);
00593 extern void TreeStyle_FreeResources(TreeCtrl *tree, TreeStyle style_);
00594 extern void TreeStyle_Free(TreeCtrl *tree);
00595 extern int TreeElement_FromObj(TreeCtrl *tree, Tcl_Obj *obj, TreeElement *elemPtr);
00596 extern int TreeElement_IsType(TreeCtrl *tree, TreeElement elem_, CONST char *type);
00597 extern int TreeStyle_FromObj(TreeCtrl *tree, Tcl_Obj *obj, TreeStyle *stylePtr);
00598 extern Tcl_Obj *TreeStyle_ToObj(TreeStyle style_);
00599 extern Tcl_Obj *TreeStyle_GetImage(TreeCtrl *tree, TreeStyle style_);
00600 extern Tcl_Obj *TreeStyle_GetText(TreeCtrl *tree, TreeStyle style_);
00601 extern int TreeStyle_SetImage(TreeCtrl *tree, TreeItem item, TreeItemColumn column, TreeStyle style_, Tcl_Obj *textObj);
00602 extern int TreeStyle_SetText(TreeCtrl *tree, TreeItem item, TreeItemColumn column, TreeStyle style_, Tcl_Obj *textObj);
00603 extern int TreeStyle_FindElement(TreeCtrl *tree, TreeStyle style_, TreeElement elem_, int *index);
00604 extern TreeStyle TreeStyle_NewInstance(TreeCtrl *tree, TreeStyle master);
00605 extern int TreeStyle_ElementActual(TreeCtrl *tree, TreeStyle style_, int state, Tcl_Obj *elemObj, Tcl_Obj *obj);
00606 extern int TreeStyle_ElementCget(TreeCtrl *tree, TreeItem item, TreeItemColumn column, TreeStyle style_, Tcl_Obj *elemObj, Tcl_Obj *obj);
00607 extern int TreeStyle_ElementConfigure(TreeCtrl *tree, TreeItem item, TreeItemColumn column, TreeStyle style_, Tcl_Obj *elemObj, int objc, Tcl_Obj **objv, int *eMask);
00608 extern void TreeStyle_ListElements(TreeCtrl *tree, TreeStyle style_);
00609 extern TreeStyle TreeStyle_GetMaster(TreeCtrl *tree, TreeStyle style_);
00610 extern char *TreeStyle_Identify(StyleDrawArgs *drawArgs, int x, int y);
00611 extern void TreeStyle_Identify2(StyleDrawArgs *drawArgs,
00612   int x1, int y1, int x2, int y2, Tcl_Obj *listObj);
00613 extern int TreeStyle_Remap(TreeCtrl *tree, TreeStyle styleFrom_, TreeStyle styleTo_, int objc, Tcl_Obj *CONST objv[]);
00614 extern void TreeStyle_TreeChanged(TreeCtrl *tree, int flagT);
00615 #define SORT_ASCII 0
00616 #define SORT_DICT  1
00617 #define SORT_DOUBLE 2
00618 #define SORT_LONG 3
00619 #define SORT_COMMAND 4
00620 extern int TreeStyle_GetSortData(TreeCtrl *tree, TreeStyle style_, int elemIndex, int type, long *lv, double *dv, char **sv);
00621 #if 0
00622 extern int TreeStyle_ValidateElements(TreeCtrl *tree, TreeStyle style_, int objc, Tcl_Obj *CONST objv[]);
00623 #endif
00624 extern int TreeStyle_GetElemRects(StyleDrawArgs *drawArgs, int objc, Tcl_Obj *CONST objv[], XRectangle rects[]);
00625 extern int TreeElementCmd(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]);
00626 extern int TreeStyleCmd(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]);
00627 extern int TreeStyle_ChangeState(TreeCtrl *tree, TreeStyle style_, int state1, int state2);
00628 extern void Tree_UndefineState(TreeCtrl *tree, int state);
00629 extern int TreeStyle_NumElements(TreeCtrl *tree, TreeStyle style_);
00630 extern void TreeStyle_UpdateWindowPositions(StyleDrawArgs *drawArgs);
00631 extern void TreeStyle_OnScreen(TreeCtrl *tree, TreeStyle style_, int onScreen);
00632 
00633 extern int ButtonMaxWidth(TreeCtrl *tree);
00634 extern int ButtonHeight(TreeCtrl *tree, int state);
00635 
00636 /* tkTreeNotify.c */
00637 extern int TreeNotify_Init(TreeCtrl *tree);
00638 extern void TreeNotify_OpenClose(TreeCtrl *tree, TreeItem item, int isOpen, int before);
00639 extern void TreeNotify_Selection(TreeCtrl *tree, TreeItemList *select, TreeItemList *deselect);
00640 extern int TreeNotifyCmd(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]);
00641 extern void TreeNotify_ActiveItem(TreeCtrl *tree, TreeItem itemOld, TreeItem itemNew);
00642 extern void TreeNotify_Scroll(TreeCtrl *tree, double fractions[2], int vertical);
00643 extern void TreeNotify_ItemDeleted(TreeCtrl *tree, TreeItemList *items);
00644 extern void TreeNotify_ItemVisibility(TreeCtrl *tree, TreeItemList *v, TreeItemList *h);
00645 
00646 /* tkTreeColumn.c */
00647 extern int TreeColumn_InitInterp(Tcl_Interp *interp);
00648 extern void Tree_InitColumns(TreeCtrl *tree);
00649 extern TreeColumn Tree_FindColumn(TreeCtrl *tree, int columnIndex);
00650 
00651 #define COLUMN_ALL ((TreeColumn) -1)  /* Every column. */
00652 #define COLUMN_NTAIL ((TreeColumn) -2)  /* Every column but the tail. */
00653 #define CFO_NOT_MANY 0x01
00654 #define CFO_NOT_NULL 0x02
00655 #define CFO_NOT_TAIL 0x04
00656 #define CFO_LIST_ALL 0x08
00657 extern int TreeColumnList_FromObj(TreeCtrl *tree, Tcl_Obj *objPtr, TreeColumnList *columns, int flags);
00658 extern int TreeColumn_FromObj(TreeCtrl *tree, Tcl_Obj *objPtr, TreeColumn *columnPtr, int flags);
00659 
00660 typedef struct ColumnForEach ColumnForEach;
00661 struct ColumnForEach {
00662     TreeCtrl *tree;
00663     int error;
00664     int all;
00665     int ntail;
00666     TreeColumn current;
00667     TreeColumn next;
00668     TreeColumn last;
00669     TreeColumnList *list;
00670     int index;
00671 };
00672 extern TreeColumn ColumnForEach_Start(TreeColumnList *columns,
00673     TreeColumnList *column2s, ColumnForEach *iter);
00674 extern TreeColumn ColumnForEach_Next(ColumnForEach *iter);
00675 #define COLUMN_FOR_EACH(column, columns, column2s, iter) \
00676     for (column = ColumnForEach_Start(columns, column2s, iter); \
00677    column != NULL; \
00678    column = ColumnForEach_Next(iter))
00679     
00680 extern Tcl_Obj *TreeColumn_ToObj(TreeCtrl *tree, TreeColumn column_);
00681 extern int TreeColumnCmd(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]);
00682 extern int TreeColumn_GetID(TreeColumn column_);
00683 extern int TreeColumn_Index(TreeColumn column_);
00684 extern TreeColumn TreeColumn_Next(TreeColumn column_);
00685 extern TreeColumn TreeColumn_Prev(TreeColumn column_);
00686 extern int TreeColumn_FixedWidth(TreeColumn column_);
00687 extern int TreeColumn_MinWidth(TreeColumn column_);
00688 extern int TreeColumn_MaxWidth(TreeColumn column_);
00689 extern int TreeColumn_NeededWidth(TreeColumn column_);
00690 extern int TreeColumn_UseWidth(TreeColumn column_);
00691 extern int TreeColumn_Offset(TreeColumn column_);
00692 extern Tk_Justify TreeColumn_Justify(TreeColumn column_);
00693 #ifdef DEPRECATED
00694 extern int TreeColumn_WidthHack(TreeColumn column_);
00695 extern int TreeColumn_StepWidth(TreeColumn column_);
00696 #endif
00697 extern TreeStyle TreeColumn_ItemStyle(TreeColumn column_);
00698 extern void TreeColumn_StyleDeleted(TreeColumn column_, TreeStyle style);
00699 extern int TreeColumn_Visible(TreeColumn column_);
00700 extern int TreeColumn_Squeeze(TreeColumn column_);
00701 extern int TreeColumn_BackgroundCount(TreeColumn column_);
00702 extern GC TreeColumn_BackgroundGC(TreeColumn column_, int which);
00703 extern void Tree_DrawHeader(TreeCtrl *tree, Drawable drawable, int x, int y);
00704 extern int TreeColumn_WidthOfItems(TreeColumn column_);
00705 extern void TreeColumn_InvalidateWidth(TreeColumn column_);
00706 extern void TreeColumn_Init(TreeCtrl *tree);
00707 extern void Tree_FreeColumns(TreeCtrl *tree);
00708 extern void Tree_InvalidateColumnWidth(TreeCtrl *tree, TreeColumn column);
00709 extern void Tree_InvalidateColumnHeight(TreeCtrl *tree, TreeColumn column);
00710 extern int Tree_HeaderHeight(TreeCtrl *tree);
00711 extern int TreeColumn_Bbox(TreeColumn column, int *x, int *y, int *w, int *h);
00712 extern TreeColumn Tree_HeaderUnderPoint(TreeCtrl *tree, int *x_, int *y_, int *w, int *h, int nearest);
00713 extern int TreeColumn_Lock(TreeColumn column_);
00714 extern int Tree_WidthOfColumns(TreeCtrl *tree);
00715 extern int Tree_WidthOfLeftColumns(TreeCtrl *tree);
00716 extern int Tree_WidthOfRightColumns(TreeCtrl *tree);
00717 extern void TreeColumn_TreeChanged(TreeCtrl *tree, int flagT);
00718 
00719 /* tkTreeDrag.c */
00720 extern int TreeDragImage_Init(TreeCtrl *tree);
00721 extern void TreeDragImage_Free(TreeDragImage dragImage_);
00722 extern void TreeDragImage_Display(TreeDragImage dragImage_);
00723 extern void TreeDragImage_Undisplay(TreeDragImage dragImage_);
00724 extern void TreeDragImage_Draw(TreeDragImage dragImage_, Drawable drawable, int x, int y);
00725 extern int DragImageCmd(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]);
00726 
00727 /* tkTreeMarquee.c */
00728 extern int TreeMarquee_Init(TreeCtrl *tree);
00729 extern void TreeMarquee_Free(TreeMarquee marquee_);
00730 extern void TreeMarquee_Draw(TreeMarquee marquee_, Drawable drawable, int x, int y);
00731 extern void TreeMarquee_Display(TreeMarquee marquee_);
00732 extern void TreeMarquee_Undisplay(TreeMarquee marquee_);
00733 extern int TreeMarqueeCmd(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]);
00734 
00735 /* tkTreeDisplay.c */
00736 extern int Tree_TotalWidth(TreeCtrl *tree);
00737 extern int Tree_TotalHeight(TreeCtrl *tree);
00738 extern TreeItem Tree_ItemUnderPoint(TreeCtrl *tree, int *x, int *y, int nearest);
00739 extern void Tree_FreeItemRInfo(TreeCtrl *tree, TreeItem item);
00740 extern int Tree_ItemBbox(TreeCtrl *tree, TreeItem item, int lock, int *x, int *y, int *w, int *h);
00741 extern TreeItem Tree_ItemAbove(TreeCtrl *tree, TreeItem item);
00742 extern TreeItem Tree_ItemBelow(TreeCtrl *tree, TreeItem item);
00743 extern TreeItem Tree_ItemLeft(TreeCtrl *tree, TreeItem item);
00744 extern TreeItem Tree_ItemRight(TreeCtrl *tree, TreeItem item);
00745 extern TreeItem Tree_ItemTop(TreeCtrl *tree, TreeItem item);
00746 extern TreeItem Tree_ItemBottom(TreeCtrl *tree, TreeItem item);
00747 extern TreeItem Tree_ItemLeftMost(TreeCtrl *tree, TreeItem item);
00748 extern TreeItem Tree_ItemRightMost(TreeCtrl *tree, TreeItem item);
00749 extern int Tree_ItemToRNC(TreeCtrl *tree, TreeItem item, int *row, int *col);
00750 extern TreeItem Tree_RNCToItem(TreeCtrl *tree, int row, int col);
00751 extern int Tree_AreaBbox(TreeCtrl *tree, int area, int *x1_, int *y1_, int *x2_, int *y2_);
00752 
00753 enum {
00754 TREE_AREA_NONE = 0,
00755 TREE_AREA_HEADER,
00756 TREE_AREA_CONTENT,
00757 TREE_AREA_LEFT,
00758 TREE_AREA_RIGHT
00759 };
00760 extern int Tree_HitTest(TreeCtrl *tree, int x, int y);
00761 
00762 extern void TreeDInfo_Init(TreeCtrl *tree);
00763 extern void TreeDInfo_Free(TreeCtrl *tree);
00764 extern void Tree_EventuallyRedraw(TreeCtrl *tree);
00765 extern void Tree_GetScrollFractionsX(TreeCtrl *tree, double fractions[2]);
00766 extern void Tree_GetScrollFractionsY(TreeCtrl *tree, double fractions[2]);
00767 extern int Increment_FindX(TreeCtrl *tree, int offset);
00768 extern int Increment_FindY(TreeCtrl *tree, int offset);
00769 extern int Increment_ToOffsetX(TreeCtrl *tree, int index);
00770 extern int Increment_ToOffsetY(TreeCtrl *tree, int index);
00771 extern int B_XviewCmd(TreeCtrl *tree, int objc, Tcl_Obj *CONST objv[]);
00772 extern int B_YviewCmd(TreeCtrl *tree, int objc, Tcl_Obj *CONST objv[]);
00773 extern void Tree_SetOriginX(TreeCtrl *tree, int xOrigin);
00774 extern void Tree_SetOriginY(TreeCtrl *tree, int yOrigin);
00775 extern void Tree_RelayoutWindow(TreeCtrl *tree);
00776 extern void Tree_FreeItemDInfo(TreeCtrl *tree, TreeItem item1, TreeItem item2);
00777 extern void Tree_InvalidateItemDInfo(TreeCtrl *tree, TreeColumn column, TreeItem item1, TreeItem item2);
00778 extern void TreeDisplay_ItemDeleted(TreeCtrl *tree, TreeItem item);
00779 extern void TreeDisplay_ColumnDeleted(TreeCtrl *tree, TreeColumn column);
00780 extern void TreeDisplay_GetReadyForTrouble(TreeCtrl *tree, int *requestsPtr);
00781 extern int TreeDisplay_WasThereTrouble(TreeCtrl *tree, int requests);
00782 extern void Tree_InvalidateArea(TreeCtrl *tree, int x1, int y1, int x2, int y2);
00783 extern void Tree_InvalidateItemArea(TreeCtrl *tree, int x1, int y1, int x2, int y2);
00784 extern void Tree_InvalidateRegion(TreeCtrl *tree, TkRegion region);
00785 extern void Tree_RedrawArea(TreeCtrl *tree, int x1, int y1, int x2, int y2);
00786 extern void Tree_FocusChanged(TreeCtrl *tree, int gotFocus);
00787 extern void Tree_Activate(TreeCtrl *tree, int isActive);
00788 extern void Tree_ItemsInArea(TreeCtrl *tree, TreeItemList *items, int minX, int minY, int maxX, int maxY);
00789 extern void TreeColumnProxy_Undisplay(TreeCtrl *tree);
00790 extern void TreeColumnProxy_Display(TreeCtrl *tree);
00791 extern void TreeRowProxy_Undisplay(TreeCtrl *tree);
00792 extern void TreeRowProxy_Display(TreeCtrl *tree);
00793 extern void Tree_DrawTiledImage(TreeCtrl *tree, Drawable drawable, Tk_Image image, 
00794     int x1, int y1, int x2, int y2, int xOffset, int yOffset);
00795 
00796 #define DINFO_OUT_OF_DATE 0x0001
00797 #define DINFO_CHECK_COLUMN_WIDTH 0x0002
00798 #define DINFO_DRAW_HEADER 0x0004
00799 #define DINFO_SET_ORIGIN_X 0x0008
00800 #define DINFO_UPDATE_SCROLLBAR_X 0x0010
00801 #define DINFO_REDRAW_PENDING 0x00020
00802 #define DINFO_INVALIDATE 0x0040
00803 #define DINFO_DRAW_HIGHLIGHT 0x0080
00804 #define DINFO_DRAW_BORDER 0x0100
00805 #define DINFO_REDO_RANGES 0x0200
00806 #define DINFO_SET_ORIGIN_Y 0x0400
00807 #define DINFO_UPDATE_SCROLLBAR_Y 0x0800
00808 #define DINFO_REDO_INCREMENTS 0x1000
00809 #define DINFO_REDO_COLUMN_WIDTH 0x2000
00810 #define DINFO_REDO_SELECTION 0x4000
00811 #define DINFO_DRAW_WHITESPACE 0x8000
00812 extern void Tree_DInfoChanged(TreeCtrl *tree, int flags);
00813 
00814 extern void Tree_TheWorldHasChanged(Tcl_Interp *interp);
00815 
00816 /* tkTreeTheme.c */
00817 extern int TreeTheme_InitInterp(Tcl_Interp *interp);
00818 extern void TreeTheme_ThemeChanged(TreeCtrl *tree);
00819 extern int TreeTheme_Init(TreeCtrl *tree);
00820 extern int TreeTheme_Free(TreeCtrl *tree);
00821 extern int TreeTheme_DrawHeaderItem(TreeCtrl *tree, Drawable drawable, int state, int arrow, int x, int y, int width, int height);
00822 extern int TreeTheme_GetHeaderFixedHeight(TreeCtrl *tree, int *heightPtr);
00823 extern int TreeTheme_GetHeaderContentMargins(TreeCtrl *tree, int state, int arrow, int bounds[4]);
00824 extern int TreeTheme_DrawHeaderArrow(TreeCtrl *tree, Drawable drawable, int up, int x, int y, int width, int height);
00825 extern int TreeTheme_DrawButton(TreeCtrl *tree, Drawable drawable, int open, int x, int y, int width, int height);
00826 extern int TreeTheme_GetButtonSize(TreeCtrl *tree, Drawable drawable, int open, int *widthPtr, int *heightPtr);
00827 extern int TreeTheme_GetArrowSize(TreeCtrl *tree, Drawable drawable, int up, int *widthPtr, int *heightPtr);
00828 
00829 /* tkTreeUtils.c */
00830 #ifdef TREECTRL_DEBUG
00831 #define WIPE(p,s) memset((char *) p, 0xAA, s)
00832 #else
00833 #define WIPE(p,s)
00834 #endif
00835 #define CWIPE(p,t,c) WIPE(p, sizeof(t) * (c))
00836 #define WIPEFREE(p,s) { WIPE(p, s); ckfree((char *) p); }
00837 #define WFREE(p,t) WIPEFREE(p, sizeof(t))
00838 #define WCFREE(p,t,c) WIPEFREE(p, sizeof(t) * (c))
00839 
00840 extern int Ellipsis(Tk_Font tkfont, char *string, int numBytes, int *maxPixels, char *ellipsis, int force);
00841 extern void HDotLine(TreeCtrl *tree, Drawable drawable, GC gc, int x1, int y1, int x2);
00842 extern void VDotLine(TreeCtrl *tree, Drawable drawable, GC gc, int x1, int y1, int y2);
00843 extern void DotRect(TreeCtrl *tree, Drawable drawable, int x, int y, int width, int height);
00844 extern void DrawActiveOutline(TreeCtrl *tree, Drawable drawable, int x, int y, int width, int height, int open);
00845 typedef struct DotState
00846 {
00847     int stuff[10];
00848 } DotState;
00849 extern void DotRect_Setup(TreeCtrl *tree, Drawable drawable, DotState *dotState);
00850 extern void DotRect_Draw(DotState *dotState, int x, int y, int width, int height);
00851 extern void DotRect_Restore(DotState *dotState);
00852 typedef struct TextLayout_ *TextLayout;
00853 extern TextLayout TextLayout_Compute(Tk_Font tkfont, CONST char *string,
00854   int numChars, int wrapLength, Tk_Justify justify, int maxLines, int flags);
00855 extern void TextLayout_Free(TextLayout textLayout);
00856 extern void TextLayout_Size(TextLayout textLayout, int *widthPtr, int *heightPtr);
00857 extern int TextLayout_TotalWidth(TextLayout textLayout);
00858 extern void TextLayout_Draw(Display *display, Drawable drawable, GC gc,
00859   TextLayout layout, int x, int y, int firstChar, int lastChar,
00860   int underline);
00861 #ifdef MAC_OSX_TK
00862 extern void DrawXORLine(Display *display, Drawable drawable, int x1, int y1,
00863   int x2, int y2);
00864 #endif
00865 extern void Tree_DrawBitmapWithGC(TreeCtrl *tree, Pixmap bitmap, Drawable drawable,
00866   GC gc, int src_x, int src_y, int width, int height, int dest_x, int dest_y);
00867 extern void Tree_DrawBitmap(TreeCtrl *tree, Pixmap bitmap, Drawable drawable,
00868   XColor *fg, XColor *bg,
00869   int src_x, int src_y, int width, int height, int dest_x, int dest_y);
00870 extern void Tk_FillRegion(Display *display, Drawable drawable, GC gc, TkRegion rgn);
00871 extern void Tk_OffsetRegion(TkRegion region, int xOffset, int yOffset);
00872 extern int Tree_ScrollWindow(TreeCtrl *tree, GC gc, int x, int y,
00873   int width, int height, int dx, int dy, TkRegion damageRgn);
00874 extern void UnsetClipMask(TreeCtrl *tree, Drawable drawable, GC gc);
00875 extern void XImage2Photo(Tcl_Interp *interp, Tk_PhotoHandle photoH, XImage *ximage, int alpha);
00876 
00877 #define PAD_TOP_LEFT     0
00878 #define PAD_BOTTOM_RIGHT 1
00879 extern Tk_ObjCustomOption PadAmountOption;
00880 
00881 extern int       TreeCtrl_GetPadAmountFromObj(Tcl_Interp *interp,
00882   Tk_Window tkwin, Tcl_Obj *padObj,
00883   int *topLeftPtr, int *bottomRightPtr);
00884 extern Tcl_Obj * TreeCtrl_NewPadAmountObj(int *padAmounts);
00885 
00886 /*****/
00887 
00888 extern int ObjectIsEmpty(Tcl_Obj *obj);
00889 
00890 extern PerStateType pstBitmap;
00891 extern PerStateType pstBoolean;
00892 extern PerStateType pstBorder;
00893 extern PerStateType pstColor;
00894 extern PerStateType pstFont;
00895 extern PerStateType pstImage;
00896 extern PerStateType pstRelief;
00897 
00898 #define MATCH_NONE  0
00899 #define MATCH_ANY  1
00900 #define MATCH_PARTIAL  2
00901 #define MATCH_EXACT  3
00902 
00903 extern void PerStateInfo_Free(TreeCtrl *tree, PerStateType *typePtr,
00904     PerStateInfo *pInfo);
00905 typedef int (*StateFromObjProc)(TreeCtrl *tree, Tcl_Obj *obj, int *stateOff, int *stateOn);
00906 extern int PerStateInfo_FromObj(TreeCtrl *tree, StateFromObjProc proc,
00907     PerStateType *typePtr, PerStateInfo *pInfo);
00908 extern PerStateData *PerStateInfo_ForState(TreeCtrl *tree,
00909     PerStateType *typePtr, PerStateInfo *pInfo, int state, int *match);
00910 extern Tcl_Obj *PerStateInfo_ObjForState(TreeCtrl *tree, PerStateType *typePtr,
00911     PerStateInfo *pInfo, int state, int *match);
00912 extern int PerStateInfo_Undefine(TreeCtrl *tree, PerStateType *typePtr,
00913     PerStateInfo *pInfo, int state);
00914 
00915 struct PerStateGC
00916 {
00917     unsigned long mask;
00918     XGCValues gcValues;
00919     GC gc;
00920     struct PerStateGC *next;
00921 };
00922 extern void PerStateGC_Free(TreeCtrl *tree, struct PerStateGC **pGCPtr);
00923 extern GC PerStateGC_Get(TreeCtrl *tree, struct PerStateGC **pGCPtr, unsigned long mask, XGCValues *gcValues);
00924 
00925 extern Pixmap PerStateBitmap_ForState(TreeCtrl *tree, PerStateInfo *pInfo,
00926     int state, int *match);
00927 extern void PerStateBitmap_MaxSize(TreeCtrl *tree, PerStateInfo *pInfo,
00928     int *widthPtr, int *heightPtr);
00929 extern int PerStateBoolean_ForState(TreeCtrl *tree, PerStateInfo *pInfo,
00930     int state, int *match);
00931 extern Tk_3DBorder PerStateBorder_ForState(TreeCtrl *tree, PerStateInfo *pInfo,
00932     int state, int *match);
00933 extern XColor *PerStateColor_ForState(TreeCtrl *tree, PerStateInfo *pInfo,
00934     int state, int *match);
00935 extern Tk_Font PerStateFont_ForState(TreeCtrl *tree, PerStateInfo *pInfo,
00936     int state, int *match);
00937 extern Tk_Image PerStateImage_ForState(TreeCtrl *tree, PerStateInfo *pInfo,
00938     int state, int *match);
00939 extern void PerStateImage_MaxSize(TreeCtrl *tree, PerStateInfo *pInfo,
00940     int *widthPtr, int *heightPtr);
00941 extern int PerStateRelief_ForState(TreeCtrl *tree, PerStateInfo *pInfo,
00942     int state, int *match);
00943 
00944 extern void PSTSave(PerStateInfo *pInfo, PerStateInfo *pSave);
00945 extern void PSTRestore(TreeCtrl *tree, PerStateType *typePtr,
00946     PerStateInfo *pInfo, PerStateInfo *pSave);
00947 
00948 #ifdef ALLOC_HAX
00949 extern ClientData AllocHax_Init(void);
00950 extern void AllocHax_Finalize(ClientData data);
00951 extern char *AllocHax_Alloc(ClientData data, Tk_Uid id, int size);
00952 extern char *AllocHax_CAlloc(ClientData data, Tk_Uid id, int size, int count, int roundUp);
00953 extern char *AllocHax_Realloc(ClientData data, Tk_Uid id, char *ptr, int size1, int size2);
00954 extern void AllocHax_Free(ClientData data, Tk_Uid id, char *ptr, int size);
00955 extern void AllocHax_CFree(ClientData data, Tk_Uid id, char *ptr, int size, int count, int roundUp);
00956 extern void AllocHax_Stats(Tcl_Interp *interp, ClientData data);
00957 #endif
00958 
00959 /*****/
00960 
00961 extern void TreePtrList_Init(TreeCtrl *tree, TreePtrList *tilPtr, int count);
00962 extern ClientData *TreePtrList_Append(TreePtrList *tilPtr, ClientData ptr);
00963 extern ClientData *TreePtrList_Concat(TreePtrList *tilPtr, TreePtrList *til2Ptr);
00964 extern void TreePtrList_Free(TreePtrList *tilPtr);
00965 
00966 #define TreeItemList_Init TreePtrList_Init
00967 #define TreeItemList_Append TreePtrList_Append
00968 #define TreeItemList_Concat TreePtrList_Concat
00969 #define TreeItemList_Free TreePtrList_Free
00970 #define TreeItemList_Items(L) ((TreeItem *) (L)->pointers)
00971 #define TreeItemList_Nth(L,n) ((TreeItem) (L)->pointers[n])
00972 #define TreeItemList_Count(L) ((L)->count)
00973 extern void TreeItemList_Sort(TreeItemList *items);
00974 
00975 #define TreeColumnList_Init TreePtrList_Init
00976 #define TreeColumnList_Append TreePtrList_Append
00977 #define TreeColumnList_Concat TreePtrList_Concat
00978 #define TreeColumnList_Free TreePtrList_Free
00979 #define TreeColumnList_Nth(L,n) ((TreeColumn) (L)->pointers[n])
00980 #define TreeColumnList_Count(L) ((L)->count)
00981 
00982 /*****/
00983 
00984 /*
00985  * This structure holds a list of tags.
00986  */
00987 typedef struct TagInfo TagInfo;
00988 struct TagInfo {
00989     int numTags;    /* Number of tag slots actually used
00990             * at tagPtr. */
00991     int tagSpace;    /* Total amount of tag space available
00992             * at tagPtr. */
00993 #define TREE_TAG_SPACE 3
00994     Tk_Uid tagPtr[TREE_TAG_SPACE]; /* Array of tags. The actual size will
00995             * be tagSpace. THIS FIELD MUST BE THE
00996             * LAST IN THE STRUCTURE. */
00997 };
00998 
00999 extern TagInfo *TagInfo_Add(TreeCtrl *tree, TagInfo *tagInfo, Tk_Uid tags[], int numTags);
01000 extern TagInfo *TagInfo_Remove(TreeCtrl *tree, TagInfo *tagInfo, Tk_Uid tags[], int numTags);
01001 extern Tk_Uid *TagInfo_Names(TreeCtrl *tree, TagInfo *tagInfo, Tk_Uid *tags, int *numTagsPtr, int *tagSpacePtr);
01002 extern TagInfo *TagInfo_Copy(TreeCtrl *tree, TagInfo *tagInfo);
01003 extern void TagInfo_Free(TreeCtrl *tree, TagInfo *tagInfo);
01004 extern int TagInfo_FromObj(TreeCtrl *tree, Tcl_Obj *objPtr, TagInfo **tagInfoPtr);
01005 extern Tk_ObjCustomOption TagInfoCO;
01006 
01007 /*
01008  * This struct holds information about a tag expression.
01009  */
01010 typedef struct TagExpr {
01011     TreeCtrl *tree;
01012 
01013     Tk_Uid *uids;    /* expresion compiled to an array of uids */
01014     Tk_Uid staticUids[15];
01015     int allocated;    /* available space for array of uids */
01016     int length;      /* number of uids */
01017     int index;      /* current position in expression evaluation */
01018 
01019     int simple;      /* TRUE if expr is single tag */
01020     Tk_Uid uid;      /* single tag if 'simple' is TRUE */
01021 
01022     char *string;    /* tag expression string */
01023     int stringIndex;    /* current position in string scan */
01024     int stringLength;    /* length of tag expression string */
01025 
01026     char *rewritebuffer;  /* tag string (after removing escapes) */
01027     char staticRWB[100];
01028 } TagExpr;
01029 
01030 extern int TagExpr_Init(TreeCtrl *tree, Tcl_Obj *exprObj, TagExpr *expr);
01031 extern int TagExpr_Scan(TagExpr *expr);
01032 extern int TagExpr_Eval(TagExpr *expr, TagInfo *tags);
01033 extern void TagExpr_Free(TagExpr *expr);
01034 
01035 extern Tk_OptionSpec *OptionSpec_Find(Tk_OptionSpec *optionTable, CONST char *optionName);
01036     
01037 extern Tk_ObjCustomOption *PerStateCO_Alloc(CONST char *optionName,
01038     PerStateType *typePtr, StateFromObjProc proc);
01039 extern int PerStateCO_Init(Tk_OptionSpec *optionTable, CONST char *optionName,
01040     PerStateType *typePtr, StateFromObjProc proc);
01041 
01042 /*****/
01043 
01044 typedef struct DynamicOptionSpec DynamicOptionSpec;
01045 typedef struct DynamicOption DynamicOption;
01046 
01047 struct DynamicOption
01048 {
01049     int id;      /* Unique id. */
01050     DynamicOption *next;  /* Linked list. */
01051     char data[1];    /* Actual size will be > 1 */
01052 };
01053 
01054 typedef void (DynamicOptionInitProc)(char *data);
01055 
01056 extern DynamicOption *DynamicOption_AllocIfNeeded(TreeCtrl *tree,
01057     DynamicOption **firstPtr, int id, int size, DynamicOptionInitProc *init);
01058 extern char *DynamicOption_FindData(DynamicOption *first, int id);
01059 extern void DynamicOption_Free(TreeCtrl *tree, DynamicOption *first,
01060     Tk_OptionSpec *optionTable);
01061 extern void DynamicOption_Free1(TreeCtrl *tree, DynamicOption **firstPtr,
01062     int id, int size);
01063 extern int DynamicCO_Init(Tk_OptionSpec *optionTable, CONST char *optionName,
01064     int id, int size, int objOffset, int internalOffset,
01065     Tk_ObjCustomOption *custom, DynamicOptionInitProc *init);
01066 
01067 extern int BooleanFlagCO_Init(Tk_OptionSpec *optionTable, CONST char *optionName,
01068     int theFlag);
01069 
01070 extern Tk_ObjCustomOption pixelsCO;
01071 extern Tk_ObjCustomOption stringCO;
01072 extern Tk_ObjCustomOption styleCO;
01073 
01074 /*****/
01075 
01076 #define STATIC_SIZE 20
01077 #define STATIC_ALLOC(P,T,C) \
01078     if (C > STATIC_SIZE) \
01079   P = (T *) ckalloc(sizeof(T) * (C))
01080 #define STATIC_FREE(P,T,C) \
01081     CWIPE(P, T, C); \
01082     if (C > STATIC_SIZE) \
01083   ckfree((char *) P)
01084 #define STATIC_FREE2(P,P2) \
01085     if (P != P2) \
01086   ckfree((char *) P)
01087