1 
2 /*	$Id: tixGrid.h,v 1.1.1.1 2000/05/17 11:08:42 idiscovery Exp $	*/
3 
4 /*
5  * tixGrid.h --
6  *
7  *	Defines main data structures for tixGrid
8  *
9  * Copyright (c) 1996, Expert Interface Technologies
10  *
11  * See the file "license.terms" for information on usage and redistribution
12  * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
13  *
14  */
15 
16 #ifndef _TIX_GRID_H_
17 #define _TIX_GRID_H_
18 #include "tkVMacro.h"
19 
20 #ifndef _TIX_GRID_DATA_H_
21 #include "tixGrData.h"
22 #endif
23 
24 #define TIX_X 0
25 #define TIX_Y 1
26 
27 
28 #define TIX_S_MARGIN 0
29 #define TIX_X_MARGIN 1
30 #define TIX_Y_MARGIN 2
31 #define TIX_MAIN     3
32 
33 #define TIX_SITE_NONE -1
34 
35 typedef struct TixGrEntry {
36     Tix_DItem * iPtr;
37     Tcl_HashEntry * entryPtr[2];	/* The index of this entry in the
38 					 * row/col tables */
39 } TixGrEntry;
40 
41 /*----------------------------------------------------------------------
42  * 			Render Block
43  *
44  * Before the Grid is rendered, information is filled into a pseudo 2D
45  * array of RenderBlockElem's:
46  *
47  *	(1) entries are placed in the appropriate (x,y) locations
48  *	(2) background and borders are formatted according
49  *	(3) highlights are formatted.
50  *
51  * The widget is redrawn using the render-block. This saves reformatting
52  * the next time the widget is exposed.
53  *----------------------------------------------------------------------
54  */
55 typedef struct RenderBlockElem {
56     TixGrEntry * chPtr;		/* not allocated, don't need to free */
57     int borderW[2][2];
58     int index[2];
59 
60     unsigned int selected : 1;
61     unsigned int filled : 1;
62 } RenderBlockElem;
63 
64 
65 /* ElmDispSize --
66  *
67  *	This structure stores the size information of the visible
68  *	rows (RenderBlock.dispSize[0][...]) and columns
69  *	(RenderBlock.dispSize[1][...])
70  */
71 typedef struct ElmDispSize {
72     int preBorder;
73     int size;
74     int postBorder;
75 
76     int total;		/* simple the sum of the above */
77 } ElmDispSize;
78 
79 typedef struct RenderBlock {
80     int size[2];		/* num of rows and cols in the render block */
81 
82     RenderBlockElem **elms;   	/* An Malloc'ed pseudo 2D array (you can do
83 				 * things like elms[0][0]), Used for the
84 				 * main body of the Grid.
85 				 */
86     ElmDispSize *dispSize[2];	/* (dispSizes[0][x], dispSizes[1][y])
87 				 * will be the dimension of the element (x,y)
88 				 * displayed on the screen (may be bigger
89 				 * or smaller than its desired size). */
90     int visArea[2];		/* visible area (width times height) of
91 				 * the visible cells on the screen */
92 }  RenderBlock;
93 
94 /*----------------------------------------------------------------------
95  * 			RenderInfo
96  *
97  * This stores information for rendering from the RB into an X drawable.
98  *
99  *----------------------------------------------------------------------
100  */
101 typedef struct RenderInfo {
102     Drawable drawable;
103     int origin[2];
104     int offset[2];
105     int size[2];		/* width and height of the area to draw
106 				 * (number of pixels starting from the offset)
107 				 * if offset = (2,2) and size = (5,5) we have
108 				 * to draw the rectangle ((2,2), (6,6));
109 				 */
110     struct {			/* the current valid grid area for the */
111 	int x1, x2, y1, y2;	/* "format" command */
112 	int whichArea;
113     } fmt;
114 } RenderInfo;
115 
116 typedef struct ExposedArea {
117     int x1, y1, x2, y2;
118 } ExposedArea, Rect;
119 
120 /*----------------------------------------------------------------------
121  * 			ColorInfo
122  *
123  * These colors are used by the format commands. They must be saved
124  * or otherwise the colormap may be changed ..
125  *----------------------------------------------------------------------
126  */
127 typedef struct ColorInfo {
128     struct ColorInfo * next;
129     int counter;
130     int type;			/* TK_CONFIG_BORDER or TK_CONFIG_COLOR */
131     long pixel;
132     Tk_3DBorder border;
133     XColor * color;
134 } ColorInfo;
135 
136 /*----------------------------------------------------------------------
137  * 			SelectBlock
138  *
139  * These structures are arranged in a list and are used to determine
140  * where a cell is selected.
141  *----------------------------------------------------------------------
142  */
143 #define TIX_GR_CLEAR		1
144 #define TIX_GR_SET		2
145 #define TIX_GR_TOGGLE		3
146 
147 #define TIX_GR_MAX		0x7fffffff
148 
149 #define TIX_GR_RESIZE		1
150 #define TIX_GR_REDRAW		2
151 
152 
153 typedef struct SelectBlock {
154     struct SelectBlock * next;
155     int range[2][2];		/* the top left and bottom right corners */
156     int type;			/* TIX_GR_CLEAR, TIX_GR_SET,
157 				 * TIX_GR_TOGGLE
158 				 *
159 				 * If several SelectBlock covers the same
160 				 * cell, the last block in the wPtr->selList
161 				 * determines whether this cell is selected
162 				 * or not */
163 } SelectBlock;
164 
165 /*----------------------------------------------------------------------
166  * 			GrSortItem
167  *
168  * Used to sort the items in the grid
169  *----------------------------------------------------------------------
170  */
171 typedef struct Tix_GrSortItem {
172     Tcl_Obj * data;			/* is usually a string, but
173 					 * can be a pointer to an
174 					 * arbitrary data in C API */
175     int index;				/* row or column */
176 } Tix_GrSortItem;
177 
178 /*----------------------------------------------------------------------
179  * Data structure for iterating the cells inside the grid.
180  *
181  *----------------------------------------------------------------------
182  */
183 
184 typedef struct Tix_GrDataRowSearch {
185     struct TixGridRowCol * row;
186     Tcl_HashSearch hashSearch;
187     Tcl_HashEntry *hashPtr;
188 } Tix_GrDataRowSearch;
189 
190 typedef struct Tix_GrDataCellSearch {
191     char * data;
192     Tcl_HashSearch hashSearch;
193     Tcl_HashEntry *hashPtr;
194 } Tix_GrDataCellSearch;
195 
196 /*----------------------------------------------------------------------
197  *
198  *	        Main data structure of the grid widget.
199  *
200  *----------------------------------------------------------------------
201  */
202 typedef struct Tix_GridScrollInfo {
203     LangCallback *command;
204 
205     int max;		/* total size (width or height) of the widget*/
206     int offset;		/* The top/left side of the scrolled widget */
207     int unit;		/* How much should we scroll when the user */
208 
209     double window;	/* visible size, percentage of the total */
210 }Tix_GridScrollInfo;
211 
212 
213 typedef struct GridStruct {
214     Tix_DispData dispData;
215 
216     Tcl_Command widgetCmd;	/* Token for button's widget command. */
217 
218     /*
219      * Information used when displaying widget:
220      */
221     int reqSize[2];		/* For app programmer to request size */
222 
223     /*
224      * Information used when displaying widget:
225      */
226 
227     /* Border and general drawing */
228     int borderWidth;		/* Width of 3-D borders. */
229     int selBorderWidth;		/* Width of 3-D borders for selected items */
230     int relief;			/* Indicates whether window as a whole is
231 				 * raised, sunken, or flat. */
232     Tk_3DBorder border;		/* Used for drawing the 3d border. */
233     Tk_3DBorder selectBorder;	/* Used for selected background. */
234     XColor *normalFg;		/* Normal foreground for text. */
235     XColor *normalBg;		/* Normal background for  text. */
236     XColor *selectFg;		/* Color for drawing selected text. */
237 
238     Tk_Uid state;		/* State can only be normal or disabled. */
239 
240        /* GC and stuff */
241     GC backgroundGC;		/* GC for drawing background. */
242     GC selectGC;		/* GC for drawing selected background. */
243     GC anchorGC;		/* GC for drawing dotted anchor highlight. */
244     TixFont font;		/* Default font used by the DItems. */
245 
246     /* Text drawing */
247     Tk_Cursor cursor;		/* Current cursor for window, or None. */
248 
249     /* For highlights */
250     int highlightWidth;		/* Width in pixels of highlight to draw
251 				 * around widget when it has the focus.
252 				 * <= 0 means don't draw a highlight. */
253     int bdPad;			/* = highlightWidth + borderWidth */
254     XColor *highlightColorPtr;	/* Color for drawing traversal highlight. */
255     GC highlightGC;		/* For drawing traversal highlight. */
256 
257     /*
258      * default pad and gap values
259      */
260     int padX, padY;
261 
262     Tk_Uid selectMode;		/* Selection style: single, browse, multiple,
263 				 * or extended.  This value isn't used in C
264 				 * code, but the Tcl bindings use it. */
265     Tk_Uid selectUnit;		/* Selection unit: cell, row or column.
266 				 * This value isn't used in C
267 				 * code, but the Tcl bindings use it. */
268 
269     /*
270      * The following three sites are used according to the -selectunit.
271      * if selectunit is: "cell", [0] and [1] are used; "row", only [0]
272      * is used; "column", only [1] is used
273      */
274     int anchor[2];		/* The current anchor unit */
275     int dropSite[2];		/* The current drop site */
276     int dragSite[2];		/* The current drop site */
277 
278     /*
279      * Callback commands.
280      */
281     LangCallback *command;		/* The command when user double-clicks */
282     LangCallback *browseCmd;		/* The command to call when the selection
283 				 * changes. */
284     LangCallback *editNotifyCmd;	/* The command to call to determine whether
285 				 * a cell is editable. */
286     LangCallback *editDoneCmd;		/* The command to call when an entry has
287 				 * been edited by the user.*/
288     LangCallback *formatCmd;		/* The command to call when the Grid widget
289 				 * needs to be reformatted (e.g, Exposure
290 				 * events or when contents have been
291 				 * changed). */
292     LangCallback *sizeCmd;		/* The command to call when the size of
293 				 * the listbox changes. E.g., when the user
294 				 * add/deletes elements. Useful for auto-
295 				 * scrollbar geometry managers */
296 
297     /*
298      * Info for lay-out
299      */
300     char *takeFocus;		/* Value of -takefocus option;  not used in
301 				 * the C code, but used by keyboard traversal
302 				 * scripts.  Malloc'ed, but may be NULL. */
303 
304     int serial;			/* this number is incremented before each time
305 				 * the widget is redisplayed */
306 
307     TixGridDataSet * dataSet;
308     RenderBlock * mainRB;	/* Malloc'ed */
309 
310     int hdrSize[2];		/* number of rows (height of x header, index
311 				 * [0]) and columns (width of y header, index
312 				 * [1]) */
313     int floatRange[2];		/* Are the num of columns and rows floated?
314 				 * (if floated, you can scroll past the max
315 				 * element).*/
316     int gridSize[2];		/* the size of the grid where there is data */
317     Tix_DItemInfo * diTypePtr;	/* Default item type */
318     ExposedArea expArea;
319 
320     RenderInfo * renderInfo;	/* only points to stuff in stack */
321     Tix_GridScrollInfo scrollInfo[2];
322     int fontSize[2];		/* size of the "0" char of the -font option
323 				 */
324     TixGridSize defSize[2];
325     Tix_LinkList colorInfo;
326     Tix_LinkList selList;
327     Tix_LinkList mappedWindows;
328     int colorInfoCounter;
329 
330     unsigned int hasFocus  : 1;
331 
332     unsigned int idleEvent : 1;
333     unsigned int toResize  : 1;		/* idle event */
334     unsigned int toRedraw : 1;		/* idle event */
335 
336     unsigned int toResetRB  : 1; /* Do we need to reset the render block */
337     unsigned int toComputeSel  : 1;
338     unsigned int toRedrawHighlight : 1;
339 } Grid;
340 
341 typedef Grid   WidgetRecord;
342 typedef Grid * WidgetPtr;
343 
344 #define DEF_GRID_BG_COLOR		NORMAL_BG
345 #define DEF_GRID_BG_MONO		WHITE
346 #define DEF_GRID_BORDER_WIDTH		"2"
347 #define DEF_GRID_BROWSE_COMMAND		""
348 #define DEF_GRID_COMMAND		""
349 #define DEF_GRID_CURSOR			""
350 #define DEF_GRID_DEFAULT_WIDTH		"40"
351 #define DEF_GRID_DEFAULT_HEIGHT		"20"
352 #define DEF_GRID_EDITDONE_COMMAND	""
353 #define DEF_GRID_EDITNOTIFY_COMMAND	""
354 #define DEF_GRID_FLOATING_ROWS		"0"
355 #define DEF_GRID_FLOATING_COLS		"0"
356 #define DEF_GRID_FONT			"Helvetica -12 bold"
357 #define DEF_GRID_FG_COLOR		BLACK
358 #define DEF_GRID_FG_MONO		BLACK
359 #define DEF_GRID_FORMAT_COMMAND		""
360 #define DEF_GRID_HEIGHT			"10"
361 #define DEF_GRID_HIGHLIGHT_COLOR	BLACK
362 #define DEF_GRID_HIGHLIGHT_MONO		BLACK
363 #define DEF_GRID_HIGHLIGHT_WIDTH	"2"
364 #define DEF_GRID_LEFT_MARGIN		"1"
365 #define DEF_GRID_ITEM_TYPE		"text"
366 #define DEF_GRID_RELIEF			"sunken"
367 #define DEF_GRID_PADX			"2"
368 #define DEF_GRID_PADY			"2"
369 #define DEF_GRID_SELECT_BG_COLOR	ACTIVE_BG
370 #define DEF_GRID_SELECT_FG_COLOR	BLACK
371 #define DEF_GRID_SELECT_BG_MONO		BLACK
372 #define DEF_GRID_SELECT_FG_MONO		WHITE
373 #define DEF_GRID_SELECT_MODE		"single"
374 #define DEF_GRID_SELECT_UNIT		"row"
375 #define DEF_GRID_SELECT_BORDERWIDTH	"1"
376 #define DEF_GRID_STATE			"normal"
377 #define DEF_GRID_SIZE_COMMAND		""
378 #define DEF_GRID_TAKE_FOCUS 		"1"
379 #define DEF_GRID_TOP_MARGIN		"1"
380 #define DEF_GRID_WIDTH			"4"
381 #define DEF_GRID_Y_SCROLL_COMMAND	""
382 #define DEF_GRID_X_SCROLL_COMMAND	""
383 
384 /*
385  * common functions
386  */
387 
388 EXTERN void		Tix_GrAddChangedRect _ANSI_ARGS_((
389 			    WidgetPtr wPtr, int changedRect[2][2],
390 			    int isSite));
391 EXTERN int		Tix_GrConfigSize _ANSI_ARGS_((Tcl_Interp *interp,
392 			    WidgetPtr wPtr, int argc, char **argv,
393 			    TixGridSize *sizePtr, char * argcErrorMsg,
394 			    int *changed_ret));
395 EXTERN void		Tix_GrDoWhenIdle _ANSI_ARGS_((WidgetPtr wPtr,
396 			    int type));
397 EXTERN void		Tix_GrCancelDoWhenIdle _ANSI_ARGS_((WidgetPtr wPtr));
398 EXTERN void		Tix_GrFreeElem _ANSI_ARGS_((TixGrEntry * chPtr));
399 EXTERN void		Tix_GrFreeUnusedColors _ANSI_ARGS_((WidgetPtr wPtr,
400 			    int freeAll));
401 EXTERN void		Tix_GrScrollPage _ANSI_ARGS_((WidgetPtr wPtr,
402 			    int count, int axis));
403 
404 /*
405  * The dataset functions
406  */
407 
408 EXTERN int		TixGridDataConfigRowColSize _ANSI_ARGS_((
409 			    Tcl_Interp * interp, WidgetPtr wPtr,
410 			    TixGridDataSet * dataSet, int which, int index,
411 			    int argc, char ** argv, char * argcErrorMsg,
412 			    int *changed_ret));
413 EXTERN char *		TixGridDataCreateEntry _ANSI_ARGS_((
414 			    TixGridDataSet * dataSet, int x, int y,
415 			    char * defaultEntry));
416 EXTERN int		TixGridDataDeleteEntry _ANSI_ARGS_((
417 			    TixGridDataSet * dataSet, int x, int y));
418 EXTERN void		TixGridDataDeleteRange _ANSI_ARGS_((WidgetPtr wPtr,
419 			    TixGridDataSet * dataSet, int which,
420 			    int from, int to));
421 EXTERN void 		TixGridDataDeleteSearchedEntry _ANSI_ARGS_((
422 			    Tix_GrDataCellSearch * cellSearchPtr));
423 EXTERN char *		TixGridDataFindEntry _ANSI_ARGS_((
424 			    TixGridDataSet * dataSet, int x, int y));
425 EXTERN int		TixGrDataFirstCell _ANSI_ARGS_((
426 			    Tix_GrDataRowSearch * rowSearchPtr,
427 			    Tix_GrDataCellSearch * cellSearchPtr));
428 EXTERN int		TixGrDataFirstRow _ANSI_ARGS_((
429 			    TixGridDataSet* dataSet,
430 			    Tix_GrDataRowSearch * rowSearchPtr));
431 EXTERN int		TixGridDataGetRowColSize _ANSI_ARGS_((
432 			    WidgetPtr wPtr, TixGridDataSet * dataSet,
433 			    int which, int index, TixGridSize * defSize,
434 			    int *pad0, int * pad1));
435 EXTERN void		TixGridDataGetGridSize _ANSI_ARGS_((
436 			    TixGridDataSet * dataSet, int *width_ret,
437 			    int *height_ret));
438 EXTERN int		TixGridDataGetIndex _ANSI_ARGS_((
439 			    Tcl_Interp * interp, WidgetPtr wPtr,
440 			    Tcl_Obj * xStr, Tcl_Obj * yStr, int * xPtr, int * yPtr));
441 EXTERN void 		TixGridDataInsert _ANSI_ARGS_((
442 			    TixGridDataSet * dataSet,
443 			    int x, int y, ClientData data));
444 EXTERN void		TixGridDataMoveRange _ANSI_ARGS_((WidgetPtr wPtr,
445 			    TixGridDataSet * dataSet, int which,
446 			    int from, int to, int by));
447 EXTERN int		TixGrDataNextCell _ANSI_ARGS_((
448 			    Tix_GrDataCellSearch * cellSearchPtr));
449 EXTERN int		TixGrDataNextRow _ANSI_ARGS_((
450 			    Tix_GrDataRowSearch * rowSearchPtr));
451 EXTERN TixGridDataSet*	TixGridDataSetInit _ANSI_ARGS_((void));
452 EXTERN void		TixGridDataSetFree _ANSI_ARGS_((
453 			    TixGridDataSet* dataSet));
454 EXTERN int		TixGridDataUpdateSort _ANSI_ARGS_((
455 			    TixGridDataSet * dataSet, int axis,
456 			    int start, int end, Tix_GrSortItem *items));
457 
458 #endif /*_TIX_GRID_H_*/
459