1/*
2 * tkTreeElem.h --
3 *
4 *	This module is the header for elements in treectrl widgets.
5 *
6 * Copyright (c) 2002-2009 Tim Baker
7 *
8 * RCS: @(#) $Id: tkTreeElem.h,v 1.30 2010/03/08 17:04:58 treectrl Exp $
9 */
10
11typedef struct TreeElementType TreeElementType;
12typedef struct TreeElement_ TreeElement_;
13typedef struct TreeElementArgs TreeElementArgs;
14
15struct TreeElementArgs
16{
17    TreeCtrl *tree;
18    TreeElement elem;
19    int state;
20    struct {
21	TreeItem item;
22	TreeItemColumn column;
23    } create;
24    struct {
25	int noop;
26    } delete;
27    struct {
28	int objc;
29	Tcl_Obj *CONST *objv;
30	int flagSelf;
31	TreeItem item;
32	TreeItemColumn column;
33    } config;
34    struct {
35	int x;
36	int y;
37	int width;
38	int height;
39#define STICKY_W 0x1000 /* These values must match ELF_STICKY_xxx */
40#define STICKY_N 0x2000
41#define STICKY_E 0x4000
42#define STICKY_S 0x8000
43	int sticky;
44	TreeDrawable td;
45	Drawable drawable;
46	int bounds[4];
47    } display;
48    struct {
49	int fixedWidth;
50	int fixedHeight;
51	int maxWidth;
52	int maxHeight;
53	int width;
54	int height;
55    } needed;
56    struct {
57	int fixedWidth;
58	int height;
59    } height;
60    struct {
61	int flagTree;
62	int flagMaster;
63	int flagSelf;
64    } change;
65    struct {
66	int state1;
67	int state2;
68	int draw1;
69	int draw2;
70	int visible1;
71	int visible2;
72    } states;
73    struct {
74	Tcl_Obj *obj;
75    } actual;
76    struct {
77	int visible;
78    } screen;
79};
80
81struct TreeElementType
82{
83    char *name; /* "image", "text" */
84    int size; /* size of an TreeElement */
85    Tk_OptionSpec *optionSpecs;
86    Tk_OptionTable optionTable;
87    int (*createProc)(TreeElementArgs *args);
88    void (*deleteProc)(TreeElementArgs *args);
89    int (*configProc)(TreeElementArgs *args);
90    void (*displayProc)(TreeElementArgs *args);
91    void (*neededProc)(TreeElementArgs *args);
92    void (*heightProc)(TreeElementArgs *args);
93    int (*changeProc)(TreeElementArgs *args);
94    int (*stateProc)(TreeElementArgs *args);
95    int (*undefProc)(TreeElementArgs *args);
96    int (*actualProc)(TreeElementArgs *args);
97    void (*onScreenProc)(TreeElementArgs *args);
98    TreeElementType *next;
99};
100
101/* list of these for each style */
102struct TreeElement_
103{
104    Tk_Uid name;		/* "elem2", "eText" etc */
105    TreeElementType *typePtr;
106    TreeElement master;		/* NULL if this is master */
107    DynamicOption *options;	/* Dynamically-allocated options. */
108    /* type-specific data here */
109};
110
111MODULE_SCOPE TreeElementType treeElemTypeBitmap;
112MODULE_SCOPE TreeElementType treeElemTypeBorder;
113MODULE_SCOPE TreeElementType treeElemTypeCheckButton;
114MODULE_SCOPE TreeElementType treeElemTypeImage;
115MODULE_SCOPE TreeElementType treeElemTypeRect;
116MODULE_SCOPE TreeElementType treeElemTypeText;
117MODULE_SCOPE TreeElementType treeElemTypeWindow;
118
119#define ELEMENT_TYPE_MATCHES(t1,t2) ((t1)->name == (t2)->name)
120
121/***** ***** *****/
122
123MODULE_SCOPE int TreeElement_GetSortData(TreeCtrl *tree, TreeElement elem, int type, long *lv, double *dv, char **sv);
124
125typedef struct TreeIterate_ *TreeIterate;
126
127MODULE_SCOPE int TreeElement_TypeFromObj(TreeCtrl *tree, Tcl_Obj *objPtr, TreeElementType **typePtrPtr);
128MODULE_SCOPE void Tree_RedrawElement(TreeCtrl *tree, TreeItem item, TreeElement elem);
129MODULE_SCOPE TreeIterate Tree_ElementIterateBegin(TreeCtrl *tree, TreeElementType *elemTypePtr);
130MODULE_SCOPE TreeIterate Tree_ElementIterateNext(TreeIterate iter_);
131MODULE_SCOPE TreeElement Tree_ElementIterateGet(TreeIterate iter_);
132MODULE_SCOPE void Tree_ElementIterateChanged(TreeIterate iter_, int mask);
133MODULE_SCOPE void Tree_ElementChangedItself(TreeCtrl *tree, TreeItem item,
134    TreeItemColumn column, TreeElement elem, int flags, int mask);
135MODULE_SCOPE int TreeCtrl_RegisterElementType(Tcl_Interp *interp, TreeElementType *newTypePtr);
136
137typedef struct TreeCtrlStubs TreeCtrlStubs;
138struct TreeCtrlStubs
139{
140    int (*TreeCtrl_RegisterElementType)(Tcl_Interp *interp,
141		TreeElementType *typePtr);
142    void (*Tree_RedrawElement)(TreeCtrl *tree, TreeItem item,
143		TreeElement elem);
144    TreeIterate (*Tree_ElementIterateBegin)(TreeCtrl *tree,
145		TreeElementType *elemTypePtr);
146    TreeIterate (*Tree_ElementIterateNext)(TreeIterate iter_);
147    TreeElement (*Tree_ElementIterateGet)(TreeIterate iter_);
148    void (*Tree_ElementIterateChanged)(TreeIterate iter_, int mask);
149    void (*PerStateInfo_Free)(TreeCtrl *tree, PerStateType *typePtr,
150		PerStateInfo *pInfo);
151    int (*PerStateInfo_FromObj)(TreeCtrl *tree, StateFromObjProc proc,
152		PerStateType *typePtr, PerStateInfo *pInfo);
153    PerStateData *(*PerStateInfo_ForState)(TreeCtrl *tree,
154		PerStateType *typePtr, PerStateInfo *pInfo, int state, int *match);
155    Tcl_Obj *(*PerStateInfo_ObjForState)(TreeCtrl *tree,
156		PerStateType *typePtr, PerStateInfo *pInfo, int state, int *match);
157    int (*PerStateInfo_Undefine)(TreeCtrl *tree, PerStateType *typePtr,
158		PerStateInfo *pInfo, int state);
159    PerStateType *pstBoolean;
160    int (*PerStateBoolean_ForState)(TreeCtrl *tree, PerStateInfo *pInfo,
161		int state, int *match);
162    void (*PSTSave)(PerStateInfo *pInfo, PerStateInfo *pSave);
163    void (*PSTRestore)(TreeCtrl *tree, PerStateType *typePtr,
164		PerStateInfo *pInfo, PerStateInfo *pSave);
165    int (*TreeStateFromObj)(TreeCtrl *tree, Tcl_Obj *obj, int *stateOff,
166		int *stateOn);
167    int (*BooleanCO_Init)(Tk_OptionSpec *optionTable, CONST char *optionName);
168    int (*StringTableCO_Init)(Tk_OptionSpec *optionTable,
169		CONST char *optionName, CONST char **tablePtr);
170    int (*PerStateCO_Init)(Tk_OptionSpec *optionTable, CONST char *optionName,
171		PerStateType *typePtr, StateFromObjProc proc);
172};
173
174