SXXXXXXX_RadarDataReader/_src_idl/pcrdv_E/PRO/select_file.pro
VALLONGOL 5de2650675 add
2025-11-12 13:43:30 +01:00

243 lines
7.2 KiB
Prolog

;=Procedura : SELECT_FILE================================================================
FUNCTION select_file , $ ; @METAGS select_file
;-Input---------------------------
start_path , $
filtro , $
window_title , $
x_pos = x_pos , $
y_pos = y_pos , $
font = font , $
xsize = xsize , $
save = save , $
filename = filename , $
recent_folder = recent_folder , $
warn = warn , $
multiple = multiple
;---------------------------------
; **************************************************************************************
; * La funzione permette di selezionare un file o una directory partendo da *
; * "start_path" ed applicando un filtro "filtro" sul tipo di file da cercare. *
; * Il file viene restituito con l'intero path. Se non viene selezionato niente, la *
; * funzione restituisce la stringa 'Empty'. *
; * E' possibile impostare una scelta multipla utilizzando la keyword /Multiple. In *
; * questo caso il risultato sarà un array di stringhe. *
; * Il filtro deve essere un array di stringhe. Se i filtri devono essere multipli *
; * (or tra filtri) vanno riportati come elemento unico separati da una virgola: *
; * Es.: ['All Files' , '.jpeg' , '.txt , .text'] *
; * Quando non viene specificato nessun filtro, questo sara` impostato a "All files". *
; **************************************************************************************
;--Opzioni di compilazione--
COMPILE_OPT STRICTARR
file_selected = 'Empty'
; Verifica e definizione path
; di partenza
IF (N_ELEMENTS(start_path) EQ 0) THEN $
BEGIN
start_path = '.\'
ENDIF $
ELSE BEGIN
test = SIZE(start_path)
IF (test[test[0] + 1] NE 7) THEN $
BEGIN
start_path = '.\'
ENDIF $
ELSE BEGIN
start_path = start_path[0]
ENDELSE
ENDELSE
; Definizione dei filtri
IF (N_ELEMENTS(filtro) EQ 0) THEN $
BEGIN
filtro = ['All Files']
ENDIF
; Verifica titolo
IF (N_ELEMENTS(window_title) EQ 0) THEN $
BEGIN
window_title = 'Searching file...'
ENDIF
; Verifica posizione
IF (N_ELEMENTS(x_pos) EQ 0) THEN $
BEGIN
x_pos = 0
ENDIF
IF (N_ELEMENTS(y_pos) EQ 0) THEN $
BEGIN
y_pos = 0
ENDIF
; Verifica nome file
IF (N_ELEMENTS(filename) EQ 0) THEN $
BEGIN
filename = ''
ENDIF
; Verifica save
IF (N_ELEMENTS(save) EQ 0) THEN $
BEGIN
save = 0
ENDIF
; Verifica warn
IF (N_ELEMENTS(warn) EQ 0) THEN $
BEGIN
warn = 0
ENDIF
; Verifica multiple
IF (N_ELEMENTS(multiple) EQ 0) THEN $
BEGIN
multiple = 0
ENDIF
quit_select_file = 0
WHILE (quit_select_file EQ 0) DO $
BEGIN
base_id = WIDGET_BASE( /Column , /Base_Align_Left , Title = window_title , $
XOffset = x_pos , YOffset = y_pos )
IF (N_ELEMENTS(recent_folder) GT 0) THEN $
BEGIN
font_present = FIX(N_ELEMENTS(font) GT 0)
IF (N_ELEMENTS(recent_folder) NE 0) THEN $
BEGIN
xsize = MAX(STRLEN(recent_folder))
ENDIF
CASE (1) OF
(font_present EQ 0) : $ ; no font & xsize
BEGIN
search_id = dsrm_cw_filesel( base_id , $
Path = start_path , $
UName = 'search_file' , $
Filter = filtro , $
XSize = xsize , $
Save = save , $
Warn_exist = warn , $
Multiple = multiple , $
Filename = filename )
END
(font_present EQ 1) : $ ; font + xsize
BEGIN
xsize = xsize + 20
search_id = dsrm_cw_filesel( base_id , $
Path = start_path , $
UName = 'search_file' , $
Filter = filtro , $
Font = font , $
XSize = xsize , $
Save = save , $
Warn_exist = warn , $
Multiple = multiple , $
Filename = filename )
END
ENDCASE
ENDIF $
ELSE BEGIN
search_id = dsrm_cw_filesel( base_id , $
Path = start_path , $
UName = 'search_file' , $
Filter = filtro , $
Save = save , $
Warn_exist = warn , $
Multiple = multiple , $
Filename = filename )
ENDELSE
IF (N_ELEMENTS(recent_folder) GT 0) THEN $
BEGIN
box_for_recent = WIDGET_BASE( base_id , /Row)
label_recent_f = WIDGET_LABEL( box_for_recent , Value = ' Recent folders: ' )
IF (font_present) THEN $
BEGIN
recent_f_id = WIDGET_DROPLIST( box_for_recent , Value = recent_folder , $
Font = font )
ENDIF $
ELSE BEGIN
recent_f_id = WIDGET_DROPLIST( box_for_recent , Value = recent_folder )
ENDELSE
ENDIF
WIDGET_CONTROL , base_id , /Realize
; Ciclo while per la gestione di tutti gli eventi
exit_search = 0
WHILE (exit_search EQ 0) DO $
BEGIN
evento = WIDGET_EVENT( base_id , Bad_Id = base_destroyed )
IF (base_destroyed EQ 0) THEN $
BEGIN
CASE (evento.id) OF
search_id : $
BEGIN
CASE (evento.done) OF
1 : $
BEGIN
file_selected = evento.value
WIDGET_CONTROL , base_id , /Destroy
exit_search = 1
quit_select_file = 1
END
2 : $
BEGIN
WIDGET_CONTROL , base_id , /Destroy
exit_search = 1
quit_select_file = 1
END
ELSE : $
BEGIN
END
ENDCASE
END
recent_f_id : $
BEGIN
start_path = recent_folder[evento.index]
WIDGET_CONTROL , base_id , /Destroy
exit_search = 1
END
ELSE : $
BEGIN
stop
WIDGET_CONTROL , base_id , /Destroy
END
ENDCASE
ENDIF $
ELSE BEGIN
exit_search = 1
quit_select_file = 1
ENDELSE
END ; While
END ; While
RETURN , file_selected
END ; select_file
;========================================================================================