Viewing contents of file '../idllib/contrib/buie/cw_ppmgr.pro'
;+
; NAME:
;    cw_ppmgr
; PURPOSE: (one line)
;    Display and edit itool photometry parameters.
; DESCRIPTION:
;
; CATEGORY:
;    Compound Widgets
; CALLING SEQUENCE:
;    result = cw_ppmgr( parent )
; INPUTS:
;
; OPTIONAL INPUT PARAMETERS:
;
; KEYWORD PARAMETERS:
;    UVALUE = Optional user value.
; OUTPUTS:
;
; COMMON BLOCKS:
;
; SIDE EFFECTS:
;
; RESTRICTIONS:
;
; PROCEDURE:
;
; MODIFICATION HISTORY:
;    Written by Doug Loucks, Lowell Observatory.
;    June 17, 1994, DWL, Converted to Compound Widget.
;-
; ------------------------------------------------------------------------------
; Function  cw_ppeve
; Event Handler
; ------------------------------------------------------------------------------
FUNCTION cw_ppeve, event

;Retrieve the state.
stash = WIDGET_INFO( event.handler, /CHILD )
WIDGET_CONTROL, stash, GET_UVALUE=state, /NO_COPY

;Retrieve the parameters.
WIDGET_CONTROL, event.top, GET_UVALUE=ph_parms, /NO_COPY

;Get the value of the widget that generated the event.
WIDGET_CONTROL, event.id, GET_VALUE=value
val = value[0]

;Initialize some local variables.
name = ''
out_event = 0

;Handle the event.

CASE event.id OF
   state.dismissid : BEGIN
      ;Put the parameter and state structures away, Unmap the top level base,
      ;and destroy the rest of the hierarchy.
      WIDGET_CONTROL, event.top, SET_UVALUE=ph_parms, /NO_COPY
      WIDGET_CONTROL, stash, SET_UVALUE=state, /NO_COPY
      WIDGET_CONTROL, event.top, MAP=0
      WIDGET_CONTROL, event.handler, /DESTROY
      RETURN, 0
   END

   state.logfileid : BEGIN
      ph_parms.logfile = val
      name = 'logfile'
      ph_parms.edtflg = 1
   END

   state.pfileid : BEGIN
      ph_parms.parmfile = STRTRIM( val, 2 )
      name = 'Photometry parameters file'
   END

   state.radiusid : BEGIN
      ph_parms.radius = val
      name = 'radius'
      ph_parms.edtflg = 1
   END

   state.sky1id : BEGIN
      ph_parms.sky1 = val
      name = 'sky1'
      ph_parms.edtflg = 1
   END

   state.sky2id : BEGIN
      ph_parms.sky2 = val
      name = 'sky2'
      ph_parms.edtflg = 1
   END

   state.boxmradid : BEGIN
      ph_parms.boxmrad = val
      name = 'boxmrad'
      ph_parms.edtflg = 1
   END

   state.gainid : BEGIN
      ph_parms.gain = val
      name = 'gain'
      ph_parms.edtflg = 1
   END

   state.pscaleid : BEGIN
      ph_parms.pscale = val
      name = 'pscale'
      ph_parms.edtflg = 1
   END

   state.toggleid : BEGIN
      ph_parms.exact = event.value
   END

   state.loadid : BEGIN
      fmt = '(G0.2)'
      ;Call the procedure that loads the parameters from a file.
      it_pplod, ph_parms
      ;Refresh the text widgets.
      WIDGET_CONTROL, state.logfileid, SET_VALUE=ph_parms.logfile
      WIDGET_CONTROL, state.radiusid,  SET_VALUE=STRING(ph_parms.radius, $
             FORMAT=fmt)
      WIDGET_CONTROL, state.sky1id,    SET_VALUE=STRING(ph_parms.sky1, $
             FORMAT=fmt)
      WIDGET_CONTROL, state.sky2id,    SET_VALUE=STRING(ph_parms.sky2, $
             FORMAT=fmt)
      WIDGET_CONTROL, state.boxmradid, SET_VALUE=STRING(ph_parms.boxmrad, $
             FORMAT=fmt)
      WIDGET_CONTROL, state.gainid,    SET_VALUE=STRING(ph_parms.gain, $
             FORMAT=fmt)
      WIDGET_CONTROL, state.pscaleid,  SET_VALUE=STRING(ph_parms.pscale, $
             FORMAT=fmt)
      WIDGET_CONTROL, state.nomextid,  SET_VALUE=STRING(ph_parms.nomext, $
             FORMAT=fmt)
      WIDGET_CONTROL, state.zpointid,  SET_VALUE=STRING(ph_parms.zpoint, $
             FORMAT=fmt)
   END

   state.saveid : BEGIN
      it_ppsav, ph_parms
   END

   state.nomextid : BEGIN
      ph_parms.nomext = val
      name = 'nomext'
      ph_parms.edtflg = 1
   END

   state.zpointid : BEGIN
      ph_parms.zpoint = val
      name = 'zpoint'
      ph_parms.edtflg = 1
   END

   ELSE : BEGIN
      MESSAGE, 'Unknown event:', /INFO
      HELP, event, /STRUCTURE
   END
ENDCASE

;Print a message indicating the parameter changed and its new value.
IF name NE '' THEN MESSAGE, name + ' set to ' + val, /INFO

;Restore the parameters and state.
WIDGET_CONTROL, event.top, SET_UVALUE=ph_parms, /NO_COPY
WIDGET_CONTROL, stash, SET_UVALUE=state, /NO_COPY

RETURN, out_event
END

; ------------------------------------------------------------------------------
; Procedure cw_ppmgr
; ------------------------------------------------------------------------------
FUNCTION cw_ppmgr, parent, UVALUE=in_uvalue

;Note: This compound widget assumes that the photometry parameters structure is
;stored in the user value of the top level base. The idea is to 'hang' this
;widget on its own TLB.

; Define the main base.
IF KEYWORD_SET( in_uvalue ) THEN BEGIN
   mainbase = WIDGET_BASE( parent, EVENT_FUNC='cw_ppeve', COLUMN=1, $
              UVALUE=in_uvalue )
ENDIF ELSE BEGIN
   mainbase = WIDGET_BASE( parent, EVENT_FUNC='cw_ppeve', COLUMN=1 )
ENDELSE

;Get the parameters.
WIDGET_CONTROL, parent, GET_UVALUE=ph_parms, /NO_COPY

;Local state structure.
state = { boxmradid:0L, dismissid:0L, $
   gainid:0L, $
   loadid:0L, logfileid:0L, nomextid:0L, $
   pfileid:0L, pscaleid:0L, radiusid:0L, $
   saveid:0L, sky1id:0L, sky2id:0L, $
   toggleid:0L, zpointid:0L }

; Define the rest of the widgets and their bases.
;
aa_base   = WIDGET_BASE( mainbase, COLUMN=1, FRAME=1 )
mi_base   = WIDGET_BASE( aa_base, ROW=1 )

state.dismissid = WIDGET_BUTTON( mi_base, VALUE='Dismiss' )

state.loadid = WIDGET_BUTTON( mi_base, VALUE='Load' )

state.saveid = WIDGET_BUTTON( mi_base, VALUE='Save' )

pf_base  = WIDGET_BASE( aa_base, /ROW )
state.pfileid = WIDGET_TEXT( pf_base, VALUE=ph_parms.parmfile, $
     XSIZE=15, /EDITABLE)
w1 = WIDGET_LABEL( pf_base, VALUE='Photometry parameters file name' )

wb  = WIDGET_BASE( mainbase, /ROW )
state.logfileid = WIDGET_TEXT(wb,VALUE=ph_parms.logfile, XSIZE=15, /EDITABLE )
w1  = WIDGET_LABEL( wb, VALUE='Photometry log file name' )

wb  = WIDGET_BASE( mainbase, /ROW )
state.radiusid = WIDGET_TEXT( wb, VALUE=STRING( ph_parms.radius, $
            FORMAT='(G0.2)' ), XSIZE=15, /EDITABLE )
w1  = WIDGET_LABEL( wb, VALUE='Aperture radius (pixels)' )

wb  = WIDGET_BASE( mainbase, /ROW )
state.sky1id = WIDGET_TEXT( wb, VALUE= $
          STRING( ph_parms.sky1, FORMAT='(G0.2)' ), XSIZE=15, /EDITABLE )
w1  = WIDGET_LABEL( wb, VALUE='Inner radius of sky annulus (pixels)' )

wb  = WIDGET_BASE( mainbase, /ROW )
state.sky2id = WIDGET_TEXT( wb, VALUE= $
          STRING( ph_parms.sky2, FORMAT='(G0.2)' ), XSIZE=15, /EDITABLE )
w1  = WIDGET_LABEL( wb, VALUE='Outer radius of sky annulus (pixels)' )

wb  = WIDGET_BASE( mainbase, /ROW )
state.boxmradid = WIDGET_TEXT( wb, VALUE=STRING( ph_parms.boxmrad, $
             FORMAT='(G0.2)' ), XSIZE=15, /EDITABLE )
w1  = WIDGET_LABEL( wb, VALUE='Local maximum box radius (pixels) ' )

wb  = WIDGET_BASE( mainbase, /ROW )
state.gainid = WIDGET_TEXT( wb, VALUE= $
          STRING( ph_parms.gain, FORMAT='(G0.2)' ), XSIZE=15, /EDITABLE )
w1  = WIDGET_LABEL( wb, VALUE='Gain of CCD (e-/DN)' )

wb  = WIDGET_BASE( mainbase, /ROW )
state.pscaleid = WIDGET_TEXT( wb, $
            VALUE=STRING(ph_parms.pscale,FORMAT='(G0.2)'), XSIZE=15, /EDITABLE )
w1  = WIDGET_LABEL( wb, VALUE='Plate scale (arcseconds/pixel)' )

wb   = WIDGET_BASE( mainbase, /ROW )
state.toggleid = CW_BGROUP( wb, ['Search for local maximum', $
                 'Use exact position'], /EXCLUSIVE, /NO_RELEASE, /ROW, $
                 SET_VALUE=ph_parms.exact )

wb = WIDGET_BASE( mainbase, /COLUMN, /FRAME )
wb1  = WIDGET_BASE( wb, /ROW )
state.nomextid = WIDGET_TEXT( wb1, VALUE=STRING( ph_parms.nomext, $
            FORMAT='(G0.2)' ), XSIZE=15, /EDITABLE )
w1  = WIDGET_LABEL( wb1, VALUE='Nominal extinction (mags/airmass)' )

wb1  = WIDGET_BASE( wb, /ROW )
state.zpointid = WIDGET_TEXT( wb1, VALUE=STRING( ph_parms.zpoint, $
            FORMAT='(G0.2)' ), XSIZE=15, /EDITABLE )
w1  = WIDGET_LABEL( wb1, VALUE='Zero point' )

;Put the parameters back.
WIDGET_CONTROL, parent, SET_UVALUE=ph_parms, /NO_COPY

;Restore the state.
stash = WIDGET_INFO( mainbase, /CHILD )
WIDGET_CONTROL, stash, SET_UVALUE=state, /NO_COPY

RETURN, mainbase

END