;+
; NAME:
;     WLOKMAP
; PURPOSE:
;     Gives widget access to the Lokmap routine, so that the results
;     can be paged through.  Interactively shows lokmaps for all
;     oscillators on all antennas.
; CATEGORY:
;     OVRO APC DIAGNOSTIC
; CALLING SEQUENCE:
;     wlokmap,fcdata,tctab
; INPUTS:
;     fcdata   The full FCAL data array obtained from an FCAL sequence on
;                the CPC, as created in FCALCHEK.PRO.  The array size is
;                FCDATA(nosc,nant,4096), where nosc=3 is the number of
;                oscillators, and nant is the number of antennas.
;     tctab    The tuning current table as contained in the FCPARM.FTH file.
;                The array size is TCTAB(nant,nosc*3).
;     epoch    A string giving the year, day of year, and start time of the
;                data (just tls.yrday+tls.timstr).  Passed through to LOKMAP.
; OPTIONAL (KEYWORD) INPUT PARAMETERS:
; ROUTINES CALLED:
;     lokmap
; OUTPUTS:
; COMMENTS:
; SIDE EFFECTS:
; RESTRICTIONS:
; MODIFICATION HISTORY:
;     Written 29-Jul-1998 by Dale E. Gary
;     21-Aug-1998  DG
;       Implement printing using the new TOPRINTER command, and added
;       the Epoch argument
;     11-Jan-2000  DG
;       Eliminated use of !UNIX variable by using !DEFAULTS.FONT instead.
;     13-Mar-2000  DG
;       Fixed to work with up to 8 antennas.  Still would not work if some
;       antennas are skipped, since only NANT is known to this routine, not
;       which antennas make up the N antennas.
;     29-Jan-2001  DG
;       Removed now unnecessary FTAB variable, to reflect new FCAL scheme.
;-

;--------------------------------------------------------------------------

PRO LokMain_Event, Event

  base = Event.handler
  stash = WIDGET_INFO(base, /CHILD)
  WIDGET_CONTROL, stash, GET_UVALUE=state, /NO_COPY

  if (Event.Id eq state.mbar) THEN BEGIN
     Ev=Event.Value
  ENDIF ELSE IF (Event.Id EQ state.BGroup(0)) THEN BEGIN
     ; Button groups return their index in the Event.Value
     ; field of the Event structure
     state.iant = Event.Value
     IF (Event.Select EQ 0) THEN goto,WRITE_STATE

     Ev = 'UPDATE'       ; Set the Ev variable to update the plot
  ENDIF ELSE IF (Event.Id EQ state.BGroup(1)) THEN BEGIN
     ; Button groups return their index in the Event.Value
     ; field of the Event structure
     state.iosc = Event.Value
     IF (Event.Select EQ 0) THEN goto,WRITE_STATE
     Ev = 'UPDATE'       ; Set the Ev variable to update the plot
  ENDIF ELSE WIDGET_CONTROL,Event.Id,GET_UVALUE=Ev

  CASE Ev OF

  ; Event for FileMenu
  'File.Print': BEGIN                          ;Event for File.Print
       text = Lokmap(state.fcdata,state.iant,state.iosc,$
                     state.tctab,state.epoch)
       toprinter,text,/fit,/xcenter
    END
  'File.Quit': BEGIN                           ;Event for File.Quit
       WIDGET_CONTROL, /DESTROY, Event.Top
       return
    END

  ; Events for Options Menu
  'Options': BEGIN
       print,'Options menu item selected.'
    END

  'UPDATE': BEGIN

         WIDGET_CONTROL,/HOURGLASS
         out = Lokmap(state.fcdata,state.iant,state.iosc,$
                      state.tctab,state.epoch)
         WIDGET_CONTROL,state.TextID,SET_VALUE=out
    END
   ELSE:
  ENDCASE
WRITE_STATE:
  WIDGET_CONTROL, stash, SET_UVALUE=state, /NO_COPY

END

;--------------------------------------------------------------------------

PRO wlokmap, fcdata, tctab, epoch, GROUP=Group

  IF N_ELEMENTS(Group) EQ 0 THEN GROUP=0

  junk   = { CW_LokMenu_S, flags:0, name:'' }

  nant = n_elements(tctab[*,0,0])
  LokMain = WIDGET_BASE(GROUP_LEADER=Group, $
      ROW=1, $
      MAP=1, $
      MBAR=mBar, $
      TITLE='WLOKMAP : OVRO Phase Lock Map (Widget Interface)', $
      UVALUE='LokMain')

  BASE2 = WIDGET_BASE(LokMain, $
      COLUMN=1, $
      MAP=1, $
      TITLE='ExtraBase', $
      UVALUE='BASE2')

  BASE3 = WIDGET_BASE(BASE2, $
      ROW=1, $
      MAP=1, $
      TITLE='MenuBase', $
      UVALUE='BASE3')

  MenuDesc182 = [ $
      { CW_LokMenu_S,       3, 'File' },     $ ;        0
        { CW_LokMenu_S,       0, 'Print' },  $ ;        4
        { CW_LokMenu_S,       2, 'Quit' }    $ ;        5
  ]

  LokMenu4 = CW_PDMenu( mBar, MenuDesc182, /RETURN_FULL_NAME, $
      UVALUE='LokMenu4',/MBAR)

  MenuDesc1334 = [ $
      { CW_LokMenu_S,       3, 'Options' }          $ ;        0
;        { CW_LokMenu_S,       1, 'Dump Format' },           $ ;        1
;          { CW_DumpMenu_S,       0, 'Show Raw' },       $ ;        2
;          { CW_DumpMenu_S,       2, 'Show Formatted' }, $ ;        3
;        { CW_DumpMenu_S,       0, 'Set Record Range' }, $ ;        4
;        { CW_DumpMenu_S,       2, 'Select by FSW' }     $ ;        5
  ]

  LokMenu48 = CW_PDMenu( mBar, MenuDesc1334, /RETURN_FULL_NAME, $
      UVALUE='LokMenu48',/MBAR)


  BASE6 = WIDGET_BASE(BASE2, $
      COLUMN=1, $
      MAP=1, $
      TITLE='WindowBase', $
      UVALUE='BASE6')

  BASE7 = WIDGET_BASE(BASE6, $
      COLUMN=1, $
      FRAME=1, $
      MAP=1, $
      TITLE='DirBase', $
      UVALUE='BASE7')

  LABEL8 = WIDGET_LABEL( BASE7, $
      UVALUE='LABEL8', $
      VALUE='Phase Lock Map')

  font = !DEFAULTS.FONT

  TextVal187 = [ Lokmap(fcdata,0,0,tctab,epoch) ]
  TexTID = WIDGET_TEXT( BASE7,VALUE=TextVal187, $
      UVALUE='TEXT29', $
      FONT=font, $
      /SCROLL, $
      XSIZE=80, $
      YSIZE=30,$
      RESOURCE_NAME='FileList')

  BASE34 = WIDGET_BASE(BASE2, $
      COLUMN=1, $
      FRAME=1, $
      MAP=1, $
      TITLE='DataBase', $
      UVALUE='DUMP')

  BASE42 = WIDGET_BASE(BASE34, $
      ROW=1, $
      SPACE=200, $
      MAP=1, $
      /ALIGN_CENTER, $
      TITLE='ButtonBase', $
      UVALUE='BASE42')

  AntStrList = ['Ant 1','Ant 2','Ant 4','Ant 5','Ant 6','Ant 7','Ant 8','Ant 9']
  BGroup1 = CW_BGROUP(Base42, AntStrList[0:nant-1], $
                 LABEL_TOP='Antenna',/EXCLUSIVE, SET_VALUE=0, /ROW)

  BGroup2 = CW_BGROUP(Base42, ['Low','Mid','High'], $
                 LABEL_TOP='Oscillator',/EXCLUSIVE, SET_VALUE=0, /ROW)

  WIDGET_CONTROL, LokMain, /REALIZE

  WIDGET_CONTROL,/HOURGLASS

  state = {fcdata:fcdata, tctab:tctab, iant:0, iosc:0,$
           epoch:epoch, TextID:TextID, BGroup:[BGroup1,BGroup2], mBar:mBar}

  ; Connect the STATE structure to the first child of the base widget

  WIDGET_CONTROL, WIDGET_INFO(LokMain, /CHILD), SET_UVALUE=state, /NO_COPY

  XMANAGER, 'LokMain', LokMain

END
