;+
;////////////////////////
; WARNING (by Mitsuo Oka)
;///////////////////////
;  This is a modified version of "TextBox" created by IDLCoyote.
;  I modified a little bit for EVA. 
;/////////////////////////
;  
; NAME:
;  MMS_TEXTBOX 
;
; PURPOSE:
;
;  This function allows the user to type some text in a
;  pop-up dialog widget and have it returned to the program.
;  This is an example of a Pop-Up Dialog Widget.
;
; AUTHOR:
;
;       FANNING SOFTWARE CONSULTING
;       David Fanning, Ph.D.
;       1645 Sheely Drive
;       Fort Collins, CO 80526 USA
;       Phone: 970-221-0438
;       E-mail: david@idlcoyote.com
;       Coyote's Guide to IDL Programming: http://www.idlcoyote.com
;
; CATEGORY:
;
;  Utility, Widgets
;
; CALLING SEQUENCE:
;
;  thetext = TextBox()
;
; INPUTS:
;
;  None.
;
; KEYWORD PARAMETERS:
;
;  CANCEL: An output parameter. If the user kills the widget or clicks the Cancel
;       button this keyword is set to 1. It is set to 0 otherwise. It
;       allows you to determine if the user canceled the dialog without
;       having to check the validity of the answer.
;
;       theText = TextBox(Title='Provide Phone Number...', Label='Number:', Cancel=cancelled)
;       IF cancelled THEN Return
;
;  GROUP_LEADER: The widget ID of the group leader of this pop-up
;       dialog. This should be provided if you are calling
;       the program from within a widget program:
;
;          thetext = TextBox(Group_Leader=event.top)
;
;       If a group leader is not provided, an unmapped top-level base widget
;       will be created as a group leader.
;
;  LABEL: A string the appears to the left of the text box.
;
;  TITLE:  The title of the top-level base. If not specified, the
;       string 'Provide Input:' is used by default.
;
;  VALUE: A string variable that is the intial value of the textbox. By default, a null string.
;
;  XSIZE: The size of the text widget in pixel units. By default, 200.
;
; OUTPUTS:
;
;  theText: The string of characters the user typed in the
;       text widget. No error checking is done.
;
; RESTRICTIONS:
;
;  The widget is destroyed if the user clicks on either button or
;  if they hit a carriage return (CR) in the text widget. The
;  text is recorded if the user hits the ACCEPT button or hits
;  a CR in the text widget.
;
; MODIFICATION HISTORY:
;
;  Written by: David W. Fanning, December 20, 2001.
;  Added VALUE keyword to set the initial value of the text box. 4 Nov 2002. DWF.
;-
;
;******************************************************************************************;
;  Copyright (c) 2008, by Fanning Software Consulting, Inc.                                ;
;  All rights reserved.                                                                    ;
;                                                                                          ;
;  Redistribution and use in source and binary forms, with or without                      ;
;  modification, are permitted provided that the following conditions are met:             ;
;                                                                                          ;
;      * Redistributions of source code must retain the above copyright                    ;
;        notice, this list of conditions and the following disclaimer.                     ;
;      * Redistributions in binary form must reproduce the above copyright                 ;
;        notice, this list of conditions and the following disclaimer in the               ;
;        documentation and/or other materials provided with the distribution.              ;
;      * Neither the name of Fanning Software Consulting, Inc. nor the names of its        ;
;        contributors may be used to endorse or promote products derived from this         ;
;        software without specific prior written permission.                               ;
;                                                                                          ;
;  THIS SOFTWARE IS PROVIDED BY FANNING SOFTWARE CONSULTING, INC. ''AS IS'' AND ANY        ;
;  EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES    ;
;  OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT     ;
;  SHALL FANNING SOFTWARE CONSULTING, INC. BE LIABLE FOR ANY DIRECT, INDIRECT,             ;
;  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED    ;
;  TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;         ;
;  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND             ;
;  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT              ;
;  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS           ;
;  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.                            ;
;******************************************************************************************;
PRO mms_TextBox_Event, event

  ; This event handler responds to all events. Widget
  ; is always destoyed. The text is recorded if ACCEPT
  ; button is selected or user hits CR in text widget.

  Widget_Control, event.top, Get_UValue=info
  CASE event.ID OF
    info.cancelID: Widget_Control, event.top, /Destroy
    ELSE: BEGIN;......... Even a carriage return comes here 

      ; Get the text and store it in the pointer location.

      Widget_Control, info.textID, Get_Value=theText
      (*info.ptr).text = theText[0]
      (*info.ptr).cancel = 0
      (*info.ptr).contin = (event.ID eq info.continID)
      Widget_Control, event.top, /Destroy
    ENDCASE
  ENDCASE
END ;-----------------------------------------------------



FUNCTION mms_TextBox, Title=title, Label=label, Cancel=cancel, $
  Group_Leader=groupleader, XSize=xsize, Value=value, SecondLabel=secnd, $
  ThirdLabel=third, Continue_Submission=contin

  ; Return to caller if there is an error. Set the cancel
  ; flag and destroy the group leader if it was created.

  Catch, theError
  IF theError NE 0 THEN BEGIN
    Catch, /Cancel
    ok = Dialog_Message(!Error_State.Msg)
    IF destroy_groupleader THEN Widget_Control, groupleader, /Destroy
    cancel = 1
    contin = 0
    RETURN, ""
  ENDIF

  ; Check parameters and keywords.

  IF N_Elements(title) EQ 0 THEN title = 'Provide Input:'
  IF N_Elements(label) EQ 0 THEN label = ""
  IF N_Elements(value) EQ 0 THEN value = ""
  IF N_Elements(xsize) EQ 0 THEN xsize = 200
  IF N_Elements(secnd) EQ 0 THEN secnd = ""
  IF N_Elements(third) EQ 0 THEN third = ""

  ; Provide a group leader if not supplied with one. This
  ; is required for modal operation of widgets. Set a flag
  ; for destroying the group leader widget before returning.

  IF N_Elements(groupleader) EQ 0 THEN BEGIN
    groupleader = Widget_Base(Map=0)
    Widget_Control, groupleader, /Realize
    destroy_groupleader = 1
  ENDIF ELSE destroy_groupleader = 0

  ; Create modal base widget.

  tlb = Widget_Base(Title=title, Column=1, /Modal, $
    /Base_Align_Center, Group_Leader=groupleader)

  ; Create the rest of the widgets.

  ;labelbase = Widget_Base(tlb, Row=1)
  IF label NE "" THEN label = Widget_Label(tlb, Value=label)
  If secnd NE "" THEN secnd = Widget_Label(tlb, Value=secnd)
  If third NE "" THEN third = Widget_Label(tlb, Value=third)
  textID = Widget_Text(tlb, /Editable, Scr_XSize=xsize, Value=value, YSIZE=4,/wrap)
  buttonBase = Widget_Base(tlb, Row=1)
  cancelID = Widget_Button(buttonBase, Value='Cancel')
  acceptID = Widget_Button(buttonBase, Value='Save')
  continID = Widget_Button(tlb, Value='Accept and Continue Submission')
  ; Center the widgets on display.

  Widget_Control, tlb, /Realize

  ; Create a pointer for the text the user will type into the program.
  ; The cancel field is set to 1 to indicate that the user canceled
  ; the operation. Only if a successful conclusion is reached (i.e.,
  ; a Carriage Return or Accept button selection) is the cancel field
  ; set to 0.

  ptr = Ptr_New({text:"", cancel:1, contin:0})

  ; Store the program information:

  info = {ptr:ptr, textID:textID, cancelID:cancelID, acceptID:acceptID, continID:continID}
  Widget_Control, tlb, Set_UValue=info, /No_Copy

  ; Blocking or modal widget, depending upon group leader.

  XManager, 'mms_textbox', tlb

  ; Return from block. Return the text to the caller of the program,
  ; taking care to clean up pointer and group leader, if needed.
  ; Set the cancel keyword.

  theText = (*ptr).text
  cancel = (*ptr).cancel
  contin = (*ptr).contin
  Ptr_Free, ptr
  IF destroy_groupleader THEN Widget_Control, groupleader, /Destroy

  RETURN, theText
END ;-----------------------------------------------------

