#
# Promptdialog
# ----------------------------------------------------------------------
# Implements a prompt dialog similar to the OSF/Motif standard prompt
# dialog composite widget.  The Promptdialog is derived from the 
# Dialog class and is composed of a EntryField with methods to
# manipulate the dialog buttons.
# 
# ----------------------------------------------------------------------
#  AUTHOR: Mark L. Ulferts              EMAIL: mulferts@austin.dsccc.com
#
#  @(#) $Id: promptdialog.itk,v 1.2 2001/08/07 19:56:48 smithc Exp $
# ----------------------------------------------------------------------
#            Copyright (c) 1995 DSC Technologies Corporation
# ======================================================================
# Permission to use, copy, modify, distribute and license this software 
# and its documentation for any purpose, and without fee or written 
# agreement with DSC, is hereby granted, provided that the above copyright 
# notice appears in all copies and that both the copyright notice and 
# warranty disclaimer below appear in supporting documentation, and that 
# the names of DSC Technologies Corporation or DSC Communications 
# Corporation not be used in advertising or publicity pertaining to the 
# software without specific, written prior permission.
# 
# DSC DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING 
# ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, AND NON-
# INFRINGEMENT. THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, AND THE
# AUTHORS AND DISTRIBUTORS HAVE NO OBLIGATION TO PROVIDE MAINTENANCE, 
# SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. IN NO EVENT SHALL 
# DSC BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR 
# ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, 
# WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTUOUS ACTION,
# ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS 
# SOFTWARE.
# ======================================================================

#
# Usual options.
#
itk::usual Promptdialog {
    keep -background -borderwidth -cursor -foreground -highlightcolor \
	 -highlightthickness -insertbackground -insertborderwidth \
	 -insertofftime -insertontime -insertwidth -labelfont -modality \
	 -selectbackground -selectborderwidth -selectforeground \
	 -textbackground -textfont
}

# ------------------------------------------------------------------
#                            PROMPTDIALOG
# ------------------------------------------------------------------
itcl::class iwidgets::Promptdialog {
    inherit iwidgets::Dialog

    constructor {args} {}

    public method get {} 
    public method clear {} 
    public method insert {args} 
    public method delete {args} 
    public method icursor {args} 
    public method index {args} 
    public method scan {args} 
    public method selection {args} 
    method xview {args} 
}

#
# Provide a lowercased access method for the Dialogshell class.
# 
proc ::iwidgets::promptdialog {pathName args} {
    uplevel ::iwidgets::Promptdialog $pathName $args
}

#
# Use option database to override default resources of base classes.
#
option add *Promptdialog.labelText Selection widgetDefault
option add *Promptdialog.labelPos nw widgetDefault
option add *Promptdialog.title "Prompt Dialog" widgetDefault
option add *Promptdialog.master "." widgetDefault

# ------------------------------------------------------------------
#                        CONSTRUCTOR
# ------------------------------------------------------------------
itcl::body iwidgets::Promptdialog::constructor {args} {
    #
    # Set the borderwidth to zero.
    #
    component hull configure -borderwidth 0
    
    # 
    # Create an entry field widget.
    #
    itk_component add prompt {
	iwidgets::Entryfield $itk_interior.prompt -command [itcl::code $this invoke]
    } {
	usual

	keep -exportselection -invalid -labelpos -labeltext -relief \
	    -show -textbackground -textfont -validate 
    }
    
    pack $itk_component(prompt) -fill x -expand yes
    set itk_interior [childsite]
    
    hide Help

    #
    # Initialize the widget based on the command line options.
    #
    eval itk_initialize $args
}   

# ------------------------------------------------------------------
#                            METHODS
# ------------------------------------------------------------------

# ------------------------------------------------------------------
# METHOD: get
#
# Thinwrapped method of entry field class.
# ------------------------------------------------------------------
itcl::body iwidgets::Promptdialog::get {} {
    return [$itk_component(prompt) get]
}

# ------------------------------------------------------------------
# METHOD: clear 
#
# Thinwrapped method of entry field class.
# ------------------------------------------------------------------
itcl::body iwidgets::Promptdialog::clear {} {
    eval $itk_component(prompt) clear
}

# ------------------------------------------------------------------
# METHOD: insert args
#
# Thinwrapped method of entry field class.
# ------------------------------------------------------------------
itcl::body iwidgets::Promptdialog::insert {args} {
    eval $itk_component(prompt) insert $args
}

# ------------------------------------------------------------------
# METHOD: delete first ?last?
#
# Thinwrapped method of entry field class.
# ------------------------------------------------------------------
itcl::body iwidgets::Promptdialog::delete {args} {
    eval $itk_component(prompt) delete $args
}

# ------------------------------------------------------------------
# METHOD: icursor
#
# Thinwrapped method of entry field class.
# ------------------------------------------------------------------
itcl::body iwidgets::Promptdialog::icursor {args} {
    eval $itk_component(prompt) icursor $args
}

# ------------------------------------------------------------------
# METHOD: index
#
# Thinwrapped method of entry field class.
# ------------------------------------------------------------------
itcl::body iwidgets::Promptdialog::index {args} {
    return [eval $itk_component(prompt) index $args]
}

# ------------------------------------------------------------------
# METHOD: scan option args
#
# Thinwrapped method of entry field class.
# ------------------------------------------------------------------
itcl::body iwidgets::Promptdialog::scan {args} {
    eval $itk_component(prompt) scan $args
}

# ------------------------------------------------------------------
# METHOD: selection args
#
# Thinwrapped method of entry field class.
# ------------------------------------------------------------------
itcl::body iwidgets::Promptdialog::selection {args} {
    eval $itk_component(prompt) selection $args
}

# ------------------------------------------------------------------
# METHOD: xview args
#
# Thinwrapped method of entry field class.
# ------------------------------------------------------------------
itcl::body iwidgets::Promptdialog::xview {args} {
    eval $itk_component(prompt) xview $args
}


