;+ ; Project : General user interaction. ; ; Name : DIALOG_SELECT ; ; Purpose : Allows user to select input options on a GUI. ; ; Explanation : This function brings up a GUI which lists options to select. ; Note that the list of options can be exclusive (only one ; option selected at a time) or inclusive (multiple selected ; options are possible). ; ; Use : RESULT = DIALOG_SELECT(OPTIONS) ; ; Inputs : OPTIONS: A string array containing the list of options. ; ; Opt. Inputs : None. ; ; Outputs : RESULT: A string scalar or array containing the ; selected options. ; ; Opt. Outputs: None. ; ; Keywords : TITLE: The widget's title. ; ; EXCLUSIVE: Option list is exclusive (only one selection ; at a time). If not set, the option list is ; nonexclusive (multiple selections are possible). ; ; MESSAGE: An information message to place above the ; selected list of options. ; ; PRESET: Integer array containing the information whether ; an option is to be set by default (1 = set, 0 = ; not set). If keyword EXCLUSIVE is set, PRESET ; must be a scalar. ; ; ; Calls : None. ; ; Common : None. ; ; Restrictions: None. ; ; Side effects: If the "Cancel" button is selected, a null string is returned. ; ; Category : General user input. GUI driven. ; ; Prev. Hist. : Based on DIALOG_INPUT widget procedure. ; ; Written : Donald G. Luttermoser, ETSU/Physics, 5 April 2012 ; ; Modified : Version 1, Donald G. Luttermoser, ETSU/Physics, 5 Apr 2012 ; Initial program. ; ; Version : Version 1, 5 April 2012. ; ;- ; FUNCTION DIALOG_SELECT, OPTIONS, TITLE=TITLE, EXCLUSIVE=EXCLUSIVE, $ MESSAGE=MESSAGE, PRESET=PRESET ; ; This procedure brings up a widget that allows the user to select a list of ; options. ; IF KEYWORD_SET(TITLE) THEN INTITLE = TITLE ELSE INTITLE = 'Select Option' IF KEYWORD_SET(EXCLUSIVE) THEN QEXC = 1 ELSE QEXC = 0 IF KEYWORD_SET(MESSAGE) THEN QMSG = 1 ELSE QMSG = 0 ; NQ = N_ELEMENTS(OPTIONS) ; IF KEYWORD_SET(PRESET) THEN SETBUTT = PRESET ELSE SETBUTT = INTARR(NQ) IF QEXC EQ 1 THEN BEGIN IBUTT = WHERE(SETBUTT NE 0, NBUTT) IF NBUTT EQ 0 THEN SETBUTT = -1 ELSE $ SETBUTT = SETBUTT[IBUTT[0]] < (NQ - 1) ENDIF ; RESULT = '' & OUTVALUE = SETBUTT & QCANCEL = 0 ; ; Make the widget. ; BASEIN = WIDGET_BASE(TITLE=INTITLE, /COLUMN) IF QMSG EQ 1 THEN BEGIN WI = LONARR(N_ELEMENTS(MESSAGE)) WIDMSG = WIDGET_BASE(BASEIN, /COLUMN, /BASE_ALIGN_LEFT, /FRAME) FOR J = 0, N_ELEMENTS(MESSAGE)-1 DO WI[J] = WIDGET_LABEL(WIDMSG, $ VALUE=MESSAGE[J]) ENDIF ; IF QEXC EQ 1 THEN BEGIN IF SETBUTT[0] EQ -1 THEN $ BOPTS = CW_BGROUP(BASEIN, OPTIONS, /COLUMN, /EXCLUSIVE, $ /FRAME) $ ELSE BOPTS = CW_BGROUP(BASEIN, OPTIONS, /COLUMN, /EXCLUSIVE, $ /FRAME, SET_VALUE=SETBUTT[0]) ENDIF ELSE BEGIN BOPTS = CW_BGROUP(BASEIN, OPTIONS, /COLUMN, /NONEXCLUSIVE, $ /FRAME, SET_VALUE=SETBUTT) ENDELSE ; WOK = WIDGET_BUTTON(BASEIN, VALUE=' Done ') WC = WIDGET_BUTTON(BASEIN, VALUE=' Cancel ') ; WIDGET_CONTROL, BASEIN, /REALIZE TYPEIN = '' WHILE TYPEIN NE 'QUIT' DO BEGIN EVENTIN = WIDGET_EVENT(BASEIN) TYPE = TAG_NAMES(EVENTIN, /STRUCTURE) ; ; Act on the buttons. ; IF TYPE EQ 'WIDGET_BUTTON' THEN BEGIN WIDGET_CONTROL, EVENTIN.ID, GET_VALUE=VALUE IF STRLOWCASE(STRTRIM(VALUE, 2)) EQ 'done' THEN $ TYPEIN = 'QUIT' IF STRLOWCASE(STRTRIM(VALUE, 2)) EQ 'cancel' THEN BEGIN QCANCEL = 1 TYPEIN = 'QUIT' ENDIF ENDIF ; ; Process the compound widget (BW_BGROUP) event. ; Note that TYPE is a null string for these widget events. ; IF TYPE EQ '' THEN BEGIN WIDGET_CONTROL, EVENTIN.ID, GET_VALUE=OUTVALUE ENDIF ; ENDWHILE ; WIDGET_CONTROL, BASEIN, /DESTROY ; IF QCANCEL NE 1 THEN BEGIN IF QEXC EQ 1 THEN BEGIN IF OUTVALUE EQ -1 THEN RESULT = '' ELSE $ RESULT = OPTIONS[OUTVALUE] ENDIF ELSE BEGIN IRET = WHERE(OUTVALUE EQ 1, NRET) IF NRET EQ 0 THEN RESULT = '' ELSE RESULT = OPTIONS[IRET] ENDELSE ENDIF ; RETURN, RESULT END