;+ ; NAME: ; 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 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 ; 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 Widget_Control, event.top, /Destroy ENDCASE ENDCASE END ;----------------------------------------------------- FUNCTION TextBox, Title=title, Label=label, Cancel=cancel, $ Group_Leader=groupleader, XSize=xsize, Value=value ; 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 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 ; 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(labelbase, Value=label) textID = Widget_Text(labelbase, /Editable, Scr_XSize=xsize, Value=value) buttonBase = Widget_Base(tlb, Row=1) cancelID = Widget_Button(buttonBase, Value='Cancel') acceptID = Widget_Button(buttonBase, Value='Accept') ; Center the widgets on display. cgCenterTLB, tlb 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}) ; Store the program information: info = {ptr:ptr, textID:textID, cancelID:cancelID} Widget_Control, tlb, Set_UValue=info, /No_Copy ; Blocking or modal widget, depending upon group leader. XManager, '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 Ptr_Free, ptr IF destroy_groupleader THEN Widget_Control, groupleader, /Destroy RETURN, theText END ;-----------------------------------------------------