;+ ; NAME: ; widget_lay1 ; ; PURPOSE: ; Example widget with the following attributes ; - state is saved XXX ; - journalling, macros, and command access to widget events ; - tabs ; ; CALLING SEQUENCE: ; widget_lay1 ; ; INPUTS: ; none when called ; ; OPTIONAL INPUT: ; None ; ; OPTIONAL INPUT KEYWORD: ; None ; ; OUTPUTS: ; Journal file ; ; RESTRICTIONS: ; None ; ; EXAMPLE: ; widget_lay1 ; ; PROCEDURE ; widget structure is as follows: ; + wTopLevelBase - top-level base widget ; == wTab - Tab ; --- wSetTab - Tab with setting ; .... wGreetingRow - Base to put the greeing in one row ; ._._._. wGreetingLabel ; ._._._. wGreeting ; .... wGreeting - Text box ; --- wActionTab - Tab with actions (buttons) ; .... wGreet - button ; .... wDone - button ; --- wJournalTab - First Tab ; .... wBrowseMacro ; .... wMacroName ; .... wExecuteMacro ; .... wMacro ; .... wBrowseJournal ; .... wJournalName ; .... wSaveJournal ; .... wJournal ; == wCommand - text box ; ; data structure elements are as follows: ; macroName ; journalName ; journal ; greeting ; ; MODIFICATION HISTORY: ; WRITTEN, Leslie Young, SwRI, May 2010 ;- pro widget_lay1_event, ev ; ONLY NAMED WIDGETS HAVE COMMANDS uname = widget_info(ev.id, /uname) if uname eq '' then return ; BUILD THE COMMAND ; If entered in command, then we're done case uname of 'wCommand': begin widget_control, ev.id, get_value=command command = command[0] end else: begin type_name = widget_info(ev.id, /name) case type_name of 'BUTTON': command = 'widget_lay1_'+uname else: begin widget_control, ev.id, get_value=value value = value[0] command = 'widget_lay1_'+uname + ", '" + value + "'" end endcase ; type_name end endcase ; uname widget_lay1_command, command, ev.top end pro widget_lay1_command, command, id ; Change the "LastCommand" widget wLastCommand = widget_info(id, find_by_uname='wLastCommand') WIDGET_CONTROL, wLastCommand, SET_VALUE=command ; Append to the journal wJournal = widget_info(id, find_by_uname='wJournal') WIDGET_CONTROL, wJournal, GET_VALUE=journal pre = '' if strmatch(command, 'widget_lay1_wExecuteMacro*', /fold) then pre = '; ' journal = [journal, pre + command] WIDGET_CONTROL, wJournal, SET_VALUE=journal ; Execute post = '' if strmatch(command, 'widget_lay1*', /fold) then post = ', '+ strtrim(string(id)) result = EXECUTE(command + post) end pro widget_lay1_wGreeting, value, id wGreeting = widget_info(id, find_by_uname='wGreeting') WIDGET_CONTROL, wGreeting, SET_VALUE=value end pro widget_lay1_wGreetingRep, value, id widget_control, id, get_uvalue=state, /no_copy wGreetingRep = widget_info(id, find_by_uname='wGreetingRep') ; WIDGET_CONTROL, wGreetingRep, GET_VALUE=greetingRep state.greetrep = float(value + ' 0') WIDGET_CONTROL, wGreetingRep, SET_VALUE=strtrim(string(state.greetrep),2) widget_control, id, set_uvalue=state, /no_copy end pro widget_lay1_wGreet, id widget_control, id, get_uvalue=state, /no_copy wJournal = widget_info(id, find_by_uname='wJournal') WIDGET_CONTROL, wJournal, GET_VALUE=journal wGreeting = widget_info(id, find_by_uname='wGreeting') WIDGET_CONTROL, wGreeting, GET_VALUE=greeting for i = 0, state.greetrep - 1 do begin print, greeting journal = [journal, '; ' + greeting] WIDGET_CONTROL, wJournal, SET_VALUE=journal endfor widget_control, id, set_uvalue=state, /no_copy end pro widget_lay1_wDone, id WIDGET_CONTROL, id, /DESTROY end pro widget_lay1_wBrowseMacro, id fullfilename = dialog_pickfile(/must_exist, get_path=dir, title='Select a Macro File to Load') command = "widget_lay1_wMacroName, '"+fullfilename+"'" widget_lay1_command, command, id ; widget_lay1_wMacroName, fullfilename, id print, fullfilename end pro widget_lay1_wMacroName, value, id wMacroName = widget_info(id, find_by_uname='wMacroName') WIDGET_CONTROL, wMacroName, SET_VALUE=value if isfile(value) then begin readcol, value, macro, fo='A', delim=string(13B) endif wMacro = widget_info(id, find_by_uname='wMacro') WIDGET_CONTROL, wMacro, SET_VALUE=macro end pro widget_lay1_wExecuteMacro, id wMacro = widget_info(id, find_by_uname='wMacro') WIDGET_CONTROL, wMacro, GET_VALUE=macro for i = 0, n_elements(macro)-1 do widget_lay1_command, macro[i], id end pro widget_lay1_wBrowseJournal, id fullfilename = dialog_pickfile(get_path=dir, title='Select a Filename for saveing Journal') command = "widget_lay1_wJournalName, '"+fullfilename+"'" widget_lay1_command, command, id end pro widget_lay1_wJournalName, value, id wJournalName = widget_info(id, find_by_uname='wJournalName') WIDGET_CONTROL, wJournalName, SET_VALUE=value end pro widget_lay1_wSaveJournal, id wJournalName = widget_info(id, find_by_uname='wJournalName') WIDGET_CONTROL, wJournalName, GET_VALUE=journalName wJournal = widget_info(id, find_by_uname='wJournal') WIDGET_CONTROL, wJournal, GET_VALUE=journal openw, lun, journalName, /get_lun, err = err if err ne 0 then begin close, lun free_lun, lun return endif for i=0, n_elements(journal)-1 do printf, lun, journal[i] close, lun free_lun, lun end pro widget_lay1 ; CREATE THE DATA STRUCTURE state = { $ greetrep : 3 $ ; number of times to repeat greeting } ; + wTopLevelBase wTopLevelBase = WIDGET_BASE(/COLUMN, title = 'WIDGET_LAY1', UVALUE=state, UNAME='wTopLevelBase') ; == wTab - Tab wTab = WIDGET_TAB(wTopLevelBase) ; --- wSetTab - Tab with settings wSetTab = WIDGET_BASE(wTab, TITLE='Settings', /COLUMN) wGreetingRow = WIDGET_BASE(wSetTab, /ROW) wGreetingLabel = WIDGET_LABEL(wGreetingRow, VALUE='Enter Text for Greeting') wGreeting = WIDGET_TEXT(wGreetingRow, /EDITABLE, VALUE='Hello', $ UNAME = 'wGreeting') wGreetRepRow = WIDGET_BASE(wSetTab, /ROW) wGreetRepLabel = WIDGET_LABEL(wGreetRepRow, VALUE='Enter Number of times to repeat greeting') wGreetingRep = WIDGET_TEXT(wGreetRepRow, /EDITABLE, $ UNAME='wGreetingRep', $ VALUE=strtrim(string(state.greetrep),2)) ; --- wActionTab - Tab with actions (buttons) wActionTab = WIDGET_BASE(wTab, TITLE='Actions', /COLUMN) wGreet = WIDGET_BUTTON(wActionTab, VALUE='Greet', UNAME='wGreet') wDone = WIDGET_BUTTON(wActionTab, VALUE='Done', UNAME='wDone') ; --- wJournalTab - Tab with Journal things wJournalTab = WIDGET_BASE(wTab, TITLE='Journal', /COLUMN) wMacroRow = WIDGET_BASE(wJournalTab, /ROW) ; .... wBrowseMacro wBrowseMacro = WIDGET_BUTTON(wMacroRow, VALUE='Choose Macro File', $ UNAME='wBrowseMacro') ; .... wMacroName wMacroLabel = WIDGET_LABEL(wMacroRow, VALUE='Macro File') cd,current=pwd macroName = pwd+'/macro.txt' wMacroName = WIDGET_TEXT(wMacroRow, /EDITABLE, xsize=80, $ UNAME='wMacroName', $ VALUE=macroname) ; .... wExecuteMacro wExecuteMacro = WIDGET_BUTTON(wMacroRow, VALUE='Execture Macro', $ UNAME='wExecuteMacro') ; .... wMacro if isfile(macroname) then begin readcol, macroname, macro, fo='A', delim=string(13B) endif wMacro = WIDGET_TEXT(wJournalTab, /scroll, ysize = 10, $ UNAME='wMacro', $ VALUE=macro) wJournalRow = WIDGET_BASE(wJournalTab, /ROW) ; .... wBrowseJournal wBrowseJournal = WIDGET_BUTTON(wJournalRow, VALUE='Choose Journal File', $ UNAME='wBrowseJournal') ; .... wJournalName wJournalLabel = WIDGET_LABEL(wJournalRow, VALUE='Journal File') cd,current=pwd wJournalName = WIDGET_TEXT(wJournalRow, /EDITABLE, xsize=80, $ UNAME='wJournalName', $ VALUE=pwd+'/journal.txt') ; .... wSaveJournal wSaveJournal = WIDGET_BUTTON(wJournalRow, VALUE='Save Journal File', $ UNAME='wSaveJournal') ; .... wJournal journal = '; Journal widget_lay1 '+systime() wJournal = WIDGET_TEXT(wJournalTab, /scroll, ysize = 10, $ UNAME='wJournal', $ VALUE=journal) wLastCommandRow = WIDGET_BASE(wTopLevelBase, /ROW) wLastCommandLabel = WIDGET_LABEL(wLastCommandRow, VALUE='Last Command',xsize =100) wLastCommand = WIDGET_TEXT(wLastCommandRow, EDITABLE=0, xsize = 80, $ UNAME='wLastCommand', $ VALUE='') print, 'wLastCommand', wLastCommand wCommandRow = WIDGET_BASE(wTopLevelBase, /ROW) wCommandLabel = WIDGET_LABEL(wCommandRow, VALUE='Command',xsize =100) wCommand = WIDGET_TEXT(wCommandRow, /EDITABLE, xsize = 80, $ UNAME='wCommand', $ VALUE='') ; Use XMANAGER to manage the widgets WIDGET_CONTROL, wTopLevelBase, /REALIZE XMANAGER, 'widget_lay1', wTopLevelBase end