# This file is a Tcl script to test out Tk's "tk_getOpenFile" and
# "tk_getSaveFile" commands. It is organized in the standard fashion
# for Tcl tests.
#
# Copyright (c) 1996 Sun Microsystems, Inc.
# Copyright (c) 1998-1999 by Scriptics Corporation.
# All rights reserved.
#
# RCS: @(#) $Id: filebox.test,v 1.14 2003/04/01 21:06:23 dgp Exp $
#

package require tcltest 2.1
eval tcltest::configure $argv
tcltest::loadTestedCommands

set tk_strictMotif_old $tk_strictMotif

#----------------------------------------------------------------------
#
# Procedures needed by this test file
#
#----------------------------------------------------------------------

proc ToPressButton {parent btn} {
    global isNative
    if {!$isNative} {
	after 100 SendButtonPress $parent $btn mouse
    }
}

proc ToEnterFileByKey {parent fileName fileDir} {
    global isNative
    if {!$isNative} {
	after 100 EnterFileByKey $parent [list $fileName] [list $fileDir]
    }
}

proc PressButton {btn} {
    event generate $btn <Enter>
    event generate $btn <1> -x 5 -y 5
    event generate $btn <ButtonRelease-1> -x 5 -y 5
}

proc EnterFileByKey {parent fileName fileDir} {
    global tk_strictMotif
    if {$parent == "."} {
	set w .__tk_filedialog
    } else {
	set w $parent.__tk_filedialog
    }
    upvar ::tk::dialog::file::__tk_filedialog data

    if {$tk_strictMotif} {
	$data(sEnt) delete 0 end
	$data(sEnt) insert 0 [file join $fileDir $fileName]
    } else {
	$data(ent) delete 0 end
	$data(ent) insert 0 $fileName
    }

    update
    SendButtonPress $parent ok mouse
}

proc SendButtonPress {parent btn type} {
    global tk_strictMotif
    if {$parent == "."} {
	set w .__tk_filedialog
    } else {
	set w $parent.__tk_filedialog
    }
    upvar ::tk::dialog::file::__tk_filedialog data

    set button $data($btn\Btn)
    if ![winfo ismapped $button] {
	update
    }

    if {$type == "mouse"} {
	PressButton $button
    } else {
	event generate $w <Enter>
	focus $w
	event generate $button <Enter>
	event generate $w <KeyPress> -keysym Return
    }
}


#----------------------------------------------------------------------
#
# The test suite proper
#
#----------------------------------------------------------------------

if {$tcl_platform(platform) == "unix"} {
    set modes "0 1"
} else {
    set modes 1
}

set unknownOptionsMsg(tk_getOpenFile) {1 {bad option "-foo": must be -defaultextension, -filetypes, -initialdir, -initialfile, -multiple, -parent, or -title}}
set unknownOptionsMsg(tk_getSaveFile) {1 {bad option "-foo": must be -defaultextension, -filetypes, -initialdir, -initialfile, -parent, or -title}}

set tmpFile "filebox.tmp"
makeFile {
    # this file can be empty!
} $tmpFile

array set filters {
    1 {}
    2 {
	{"Text files"		{.txt .doc}	}
	{"Text files"		{}		TEXT}
	{"Tcl Scripts"		{.tcl}		TEXT}
	{"C Source Files"	{.c .h}		}
	{"All Source Files"	{.tcl .c .h}	}
	{"Image Files"		{.gif}		}
	{"Image Files"		{.jpeg .jpg}	}
	{"Image Files"		""		{GIFF JPEG}}
	{"All files"		*}
    }
    3 {
	{"Text files"		{.txt .doc}	TEXT}
	{"Foo"			{""}		TEXT}
    }
}

foreach mode $modes {

    #
    # Test both the motif version and the "tk" version of the file dialog
    # box on Unix.
    #
    # Note that this can use the same test number twice!
    #

    set addedExtensions {}
    if {$tcl_platform(platform) == "unix"} {
	set tk_strictMotif $mode
	# Extension adding is only done when using the non-motif file
	# box with an extension-less filename
	if {!$mode} {
	    set addedExtensions {NONE {} .txt .txt}
	}
    }

    test filebox-1.1 "tk_getOpenFile command" {
	list [catch {tk_getOpenFile -foo} msg] $msg
    } $unknownOptionsMsg(tk_getOpenFile)

    catch {tk_getOpenFile -foo 1} msg
    regsub -all ,      $msg "" options
    regsub \"-foo\" $options "" options
    
    foreach option $options {
        if {[string index $option 0] == "-"} {
    	test filebox-1.2 "tk_getOpenFile command" {
    	    list [catch {tk_getOpenFile $option} msg] $msg
    	} [list 1 "value for \"$option\" missing"]
        }
    }
    
    test filebox-1.3 "tk_getOpenFile command" {
        list [catch {tk_getOpenFile -foo bar} msg] $msg
    } $unknownOptionsMsg(tk_getOpenFile)
    
    test filebox-1.4 "tk_getOpenFile command" {
        list [catch {tk_getOpenFile -initialdir} msg] $msg
    } {1 {value for "-initialdir" missing}}
    
    test filebox-1.5 "tk_getOpenFile command" {
        list [catch {tk_getOpenFile -parent foo.bar} msg] $msg
    } {1 {bad window path name "foo.bar"}}
    
    test filebox-1.6 "tk_getOpenFile command" {
        list [catch {tk_getOpenFile -filetypes {Foo}} msg] $msg
    } {1 {bad file type "Foo", should be "typeName {extension ?extensions ...?} ?{macType ?macTypes ...?}?"}}
    
    if {[info commands tk::MotifFDialog] == "" && [info commands ::tk::dialog::file::] == ""} {
        set isNative 1
    } else {
        set isNative 0
    }
    
    set parent .
    
    set verylongstring longstring:
    set verylongstring $verylongstring$verylongstring
    set verylongstring $verylongstring$verylongstring
    set verylongstring $verylongstring$verylongstring
    set verylongstring $verylongstring$verylongstring
    # set verylongstring $verylongstring$verylongstring
    # set verylongstring $verylongstring$verylongstring
    # set verylongstring $verylongstring$verylongstring
    # set verylongstring $verylongstring$verylongstring
    # set verylongstring $verylongstring$verylongstring

    set color #404040
    test filebox-2.1 "tk_getOpenFile command" {nonUnixUserInteraction} {
        ToPressButton $parent cancel
        tk_getOpenFile -title "Press Cancel ($verylongstring)" -parent $parent
    } ""
    
    set fileName $tmpFile
    set fileDir [pwd]
    set pathName [file join $fileDir $fileName]
    
    test filebox-2.2 "tk_getOpenFile command" {nonUnixUserInteraction} {
        ToPressButton $parent ok
        set choice [tk_getOpenFile -title "Press Ok" \
    		    -parent $parent -initialfile $fileName -initialdir $fileDir]
    } $pathName
    
    test filebox-2.3 "tk_getOpenFile command" {nonUnixUserInteraction} {
        ToEnterFileByKey $parent $fileName $fileDir
        set choice [tk_getOpenFile -title "Enter \"$fileName\" and press Ok" \
    		    -parent $parent -initialdir $fileDir]
    } $pathName
    
    test filebox-2.4 "tk_getOpenFile command" {nonUnixUserInteraction} {
        ToPressButton $parent ok
        set choice [tk_getOpenFile -title "Enter \"$fileName\" and press Ok" \
    		    -parent $parent -initialdir . \
    		    -initialfile $fileName]
    } $pathName
    
    test filebox-2.5 "tk_getOpenFile command" {nonUnixUserInteraction} {
        ToPressButton $parent ok
        set choice [tk_getOpenFile -title "Enter \"$fileName\" and press Ok" \
    		    -parent $parent -initialdir /badpath \
    		    -initialfile $fileName]
    } $pathName
    
    test filebox-2.6 "tk_getOpenFile command" {nonUnixUserInteraction} {
        toplevel .t1; toplevel .t2
        wm geometry .t1 +0+0
        wm geometry .t2 +0+0
        ToPressButton .t1 ok
        set choice {}
        lappend choice [tk_getOpenFile \
    	    -title "Enter \"$fileName\" and press Ok" \
    	    -parent .t1 -initialdir $fileDir \
    	    -initialfile $fileName]
        ToPressButton .t2 ok
        lappend choice [tk_getOpenFile \
    	    -title "Enter \"$fileName\" and press Ok" \
    	    -parent .t2 -initialdir $fileDir \
    	    -initialfile $fileName]
        ToPressButton .t1 ok
        lappend choice [tk_getOpenFile \
    	    -title "Enter \"$fileName\" and press Ok" \
    	    -parent .t1 -initialdir $fileDir \
    	    -initialfile $fileName]
        destroy .t1
        destroy .t2
        set choice
    } [list $pathName $pathName $pathName]

    foreach x [lsort -integer [array names filters]] {
        test filebox-3.$x "tk_getOpenFile command" {nonUnixUserInteraction} {
    	ToPressButton $parent ok
    	set choice [tk_getOpenFile -title "Press Ok" -filetypes $filters($x)\
    			-parent $parent -initialfile $fileName -initialdir $fileDir]
        } $pathName
    }

    test filebox-4.1 "tk_getSaveFile command" {
	list [catch {tk_getSaveFile -foo} msg] $msg
    } $unknownOptionsMsg(tk_getSaveFile)

    catch {tk_getSaveFile -foo 1} msg
    regsub -all ,      $msg "" options
    regsub \"-foo\" $options "" options

    foreach option $options {
	if {[string index $option 0] == "-"} {
	    test filebox-4.2 "tk_getSaveFile command" {
		list [catch {tk_getSaveFile $option} msg] $msg
	    } [list 1 "value for \"$option\" missing"]
	}
    }

    test filebox-4.3 "tk_getSaveFile command" {
	list [catch {tk_getSaveFile -foo bar} msg] $msg
    } $unknownOptionsMsg(tk_getSaveFile)

    test filebox-4.4 "tk_getSaveFile command" {
	list [catch {tk_getSaveFile -initialdir} msg] $msg
    } {1 {value for "-initialdir" missing}}

    test filebox-4.5 "tk_getSaveFile command" {
	list [catch {tk_getSaveFile -parent foo.bar} msg] $msg
    } {1 {bad window path name "foo.bar"}}

    test filebox-4.6 "tk_getSaveFile command" {
	list [catch {tk_getSaveFile -filetypes {Foo}} msg] $msg
    } {1 {bad file type "Foo", should be "typeName {extension ?extensions ...?} ?{macType ?macTypes ...?}?"}}

    if {[info commands tk::MotifFDialog] == "" && [info commands ::tk::dialog::file::] == ""} {
	set isNative 1
    } else {
	set isNative 0
    }

    set parent .

    set verylongstring longstring:
    set verylongstring $verylongstring$verylongstring
    set verylongstring $verylongstring$verylongstring
    set verylongstring $verylongstring$verylongstring
    set verylongstring $verylongstring$verylongstring
    # set verylongstring $verylongstring$verylongstring
    # set verylongstring $verylongstring$verylongstring
    # set verylongstring $verylongstring$verylongstring
    # set verylongstring $verylongstring$verylongstring
    # set verylongstring $verylongstring$verylongstring

    set color #404040
    test filebox-5.1 "tk_getSaveFile command" {nonUnixUserInteraction} {
	ToPressButton $parent cancel
	tk_getSaveFile -title "Press Cancel ($verylongstring)" -parent $parent
    } ""

    set fileName "12x 455"
    set fileDir [pwd]
    set pathName [file join [pwd] $fileName]

    test filebox-5.2 "tk_getSaveFile command" {nonUnixUserInteraction} {
	ToPressButton $parent ok
	set choice [tk_getSaveFile -title "Press Ok" \
		-parent $parent -initialfile $fileName -initialdir $fileDir]
    } $pathName

    test filebox-5.3 "tk_getSaveFile command" {nonUnixUserInteraction} {
	ToEnterFileByKey $parent $fileName $fileDir
	set choice [tk_getSaveFile -title "Enter \"$fileName\" and press Ok" \
		-parent $parent -initialdir $fileDir]
    } $pathName

    test filebox-5.4 "tk_getSaveFile command" {nonUnixUserInteraction} {
	ToPressButton $parent ok
	set choice [tk_getSaveFile -title "Enter \"$fileName\" and press Ok" \
		-parent $parent -initialdir . \
		-initialfile $fileName]
    } $pathName

    test filebox-5.5 "tk_getSaveFile command" {nonUnixUserInteraction} {
	ToPressButton $parent ok
	set choice [tk_getSaveFile -title "Enter \"$fileName\" and press Ok" \
		-parent $parent -initialdir /badpath \
		-initialfile $fileName]
    } $pathName

    test filebox-5.6 "tk_getSaveFile command" {nonUnixUserInteraction} {
	toplevel .t1; toplevel .t2
	wm geometry .t1 +0+0
	wm geometry .t2 +0+0
	ToPressButton .t1 ok
	set choice {}
	lappend choice [tk_getSaveFile \
		-title "Enter \"$fileName\" and press Ok" \
		-parent .t1 -initialdir $fileDir \
		-initialfile $fileName]
	ToPressButton .t2 ok
	lappend choice [tk_getSaveFile \
		-title "Enter \"$fileName\" and press Ok" \
		-parent .t2 -initialdir $fileDir \
		-initialfile $fileName]
	ToPressButton .t1 ok
	lappend choice [tk_getSaveFile \
		-title "Enter \"$fileName\" and press Ok" \
		-parent .t1 -initialdir $fileDir \
		-initialfile $fileName]
	destroy .t1
	destroy .t2
	set choice
    } [list $pathName $pathName $pathName]

    foreach x [lsort -integer [array names filters]] {
	test filebox-6.$x "tk_getSaveFile command" {nonUnixUserInteraction} {
	    ToPressButton $parent ok
	    set choice [tk_getSaveFile -title "Press Ok" -filetypes $filters($x)\
		    -parent $parent -initialfile $fileName -initialdir $fileDir]
	} $pathName[lindex $addedExtensions $x]
    }

    # The rest of the tests need to be executed on Unix only.
    # The test whether the dialog box widgets were implemented correctly.
    # These tests are not
    # needed on the other platforms because they use native file dialogs.
}

set tk_strictMotif $tk_strictMotif_old

# cleanup
cleanupTests
return