;------------------------------------------------------------ ;------------------------------------------------------------ ;------------------------------------------------------------ ;+ ; NAME:xxx ; ; PURPOSE:un maximum de possibilites avec un minimum de clics ; ; CATEGORY:super widget ; ; CALLING SEQUENCE:xxx ; ; INPUTS:none ; ; KEYWORD PARAMETERS: ; ; /SEPARATE: pour separer la partie boutons de la partie dessin ; en 2 fenetres. Utile pour les petits ecrans, mais attention ; peut saturer la memoire video de certains Tx un peu vetustes. ; ; RESTORE='toto.dat' ou toto.dat est un fichier cree lors d''une ; precedente utilisation de xxx grace a la commande "Widget" du ; menu "save as". ; ; OUTPUTS: ; ; COMMON BLOCKS:common.pro ; ; SIDE EFFECTS: ; ; RESTRICTIONS: ; ; EXAMPLE: ; ; MODIFICATION HISTORY:Sebastien Masson (smasson@lodyc.jussieu.fr) ; ;- ;------------------------------------------------------------ ;------------------------------------------------------------ ;------------------------------------------------------------ PRO xxx_event, event ;------------------------------------------------------------ @common ;------------------------------------------------------------ ; = widget_info(event.top,find_by_uname = '') ; quel est le type d''evenement? ; if event.id EQ 622 then help, event, /struct widget_control, event.id, get_uvalue=uval if (tag_names(event, /structure_name))[0] EQ 'WIDGET_TRACKING' then uval = {name:'ActiverFenetre'} if keyword_set(uval) EQ 0 then return ;help, event, /struct ;help, uval , /struct ; case sur le type d''evenement widget_control, event.top, get_uvalue = top_uvalue ; si on a active le mot cles separate a l''appelle de xxx if size(top_uvalue, /type) EQ 3 then begin event.top = top_uvalue widget_control, event.top, get_uvalue = top_uvalue endif ; on tue le petit widget cree par notice.pro si il existe noticebase = extractatt(top_uvalue, 'noticebase') if noticebase NE 0 then BEGIN widget_control, noticebase, /destroy *top_uvalue[1, findline(top_uvalue, 'noticebase')] = 0l endif ; ; options = extractatt(top_uvalue, 'options') index = where(options EQ 'Ok button') & index = index[0] currentplot = (extractatt(top_uvalue, 'petitout'))[2]-1 okbutton = extractatt(top_uvalue, 'optionsflag') okbutton = okbutton[index, currentplot] case uval.name OF 'menubar':xxxmenubar_event, event 'ok':nouveaudessin = 1 'specifie':nouveaudessin = event.ok*(1-okbutton) 'action':nouveaudessin = 1-okbutton 'calendar1':BEGIN date2id = widget_info(event.top, find_by_uname = 'calendar2') widget_control, date2id, get_value = date2 if event.value GT date2 then widget_control, date2id, set_value = event.value nouveaudessin = 1-okbutton END 'calendar2':BEGIN date1id = widget_info(event.top, find_by_uname = 'calendar1') widget_control, date1id, get_value = date1 if event.value LT date1 then widget_control, date1id, set_value = event.value nouveaudessin = 1-okbutton END 'domain':nouveaudessin = 1-okbutton 'champ':BEGIN currentfile = extractatt(top_uvalue, 'currentfile') listvar = (*(extractatt(top_uvalue, 'fileparameters'))[currentfile]).listvar name = listvar[event.index] changefield, event.top, name nouveaudessin = 1-okbutton END 'nom_exp':nouveaudessin = 1-okbutton 'filelist':BEGIN filelist = extractatt(top_uvalue, 'filelist') newfilename = filelist[event.index] changefile, event.top, newfilename END 'ActiverFenetre':BEGIN if event.enter EQ 1 AND !d.name NE 'PS' then BEGIN ; graphid = widget_info(event.top,find_by_uname = 'graph') graphid = extractatt(top_uvalue, 'graphid') widget_control,graphid,get_value=win wset, win widget_control,event.top,get_uvalue=top_uvalue numdessinin = (extractatt(top_uvalue, 'petitin'))[2]-1 !p = (extractatt(top_uvalue, 'penvs'))[numdessinin] !x = (extractatt(top_uvalue, 'xenvs'))[numdessinin] !y = (extractatt(top_uvalue, 'yenvs'))[numdessinin] endif END 'graph':BEGIN quelclick = identifyclick(event) case quelclick.type of 'inutile':return 'long':longclickaction, event 'single':BEGIN print, quelclick.type END 'double':doubleclickaction, event endcase END endcase if keyword_set(nouveaudessin) then letsdraw, event.top return end ;------------------------------------------------------------ ;------------------------------------------------------------ ;------------------------------------------------------------ ;------------------------------------------------------------ ;------------------------------------------------------------ ;------------------------------------------------------------ PRO xxx, BOITE = boite, CALLERWIDID = CallerWidId, DATE1 = date1, DATE2 = date2, PETIT = petit, MULTISTRUCTURE = multistructure, REDRAW = redraw, SEPARATE = separate, UVALUE = uvalue, RESTORE = restore, _EXTRA = ex ;------------------------------------------------------------ @common ;------------------------------------------------------------ ; initialisation de l''environnement ;------------------------------------------------------------ reinitplt ;------------------------------------------------------------ ; on va recupere la uvalue attache au widget qui a ; appele le nouveau widget que l''on est en train de mettre en place if keyword_set(restore) then BEGIN restore = isafile(filename = restore, iodir = homedir) if size(restore, /type) NE 7 then restore = 0 ELSE BEGIN restore, isafile(file = restore, io = homedir) newgrid = *(extractatt(uvalue, 'meshparameters'))[0] change = changegrid(newgrid) ENDELSE endif if n_elements(CallerWidId) NE 0 THEN $ widget_control, CallerWidId, get_uvalue = uvalue ELSE CallerWidId = 0 ;------------------------------------------------------------ ; on commmence la definition du widget... ;------------------------------------------------------------ ; sa base base = widget_base(column = 1-(key_portrait OR keyword_set(SEPARATE)) $ , row = key_portrait OR keyword_set(SEPARATE), title='xxx' $ , GROUP_LEADER = group, /tracking_events, uname = 'base', mbar = mbarid) ; la barre de menu if keyword_set(uvalue) then begin options = extractatt(uvalue, 'options') ENDIF ELSE options = ['Ok button', 'Portrait/Landscape', 'Overlay', 'Vecteur', 'Longitude / x index', 'Latitude / y index'] xxxmenubar, mbarid, options = options ;------------------------------------------------------------ ; on passe a la definition de tout ce qui est au dessus du dessin ;------------------------------------------------------------ ; base contenant les boutons au dessus, a gauche du dessin base1 = widget_base(base, /column) base1bis = widget_base(base1, column = key_portrait OR keyword_set(SEPARATE) $ , row = 1-(key_portrait OR keyword_set(SEPARATE))) ;------------------------------------------------------------ ; sous base separant les boutons du widget_domain base11=widget_base(base1bis, /row) ; base111=widget_base(base11, /column) ; boutton 'OK' baseok = widget_base(base111, /row, /align_right $ , map = 0, uname = 'base ok button') rien = widget_button(baseok, /align_right, value = ' OK ', uvalue = {name:'ok'}, /frame) ; droplist des types de plots possibles graphtype = ['plt','pltz', 'pltt', 'xy', 'xz', 'yz', 'xt', 'yt', 'zt', 'x', 'y', 'z', 't'] graphtypeid = widget_droplist(base111, value = graphtype, uname = 'action', uvalue = {name:'action', choix:graphtype}) ; configuration de la page if n_elements(petit) eq 0 then BEGIN petitin = [1, 1, 1] petitout = [1, 1, 1] endif if keyword_set(uvalue) then begin petitin = extractatt(uvalue, 'petitin') petitout = extractatt(uvalue, 'petitout') endif nbredessin = petitin[0]*petitin[1] numdessinin = petitin[2]-1 ; rien = cw_miseenpage(base11, petitin, /row, /frame) ; mapping du boutton 'OK' if keyword_set(uvalue) then flag = extractatt(uvalue,'optionsflag') $ ; ELSE flag = [0, key_portrait, 0, 1, 0, 0, 0]#replicate(1, petitin[2]-1) ELSE flag = [1, key_portrait, 0, 0, 0, 0]#replicate(1, nbredessin) currentflag = flag[*, petitin[2]-1] widget_control, baseok, map = currentflag[0] ; ; liste des fichiers que l''on veut regarder ; if keyword_set(uvalue) then BEGIN currentfile = extractatt(uvalue,'currentfile') filelist = extractatt(uvalue,'filelist') fileparameters = extractatt(uvalue,'fileparameters') readparameters = extractatt(uvalue,'readparameters') meshparameters = extractatt(uvalue,'meshparameters') ENDIF ELSE BEGIN if keyword_set(multistructure) then newfile = multistructure ELSE newfile = selectfile() if size(newfile, /type) NE 8 then return fileparameters = ptrarr(1, /allocate_heap) *fileparameters[0] = newfile.fileparameters readparameters = ptrarr(1, /allocate_heap) *readparameters[0] = newfile.readparameters meshparameters = ptrarr(1, /allocate_heap) *meshparameters[0] = newfile.meshparameters currentfile = 0 filelist = newfile.fileparameters.filename ENDELSE ; liste des fichiers rien = widget_list(base11, value = filelist, uname = 'filelist', uvalue = {name:'filelist'}, scr_xsize = 100) ; specification de l''operation que l''on veut faire sur les fichiers if keyword_set(CallerWidId) then begin widget_control, widget_info(CallerWidId, find_by_uname = 'nom_exp'), get_value = value value = value[0] ENDIF ELSE value = prefix rien=widget_text(base11, value = value, uvalue={name:'nom_exp'}, uname='nom_exp', /editable) ; liste des variables currentlistvar = (*fileparameters[currentfile]).listvar ; if keyword_set(separate) then basechamp = widget_base(base1bis, /row) base12=widget_base(base1bis, /row , uname = 'base12') if NOT keyword_set(separate) then basechamp = base12 ; rien=widget_droplist(basechamp, value=currentlistvar, title ='champ' $ , uvalue ={name:'champ'}, uname='champ') if keyword_set(CallerWidId) then begin selectvar = widget_info(widget_info(CallerWidId, find_by_uname = 'champ'), /droplist_select) ENDIF ELSE selectvar = 0 widget_control, rien, set_droplist_select = selectvar ; calendrier currentcalendar = (*fileparameters[currentfile]).time_counter if keyword_set(CallerWidId) then begin widget_control, widget_info(CallerWidId, find_by_uname = 'calendar1'), get_value = date1 widget_control, widget_info(CallerWidId, find_by_uname = 'calendar2'), get_value = date2 date1 = juldate(date1) date2 = juldate(date2) ENDIF rien = cw_calendar(base12,currentcalendar, date1, uname = 'calendar1', uvalue = {name:'calendar1'}, /frame) rien = cw_calendar(base12,currentcalendar, date2, uname = 'calendar2', uvalue = {name:'calendar2'}, /frame) ;------------------------------------------------------------ ; 2eme ligne ;------------------------------------------------------------ vargrid = strupcase((*fileparameters[currentfile]).listgrid[selectvar]) IF vargrid EQ 'W' then zgrid = 'W' ELSE zgrid = 'T' rien = cw_domain(base1, uname = 'domain', uvalue = {name:'domain'}, /unzoom, /frame, boite = boite, row = 1-(key_portrait OR keyword_set(SEPARATE)), column = key_portrait OR keyword_set(SEPARATE)) ;------------------------------------------------------------ ; 3eme ligne ;------------------------------------------------------------ rien = cw_specifie(base1, uname = 'specifie', uvalue = {name:'specifie'}, /frame, column = key_portrait OR keyword_set(SEPARATE), /forxxx) if keyword_set(CallerWidId) then BEGIN widget_control, widget_info(CallerWidId, find_by_uname = 'specifie'), get_value = specifie_value widget_control, widget_info(base, find_by_uname = 'specifie'), set_value = specifie_value ENDIF ;------------------------------------------------------------ ; partie graph ;------------------------------------------------------------ if keyword_set(separate) then $ basegraph = widget_base(title = 'xxx window', group_leader = base, uvalue = base) $ ELSE basegraph = widget_base(base, /row) windsize = givewindowsize() graphid = widget_draw(basegraph, uname = 'graph' $ , uvalue = {name:'graph', press:0, click:0, x:[0., 0.], y:[0., 0.]} $ , /button_events, retain = 2 $ , xsize=windsize[0], ysize=windsize[1]) if keyword_set(separate) then begin widget_control,basegraph,/realize xmanager,'xxx',basegraph, /no_block endif ;------------------------------------------------------------ ;------------------------------------------------------------ ; base3 = widget_base(base, row = 1-key_portrait, column = key_portrait, /align_right) ; ;------------------------------------------------------------ ; base31 = widget_base(base3, row = 1-key_portrait, column = key_portrait, /align_right, map = 0, uname = 'base ok button') ; rien = widget_button(base31, /align_right, value = ' OK ', uvalue = {name:'ok'}, /frame) ; rien = cw_to(base3, /frame, row = 1-key_portrait, column = key_portrait) ; rien = cw_conclu(base3, /align_right, row = 1-key_portrait, column = key_portrait, /frame) ;------------------------------------------------------------ ;execution de la fentre de base et des sous-fenetres widget_control,base,/realize ;------------------------------------------------------------ if keyword_set(uvalue) then BEGIN ; ; on recopie le pointeur uvalue dans top_uvalue. ; Attention, il faut completement redefinir top_uvalue a partir des ; variables pointees par uvalue. Sinon si on fait simplement ; top_uvalue = uvalue, qd on detruit par uvalue et les variables ; surlesquelles il pointe on detruit aussi les variables sur ; lesquelles pointent top_uvalue. case 1 of keyword_set(redraw):BEGIN top_uvalue = uvalue widget_control, base, set_uvalue = top_uvalue ; we find homedir homedir = isadirectory(io = homedir, title = 'Bad definition of homedir') ; portrait ou landscape ??? options = extractatt(top_uvalue, 'options') optionsflag = extractatt(top_uvalue, 'optionsflag') portrait = (optionsflag[where(options EQ 'Portrait/Landscape'), 0])[0] ; on recupere la liste des instructions globalcommand = extractatt(top_uvalue, 'globalcommand') ; on complete par le premiere et les dernieres lignes du programme globalcommand = ['pro xxx2ps, NOERASE = noerase, POSTSCRIPT = postscript, PORTRAIT = portrait, LANDSCAPE = landscape' $ , globalcommand $ , 'return', 'end'] putfile, homedir+'xxx2ps.pro', globalcommand ; on l''ecrit resolve_routine, 'xxx2ps' ; on le compile xxx2ps, /noerase, portrait = portrait ; on l''applique END keyword_set(restore):begin top_uvalue = uvalue widget_control, base, set_uvalue = top_uvalue widget_control, graphid,get_value=win wshow, win wset, win tv, image, /true ; etat des widgets updatewidget, base ; menage END ELSE:BEGIN top_uvalue = ptrarr(2, 29, /allocate_heap) FOR i = 0, 28 do *top_uvalue[0, i] = *uvalue[0, i] FOR i = 0, 14 do *top_uvalue[1, i] = *uvalue[1, i] FOR i = 18, 27 do *top_uvalue[1, i] = *uvalue[1, i] numfile = n_elements(extractatt(uvalue, 'filelist')) *top_uvalue[1, 15] = ptrarr(numfile, /allocate_heap) *top_uvalue[1, 16] = ptrarr(numfile, /allocate_heap) *top_uvalue[1, 17] = ptrarr(numfile, /allocate_heap) for i = 0, numfile-1 do begin *(*top_uvalue[1, 15])[i] = *(*uvalue[1, 15])[i] *(*top_uvalue[1, 16])[i] = *(*uvalue[1, 16])[i] *(*top_uvalue[1, 17])[i] = *(*uvalue[1, 17])[i] endfor *top_uvalue[1, 28] = ptrarr(nbredessin, /allocate_heap) for i = 0, nbredessin-1 do *(*top_uvalue[1, 28])[i] = *(*uvalue[1, 28])[i] widget_control, base, set_uvalue = top_uvalue ; copie l''ecran du widget de uvalue dans celui de top_uvalue if keyword_set(CallerWidId) then begin widget_control, extractatt(uvalue, 'graphid'),get_value=win wshow, win wset, win image = tvrd(/true) widget_control, graphid,get_value=win wshow, win wset, win tv, image, /true ENDIF END endcase *top_uvalue[1, findline(top_uvalue, 'graphid')] = graphid ; ENDIF ELSE BEGIN ; sinon on va definit tous les elements que l''on acroche au widget ; grace a la top_uvalue qui est un tableau de pointeurs a 2 colonnes: ; les noms et des variables ; on initialie tous ces elements. ; variables concernant le widget ds sa generalite if NOT keyword_set(ex) then ex = {nothing:0} ; variables se rapportant aux differents fichiers que l''on peut lire ; variables specifiques a chaque dessin ; types = strarr(nbredessin) champs = strarr(2, nbredessin) domaines = fltarr(6, nbredessin) nameprocedures = strarr(nbredessin) dates = lonarr(2, nbredessin) prefixes = strarr(nbredessin) exextra = ptrarr(nbredessin, /allocate_heap) ; creation du pointeur que l''on va attache au widget. top_uvalue = ptrarr(2, 29, /allocate_heap) ; variables se rapportant au widget en general *top_uvalue[0, 0] = 'options' & *top_uvalue[1, 0] = options *top_uvalue[0, 1] = 'petitin' & *top_uvalue[1, 1] = petitin *top_uvalue[0, 2] = 'petitout' & *top_uvalue[1, 2] = petitout *top_uvalue[0, 3] = 'graphid' & *top_uvalue[1, 3] = graphid *top_uvalue[0, 4] = 'alreadyvector' & *top_uvalue[1, 4] = -1 *top_uvalue[0, 5] = 'alreadyover' & *top_uvalue[1, 5] = -1 *top_uvalue[0, 6] = 'alreadyread' & *top_uvalue[1, 6] = -1 *top_uvalue[0, 7] = 'currentreadcommand' & *top_uvalue[1, 7] = '' *top_uvalue[0, 8] = 'globalcommand' & *top_uvalue[1, 8] = '' *top_uvalue[0, 9] = 'globaloldcommand' & *top_uvalue[1, 9] = '' *top_uvalue[0, 10] = 'zgrid' & *top_uvalue[1, 10] = zgrid *top_uvalue[0, 11] = 'noticebase' & *top_uvalue[1, 11] = 0l *top_uvalue[0, 12] = 'extra' & *top_uvalue[1, 12] = ex ; variables se rapportant aux differents fichiers que l''on peut lire *top_uvalue[0, 13] = 'currentfile' & *top_uvalue[1, 13] = currentfile *top_uvalue[0, 14] = 'filelist' & *top_uvalue[1, 14] = filelist *top_uvalue[0, 15] = 'fileparameters' & *top_uvalue[1, 15] = fileparameters *top_uvalue[0, 16] = 'readparameters' & *top_uvalue[1, 16] = readparameters *top_uvalue[0, 17] = 'meshparameters' & *top_uvalue[1, 17] = meshparameters ; variables se rapportant aux differents dessins que l''on peut faire *top_uvalue[0, 18] = 'penvs' & *top_uvalue[1, 18] = replicate(!p, nbredessin) *top_uvalue[0, 19] = 'xenvs' & *top_uvalue[1, 19] = replicate(!x, nbredessin) *top_uvalue[0, 20] = 'yenvs' & *top_uvalue[1, 20] = replicate(!y, nbredessin) *top_uvalue[0, 21] = 'nameprocedures' & *top_uvalue[1, 21] = nameprocedures *top_uvalue[0, 22] = 'types' & *top_uvalue[1, 22] = types *top_uvalue[0, 23] = 'champs' & *top_uvalue[1, 23] = champs *top_uvalue[0, 24] = 'domaines' & *top_uvalue[1, 24] = domaines *top_uvalue[0, 25] = 'dates' & *top_uvalue[1, 25] = dates *top_uvalue[0, 26] = 'prefixes' & *top_uvalue[1, 26] = prefixes *top_uvalue[0, 27] = 'optionsflag' & *top_uvalue[1, 27] = flag *top_uvalue[0, 28] = 'exextra' & *top_uvalue[1, 28] = exextra ; widget_control, base, set_uvalue = top_uvalue createhistory, base, petitin ; ENDELSE ;------------------------------------------------------------ xmanager,'xxx',base, /no_block ;------------------------------------------------------------ ;------------------------------------------------------------ return end