;+ ; NAME: ; qSave2File ; PURPOSE: ; Widget to save data arrays as binary files using href=bin_write= ; CATEGORY: ; Widget qSave2File ; CALLING SEQUENCE: ; qSave2File, group=group, block=block, wid_save=wid_save, plane_id=plane_id, file=file, $ ; call_by_qimage=call_by_qimage, trailer=trailer ; INPUTS: ; wid_save=wid_save scalar; type: long integer ; widget ID of a valid widget whose user value contains the array ; to be saved to disk. ; OPTIONAL INPUT PARAMETERS: ; group=Group passed to xmanager when registering the qView widget ; /block passed to xmanager to make the widget a blocking widget (default: ; non-blocking widget) ; file = file scalar; type: string; default: filepath(root=getenv('TUB'),'qsave2file.pph') ; output file name ; /call_by_image used by save option in href=qImage= widget (also see qSave2File_Save) ; trailer = trailer scalar; type: string ; trailer to be added to output file[s] ; The trailer is only used if /call_by_qimage or /wid_single is set, ; and only for .pph or .nic files ; OUTPUTS: ; (none) ; CALLS: ; qSave2File_Save, qSave2File_Pick ; SIDE EFFECTS: ; It is probably best to use qSave2File as a blocking widget (while this widget exists the ; calling widget should be desensitized completely if possible). When a non-blocking widget ; is used the array stored in the user value of wid_save might change before it is saved. ; RESTRICTIONS: ; PROCEDURE: ; state = {STATE_QSAVE2FILE, $ ; wid_top : 0L, $ Base widget container for all child widgets ; user value: none ; wid_done : 0L, $ 'Done' button; destroys widget withoud saving ; user value: none ; wid_save : 0L, $ 'Save' button; first saves array, then destroys widget ; user value: keyword 'wid_save', and 'plane_id' (if present) ; wid_pick : 0L, $ 'Pick File' button to select output file name ; user value: none ; wid_file : 0L, $ cw_field widget for output file name ; user value: none ; wid_single : 0L, $ Exclusive button for single or multiple output files ; user value: current ON/OFF setting ; wid_type : lonarr(4), $ Exclusive buttons to select file type ; user value: current ON/OFF setting ; type : ['pph','nic','gif','bmp'], $ List of valid file types ; call_by_qimage: keyword_set(call_by_qimage),$ ; trailer : '' $ Optional trailer string to be added to file ; } ; MODIFICATION HISTORY: ; APR-2000, Paul Hick (UCSD/CASS; pphick@ucsd.edu) ;- PRO qSave2File_Event, event @compile_opt.pro ; On error, return to caller widget_control, event.top, get_uvalue=state, /no_copy case event.id of ; ID of widget that generated the message event.top : widget_control, event.handler, /destroy state.wid_done: widget_control, event.handler, /destroy state.wid_save: qSave2File_Save, state, event state.wid_single: widget_control, state.wid_single, set_uvalue=event.select state.wid_pick: qSave2File_Pick, state, /pick state.wid_file: qSave2File_Pick, state ELSE: BEGIN i = where(event.id EQ state.wid_type) CASE i[0] EQ -1 OF 0 : BEGIN widget_control, state.wid_type[i], set_uvalue=event.select widget_control, state.wid_file, get_value=tmp widget_control, state.wid_file, set_value=GetFileSpec(tmp,upto='name')+'.'+state.type[i] END 1: BEGIN message, /info, ': unexpected event' print, tag_names(event, /structure_name) print, event END ENDCASE END ENDCASE IF widget_info(event.top, /valid_id) THEN $ widget_control, event.top, set_uvalue=state, /no_copy RETURN & END PRO qSave2File, group=group, block=block, wid_save=wid_save, plane_id=plane_id, filename=filename, $ call_by_qimage=call_by_qimage, trailer=trailer, is_window=is_window @compile_opt.pro ; On error, return to caller InitVar, block , /key InitVar, is_window , /key InitVar, call_by_qimage, /key IF IsType(wid_save,/undefined) THEN BEGIN message, /info, 'no widget ID specified in keyword "wid_save"' RETURN ENDIF IF NOT widget_info(wid_save, /valid_id) THEN BEGIN message, /info, 'invalid widget ID specified in keyword "wid_save"' RETURN ENDIF ;widget_control, wid_save, get_uvalue=Array, /no_copy ;IF IsType(Array,/undefined) THEN BEGIN ; message, /info, 'widget "wid_save" has no user value' ; RETURN ;ENDIF ;widget_control, wid_save, set_uvalue=Array, /no_copy no_block = 1-block type_all = ['pph','gif','bmp','png','jpg'] type_def = 'png' state = {STATE_QSAVE2FILE , $ wid_top : 0L , $ wid_done : 0L , $ wid_save : 0L , $ wid_pick : 0L , $ wid_file : 0L , $ wid_single : 0L , $ wid_type : lonarr(n_elements(type_all)) , $ type : type_all , $ call_by_qimage: call_by_qimage, $ trailer : '' $ } InitVar, filename, filepath(root=getenv('TUB'),'qsave2file.'+type_def) IF GetFileSpec(filename,upto='directory') EQ '' THEN filename = filepath(root=getenv('TUB'),filename) IF GetFileSpec(filename,part='type' ) EQ '' THEN filename = filename+'.'+type_def IF IsType(trailer,/defined) THEN state.trailer = trailer base = widget_base(title='qSave2File', /column, /tlb_kill_request) state.wid_top = widget_base(base, /column) dummy = widget_base(state.wid_top, /row, frame=1) state.wid_done = widget_button(dummy, value=filepath(root=getenv('SSW_SMEI_UCSD'),subdir='image','done.ico'),/bitmap) state.wid_save = widget_button(dummy, value='Save') state.wid_pick = widget_button(dummy, value='Pick File') state.wid_file = cw_field(dummy, title=' ', /return_ev, value=filename) dummy = widget_base(state.wid_top, /row) dummy0 = widget_base(dummy, /row, /exclusive, frame=1) state.wid_single = widget_button(dummy0, value='Single File', uvalue=0B) dummy0 = widget_base(dummy, /row, /exclusive, frame=1) FOR i=0, n_elements(state.type)-1 DO $ state.wid_type[i] = widget_button(dummy0, value=strupcase(state.type[i]), uvalue=0) CASE IsType(plane_id,/defined) OF 0: widget_control, state.wid_save, set_uvalue=[wid_save,is_window] 1: widget_control, state.wid_save, set_uvalue=[wid_save,is_window,plane_id] ENDCASE widget_control, state.wid_type[where(type_all EQ type_def)], /set_button, set_uvalue=1 tmp = 1-is_window AND 1-state.call_by_qimage CASE tmp OF 0: widget_control, state.wid_single, sensitive=0 1: BEGIN widget_control, wid_save, get_uvalue=Array, /no_copy widget_control, state.wid_single, sensitive=size(Array,/n_dim) EQ 3 widget_control, wid_save, set_uvalue=Array, /no_copy END ENDCASE widget_control, base, set_uvalue=state, /no_copy widget_control, base, /realize xmanager, 'qSave2File', base, group=Group, no_block=no_block, event_handler='qSave2File_Event' RETURN & END