1 /*
2  * tkScale.h --
3  *
4  *	Declarations of types and functions used to implement
5  *	the scale widget.
6  *
7  * Copyright (c) 1996 by Sun Microsystems, Inc.
8  * Copyright (c) 1999-2000 by Scriptics Corporation.
9  *
10  * See the file "license.terms" for information on usage and redistribution
11  * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
12  *
13  * RCS: @(#) $Id: tkScale.h,v 1.8 2000/04/14 08:33:16 hobbs Exp $
14  */
15 
16 #ifndef _TKSCALE
17 #define _TKSCALE
18 
19 #ifndef _TK
20 #include "tk.h"
21 #endif
22 #include "tkVMacro.h"
23 
24 #ifdef BUILD_tk
25 # undef TCL_STORAGE_CLASS
26 # define TCL_STORAGE_CLASS DLLEXPORT
27 #endif
28 
29 /*
30  * Legal values for the "orient" field of TkScale records.
31  */
32 
33 enum orient {
34     ORIENT_HORIZONTAL, ORIENT_VERTICAL
35 };
36 
37 /*
38  * Legal values for the "state" field of TkScale records.
39  */
40 
41 enum state {
42     STATE_ACTIVE, STATE_DISABLED, STATE_NORMAL
43 };
44 
45 /*
46  * A data structure of the following type is kept for each scale
47  * widget managed by this file:
48  */
49 
50 typedef struct TkScale {
51     Tk_Window tkwin;		/* Window that embodies the scale.  NULL
52 				 * means that the window has been destroyed
53 				 * but the data structures haven't yet been
54 				 * cleaned up.*/
55     Display *display;		/* Display containing widget.  Used, among
56 				 * other things, so that resources can be
57 				 * freed even after tkwin has gone away. */
58     Tcl_Interp *interp;		/* Interpreter associated with scale. */
59     Tcl_Command widgetCmd;	/* Token for scale's widget command. */
60     Tk_OptionTable optionTable;	/* Table that defines configuration options
61 				 * available for this widget. */
62     enum orient orient;		/* Orientation for window (vertical or
63 				 * horizontal). */
64     int width;			/* Desired narrow dimension of scale,
65 				 * in pixels. */
66     int length;			/* Desired long dimension of scale,
67 				 * in pixels. */
68     double value;		/* Current value of scale. */
69     Tcl_Obj *varNamePtr;	/* Name of variable or NULL.
70 				 * If non-NULL, scale's value tracks
71 				 * the contents of this variable and
72 				 * vice versa. */
73     double fromValue;		/* Value corresponding to left or top of
74 				 * scale. */
75     double toValue;		/* Value corresponding to right or bottom
76 				 * of scale. */
77     double tickInterval;	/* Distance between tick marks;
78 				 * 0 means don't display any tick marks. */
79     double resolution;		/* If > 0, all values are rounded to an
80 				 * even multiple of this value. */
81     int digits;			/* Number of significant digits to print
82 				 * in values.  0 means we get to choose the
83 				 * number based on resolution and/or the
84 				 * range of the scale. */
85     char format[10];		/* Sprintf conversion specifier computed from
86 				 * digits and other information. */
87     double bigIncrement;	/* Amount to use for large increments to
88 				 * scale value.  (0 means we pick a value). */
89     Tcl_Obj *command;		/* Command prefix to use when invoking Tcl
90 				 * commands because the scale value changed.
91 				 * NULL means don't invoke commands. */
92     int repeatDelay;		/* How long to wait before auto-repeating
93 				 * on scrolling actions (in ms). */
94     int repeatInterval;		/* Interval between autorepeats (in ms). */
95     char *label;		/* Label to display above or to right of
96 				 * scale;  NULL means don't display a label. */
97     int labelLength;		/* Number of non-NULL chars. in label. */
98     enum state state;		/* Values are active, normal, or disabled.
99 				 * Value of scale cannot be changed when
100 				 * disabled. */
101 
102     /*
103      * Information used when displaying widget:
104      */
105 
106     int borderWidth;		/* Width of 3-D border around window. */
107     Tk_3DBorder bgBorder;	/* Used for drawing slider and other
108 				 * background areas. */
109     Tk_3DBorder activeBorder;	/* For drawing the slider when active. */
110     int sliderRelief;		/* Is slider to be drawn raised, sunken,
111 				 * etc. */
112     XColor *troughColorPtr;	/* Color for drawing trough. */
113     GC troughGC;		/* For drawing trough. */
114     GC copyGC;			/* Used for copying from pixmap onto screen. */
115     Tk_Font tkfont;		/* Information about text font, or NULL. */
116     XColor *textColorPtr;	/* Color for drawing text. */
117     GC textGC;			/* GC for drawing text in normal mode. */
118     int relief;			/* Indicates whether window as a whole is
119 				 * raised, sunken, or flat. */
120     int highlightWidth;		/* Width in pixels of highlight to draw
121 				 * around widget when it has the focus.
122 				 * <= 0 means don't draw a highlight. */
123     Tk_3DBorder highlightBorder;/* Value of -highlightbackground option:
124 				 * specifies background with which to draw 3-D
125 				 * default ring and focus highlight area when
126 				 * highlight is off. */
127     XColor *highlightColorPtr;	/* Color for drawing traversal highlight. */
128     int inset;			/* Total width of all borders, including
129 				 * traversal highlight and 3-D border.
130 				 * Indicates how much interior stuff must
131 				 * be offset from outside edges to leave
132 				 * room for borders. */
133     int sliderLength;		/* Length of slider, measured in pixels along
134 				 * long dimension of scale. */
135     int showValue;		/* Non-zero means to display the scale value
136 				 * below or to the left of the slider;	zero
137 				 * means don't display the value. */
138 
139     /*
140      * Layout information for horizontal scales, assuming that window
141      * gets the size it requested:
142      */
143 
144     int horizLabelY;		/* Y-coord at which to draw label. */
145     int horizValueY;		/* Y-coord at which to draw value text. */
146     int horizTroughY;		/* Y-coord of top of slider trough. */
147     int horizTickY;		/* Y-coord at which to draw tick text. */
148     /*
149      * Layout information for vertical scales, assuming that window
150      * gets the size it requested:
151      */
152 
153     int vertTickRightX;		/* X-location of right side of tick-marks. */
154     int vertValueRightX;	/* X-location of right side of value string. */
155     int vertTroughX;		/* X-location of scale's slider trough. */
156     int vertLabelX;		/* X-location of origin of label. */
157 
158     /*
159      * Miscellaneous information:
160      */
161 
162     int fontHeight;		/* Height of scale font. */
163     Tk_Cursor cursor;		/* Current cursor for window, or None. */
164     Tcl_Obj *takeFocusPtr;	/* Value of -takefocus option;	not used in
165 				 * the C code, but used by keyboard traversal
166 				 * scripts.  May be NULL. */
167     int flags;			/* Various flags;  see below for
168 				 * definitions. */
169 } TkScale;
170 
171 /*
172  * Flag bits for scales:
173  *
174  * REDRAW_SLIDER -		1 means slider (and numerical readout) need
175  *				to be redrawn.
176  * REDRAW_OTHER -		1 means other stuff besides slider and value
177  *				need to be redrawn.
178  * REDRAW_ALL -			1 means the entire widget needs to be redrawn.
179  * REDRAW_PENDING -		1 means any sort of redraw is pending
180  * ACTIVE -			1 means the widget is active (the mouse is
181  *				in its window).
182  * INVOKE_COMMAND -		1 means the scale's command needs to be
183  *				invoked during the next redisplay (the
184  *				value of the scale has changed since the
185  *				last time the command was invoked).
186  * SETTING_VAR -		1 means that the associated variable is
187  *				being set by us, so there's no need for
188  *				ScaleVarProc to do anything.
189  * NEVER_SET -			1 means that the scale's value has never
190  *				been set before (so must invoke -command and
191  *				set associated variable even if the value
192  *				doesn't appear to have changed).
193  * GOT_FOCUS -			1 means that the focus is currently in
194  *				this widget.
195  * SCALE_DELETED -		1 means the scale widget is being deleted
196  */
197 
198 #define REDRAW_SLIDER		(1<<0)
199 #define REDRAW_OTHER		(1<<1)
200 #define REDRAW_ALL		(REDRAW_OTHER|REDRAW_SLIDER)
201 #define REDRAW_PENDING		(1<<2)
202 #define ACTIVE			(1<<3)
203 #define INVOKE_COMMAND		(1<<4)
204 #define SETTING_VAR		(1<<5)
205 #define NEVER_SET		(1<<6)
206 #define GOT_FOCUS		(1<<7)
207 #define SCALE_DELETED		(1<<8)
208 
209 /*
210  * Symbolic values for the active parts of a slider.  These are
211  * the values that may be returned by the ScaleElement procedure.
212  */
213 
214 #define OTHER		0
215 #define TROUGH1		1
216 #define SLIDER		2
217 #define TROUGH2		3
218 
219 /*
220  * Space to leave between scale area and text, and between text and
221  * edge of window.
222  */
223 
224 #define SPACING 2
225 
226 /*
227  * How many characters of space to provide when formatting the
228  * scale's value:
229  */
230 
231 #define PRINT_CHARS 150
232 
233 /*
234  * Declaration of procedures used in the implementation of the scale
235  * widget.
236  */
237 
238 EXTERN void		TkEventuallyRedrawScale _ANSI_ARGS_((TkScale *scalePtr,
239 			    int what));
240 EXTERN double		TkRoundToResolution _ANSI_ARGS_((TkScale *scalePtr,
241 			    double value));
242 EXTERN TkScale *	TkpCreateScale _ANSI_ARGS_((Tk_Window tkwin));
243 EXTERN void		TkpDestroyScale _ANSI_ARGS_((TkScale *scalePtr));
244 EXTERN void		TkpDisplayScale _ANSI_ARGS_((ClientData clientData));
245 EXTERN int		TkpScaleElement _ANSI_ARGS_((TkScale *scalePtr,
246 			     int x, int y));
247 EXTERN void		TkScaleSetValue _ANSI_ARGS_((TkScale *scalePtr,
248 			    double value, int setVar, int invokeCommand));
249 EXTERN double		TkScalePixelToValue _ANSI_ARGS_((TkScale *scalePtr,
250 			    int x, int y));
251 EXTERN int		TkScaleValueToPixel _ANSI_ARGS_((TkScale *scalePtr,
252 			    double value));
253 
254 # undef TCL_STORAGE_CLASS
255 # define TCL_STORAGE_CLASS DLLIMPORT
256 
257 #endif /* _TKSCALE */
258