summaryrefslogtreecommitdiffstats
path: root/generic/tkTreeElem.h
blob: 9e5e236dc3833c3273557f14ea6d5490e788b57c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
/* 
 * tkTreeElem.h --
 *
 *	This module is the header for elements in treectrl widgets.
 *
 * Copyright (c) 2002-2005 Tim Baker
 *
 * RCS: @(#) $Id: tkTreeElem.h,v 1.9 2005/05/10 22:19:45 treectrl Exp $
 */

typedef struct ElementType ElementType;
typedef struct Element Element;
typedef struct ElementArgs ElementArgs;

struct ElementArgs
{
	TreeCtrl *tree;
	Element *elem;
	int state;
	struct {
		TreeItem item;
		TreeItemColumn column;
	} create;
	struct {
		int noop;
	} delete;
	struct {
		int objc;
		Tcl_Obj *CONST *objv;
		int flagSelf;
	} config;
	struct {
		int x;
		int y;
		int width;
		int height;
		int pad[4];
		Drawable drawable;
	} display;
	struct {
		int squeeze;
		int width;
		int height;
	} layout;
	struct {
		int flagTree;
		int flagMaster;
		int flagSelf;
	} change;
	struct {
		int state1;
		int state2;
	} states;
	struct {
		Tcl_Obj *obj;
	} actual;
};

struct ElementType
{
	char *name; /* "image", "text" */
	int size; /* size of an Element */
	Tk_OptionSpec *optionSpecs;
	Tk_OptionTable optionTable;
	int (*createProc)(ElementArgs *args);
	void (*deleteProc)(ElementArgs *args);
	int (*configProc)(ElementArgs *args);
	void (*displayProc)(ElementArgs *args);
	void (*layoutProc)(ElementArgs *args);
	int (*changeProc)(ElementArgs *args);
	int (*stateProc)(ElementArgs *args);
	void (*undefProc)(ElementArgs *args);
	int (*actualProc)(ElementArgs *args);
	ElementType *next;
};

/* list of these for each style */
struct Element
{
	Tk_Uid name; /* "elem2", "eText" etc */
	ElementType *typePtr;
	Element *master; /* NULL if this is master */
	/* type-specific data here */
};

extern ElementType elemTypeBitmap;
extern ElementType elemTypeBorder;
extern ElementType elemTypeCheckButton;
extern ElementType elemTypeImage;
extern ElementType elemTypeRect;
extern ElementType elemTypeText;
extern ElementType elemTypeWindow;

#define ELEMENT_TYPE_MATCHES(t1,t2) ((t1)->name == (t2)->name)

/***** ***** *****/

extern int Element_GetSortData(TreeCtrl *tree, Element *elem, int type, long *lv, double *dv, char **sv);

typedef struct TreeIterate_ *TreeIterate;

extern int TreeElement_TypeFromObj(TreeCtrl *tree, Tcl_Obj *objPtr, ElementType **typePtrPtr);
extern void Tree_RedrawElement(TreeCtrl *tree, TreeItem item, Element *elem);
extern TreeIterate Tree_ElementIterateBegin(TreeCtrl *tree, ElementType *elemTypePtr);
extern TreeIterate Tree_ElementIterateNext(TreeIterate iter_);
extern Element *Tree_ElementIterateGet(TreeIterate iter_);
extern void Tree_ElementIterateChanged(TreeIterate iter_, int mask);
extern void Tree_ElementChangedItself(TreeCtrl *tree, TreeItem item,
	TreeItemColumn column, Element *elem, int mask);
	
typedef struct TreeCtrlStubs TreeCtrlStubs;
struct TreeCtrlStubs
{
	int (*TreeCtrl_RegisterElementType)(Tcl_Interp *interp, ElementType *typePtr);
	void (*Tree_RedrawElement)(TreeCtrl *tree, TreeItem item, Element *elem);
	TreeIterate (*Tree_ElementIterateBegin)(TreeCtrl *tree, ElementType *elemTypePtr);
	TreeIterate (*Tree_ElementIterateNext)(TreeIterate iter_);
	Element *(*Tree_ElementIterateGet)(TreeIterate iter_);
	void (*Tree_ElementIterateChanged)(TreeIterate iter_, int mask);
	void (*PerStateInfo_Free)(TreeCtrl *tree, PerStateType *typePtr, PerStateInfo *pInfo);
	int (*PerStateInfo_FromObj)(TreeCtrl *tree, StateFromObjProc proc, PerStateType *typePtr, PerStateInfo *pInfo);
	PerStateData *(*PerStateInfo_ForState)(TreeCtrl *tree, PerStateType *typePtr, PerStateInfo *pInfo, int state, int *match);
	Tcl_Obj *(*PerStateInfo_ObjForState)(TreeCtrl *tree, PerStateType *typePtr, PerStateInfo *pInfo, int state, int *match);
	void (*PerStateInfo_Undefine)(TreeCtrl *tree, PerStateType *typePtr, PerStateInfo *pInfo, int state);
};