EIT Software Listings

 

anal
obsolete
response
util

 

Previous Routine
Next Routine

 

Listing of $SSW/soho/eit/idl/util/qmenu.pro

 


FUNCTION qmenu,strings,title=title,init=init, retain=retain, $
	xpos=xpos, ypos=ypos, demowait=demowait
;+NAME/ONE LINE DESCRIPTION:
;    QMENU puts up a one-column scrolling menu on an X-window terminal.
;
;DESCRIPTION:
;    QMENU puts up a one-column scrolling menu on an X-window terminal.
;    This routine uses a list widget for the menu.
;    It replaces BIGWMENU which did not scroll.
;
;CALLING SEQUENCE:
;    sel_index = qmenu( strings, title=[...], init=[...] )
;       
;     
;ARGUMENTS (I=input, O=output, []=optional)
;    strings    I   1-D arr  str        A 1-D array of option strings
;                                       (and possibly a title too).
;    title     [I]  keyword  int        Index of the element in STRINGS
;                                       which will be the title.
;    init      [I]  keyword  int        Index of the element in STRINGS
;                                       which will be the default choice.
;                                       of the menu window.
;    sel_index  O   scalar   int        Index of the selected option.
;
;WARNINGS:
;    1. A value of -1 is returned in the event of any error-conditions.
;
;EXAMPLE:
;    sel_index = qmenu(['title','option 1','option 2'],title=0)
;#
;COMMON BLOCKS:  none.
;
;LIBRARY CALLS:  none.
;
;PROCEDURE:
;    If this routine is invoked from a non-X-window terminal, then put
;    out a message and exit.  Check if a valid argument was supplied
;    for STRINGS, if not then put out a message and exit.  Determine
;    what will be the title of the menu (if any) and what will be the
;    options.  
;
;    Calculate an appropriate X-size for the menu window.  This does
;    not currently work due to the List Widget's insistance on 
;    setting the width based on the items in the list, w/out concern
;    for the title's width.
;
;    Put up the menu window, then monitor and respond to mouse activity.  
;    Exit when a mouse button is pressed and the option is not blank.
;
;REVISION HISTORY:
;	Created 23-Dec-1992 Peter Kryszak:
;		parameter checking from Ewing's BIGQMENU
;		use of IDL's scrolling list widget from Turpie's WDGM
;
; Prgmr    SPR    Date       Reason
; -------- ------ ---------- -------------------------------------------
; Ewing    10619  Feb 25 93  Supply a left margin.
; Turpie   unknwn Mar 19 93  Added large nonproportional font,
;                            fixed inconsistencies in margins.
;  SPR 11127 06 Jul 1993  IDL for Windows compatability. J. Newmark
;.TITLE
;Routine QMENU
;-
  IF ((!D.NAME NE 'X') AND (!D.NAME NE 'WIN')) THEN BEGIN
    MESSAGE,'This routine can only be run on an X-window terminal.',/CONT
    RETURN,-1
  ENDIF
;
;  Make sure an array of strings was supplied via STRINGS.
;  -------------------------------------------------------
  IF(N_PARAMS(0) NE 1) THEN BEGIN
    MESSAGE,'One parameter (an array of strings) must be supplied.',/CONT
    RETURN,-1
  ENDIF
  sz = SIZE(strings)
  IF((sz(0) NE 1) OR (sz(2) NE 7)) THEN BEGIN
    MESSAGE,'The supplied parameter is not an array of strings.',/CONT
    RETURN,-1
  ENDIF
  num_str = sz(1)
;
;  Set up title string (TITLE_STR) and array of options (OPTIONS).
;  ---------------------------------------------------------------
  sz = SIZE(title)
  IF(sz(0)+sz(1) EQ 0) THEN BEGIN
    title_str = ''
    options = strings
    xsize_title = 0
    title = -1
    num_options = num_str
  ENDIF ELSE BEGIN
    IF((title LT 0) OR (title GE num_str)) THEN BEGIN
      MESSAGE,'An invalid value for TITLE was supplied.',/CONT
      RETURN,-1
    ENDIF
    IF(num_str LE 1) THEN BEGIN
      MESSAGE,'Too few strings were supplied.',/CONT
      RETURN,-1
    ENDIF

    title_str = strings(title)
    num_options = num_str - 1

    If (Title gt 0) then begin
      options = [ strings( 0:(Title-1) ), strings( (Title+1):* ) ]
      endif $
    else begin
      options = [ strings( 1:* ) ]
      endelse

    ENDELSE

  options = STRTRIM(options, 2)
  FOR i = 0, N_ELEMENTS(options) - 1 DO options(i) = '  ' + options(i)

  xsize_title =   fix( STRLEN(title_str) )
  xsize_options = max( STRLEN(options) )
  xsize = max( [xsize_title, xsize_options] )

  extra = fix(xsize-strlen(options(0)))
  padding = '  '
  if extra gt 0 then padding = string(replicate(32B,extra)) + padding
  options(0) = options(0) + padding


; default position for the menu is near the center
Device, Get_Screen_Size = Dim
x0 = Fix( Dim(0)*0.025 )
y0 = Fix( Dim(1)*0.61 )

; but check for explicit positioning info
if keyword_set(xpos) then x0 = xpos
if keyword_set(ypos) then y0 = ypos


menu = Widget_Base( Title = title_str, xoffset=x0, yoffset=y0 )


;   display no more than twenty elements of the menu at a time
;   if there are less then only display those
ysize = min( [20, n_elements(options)] ) ; in character lines not pixels
l = Widget_List( menu, Value=options, YSize = ysize )

item = ''

Widget_Control, menu, /REALIZE                                     

While (item eq '') do begin
                                                                          
             IF(KEYWORD_SET(demowait)) THEN BEGIN                               
                 WAIT, demowait                                                 
                 IF(NOT KEYWORD_SET(retain)) THEN Widget_Control, menu, /DESTROY
                 RETURN, init                                                   
                 ENDIF                                                          
                                                                                
             event = Widget_Event( menu )                                       
                                                                                
             index = event.index                                                
             item  = StrTrim( options(index), 2 )                               
                                                                                
             EndWhile



IF(NOT KEYWORD_SET(retain)) THEN Widget_Control, menu, /DESTROY

IF(title NE -1) THEN IF(index GE title) THEN index=index+1

RETURN,index

END


Web curator: Frédéric Auchère
Responsible NASA official: Joseph B. Gurman, Facility Scientist, Solar Data Analysis Center
joseph.b.gurman@gsfc.nasa.gov
+1 301 286-4767
NASA Goddard Space Flight Center
Solar Physics Branch / Code 682

Last revised: - Wed May 9 21:45:23 2007- F. Auchère