1 /*
2  * Copyright (c) 2003, Joe English
3  * Helper routines for widget implementations.
4  */
5 
6 #ifndef _TTKWIDGET
7 #define _TTKWIDGET
8 
9 /*
10  * State flags for 'flags' field.
11  */
12 #define WIDGET_DESTROYED	0x0001
13 #define REDISPLAY_PENDING 	0x0002	/* scheduled call to RedisplayWidget */
14 #define CURSOR_ON 		0x0020	/* See TtkBlinkCursor() */
15 #define WIDGET_USER_FLAG        0x0100  /* 0x0100 - 0x8000 for user flags */
16 
17 /*
18  * Bit fields for OptionSpec 'mask' field:
19  */
20 #define READONLY_OPTION 	0x1
21 #define STYLE_CHANGED   	0x2
22 #define GEOMETRY_CHANGED	0x4
23 
24 /*
25  * Core widget elements
26  */
27 typedef struct WidgetSpec_ WidgetSpec;	/* Forward */
28 
29 typedef struct
30 {
31     Tk_Window tkwin;		/* Window associated with widget */
32     Tcl_Interp *interp;		/* Interpreter associated with widget. */
33     WidgetSpec *widgetSpec;	/* Widget class hooks */
34     Tcl_Command widgetCmd;	/* Token for widget command. */
35     Tk_OptionTable optionTable;	/* Option table */
36     Ttk_Layout layout;  	/* Widget layout */
37 
38     /*
39      * Storage for resources:
40      */
41     Tcl_Obj *takeFocusPtr;	/* Storage for -takefocus option */
42     Tcl_Obj *cursorObj;		/* Storage for -cursor option */
43     Tcl_Obj *styleObj;		/* Name of currently-applied style */
44     Tcl_Obj *classObj;		/* Class name (readonly option) */
45 
46     Ttk_State state;		/* Current widget state */
47     unsigned int flags;		/* internal flags, see above */
48 
49 } WidgetCore;
50 
51 /*
52  * Widget specifications:
53  */
54 struct WidgetSpec_
55 {
56     const char 		*className;	/* Widget class name */
57     size_t 		recordSize;	/* #bytes in widget record */
58     const Tk_OptionSpec	*optionSpecs;	/* Option specifications */
59     const Ttk_Ensemble	*commands;	/* Widget instance subcommands */
60 
61     /*
62      * Hooks:
63      */
64     void  	(*initializeProc)(Tcl_Interp *, void *recordPtr);
65     void	(*cleanupProc)(void *recordPtr);
66     int 	(*configureProc)(Tcl_Interp *, void *recordPtr, int flags);
67     int 	(*postConfigureProc)(Tcl_Interp *, void *recordPtr, int flags);
68     Ttk_Layout	(*getLayoutProc)(Tcl_Interp *,Ttk_Theme, void *recordPtr);
69     int 	(*sizeProc)(void *recordPtr, int *widthPtr, int *heightPtr);
70     void	(*layoutProc)(void *recordPtr);
71     void	(*displayProc)(void *recordPtr, Drawable d);
72 };
73 
74 /*
75  * Common factors for widget implementations:
76  */
77 MODULE_SCOPE void TtkNullInitialize(Tcl_Interp *, void *);
78 MODULE_SCOPE int  TtkNullPostConfigure(Tcl_Interp *, void *, int);
79 MODULE_SCOPE void TtkNullCleanup(void *recordPtr);
80 MODULE_SCOPE Ttk_Layout TtkWidgetGetLayout(
81 	Tcl_Interp *, Ttk_Theme, void *recordPtr);
82 MODULE_SCOPE Ttk_Layout TtkWidgetGetOrientedLayout(
83 	Tcl_Interp *, Ttk_Theme, void *recordPtr, Tcl_Obj *orientObj);
84 MODULE_SCOPE int  TtkWidgetSize(void *recordPtr, int *w, int *h);
85 MODULE_SCOPE void TtkWidgetDoLayout(void *recordPtr);
86 MODULE_SCOPE void TtkWidgetDisplay(void *recordPtr, Drawable);
87 
88 MODULE_SCOPE int TtkCoreConfigure(Tcl_Interp*, void *, int mask);
89 
90 /* Common widget commands:
91  */
92 MODULE_SCOPE int TtkWidgetConfigureCommand(
93 	void *,Tcl_Interp *, int, Tcl_Obj*const[]);
94 MODULE_SCOPE int TtkWidgetCgetCommand(
95 	void *,Tcl_Interp *, int, Tcl_Obj*const[]);
96 MODULE_SCOPE int TtkWidgetInstateCommand(
97 	void *,Tcl_Interp *, int, Tcl_Obj*const[]);
98 MODULE_SCOPE int TtkWidgetStateCommand(
99 	void *,Tcl_Interp *, int, Tcl_Obj*const[]);
100 MODULE_SCOPE int TtkWidgetIdentifyCommand(
101 	void *,Tcl_Interp *, int, Tcl_Obj*const[]);
102 
103 /* Widget constructor:
104  */
105 MODULE_SCOPE int TtkWidgetConstructorObjCmd(
106 	ClientData, Tcl_Interp*, int, Tcl_Obj*const[]);
107 
108 #define RegisterWidget(interp, name, specPtr) \
109     Tcl_CreateObjCommand(interp, name, \
110 	TtkWidgetConstructorObjCmd, (ClientData)specPtr,NULL)
111 
112 /* WIDGET_TAKEFOCUS_TRUE --
113  * WIDGET_TAKEFOCUS_FALSE --
114  *	Add one or the other of these to each OptionSpecs table
115  *	to indicate whether the widget should take focus
116  *	during keyboard traversal.
117  */
118 #define WIDGET_TAKEFOCUS_TRUE \
119     {TK_OPTION_STRING, "-takefocus", "takeFocus", "TakeFocus", \
120 	"ttk::takefocus", Tk_Offset(WidgetCore, takeFocusPtr), -1, 0,0,0 }
121 #define WIDGET_TAKEFOCUS_FALSE \
122     {TK_OPTION_STRING, "-takefocus", "takeFocus", "TakeFocus", \
123 	"", Tk_Offset(WidgetCore, takeFocusPtr), -1, 0,0,0 }
124 
125 /* WIDGET_INHERIT_OPTIONS(baseOptionSpecs) --
126  * Add this at the end of an OptionSpecs table to inherit
127  * the options from 'baseOptionSpecs'.
128  */
129 #define WIDGET_INHERIT_OPTIONS(baseOptionSpecs) \
130     {TK_OPTION_END, 0,0,0, NULL, -1,-1, 0, (ClientData)baseOptionSpecs, 0}
131 
132 /* All widgets should inherit from ttkCoreOptionSpecs[].
133  */
134 MODULE_SCOPE Tk_OptionSpec ttkCoreOptionSpecs[];
135 
136 /*
137  * Useful routines for use inside widget implementations:
138  */
139 /* extern int WidgetDestroyed(WidgetCore *); */
140 #define WidgetDestroyed(corePtr) ((corePtr)->flags & WIDGET_DESTROYED)
141 
142 MODULE_SCOPE void TtkWidgetChangeState(WidgetCore *,
143 	unsigned int setBits, unsigned int clearBits);
144 
145 MODULE_SCOPE void TtkRedisplayWidget(WidgetCore *);
146 MODULE_SCOPE void TtkResizeWidget(WidgetCore *);
147 
148 MODULE_SCOPE void TtkTrackElementState(WidgetCore *);
149 MODULE_SCOPE void TtkBlinkCursor(WidgetCore *);
150 
151 /*
152  * -state option values (compatibility)
153  */
154 MODULE_SCOPE void TtkCheckStateOption(WidgetCore *, Tcl_Obj *);
155 
156 /*
157  * Variable traces:
158  */
159 typedef void (*Ttk_TraceProc)(void *recordPtr, const char *value);
160 typedef struct TtkTraceHandle_ Ttk_TraceHandle;
161 
162 MODULE_SCOPE Ttk_TraceHandle *Ttk_TraceVariable(
163     Tcl_Interp*, Tcl_Obj *varnameObj, Ttk_TraceProc callback, void *clientData);
164 MODULE_SCOPE void Ttk_UntraceVariable(Ttk_TraceHandle *);
165 MODULE_SCOPE int Ttk_FireTrace(Ttk_TraceHandle *);
166 
167 /*
168  * Virtual events:
169  */
170 MODULE_SCOPE void TtkSendVirtualEvent(Tk_Window tgtWin, const char *eventName);
171 
172 /*
173  * Helper routines for data accessor commands:
174  */
175 MODULE_SCOPE int TtkEnumerateOptions(
176     Tcl_Interp *, void *, const Tk_OptionSpec *, Tk_OptionTable, Tk_Window);
177 MODULE_SCOPE int TtkGetOptionValue(
178     Tcl_Interp *, void *, Tcl_Obj *optName, Tk_OptionTable, Tk_Window);
179 
180 /*
181  * Helper routines for scrolling widgets (see scroll.c).
182  */
183 typedef struct {
184     int 	first;		/* First visible item */
185     int 	last;		/* Last visible item */
186     int 	total;		/* Total #items */
187     char 	*scrollCmd;	/* Widget option */
188 } Scrollable;
189 
190 typedef struct ScrollHandleRec *ScrollHandle;
191 
192 MODULE_SCOPE ScrollHandle TtkCreateScrollHandle(WidgetCore *, Scrollable *);
193 MODULE_SCOPE void TtkFreeScrollHandle(ScrollHandle);
194 
195 MODULE_SCOPE int TtkScrollviewCommand(
196     Tcl_Interp *interp, int objc, Tcl_Obj *const objv[], ScrollHandle);
197 
198 MODULE_SCOPE void TtkUpdateScrollInfo(ScrollHandle h);
199 MODULE_SCOPE void TtkScrollTo(ScrollHandle, int newFirst, int updateScrollInfo);
200 MODULE_SCOPE void TtkScrolled(ScrollHandle, int first, int last, int total);
201 MODULE_SCOPE void TtkScrollbarUpdateRequired(ScrollHandle);
202 
203 /*
204  * Tag sets (work in progress, half-baked)
205  */
206 
207 typedef struct TtkTag *Ttk_Tag;
208 typedef struct TtkTagTable *Ttk_TagTable;
209 typedef struct TtkTagSet {	/* TODO: make opaque */
210     Ttk_Tag	*tags;
211     int 	nTags;
212 } *Ttk_TagSet;
213 
214 MODULE_SCOPE Ttk_TagTable Ttk_CreateTagTable(
215 	Tcl_Interp *, Tk_Window tkwin, Tk_OptionSpec[], int recordSize);
216 MODULE_SCOPE void Ttk_DeleteTagTable(Ttk_TagTable);
217 
218 MODULE_SCOPE Ttk_Tag Ttk_GetTag(Ttk_TagTable, const char *tagName);
219 MODULE_SCOPE Ttk_Tag Ttk_GetTagFromObj(Ttk_TagTable, Tcl_Obj *);
220 
221 MODULE_SCOPE Tcl_Obj *Ttk_TagOptionValue(
222     Tcl_Interp *, Ttk_TagTable, Ttk_Tag, Tcl_Obj *optionName);
223 
224 MODULE_SCOPE int Ttk_EnumerateTagOptions(
225     Tcl_Interp *, Ttk_TagTable, Ttk_Tag);
226 
227 MODULE_SCOPE int Ttk_EnumerateTags(Tcl_Interp *, Ttk_TagTable);
228 
229 MODULE_SCOPE int Ttk_ConfigureTag(
230     Tcl_Interp *interp, Ttk_TagTable tagTable, Ttk_Tag tag,
231     int objc, Tcl_Obj *const objv[]);
232 
233 MODULE_SCOPE Ttk_TagSet Ttk_GetTagSetFromObj(
234     Tcl_Interp *interp, Ttk_TagTable, Tcl_Obj *objPtr);
235 MODULE_SCOPE Tcl_Obj *Ttk_NewTagSetObj(Ttk_TagSet);
236 
237 MODULE_SCOPE void Ttk_FreeTagSet(Ttk_TagSet);
238 
239 MODULE_SCOPE int Ttk_TagSetContains(Ttk_TagSet, Ttk_Tag tag);
240 MODULE_SCOPE int Ttk_TagSetAdd(Ttk_TagSet, Ttk_Tag tag);
241 MODULE_SCOPE int Ttk_TagSetRemove(Ttk_TagSet, Ttk_Tag tag);
242 
243 MODULE_SCOPE void Ttk_TagSetValues(Ttk_TagTable, Ttk_TagSet, void *record);
244 MODULE_SCOPE void Ttk_TagSetApplyStyle(Ttk_TagTable,Ttk_Style,Ttk_State,void*);
245 
246 /*
247  * String tables for widget resource specifications:
248  */
249 
250 MODULE_SCOPE const char *ttkOrientStrings[];
251 MODULE_SCOPE const char *ttkCompoundStrings[];
252 MODULE_SCOPE const char *ttkDefaultStrings[];
253 
254 /*
255  * ... other option types...
256  */
257 MODULE_SCOPE int TtkGetLabelAnchorFromObj(
258 	Tcl_Interp*, Tcl_Obj*, Ttk_PositionSpec *);
259 
260 /*
261  * Platform-specific initialization.
262  */
263 
264 #ifdef _WIN32
265 #define Ttk_PlatformInit Ttk_WinPlatformInit
266 MODULE_SCOPE int Ttk_PlatformInit(Tcl_Interp *);
267 #elif defined(MAC_OSX_TK)
268 #define Ttk_PlatformInit Ttk_MacOSXPlatformInit
269 MODULE_SCOPE int Ttk_PlatformInit(Tcl_Interp *);
270 #else
271 #define Ttk_PlatformInit(interp) /* TTK_X11PlatformInit() */
272 #endif
273 
274 #endif /* _TTKWIDGET */
275