1; this file is part of GDL
2; 30. Oct 2020 Gilles Duvert
3; test ? most of all and every widget available and some functionalities.
4;
5function myBitmap
6  return,[ $
7        [000B, 000B, 000B, 000B],           $
8        [000B, 000B, 000B, 000B],           $
9        [000B, 000B, 000B, 000B],           $
10        [128B, 255B, 001B, 000B],           $
11        [224B, 255B, 007B, 000B],           $
12        [240B, 000B, 015B, 000B],           $
13        [056B, 000B, 028B, 000B],           $
14        [024B, 000B, 024B, 000B],           $
15        [028B, 000B, 056B, 000B],           $
16        [012B, 000B, 048B, 000B],           $
17        [012B, 000B, 048B, 000B],           $
18        [012B, 000B, 048B, 000B],           $
19        [012B, 000B, 048B, 000B],           $
20        [012B, 000B, 240B, 031B],           $
21        [012B, 000B, 240B, 031B],           $
22        [012B, 000B, 112B, 029B],           $
23        [028B, 000B, 184B, 026B],           $
24        [024B, 000B, 088B, 029B],           $
25        [056B, 000B, 188B, 026B],           $
26        [240B, 000B, 095B, 029B],           $
27        [224B, 255B, 175B, 026B],           $
28        [128B, 255B, 085B, 029B],           $
29        [000B, 176B, 170B, 026B],           $
30        [000B, 112B, 085B, 029B],           $
31        [000B, 176B, 170B, 026B],           $
32        [000B, 112B, 085B, 029B],           $
33        [000B, 176B, 170B, 026B],           $
34        [000B, 240B, 255B, 031B],           $
35        [000B, 240B, 255B, 031B],           $
36        [000B, 000B, 000B, 000B],           $
37        [000B, 000B, 000B, 000B],           $
38        [000B, 000B, 000B, 000B]            $
39        ]
40end
41pro myplot,tr,x,y,b,conn,poly,tag=tag, list=list
42  if n_elements(poly) eq 0 then poly=0
43  if n_elements(conn) gt 0 then doconn=1 else doconn=0
44  if n_elements(b) gt 0 then dob=1 else dob=0
45; colors
46  n=n_elements(tr)/3
47
48  p=randomu(seed,n,/long)
49
50  PLOT, x, y,psym=1,/NODATA,/iso,xst=1,yst=1
51
52  for i=0,n-1 do polyfill,[x[tr[0,i]],x[tr[1,i]],x[tr[2,i]],x[tr[0,i]]],[y[tr[0,i]],y[tr[1,i]],y[tr[2,i]],y[tr[0,i]]],color=p[i]
53
54  if (dob) then begin plots, x[b],y[b],thick=4 & plots, x[b[0]],y[b[0]],thick=4,/cont & end
55
56  if (doconn) then begin
57     i=poly                     ;,n_elements(x)-(n_elements(r)/2)-1 do begin
58     sub=conn[conn[i] : conn[i+1]-1]
59     polyfill,x[sub],y[sub],color=0,/line_fill,spacing=0.2,ori=33,thick=2
60  endif
61
62  nn=n_elements(x)
63  if (keyword_set(list)) then begin
64     for i=0,nn-1 do begin
65        print,i
66        sub=conn[conn[i] : conn[i+1]-1]
67        ns=n_elements(sub)
68        for j=0,ns-3 do begin
69           print,sub[0],sub[(j+1) mod ns],sub[(j+2) mod ns]
70        endfor
71     endfor
72
73  endif
74
75  if (keyword_set(tag)) then for i=0,n_elements(x)-1 do xyouts,x[i],y[i],i,ali=1,chars=2
76
77end
78
79
80pro exit_gui,ev
81  widget_control,ev.top,/DESTROY
82end
83pro cleanup_xmanager, id
84  print,"Cleaning up called by xmanager..."
85  widget_control,id,/DESTROY
86end
87pro cleanup, id
88  print,"Cleaning up called by base widget..."
89  widget_control,id,/DESTROY
90end
91pro cleanup_control, id
92  print,"Cleaning up called by widget_control..."
93  widget_control,id,/DESTROY
94end
95pro i_am_realized, id
96  print,"Widget "+string(id)+" is realized now."
97end
98pro base_event_base, id
99  print,"event in bases base"
100  help,id
101end
102pro base_event, id
103  print,"event in top base"
104  help,id
105end
106pro slider_killed,id
107  print,"slider "+string(id)+" was killed"
108end
109pro button_killed,id
110;  print,"button "+string(id)+" was killed"
111end
112pro draw_context,ev
113  contextBase = WIDGET_INFO(ev.TOP, FIND_BY_UNAME = 'drawContext')
114  print,contextbase,ev.top,ev.id,ev.x,ev.y
115    ; Display the context menu.
116    WIDGET_DISPLAYCONTEXTMENU, ev.ID, ev.X, ev.Y, contextBase
117 end
118pro deletedraw,ev
119  tobedeleted = WIDGET_INFO(ev.TOP, FIND_BY_UNAME = 'drawToBeDeleted')
120  widget_control,tobedeleted,/destroy
121end
122
123pro list_event,event
124toto=["A","list","created","with","WIDGET_LIST","YSIZE=3"]
125print,toto[event.index]
126end
127pro handle_Event,ev
128common mycount,count
129help,ev,/str
130if tag_names(ev, /structure_name) eq 'WIDGET_KILL_REQUEST' then begin
131   acceptance=dialog_message(dialog_parent=ev.id,"I Do want to close the window", /CANCEL, /DEFAULT_NO,/QUESTION) ; +strtrim(ev.id,2))
132   if acceptance eq "Yes" then begin
133      widget_control,ev.id,tlb_kill_request_events=0 ; remove blocking kill
134      widget_control,ev.id,/destroy
135   endif
136
137endif
138
139widget_control,ev.id,get_uvalue=uv
140  widget_control,ev.top,get_uvalue=topuv
141  if n_elements(uv) gt 0 then begin
142     if (strlen(tag_names(ev,/structure_name)) le 1) then begin
143        print,"unhandled compound widget event"
144        return
145     endif
146     if ~ISA(uv,"STRUCT") then begin
147        print,"currently unhandled event"
148        return
149     endif
150
151     print,"uvalue.type=",uv.type
152     case uv.type of
153        'file': begin
154           widget_control,ev.id,get_value=value ;& print,value
155           case value of
156              "Y": widget_control,ev.id,set_value="N"
157              "N": widget_control,ev.id,set_value="Y"
158              else: return
159           endcase
160        end
161        'data': begin
162           widget_control,ev.id,get_value=value
163           widget_control,topuv[0],set_value=value
164           widget_control,topuv[1],set_value=value
165        end
166        'test_check': begin
167           check=widget_info(ev.id,/button_set)
168           if (check) then begin
169              print,"unsetting checkmark..."
170              widget_control,ev.id,set_button=0
171              widget_control,ev.id,set_value="entry 3 (unchecked)"
172           endif else begin
173              print,"setting checkmark..."
174              widget_control,ev.id,set_button=1
175              widget_control,ev.id,set_value="entry 3 (checked)"
176           endelse
177        end
178        'quit':  widget_control,ev.top,/DESTROY
179        else: begin
180           print, "(other, not treated, event: ok)"
181           return
182        end
183
184     endcase
185  endif
186  print, "(unhandled event: ok)"
187end
188pro doMbar,mbar,fontname
189  menu = widget_button(mbar,VALUE="Simple Menu",font=fontname,tooltip='TOOOLTIP!') ; 3
190ex = widget_button(menu,VALUE="Exit",EVENT_PRO="exit_gui") ; 4
191siz= widget_button(menu,VALUE="Resize (error)",EVENT_PRO="resize_gui") ; 5
192;buttons as menu buttons
193        fileID = Widget_Button(mbar, Value='Complicated Menu') ; 6
194        saveID = Widget_Button(fileID, Value='submenu 1', /MENU,font=fontname,xsize=100)
195        button = Widget_Button(saveID, Value='entry 1 (inactive)', UNAME='POSTSCRIPT',sensitive=0,font=fontname)
196        button = Widget_Button(saveID, Value='entry 2', UNAME='PDF')
197        raster = Widget_Button(saveID, Value='submenu 2', /MENU)
198
199        button = Widget_Button(raster, Value='entry 1', UNAME='RASTER_BMP')
200        button = Widget_Button(raster, Value='entry 2', UNAME='RASTER_GIF')
201        button = Widget_Button(raster, Value='entry 3', UNAME='RASTER_JPEG')
202        button = Widget_Button(raster, Value='entry 4', UNAME='RASTER_PNG')
203        button = Widget_Button(raster, Value='entry 5', UNAME='RASTER_TIFF')
204        imraster = Widget_Button(saveID, Value='submenu 3', /MENU)
205        button = Widget_Button(imraster, Value='entry 1',UNAME='IMAGEMAGICK_BMP')
206        button = Widget_Button(imraster, Value='entry 2',UNAME='IMAGEMAGICK_GIF')
207        button = Widget_Button(imraster, Value='entry 3',UNAME='IMAGEMAGICK_JPEG')
208        button = Widget_Button(imraster, Value='entry 4',UNAME='IMAGEMAGICK_PNG')
209        button = Widget_Button(imraster, Value='entry 5', UNAME='IMAGEMAGICK_TIFF')
210        button = Widget_Button(fileID, Value='entry 1', /Separator, UNAME='SAVECOMMANDS')
211        button = Widget_Button(fileID, Value='entry 2', UNAME='RESTORECOMMANDS')
212        button = Widget_Button(fileID, Value='entry 3 (unchecked)', /Separator, /check ,UVALUE={vEv,'test_check',[0,0]})
213        bitmap = Widget_Button(mbar, Value='bitmap menus')
214        ;; this one is allowed by IDL only on WINDOWS but possible with GDL
215        ;;button = Widget_Button(bitmap, Value='a bitmap', image=myBitmap(), UNAME='BUT',/menu)
216        button = Widget_Button(bitmap, Value=myBitmap(), UNAME='BUT',/menu)
217        button = Widget_Button(button, Value=myBitmap(), UNAME='BUT')
218     end
219
220pro test_widgets,table,help=help,nocanvas=nocanvas,notree=notree,block=block,fontname=fontname,present=present,_extra=extra
221  common mycount,count
222  if (n_elements(present) eq 0) then present=['TEXT','LIST','DRAW','SLIDER','BUTTON','TABLE','TREE','LABEL','DROPLIST','COMBOBOX','BASE']
223count=0
224title='GDL Widget Examples'
225DEFSYSV, '!gdl', exists=isGDL
226if ~keyword_set(fontname) then begin
227   fontname=(isgdl)?"Die Nasty Bold 10":'-altsys-die nasty-bold-r-normal--0-100-94-0-p-0-ascii-0'
228   title+=' (Using Fixed Font Monospace)'
229endif else title+=' (Using '+fontname+')'
230if ~keyword_set(block) then block=0
231if keyword_set(help) then begin
232print,"useage: test_widgets[,table][,/help][,/nocanvas][,/notree]"
233print,"Will display some examples of currently available widgets"
234print,"if table is passed as argument and is a structure, TABLE tab will show the"
235print,"elements of the structure as buttons in a scrolled panel"
236print,"options: /nocanvas removes the widget_draw"
237print,"         /notree remove the tree widget"
238print,"         fontname=""Helvetica Narrow 32"" to change a test text font."
239print,"         present=[XXX,YYY] where XXX and YY are one or more of the panel types below:"
240print,"         'TEXT','LIST','DRAW','SLIDER','BUTTON','TABLE','TREE','LABEL','DROPLIST','COMBOBOX','BASE' "
241return
242endif
243
244;base for listing contents of tables and to show selected files
245nrows=n_elements(table)         ; passed table
246if ( n_elements(table) eq 0 or size(table,/type) ne 8 ) then begin
247   tbltemplate={table2,string:'a very very very long string ',real:33.33,double:8.0080808D,another:'another',yanother:'very long string'}
248; make a long table of nrows
249   nrows=50
250   table=replicate(tbltemplate,nrows)
251endif
252
253ev = {vEv,type:'',pos:[0,0]}
254
255
256;Create a base widget.
257
258base = WIDGET_BASE(/col,MBAR=mbar,title=title,event_pro='base_event_nok',kill_notify='cleanup',/tlb_kill_request_events,/tlb_size_events) ; ---> PROBLEM: ,/tlb_size_events) ;,/scroll)
259doMbar,mbar,fontname
260;mysize=widget_info(base,string_size='012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234')
261
262; define a tabbed base that contains everything:
263label=widget_label(base,value='to best mimic IDL`s widgets, call GDL with option "--widget-compat" ',/align_left)
264label=widget_label(base,value='Test calling me with options like "test_widgets,/col,font="Arial 32",/base_align_right" ',/align_left)
265label=widget_label(base,value='                          or like "test_widgets,/col,x_scroll=400,y_scroll=400" ',/align_left)
266label=widget_label(base,value='                          or like "test_widgets,/col,select="TEXT" (see test_widgets,/help) ',/align_left)
267
268tabbed_base = widget_tab( base, frame=12) ;, scr_xsize=400, scr_ysize=400);, multiline=6)
269
270offy=0
271; TEST: empty base to play with. use with option " present='test' "
272if total(strcmp('TEST',present,/fold)) then begin
273   test_base = widget_base( tabbed_base, TITLE="TEST",xsize=1500,ysize=1500,x_scroll=500,y_scroll=500,_extra=extra) & offy=0
274endif
275
276;TEXT
277if total(strcmp('TEXT',present,/fold)) then begin
278   text_base = widget_base( tabbed_base, TITLE="TEXT",_extra=extra) & offy=0
279   label=widget_label(yoff=offy,text_base,value='0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789') & offy+=20 ;
280   label=widget_label(yoff=offy,text_base,/align_center,value='Various Sizes, no event should be issued') & offy+=20                                               ;
281   text1=widget_text(yoff=offy,text_base,VALUE=["xsize=30,/scroll, (no ysize), follow base alignment","Line 2","line 3","line 4","line 5"],/scroll, xsize=30) & offy+=30     ;
282   text1=widget_text(yoff=offy,text_base,VALUE=["xsize=20, no ysize, follow base alignment","Line 2","line 3","line 4","line 5"],XSIZE=20) & offy+=30              ;
283   text1=widget_text(yoff=offy,text_base,VALUE=["ysize=3, fancyFont, follow base alignment","Line 2","line 3","line 4","line 5"],$
284                     font=fontname, ysize=3) & offy+=30 ;
285   text1=widget_text(yoff=offy,text_base,VALUE=["xsize=20, ysize=3,/scroll, follow base alignment","Line 2","line 3","line 4","line 5"],$
286                     xsize=20, ysize=3,/scroll) & offy+=30 ;
287   text1=widget_text(yoff=offy,text_base,VALUE=["idem but with scr_xsize=200,scr_ysize=50"," a non editable LONG line using /wrap option..."],$
288                     scr_xsize=200,scr_ysize=50,/wrap) & offy+=20                                                                                 ;
289   label=widget_label(yoff=offy,text_base,/align_center,value='Various Positioning, no event should be issued') & offy+=20      ;
290   text3=widget_text(yoff=offy,text_base,VALUE=["Caractères Accentués ça ü û, frame=10,left"],frame=10,/align_left)  & offy+=50  ;
291   text3=widget_text(yoff=offy,text_base,VALUE=["fancy center aligned, frame=10"],/align_center,frame=10,font=fontname) & offy+=50 ;
292   text3=widget_text(yoff=offy,text_base,VALUE=["follows alignment, frame=10"],frame=10) & offy+=50                                ;
293
294   label=widget_label(yoff=offy,text_base,/align_center,value='EVENTS') & offy+=20                                                              ;
295   text1=widget_text(yoff=offy,text_base,VALUE=["a non editable LONG line using /wrap option in a restricted xsize=20,ysize=5 panel (sizes guaranteed only if an alignment has been defined), this is not finished there is still text below...","a non editable LONG line using /wrap option in a restricted xsize=20,ysize=5 panel (sizes guaranteed only if an alignment has been defined), this is not finished there is still text below...","a non editable LONG line using /wrap option in a restricted xsize=20,ysize=5 panel (sizes guaranteed only if an alignment has been defined), this is not finished there is still text below..."],$
296                     xsize=20, ysize=5,/wrap,/all_events) & offy+=50 ;
297   label=widget_label(yoff=offy,text_base,value='Is EDITABLE + ALL_EVENTS: input change widget content and events are generated') & offy+=20    ;
298   text1=widget_text(yoff=offy,text_base,VALUE=["EDITABLE, all_events","Line 2","line 3","line 4","line 5"],/EDITABLE,/ALL_EVENTS) & offy+=30   ;
299   label=widget_label(yoff=offy,text_base,value='Is NOT EDITABLE + ALL_EVENTS: no change but events are generated') & offy+=20                  ;
300   text1=widget_text(yoff=offy,text_base,VALUE=["NOT EDITABLE, all_events","Line 2","line 3","line 4","line 5"],EDITABLE=0,/ALL_EVENTS) & offy+=30 ;
301   label=widget_label(yoff=offy,text_base,value='Is only EDITABLE: input change widget content and <Return> generates an event.') & offy+=20       ;
302   text1=widget_text(yoff=offy,text_base,VALUE=["EDITABLE","Line 2","line 3","line 4","line 5"],/EDITABLE,ALL_EVENTS=0) & offy+=30                 ;
303endif
304
305 if total(strcmp('LIST',present,/fold)) then begin
306;LIST
307    list_base = widget_base( tabbed_base, TITLE="LISTs",_extra=extra) & offy=0                                                                                     ;
308    label=widget_label(yoff=offy,list_base,value='0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789') & offy+=10 ;
309    label=widget_label(yoff=offy,list_base,value='3 lines, placement inherited') & offy+=10                                                                         ;
310    list=widget_list(yoff=offy,list_base,value=["Simple rather long text of widget_list, ysize=3","created","with","WIDGET_LIST","widget_list, ysize=3","created","with","WIDGET_LIST", "ysize=3","created","with","WIDGET_LIST","widget_list, ysize=3","created","with","WIDGET_LIST","widget_list, ysize=3","created","with","WIDGET_LIST","widget_list, ysize=3","created","with","WIDGET_LIST", "ysize=3","created","with","WIDGET_LIST","widget_list, ysize=3","created","with","WIDGET_LIST"],/multiple,YSIZE=3) & offy+=100 ;
311    label=widget_label(yoff=offy,list_base,value='idem,fancy,framed(32 pix)') & offy+=10 ;
312    list=widget_list(yoff=offy,list_base,value=["FANCY FONT long text widget_list, ysize=3","created","with","WIDGET_LIST","widget_list, ysize=3","created","with","WIDGET_LIST", "ysize=3","created","with","WIDGET_LIST","widget_list, ysize=3","created","with","WIDGET_LIST"],/multiple,YSIZE=3,frame=32,font=fontname) & offy+=200 ;
313    label=widget_label(yoff=offy,list_base,value='3 lines, placement inherited, xsize=12 chars (scroll)') & offy+=10                       ;
314    list=widget_list(yoff=offy,list_base,value=["widget_list, ysize=3","created","with","WIDGET_LIST"],/multiple,YSIZE=3,xsize=12) & offy+=150 ;
315    label=widget_label(yoff=offy,list_base,value='1 line, placement inherited, xsize=2 chars (scroll)') & offy+=10                             ;
316    list=widget_list(yoff=offy,list_base,value=["widget_list, ysize=3","created","with","WIDGET_LIST"],/multiple,xsize=2) & offy+=150          ;
317    label=widget_label(yoff=offy,list_base,value='no size,fancy,framed(32 pix)') & offy+=10                                                    ;
318    list=widget_list(yoff=offy,list_base,value=["widget_list","(no YSIZE, frame=32)"],frame=32,font=fontname) & offy+=50                       ;
319    label=widget_label(yoff=offy,list_base,value='centered,frame=1',/align_center) & offy+=10                                                  ;
320    list=widget_list(yoff=offy,list_base,value=["(centered)"," frame=1"],/align_center,frame=1) & offy+=50                                     ;
321    label=widget_label(yoff=offy,list_base,value='basic') & offy+=10                                                                           ;
322    list=widget_list(yoff=offy,list_base,value=["default"," basic"]) & offy+=50                                                                ;
323    label=widget_label(yoff=offy,list_base,value='centered,basic',/align_center) & offy+=10                                                    ;
324    list=widget_list(yoff=offy,list_base,value=["(centered)","basic"],/align_center) & offy+=10                                                ;
325 endif
326
327  if total(strcmp('DRAW',present,/fold)) then begin
328;DRAW_BASE: Attach 256 x 256 draw widgets. Offsets 256 pix
329    draw_base = widget_base( tabbed_base, TITLE="DRAW",_extra=extra) & offy=0 ;,YSIZE=1000,XSIZE=1000,Y_SCROLL=300);XPAD=25,YPAD=50,SPACE=30)
330    label=widget_label(yoff=offy,draw_base,value='0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789') & offy+=10 ;
331; populate
332    if ~keyword_set(nocanvas) then begin
333       draw = WIDGET_DRAW(yoff=offy,draw_base, XSIZE = 1800, YSIZE = 600,x_scroll_size=256,y_scroll_size=256,frame=20)  & offy+=300                                         ;
334       draw2 = WIDGET_DRAW(yoff=offy,draw_base, xoff=100, xsize=400,ysize=400,x_scroll_size=200,y_scroll_size=200,/button_events,keyboard_events=1,/motion_events)  & offy+=250 ;
335       tmp=widget_label(xoff=200,yoff=offy,draw_base,value="below, has tooltip and has a popup") & offy+=10                                                                     ;
336
337       draw3 = WIDGET_DRAW(xoff=200,yoff=offy,draw_base,/BUTTON_EVENTS, xsize=100,ysize=100,tooltip="WIGDET_DRAW",EVENT_PRO = 'draw_context',uname='drawToBeDeleted')  & offy+=100 ;
338       contextBase = WIDGET_BASE(yoff=offy,draw3, /CONTEXT_MENU,col=2,TITLE="ZZZZZZZZZZZZZZ",UNAME = 'drawContext') & offy+=10;
339       b1 = WIDGET_BUTTON(yoff=offy,contextBase, VALUE = 'Delete this draw widget', /SEPARATOR, EVENT_PRO = 'DeleteDraw')
340       b2 = WIDGET_BUTTON(contextBase, VALUE = 'just an entry') & offy+=10;
341       b2 = WIDGET_BUTTON(contextBase, VALUE = 'just an entry, checked', /check) & offy+=10 ;
342       widget_control,b2,/set_button
343       b2 = WIDGET_BUTTON(contextBase, VALUE = 'just an entry') & offy+=10;
344       b3 = WIDGET_BUTTON(contextBase, VALUE = 'a menu', /menu) & offy+=10;
345       b4 = WIDGET_BUTTON(b3         , VALUE = 'an item.') & offy+=10;
346       b5 = WIDGET_BUTTON(b3         , VALUE = 'Delete this draw widget (again)', /SEPARATOR, EVENT_PRO = 'DeleteDraw')
347
348       tmp=widget_label(yoff=offy,draw_base,value="below, is centered, has tooltip and popup") & offy+=10                                                                                    ;
349       draw4 = WIDGET_DRAW(yoff=offy,draw_base,/BUTTON_EVENTS, xsize=100,ysize=100,tooltip="Centered WIGDET_DRAW",/align_center,EVENT_PRO = 'draw_context',uname='drawToBeDeleted2')  & offy+=10 ;
350    end else begin
351       dummy=widget_label(yoff=offy,draw_base, value="WIDGET_DRAW not shown, (/NOCANVAS option)", font=fontname)
352    endelse
353 endif
354 if total(strcmp('SLIDER',present,/fold)) then begin
355; SLIDER_BASE:
356    slider_baseh = widget_base( tabbed_base, TITLE="H_SLIDER",_extra=extra) & offy=0                                                                                           ;
357    label=widget_label(yoff=offy,slider_baseh,value='0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789') & offy+=10         ;
358;SLIDERs
359    tmp=widget_label(xoff=150,yoff=offy,slider_baseh,value="fancy, framed, horizontal, align:inherit") & offy+=10                                                              ;
360    sl1=widget_slider(xoff=150,yoff=offy,slider_baseh,MIN=0,MAX=100,TITLE="FRAME=100+DRAG+HORIZONTAL+FANCY",kill_notify='slider_killed',/DRAG,FRAME=100,font=fontname) & offy+=200 ;
361    tmp=widget_label(yoff=offy,slider_baseh,value="fancy, simple, horizontal, align:inherit") & offy+=10                                                                           ;
362    sl3=widget_slider(yoff=offy,slider_baseh,MIN=0,MAX=1000,TITLE="SIMPLE,HORIZONTAL",font=fontname) & offy+=100                                                                   ;
363    tmp=widget_label(yoff=offy,slider_baseh,value="no label, horizontal, align:inherit") & offy+=10                                                                                ;
364    sl3=widget_slider(yoff=offy,slider_baseh,MIN=0,MAX=1000) & offy+=30                                                                                                            ;
365    tmp=widget_label(yoff=offy,slider_baseh,value="except the following no label slider, centered",/align_center) & offy+=10                                                       ;
366    sl3=widget_slider(yoff=offy,slider_baseh,MIN=0,MAX=1000,/align_center) & offy+=10                                                                                              ;
367
368
369    slider_basev = widget_base( tabbed_base, TITLE="V_SLIDER",_extra=extra) & offy=0
370    label=widget_label(yoff=offy,slider_basev,value='0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789') & offy+=10     ;
371;SLIDERs
372    sl=widget_slider(yoff=offy,slider_basev,MIN=0,MAX=100,TITLE="FRAME=100+VERTICAL",kill_notify='slider_killed',ysize=300,xsize=200,FRAME=20,/VERT,font=fontname) & offy+=400 ;
373    sl3=widget_slider(yoff=offy,slider_basev,MIN=0,MAX=1000,TITLE="SIMPLE,VERTICAL",font=fontname,/vert) & offy+=200                                                           ;
374    tmp=widget_label(yoff=offy,slider_basev,value="except the following no label slider, centered",/align_center) & offy+=10                                                   ;
375    sl3=widget_slider(yoff=offy,slider_basev,MIN=0,MAX=1000,/vert,/align_center) & offy+=10                                                                                    ;
376
377 endif
378 if total(strcmp('BUTTON',present,/fold)) then begin
379; BUTTON_BASE:
380    button_base00 = widget_base( tabbed_base, TITLE="BUTTONs", COL=2, SPACE=20) & offy=10
381 ;   label=widget_label(yoff=offy,button_base00,value='0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789') & offy+=10 ;
382    button_base01 = widget_base(button_base00, TITLE="BUTTONs",_extra=extra) & offy=10
383    button_base02 = widget_base(button_base00, TITLE="BUTTONs",_extra=extra) & offy=10
384; BUTTONs
385    tmp=widget_label(yoff=offy,button_base01,value="Simple Button") & offy+=10           ;
386    tmp=widget_button(yoff=offy,button_base01,value="Simple Button") & offy+=10 ;
387    tmp=widget_label(yoff=offy,button_base01,value="Framed Simple Button") & offy+=10           ;
388    tmp=widget_button(yoff=offy,button_base01,value="Framed 10 px Simple Button",frame=10) & offy+=10 ;
389    tmp=widget_label(yoff=offy,button_base01,value="Bitmap Simple Button") & offy+=10           ;
390    tmp=widget_button(yoff=offy,button_base01,value=myBitmap()) & offy+=10 ;
391    tmp=widget_label(yoff=offy,button_base01,value="Fancy Simple Button") & offy+=10           ;
392    tmp=widget_button(yoff=offy,button_base01,value="Fancy Button",font=fontname) & offy+=10 ;
393    tmp=widget_label(yoff=offy,button_base01,value="Exclusive base, framed 30") & offy+=10  ;
394    radio=widget_base(yoff=offy,button_base01,/EXCLUSIVE,COL=1,frame=30) & offy+=150         ;
395    rb1=widget_button(radio,VALUE="button in EXCLUSIVE base 1",uvalue={vEv,'rb1',[8,0]}, font=fontname)
396    rb2=widget_button(radio,VALUE="button in EXCLUSIVE base 2",uvalue={vEv,'rb2',[9,0]})
397
398    tmp=widget_label(yoff=offy,button_base01,value="Non-Exclusive base,simple look") & offy+=10 ;
399
400    check=widget_base(yoff=offy,button_base01,/NONEXCLUSIVE,COL=1) & offy+=100 ;
401    cb1=widget_button(check,VALUE="button in NONEXCLUSIVE base 1",uvalue={vEv,'cb1',[81,0]}, font=fontname)
402    cb2=widget_button(check,VALUE="button in NONEXCLUSIVE base 2",uvalue={vEv,'cb2',[12,0]})
403
404    tmp=widget_label(yoff=offy,button_base01,value='2 CW_BGROUP /COL in a framed base') & offy+=10 ;
405
406    bg=widget_base(yoff=offy,button_base01,/ROW,Frame=10) & offy+=300 ;
407    values = ['One', 'Two', 'Three', 'Four', 'Five','Six']
408
409    bgroup1 = CW_BGROUP(yoff=offy,bg, values, /COLUMN, /EXCLUSIVE, $
410                        LABEL_TOP='Exclusive', FRAME=10,SET_VALUE=3)
411    bgroup2 = CW_BGROUP(yoff=offy,bg, values, /COLUMN, /NONEXCLUSIVE, $
412                        LABEL_TOP='Nonexclusive', FRAME=10, SET_VALUE=[1,0,1,0,1])
413
414    tmp=widget_label(yoff=offy,button_base02,value="A menu button frame 10") & offy+=10 ;
415    menu=widget_button(yoff=offy,button_base02,value="Menu",/menu,frame=10) & offy+=100 ;
416    entry1=widget_button(menu,value="entry 1")
417    entry2=widget_button(menu,value="entry 2")
418
419    tmp=widget_label(yoff=offy,button_base02,value="A menu button with Bitmap, frame 30") & offy+=10              ;
420    menu=widget_button(yoff=offy,button_base02,value=myBitmap(),/menu,frame=30,tooltip='A TOOOOOLTIP!!!') & offy+=100 ;
421    entry1b=widget_button(menu,value=myBitmap(),/menu)
422    entry1=widget_button(menu,value='submenu',/menu)
423    entry2b=widget_button(entry1b,value=myBitmap(),/menu)
424    entry2=widget_button(entry1,value="submenu",/menu)
425    entry3b=widget_button(entry2b,value=myBitmap())
426    entry3=widget_button(entry2,value='entry')
427
428    tmp=widget_label(yoff=offy,button_base02,value="A fancy menu button") & offy+=10     ;
429    menu=widget_button(yoff=offy,button_base02,value="Menu",/menu,font=fontname) & offy+=100 ;
430    entry1=widget_button(menu,value="entry 1",font=fontname)
431    entry2=widget_button(menu,value="entry 2")
432
433    tmp=widget_label(yoff=offy,button_base02,value="ALIGNMENTS",/align_center,/fram) & offy+=10 ;
434    base1=widget_base(yoff=offy,button_base02,/COL,/fram,xsize=400) & offy+=10                  ;
435    tmp=widget_label(yoff=offy,base1,value="Row Base 1")
436    base11=widget_base(yoff=offy,base1,/ROW,/fram)
437    tmp=widget_label(base11,value="inherited")
438    but=widget_button(base11,value="some button, no align",xsize=200)
439    tmp=widget_label(yoff=offy,base1,value="Row Base 2") & offy+=10                        ;
440    base12=widget_base(yoff=offy,base1,/ROW,/fram) & offy+=10                              ;
441    tmp=widget_label(base12,value="/align_left",/align_left) & offy+=10                    ;
442    but=widget_button(base12,value="some button, left-aligned",xsize=200,/align_left) & offy+=10 ;
443    tmp=widget_label(yoff=offy,base1,value="Row Base 3")
444    base13=widget_base(yoff=offy,base1,/ROW,/fram)
445    tmp=widget_label(base13,value="/align_right") & offy+=10                                   ;
446    but=widget_button(base13,value="some button, right-aligned",xsize=200,/align_right) & offy+=10 ;
447    base2=widget_base(yoff=offy,button_base02,/COL,/fram) & offy+=10                               ;
448    tmp=widget_label(base2,value="Column Base") & offy+=10                                       ;
449    tmp=widget_label(base2,value="A Button inheriting base orientation: text centered") & offy+=10 ;
450    but=widget_button(base2,value="some button, no align",xsize=200) & offy+=10                      ;
451    tmp=widget_label(base2,value="A left-aligned button",/align_left) & offy+=10                   ;
452    but=widget_button(base2,value="some button, left-aligned",xsize=300,/align_left) & offy+=10      ;
453    tmp=widget_label(base2,value="A right-aligned button") & offy+=10                              ;
454    but=widget_button(base2,value="some button, right-aligned",xsize=200,/align_right) & offy+=10    ;
455endif
456
457if total(strcmp('TABLE',present,/fold)) then begin
458; TABLE
459   table_base = widget_base( tabbed_base, TITLE="TABLEs",_extra=extra) & offy=0
460   label=widget_label(yoff=offy,table_base,value='0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789') & offy+=10 ;
461;
462   mytable1=widget_table(yoff=offy,table_base,value=dist(7),xsize=5,ysize=5,/editable,/all_events,font=fontname,frame=30) & offy+=200 ;
463;to be implemented! ;widget_control,mytable1,/editable,use_table_sel=[1,1,4,4]
464   widget_control,mytable1,edit_cell=[0,0]
465   widget_control,mytable1,background_color=[255,255,0],use_table_sel=[1,1,4,4]
466   nrows=n_elements(table)
467   subsize=nrows < 6
468   mytable2=widget_table(yoff=offy,table_base,value=table[0:subsize-1],/row_major,row_labels='',column_labels=tags,column_width=60,/resizeable_columns,y_scroll_size=40,/disjoint,/all_events,alignment=2,frame=50) & offy+=10 ;
469endif
470
471if total(strcmp('TREE',present,/fold)) then begin
472; TREE
473   tree_base = widget_base( tabbed_base, TITLE="TREE",_extra=extra) & offy=0
474   label=widget_label(yoff=offy,tree_base,value='0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789') & offy+=10 ;
475   if ~keyword_set(notree) then begin
476      racine = widget_tree(yoff=offy,tree_base,ysize=100) & offy+=90 ;
477      wtRoot = widget_tree(racine, VALUE='GDL', /folder, /draggable, /drop_events,ysize=200)
478      feuille_11 = WIDGET_TREE(wtRoot, VALUE='is', $
479                               UVALUE='LEAF')
480      branche_12 = WIDGET_TREE(wtRoot, VALUE='...', $
481                               /FOLDER, /EXPANDED)
482      feuille_121 = WIDGET_TREE(branche_12, VALUE='with', $
483                                UVALUE='LEAF',/CHECKBOX,CHECKED=1,/NO_COPY, TOOLTIP='an unuseful tootip...')
484      feuille_122 = WIDGET_TREE(branche_12, VALUE='a lot of', $
485                                UVALUE='LEAF')
486      feuille_13 = WIDGET_TREE(wtRoot, VALUE='widgets', $
487                               UVALUE='LEAF')
488      feuille_14 = WIDGET_TREE(wtRoot, VALUE='now', $
489                               UVALUE='LEAF')
490      racine = widget_tree(yoff=offy,tree_base,frame=50) & offy+=10 ;
491      wtRoot = widget_tree(racine, VALUE='GDL', /folder, /draggable, /drop_events)
492      feuille_11 = WIDGET_TREE(wtRoot, VALUE='is', $
493                               UVALUE='LEAF')
494      branche_12 = WIDGET_TREE(wtRoot, VALUE='...', $
495                               /FOLDER, /EXPANDED)
496      feuille_121 = WIDGET_TREE(branche_12, VALUE='with', $
497                                UVALUE='LEAF')
498      feuille_122 = WIDGET_TREE(branche_12, VALUE='a lot of', $
499                                UVALUE='LEAF')
500      feuille_13 = WIDGET_TREE(wtRoot, VALUE='widgets', $
501                               UVALUE='LEAF')
502      feuille_14 = WIDGET_TREE(wtRoot, VALUE='now', $
503                               UVALUE='LEAF')
504   endif
505endif
506
507
508
509
510if total(strcmp('LABEL',present,/fold)) then begin
511; LABEL
512   label_base = widget_base( tabbed_base, TITLE="LABELs",_extra=extra) & offy=0
513   label=widget_label(yoff=offy,label_base,value='0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789') & offy+=10 ;
514;
515   label1=widget_label(yoff=offy,label_base,VALUE="Sunken-frame label, inherits centering",/align_center) & offy+=10                   ;
516   label1=widget_label(yoff=offy,label_base,VALUE="Sunken-frame label",uvalue={vEv,'lll',[1,-1]},/sunken_frame,frame=33) & offy+=10                   ;
517   label2=widget_label(yoff=offy,label_base,VALUE="Framed 33 pix Fancy label, inherits centering",/align_center) & offy+=100                  ;
518   label2=widget_label(yoff=offy,label_base,VALUE="Framed Fancy label",uvalue={vEv,'lll',[1,-1]},font=fontname,frame=33) & offy+=100                  ;
519   label2=widget_label(yoff=offy,label_base,VALUE="frame=1 xsize=100 of a long FANCY text herits centering",/align_center) & offy+=100 ;
520   label2=widget_label(yoff=offy,xsize=100,label_base,VALUE="xSIZE=100 of a long FANCY text",uvalue={vEv,'lll',[1,-1]},font=fontname,/frame) & offy+=100 ;
521   label3=widget_label(yoff=offy,label_base,VALUE="simple label, herits centering",uvalue={vEv,'lll',[1,-1]}) & offy+=10                                 ;
522   label3=widget_label(yoff=offy,label_base,VALUE="simple label, centered",/align_center,uvalue={vEv,'lll',[1,-1]}) & offy+=10                          ;
523
524   label3=widget_label(yoff=offy,label_base,VALUE='500 pixels wide, herits centering',/align_center) & offy+=10 ;
525   label3=widget_label(yoff=offy,xsize=500,label_base,VALUE='I herit centering but am 300 pix long',uvalue={vEv,'lll',[1,-1]}) & offy+=10                                  ;
526   label3=widget_label(yoff=offy,label_base,VALUE='same, framed 1',/align_center) & offy+=10 ;
527   label3=widget_label(yoff=offy,xsize=500,label_base,VALUE='my frame herits centering but I am centered in my xsize=500',/frame,uvalue={vEv,'lll',[1,-1]}) & offy+=10                                  ;
528
529   label3=widget_label(yoff=offy,label_base,VALUE='500 pixels wide, right-centered',/align_center) & offy+=10       ;
530   label3=widget_label(yoff=offy,xsize=500,label_base,VALUE='I am right-aligned',/align_right) & offy+=10                                  ;
531   label3=widget_label(yoff=offy,label_base,VALUE='same, framed 1',/align_center) & offy+=10       ;
532   label3=widget_label(yoff=offy,xsize=500,label_base,VALUE='I am right-aligned in my xsize=500',/align_right,/frame) & offy+=10                                  ;
533
534endif
535
536if total(strcmp('DROPLIST',present,/fold)) then begin
537; DROPLIST
538   droplist_base = widget_base( tabbed_base, TITLE="DROPLISTs",_extra=extra) & offy=0
539   label=widget_label(yoff=offy,droplist_base,value='0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789') & offy+=10                   ;
540;
541   droplist=widget_droplist(yoff=offy,droplist_base,VALUE=["droplist","created","with","WIDGET_DROPLIST","(no YSIZE)"],title="A fancy droplist (framed)",font=fontname,frame=10) & offy+=50 ;
542   droplist=widget_droplist(yoff=offy,droplist_base,VALUE=["droplist","created","with","WIDGET_DROPLIST","(no YSIZE)"],title="A fancy droplist",font=fontname) & offy+=50                   ;
543   droplist=widget_droplist(yoff=offy,droplist_base,VALUE=["A","B","C"],title="A 1 char droplist") & offy+=20                                                                               ;
544   droplist=widget_droplist(yoff=offy,droplist_base,VALUE=["droplist","no Title","created","with","WIDGET_DROPLIST","(no YSIZE)"]) & offy+=30                                               ;
545   droplist=widget_droplist(yoff=offy,droplist_base,VALUE=["Centered droplist","no Title","created","with","WIDGET_DROPLIST","(no YSIZE)"],/align_center) & offy+=30                        ;
546endif
547if total(strcmp('COMBOBOX',present,/fold)) then begin
548;COMBO
549combobox_base = widget_base( tabbed_base, TITLE="COMBOBOXs",_extra=extra) & offy=0
550label=widget_label(yoff=offy,combobox_base,value='0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789') & offy+=10;
551;
552combo=widget_combobox(xoff=100,yoff=offy,combobox_base,VALUE=["A fancy combobox (framed)","not editable","created","with","WIDGET_COMBOBOX"],frame=30,font=fontname) & offy+=100;
553combo=widget_combobox(yoff=offy,combobox_base,VALUE=["A combobox","editable","created","with","WIDGET_COMBOBOX"],/editable) & offy+=30;
554combo=widget_combobox(yoff=offy,combobox_base,VALUE=["A ysize=100 combobox","editable","created","with","WIDGET_COMBOBOX"],YSIZE=100) & offy+=120;
555combo=widget_combobox(yoff=offy,combobox_base,VALUE=["Same, centered combobox","editable","created","with","WIDGET_COMBOBOX"],YSIZE=100,/align_center) & offy+=10;
556endif
557if total(strcmp('BASE',present,/fold)) then begin
558 ;MISC. BASES
559 bases_base0 = widget_base( tabbed_base , TITLE="BASEs",event_pro='base_event_base',_extra=extra) & offy=0
560 label=widget_label(yoff=offy,bases_base0,value='0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789') & offy+=10;
561 tmp=widget_label(yoff=offy,bases_base0,value="below a tab-based base with frame=30",font=fontname) & offy+=10;
562 tmp=widget_label(yoff=offy,bases_base0,value="containing a base, frame=100, with 2 buttons; ",font=fontname) & offy+=10;
563 tmp=widget_label(yoff=offy,bases_base0,value="another with a label and a text; ",font=fontname) & offy+=10;
564 tmp=widget_label(yoff=offy,bases_base0,value="another a /scroll ,frame=100, space=50",font=fontname) & offy+=10;
565 bases_base = widget_base(yoff=offy, bases_base0,/COL,frame=30) & offy+=10;
566 charpix = 8.5
567 butSize = 7*charpix
568
569actionBase=widget_base(bases_base,/ROW,frame=100) & offy+=10;
570
571quitButton = widget_button(actionBase,value='WILL QUIT',uvalue={vEv,'quit',[5,0]}, font=fontnam)
572downButton = widget_button(actionBase,value='A 300 px Button..', /dynamic_resize)
573selectBase=widget_base(bases_base,/ROW,frame=1)
574;a label that can be updated by pushing buttons
575labeltoupdate = widget_label(selectBase, value='Label xsize=100(pixels),ysize=30(pixels)',xsize=100,ysize=30)
576;show last button clicked value
577statusLabel = widget_text(selectBase,value=['012345678901234567890123456789012','text, xsize=32(characters),ysize=10(chars)','3','4','5','6','7','8','9','10'], $
578                          xsize=32,ysize=10)
579                                ;pass label to top (avoid using a common)
580widget_control,base,set_uvalue=[statusLabel,labeltoupdate]
581
582;names of columns
583tags = tag_names(table)
584; nb of colums=nb tags
585ncols=n_tags(table)
586nrows=n_elements(table)         ; check...
587;set max size (chars) of displayed button/label for each column
588maxSize = intarr(nCols)
589for icol = 0, nCols-1 do maxSize[icol] = 1 + MAX(strlen(strtrim(table.(icol),2)))
590
591;buttons containing header keyword values
592buttons = lonarr(nCols,nRows)
593;buttons containing column labels
594tagButtons=lonarr(nCols)
595fileButtons = lonarr(nRows)
596fileNumbers = lonarr(nRows)
597;base for listing contents of tables and to show selected files
598;   fileBase=widget_base(bases_base,/scroll,frame=3)
599;base to contain column labels and cells with table values and selected files
600dummy = widget_label(bases_base,value=' ')
601listentries=widget_base(bases_base,row=nRows+1,/scroll,space=50, x_scroll=300,frame=10,y_scroll=300)
602widget_control,dummy,set_value='Scrolled Base below has ID='+string(listentries)
603;create column labels
604dummy = widget_label(listentries,value=' ', xsize=30)
605dummy1 = widget_label(listentries,value=' ',xsize=30)
606for icol =0, nCols-1 do tagButtons[icol]=widget_label(listentries,value=tags[icol], xsize=charpix*maxSize[icol],/align_left)
607for iRow=0,nRows-1 do begin
608   fileNumbers[iRow]=widget_label(listentries, value=string(iRow), xsize=30, ysize=25)
609   fileButtons[iRow]=widget_button(listentries, value="*", uvalue={vEv,'file',[iRow,-1]}, xsize=30, ysize=25)
610   for icol=0,nCols-1 do buttons[icol, iRow] = widget_button(listentries, value=strtrim((table[iRow].(icol)),2), uvalue={vEv,'data',[icol,iRow]}, ysize=25,  xsize=charpix*maxSize[iCol],/align_left,kill_notify='button_killed')
611endfor
612;;overwrite label:
613;print,"label to update id="+string(labeltoupdate)
614widget_control, labeltoupdate, set_value="Text2 has been replaced with widget_control"
615
616; overwrite buttons;
617   for iRow=0,nRows-1 do widget_control,fileButtons[iRow], set_value="Y"
618;;
619
620
621endif
622
623
624;tests for /notify_realize and /kill_notify
625;
626widget_control,base,notify_realize='i_am_realized'
627;Realize the widgets.
628WIDGET_CONTROL, /REALIZE, base
629
630;;Obtain the window index.
631if ~keyword_set(nocanvas) and total(strcmp('DRAW',present,/fold)) then begin
632print,"Draw widgets:",draw,draw2
633 WIDGET_CONTROL, draw, GET_VALUE = index
634  WIDGET_CONTROL, draw2, GET_VALUE = index2
635
636    ;;
637    ;; Set the new widget to be the current graphics window
638 print,"window indexes",index,index2
639 image=dist(128)
640 WSET,index
641 n=100 & x=randomu(seed,n)& y=randomu(seed,n) &p=randomu(seed,10)*n & x[p]=x[3] &y[p]=y[22]& TRIANGULATE, x, y, tr,b,rep=r,conn=conn &myplot,tr,x,y,b,conn,1
642
643    ;;
644 WSET, index2
645 f=findgen(1000)/100.
646 contour,cos(dist(100,100)/10.)
647 tv,image,10,10,/data; ,/true
648endif
649
650xmanager,"handle",base,cleanup="cleanup_xmanager",no_block=~block
651end
652