source: trunk/SRC/ToBeReviewed/WIDGET/COMPOUND_WIDGET/cw_slider_pm.pro @ 134

Last change on this file since 134 was 134, checked in by navarro, 18 years ago

change *.pro file properties (del eof-style, del executable, set keywords Id

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
File size: 12.1 KB
Line 
1;------------------------------------------------------------
2;------------------------------------------------------------
3;------------------------------------------------------------
4;+
5; NAME: cw_slider_pm
6;
7; PURPOSE: widget equivalent a WIDGET_SLIDER sauf qu'en plus on
8; dispose de 2 bouttons + et - pour deplacer le widget de +/- 1.
9;
10; CATEGORY: compound widget (aide a l''ecriture des widgets)
11;
12; CALLING SEQUENCE: id=cw_slider_pm(parent)
13;
14; INPUTS:
15;         Parent: The widget ID of the parent widget.
16;
17; KEYWORD PARAMETERS:tous ceux de WIDGET_SLIDER
18;
19; OUTPUTS:
20;         The returned value of this function is the widget ID of the
21;         newly-created animation widget.
22;
23; COMMON BLOCKS: none
24;
25; SIDE EFFECTS:
26;
27;  Widget Events Returned by the CW_SLIDER_PM Widget
28;
29;  Slider widgets generate events when the mouse is used to change
30;  their value. The event structure returned by the WIDGET_EVENT
31;  function is defined by the following statement:
32;
33;  {CW_SLIDER_PM, ID:0L, TOP:0L, HANDLER:0L, VALUE:0L, DRAG:0, OUT:0}
34;
35;  ID is the widget ID of the button generating the event. TOP is the
36;  widget ID of the top level widget containing ID.
37;  HANDLER contains the widget ID of the widget associated with the
38;  handler routine.
39;  VALUE returns the new value of the slider.
40;  DRAG returns integer 1 if the slider event was generated as part of
41;  a drag operation, or zero if the event was generated when the user
42;  had finished positioning the slider. Note that the slider widget
43;  only generates events during the drag operation if the DRAG keyword
44;  is set, and if the application is running under Motif. When the
45;  DRAG keyword is set, the DRAG field can be used to avoid
46;  computationally expensive operations until the user releases the
47;  slider.
48;  OUT:c''est un entier qui peut prendre 3 valeurs:
49;      1 : si on appuie sur + alors que le slider est deja aux max. rq:
50;      ds ce cas le slider reste au max
51;      -1: si on appuie sur - alors que le slider est deja aux min. rq:
52;      ds ce cas le slider reste au min
53;      0 : ds les autres cas!
54;
55;   Keywords to WIDGET_CONTROL
56;
57;   A number of keywords to the WIDGET_CONTROL procedure affect the
58;   behavior of cw_slider_pm widget: GET_VALUE and SET_VALUE.
59;       1) GET_VALUE
60;   widget_control,wid_id,get_value=resultat
61;   retourne ds la variable resultat une structure de 2 elements dont
62;   les noms sont inspires des mots cles que l''on peut passer a
63;   widget_control qd on utilise WIDGET_SLIDER:
64;            VALUE:the value setting of the widget
65;            SLIDER_MIN_MAX: a 2 elements array: The minimum and the
66;            maximum value of the range encompassed by the slider
67;       2) SET_VALUE
68;   widget_control,wid_id,set_value=impose
69;   permet de modifier l''etat de la slider bar comme on peut le faire
70;   pour WIDGET_SLIDER. Impose peut etre:
71;       a) un entier: donne la nouvelle  position of the slider.
72;       b) une structure qui peut avoir comme elements (de 1 a 3):
73;            VALUE:un entier qui donne la nouvelle  position of the slider.
74;            SLIDER_MIN:Set to a new minimum value for the specified
75;            slider widget.
76;            SLIDER_MAX:Set to a new minimum value for the specified
77;            slider widget.
78;
79; RESTRICTIONS:
80;
81; EXAMPLE: cf utiliser le programme founit i-dessous: testwid et la
82; procedure associee, testwid_event.
83;
84; MODIFICATION HISTORY:Sebastien Masson (smasson@lodyc.jussieu.fr)
85;                      5/9/1999
86;-
87;------------------------------------------------------------
88;------------------------------------------------------------
89;------------------------------------------------------------
90; PRO testwid_event, event
91; ;   help, event, /STRUCT
92;    SliderBarId = widget_info(event.top,find_by_uname = 'c''est lui')
93;    widget_control, event.id, get_uvalue=uval
94;    if n_elements(uval) EQ 0 then return
95;    case uval of
96;       'done':widget_control, event.top, /destroy
97;       'slider_min':BEGIN
98;          widget_control, event.id, get_value = value
99;          widget_control, SliderBarId, set_value = {slider_min:value}
100;       END
101;       'slider_max':BEGIN
102;          widget_control, event.id, get_value = value
103;          widget_control, SliderBarId, set_value = {slider_max:value}
104;       END
105;       'slider_value':BEGIN
106;          widget_control, event.id, get_value = value
107;          widget_control, SliderBarId, set_value = value
108;       END
109;       'get':BEGIN
110;          widget_control, SliderBarId, get_value = value
111;          help,  value, /struct
112;          print, value.slider_min_max
113;       END
114;       ELSE:
115;    endcase
116;    return
117; end
118; PRO testwid, _extra = ex
119;    base=widget_base(/COLUMN)
120; print, 'base=', base
121;    nothing = widget_label(base, value = 'beginning of the test')
122; ;
123;    nothing = cw_slider_pm(base, _extra = ex, uname = 'c''est lui', uvalue = 'c''est lui')
124; print, 'cw_slider_pm ID =', nothing
125; ;
126;    nothing = widget_label(base, value = 'end of the test')
127;    nothing = widget_text(base, value = '0', uvalue = 'slider_min', /editable)
128;    nothing = widget_text(base, value = '10', uvalue = 'slider_max', /editable)
129;    nothing = widget_text(base, value = '5', uvalue = 'slider_value', /editable)
130;    nothing = widget_button(base, value = 'get', uvalue = 'get')
131;    nothing = widget_button(base, value = 'done', uvalue = 'done')
132;    widget_control, base, /REALIZE
133;    xmanager,'testwid', base
134;    return
135; end
136;----------------------------------------------------------------------
137FUNCTION decvalue, value
138;
139  compile_opt idl2, strictarrsubs
140;
141  a = float(value[0])
142  return, strtrim(string(floor(a) + 0.1*indgen(10), format = '(f15.1)'), 2)
143end
144;----------------------------------------------------------------------
145FUNCTION decind, value
146;
147  compile_opt idl2, strictarrsubs
148;
149  a = float(value[0])
150  return, round(10*(a - floor(a))) ; !! computation accuracy
151end
152;----------------------------------------------------------------------
153PRO cw_slider_pm_set_value, id, value
154;
155  compile_opt idl2, strictarrsubs
156;
157  sbid = widget_info(id, find_by_uname = 'SliderBar')
158  dcid = widget_info(id, find_by_uname = 'decimal')
159  minmax = widget_info(sbid, /SLIDER_MIN_MAX)
160  if size(value, /type) eq 8 then BEGIN ; this is a structure
161    tagnames = tag_names(value)
162    for tag = 0, n_tags(value)-1 do begin
163      case strtrim(strlowcase(tagnames[tag]), 2) of
164        'slider_min':BEGIN
165;          IF float(value.slider_min[0]) LT minmax[1] THEN BEGIN
166            minmax[0] = value.slider_min[0]
167            widget_control, sbid, set_slider_min = floor(float(value.slider_min[0]))
168            valuedc = float(widget_info(dcid, /combobox_gettext))
169            IF valuedc LT value.slider_min THEN BEGIN
170              widget_control, sbid, set_value = floor(float(value.slider_min[0]))
171              widget_control, dcid, set_value = decvalue(value.slider_min)
172              widget_control, dcid, set_combobox_select = decind(value.slider_min)
173            ENDIF
174;          ENDIF
175        end
176        'slider_max':BEGIN
177;          IF float(value.slider_max[0]) GT minmax[0] THEN BEGIN
178            minmax[1] = value.slider_max[0]
179            widget_control, sbid, set_slider_max = ceil(float(value.slider_max[0]))
180            valuedc = float(widget_info(dcid, /combobox_gettext))
181            IF valuedc GT value.slider_max THEN BEGIN
182              widget_control, sbid, set_value = ceil(float(value.slider_max[0]))
183              widget_control, dcid, set_value = decvalue(value.slider_max)
184              widget_control, dcid, set_combobox_select = decind(value.slider_max)
185            ENDIF
186;          ENDIF
187        end
188        'value':IF float(value.value[0]) GE minmax[0] $
189          AND float(value.value[0]) LE minmax[1] THEN value2 = float(value.value[0])
190        ELSE:ras = report('wrong tag name in argument "value" of cw_slider_pm_set_value')
191      endcase
192    endfor
193  ENDIF ELSE BEGIN
194    IF float(value[0]) GE minmax[0] $
195      AND float(value[0]) LE minmax[1] THEN value2 = float(value[0])
196  ENDELSE
197  IF n_elements(value2) NE 0 THEN BEGIN
198    widget_control, sbid, set_value = fix(value2)
199    widget_control, dcid, set_value = decvalue(value2)
200    widget_control, dcid, set_combobox_select = decind(value2)
201  ENDIF
202  return
203end
204;----------------------------------------------------------------------
205FUNCTION cw_slider_pm_get_value, id
206;
207  compile_opt idl2, strictarrsubs
208;
209  sbid = widget_info(id, find_by_uname = 'SliderBar')
210  dcid = widget_info(id, find_by_uname = 'decimal')
211  minmax = widget_info(sbid, /SLIDER_MIN_MAX)
212  value = float(widget_info(dcid, /combobox_gettext))
213   return, {value:value, slider_min_max:minmax}
214end
215;----------------------------------------------------------------------
216FUNCTION cw_slider_pm_event, event
217;
218  compile_opt idl2, strictarrsubs
219;
220  widget_control, event.id, get_uvalue = uval
221;
222  sbid = widget_info(event.handler, find_by_uname = 'SliderBar')
223  dcid = widget_info(event.handler, find_by_uname = 'decimal')
224  minmax = widget_info(sbid, /SLIDER_MIN_MAX)
225  IF uval EQ 'decimal' THEN value = float(event.str) $
226  ELSE value = float(widget_info(dcid, /combobox_gettext))
227  out = 0 ; defaut case
228  case uval OF
229    'plus': if (value + 1) LE minmax[1] then value2 = value + 1 ELSE out = 1
230    'minus':if (value - 1) GE minmax[0] then value2 = value - 1 ELSE out = -1
231    'SliderBar':if (event.value + value - floor(value)) LE minmax[1] THEN value2 = event.value + value - floor(value)
232    'decimal':BEGIN
233      CASE 1 OF
234        value GT minmax[1]: value2 = minmax[1]
235        value LT minmax[0]: value2 = minmax[0]
236        ELSE:
237      ENDCASE
238    END
239    ELSE:
240  ENDCASE
241  IF n_elements(value2) NE 0  THEN BEGIN
242    value = value2
243    widget_control, sbid, set_value = floor(value)
244    widget_control, dcid, set_value = decvalue(value)
245    widget_control, dcid, set_combobox_select = decind(value)
246  ENDIF
247  return, {CW_SLIDER_PM, ID:event.handler, TOP:event.top, HANDLER:0L $
248           , VALUE:value, OUT:OUT}
249end
250;----------------------------------------------------------------------
251FUNCTION cw_slider_pm, parent, MAXIMUM = maximum, MINIMUM = minimum $
252                       , STRMINLEN = strminlen, VALUE = value, UVALUE = uvalue $
253                       , UNAME = uname, title = title, _extra = ex
254;
255  compile_opt idl2, strictarrsubs
256;
257
258  IF (N_PARAMS() NE 1) THEN MESSAGE, 'Incorrect number of arguments'
259  ON_ERROR, 2                   ;return to caller
260;
261  if n_elements(minimum) NE 0 then minimum = floor(minimum) ELSE minimum = 0
262  if n_elements(maximum) NE 0 then maximum = ceil(maximum) ELSE maximum = 100
263  if NOT keyword_set(title) then title = '    '
264;
265; cheking exclusive keywords
266  column = (keyword_set(column)*(1-keyword_set(row))+keyword_set(vertical)) < 1
267  row = keyword_set(row)*(1-keyword_set(column)) +(keyword_set(row) EQ column)
268  if NOT keyword_set(uvalue) then uvalue = ''
269  if NOT keyword_set(uname) then uname = ''
270  base = widget_base(parent $
271                     , EVENT_FUNC = 'cw_slider_pm_event' $
272                     , FUNC_GET_VALUE = 'cw_slider_pm_get_value' $
273                     , PRO_SET_VALUE = 'cw_slider_pm_set_value' $
274                     , space = 0, UVALUE = uvalue, UNAME = uname, _extra = ex)   
275;
276  mlen = (widget_info(base, string_size = 'm'))[0]
277
278  xsize = mlen*strlen(title)
279  dummyid = widget_label(base, value = title, xsize = xsize)
280  dummyid = widget_button(base, value = '-', uvalue = 'minus' $
281                          , yoffset = 15, xsize = 15, ysize = 15)
282  dummyid = widget_button(base, value = '+', uvalue = 'plus' $
283                          , xoffset = 15, yoffset = 15, xsize = 15, ysize = 15)
284  xoff = 30 > xsize
285  lenstr = max(strlen(strtrim([minimum, maximum], 1)))
286  if keyword_set(strminlen) then lenstr = strminlen > lenstr
287;  xsize = 35 + mlen*(lenstr+1)+3*(lenstr lt 4)
288  xsize = 35 + mlen*(lenstr+2)
289  dummyid = widget_combobox(base, value = decvalue(minimum) $
290                            , UVALUE = 'decimal', UNAME = 'decimal' $
291                            , xoffset = xoff, yoffset = 2, xsize = xsize)
292
293  dummyid = widget_slider(base, MAXIMUM = maximum, MINIMUM = minimum, UVALUE = 'SliderBar' $
294                          , UNAME = 'SliderBar', /suppress_value, /drag $
295                          , yoffset = 30, xsize = xoff + xsize)
296;
297  if keyword_set(value) then cw_slider_pm_set_value, base, value
298;
299  return, base
300end
Note: See TracBrowser for help on using the repository browser.