#
# Fileselectiondialog
# ----------------------------------------------------------------------
# Implements a file selection box similar to the OSF/Motif standard
# file selection dialog composite widget.  The Fileselectiondialog is 
# derived from the Dialog class and is composed of a FileSelectionBox
# with attributes set to manipulate the dialog buttons.
# 
# ----------------------------------------------------------------------
#  AUTHOR: Mark L. Ulferts               EMAIL: mulferts@spd.dsccc.com
#
#  @(#) $Id: fileselectiondialog.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 Fileselectiondialog {
    keep -activebackground -activerelief -background -borderwidth -cursor \
	 -elementborderwidth -foreground -highlightcolor -highlightthickness \
	 -insertbackground -insertborderwidth -insertofftime -insertontime \
	 -insertwidth -jump -labelfont -modality -selectbackground \
	 -selectborderwidth -textbackground -textfont 
}

# ------------------------------------------------------------------
#                        FILESELECTIONDIALOG
# ------------------------------------------------------------------
itcl::class iwidgets::Fileselectiondialog {
    inherit iwidgets::Dialog

    constructor {args} {}

    public {
	method childsite {}
	method get {}
	method filter {}
    }

    protected method _dbldir {}
}

#
# Provide a lowercased access method for the Fileselectiondialog class.
# 
proc ::iwidgets::fileselectiondialog {pathName args} {
    uplevel ::iwidgets::Fileselectiondialog $pathName $args
}

#
# Use option database to override default resources of base classes.
#
option add *Fileselectiondialog.borderWidth 2 widgetDefault

option add *Fileselectiondialog.title "File Selection Dialog" widgetDefault

option add *Fileselectiondialog.width 350 widgetDefault
option add *Fileselectiondialog.height 400 widgetDefault

option add *Fileselectiondialog.master "." widgetDefault

# ------------------------------------------------------------------
#                        CONSTRUCTOR
# ------------------------------------------------------------------
itcl::body iwidgets::Fileselectiondialog::constructor {args} {
    component hull configure -borderwidth 0
    itk_option add hull.width hull.height
    
    #
    # Turn off pack propagation for the hull widget so the width
    # and height options become active.
    #
    pack propagate $itk_component(hull) no
    
    # 
    # Instantiate a file selection box widget.
    #
    itk_component add fsb {
	iwidgets::Fileselectionbox $itk_interior.fsb -width 150 -height 150 \
		-selectioncommand [itcl::code $this invoke] \
	        -selectdircommand [itcl::code $this default Apply] \
	        -selectfilecommand [itcl::code $this default OK]
    } {
	usual

	keep -labelfont -childsitepos -directory -dirslabel \
	    -dirsearchcommand -dirson -fileslabel -fileson \
	    -filesearchcommand -filterlabel -filteron \
	    -filetype -invalid -mask -nomatchstring \
	    -selectionlabel -selectionon
    }
    grid $itk_component(fsb) -sticky nsew
    grid rowconfigure $itk_interior 0 -weight 1
    grid columnconfigure $itk_interior 0 -weight 1
    
    $itk_component(fsb) component filter configure \
	-focuscommand [itcl::code $this default Apply]
    $itk_component(fsb) component selection configure \
	-focuscommand [itcl::code $this default OK]
    $itk_component(fsb) component dirs configure \
		-dblclickcommand [itcl::code $this _dbldir]
    $itk_component(fsb) component files configure \
		-dblclickcommand [itcl::code $this invoke] 

    buttonconfigure Apply -text "Filter" \
	    -command [itcl::code $itk_component(fsb) filter]
    
    set itk_interior [$itk_component(fsb) childsite]
    
    hide Help

    eval itk_initialize $args
}   

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

# ------------------------------------------------------------------
# METHOD: childsite
#
# Thinwrapped method of file selection box class.
# ------------------------------------------------------------------
itcl::body iwidgets::Fileselectiondialog::childsite {} {
    return [$itk_component(fsb) childsite]
}

# ------------------------------------------------------------------
# METHOD: get
#
# Thinwrapped method of file selection box class.
# ------------------------------------------------------------------
itcl::body iwidgets::Fileselectiondialog::get {} {
    return [$itk_component(fsb) get]
}

# ------------------------------------------------------------------
# METHOD: filter
#
# Thinwrapped method of file selection box class.
# ------------------------------------------------------------------
itcl::body iwidgets::Fileselectiondialog::filter {} {
    return [$itk_component(fsb) filter]
}

# ------------------------------------------------------------------
# PROTECTED METHOD: _dbldir
#
# Double select in directory list.  If the files list is on then
# make the default button the filter and invoke.  If not, just invoke.
# ------------------------------------------------------------------
itcl::body iwidgets::Fileselectiondialog::_dbldir {} {
    if {$itk_option(-fileson)} {
	default Apply
    }

    invoke
}

