grid $b -sticky news set f [ttk::labelframe $b.title -text [mc "Variable values:"]] foreach var $args { ttk::label $f.n$var -text "$var:" -anchor w ttk::label $f.v$var -textvariable $var -anchor w grid $f.n$var $f.v$var -padx 2 -pady 2 -sticky w } ttk::button $b.ok -text [mc "OK"] \ -command [list destroy $w] -default active bind $w [list $b.ok invoke] bind $w [list $b.ok invoke] grid $f -sticky news -padx 4 grid $b.ok -sticky e -padx 4 -pady {6 4} if {[tk windowingsystem] eq "aqua"} { $b.ok configure -takefocus 0 grid configure $b.ok -pady {10 12} -padx {16 18} grid configure $f -padx 10 -pady {10 0} } grid columnconfig $f 1 -weight 1 grid rowconfigure $f 100 -weight 1 grid columnconfig $b 0 -weight 1 grid rowconfigure $b 0 -weight 1 grid columnconfig $w 0 -weight 1 grid rowconfigure $w 0 -weight 1 } # invoke -- # This procedure is called when the user clicks on a demo description. It is # responsible for invoking the demonstration. # # Arguments: # index - The index of the character that the user clicked on. proc invoke index { global tk_demoDirectory set tags [.t tag names $index] set i [lsearch -glob $tags demo-*] if {$i < 0} { return } set cursor [.t cget -cursor] .t configure -cursor [::ttk::cursor busy] update set demo [string range [lindex $tags $i] 5 end] uplevel 1 [list source -encoding utf-8 [file join $tk_demoDirectory $demo.tcl]] update .t configure -cursor $cursor .t tag add visited "$index linestart +1 chars" "$index lineend -1 chars" } # showStatus -- # # Show the name of the demo program in the status bar. This procedure is # called when the user moves the cursor over a demo description. # proc showStatus index { set tags [.t tag names $index] set i [lsearch -glob $tags demo-*] set cursor [.t cget -cursor] if {$i < 0} { .statusBar.lab config -text " " set newcursor [::ttk::cursor text] } else { set demo [string range [lindex $tags $i] 5 end] .statusBar.lab config -text [mc "Run the \"%s\" sample program" $demo] set newcursor [::ttk::cursor link] } if {$cursor ne $newcursor} { .t config -cursor $newcursor } } # evalShowCode -- # # Arguments: # w - Name of text widget containing code to eval proc evalShowCode {w} { set code [$w get 1.0 end-1c] uplevel #0 $code } # showCode -- # This procedure creates a toplevel window that displays the code for a # demonstration and allows it to be edited and reinvoked. # # Arguments: # w - The name of the demonstration's window, which can be used to # derive the name of the file containing its code. proc showCode w { global tk_demoDirectory set file [string range $w 1 end].tcl set top .code if {![winfo exists $top]} { toplevel $top if {[tk windowingsystem] eq "x11"} {wm attributes $top -type dialog} set t [frame $top.f] set text [text $t.text -font fixedFont -height 24 -wrap word \ -xscrollcommand [list $t.xscroll set] \ -yscrollcommand [list $t.yscroll set] \ -setgrid 1 -highlightthickness 0 -pady 2 -padx 3] ttk::scrollbar $t.xscroll -command [list $t.text xview] \ -orient horizontal ttk::scrollbar $t.yscroll -command [list $t.text yview] \ -orient vertical grid $t.text $t.yscroll -sticky news #grid $t.xscroll grid rowconfigure $t 0 -weight 1 grid columnconfig $t 0 -weight 1 set btns [ttk::frame $top.btns] ttk::separator $btns.sep grid $btns.sep -columnspan 4 -row 0 -sticky ew -pady 2 ttk::button $btns.dismiss -text [mc "Dismiss"] \ -default active -command [list destroy $top] \ -image ::img::delete -compound left ttk::button $btns.print -text [mc "Print Code"] \ -command [list printCode $text $file] \ -image ::img::print -compound left ttk::button $btns.rerun -text [mc "Rerun Demo"] \ -command [list evalShowCode $text] \ -image ::img::refresh -compound left set buttons [list x $btns.rerun $btns.print $btns.dismiss] grid {*}$buttons -padx 4 -pady 4 grid columnconfigure $btns 0 -weight 1 if {[tk windowingsystem] eq "aqua"} { foreach b [lrange $buttons 1 end] {$b configure -takefocus 0} grid configure $btns.sep -pady 0 grid configure {*}$buttons -pady {10 12} grid configure [lindex $buttons 1] -padx {16 4} grid configure [lindex $buttons end] -padx {4 18} } grid $t -sticky news grid $btns -sticky ew grid rowconfigure $top 0 -weight 1 grid columnconfig $top 0 -weight 1 bind $top { if {[winfo class %W] ne "Text"} { .code.btns.dismiss invoke } } bind $top [bind $top ] } else { wm deiconify $top raise $top } wm title $top [mc "Demo code: %s" [file join $tk_demoDirectory $file]] wm iconname $top $file set id [open [file join $tk_demoDirectory $file]] fconfigure $id -encoding utf-8 -eofchar "\032 {}" $top.f.text delete 1.0 end $top.f.text insert 1.0 [read $id] $top.f.text mark set insert 1.0 close $id } # printCode -- # Prints the source code currently displayed in the See Code dialog. Much # thanks to Arjen Markus for this. # # Arguments: # w - Name of text widget containing code to print # file - Name of the original file (implicitly for title) proc printCode {w file} { set code [$w get 1.0 end-1c] set dir "." if {[info exists ::env(HOME)]} { set dir "$::env(HOME)" } if {[info exists ::env(TMP)]} { set dir $::env(TMP) } if {[info exists ::env(TEMP)]} { set dir $::env(TEMP) } set filename [file join $dir "tkdemo-$file"] set outfile [open $filename "w"] puts $outfile $code close $outfile switch -- $::tcl_platform(platform) { unix { if {[catch {exec lp -c $filename} msg]} { tk_messageBox -title "Print spooling failure" \ -message "Print spooling probably failed: $msg" } } windows { if {[catch {PrintTextWin32 $filename} msg]} { tk_messageBox -title "Print spooling failure" \ -message "Print spooling probably failed: $msg" } } default { tk_messageBox -title "Operation not Implemented" \ -message "Wow! Unknown platform: $::tcl_platform(platform)" } } # # Be careful to throw away the temporary file in a gentle manner ... # if {[file exists $filename]} { catch {file delete $filename} } } # PrintTextWin32 -- # Print a file under Windows using all the "intelligence" necessary # # Arguments: # filename - Name of the file # # Note: # Taken from the Wiki page by Keith Vetter, "Printing text files under # Windows". # Note: # Do not execute the command in the background: that way we can dispose of the # file smoothly. # proc PrintTextWin32 {filename} { package require registry set app [auto_execok notepad.exe] set pcmd "$app /p %1" catch { set app [registry get {HKEY_CLASSES_ROOT\.txt} {}] set pcmd [registry get \ {HKEY_CLASSES_ROOT\\$app\\shell\\print\\command} {}] } regsub -all {%1} $pcmd $filename pcmd puts $pcmd regsub -all {\\} $pcmd {\\\\} pcmd set command "[auto_execok start] /min $pcmd" eval exec $command } # tkAboutDialog -- # # Pops up a message box with an "about" message # proc tkAboutDialog {} { tk_messageBox -icon info -type ok -title [mc "About Widget Demo"] \ -message [mc "Tk widget demonstration application"] -detail \ "[mc "Copyright \xA9 %s" {1996-1997 Sun Microsystems, Inc.}] [mc "Copyright \xA9 %s" {1997-2000 Ajuba Solutions, Inc.}] [mc "Copyright \xA9 %s" {2001-2009 Donal K. Fellows}] [mc "Copyright \xA9 %s" {2002-2007 Daniel A. Steffen}]" } # Local Variables: # mode: tcl # End: