Viewing contents of file '../idllib/contrib/harris/th_wmenu.pro'
;-------------------------------------------------------------
;+
; NAME:
;       TH_WMENU
; PURPOSE:
;       Like wmenu but allows non-mouse menus. Uses widgets if available.
; CATEGORY:
; CALLING SEQUENCE:
;       i = th_wmenu(list)
; INPUTS:
;       list = menu in a string array.        in
; KEYWORD PARAMETERS:
;       Keywords:
;         TITLE=t  item number or a string to use as title (def = no title).
;         INITIAL_SELECTION=s  initial item selected (=default).
;         /NOMOUSE   forces no mouse mode.
;         /NOWIDGETS forces no widget mode.
;	  /LIST      use a list widget rather than button menu.
;
; OUTPUTS:
;       i = selected menu item number.        out
; COMMON BLOCKS:
; NOTES:
; MODIFICATION HISTORY:
;       Based on WMENU2 in JHUAPL which was written by R. Sterner, 22 May 1990
;		--- T.J. Harris 	IE HFRD DSTO.  2 Feb 1994
;	Now utilises xmenu facility to create a nice number of columns
;		--- T.J. Harris 	IE HFRD DSTO. 23 Feb 1994
;	Ammended to use a list widget if requested.
;		--- T.J. Harris 	IE HFRD DSTO. 12 Jan 1995 
;-
;-------------------------------------------------------------

FUNCTION Th_wmenu, list, TITLE=tt, INITIAL_SELECTION=init, HELP=hlp, $
                   NOMOUSE=nom, NOWIDGETS=now, LIST=use_list_widget
  
  IF (N_PARAMS(0) LT 1) OR KEYWORD_SET(hlp) THEN BEGIN
    print, ' Like wmenu but allows non-mouse menus. Uses widgets if available.'
    print, ' i = th_wmenu(list)'
    print, '   list = menu in a string array.        in'
    print, '   i = selected menu item number.        out'
    print, ' Keywords:'
    print, '   TITLE=t  item number to use as title (def = no title).'
    print, '   INITIAL_SELECTION=s  initial item selected (=default).'
    print, '   /NOMOUSE   forces no mouse mode.'
    print, '   /NOWIDGETS forces no widget mode.'
    print, '   /LIST      use a list widget rather than button menu.'
    RETURN, -1
  ENDIF

  list  = string(list) 
  
  IF N_ELEMENTS(tt) EQ 0 THEN BEGIN
    title = ''
    wlist = list
    tt = -1
  ENDIF ELSE BEGIN
    sz = size(tt) 
    IF (sz(sz(0) +1) EQ 7) THEN BEGIN ;tt is a string
      title = tt
      wlist = list
      tt = -1
    ENDIF ELSE BEGIN
      title = list(tt) 
      wlist = list(where(list NE title) ) 
    ENDELSE
  ENDELSE

  IF N_ELEMENTS(init) EQ 0 THEN init = -1
  
  name = !D.name                ; Plot device name.
  flag = (fix(!D.flags /2.^8 MOD 2) ) ; Set if a window device
  IF KEYWORD_SET(nom) THEN flag = 0 ; Force no mouse.

                                ;--------  mouse menu  ----------
  IF (flag) THEN BEGIN
    IF ((!D.flags AND 65536) NE 0) AND $
      (NOT KEYWORD_SET(now) ) THEN BEGIN
                                ;-------  Use Widget menu  ---------
      num = N_ELEMENTS(wlist) 
      plot_ident, /DONT_WRITE, /SHORT, /NOPROG, ROUTINE=3, /NOUID, /NOTIME, $
        OUT=plot_ident_str
      menu_base = WIDGET_BASE(TITLE=plot_ident_str, /COLUMN) 
      label = WIDGET_LABEL(menu_base, VALUE=title) 
      xmenu_base = WIDGET_BASE(menu_base) 
      IF KEYWORD_SET(use_list_widget) THEN $
        L = WIDGET_LIST(xmenu_base, VALUE=wlist, YSIZE=(num < 30) ) $
      ELSE $
        xmenu, wlist, xmenu_base, UVAL=indgen(num), COLUMN=(num /30 + 1) 
      WIDGET_CONTROL, menu_base, /REAL
      e = WIDGET_EVENT(menu_base) 
      IF KEYWORD_SET(use_list_widget) THEN $
        in = e.index $
      ELSE $
        WIDGET_CONTROL, e.id, GET_UVAL=in
      WIDGET_CONTROL, menu_base, /DEST

      IF in GE tt THEN in = in +1 ;since the title has been removed
      RETURN, in

    ENDIF ELSE BEGIN
                                ;-------  Old style menus  -------
      Loop:	    in = wmenu(list, TITLE=tt, INIT=init) 
      IF in LT 0 THEN GOTO, loop
      RETURN, in
    ENDELSE
  ENDIF ELSE BEGIN
    
                                ;-------  non-mouse menu  --------
    print, ' '
    mx = N_ELEMENTS(list) -1
    IF tt GE 0 THEN print, '          ' +list(tt) 
    FOR i = 0, mx DO BEGIN
      IF i NE tt THEN print, ' ', i, ' ' +list(i) 
    ENDFOR
    Loop2:	txt = ''
    IF init GE 0 THEN BEGIN
      read, ' Choose (def = ' +strtrim(init, 2) +'): ', txt
    ENDIF ELSE BEGIN
      read, ' Choose: ', txt
    ENDELSE
    IF txt EQ '' THEN txt = init
    in = txt + 0
    IF (in LT 0) OR (in GT mx) THEN BEGIN
      print, ' You must choose one of the above'
      GOTO, loop2
    ENDIF
    IF in EQ tt THEN BEGIN
      print, ' You must choose one of the above'
      GOTO, loop2
    ENDIF
    RETURN, in

  ENDELSE

  RETURN, -1
  
END