722 lines
23 KiB
Text
722 lines
23 KiB
Text
|
#!/bin/sh
|
|||
|
# the next line restarts using wish \
|
|||
|
exec wish "$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 GIF -data [mc {
|
|||
|
R0lGODlhHgAOALMPALMAANyIiOu7u8dEROaqqvru7sxVVeGZmbgREfXd3b0iItZ3
|
|||
|
d8IzM9FmZvDMzP///yH5BAEAAA8ALAAAAAAeAA4AAASa8MlJq7046827WVOCHEkw
|
|||
|
nANhUgJlEBIABJIwL3K+4IcUALCHjfbItYZDSgJgkBiYPmBMAUAkkLPKs/BAyLgM
|
|||
|
wAQwOAAY2ByCaw4QAFQSoDEePJ6DmU1xInYZTw5nOEFFdgVUelkVDTIMd3AKFGQ1
|
|||
|
MgI2AwEmQW8APZ0gdRONAks5nhIFVVxdAAkUAS2pAVwFl7ITB4UqHb0XEQA7
|
|||
|
}]
|
|||
|
|
|||
|
#----------------------------------------------------------------
|
|||
|
# The code below create 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
|
|||
|
|
|||
|
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
|
|||
|
.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 [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]]
|
|||
|
$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 \u00a9 %s" {1996-1997 Sun Microsystems, Inc.}]
|
|||
|
[mc "Copyright \u00a9 %s" {1997-2000 Ajuba Solutions, Inc.}]
|
|||
|
[mc "Copyright \u00a9 %s" {2001-2009 Donal K. Fellows}]
|
|||
|
[mc "Copyright \u00a9 %s" {2002-2007 Daniel A. Steffen}]"
|
|||
|
}
|
|||
|
|
|||
|
# Local Variables:
|
|||
|
# mode: tcl
|
|||
|
# End:
|