123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734 |
- #!/bin/sh
- # the next line restarts using wish \
- exec wish8.6 "$0" ${1+"$@"}
- # widget --
- # This script demonstrates the various widgets provided by Tk, along with many
- # of the features of the Tk toolkit. This file only contains code to generate
- # the main window for the application, which invokes individual
- # demonstrations. The code for the actual demonstrations is contained in
- # separate ".tcl" files is this directory, which are sourced by this script as
- # needed.
- package require Tk 8.5
- package require msgcat
- eval destroy [winfo child .]
- set tk_demoDirectory [file join [pwd] [file dirname [info script]]]
- ::msgcat::mcload $tk_demoDirectory
- namespace import ::msgcat::mc
- wm title . [mc "Widget Demonstration"]
- if {[tk windowingsystem] eq "x11"} {
- # This won't work everywhere, but there's no other way in core Tk at the
- # moment to display a coloured icon.
- image create photo TclPowered \
- -file [file join $tk_library images logo64.gif]
- wm iconwindow . [toplevel ._iconWindow]
- pack [label ._iconWindow.i -image TclPowered]
- wm iconname . [mc "tkWidgetDemo"]
- }
- if {"defaultFont" ni [font names]} {
- # TIP #145 defines some standard named fonts
- if {"TkDefaultFont" in [font names] && "TkFixedFont" in [font names]} {
- # FIX ME: the following technique of cloning the font to copy it works
- # fine but means that if the system font is changed by Tk
- # cannot update the copied font. font alias might be useful
- # here -- or fix the app to use TkDefaultFont etc.
- font create mainFont {*}[font configure TkDefaultFont]
- font create fixedFont {*}[font configure TkFixedFont]
- font create boldFont {*}[font configure TkDefaultFont] -weight bold
- font create titleFont {*}[font configure TkDefaultFont] -weight bold
- font create statusFont {*}[font configure TkDefaultFont]
- font create varsFont {*}[font configure TkDefaultFont]
- if {[tk windowingsystem] eq "aqua"} {
- font configure titleFont -size 17
- }
- } else {
- font create mainFont -family Helvetica -size 12
- font create fixedFont -family Courier -size 10
- font create boldFont -family Helvetica -size 12 -weight bold
- font create titleFont -family Helvetica -size 18 -weight bold
- font create statusFont -family Helvetica -size 10
- font create varsFont -family Helvetica -size 14
- }
- }
- set widgetDemo 1
- set font mainFont
- image create photo ::img::refresh -format GIF -data {
- R0lGODlhEAAQAJEDAP///wAAACpnKv///yH5BAEAAAMALAAAAAAQABAAAAI63IKp
- xgcPH2ouwgBCw1HIxHCQ4F3hSJKmwZXqWrmWxj7lKJ2dndcon9EBUq+gz3brVXAR
- 2tICU0gXBQA7
- }
- image create photo ::img::view -format GIF -data {
- R0lGODlhEAAQAKIHAP///wwMDAAAAMDAwNnZ2SYmJmZmZv///yH5BAEAAAcALAAA
- AAAQABAAAANMKLos90+ASamDRxJCgw9YVnlDOXiQBgRDBRgHKE6sW8QR3doPKK27
- yg33q/GIOhdg6OsEJzeZykiBSUcs06e56Xx6np8ScIkFGuhQAgA7
- }
- image create photo ::img::delete -format GIF -data {
- R0lGODlhEAAQAIABAIQAAP///yH5BAEAAAEALAAAAAAQABAAAAIjjI+pmwAc3HGy
- PUSvqYpuvWQg40FfSVacBa5nN6JYDI3mzRQAOw==
- }
- image create photo ::img::print -format GIF -data {
- R0lGODlhEAAQALMKAAAAAP///52VunNkl8C82Yl+qldBgq+pyrOzs1fYAP///wAA
- AAAAAAAAAAAAAAAAACH5BAEAAAoALAAAAAAQABAAAARGUMlJKwU4AztB+ODGeUiJ
- fGLlgeEYmGWQXmx7aXgmAUTv/74N4EAsGhOJg1DAbDqbwoJ0Sp0KB9isNis0eL/g
- ryhH5pgnEQA7
- }
- # Note that this is run through the message catalog! This is because this is
- # actually an image of a word.
- image create photo ::img::new -format PNG -data [mc {
- iVBORw0KGgoAAAANSUhEUgAAAB4AAAAOCAYAAAA45qw5AAACMElEQVR4AeVTAwxd
- QRCc2tZHGtQ2w9q2bdsOa9u2bUW1bdt2Z372JZe6DapJLqtb3h7+T8yKi5j4CsYD
- EUQXxETclT7kWOlH2VV+tFkdQHPSwksSISF+BauCqL0qgOcMWgGfgEkaMsHxqUBk
- 3plE/sOnh/qDPAPJH/CKFBivGHWzFwBRnHhlqbu1Mh6CoFNnC/JshQ9p4YC2lrKt
- DCAV+THiVejyhMjAbrNSrroiEfKR9g7ZfCgOog8QfnUQV62wAk68ndQ9ZbyoWO1H
- Y6eDY1LCQL6a9ApOp9Hi1T0+gQq2JKMlky/oTKQliKWxEZvyG575kpW4pl1aZnQK
- CLOVt45Lkp8uXp2SL8KO6uitNTZLdpK6s+I/eZbhpmsmWeOGOVQNKYLITzpKPAO3
- tY7LSNZ7ccSLxX9y3uuOxRkg3dKESMoCHvL+GRVCutXsB3guLgDCeXOv4iWWkvwG
- BaS+PmlpK6SI9ApI2oC2UtrwZQEkhkH+NtolVlQXJl1I+QltuU3XEc721bIRFpa8
- IA5iqTo6vNNWmkNBLQbPeXwF2g17Q94nTQAfY3YzeY+WSu8MDzQ2kpELUhSGJUHE
- 0zeR3rY1L+Xl5G/re+jbiK6KhThwwInsts1fbMUUcpZszKeVtggZEiGdZDe5AtHh
- 7vL4CGiRvvKPS8FAvq9Nr4ZkFadR2y6kggu1z4vlyIbBp6BugQ8JLEg4bTkD9eMZ
- QZ8hpJ3VvTtuvbWrY/ElvP/9R+Aj3603+iE3fkEAAAAASUVORK5CYII=
- }]
- #----------------------------------------------------------------
- # The code below creates the main window, consisting of a menu bar and a text
- # widget that explains how to use the program, plus lists all of the demos as
- # hypertext items.
- #----------------------------------------------------------------
- menu .menuBar -tearoff 0
- # On Aqua, just use the default menu.
- if {[tk windowingsystem] ne "aqua"} {
- # This is a tk-internal procedure to make i18n easier
- ::tk::AmpMenuArgs .menuBar add cascade -label [mc "&File"] \
- -menu .menuBar.file
- menu .menuBar.file -tearoff 0
- ::tk::AmpMenuArgs .menuBar.file add command -label [mc "&About..."] \
- -command {tkAboutDialog} -accelerator [mc "<F1>"]
- bind . <F1> {tkAboutDialog}
- .menuBar.file add sep
- if {[string match win* [tk windowingsystem]]} {
- # Windows doesn't usually have a Meta key
- ::tk::AmpMenuArgs .menuBar.file add command -label [mc "&Quit"] \
- -command {exit} -accelerator [mc "Ctrl+Q"]
- bind . <[mc "Control-q"]> {exit}
- } else {
- ::tk::AmpMenuArgs .menuBar.file add command -label [mc "&Quit"] \
- -command {exit} -accelerator [mc "Meta-Q"]
- bind . <[mc "Meta-q"]> {exit}
- }
- . configure -menu .menuBar
- }
- ttk::frame .statusBar
- ttk::label .statusBar.lab -text " " -anchor w
- if {[tk windowingsystem] eq "aqua"} {
- ttk::separator .statusBar.sep
- pack .statusBar.sep -side top -expand yes -fill x -pady 0
- }
- pack .statusBar.lab -side left -padx 2 -expand yes -fill both
- if {[tk windowingsystem] ne "aqua"} {
- ttk::sizegrip .statusBar.foo
- pack .statusBar.foo -side left -padx 2
- }
- pack .statusBar -side bottom -fill x -pady 2
- set textheight 30
- catch {
- set textheight [expr {
- ([winfo screenheight .] * 0.7) /
- [font metrics mainFont -displayof . -linespace]
- }]
- }
- ttk::frame .textFrame
- ttk::scrollbar .s -orient vertical -command {.t yview} -takefocus 1
- pack .s -in .textFrame -side right -fill y
- text .t -yscrollcommand {.s set} -wrap word -width 70 -height $textheight \
- -font mainFont -setgrid 1 -highlightthickness 0 \
- -padx 4 -pady 2 -takefocus 0
- pack .t -in .textFrame -expand y -fill both -padx 1
- pack .textFrame -expand yes -fill both
- if {[tk windowingsystem] eq "aqua"} {
- pack configure .statusBar.lab -padx {10 18} -pady {4 6}
- pack configure .statusBar -pady 0
- .t configure -padx 10 -pady 0
- }
- # Create a bunch of tags to use in the text widget, such as those for section
- # titles and demo descriptions. Also define the bindings for tags.
- .t tag configure title -font titleFont
- .t tag configure subtitle -font titleFont
- .t tag configure bold -font boldFont
- if {[tk windowingsystem] eq "aqua"} {
- .t tag configure title -spacing1 8
- .t tag configure subtitle -spacing3 3
- }
- # We put some "space" characters to the left and right of each demo
- # description so that the descriptions are highlighted only when the mouse
- # cursor is right over them (but not when the cursor is to their left or
- # right).
- #
- .t tag configure demospace -lmargin1 1c -lmargin2 1c
- if {[winfo depth .] == 1} {
- .t tag configure demo -lmargin1 1c -lmargin2 1c \
- -underline 1
- .t tag configure visited -lmargin1 1c -lmargin2 1c \
- -underline 1
- .t tag configure hot -background black -foreground white
- } else {
- .t tag configure demo -lmargin1 1c -lmargin2 1c \
- -foreground blue -underline 1
- .t tag configure visited -lmargin1 1c -lmargin2 1c \
- -foreground #303080 -underline 1
- if {[tk windowingsystem] eq "aqua"} {
- .t tag configure demo -foreground systemLinkColor
- .t tag configure visited -foreground purple
- }
- .t tag configure hot -foreground red -underline 1
- }
- .t tag bind demo <ButtonRelease-1> {
- invoke [.t index {@%x,%y}]
- }
- set lastLine ""
- .t tag bind demo <Enter> {
- set lastLine [.t index {@%x,%y linestart}]
- .t tag add hot "$lastLine +1 chars" "$lastLine lineend -1 chars"
- .t config -cursor [::ttk::cursor link]
- showStatus [.t index {@%x,%y}]
- }
- .t tag bind demo <Leave> {
- .t tag remove hot 1.0 end
- .t config -cursor [::ttk::cursor text]
- .statusBar.lab config -text ""
- }
- .t tag bind demo <Motion> {
- set newLine [.t index {@%x,%y linestart}]
- if {$newLine ne $lastLine} {
- .t tag remove hot 1.0 end
- set lastLine $newLine
- set tags [.t tag names {@%x,%y}]
- set i [lsearch -glob $tags demo-*]
- if {$i >= 0} {
- .t tag add hot "$lastLine +1 chars" "$lastLine lineend -1 chars"
- }
- }
- showStatus [.t index {@%x,%y}]
- }
- ##############################################################################
- # Create the text for the text widget.
- # addFormattedText --
- #
- # Add formatted text (but not hypertext) to the text widget after first
- # passing it through the message catalog to allow for localization.
- # Lines starting with @@ are formatting directives (insert title, insert
- # demo hyperlink, begin newline, or change style) and all other lines
- # are literal strings to be inserted. Substitutions are performed,
- # allowing processing pieces through the message catalog. Blank lines
- # are ignored.
- #
- proc addFormattedText {formattedText} {
- set style normal
- set isNL 1
- set demoCount 0
- set new 0
- foreach line [split $formattedText \n] {
- set line [string trim $line]
- if {$line eq ""} {
- continue
- }
- if {[string match @@* $line]} {
- set data [string range $line 2 end]
- set key [lindex $data 0]
- set values [lrange $data 1 end]
- switch -exact -- $key {
- title {
- .t insert end [mc $values]\n title \n normal
- }
- newline {
- .t insert end \n $style
- set isNL 1
- }
- subtitle {
- .t insert end "\n" {} [mc $values] subtitle \
- " \n " demospace
- set demoCount 0
- }
- demo {
- set description [lassign $values name]
- .t insert end "[incr demoCount]. [mc $description]" \
- [list demo demo-$name]
- if {$new} {
- .t image create end -image ::img::new -padx 5
- set new 0
- }
- .t insert end " \n " demospace
- }
- new {
- set new 1
- }
- default {
- set style $key
- }
- }
- continue
- }
- if {!$isNL} {
- .t insert end " " $style
- }
- set isNL 0
- .t insert end [mc $line] $style
- }
- }
- addFormattedText {
- @@title Tk Widget Demonstrations
- This application provides a front end for several short scripts
- that demonstrate what you can do with Tk widgets. Each of the
- numbered lines below describes a demonstration; you can click on
- it to invoke the demonstration. Once the demonstration window
- appears, you can click the
- @@bold
- See Code
- @@normal
- button to see the Tcl/Tk code that created the demonstration. If
- you wish, you can edit the code and click the
- @@bold
- Rerun Demo
- @@normal
- button in the code window to reinvoke the demonstration with the
- modified code.
- @@newline
- @@subtitle Labels, buttons, checkbuttons, and radiobuttons
- @@demo label Labels (text and bitmaps)
- @@demo unicodeout Labels and UNICODE text
- @@demo button Buttons
- @@demo check Check-buttons (select any of a group)
- @@demo radio Radio-buttons (select one of a group)
- @@demo puzzle A 15-puzzle game made out of buttons
- @@demo icon Iconic buttons that use bitmaps
- @@demo image1 Two labels displaying images
- @@demo image2 A simple user interface for viewing images
- @@demo labelframe Labelled frames
- @@demo ttkbut The simple Themed Tk widgets
- @@subtitle Listboxes and Trees
- @@demo states The 50 states
- @@demo colors Colors: change the color scheme for the application
- @@demo sayings A collection of famous and infamous sayings
- @@demo mclist A multi-column list of countries
- @@demo tree A directory browser tree
- @@subtitle Entries, Spin-boxes and Combo-boxes
- @@demo entry1 Entries without scrollbars
- @@demo entry2 Entries with scrollbars
- @@demo entry3 Validated entries and password fields
- @@demo spin Spin-boxes
- @@demo combo Combo-boxes
- @@demo form Simple Rolodex-like form
- @@subtitle Text
- @@demo text Basic editable text
- @@demo style Text display styles
- @@demo bind Hypertext (tag bindings)
- @@demo twind A text widget with embedded windows and other features
- @@demo search A search tool built with a text widget
- @@demo textpeer Peering text widgets
- @@subtitle Canvases
- @@demo items The canvas item types
- @@demo plot A simple 2-D plot
- @@demo ctext Text items in canvases
- @@demo arrow An editor for arrowheads on canvas lines
- @@demo ruler A ruler with adjustable tab stops
- @@demo floor A building floor plan
- @@demo cscroll A simple scrollable canvas
- @@demo knightstour A Knight's tour of the chess board
- @@subtitle Scales and Progress Bars
- @@demo hscale Horizontal scale
- @@demo vscale Vertical scale
- @@new
- @@demo ttkscale Themed scale linked to a label with traces
- @@demo ttkprogress Progress bar
- @@subtitle Paned Windows and Notebooks
- @@demo paned1 Horizontal paned window
- @@demo paned2 Vertical paned window
- @@demo ttkpane Themed nested panes
- @@demo ttknote Notebook widget
- @@subtitle Menus and Toolbars
- @@demo menu Menus and cascades (sub-menus)
- @@demo menubu Menu-buttons
- @@demo ttkmenu Themed menu buttons
- @@demo toolbar Themed toolbar
- @@subtitle Common Dialogs
- @@demo msgbox Message boxes
- @@demo filebox File selection dialog
- @@demo clrpick Color picker
- @@demo fontchoose Font selection dialog
- @@subtitle Animation
- @@demo anilabel Animated labels
- @@demo aniwave Animated wave
- @@demo pendulum Pendulum simulation
- @@demo goldberg A celebration of Rube Goldberg
- @@subtitle Miscellaneous
- @@demo bitmap The built-in bitmaps
- @@demo dialog1 A dialog box with a local grab
- @@demo dialog2 A dialog box with a global grab
- }
- ##############################################################################
- .t configure -state disabled
- focus .s
- # addSeeDismiss --
- # Add "See Code" and "Dismiss" button frame, with optional "See Vars"
- #
- # Arguments:
- # w - The name of the frame to use.
- proc addSeeDismiss {w show {vars {}} {extra {}}} {
- ## See Code / Dismiss buttons
- ttk::frame $w
- ttk::separator $w.sep
- #ttk::frame $w.sep -height 2 -relief sunken
- grid $w.sep -columnspan 4 -row 0 -sticky ew -pady 2
- ttk::button $w.dismiss -text [mc "Dismiss"] \
- -image ::img::delete -compound left \
- -command [list destroy [winfo toplevel $w]]
- ttk::button $w.code -text [mc "See Code"] \
- -image ::img::view -compound left \
- -command [list showCode $show]
- set buttons [list x $w.code $w.dismiss]
- if {[llength $vars]} {
- ttk::button $w.vars -text [mc "See Variables"] \
- -image ::img::view -compound left \
- -command [concat [list showVars $w.dialog] $vars]
- set buttons [linsert $buttons 1 $w.vars]
- }
- if {$extra ne ""} {
- set buttons [linsert $buttons 1 [uplevel 1 $extra]]
- }
- grid {*}$buttons -padx 4 -pady 4
- grid columnconfigure $w 0 -weight 1
- if {[tk windowingsystem] eq "aqua"} {
- foreach b [lrange $buttons 1 end] {$b configure -takefocus 0}
- grid configure $w.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}
- }
- return $w
- }
- # positionWindow --
- # This procedure is invoked by most of the demos to position a new demo
- # window.
- #
- # Arguments:
- # w - The name of the window to position.
- proc positionWindow w {
- wm geometry $w +300+300
- }
- # showVars --
- # Displays the values of one or more variables in a window, and updates the
- # display whenever any of the variables changes.
- #
- # Arguments:
- # w - Name of new window to create for display.
- # args - Any number of names of variables.
- proc showVars {w args} {
- catch {destroy $w}
- toplevel $w
- if {[tk windowingsystem] eq "x11"} {wm attributes $w -type dialog}
- wm title $w [mc "Variable values"]
- set b [ttk::frame $w.frame]
- 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 <Return> [list $b.ok invoke]
- bind $w <Escape> [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 <Return> {
- if {[winfo class %W] ne "Text"} { .code.btns.dismiss invoke }
- }
- bind $top <Escape> [bind $top <Return>]
- } 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:
|