Viewing contents of file '../idllib/contrib/mallozzi/dialog_plot.pro'
; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
;+
; NAME:
;     DIALOG_PLOT
;
; PURPOSE:
;     A modal (blocking) dialog widget to display a plot.  
;     The dialog must be dismissed with the 'Dismiss' button before
;     execution of the calling program can continue.
;
; TYPE:
;     FUNCTION
;
; CATEGORY:
;     WIDGETS
;
; CALLING SEQUENCE:
;     result = DIALOG_PLOT (XDATA = xData, YDATA = yData)
;
; INPUTS:
;     XDATA and YDATA (via keyword, see below)
;
; KEYWORD PARAMETERS:
;
;     XDATA:         Array of independent data.
;     YDATA:         Array of dependent data.  
;
;     EXECUTE:       STRARR containing one or more IDL statements to execute. 
;                    The first command in the string must be a PLOT command.  
;                    The parameters xData, yData are available for use in the 
;                    EXECUTE string. See below for an example.
;  
;     PS_OPTION:     Add optional button to create a Postscript file
;     GIF_OPTION:    Add optional button to create a gif image
;
;     WINTITLE:      Window title [default = 'dialog_plot']
;
;     XSIZE:         The width of the plot region  (pixels) [default = 500]
;     YSIZE:         The height of the plot region (pixels) [default = 400]
;
;     DIALOG_PARENT: Set this keyword to the widget ID of a widget over
;                    which the message dialog should be positioned. When 
;                    displayed, the DIALOG_PLOT dialog will be positioned over 
;                    the specified widget. Dialogs are often related to a 
;                    non-dialog widget tree.  The ID of the widget in that 
;                    tree to which the dialog is most closely related should 
;                    be specified.
;
;     All PLOT keywords also accepted.
;
; OUTPUTS:
;     result: 1, or 0 for failure (missing parameters, or EXECUTE failed)
;
; COMMON BLOCKS:
;     NONE
;
; SIDE EFFECTS:
;     Creates a modal widget
;
; RESTRICTIONS:
;     NONE
;
; DEPENDENCIES:
;     NONE
;
; EXAMPLE:
;
;     xData = [0, 100]
;     yData = [-100, 100]
;
;     ; Create a simple plot, with an option to print to Postscript file.
;     ;   
;     result = DIALOG_PLOT (XDATA = xData, YDATA = yData, $
;         winTitle = 'Demo', /PS_OPTION)
;
;     ; Create a custom plot, with an option to print to gif file.  Note 
;     ; that EXECUTE can utilize the XDATA, YDATA keywords.
;     ;   
;     result = DIALOG_PLOT (XDATA = xData, YDATA = yData, EXECUTE = [ $
;         'PLOT, /NODATA, XDATA, YDATA', $
;         'OPLOT, [50, 50], !Y.CRANGE', $
;         'OPLOT, [70, 70], !Y.CRANGE, LINESTYLE = 1' ], $
;         XTITLE = 'xTitle', YTITLE = 'yTitle', winTitle = 'Demo', /GIF_OPTION)
;
; MODIFICATION HISTORY:
;     v0.1: written, Robert.Mallozzi@msfc.nasa.gov, March 1998.
;
;-
; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 

FUNCTION DIALOG_PLOT, $
    XDATA = xData, YDATA = yData, $
    EXECUTE = execute_s, $
    WINTITLE = winTitle, $
    XSIZE = xSize, YSIZE = ySize, $
    PS_OPTION = ps_option, GIF_OPTION = gif_option, $
    DIALOG_PARENT = dialog_parent, $
    _EXTRA = EXTRA


haveXdata = (N_ELEMENTS(xData) NE 0)
haveYdata = (N_ELEMENTS(yData) NE 0)

doExecute = (N_ELEMENTS(execute_s) NE 0)

IF (NOT haveXdata) OR (NOT haveYdata) THEN BEGIN
   MESSAGE, /INFO, 'Usage: result = DIALOG_PLOT (XDATA = xData, YDATA = yData)'
   RETURN, 0
ENDIF

pSave = !P
xSave = !X
ySave = !Y

IF (N_ELEMENTS(winTitle) EQ 0) THEN $
   winTitle = 'dialog_plot'

HAVE_PARENT = N_ELEMENTS(dialog_parent) NE 0

usePsOption  = N_ELEMENTS(ps_option) NE 0
useGifOption = N_ELEMENTS(gif_option) NE 0

IF (N_ELEMENTS(XSIZE) EQ 0) THEN BEGIN
   xSize = 500
ENDIF ELSE BEGIN
   xSize = XSIZE
ENDELSE

IF (N_ELEMENTS(YSIZE) EQ 0) THEN BEGIN
   ySize = 400
ENDIF ELSE BEGIN
   ySize = YSIZE
ENDELSE

; Top level base
;
IF (HAVE_PARENT) THEN BEGIN

   ; Check for a valid widget id
   ;
   HAVE_PARENT = WIDGET_INFO (LONG(dialog_parent), /VALID_ID)

ENDIF   

IF (HAVE_PARENT) THEN BEGIN
   base = WIDGET_BASE (TITLE = winTitle, /COLUMN, $
       /FLOATING, /MODAL, GROUP_LEADER = dialog_parent)
ENDIF ELSE BEGIN
   base = WIDGET_BASE (TITLE = winTitle, /COLUMN, MAP = 0)
ENDELSE

; Plotting canvas
;
winSave = !D.WINDOW
w = WIDGET_DRAW (base, XSIZE = xsize, YSIZE = ysize, /FRAME)
WIDGET_CONTROL, w, GET_VALUE = win
WSET, win

; Option buttons
;
IF (usePsOption) THEN $
   w = WIDGET_BUTTON (base, VALUE = 'Save to Postscript File')

IF (useGifOption) THEN $
   w = WIDGET_BUTTON (base, VALUE = 'Save to gif File')

w = WIDGET_BUTTON (base, VALUE = 'Dismiss')


; Map to screen
;
WIDGET_CONTROL, base, /REALIZE


; Place the dialog: window manager dependent
;
IF (NOT HAVE_PARENT) THEN BEGIN

   CURRENT_SCREEN = GET_SCREEN_SIZE()
   WIDGET_CONTROL, base, TLB_GET_SIZE = DIALOG_SIZE

   DIALOG_PT = [(CURRENT_SCREEN[0] / 2.0) - (DIALOG_SIZE[0] / 2.0), $ 
                (CURRENT_SCREEN[1] / 2.0) - (DIALOG_SIZE[1] / 2.0)] 

   WIDGET_CONTROL, base, $
                   TLB_SET_XOFFSET = DIALOG_PT[0], $
                   TLB_SET_YOFFSET = DIALOG_PT[1]
   WIDGET_CONTROL, base, MAP = 1

ENDIF

; Plot data
;
status = 1
IF (doExecute) THEN BEGIN

   ; Build the scalar command required by IDL's EXECUTE function
   ;
   command = ''
   
   ; Pass along any additional keywords to the PLOT call
   ; TODO: verify that first command calls PLOT
   ;
   command = command + execute_s[0] + ', _EXTRA = EXTRA' 

   FOR i = 1, N_ELEMENTS(execute_s) - 1 DO $
       command = command + ' & ' + execute_s[i]

   status = EXECUTE (command)
   IF (NOT status) THEN BEGIN
      MESSAGE, /INFO, 'EXECUTE failed: ' + command
      GOTO, ERROR
   ENDIF
   
ENDIF ELSE BEGIN

   PLOT, xData, yData, _EXTRA = EXTRA

ENDELSE

; Get the event, without using XMANAGER
;
NEXT:
event = WIDGET_EVENT (base)
WIDGET_CONTROL, event.id, GET_VALUE = value

IF (value EQ 'Save to Postscript File') THEN BEGIN

   fileName = DIALOG_PICKFILE (/WRITE, FILTER = '*.ps', $
       DIALOG_PARENT = event.top)
   IF (fileName NE '') THEN BEGIN

      d = FINDFILE (fileName, COUNT = fileExists)
      IF (fileExists) THEN BEGIN
         IF (DIALOG_MESSAGE (/QUESTION, ['File ' + fileName + ' exists.', $
	     'Overwrite?'], DIALOG_PARENT = event.top) EQ 'No') THEN $
            GOTO, NEXT
      ENDIF

      deviceSave = !D.NAME
      SET_PLOT, 'PS'
      DEVICE, FILE = fileName
      PLOT, xData, yData, _EXTRA = EXTRA
      SET_PLOT, deviceSave

   ENDIF

   GOTO, NEXT
   
ENDIF

IF (value EQ 'Save to gif File') THEN BEGIN

   fileName = DIALOG_PICKFILE (/WRITE, FILTER = '*.gif', $
       DIALOG_PARENT = event.top)
   IF (fileName NE '') THEN BEGIN

      d = FINDFILE (fileName, COUNT = fileExists)
      IF (fileExists) THEN BEGIN
         IF (DIALOG_MESSAGE (/QUESTION, ['File ' + fileName + ' exists.', $
	     'Overwrite?'], DIALOG_PARENT = event.top) EQ 'No') THEN $
            GOTO, NEXT
      ENDIF

      WRITE_GIF, fileName, TVRD()      
      
   ENDIF

   GOTO, NEXT
   
ENDIF


ERROR:

!P = pSave
!X = xSave
!Y = ySave

WSET, winSave


WIDGET_CONTROL, base, /DESTROY
RETURN, status



END