;+
; Project     :	SOHO - CDS
;
; Name        :	XCDROM
;
; Purpose     :	Widget interface to LOAD_CDROM and LIST_CDROM
;
; Category    :	Class1, Operations, Telemetry
;
; Explanation :	Provides a widget interface to loading CDROMs and managing the
;		CDROM catalog.  From this utility, one can perform the
;		following functions:
;
;			* Register CDROMs in the catalog
;			* Display information about a given CDROM
;			* Display which CDROMs cover a given date range
;			* Load telemetry data off of a CDROM
;
; Syntax      :	XCDROM
;
; Examples    :	
;
; Inputs      :	None.
;
; Opt. Inputs :	None.
;
; Outputs     :	None.
;
; Opt. Outputs:	None.
;
; Keywords    :	GROUP	= The widget identification of the group leader.
;		DRIVE	= A character string giving the same of the mount
;			  point for the CDROM.  The default is "/cdrom" on
;			  Unix systems, and "CDROM:[000000]" on VMS
;			  systems.  This can also be selected interactively.
;               NOREGISTER = If set, then LOAD_CDROM is called with /NOREGISTER
;
; Calls       :	LOAD_CDROM, LIST_CDROM, FIND_CDROM_GAPS, XACK
;
; Common      :	XCDROM is an internal common block containing widget IDs and
;		other parameters.
;
; Restrictions:	Only one copy of XCDROM can be running at any one time.
;
; Side effects:	None.
;
; Prev. Hist. :	None.
;
; History     :	Version 1, 24-Apr-1996, William Thompson, GSFC
;		Version 2, 29-Apr-1996, William Thompson, GSFC
;			Added control of !PRIV
;			Fix bug with selecting date.
;		Version 3, 11-May-1996, William Thompson, GSFC
;			Added print statement when load completed.
;		Version 4, 01-May-1997, William Thompson, GSFC
;			Added button for finding gaps.
;		Version 5, 08-Mar-2002, William Thompson, GSFC
;			Added capability of selecting DRIVE
;               Version 6, 20-Oct-2004, William Thompson, GSFC
;                       Added NOREGISTER keyword.
;
; Contact     :	WTHOMPSON
;-
;
	PRO XCDROM_EVENT, EVENT
	COMMON XCDROM, SEQ_WID, VOL_WID, START_WID, END_WID, DATE, SEQUENCE, $
		VOLUME, START_DATE, END_DATE, DRIVE, DRIVE_WID, CDDRIVE, NOREG
;
;  Get the widget event, and act accordingly.
;
	WIDGET_CONTROL, EVENT.ID, GET_UVALUE=EV
	CASE Ev OF 
;
;  If the CDROM button was selected, then use the CDROM.
;
	    'CDROM': BEGIN
		DRIVE = CDDRIVE
		WIDGET_CONTROL, DRIVE_WID, SET_VALUE=DRIVE
		END
;
;  If the "Select DPS directory button was pressed, then select a 
;
	    'SELECT': BEGIN
		SEL_CDROM_DRIVE, DRIVE, GROUP=EVENT.TOP, /MODAL
		WIDGET_CONTROL, DRIVE_WID, SET_VALUE=DRIVE
		END
;
;  If the "Register" button was pressed, then register the CDROM in the
;  database.
;
	    'Register': BEGIN
		ERRMSG = ''
		WIDGET_CONTROL, /HOURGLASS
		LOAD_CDROM, /REGISTER_ONLY, SEQUENCE=SEQ_NO, VOLUME=VOL_NO, $
			DRIVE=DRIVE, ERRMSG=ERRMSG
		IF ERRMSG NE '' THEN XACK, ERRMSG ELSE BEGIN
		    SEQUENCE = SEQ_NO
		    VOLUME   = VOL_NO
		    LIST_CDROM, SEQUENCE, VOLUME, LIST, N_FOUND, /PRINT
		    START_DATE = MIN(LIST.DATE)
		    END_DATE   = MAX(LIST.DATE)
		    WIDGET_CONTROL, SEQ_WID,   SET_VALUE=SEQUENCE
		    WIDGET_CONTROL, VOL_WID,   SET_VALUE=VOLUME
		    WIDGET_CONTROL, START_WID, SET_VALUE=START_DATE
		    WIDGET_CONTROL, END_WID,   SET_VALUE=END_DATE
		ENDELSE
		END
;
;  If the "Find gaps" button was pressed, then find any gaps in the currently
;  mounted CDROM.
;
	    'Gaps': BEGIN
		ERRMSG = ''
		WIDGET_CONTROL, /HOURGLASS
		FIND_CDROM_GAPS, DRIVE=DRIVE, ERRMSG=ERRMSG
		IF ERRMSG NE '' THEN XACK, ERRMSG
		END
;
;  If the "Load" button was pressed, then load the CDROM.
;
	    'Load': BEGIN
		ERRMSG = ''
		WIDGET_CONTROL, /HOURGLASS
		IF STRTRIM(DATE) NE '' THEN LOAD_CDROM, DATE=DATE, $
                  DRIVE=DRIVE, ERRMSG=ERRMSG, NOREGISTER=NOREG          ELSE $
                  LOAD_CDROM, DRIVE=DRIVE, ERRMSG=ERRMSG, NOREGISTER=NOREG
		IF ERRMSG NE '' THEN XACK, ERRMSG ELSE PRINT, 'Load completed'
		END
;
;  If the "Date" field was modified, then get the new DATE parameter.
;
	    'Date': DATE = EVENT.VALUE
;
;  If the "Search" pull-down menu as selected, then act accordingly.
;
	    'Search': CASE EVENT.VALUE OF 
		'Search.on sequence/volume': BEGIN
		    IF (SEQUENCE EQ 0) OR (VOLUME EQ 0) THEN BEGIN
			XACK, 'SEQUENCE and VOLUME must be specified'
		    END ELSE BEGIN
			LIST_CDROM, SEQUENCE, VOLUME, LIST, N_FOUND, /PRINT
			IF N_FOUND EQ 0 THEN XACK, 'No entries found' ELSE BEGIN
			    START_DATE = MIN(LIST.DATE)
			    END_DATE   = MAX(LIST.DATE)
			    WIDGET_CONTROL, START_WID, SET_VALUE=START_DATE
			    WIDGET_CONTROL, END_WID,   SET_VALUE=END_DATE
			ENDELSE
		    ENDELSE
		    END
		'Search.by date': BEGIN
		    IF (STRTRIM(START_DATE) EQ '') OR	$
			    (STRTRIM(END_DATE) EQ '') THEN BEGIN
			XACK, 'START_DATE AND END_DATE must be specified'
		    END ELSE BEGIN
			LIST_CDROM, START_DATE, END_DATE, LIST, N_FOUND, /PRINT
			IF N_FOUND EQ 0 THEN XACK, 'No entries found' ELSE BEGIN
			    SEQUENCE = 0
			    VOLUME = 0
			    WIDGET_CONTROL, SEQ_WID, SET_VALUE=''
			    WIDGET_CONTROL, VOL_WID, SET_VALUE=''
			ENDELSE
		    ENDELSE
		    END
		ENDCASE
;
;  If the EXIT button was selected, then exit the program.
;
	    'Exit': WIDGET_CONTROL, EVENT.TOP, /DESTROY
;
;  If any of the search fields were modified, then get the new values.
;
	    'Sequence':	SEQUENCE = EVENT.VALUE
	    'Volume':	VOLUME = EVENT.VALUE
	    'Start':	START_DATE = EVENT.VALUE
	    'End':	END_DATE = EVENT.VALUE
	    ELSE:  PRINT, 'Unrecognized event ' + Ev
	ENDCASE
	END
;
;==============================================================================
;
	PRO XCDROM, GROUP=GROUP, DRIVE=K_DRIVE, NOREGISTER=NOREGISTER
	COMMON XCDROM
;
;  If a copy of XCDROM is already running, then exit.
;
	IF XREGISTERED("xcdrom") NE 0 THEN BEGIN
		MESSAGE, 'Only one copy of XCDROM can run at a time', /CONTINUE
		RETURN
	ENDIF
;
;  Store the value of the NOREGISTER keyword.
;
        NOREG = KEYWORD_SET(NOREGISTER)
;
;  Define !PRIV according to whether or not the user has write privilege into
;  the database.
;
	IF PRIV_ZDBASE(/CAT) THEN !PRIV=2 ELSE !PRIV=0
;
;  Make sure that GROUP is defined.
;
	IF N_ELEMENTS(GROUP) EQ 0 THEN GROUP=0
;
;  Determine the value of the DRIVE parameter.
;
	CASE OS_FAMILY() OF
	    'unix':	CDDRIVE = '/cdrom'
	    'vms':	CDDRIVE = 'CDROM:[000000]'
	    ELSE:	BEGIN
		MESSAGE, 'Only supported in VMS or Unix', /CONTINUE
		RETURN
	    END
	ENDCASE
	IF N_ELEMENTS(K_DRIVE) EQ 1 THEN DRIVE = K_DRIVE ELSE DRIVE = CDDRIVE
;
;  Define the main base, and a base for the buttons.
;
	MAIN = WIDGET_BASE(GROUP_LEADER=Group, /COLUMN, /MAP)
	BBASE = WIDGET_BASE(MAIN, /ROW, /MAP)
;
;  Define the buttons for registering and loading the CDROM.
;
	DUMMY = WIDGET_BUTTON(BBASE, UVALUE='Register', VALUE='Register')
	DUMMY = WIDGET_BUTTON(BBASE, UVALUE='Gaps', VALUE='Find gaps')
	DUMMY = WIDGET_BUTTON(BBASE, UVALUE='Load', VALUE='Load')
;
;  Define a field for specifying a date to load from the CDROM.
;
	DATE = ''
	DUMMY = CW_FIELD(BBASE, VALUE='', /ROW, /STRING, /ALL_EVENTS,	$
		TITLE='Date:', UVALUE='Date')
;
;  Define a pull-down menu for searching the CDROM database.
;
	JUNK = {CW_PDMENU_S, FLAGS:0, NAME:''}
	TEXT = [{ CW_PDMENU_S,       3, 'Search' },		$
		{ CW_PDMENU_S,       0, 'on sequence/volume' },	$
		{ CW_PDMENU_S,       2, 'by date' }]
	DUMMY = CW_PDMENU(BBASE, TEXT, /RETURN_FULL_NAME, UVALUE='Search')
;
;  Define the exit button.
;
	DUMMY = WIDGET_BUTTON(BBASE, UVALUE='Exit', VALUE='Exit')
;
;  Define the base for controlling the selected drive.
;
	DBASE = WIDGET_BASE(MAIN, /ROW, /MAP, UVALUE='DBASE')
;
;  Define a window for displaying the drive value.
;
	DRIVE_WID = WIDGET_TEXT(DBASE, XSIZE=40, VALUE=DRIVE)
	DUMMY = WIDGET_BUTTON(DBASE,VALUE='CDROM',UVALUE='CDROM')
	DUMMY = WIDGET_BUTTON(DBASE, VALUE='Select DPS directory',	$
		UVALUE='SELECT')
;
;  Define the second base down for the search items.
;
	SBASE = WIDGET_BASE(MAIN, /ROW, /MAP, UVALUE='SBASE')
;
;  On the left, put the search fields for sequence and volume number.
;
	LBASE = WIDGET_BASE(SBASE, /COLUMN, /FRAME, /MAP)
	SEQUENCE = 0
	VOLUME = 0
	SEQ_WID = CW_FIELD(LBASE, VALUE='', /ROW, /LONG, /ALL_EVENTS,	$
		TITLE='Sequence:', UVALUE='Sequence')
	VOL_WID = CW_FIELD(LBASE, VALUE='', /ROW, /LONG, /ALL_EVENTS,	$
		TITLE='Volume:', UVALUE='Volume')
;
;  On the right, put the search fields for the start and end dates.
;
	RBASE = WIDGET_BASE(SBASE, /COLUMN, /FRAME, /MAP)
	START_DATE = ''
	END_DATE = ''
	START_WID = CW_FIELD(RBASE, VALUE='', /ROW, /STRING, /ALL_EVENTS, $
		TITLE='Start date:', UVALUE='Start')
	END_WID = CW_FIELD(RBASE, VALUE='', /ROW, /STRING, /ALL_EVENTS,	$
		TITLE='End date:', UVALUE='End')
;
;  Set it all going.
;
	WIDGET_CONTROL, MAIN, /REALIZE
	XMANAGER, 'xcdrom', MAIN
	END
