| Current Path : /home/emeraadmin/public_html/4d695/ |
| Current File : /home/emeraadmin/public_html/4d695/tk8.6.tar |
demos/entry2.tcl 0000644 00000004041 15170274642 0007611 0 ustar 00 # entry2.tcl --
#
# This demonstration script is the same as the entry1.tcl script
# except that it creates scrollbars for the entries.
if {![info exists widgetDemo]} {
error "This script should be run from the \"widget\" demo."
}
package require Tk
set w .entry2
catch {destroy $w}
toplevel $w
wm title $w "Entry Demonstration (with scrollbars)"
wm iconname $w "entry2"
positionWindow $w
label $w.msg -font $font -wraplength 5i -justify left -text "Three different entries are displayed below, with a scrollbar for each entry. You can add characters by pointing, clicking and typing. The normal Motif editing characters are supported, along with many Emacs bindings. For example, Backspace and Control-h delete the character to the left of the insertion cursor and Delete and Control-d delete the chararacter to the right of the insertion cursor. For entries that are too large to fit in the window all at once, you can scan through the entries with the scrollbars, or by dragging with mouse button2 pressed."
pack $w.msg -side top
## See Code / Dismiss buttons
set btns [addSeeDismiss $w.buttons $w]
pack $btns -side bottom -fill x
frame $w.frame -borderwidth 10
pack $w.frame -side top -fill x -expand 1
entry $w.frame.e1 -xscrollcommand "$w.frame.s1 set"
ttk::scrollbar $w.frame.s1 -orient horiz -command \
"$w.frame.e1 xview"
frame $w.frame.spacer1 -width 20 -height 10
entry $w.frame.e2 -xscrollcommand "$w.frame.s2 set"
ttk::scrollbar $w.frame.s2 -orient horiz -command \
"$w.frame.e2 xview"
frame $w.frame.spacer2 -width 20 -height 10
entry $w.frame.e3 -xscrollcommand "$w.frame.s3 set"
ttk::scrollbar $w.frame.s3 -orient horiz -command \
"$w.frame.e3 xview"
pack $w.frame.e1 $w.frame.s1 $w.frame.spacer1 $w.frame.e2 $w.frame.s2 \
$w.frame.spacer2 $w.frame.e3 $w.frame.s3 -side top -fill x
$w.frame.e1 insert 0 "Initial value"
$w.frame.e2 insert end "This entry contains a long value, much too long "
$w.frame.e2 insert end "to fit in the window at one time, so long in fact "
$w.frame.e2 insert end "that you'll have to scan or scroll to see the end."
demos/entry3.tcl 0000644 00000013730 15170274642 0007617 0 ustar 00 # entry3.tcl --
#
# This demonstration script creates several entry widgets whose
# permitted input is constrained in some way. It also shows off a
# password entry.
if {![info exists widgetDemo]} {
error "This script should be run from the \"widget\" demo."
}
package require Tk
set w .entry3
catch {destroy $w}
toplevel $w
wm title $w "Constrained Entry Demonstration"
wm iconname $w "entry3"
positionWindow $w
label $w.msg -font $font -wraplength 5i -justify left -text "Four different\
entries are displayed below. You can add characters by pointing,\
clicking and typing, though each is constrained in what it will\
accept. The first only accepts 32-bit integers or the empty string\
(checking when focus leaves it) and will flash to indicate any\
problem. The second only accepts strings with fewer than ten\
characters and sounds the bell when an attempt to go over the limit\
is made. The third accepts US phone numbers, mapping letters to\
their digit equivalent and sounding the bell on encountering an\
illegal character or if trying to type over a character that is not\
a digit. The fourth is a password field that accepts up to eight\
characters (silently ignoring further ones), and displaying them as\
asterisk characters."
## See Code / Dismiss buttons
set btns [addSeeDismiss $w.buttons $w]
pack $btns -side bottom -fill x
# focusAndFlash --
# Error handler for entry widgets that forces the focus onto the
# widget and makes the widget flash by exchanging the foreground and
# background colours at intervals of 200ms (i.e. at approximately
# 2.5Hz).
#
# Arguments:
# W - Name of entry widget to flash
# fg - Initial foreground colour
# bg - Initial background colour
# count - Counter to control the number of times flashed
proc focusAndFlash {W fg bg {count 9}} {
focus -force $W
if {$count<1} {
$W configure -foreground $fg -background $bg
} else {
if {$count%2} {
$W configure -foreground $bg -background $fg
} else {
$W configure -foreground $fg -background $bg
}
after 200 [list focusAndFlash $W $fg $bg [expr {$count-1}]]
}
}
labelframe $w.l1 -text "Integer Entry"
# Alternatively try using {string is digit} for arbitrary length numbers,
# and not just 32-bit ones.
entry $w.l1.e -validate focus -vcmd {string is integer %P}
$w.l1.e configure -invalidcommand \
"focusAndFlash %W [$w.l1.e cget -fg] [$w.l1.e cget -bg]"
pack $w.l1.e -fill x -expand 1 -padx 1m -pady 1m
labelframe $w.l2 -text "Length-Constrained Entry"
entry $w.l2.e -validate key -invcmd bell -vcmd {expr {[string length %P]<10}}
pack $w.l2.e -fill x -expand 1 -padx 1m -pady 1m
### PHONE NUMBER ENTRY ###
# Note that the source to this is quite a bit longer as the behaviour
# demonstrated is a lot more ambitious than with the others.
# Initial content for the third entry widget
set entry3content "1-(000)-000-0000"
# Mapping from alphabetic characters to numbers. This is probably
# wrong, but it is the only mapping I have; the UK doesn't really go
# for associating letters with digits for some reason.
set phoneNumberMap {}
foreach {chars digit} {abc 2 def 3 ghi 4 jkl 5 mno 6 pqrs 7 tuv 8 wxyz 9} {
foreach char [split $chars ""] {
lappend phoneNumberMap $char $digit [string toupper $char] $digit
}
}
# validatePhoneChange --
# Checks that the replacement (mapped to a digit) of the given
# character in an entry widget at the given position will leave a
# valid phone number in the widget.
#
# W - The entry widget to validate
# vmode - The widget's validation mode
# idx - The index where replacement is to occur
# char - The character (or string, though that will always be
# refused) to be overwritten at that point.
proc validatePhoneChange {W vmode idx char} {
global phoneNumberMap entry3content
if {$idx == -1} {return 1}
after idle [list $W configure -validate $vmode -invcmd bell]
if {
!($idx<3 || $idx==6 || $idx==7 || $idx==11 || $idx>15) &&
[string match {[0-9A-Za-z]} $char]
} then {
$W delete $idx
$W insert $idx [string map $phoneNumberMap $char]
after idle [list phoneSkipRight $W -1]
return 1
}
return 0
}
# phoneSkipLeft --
# Skip over fixed characters in a phone-number string when moving left.
#
# Arguments:
# W - The entry widget containing the phone-number.
proc phoneSkipLeft {W} {
set idx [$W index insert]
if {$idx == 8} {
# Skip back two extra characters
$W icursor [incr idx -2]
} elseif {$idx == 7 || $idx == 12} {
# Skip back one extra character
$W icursor [incr idx -1]
} elseif {$idx <= 3} {
# Can't move any further
bell
return -code break
}
}
# phoneSkipRight --
# Skip over fixed characters in a phone-number string when moving right.
#
# Arguments:
# W - The entry widget containing the phone-number.
# add - Offset to add to index before calculation (used by validation.)
proc phoneSkipRight {W {add 0}} {
set idx [$W index insert]
if {$idx+$add == 5} {
# Skip forward two extra characters
$W icursor [incr idx 2]
} elseif {$idx+$add == 6 || $idx+$add == 10} {
# Skip forward one extra character
$W icursor [incr idx]
} elseif {$idx+$add == 15 && !$add} {
# Can't move any further
bell
return -code break
}
}
labelframe $w.l3 -text "US Phone-Number Entry"
entry $w.l3.e -validate key -invcmd bell -textvariable entry3content \
-vcmd {validatePhoneChange %W %v %i %S}
# Click to focus goes to the first editable character...
bind $w.l3.e <FocusIn> {
if {"%d" ne "NotifyAncestor"} {
%W icursor 3
after idle {%W selection clear}
}
}
bind $w.l3.e <<PrevChar>> {phoneSkipLeft %W}
bind $w.l3.e <<NextChar>> {phoneSkipRight %W}
pack $w.l3.e -fill x -expand 1 -padx 1m -pady 1m
labelframe $w.l4 -text "Password Entry"
entry $w.l4.e -validate key -show "*" -vcmd {expr {[string length %P]<=8}}
pack $w.l4.e -fill x -expand 1 -padx 1m -pady 1m
lower [frame $w.mid]
grid $w.l1 $w.l2 -in $w.mid -padx 3m -pady 1m -sticky ew
grid $w.l3 $w.l4 -in $w.mid -padx 3m -pady 1m -sticky ew
grid columnconfigure $w.mid {0 1} -uniform 1
pack $w.msg -side top
pack $w.mid -fill both -expand 1
demos/filebox.tcl 0000644 00000004457 15170274642 0010031 0 ustar 00 # filebox.tcl --
#
# This demonstration script prompts the user to select a file.
if {![info exists widgetDemo]} {
error "This script should be run from the \"widget\" demo."
}
package require Tk
set w .filebox
catch {destroy $w}
toplevel $w
wm title $w "File Selection Dialogs"
wm iconname $w "filebox"
positionWindow $w
ttk::frame $w._bg
place $w._bg -x 0 -y 0 -relwidth 1 -relheight 1
ttk::label $w.msg -font $font -wraplength 4i -justify left -text "Enter a file name in the entry box or click on the \"Browse\" buttons to select a file name using the file selection dialog."
pack $w.msg -side top
## See Code / Dismiss buttons
set btns [addSeeDismiss $w.buttons $w]
pack $btns -side bottom -fill x
foreach i {open save} {
set f [ttk::frame $w.$i]
ttk::label $f.lab -text "Select a file to $i: " -anchor e
ttk::entry $f.ent -width 20
ttk::button $f.but -text "Browse ..." -command "fileDialog $w $f.ent $i"
pack $f.lab -side left
pack $f.ent -side left -expand yes -fill x
pack $f.but -side left
pack $f -fill x -padx 1c -pady 3
}
if {[tk windowingsystem] eq "x11"} {
ttk::checkbutton $w.strict -text "Use Motif Style Dialog" \
-variable tk_strictMotif -onvalue 1 -offvalue 0
pack $w.strict -anchor c
# This binding ensures that we don't run the rest of the demos
# with motif style interactions
bind $w.strict <Destroy> {set tk_strictMotif 0}
}
proc fileDialog {w ent operation} {
# Type names Extension(s) Mac File Type(s)
#
#---------------------------------------------------------
set types {
{"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" *}
}
if {$operation == "open"} {
global selected_type
if {![info exists selected_type]} {
set selected_type "Tcl Scripts"
}
set file [tk_getOpenFile -filetypes $types -parent $w \
-typevariable selected_type]
puts "You selected filetype \"$selected_type\""
} else {
set file [tk_getSaveFile -filetypes $types -parent $w \
-initialfile Untitled -defaultextension .txt]
}
if {[string compare $file ""]} {
$ent delete 0 end
$ent insert 0 $file
$ent xview end
}
}
demos/floor.tcl 0000644 00000232404 15170274642 0007515 0 ustar 00 # floor.tcl --
#
# This demonstration script creates a canvas widet that displays the
# floorplan for DEC's Western Research Laboratory.
if {![info exists widgetDemo]} {
error "This script should be run from the \"widget\" demo."
}
package require Tk
# floorDisplay --
# Recreate the floorplan display in the canvas given by "w". The
# floor given by "active" is displayed on top with its office structure
# visible.
#
# Arguments:
# w - Name of the canvas window.
# active - Number of active floor (1, 2, or 3).
proc floorDisplay {w active} {
global floorLabels floorItems colors activeFloor
if {$activeFloor == $active} {
return
}
$w delete all
set activeFloor $active
# First go through the three floors, displaying the backgrounds for
# each floor.
bg1 $w $colors(bg1) $colors(outline1)
bg2 $w $colors(bg2) $colors(outline2)
bg3 $w $colors(bg3) $colors(outline3)
# Raise the background for the active floor so that it's on top.
$w raise floor$active
# Create a dummy item just to mark this point in the display list,
# so we can insert highlights here.
$w create rect 0 100 1 101 -fill {} -outline {} -tags marker
# Add the walls and labels for the active floor, along with
# transparent polygons that define the rooms on the floor.
# Make sure that the room polygons are on top.
catch {unset floorLabels}
catch {unset floorItems}
fg$active $w $colors(offices)
$w raise room
# Offset the floors diagonally from each other.
$w move floor1 2c 2c
$w move floor2 1c 1c
# Create items for the room entry and its label.
$w create window 600 100 -anchor w -window $w.entry
$w create text 600 100 -anchor e -text "Room: "
$w config -scrollregion [$w bbox all]
}
# newRoom --
# This procedure is invoked whenever the mouse enters a room
# in the floorplan. It changes tags so that the current room is
# highlighted.
#
# Arguments:
# w - The name of the canvas window.
proc newRoom w {
global currentRoom floorLabels
set id [$w find withtag current]
if {$id != ""} {
set currentRoom $floorLabels($id)
}
update idletasks
}
# roomChanged --
# This procedure is invoked whenever the currentRoom variable changes.
# It highlights the current room and unhighlights any previous room.
#
# Arguments:
# w - The canvas window displaying the floorplan.
# args - Not used.
proc roomChanged {w args} {
global currentRoom floorItems colors
$w delete highlight
if {[catch {set item $floorItems($currentRoom)}]} {
return
}
set new [eval \
"$w create polygon [$w coords $item] -fill $colors(active) \
-tags highlight"]
$w raise $new marker
}
# bg1 --
# This procedure represents part of the floorplan database. When
# invoked, it instantiates the background information for the first
# floor.
#
# Arguments:
# w - The canvas window.
# fill - Fill color to use for the floor's background.
# outline - Color to use for the floor's outline.
proc bg1 {w fill outline} {
$w create poly 347 80 349 82 351 84 353 85 363 92 375 99 386 104 \
386 129 398 129 398 162 484 162 484 129 559 129 559 133 725 \
133 725 129 802 129 802 389 644 389 644 391 559 391 559 327 \
508 327 508 311 484 311 484 278 395 278 395 288 400 288 404 \
288 409 290 413 292 418 297 421 302 422 309 421 318 417 325 \
411 330 405 332 397 333 344 333 340 334 336 336 335 338 332 \
342 331 347 332 351 334 354 336 357 341 359 340 360 335 363 \
331 365 326 366 304 366 304 355 258 355 258 387 60 387 60 391 \
0 391 0 337 3 337 3 114 8 114 8 25 30 25 30 5 93 5 98 5 104 7 \
110 10 116 16 119 20 122 28 123 32 123 68 220 68 220 34 221 \
22 223 17 227 13 231 8 236 4 242 2 246 0 260 0 283 1 300 5 \
321 14 335 22 348 25 365 29 363 39 358 48 352 56 337 70 \
344 76 347 80 \
-tags {floor1 bg} -fill $fill
$w create line 386 129 398 129 -fill $outline -tags {floor1 bg}
$w create line 258 355 258 387 -fill $outline -tags {floor1 bg}
$w create line 60 387 60 391 -fill $outline -tags {floor1 bg}
$w create line 0 337 0 391 -fill $outline -tags {floor1 bg}
$w create line 60 391 0 391 -fill $outline -tags {floor1 bg}
$w create line 3 114 3 337 -fill $outline -tags {floor1 bg}
$w create line 258 387 60 387 -fill $outline -tags {floor1 bg}
$w create line 484 162 398 162 -fill $outline -tags {floor1 bg}
$w create line 398 162 398 129 -fill $outline -tags {floor1 bg}
$w create line 484 278 484 311 -fill $outline -tags {floor1 bg}
$w create line 484 311 508 311 -fill $outline -tags {floor1 bg}
$w create line 508 327 508 311 -fill $outline -tags {floor1 bg}
$w create line 559 327 508 327 -fill $outline -tags {floor1 bg}
$w create line 644 391 559 391 -fill $outline -tags {floor1 bg}
$w create line 644 389 644 391 -fill $outline -tags {floor1 bg}
$w create line 559 129 484 129 -fill $outline -tags {floor1 bg}
$w create line 484 162 484 129 -fill $outline -tags {floor1 bg}
$w create line 725 133 559 133 -fill $outline -tags {floor1 bg}
$w create line 559 129 559 133 -fill $outline -tags {floor1 bg}
$w create line 725 129 802 129 -fill $outline -tags {floor1 bg}
$w create line 802 389 802 129 -fill $outline -tags {floor1 bg}
$w create line 3 337 0 337 -fill $outline -tags {floor1 bg}
$w create line 559 391 559 327 -fill $outline -tags {floor1 bg}
$w create line 802 389 644 389 -fill $outline -tags {floor1 bg}
$w create line 725 133 725 129 -fill $outline -tags {floor1 bg}
$w create line 8 25 8 114 -fill $outline -tags {floor1 bg}
$w create line 8 114 3 114 -fill $outline -tags {floor1 bg}
$w create line 30 25 8 25 -fill $outline -tags {floor1 bg}
$w create line 484 278 395 278 -fill $outline -tags {floor1 bg}
$w create line 30 25 30 5 -fill $outline -tags {floor1 bg}
$w create line 93 5 30 5 -fill $outline -tags {floor1 bg}
$w create line 98 5 93 5 -fill $outline -tags {floor1 bg}
$w create line 104 7 98 5 -fill $outline -tags {floor1 bg}
$w create line 110 10 104 7 -fill $outline -tags {floor1 bg}
$w create line 116 16 110 10 -fill $outline -tags {floor1 bg}
$w create line 119 20 116 16 -fill $outline -tags {floor1 bg}
$w create line 122 28 119 20 -fill $outline -tags {floor1 bg}
$w create line 123 32 122 28 -fill $outline -tags {floor1 bg}
$w create line 123 68 123 32 -fill $outline -tags {floor1 bg}
$w create line 220 68 123 68 -fill $outline -tags {floor1 bg}
$w create line 386 129 386 104 -fill $outline -tags {floor1 bg}
$w create line 386 104 375 99 -fill $outline -tags {floor1 bg}
$w create line 375 99 363 92 -fill $outline -tags {floor1 bg}
$w create line 353 85 363 92 -fill $outline -tags {floor1 bg}
$w create line 220 68 220 34 -fill $outline -tags {floor1 bg}
$w create line 337 70 352 56 -fill $outline -tags {floor1 bg}
$w create line 352 56 358 48 -fill $outline -tags {floor1 bg}
$w create line 358 48 363 39 -fill $outline -tags {floor1 bg}
$w create line 363 39 365 29 -fill $outline -tags {floor1 bg}
$w create line 365 29 348 25 -fill $outline -tags {floor1 bg}
$w create line 348 25 335 22 -fill $outline -tags {floor1 bg}
$w create line 335 22 321 14 -fill $outline -tags {floor1 bg}
$w create line 321 14 300 5 -fill $outline -tags {floor1 bg}
$w create line 300 5 283 1 -fill $outline -tags {floor1 bg}
$w create line 283 1 260 0 -fill $outline -tags {floor1 bg}
$w create line 260 0 246 0 -fill $outline -tags {floor1 bg}
$w create line 246 0 242 2 -fill $outline -tags {floor1 bg}
$w create line 242 2 236 4 -fill $outline -tags {floor1 bg}
$w create line 236 4 231 8 -fill $outline -tags {floor1 bg}
$w create line 231 8 227 13 -fill $outline -tags {floor1 bg}
$w create line 223 17 227 13 -fill $outline -tags {floor1 bg}
$w create line 221 22 223 17 -fill $outline -tags {floor1 bg}
$w create line 220 34 221 22 -fill $outline -tags {floor1 bg}
$w create line 340 360 335 363 -fill $outline -tags {floor1 bg}
$w create line 335 363 331 365 -fill $outline -tags {floor1 bg}
$w create line 331 365 326 366 -fill $outline -tags {floor1 bg}
$w create line 326 366 304 366 -fill $outline -tags {floor1 bg}
$w create line 304 355 304 366 -fill $outline -tags {floor1 bg}
$w create line 395 288 400 288 -fill $outline -tags {floor1 bg}
$w create line 404 288 400 288 -fill $outline -tags {floor1 bg}
$w create line 409 290 404 288 -fill $outline -tags {floor1 bg}
$w create line 413 292 409 290 -fill $outline -tags {floor1 bg}
$w create line 418 297 413 292 -fill $outline -tags {floor1 bg}
$w create line 421 302 418 297 -fill $outline -tags {floor1 bg}
$w create line 422 309 421 302 -fill $outline -tags {floor1 bg}
$w create line 421 318 422 309 -fill $outline -tags {floor1 bg}
$w create line 421 318 417 325 -fill $outline -tags {floor1 bg}
$w create line 417 325 411 330 -fill $outline -tags {floor1 bg}
$w create line 411 330 405 332 -fill $outline -tags {floor1 bg}
$w create line 405 332 397 333 -fill $outline -tags {floor1 bg}
$w create line 397 333 344 333 -fill $outline -tags {floor1 bg}
$w create line 344 333 340 334 -fill $outline -tags {floor1 bg}
$w create line 340 334 336 336 -fill $outline -tags {floor1 bg}
$w create line 336 336 335 338 -fill $outline -tags {floor1 bg}
$w create line 335 338 332 342 -fill $outline -tags {floor1 bg}
$w create line 331 347 332 342 -fill $outline -tags {floor1 bg}
$w create line 332 351 331 347 -fill $outline -tags {floor1 bg}
$w create line 334 354 332 351 -fill $outline -tags {floor1 bg}
$w create line 336 357 334 354 -fill $outline -tags {floor1 bg}
$w create line 341 359 336 357 -fill $outline -tags {floor1 bg}
$w create line 341 359 340 360 -fill $outline -tags {floor1 bg}
$w create line 395 288 395 278 -fill $outline -tags {floor1 bg}
$w create line 304 355 258 355 -fill $outline -tags {floor1 bg}
$w create line 347 80 344 76 -fill $outline -tags {floor1 bg}
$w create line 344 76 337 70 -fill $outline -tags {floor1 bg}
$w create line 349 82 347 80 -fill $outline -tags {floor1 bg}
$w create line 351 84 349 82 -fill $outline -tags {floor1 bg}
$w create line 353 85 351 84 -fill $outline -tags {floor1 bg}
}
# bg2 --
# This procedure represents part of the floorplan database. When
# invoked, it instantiates the background information for the second
# floor.
#
# Arguments:
# w - The canvas window.
# fill - Fill color to use for the floor's background.
# outline - Color to use for the floor's outline.
proc bg2 {w fill outline} {
$w create poly 559 129 484 129 484 162 398 162 398 129 315 129 \
315 133 176 133 176 129 96 129 96 133 3 133 3 339 0 339 0 391 \
60 391 60 387 258 387 258 329 350 329 350 311 395 311 395 280 \
484 280 484 311 508 311 508 327 558 327 558 391 644 391 644 \
367 802 367 802 129 725 129 725 133 559 133 559 129 \
-tags {floor2 bg} -fill $fill
$w create line 350 311 350 329 -fill $outline -tags {floor2 bg}
$w create line 398 129 398 162 -fill $outline -tags {floor2 bg}
$w create line 802 367 802 129 -fill $outline -tags {floor2 bg}
$w create line 802 129 725 129 -fill $outline -tags {floor2 bg}
$w create line 725 133 725 129 -fill $outline -tags {floor2 bg}
$w create line 559 129 559 133 -fill $outline -tags {floor2 bg}
$w create line 559 133 725 133 -fill $outline -tags {floor2 bg}
$w create line 484 162 484 129 -fill $outline -tags {floor2 bg}
$w create line 559 129 484 129 -fill $outline -tags {floor2 bg}
$w create line 802 367 644 367 -fill $outline -tags {floor2 bg}
$w create line 644 367 644 391 -fill $outline -tags {floor2 bg}
$w create line 644 391 558 391 -fill $outline -tags {floor2 bg}
$w create line 558 327 558 391 -fill $outline -tags {floor2 bg}
$w create line 558 327 508 327 -fill $outline -tags {floor2 bg}
$w create line 508 327 508 311 -fill $outline -tags {floor2 bg}
$w create line 484 311 508 311 -fill $outline -tags {floor2 bg}
$w create line 484 280 484 311 -fill $outline -tags {floor2 bg}
$w create line 398 162 484 162 -fill $outline -tags {floor2 bg}
$w create line 484 280 395 280 -fill $outline -tags {floor2 bg}
$w create line 395 280 395 311 -fill $outline -tags {floor2 bg}
$w create line 258 387 60 387 -fill $outline -tags {floor2 bg}
$w create line 3 133 3 339 -fill $outline -tags {floor2 bg}
$w create line 3 339 0 339 -fill $outline -tags {floor2 bg}
$w create line 60 391 0 391 -fill $outline -tags {floor2 bg}
$w create line 0 339 0 391 -fill $outline -tags {floor2 bg}
$w create line 60 387 60 391 -fill $outline -tags {floor2 bg}
$w create line 258 329 258 387 -fill $outline -tags {floor2 bg}
$w create line 350 329 258 329 -fill $outline -tags {floor2 bg}
$w create line 395 311 350 311 -fill $outline -tags {floor2 bg}
$w create line 398 129 315 129 -fill $outline -tags {floor2 bg}
$w create line 176 133 315 133 -fill $outline -tags {floor2 bg}
$w create line 176 129 96 129 -fill $outline -tags {floor2 bg}
$w create line 3 133 96 133 -fill $outline -tags {floor2 bg}
$w create line 315 133 315 129 -fill $outline -tags {floor2 bg}
$w create line 176 133 176 129 -fill $outline -tags {floor2 bg}
$w create line 96 133 96 129 -fill $outline -tags {floor2 bg}
}
# bg3 --
# This procedure represents part of the floorplan database. When
# invoked, it instantiates the background information for the third
# floor.
#
# Arguments:
# w - The canvas window.
# fill - Fill color to use for the floor's background.
# outline - Color to use for the floor's outline.
proc bg3 {w fill outline} {
$w create poly 159 300 107 300 107 248 159 248 159 129 96 129 96 \
133 21 133 21 331 0 331 0 391 60 391 60 370 159 370 159 300 \
-tags {floor3 bg} -fill $fill
$w create poly 258 370 258 329 350 329 350 311 399 311 399 129 \
315 129 315 133 176 133 176 129 159 129 159 370 258 370 \
-tags {floor3 bg} -fill $fill
$w create line 96 133 96 129 -fill $outline -tags {floor3 bg}
$w create line 176 129 96 129 -fill $outline -tags {floor3 bg}
$w create line 176 129 176 133 -fill $outline -tags {floor3 bg}
$w create line 315 133 176 133 -fill $outline -tags {floor3 bg}
$w create line 315 133 315 129 -fill $outline -tags {floor3 bg}
$w create line 399 129 315 129 -fill $outline -tags {floor3 bg}
$w create line 399 311 399 129 -fill $outline -tags {floor3 bg}
$w create line 399 311 350 311 -fill $outline -tags {floor3 bg}
$w create line 350 329 350 311 -fill $outline -tags {floor3 bg}
$w create line 350 329 258 329 -fill $outline -tags {floor3 bg}
$w create line 258 370 258 329 -fill $outline -tags {floor3 bg}
$w create line 60 370 258 370 -fill $outline -tags {floor3 bg}
$w create line 60 370 60 391 -fill $outline -tags {floor3 bg}
$w create line 60 391 0 391 -fill $outline -tags {floor3 bg}
$w create line 0 391 0 331 -fill $outline -tags {floor3 bg}
$w create line 21 331 0 331 -fill $outline -tags {floor3 bg}
$w create line 21 331 21 133 -fill $outline -tags {floor3 bg}
$w create line 96 133 21 133 -fill $outline -tags {floor3 bg}
$w create line 107 300 159 300 159 248 107 248 107 300 \
-fill $outline -tags {floor3 bg}
}
# fg1 --
# This procedure represents part of the floorplan database. When
# invoked, it instantiates the foreground information for the first
# floor (office outlines and numbers).
#
# Arguments:
# w - The canvas window.
# color - Color to use for drawing foreground information.
proc fg1 {w color} {
global floorLabels floorItems
set i [$w create polygon 375 246 375 172 341 172 341 246 -fill {} -tags {floor1 room}]
set floorLabels($i) 101
set {floorItems(101)} $i
$w create text 358 209 -text 101 -fill $color -anchor c -tags {floor1 label}
set i [$w create polygon 307 240 339 240 339 206 307 206 -fill {} -tags {floor1 room}]
set floorLabels($i) {Pub Lift1}
set {floorItems(Pub Lift1)} $i
$w create text 323 223 -text {Pub Lift1} -fill $color -anchor c -tags {floor1 label}
set i [$w create polygon 339 205 307 205 307 171 339 171 -fill {} -tags {floor1 room}]
set floorLabels($i) {Priv Lift1}
set {floorItems(Priv Lift1)} $i
$w create text 323 188 -text {Priv Lift1} -fill $color -anchor c -tags {floor1 label}
set i [$w create polygon 42 389 42 337 1 337 1 389 -fill {} -tags {floor1 room}]
set floorLabels($i) 110
set {floorItems(110)} $i
$w create text 21.5 363 -text 110 -fill $color -anchor c -tags {floor1 label}
set i [$w create polygon 59 389 59 385 90 385 90 337 44 337 44 389 -fill {} -tags {floor1 room}]
set floorLabels($i) 109
set {floorItems(109)} $i
$w create text 67 363 -text 109 -fill $color -anchor c -tags {floor1 label}
set i [$w create polygon 51 300 51 253 6 253 6 300 -fill {} -tags {floor1 room}]
set floorLabels($i) 111
set {floorItems(111)} $i
$w create text 28.5 276.5 -text 111 -fill $color -anchor c -tags {floor1 label}
set i [$w create polygon 98 248 98 309 79 309 79 248 -fill {} -tags {floor1 room}]
set floorLabels($i) 117B
set {floorItems(117B)} $i
$w create text 88.5 278.5 -text 117B -fill $color -anchor c -tags {floor1 label}
set i [$w create polygon 51 251 51 204 6 204 6 251 -fill {} -tags {floor1 room}]
set floorLabels($i) 112
set {floorItems(112)} $i
$w create text 28.5 227.5 -text 112 -fill $color -anchor c -tags {floor1 label}
set i [$w create polygon 6 156 51 156 51 203 6 203 -fill {} -tags {floor1 room}]
set floorLabels($i) 113
set {floorItems(113)} $i
$w create text 28.5 179.5 -text 113 -fill $color -anchor c -tags {floor1 label}
set i [$w create polygon 85 169 79 169 79 192 85 192 -fill {} -tags {floor1 room}]
set floorLabels($i) 117A
set {floorItems(117A)} $i
$w create text 82 180.5 -text 117A -fill $color -anchor c -tags {floor1 label}
set i [$w create polygon 77 302 77 168 53 168 53 302 -fill {} -tags {floor1 room}]
set floorLabels($i) 117
set {floorItems(117)} $i
$w create text 65 235 -text 117 -fill $color -anchor c -tags {floor1 label}
set i [$w create polygon 51 155 51 115 6 115 6 155 -fill {} -tags {floor1 room}]
set floorLabels($i) 114
set {floorItems(114)} $i
$w create text 28.5 135 -text 114 -fill $color -anchor c -tags {floor1 label}
set i [$w create polygon 95 115 53 115 53 168 95 168 -fill {} -tags {floor1 room}]
set floorLabels($i) 115
set {floorItems(115)} $i
$w create text 74 141.5 -text 115 -fill $color -anchor c -tags {floor1 label}
set i [$w create polygon 87 113 87 27 10 27 10 113 -fill {} -tags {floor1 room}]
set floorLabels($i) 116
set {floorItems(116)} $i
$w create text 48.5 70 -text 116 -fill $color -anchor c -tags {floor1 label}
set i [$w create polygon 89 91 128 91 128 113 89 113 -fill {} -tags {floor1 room}]
set floorLabels($i) 118
set {floorItems(118)} $i
$w create text 108.5 102 -text 118 -fill $color -anchor c -tags {floor1 label}
set i [$w create polygon 178 128 178 132 216 132 216 91 163 91 163 112 149 112 149 128 -fill {} -tags {floor1 room}]
set floorLabels($i) 120
set {floorItems(120)} $i
$w create text 189.5 111.5 -text 120 -fill $color -anchor c -tags {floor1 label}
set i [$w create polygon 79 193 87 193 87 169 136 169 136 192 156 192 156 169 175 169 175 246 79 246 -fill {} -tags {floor1 room}]
set floorLabels($i) 122
set {floorItems(122)} $i
$w create text 131 207.5 -text 122 -fill $color -anchor c -tags {floor1 label}
set i [$w create polygon 138 169 154 169 154 191 138 191 -fill {} -tags {floor1 room}]
set floorLabels($i) 121
set {floorItems(121)} $i
$w create text 146 180 -text 121 -fill $color -anchor c -tags {floor1 label}
set i [$w create polygon 99 300 126 300 126 309 99 309 -fill {} -tags {floor1 room}]
set floorLabels($i) 106A
set {floorItems(106A)} $i
$w create text 112.5 304.5 -text 106A -fill $color -anchor c -tags {floor1 label}
set i [$w create polygon 128 299 128 309 150 309 150 248 99 248 99 299 -fill {} -tags {floor1 room}]
set floorLabels($i) 105
set {floorItems(105)} $i
$w create text 124.5 278.5 -text 105 -fill $color -anchor c -tags {floor1 label}
set i [$w create polygon 174 309 174 300 152 300 152 309 -fill {} -tags {floor1 room}]
set floorLabels($i) 106B
set {floorItems(106B)} $i
$w create text 163 304.5 -text 106B -fill $color -anchor c -tags {floor1 label}
set i [$w create polygon 176 299 176 309 216 309 216 248 152 248 152 299 -fill {} -tags {floor1 room}]
set floorLabels($i) 104
set {floorItems(104)} $i
$w create text 184 278.5 -text 104 -fill $color -anchor c -tags {floor1 label}
set i [$w create polygon 138 385 138 337 91 337 91 385 -fill {} -tags {floor1 room}]
set floorLabels($i) 108
set {floorItems(108)} $i
$w create text 114.5 361 -text 108 -fill $color -anchor c -tags {floor1 label}
set i [$w create polygon 256 337 140 337 140 385 256 385 -fill {} -tags {floor1 room}]
set floorLabels($i) 107
set {floorItems(107)} $i
$w create text 198 361 -text 107 -fill $color -anchor c -tags {floor1 label}
set i [$w create polygon 300 353 300 329 260 329 260 353 -fill {} -tags {floor1 room}]
set floorLabels($i) Smoking
set {floorItems(Smoking)} $i
$w create text 280 341 -text Smoking -fill $color -anchor c -tags {floor1 label}
set i [$w create polygon 314 135 314 170 306 170 306 246 177 246 177 135 -fill {} -tags {floor1 room}]
set floorLabels($i) 123
set {floorItems(123)} $i
$w create text 245.5 190.5 -text 123 -fill $color -anchor c -tags {floor1 label}
set i [$w create polygon 217 248 301 248 301 326 257 326 257 310 217 310 -fill {} -tags {floor1 room}]
set floorLabels($i) 103
set {floorItems(103)} $i
$w create text 259 287 -text 103 -fill $color -anchor c -tags {floor1 label}
set i [$w create polygon 396 188 377 188 377 169 316 169 316 131 396 131 -fill {} -tags {floor1 room}]
set floorLabels($i) 124
set {floorItems(124)} $i
$w create text 356 150 -text 124 -fill $color -anchor c -tags {floor1 label}
set i [$w create polygon 397 226 407 226 407 189 377 189 377 246 397 246 -fill {} -tags {floor1 room}]
set floorLabels($i) 125
set {floorItems(125)} $i
$w create text 392 217.5 -text 125 -fill $color -anchor c -tags {floor1 label}
set i [$w create polygon 399 187 409 187 409 207 474 207 474 164 399 164 -fill {} -tags {floor1 room}]
set floorLabels($i) 126
set {floorItems(126)} $i
$w create text 436.5 185.5 -text 126 -fill $color -anchor c -tags {floor1 label}
set i [$w create polygon 409 209 409 229 399 229 399 253 486 253 486 239 474 239 474 209 -fill {} -tags {floor1 room}]
set floorLabels($i) 127
set {floorItems(127)} $i
$w create text 436.5 231 -text 127 -fill $color -anchor c -tags {floor1 label}
set i [$w create polygon 501 164 501 174 495 174 495 188 490 188 490 204 476 204 476 164 -fill {} -tags {floor1 room}]
set floorLabels($i) MShower
set {floorItems(MShower)} $i
$w create text 488.5 184 -text MShower -fill $color -anchor c -tags {floor1 label}
set i [$w create polygon 497 176 513 176 513 204 492 204 492 190 497 190 -fill {} -tags {floor1 room}]
set floorLabels($i) Closet
set {floorItems(Closet)} $i
$w create text 502.5 190 -text Closet -fill $color -anchor c -tags {floor1 label}
set i [$w create polygon 476 237 476 206 513 206 513 254 488 254 488 237 -fill {} -tags {floor1 room}]
set floorLabels($i) WShower
set {floorItems(WShower)} $i
$w create text 494.5 230 -text WShower -fill $color -anchor c -tags {floor1 label}
set i [$w create polygon 486 131 558 131 558 135 724 135 724 166 697 166 697 275 553 275 531 254 515 254 515 174 503 174 503 161 486 161 -fill {} -tags {floor1 room}]
set floorLabels($i) 130
set {floorItems(130)} $i
$w create text 638.5 205 -text 130 -fill $color -anchor c -tags {floor1 label}
set i [$w create polygon 308 242 339 242 339 248 342 248 342 246 397 246 397 276 393 276 393 309 300 309 300 248 308 248 -fill {} -tags {floor1 room}]
set floorLabels($i) 102
set {floorItems(102)} $i
$w create text 367.5 278.5 -text 102 -fill $color -anchor c -tags {floor1 label}
set i [$w create polygon 397 255 486 255 486 276 397 276 -fill {} -tags {floor1 room}]
set floorLabels($i) 128
set {floorItems(128)} $i
$w create text 441.5 265.5 -text 128 -fill $color -anchor c -tags {floor1 label}
set i [$w create polygon 510 309 486 309 486 255 530 255 552 277 561 277 561 325 510 325 -fill {} -tags {floor1 room}]
set floorLabels($i) 129
set {floorItems(129)} $i
$w create text 535.5 293 -text 129 -fill $color -anchor c -tags {floor1 label}
set i [$w create polygon 696 281 740 281 740 387 642 387 642 389 561 389 561 277 696 277 -fill {} -tags {floor1 room}]
set floorLabels($i) 133
set {floorItems(133)} $i
$w create text 628.5 335 -text 133 -fill $color -anchor c -tags {floor1 label}
set i [$w create polygon 742 387 742 281 800 281 800 387 -fill {} -tags {floor1 room}]
set floorLabels($i) 132
set {floorItems(132)} $i
$w create text 771 334 -text 132 -fill $color -anchor c -tags {floor1 label}
set i [$w create polygon 800 168 800 280 699 280 699 168 -fill {} -tags {floor1 room}]
set floorLabels($i) 134
set {floorItems(134)} $i
$w create text 749.5 224 -text 134 -fill $color -anchor c -tags {floor1 label}
set i [$w create polygon 726 131 726 166 800 166 800 131 -fill {} -tags {floor1 room}]
set floorLabels($i) 135
set {floorItems(135)} $i
$w create text 763 148.5 -text 135 -fill $color -anchor c -tags {floor1 label}
set i [$w create polygon 340 360 335 363 331 365 326 366 304 366 304 312 396 312 396 288 400 288 404 288 409 290 413 292 418 297 421 302 422 309 421 318 417 325 411 330 405 332 397 333 344 333 340 334 336 336 335 338 332 342 331 347 332 351 334 354 336 357 341 359 -fill {} -tags {floor1 room}]
set floorLabels($i) {Ramona Stair}
set {floorItems(Ramona Stair)} $i
$w create text 368 323 -text {Ramona Stair} -fill $color -anchor c -tags {floor1 label}
set i [$w create polygon 30 23 30 5 93 5 98 5 104 7 110 10 116 16 119 20 122 28 123 32 123 68 220 68 220 87 90 87 90 23 -fill {} -tags {floor1 room}]
set floorLabels($i) {University Stair}
set {floorItems(University Stair)} $i
$w create text 155 77.5 -text {University Stair} -fill $color -anchor c -tags {floor1 label}
set i [$w create polygon 282 37 295 40 312 49 323 56 337 70 352 56 358 48 363 39 365 29 348 25 335 22 321 14 300 5 283 1 260 0 246 0 242 2 236 4 231 8 227 13 223 17 221 22 220 34 260 34 -fill {} -tags {floor1 room}]
set floorLabels($i) {Plaza Stair}
set {floorItems(Plaza Stair)} $i
$w create text 317.5 28.5 -text {Plaza Stair} -fill $color -anchor c -tags {floor1 label}
set i [$w create polygon 220 34 260 34 282 37 295 40 312 49 323 56 337 70 350 83 365 94 377 100 386 104 386 128 220 128 -fill {} -tags {floor1 room}]
set floorLabels($i) {Plaza Deck}
set {floorItems(Plaza Deck)} $i
$w create text 303 81 -text {Plaza Deck} -fill $color -anchor c -tags {floor1 label}
set i [$w create polygon 257 336 77 336 6 336 6 301 77 301 77 310 257 310 -fill {} -tags {floor1 room}]
set floorLabels($i) 106
set {floorItems(106)} $i
$w create text 131.5 318.5 -text 106 -fill $color -anchor c -tags {floor1 label}
set i [$w create polygon 146 110 162 110 162 91 130 91 130 115 95 115 95 128 114 128 114 151 157 151 157 153 112 153 112 130 97 130 97 168 175 168 175 131 146 131 -fill {} -tags {floor1 room}]
set floorLabels($i) 119
set {floorItems(119)} $i
$w create text 143.5 133 -text 119 -fill $color -anchor c -tags {floor1 label}
$w create line 155 191 155 189 -fill $color -tags {floor1 wall}
$w create line 155 177 155 169 -fill $color -tags {floor1 wall}
$w create line 96 129 96 169 -fill $color -tags {floor1 wall}
$w create line 78 169 176 169 -fill $color -tags {floor1 wall}
$w create line 176 247 176 129 -fill $color -tags {floor1 wall}
$w create line 340 206 307 206 -fill $color -tags {floor1 wall}
$w create line 340 187 340 170 -fill $color -tags {floor1 wall}
$w create line 340 210 340 201 -fill $color -tags {floor1 wall}
$w create line 340 247 340 224 -fill $color -tags {floor1 wall}
$w create line 340 241 307 241 -fill $color -tags {floor1 wall}
$w create line 376 246 376 170 -fill $color -tags {floor1 wall}
$w create line 307 247 307 170 -fill $color -tags {floor1 wall}
$w create line 376 170 307 170 -fill $color -tags {floor1 wall}
$w create line 315 129 315 170 -fill $color -tags {floor1 wall}
$w create line 147 129 176 129 -fill $color -tags {floor1 wall}
$w create line 202 133 176 133 -fill $color -tags {floor1 wall}
$w create line 398 129 315 129 -fill $color -tags {floor1 wall}
$w create line 258 352 258 387 -fill $color -tags {floor1 wall}
$w create line 60 387 60 391 -fill $color -tags {floor1 wall}
$w create line 0 337 0 391 -fill $color -tags {floor1 wall}
$w create line 60 391 0 391 -fill $color -tags {floor1 wall}
$w create line 3 114 3 337 -fill $color -tags {floor1 wall}
$w create line 258 387 60 387 -fill $color -tags {floor1 wall}
$w create line 52 237 52 273 -fill $color -tags {floor1 wall}
$w create line 52 189 52 225 -fill $color -tags {floor1 wall}
$w create line 52 140 52 177 -fill $color -tags {floor1 wall}
$w create line 395 306 395 311 -fill $color -tags {floor1 wall}
$w create line 531 254 398 254 -fill $color -tags {floor1 wall}
$w create line 475 178 475 238 -fill $color -tags {floor1 wall}
$w create line 502 162 398 162 -fill $color -tags {floor1 wall}
$w create line 398 129 398 188 -fill $color -tags {floor1 wall}
$w create line 383 188 376 188 -fill $color -tags {floor1 wall}
$w create line 408 188 408 194 -fill $color -tags {floor1 wall}
$w create line 398 227 398 254 -fill $color -tags {floor1 wall}
$w create line 408 227 398 227 -fill $color -tags {floor1 wall}
$w create line 408 222 408 227 -fill $color -tags {floor1 wall}
$w create line 408 206 408 210 -fill $color -tags {floor1 wall}
$w create line 408 208 475 208 -fill $color -tags {floor1 wall}
$w create line 484 278 484 311 -fill $color -tags {floor1 wall}
$w create line 484 311 508 311 -fill $color -tags {floor1 wall}
$w create line 508 327 508 311 -fill $color -tags {floor1 wall}
$w create line 559 327 508 327 -fill $color -tags {floor1 wall}
$w create line 644 391 559 391 -fill $color -tags {floor1 wall}
$w create line 644 389 644 391 -fill $color -tags {floor1 wall}
$w create line 514 205 475 205 -fill $color -tags {floor1 wall}
$w create line 496 189 496 187 -fill $color -tags {floor1 wall}
$w create line 559 129 484 129 -fill $color -tags {floor1 wall}
$w create line 484 162 484 129 -fill $color -tags {floor1 wall}
$w create line 725 133 559 133 -fill $color -tags {floor1 wall}
$w create line 559 129 559 133 -fill $color -tags {floor1 wall}
$w create line 725 149 725 167 -fill $color -tags {floor1 wall}
$w create line 725 129 802 129 -fill $color -tags {floor1 wall}
$w create line 802 389 802 129 -fill $color -tags {floor1 wall}
$w create line 739 167 802 167 -fill $color -tags {floor1 wall}
$w create line 396 188 408 188 -fill $color -tags {floor1 wall}
$w create line 0 337 9 337 -fill $color -tags {floor1 wall}
$w create line 58 337 21 337 -fill $color -tags {floor1 wall}
$w create line 43 391 43 337 -fill $color -tags {floor1 wall}
$w create line 105 337 75 337 -fill $color -tags {floor1 wall}
$w create line 91 387 91 337 -fill $color -tags {floor1 wall}
$w create line 154 337 117 337 -fill $color -tags {floor1 wall}
$w create line 139 387 139 337 -fill $color -tags {floor1 wall}
$w create line 227 337 166 337 -fill $color -tags {floor1 wall}
$w create line 258 337 251 337 -fill $color -tags {floor1 wall}
$w create line 258 328 302 328 -fill $color -tags {floor1 wall}
$w create line 302 355 302 311 -fill $color -tags {floor1 wall}
$w create line 395 311 302 311 -fill $color -tags {floor1 wall}
$w create line 484 278 395 278 -fill $color -tags {floor1 wall}
$w create line 395 294 395 278 -fill $color -tags {floor1 wall}
$w create line 473 278 473 275 -fill $color -tags {floor1 wall}
$w create line 473 256 473 254 -fill $color -tags {floor1 wall}
$w create line 533 257 531 254 -fill $color -tags {floor1 wall}
$w create line 553 276 551 274 -fill $color -tags {floor1 wall}
$w create line 698 276 553 276 -fill $color -tags {floor1 wall}
$w create line 559 391 559 327 -fill $color -tags {floor1 wall}
$w create line 802 389 644 389 -fill $color -tags {floor1 wall}
$w create line 741 314 741 389 -fill $color -tags {floor1 wall}
$w create line 698 280 698 167 -fill $color -tags {floor1 wall}
$w create line 707 280 698 280 -fill $color -tags {floor1 wall}
$w create line 802 280 731 280 -fill $color -tags {floor1 wall}
$w create line 741 280 741 302 -fill $color -tags {floor1 wall}
$w create line 698 167 727 167 -fill $color -tags {floor1 wall}
$w create line 725 137 725 129 -fill $color -tags {floor1 wall}
$w create line 514 254 514 175 -fill $color -tags {floor1 wall}
$w create line 496 175 514 175 -fill $color -tags {floor1 wall}
$w create line 502 175 502 162 -fill $color -tags {floor1 wall}
$w create line 475 166 475 162 -fill $color -tags {floor1 wall}
$w create line 496 176 496 175 -fill $color -tags {floor1 wall}
$w create line 491 189 496 189 -fill $color -tags {floor1 wall}
$w create line 491 205 491 189 -fill $color -tags {floor1 wall}
$w create line 487 238 475 238 -fill $color -tags {floor1 wall}
$w create line 487 240 487 238 -fill $color -tags {floor1 wall}
$w create line 487 252 487 254 -fill $color -tags {floor1 wall}
$w create line 315 133 304 133 -fill $color -tags {floor1 wall}
$w create line 256 133 280 133 -fill $color -tags {floor1 wall}
$w create line 78 247 270 247 -fill $color -tags {floor1 wall}
$w create line 307 247 294 247 -fill $color -tags {floor1 wall}
$w create line 214 133 232 133 -fill $color -tags {floor1 wall}
$w create line 217 247 217 266 -fill $color -tags {floor1 wall}
$w create line 217 309 217 291 -fill $color -tags {floor1 wall}
$w create line 217 309 172 309 -fill $color -tags {floor1 wall}
$w create line 154 309 148 309 -fill $color -tags {floor1 wall}
$w create line 175 300 175 309 -fill $color -tags {floor1 wall}
$w create line 151 300 175 300 -fill $color -tags {floor1 wall}
$w create line 151 247 151 309 -fill $color -tags {floor1 wall}
$w create line 78 237 78 265 -fill $color -tags {floor1 wall}
$w create line 78 286 78 309 -fill $color -tags {floor1 wall}
$w create line 106 309 78 309 -fill $color -tags {floor1 wall}
$w create line 130 309 125 309 -fill $color -tags {floor1 wall}
$w create line 99 309 99 247 -fill $color -tags {floor1 wall}
$w create line 127 299 99 299 -fill $color -tags {floor1 wall}
$w create line 127 309 127 299 -fill $color -tags {floor1 wall}
$w create line 155 191 137 191 -fill $color -tags {floor1 wall}
$w create line 137 169 137 191 -fill $color -tags {floor1 wall}
$w create line 78 171 78 169 -fill $color -tags {floor1 wall}
$w create line 78 190 78 218 -fill $color -tags {floor1 wall}
$w create line 86 192 86 169 -fill $color -tags {floor1 wall}
$w create line 86 192 78 192 -fill $color -tags {floor1 wall}
$w create line 52 301 3 301 -fill $color -tags {floor1 wall}
$w create line 52 286 52 301 -fill $color -tags {floor1 wall}
$w create line 52 252 3 252 -fill $color -tags {floor1 wall}
$w create line 52 203 3 203 -fill $color -tags {floor1 wall}
$w create line 3 156 52 156 -fill $color -tags {floor1 wall}
$w create line 8 25 8 114 -fill $color -tags {floor1 wall}
$w create line 63 114 3 114 -fill $color -tags {floor1 wall}
$w create line 75 114 97 114 -fill $color -tags {floor1 wall}
$w create line 108 114 129 114 -fill $color -tags {floor1 wall}
$w create line 129 114 129 89 -fill $color -tags {floor1 wall}
$w create line 52 114 52 128 -fill $color -tags {floor1 wall}
$w create line 132 89 88 89 -fill $color -tags {floor1 wall}
$w create line 88 25 88 89 -fill $color -tags {floor1 wall}
$w create line 88 114 88 89 -fill $color -tags {floor1 wall}
$w create line 218 89 144 89 -fill $color -tags {floor1 wall}
$w create line 147 111 147 129 -fill $color -tags {floor1 wall}
$w create line 162 111 147 111 -fill $color -tags {floor1 wall}
$w create line 162 109 162 111 -fill $color -tags {floor1 wall}
$w create line 162 96 162 89 -fill $color -tags {floor1 wall}
$w create line 218 89 218 94 -fill $color -tags {floor1 wall}
$w create line 218 89 218 119 -fill $color -tags {floor1 wall}
$w create line 8 25 88 25 -fill $color -tags {floor1 wall}
$w create line 258 337 258 328 -fill $color -tags {floor1 wall}
$w create line 113 129 96 129 -fill $color -tags {floor1 wall}
$w create line 302 355 258 355 -fill $color -tags {floor1 wall}
$w create line 386 104 386 129 -fill $color -tags {floor1 wall}
$w create line 377 100 386 104 -fill $color -tags {floor1 wall}
$w create line 365 94 377 100 -fill $color -tags {floor1 wall}
$w create line 350 83 365 94 -fill $color -tags {floor1 wall}
$w create line 337 70 350 83 -fill $color -tags {floor1 wall}
$w create line 337 70 323 56 -fill $color -tags {floor1 wall}
$w create line 312 49 323 56 -fill $color -tags {floor1 wall}
$w create line 295 40 312 49 -fill $color -tags {floor1 wall}
$w create line 282 37 295 40 -fill $color -tags {floor1 wall}
$w create line 260 34 282 37 -fill $color -tags {floor1 wall}
$w create line 253 34 260 34 -fill $color -tags {floor1 wall}
$w create line 386 128 386 104 -fill $color -tags {floor1 wall}
$w create line 113 152 156 152 -fill $color -tags {floor1 wall}
$w create line 113 152 156 152 -fill $color -tags {floor1 wall}
$w create line 113 152 113 129 -fill $color -tags {floor1 wall}
}
# fg2 --
# This procedure represents part of the floorplan database. When
# invoked, it instantiates the foreground information for the second
# floor (office outlines and numbers).
#
# Arguments:
# w - The canvas window.
# color - Color to use for drawing foreground information.
proc fg2 {w color} {
global floorLabels floorItems
set i [$w create polygon 748 188 755 188 755 205 758 205 758 222 800 222 800 168 748 168 -fill {} -tags {floor2 room}]
set floorLabels($i) 238
set {floorItems(238)} $i
$w create text 774 195 -text 238 -fill $color -anchor c -tags {floor2 label}
set i [$w create polygon 726 188 746 188 746 166 800 166 800 131 726 131 -fill {} -tags {floor2 room}]
set floorLabels($i) 237
set {floorItems(237)} $i
$w create text 763 148.5 -text 237 -fill $color -anchor c -tags {floor2 label}
set i [$w create polygon 497 187 497 204 559 204 559 324 641 324 643 324 643 291 641 291 641 205 696 205 696 291 694 291 694 314 715 314 715 291 715 205 755 205 755 190 724 190 724 187 -fill {} -tags {floor2 room}]
set floorLabels($i) 246
set {floorItems(246)} $i
$w create text 600 264 -text 246 -fill $color -anchor c -tags {floor2 label}
set i [$w create polygon 694 279 643 279 643 314 694 314 -fill {} -tags {floor2 room}]
set floorLabels($i) 247
set {floorItems(247)} $i
$w create text 668.5 296.5 -text 247 -fill $color -anchor c -tags {floor2 label}
set i [$w create polygon 232 250 308 250 308 242 339 242 339 246 397 246 397 255 476 255 476 250 482 250 559 250 559 274 482 274 482 278 396 278 396 274 232 274 -fill {} -tags {floor2 room}]
set floorLabels($i) 202
set {floorItems(202)} $i
$w create text 285.5 260 -text 202 -fill $color -anchor c -tags {floor2 label}
set i [$w create polygon 53 228 53 338 176 338 233 338 233 196 306 196 306 180 175 180 175 169 156 169 156 196 176 196 176 228 -fill {} -tags {floor2 room}]
set floorLabels($i) 206
set {floorItems(206)} $i
$w create text 143 267 -text 206 -fill $color -anchor c -tags {floor2 label}
set i [$w create polygon 51 277 6 277 6 338 51 338 -fill {} -tags {floor2 room}]
set floorLabels($i) 212
set {floorItems(212)} $i
$w create text 28.5 307.5 -text 212 -fill $color -anchor c -tags {floor2 label}
set i [$w create polygon 557 276 486 276 486 309 510 309 510 325 557 325 -fill {} -tags {floor2 room}]
set floorLabels($i) 245
set {floorItems(245)} $i
$w create text 521.5 300.5 -text 245 -fill $color -anchor c -tags {floor2 label}
set i [$w create polygon 560 389 599 389 599 326 560 326 -fill {} -tags {floor2 room}]
set floorLabels($i) 244
set {floorItems(244)} $i
$w create text 579.5 357.5 -text 244 -fill $color -anchor c -tags {floor2 label}
set i [$w create polygon 601 389 601 326 643 326 643 389 -fill {} -tags {floor2 room}]
set floorLabels($i) 243
set {floorItems(243)} $i
$w create text 622 357.5 -text 243 -fill $color -anchor c -tags {floor2 label}
set i [$w create polygon 688 316 645 316 645 365 688 365 -fill {} -tags {floor2 room}]
set floorLabels($i) 242
set {floorItems(242)} $i
$w create text 666.5 340.5 -text 242 -fill $color -anchor c -tags {floor2 label}
set i [$w create polygon 802 367 759 367 759 226 802 226 -fill {} -tags {floor2 room}]
set floorLabels($i) {Barbecue Deck}
set {floorItems(Barbecue Deck)} $i
$w create text 780.5 296.5 -text {Barbecue Deck} -fill $color -anchor c -tags {floor2 label}
set i [$w create polygon 755 262 755 314 717 314 717 262 -fill {} -tags {floor2 room}]
set floorLabels($i) 240
set {floorItems(240)} $i
$w create text 736 288 -text 240 -fill $color -anchor c -tags {floor2 label}
set i [$w create polygon 755 316 689 316 689 365 755 365 -fill {} -tags {floor2 room}]
set floorLabels($i) 241
set {floorItems(241)} $i
$w create text 722 340.5 -text 241 -fill $color -anchor c -tags {floor2 label}
set i [$w create polygon 755 206 717 206 717 261 755 261 -fill {} -tags {floor2 room}]
set floorLabels($i) 239
set {floorItems(239)} $i
$w create text 736 233.5 -text 239 -fill $color -anchor c -tags {floor2 label}
set i [$w create polygon 695 277 643 277 643 206 695 206 -fill {} -tags {floor2 room}]
set floorLabels($i) 248
set {floorItems(248)} $i
$w create text 669 241.5 -text 248 -fill $color -anchor c -tags {floor2 label}
set i [$w create polygon 676 135 676 185 724 185 724 135 -fill {} -tags {floor2 room}]
set floorLabels($i) 236
set {floorItems(236)} $i
$w create text 700 160 -text 236 -fill $color -anchor c -tags {floor2 label}
set i [$w create polygon 675 135 635 135 635 145 628 145 628 185 675 185 -fill {} -tags {floor2 room}]
set floorLabels($i) 235
set {floorItems(235)} $i
$w create text 651.5 160 -text 235 -fill $color -anchor c -tags {floor2 label}
set i [$w create polygon 626 143 633 143 633 135 572 135 572 143 579 143 579 185 626 185 -fill {} -tags {floor2 room}]
set floorLabels($i) 234
set {floorItems(234)} $i
$w create text 606 160 -text 234 -fill $color -anchor c -tags {floor2 label}
set i [$w create polygon 557 135 571 135 571 145 578 145 578 185 527 185 527 131 557 131 -fill {} -tags {floor2 room}]
set floorLabels($i) 233
set {floorItems(233)} $i
$w create text 552.5 158 -text 233 -fill $color -anchor c -tags {floor2 label}
set i [$w create polygon 476 249 557 249 557 205 476 205 -fill {} -tags {floor2 room}]
set floorLabels($i) 230
set {floorItems(230)} $i
$w create text 516.5 227 -text 230 -fill $color -anchor c -tags {floor2 label}
set i [$w create polygon 476 164 486 164 486 131 525 131 525 185 476 185 -fill {} -tags {floor2 room}]
set floorLabels($i) 232
set {floorItems(232)} $i
$w create text 500.5 158 -text 232 -fill $color -anchor c -tags {floor2 label}
set i [$w create polygon 476 186 495 186 495 204 476 204 -fill {} -tags {floor2 room}]
set floorLabels($i) 229
set {floorItems(229)} $i
$w create text 485.5 195 -text 229 -fill $color -anchor c -tags {floor2 label}
set i [$w create polygon 474 207 409 207 409 187 399 187 399 164 474 164 -fill {} -tags {floor2 room}]
set floorLabels($i) 227
set {floorItems(227)} $i
$w create text 436.5 185.5 -text 227 -fill $color -anchor c -tags {floor2 label}
set i [$w create polygon 399 228 399 253 474 253 474 209 409 209 409 228 -fill {} -tags {floor2 room}]
set floorLabels($i) 228
set {floorItems(228)} $i
$w create text 436.5 231 -text 228 -fill $color -anchor c -tags {floor2 label}
set i [$w create polygon 397 246 397 226 407 226 407 189 377 189 377 246 -fill {} -tags {floor2 room}]
set floorLabels($i) 226
set {floorItems(226)} $i
$w create text 392 217.5 -text 226 -fill $color -anchor c -tags {floor2 label}
set i [$w create polygon 377 169 316 169 316 131 397 131 397 188 377 188 -fill {} -tags {floor2 room}]
set floorLabels($i) 225
set {floorItems(225)} $i
$w create text 356.5 150 -text 225 -fill $color -anchor c -tags {floor2 label}
set i [$w create polygon 234 198 306 198 306 249 234 249 -fill {} -tags {floor2 room}]
set floorLabels($i) 224
set {floorItems(224)} $i
$w create text 270 223.5 -text 224 -fill $color -anchor c -tags {floor2 label}
set i [$w create polygon 270 179 306 179 306 170 314 170 314 135 270 135 -fill {} -tags {floor2 room}]
set floorLabels($i) 223
set {floorItems(223)} $i
$w create text 292 157 -text 223 -fill $color -anchor c -tags {floor2 label}
set i [$w create polygon 268 179 221 179 221 135 268 135 -fill {} -tags {floor2 room}]
set floorLabels($i) 222
set {floorItems(222)} $i
$w create text 244.5 157 -text 222 -fill $color -anchor c -tags {floor2 label}
set i [$w create polygon 177 179 219 179 219 135 177 135 -fill {} -tags {floor2 room}]
set floorLabels($i) 221
set {floorItems(221)} $i
$w create text 198 157 -text 221 -fill $color -anchor c -tags {floor2 label}
set i [$w create polygon 299 327 349 327 349 284 341 284 341 276 299 276 -fill {} -tags {floor2 room}]
set floorLabels($i) 204
set {floorItems(204)} $i
$w create text 324 301.5 -text 204 -fill $color -anchor c -tags {floor2 label}
set i [$w create polygon 234 276 297 276 297 327 257 327 257 338 234 338 -fill {} -tags {floor2 room}]
set floorLabels($i) 205
set {floorItems(205)} $i
$w create text 265.5 307 -text 205 -fill $color -anchor c -tags {floor2 label}
set i [$w create polygon 256 385 256 340 212 340 212 385 -fill {} -tags {floor2 room}]
set floorLabels($i) 207
set {floorItems(207)} $i
$w create text 234 362.5 -text 207 -fill $color -anchor c -tags {floor2 label}
set i [$w create polygon 210 340 164 340 164 385 210 385 -fill {} -tags {floor2 room}]
set floorLabels($i) 208
set {floorItems(208)} $i
$w create text 187 362.5 -text 208 -fill $color -anchor c -tags {floor2 label}
set i [$w create polygon 115 340 162 340 162 385 115 385 -fill {} -tags {floor2 room}]
set floorLabels($i) 209
set {floorItems(209)} $i
$w create text 138.5 362.5 -text 209 -fill $color -anchor c -tags {floor2 label}
set i [$w create polygon 89 228 89 156 53 156 53 228 -fill {} -tags {floor2 room}]
set floorLabels($i) 217
set {floorItems(217)} $i
$w create text 71 192 -text 217 -fill $color -anchor c -tags {floor2 label}
set i [$w create polygon 89 169 97 169 97 190 89 190 -fill {} -tags {floor2 room}]
set floorLabels($i) 217A
set {floorItems(217A)} $i
$w create text 93 179.5 -text 217A -fill $color -anchor c -tags {floor2 label}
set i [$w create polygon 89 156 89 168 95 168 95 135 53 135 53 156 -fill {} -tags {floor2 room}]
set floorLabels($i) 216
set {floorItems(216)} $i
$w create text 71 145.5 -text 216 -fill $color -anchor c -tags {floor2 label}
set i [$w create polygon 51 179 51 135 6 135 6 179 -fill {} -tags {floor2 room}]
set floorLabels($i) 215
set {floorItems(215)} $i
$w create text 28.5 157 -text 215 -fill $color -anchor c -tags {floor2 label}
set i [$w create polygon 51 227 6 227 6 180 51 180 -fill {} -tags {floor2 room}]
set floorLabels($i) 214
set {floorItems(214)} $i
$w create text 28.5 203.5 -text 214 -fill $color -anchor c -tags {floor2 label}
set i [$w create polygon 51 275 6 275 6 229 51 229 -fill {} -tags {floor2 room}]
set floorLabels($i) 213
set {floorItems(213)} $i
$w create text 28.5 252 -text 213 -fill $color -anchor c -tags {floor2 label}
set i [$w create polygon 114 340 67 340 67 385 114 385 -fill {} -tags {floor2 room}]
set floorLabels($i) 210
set {floorItems(210)} $i
$w create text 90.5 362.5 -text 210 -fill $color -anchor c -tags {floor2 label}
set i [$w create polygon 59 389 59 385 65 385 65 340 1 340 1 389 -fill {} -tags {floor2 room}]
set floorLabels($i) 211
set {floorItems(211)} $i
$w create text 33 364.5 -text 211 -fill $color -anchor c -tags {floor2 label}
set i [$w create polygon 393 309 350 309 350 282 342 282 342 276 393 276 -fill {} -tags {floor2 room}]
set floorLabels($i) 203
set {floorItems(203)} $i
$w create text 367.5 292.5 -text 203 -fill $color -anchor c -tags {floor2 label}
set i [$w create polygon 99 191 91 191 91 226 174 226 174 198 154 198 154 192 109 192 109 169 99 169 -fill {} -tags {floor2 room}]
set floorLabels($i) 220
set {floorItems(220)} $i
$w create text 132.5 208.5 -text 220 -fill $color -anchor c -tags {floor2 label}
set i [$w create polygon 339 205 307 205 307 171 339 171 -fill {} -tags {floor2 room}]
set floorLabels($i) {Priv Lift2}
set {floorItems(Priv Lift2)} $i
$w create text 323 188 -text {Priv Lift2} -fill $color -anchor c -tags {floor2 label}
set i [$w create polygon 307 240 339 240 339 206 307 206 -fill {} -tags {floor2 room}]
set floorLabels($i) {Pub Lift 2}
set {floorItems(Pub Lift 2)} $i
$w create text 323 223 -text {Pub Lift 2} -fill $color -anchor c -tags {floor2 label}
set i [$w create polygon 175 168 97 168 97 131 175 131 -fill {} -tags {floor2 room}]
set floorLabels($i) 218
set {floorItems(218)} $i
$w create text 136 149.5 -text 218 -fill $color -anchor c -tags {floor2 label}
set i [$w create polygon 154 191 111 191 111 169 154 169 -fill {} -tags {floor2 room}]
set floorLabels($i) 219
set {floorItems(219)} $i
$w create text 132.5 180 -text 219 -fill $color -anchor c -tags {floor2 label}
set i [$w create polygon 375 246 375 172 341 172 341 246 -fill {} -tags {floor2 room}]
set floorLabels($i) 201
set {floorItems(201)} $i
$w create text 358 209 -text 201 -fill $color -anchor c -tags {floor2 label}
$w create line 641 186 678 186 -fill $color -tags {floor2 wall}
$w create line 757 350 757 367 -fill $color -tags {floor2 wall}
$w create line 634 133 634 144 -fill $color -tags {floor2 wall}
$w create line 634 144 627 144 -fill $color -tags {floor2 wall}
$w create line 572 133 572 144 -fill $color -tags {floor2 wall}
$w create line 572 144 579 144 -fill $color -tags {floor2 wall}
$w create line 398 129 398 162 -fill $color -tags {floor2 wall}
$w create line 174 197 175 197 -fill $color -tags {floor2 wall}
$w create line 175 197 175 227 -fill $color -tags {floor2 wall}
$w create line 757 206 757 221 -fill $color -tags {floor2 wall}
$w create line 396 188 408 188 -fill $color -tags {floor2 wall}
$w create line 727 189 725 189 -fill $color -tags {floor2 wall}
$w create line 747 167 802 167 -fill $color -tags {floor2 wall}
$w create line 747 167 747 189 -fill $color -tags {floor2 wall}
$w create line 755 189 739 189 -fill $color -tags {floor2 wall}
$w create line 769 224 757 224 -fill $color -tags {floor2 wall}
$w create line 802 224 802 129 -fill $color -tags {floor2 wall}
$w create line 802 129 725 129 -fill $color -tags {floor2 wall}
$w create line 725 189 725 129 -fill $color -tags {floor2 wall}
$w create line 725 186 690 186 -fill $color -tags {floor2 wall}
$w create line 676 133 676 186 -fill $color -tags {floor2 wall}
$w create line 627 144 627 186 -fill $color -tags {floor2 wall}
$w create line 629 186 593 186 -fill $color -tags {floor2 wall}
$w create line 579 144 579 186 -fill $color -tags {floor2 wall}
$w create line 559 129 559 133 -fill $color -tags {floor2 wall}
$w create line 725 133 559 133 -fill $color -tags {floor2 wall}
$w create line 484 162 484 129 -fill $color -tags {floor2 wall}
$w create line 559 129 484 129 -fill $color -tags {floor2 wall}
$w create line 526 129 526 186 -fill $color -tags {floor2 wall}
$w create line 540 186 581 186 -fill $color -tags {floor2 wall}
$w create line 528 186 523 186 -fill $color -tags {floor2 wall}
$w create line 511 186 475 186 -fill $color -tags {floor2 wall}
$w create line 496 190 496 186 -fill $color -tags {floor2 wall}
$w create line 496 205 496 202 -fill $color -tags {floor2 wall}
$w create line 475 205 527 205 -fill $color -tags {floor2 wall}
$w create line 558 205 539 205 -fill $color -tags {floor2 wall}
$w create line 558 205 558 249 -fill $color -tags {floor2 wall}
$w create line 558 249 475 249 -fill $color -tags {floor2 wall}
$w create line 662 206 642 206 -fill $color -tags {floor2 wall}
$w create line 695 206 675 206 -fill $color -tags {floor2 wall}
$w create line 695 278 642 278 -fill $color -tags {floor2 wall}
$w create line 642 291 642 206 -fill $color -tags {floor2 wall}
$w create line 695 291 695 206 -fill $color -tags {floor2 wall}
$w create line 716 208 716 206 -fill $color -tags {floor2 wall}
$w create line 757 206 716 206 -fill $color -tags {floor2 wall}
$w create line 757 221 757 224 -fill $color -tags {floor2 wall}
$w create line 793 224 802 224 -fill $color -tags {floor2 wall}
$w create line 757 262 716 262 -fill $color -tags {floor2 wall}
$w create line 716 220 716 264 -fill $color -tags {floor2 wall}
$w create line 716 315 716 276 -fill $color -tags {floor2 wall}
$w create line 757 315 703 315 -fill $color -tags {floor2 wall}
$w create line 757 325 757 224 -fill $color -tags {floor2 wall}
$w create line 757 367 644 367 -fill $color -tags {floor2 wall}
$w create line 689 367 689 315 -fill $color -tags {floor2 wall}
$w create line 647 315 644 315 -fill $color -tags {floor2 wall}
$w create line 659 315 691 315 -fill $color -tags {floor2 wall}
$w create line 600 325 600 391 -fill $color -tags {floor2 wall}
$w create line 627 325 644 325 -fill $color -tags {floor2 wall}
$w create line 644 391 644 315 -fill $color -tags {floor2 wall}
$w create line 615 325 575 325 -fill $color -tags {floor2 wall}
$w create line 644 391 558 391 -fill $color -tags {floor2 wall}
$w create line 563 325 558 325 -fill $color -tags {floor2 wall}
$w create line 558 391 558 314 -fill $color -tags {floor2 wall}
$w create line 558 327 508 327 -fill $color -tags {floor2 wall}
$w create line 558 275 484 275 -fill $color -tags {floor2 wall}
$w create line 558 302 558 275 -fill $color -tags {floor2 wall}
$w create line 508 327 508 311 -fill $color -tags {floor2 wall}
$w create line 484 311 508 311 -fill $color -tags {floor2 wall}
$w create line 484 275 484 311 -fill $color -tags {floor2 wall}
$w create line 475 208 408 208 -fill $color -tags {floor2 wall}
$w create line 408 206 408 210 -fill $color -tags {floor2 wall}
$w create line 408 222 408 227 -fill $color -tags {floor2 wall}
$w create line 408 227 398 227 -fill $color -tags {floor2 wall}
$w create line 398 227 398 254 -fill $color -tags {floor2 wall}
$w create line 408 188 408 194 -fill $color -tags {floor2 wall}
$w create line 383 188 376 188 -fill $color -tags {floor2 wall}
$w create line 398 188 398 162 -fill $color -tags {floor2 wall}
$w create line 398 162 484 162 -fill $color -tags {floor2 wall}
$w create line 475 162 475 254 -fill $color -tags {floor2 wall}
$w create line 398 254 475 254 -fill $color -tags {floor2 wall}
$w create line 484 280 395 280 -fill $color -tags {floor2 wall}
$w create line 395 311 395 275 -fill $color -tags {floor2 wall}
$w create line 307 197 293 197 -fill $color -tags {floor2 wall}
$w create line 278 197 233 197 -fill $color -tags {floor2 wall}
$w create line 233 197 233 249 -fill $color -tags {floor2 wall}
$w create line 307 179 284 179 -fill $color -tags {floor2 wall}
$w create line 233 249 278 249 -fill $color -tags {floor2 wall}
$w create line 269 179 269 133 -fill $color -tags {floor2 wall}
$w create line 220 179 220 133 -fill $color -tags {floor2 wall}
$w create line 155 191 110 191 -fill $color -tags {floor2 wall}
$w create line 90 190 98 190 -fill $color -tags {floor2 wall}
$w create line 98 169 98 190 -fill $color -tags {floor2 wall}
$w create line 52 133 52 165 -fill $color -tags {floor2 wall}
$w create line 52 214 52 177 -fill $color -tags {floor2 wall}
$w create line 52 226 52 262 -fill $color -tags {floor2 wall}
$w create line 52 274 52 276 -fill $color -tags {floor2 wall}
$w create line 234 275 234 339 -fill $color -tags {floor2 wall}
$w create line 226 339 258 339 -fill $color -tags {floor2 wall}
$w create line 211 387 211 339 -fill $color -tags {floor2 wall}
$w create line 214 339 177 339 -fill $color -tags {floor2 wall}
$w create line 258 387 60 387 -fill $color -tags {floor2 wall}
$w create line 3 133 3 339 -fill $color -tags {floor2 wall}
$w create line 165 339 129 339 -fill $color -tags {floor2 wall}
$w create line 117 339 80 339 -fill $color -tags {floor2 wall}
$w create line 68 339 59 339 -fill $color -tags {floor2 wall}
$w create line 0 339 46 339 -fill $color -tags {floor2 wall}
$w create line 60 391 0 391 -fill $color -tags {floor2 wall}
$w create line 0 339 0 391 -fill $color -tags {floor2 wall}
$w create line 60 387 60 391 -fill $color -tags {floor2 wall}
$w create line 258 329 258 387 -fill $color -tags {floor2 wall}
$w create line 350 329 258 329 -fill $color -tags {floor2 wall}
$w create line 395 311 350 311 -fill $color -tags {floor2 wall}
$w create line 398 129 315 129 -fill $color -tags {floor2 wall}
$w create line 176 133 315 133 -fill $color -tags {floor2 wall}
$w create line 176 129 96 129 -fill $color -tags {floor2 wall}
$w create line 3 133 96 133 -fill $color -tags {floor2 wall}
$w create line 66 387 66 339 -fill $color -tags {floor2 wall}
$w create line 115 387 115 339 -fill $color -tags {floor2 wall}
$w create line 163 387 163 339 -fill $color -tags {floor2 wall}
$w create line 234 275 276 275 -fill $color -tags {floor2 wall}
$w create line 288 275 309 275 -fill $color -tags {floor2 wall}
$w create line 298 275 298 329 -fill $color -tags {floor2 wall}
$w create line 341 283 350 283 -fill $color -tags {floor2 wall}
$w create line 321 275 341 275 -fill $color -tags {floor2 wall}
$w create line 375 275 395 275 -fill $color -tags {floor2 wall}
$w create line 315 129 315 170 -fill $color -tags {floor2 wall}
$w create line 376 170 307 170 -fill $color -tags {floor2 wall}
$w create line 307 250 307 170 -fill $color -tags {floor2 wall}
$w create line 376 245 376 170 -fill $color -tags {floor2 wall}
$w create line 340 241 307 241 -fill $color -tags {floor2 wall}
$w create line 340 245 340 224 -fill $color -tags {floor2 wall}
$w create line 340 210 340 201 -fill $color -tags {floor2 wall}
$w create line 340 187 340 170 -fill $color -tags {floor2 wall}
$w create line 340 206 307 206 -fill $color -tags {floor2 wall}
$w create line 293 250 307 250 -fill $color -tags {floor2 wall}
$w create line 271 179 238 179 -fill $color -tags {floor2 wall}
$w create line 226 179 195 179 -fill $color -tags {floor2 wall}
$w create line 176 129 176 179 -fill $color -tags {floor2 wall}
$w create line 182 179 176 179 -fill $color -tags {floor2 wall}
$w create line 174 169 176 169 -fill $color -tags {floor2 wall}
$w create line 162 169 90 169 -fill $color -tags {floor2 wall}
$w create line 96 169 96 129 -fill $color -tags {floor2 wall}
$w create line 175 227 90 227 -fill $color -tags {floor2 wall}
$w create line 90 190 90 227 -fill $color -tags {floor2 wall}
$w create line 52 179 3 179 -fill $color -tags {floor2 wall}
$w create line 52 228 3 228 -fill $color -tags {floor2 wall}
$w create line 52 276 3 276 -fill $color -tags {floor2 wall}
$w create line 155 177 155 169 -fill $color -tags {floor2 wall}
$w create line 110 191 110 169 -fill $color -tags {floor2 wall}
$w create line 155 189 155 197 -fill $color -tags {floor2 wall}
$w create line 350 283 350 329 -fill $color -tags {floor2 wall}
$w create line 162 197 155 197 -fill $color -tags {floor2 wall}
$w create line 341 275 341 283 -fill $color -tags {floor2 wall}
}
# fg3 --
# This procedure represents part of the floorplan database. When
# invoked, it instantiates the foreground information for the third
# floor (office outlines and numbers).
#
# Arguments:
# w - The canvas window.
# color - Color to use for drawing foreground information.
proc fg3 {w color} {
global floorLabels floorItems
set i [$w create polygon 89 228 89 180 70 180 70 228 -fill {} -tags {floor3 room}]
set floorLabels($i) 316
set {floorItems(316)} $i
$w create text 79.5 204 -text 316 -fill $color -anchor c -tags {floor3 label}
set i [$w create polygon 115 368 162 368 162 323 115 323 -fill {} -tags {floor3 room}]
set floorLabels($i) 309
set {floorItems(309)} $i
$w create text 138.5 345.5 -text 309 -fill $color -anchor c -tags {floor3 label}
set i [$w create polygon 164 323 164 368 211 368 211 323 -fill {} -tags {floor3 room}]
set floorLabels($i) 308
set {floorItems(308)} $i
$w create text 187.5 345.5 -text 308 -fill $color -anchor c -tags {floor3 label}
set i [$w create polygon 256 368 212 368 212 323 256 323 -fill {} -tags {floor3 room}]
set floorLabels($i) 307
set {floorItems(307)} $i
$w create text 234 345.5 -text 307 -fill $color -anchor c -tags {floor3 label}
set i [$w create polygon 244 276 297 276 297 327 260 327 260 321 244 321 -fill {} -tags {floor3 room}]
set floorLabels($i) 305
set {floorItems(305)} $i
$w create text 270.5 301.5 -text 305 -fill $color -anchor c -tags {floor3 label}
set i [$w create polygon 251 219 251 203 244 203 244 219 -fill {} -tags {floor3 room}]
set floorLabels($i) 324B
set {floorItems(324B)} $i
$w create text 247.5 211 -text 324B -fill $color -anchor c -tags {floor3 label}
set i [$w create polygon 251 249 244 249 244 232 251 232 -fill {} -tags {floor3 room}]
set floorLabels($i) 324A
set {floorItems(324A)} $i
$w create text 247.5 240.5 -text 324A -fill $color -anchor c -tags {floor3 label}
set i [$w create polygon 223 135 223 179 177 179 177 135 -fill {} -tags {floor3 room}]
set floorLabels($i) 320
set {floorItems(320)} $i
$w create text 200 157 -text 320 -fill $color -anchor c -tags {floor3 label}
set i [$w create polygon 114 368 114 323 67 323 67 368 -fill {} -tags {floor3 room}]
set floorLabels($i) 310
set {floorItems(310)} $i
$w create text 90.5 345.5 -text 310 -fill $color -anchor c -tags {floor3 label}
set i [$w create polygon 23 277 23 321 68 321 68 277 -fill {} -tags {floor3 room}]
set floorLabels($i) 312
set {floorItems(312)} $i
$w create text 45.5 299 -text 312 -fill $color -anchor c -tags {floor3 label}
set i [$w create polygon 23 229 68 229 68 275 23 275 -fill {} -tags {floor3 room}]
set floorLabels($i) 313
set {floorItems(313)} $i
$w create text 45.5 252 -text 313 -fill $color -anchor c -tags {floor3 label}
set i [$w create polygon 68 227 23 227 23 180 68 180 -fill {} -tags {floor3 room}]
set floorLabels($i) 314
set {floorItems(314)} $i
$w create text 45.5 203.5 -text 314 -fill $color -anchor c -tags {floor3 label}
set i [$w create polygon 95 179 95 135 23 135 23 179 -fill {} -tags {floor3 room}]
set floorLabels($i) 315
set {floorItems(315)} $i
$w create text 59 157 -text 315 -fill $color -anchor c -tags {floor3 label}
set i [$w create polygon 99 226 99 204 91 204 91 226 -fill {} -tags {floor3 room}]
set floorLabels($i) 316B
set {floorItems(316B)} $i
$w create text 95 215 -text 316B -fill $color -anchor c -tags {floor3 label}
set i [$w create polygon 91 202 99 202 99 180 91 180 -fill {} -tags {floor3 room}]
set floorLabels($i) 316A
set {floorItems(316A)} $i
$w create text 95 191 -text 316A -fill $color -anchor c -tags {floor3 label}
set i [$w create polygon 97 169 109 169 109 192 154 192 154 198 174 198 174 226 101 226 101 179 97 179 -fill {} -tags {floor3 room}]
set floorLabels($i) 319
set {floorItems(319)} $i
$w create text 141.5 209 -text 319 -fill $color -anchor c -tags {floor3 label}
set i [$w create polygon 65 368 58 368 58 389 1 389 1 333 23 333 23 323 65 323 -fill {} -tags {floor3 room}]
set floorLabels($i) 311
set {floorItems(311)} $i
$w create text 29.5 361 -text 311 -fill $color -anchor c -tags {floor3 label}
set i [$w create polygon 154 191 111 191 111 169 154 169 -fill {} -tags {floor3 room}]
set floorLabels($i) 318
set {floorItems(318)} $i
$w create text 132.5 180 -text 318 -fill $color -anchor c -tags {floor3 label}
set i [$w create polygon 175 168 97 168 97 131 175 131 -fill {} -tags {floor3 room}]
set floorLabels($i) 317
set {floorItems(317)} $i
$w create text 136 149.5 -text 317 -fill $color -anchor c -tags {floor3 label}
set i [$w create polygon 274 194 274 221 306 221 306 194 -fill {} -tags {floor3 room}]
set floorLabels($i) 323
set {floorItems(323)} $i
$w create text 290 207.5 -text 323 -fill $color -anchor c -tags {floor3 label}
set i [$w create polygon 306 222 274 222 274 249 306 249 -fill {} -tags {floor3 room}]
set floorLabels($i) 325
set {floorItems(325)} $i
$w create text 290 235.5 -text 325 -fill $color -anchor c -tags {floor3 label}
set i [$w create polygon 263 179 224 179 224 135 263 135 -fill {} -tags {floor3 room}]
set floorLabels($i) 321
set {floorItems(321)} $i
$w create text 243.5 157 -text 321 -fill $color -anchor c -tags {floor3 label}
set i [$w create polygon 314 169 306 169 306 192 273 192 264 181 264 135 314 135 -fill {} -tags {floor3 room}]
set floorLabels($i) 322
set {floorItems(322)} $i
$w create text 293.5 163.5 -text 322 -fill $color -anchor c -tags {floor3 label}
set i [$w create polygon 307 240 339 240 339 206 307 206 -fill {} -tags {floor3 room}]
set floorLabels($i) {Pub Lift3}
set {floorItems(Pub Lift3)} $i
$w create text 323 223 -text {Pub Lift3} -fill $color -anchor c -tags {floor3 label}
set i [$w create polygon 339 205 307 205 307 171 339 171 -fill {} -tags {floor3 room}]
set floorLabels($i) {Priv Lift3}
set {floorItems(Priv Lift3)} $i
$w create text 323 188 -text {Priv Lift3} -fill $color -anchor c -tags {floor3 label}
set i [$w create polygon 350 284 376 284 376 276 397 276 397 309 350 309 -fill {} -tags {floor3 room}]
set floorLabels($i) 303
set {floorItems(303)} $i
$w create text 373.5 292.5 -text 303 -fill $color -anchor c -tags {floor3 label}
set i [$w create polygon 272 203 272 249 252 249 252 230 244 230 244 221 252 221 252 203 -fill {} -tags {floor3 room}]
set floorLabels($i) 324
set {floorItems(324)} $i
$w create text 262 226 -text 324 -fill $color -anchor c -tags {floor3 label}
set i [$w create polygon 299 276 299 327 349 327 349 284 341 284 341 276 -fill {} -tags {floor3 room}]
set floorLabels($i) 304
set {floorItems(304)} $i
$w create text 324 301.5 -text 304 -fill $color -anchor c -tags {floor3 label}
set i [$w create polygon 375 246 375 172 341 172 341 246 -fill {} -tags {floor3 room}]
set floorLabels($i) 301
set {floorItems(301)} $i
$w create text 358 209 -text 301 -fill $color -anchor c -tags {floor3 label}
set i [$w create polygon 397 246 377 246 377 185 397 185 -fill {} -tags {floor3 room}]
set floorLabels($i) 327
set {floorItems(327)} $i
$w create text 387 215.5 -text 327 -fill $color -anchor c -tags {floor3 label}
set i [$w create polygon 316 131 316 169 377 169 377 185 397 185 397 131 -fill {} -tags {floor3 room}]
set floorLabels($i) 326
set {floorItems(326)} $i
$w create text 356.5 150 -text 326 -fill $color -anchor c -tags {floor3 label}
set i [$w create polygon 308 251 242 251 242 274 342 274 342 282 375 282 375 274 397 274 397 248 339 248 339 242 308 242 -fill {} -tags {floor3 room}]
set floorLabels($i) 302
set {floorItems(302)} $i
$w create text 319.5 261 -text 302 -fill $color -anchor c -tags {floor3 label}
set i [$w create polygon 70 321 242 321 242 200 259 200 259 203 272 203 272 193 263 180 242 180 175 180 175 169 156 169 156 196 177 196 177 228 107 228 70 228 70 275 107 275 107 248 160 248 160 301 107 301 107 275 70 275 -fill {} -tags {floor3 room}]
set floorLabels($i) 306
set {floorItems(306)} $i
$w create text 200.5 284.5 -text 306 -fill $color -anchor c -tags {floor3 label}
$w create line 341 275 341 283 -fill $color -tags {floor3 wall}
$w create line 162 197 155 197 -fill $color -tags {floor3 wall}
$w create line 396 247 399 247 -fill $color -tags {floor3 wall}
$w create line 399 129 399 311 -fill $color -tags {floor3 wall}
$w create line 258 202 243 202 -fill $color -tags {floor3 wall}
$w create line 350 283 350 329 -fill $color -tags {floor3 wall}
$w create line 251 231 243 231 -fill $color -tags {floor3 wall}
$w create line 243 220 251 220 -fill $color -tags {floor3 wall}
$w create line 243 250 243 202 -fill $color -tags {floor3 wall}
$w create line 155 197 155 190 -fill $color -tags {floor3 wall}
$w create line 110 192 110 169 -fill $color -tags {floor3 wall}
$w create line 155 192 110 192 -fill $color -tags {floor3 wall}
$w create line 155 177 155 169 -fill $color -tags {floor3 wall}
$w create line 176 197 176 227 -fill $color -tags {floor3 wall}
$w create line 69 280 69 274 -fill $color -tags {floor3 wall}
$w create line 21 276 69 276 -fill $color -tags {floor3 wall}
$w create line 69 262 69 226 -fill $color -tags {floor3 wall}
$w create line 21 228 69 228 -fill $color -tags {floor3 wall}
$w create line 21 179 75 179 -fill $color -tags {floor3 wall}
$w create line 69 179 69 214 -fill $color -tags {floor3 wall}
$w create line 90 220 90 227 -fill $color -tags {floor3 wall}
$w create line 90 204 90 202 -fill $color -tags {floor3 wall}
$w create line 90 203 100 203 -fill $color -tags {floor3 wall}
$w create line 90 187 90 179 -fill $color -tags {floor3 wall}
$w create line 90 227 176 227 -fill $color -tags {floor3 wall}
$w create line 100 179 100 227 -fill $color -tags {floor3 wall}
$w create line 100 179 87 179 -fill $color -tags {floor3 wall}
$w create line 96 179 96 129 -fill $color -tags {floor3 wall}
$w create line 162 169 96 169 -fill $color -tags {floor3 wall}
$w create line 173 169 176 169 -fill $color -tags {floor3 wall}
$w create line 182 179 176 179 -fill $color -tags {floor3 wall}
$w create line 176 129 176 179 -fill $color -tags {floor3 wall}
$w create line 195 179 226 179 -fill $color -tags {floor3 wall}
$w create line 224 133 224 179 -fill $color -tags {floor3 wall}
$w create line 264 179 264 133 -fill $color -tags {floor3 wall}
$w create line 238 179 264 179 -fill $color -tags {floor3 wall}
$w create line 273 207 273 193 -fill $color -tags {floor3 wall}
$w create line 273 235 273 250 -fill $color -tags {floor3 wall}
$w create line 273 224 273 219 -fill $color -tags {floor3 wall}
$w create line 273 193 307 193 -fill $color -tags {floor3 wall}
$w create line 273 222 307 222 -fill $color -tags {floor3 wall}
$w create line 273 250 307 250 -fill $color -tags {floor3 wall}
$w create line 384 247 376 247 -fill $color -tags {floor3 wall}
$w create line 340 206 307 206 -fill $color -tags {floor3 wall}
$w create line 340 187 340 170 -fill $color -tags {floor3 wall}
$w create line 340 210 340 201 -fill $color -tags {floor3 wall}
$w create line 340 247 340 224 -fill $color -tags {floor3 wall}
$w create line 340 241 307 241 -fill $color -tags {floor3 wall}
$w create line 376 247 376 170 -fill $color -tags {floor3 wall}
$w create line 307 250 307 170 -fill $color -tags {floor3 wall}
$w create line 376 170 307 170 -fill $color -tags {floor3 wall}
$w create line 315 129 315 170 -fill $color -tags {floor3 wall}
$w create line 376 283 366 283 -fill $color -tags {floor3 wall}
$w create line 376 283 376 275 -fill $color -tags {floor3 wall}
$w create line 399 275 376 275 -fill $color -tags {floor3 wall}
$w create line 341 275 320 275 -fill $color -tags {floor3 wall}
$w create line 341 283 350 283 -fill $color -tags {floor3 wall}
$w create line 298 275 298 329 -fill $color -tags {floor3 wall}
$w create line 308 275 298 275 -fill $color -tags {floor3 wall}
$w create line 243 322 243 275 -fill $color -tags {floor3 wall}
$w create line 243 275 284 275 -fill $color -tags {floor3 wall}
$w create line 258 322 226 322 -fill $color -tags {floor3 wall}
$w create line 212 370 212 322 -fill $color -tags {floor3 wall}
$w create line 214 322 177 322 -fill $color -tags {floor3 wall}
$w create line 163 370 163 322 -fill $color -tags {floor3 wall}
$w create line 165 322 129 322 -fill $color -tags {floor3 wall}
$w create line 84 322 117 322 -fill $color -tags {floor3 wall}
$w create line 71 322 64 322 -fill $color -tags {floor3 wall}
$w create line 115 322 115 370 -fill $color -tags {floor3 wall}
$w create line 66 322 66 370 -fill $color -tags {floor3 wall}
$w create line 52 322 21 322 -fill $color -tags {floor3 wall}
$w create line 21 331 0 331 -fill $color -tags {floor3 wall}
$w create line 21 331 21 133 -fill $color -tags {floor3 wall}
$w create line 96 133 21 133 -fill $color -tags {floor3 wall}
$w create line 176 129 96 129 -fill $color -tags {floor3 wall}
$w create line 315 133 176 133 -fill $color -tags {floor3 wall}
$w create line 315 129 399 129 -fill $color -tags {floor3 wall}
$w create line 399 311 350 311 -fill $color -tags {floor3 wall}
$w create line 350 329 258 329 -fill $color -tags {floor3 wall}
$w create line 258 322 258 370 -fill $color -tags {floor3 wall}
$w create line 60 370 258 370 -fill $color -tags {floor3 wall}
$w create line 60 370 60 391 -fill $color -tags {floor3 wall}
$w create line 0 391 0 331 -fill $color -tags {floor3 wall}
$w create line 60 391 0 391 -fill $color -tags {floor3 wall}
$w create line 307 250 307 242 -fill $color -tags {floor3 wall}
$w create line 273 250 307 250 -fill $color -tags {floor3 wall}
$w create line 258 250 243 250 -fill $color -tags {floor3 wall}
}
# Below is the "main program" that creates the floorplan demonstration.
set w .floor
global c currentRoom colors activeFloor
catch {destroy $w}
toplevel $w
wm title $w "Floorplan Canvas Demonstration"
wm iconname $w "Floorplan"
wm geometry $w +20+20
wm minsize $w 100 100
label $w.msg -font $font -wraplength 8i -justify left -text "This window contains a canvas widget showing the floorplan of Digital Equipment Corporation's Western Research Laboratory. It has three levels. At any given time one of the levels is active, meaning that you can see its room structure. To activate a level, click the left mouse button anywhere on it. As the mouse moves over the active level, the room under the mouse lights up and its room number appears in the \"Room:\" entry. You can also type a room number in the entry and the room will light up."
pack $w.msg -side top
## See Code / Dismiss buttons
set btns [addSeeDismiss $w.buttons $w]
pack $btns -side bottom -fill x
set f [frame $w.frame]
pack $f -side top -fill both -expand yes
set h [ttk::scrollbar $f.hscroll -orient horizontal]
set v [ttk::scrollbar $f.vscroll -orient vertical]
set f1 [frame $f.f1 -borderwidth 2 -relief sunken]
set c [canvas $f1.c -width 900 -height 500 -highlightthickness 0 \
-xscrollcommand [list $h set] \
-yscrollcommand [list $v set]]
pack $c -expand yes -fill both
grid $f1 -padx 1 -pady 1 -row 0 -column 0 -rowspan 1 -columnspan 1 -sticky news
grid $v -padx 1 -pady 1 -row 0 -column 1 -rowspan 1 -columnspan 1 -sticky news
grid $h -padx 1 -pady 1 -row 1 -column 0 -rowspan 1 -columnspan 1 -sticky news
grid rowconfig $f 0 -weight 1 -minsize 0
grid columnconfig $f 0 -weight 1 -minsize 0
pack $f -expand yes -fill both -padx 1 -pady 1
$v configure -command [list $c yview]
$h configure -command [list $c xview]
# Create an entry for displaying and typing in current room.
entry $c.entry -width 10 -textvariable currentRoom
# Choose colors, then fill in the floorplan.
if {[winfo depth $c] > 1} {
set colors(bg1) #a9c1da
set colors(outline1) #77889a
set colors(bg2) #9ab0c6
set colors(outline2) #687786
set colors(bg3) #8ba0b3
set colors(outline3) #596673
set colors(offices) Black
set colors(active) #c4d1df
} else {
set colors(bg1) white
set colors(outline1) black
set colors(bg2) white
set colors(outline2) black
set colors(bg3) white
set colors(outline3) black
set colors(offices) Black
set colors(active) black
}
set activeFloor ""
floorDisplay $c 3
# Set up event bindings for canvas:
$c bind floor1 <1> "floorDisplay $c 1"
$c bind floor2 <1> "floorDisplay $c 2"
$c bind floor3 <1> "floorDisplay $c 3"
$c bind room <Enter> "newRoom $c"
$c bind room <Leave> {set currentRoom ""}
bind $c <2> "$c scan mark %x %y"
bind $c <B2-Motion> "$c scan dragto %x %y"
bind $c <Destroy> "unset currentRoom"
set currentRoom ""
trace variable currentRoom w "roomChanged $c"
demos/fontchoose.tcl 0000644 00000003330 15170274642 0010535 0 ustar 00 # fontchoose.tcl --
#
# Show off the stock font selector dialog
if {![info exists widgetDemo]} {
error "This script should be run from the \"widget\" demo."
}
package require Tk
set w .fontchoose
catch {destroy $w}
toplevel $w
wm title $w "Font Selection Dialog"
wm iconname $w "fontchooser"
positionWindow $w
catch {font create FontchooseDemoFont {*}[font actual TkDefaultFont]}
# The font chooser needs to be configured and then shown.
proc SelectFont {parent} {
tk fontchooser configure -font FontchooseDemoFont \
-command ApplyFont -parent $parent
tk fontchooser show
}
proc ApplyFont {font} {
font configure FontchooseDemoFont {*}[font actual $font]
}
# When the visibility of the fontchooser changes, the following event is fired
# to the parent widget.
#
bind $w <<TkFontchooserVisibility>> {
if {[tk fontchooser configure -visible]} {
%W.f.font state disabled
} else {
%W.f.font state !disabled
}
}
set f [ttk::frame $w.f -relief sunken -padding 2]
text $f.msg -font FontchooseDemoFont -width 40 -height 6 -borderwidth 0 \
-yscrollcommand [list $f.vs set]
ttk::scrollbar $f.vs -command [list $f.msg yview]
$f.msg insert end "Press the buttons below to choose a new font for the\
text shown in this window.\n" {}
ttk::button $f.font -text "Set font ..." -command [list SelectFont $w]
grid $f.msg $f.vs -sticky news
grid $f.font - -sticky e
grid columnconfigure $f 0 -weight 1
grid rowconfigure $f 0 -weight 1
bind $w <Visibility> {
bind %W <Visibility> {}
grid propagate %W.f 0
}
## See Code / Dismiss buttons
set btns [addSeeDismiss $w.buttons $w]
grid $f -sticky news
grid $btns -sticky ew
grid columnconfigure $w 0 -weight 1
grid rowconfigure $w 0 -weight 1
demos/form.tcl 0000644 00000002026 15170274642 0007332 0 ustar 00 # form.tcl --
#
# This demonstration script creates a simple form with a bunch
# of entry widgets.
if {![info exists widgetDemo]} {
error "This script should be run from the \"widget\" demo."
}
package require Tk
set w .form
catch {destroy $w}
toplevel $w
wm title $w "Form Demonstration"
wm iconname $w "form"
positionWindow $w
label $w.msg -font $font -wraplength 4i -justify left -text "This window contains a simple form where you can type in the various entries and use tabs to move circularly between the entries."
pack $w.msg -side top
## See Code / Dismiss buttons
set btns [addSeeDismiss $w.buttons $w]
pack $btns -side bottom -fill x
foreach i {f1 f2 f3 f4 f5} {
frame $w.$i -bd 2
entry $w.$i.entry -relief sunken -width 40
label $w.$i.label
pack $w.$i.entry -side right
pack $w.$i.label -side left
}
$w.f1.label config -text Name:
$w.f2.label config -text Address:
$w.f5.label config -text Phone:
pack $w.msg $w.f1 $w.f2 $w.f3 $w.f4 $w.f5 -side top -fill x
bind $w <Return> "destroy $w"
focus $w.f1.entry
demos/goldberg.tcl 0000644 00000156354 15170274642 0010172 0 ustar 00 ##+#################################################################
#
# TkGoldberg.tcl
# by Keith Vetter, March 13, 2003
#
# "Man will always find a difficult means to perform a simple task"
# Rube Goldberg
#
# Reproduced here with permission.
#
##+#################################################################
#
# Keith Vetter 2003-03-21: this started out as a simple little program
# but was so much fun that it grew and grew. So I apologize about the
# size but I just couldn't resist sharing it.
#
# This is a whizzlet that does a Rube Goldberg type animation, the
# design of which comes from an New Years e-card from IncrediMail.
# That version had nice sound effects which I eschewed. On the other
# hand, that version was in black and white (actually dark blue and
# light blue) and this one is fully colorized.
#
# One thing I learned from this project is that drawing filled complex
# objects on a canvas is really hard. More often than not I had to
# draw each item twice--once with the desired fill color but no
# outline, and once with no fill but with the outline. Another trick
# is erasing by drawing with the background color. Having a flood fill
# command would have been extremely helpful.
#
# Two wiki pages were extremely helpful: Drawing rounded rectangles
# which I generalized into Drawing rounded polygons, and regular
# polygons which allowed me to convert ovals and arcs into polygons
# which could then be rotated (see Canvas Rotation). I also wrote
# Named Colors to aid in the color selection.
#
# I could comment on the code, but it's just 26 state machines with
# lots of canvas create and move calls.
if {![info exists widgetDemo]} {
error "This script should be run from the \"widget\" demo."
}
package require Tk
set w .goldberg
catch {destroy $w}
toplevel $w
wm title $w "Tk Goldberg (demonstration)"
wm iconname $w "goldberg"
wm resizable $w 0 0
#positionWindow $w
label $w.msg -font {Arial 10} -wraplength 4i -justify left -text "This is a\
demonstration of just how complex you can make your animations\
become. Click the ball to start things moving!\n\n\"Man will always\
find a difficult means to perform a simple task\"\n - Rube Goldberg"
pack $w.msg -side top
###--- End of Boilerplate ---###
# Ensure that this this is an array
array set animationCallbacks {}
bind $w <Destroy> {
if {"%W" eq [winfo toplevel %W]} {
unset S C speed
}
}
set S(title) "Tk Goldberg"
set S(speed) 5
set S(cnt) 0
set S(message) "\\nWelcome\\nto\\nTcl/Tk"
array set speed {1 10 2 20 3 50 4 80 5 100 6 150 7 200 8 300 9 400 10 500}
set MSTART 0; set MGO 1; set MPAUSE 2; set MSSTEP 3; set MBSTEP 4; set MDONE 5
set S(mode) $::MSTART
# Colors for everything
set C(fg) black
set C(bg) gray75
set C(bg) cornflowerblue
set C(0) white; set C(1a) darkgreen; set C(1b) yellow
set C(2) red; set C(3a) green; set C(3b) darkblue
set C(4) $C(fg); set C(5a) brown; set C(5b) white
set C(6) magenta; set C(7) green; set C(8) $C(fg)
set C(9) blue4; set C(10a) white; set C(10b) cyan
set C(11a) yellow; set C(11b) mediumblue; set C(12) tan2
set C(13a) yellow; set C(13b) red; set C(14) white
set C(15a) green; set C(15b) yellow; set C(16) gray65
set C(17) \#A65353; set C(18) $C(fg); set C(19) gray50
set C(20) cyan; set C(21) gray65; set C(22) $C(20)
set C(23a) blue; set C(23b) red; set C(23c) yellow
set C(24a) red; set C(24b) white;
proc DoDisplay {w} {
global S C
ttk::frame $w.ctrl -relief ridge -borderwidth 2 -padding 5
pack [frame $w.screen -bd 2 -relief raised] \
-side left -fill both -expand 1
canvas $w.c -width 860 -height 730 -bg $C(bg) -highlightthickness 0
$w.c config -scrollregion {0 0 1000 1000} ;# Kludge: move everything up
$w.c yview moveto .05
pack $w.c -in $w.screen -side top -fill both -expand 1
bind $w.c <3> [list $w.pause invoke]
bind $w.c <Destroy> {
after cancel $animationCallbacks(goldberg)
unset animationCallbacks(goldberg)
}
DoCtrlFrame $w
DoDetailFrame $w
if {[tk windowingsystem] ne "aqua"} {
ttk::button $w.show -text "\u00bb" -command [list ShowCtrl $w] -width 2
} else {
button $w.show -text "\u00bb" -command [list ShowCtrl $w] -width 2 -highlightbackground $C(bg)
}
place $w.show -in $w.c -relx 1 -rely 0 -anchor ne
update
}
proc DoCtrlFrame {w} {
global S
ttk::button $w.start -text "Start" -command [list DoButton $w 0]
ttk::checkbutton $w.pause -text "Pause" -command [list DoButton $w 1] \
-variable S(pause)
ttk::button $w.step -text "Single Step" -command [list DoButton $w 2]
ttk::button $w.bstep -text "Big Step" -command [list DoButton $w 4]
ttk::button $w.reset -text "Reset" -command [list DoButton $w 3]
ttk::labelframe $w.details
raise $w.details
set S(details) 0
ttk::checkbutton $w.details.cb -text "Details" -variable S(details)
ttk::labelframe $w.message -text "Message"
ttk::entry $w.message.e -textvariable S(message) -justify center
ttk::labelframe $w.speed -text "Speed: 0"
ttk::scale $w.speed.scale -orient h -from 1 -to 10 -variable S(speed)
ttk::button $w.about -text About -command [list About $w]
grid $w.start -in $w.ctrl -row 0 -sticky ew
grid rowconfigure $w.ctrl 1 -minsize 10
grid $w.pause -in $w.ctrl -row 2 -sticky ew
grid $w.step -in $w.ctrl -sticky ew -pady 2
grid $w.bstep -in $w.ctrl -sticky ew
grid $w.reset -in $w.ctrl -sticky ew -pady 2
grid rowconfigure $w.ctrl 10 -minsize 18
grid $w.details -in $w.ctrl -row 11 -sticky ew
grid rowconfigure $w.ctrl 11 -minsize 20
$w.details configure -labelwidget $w.details.cb
grid [ttk::frame $w.details.b -height 1] ;# Work around minor bug
raise $w.details
raise $w.details.cb
grid rowconfigure $w.ctrl 50 -weight 1
trace variable ::S(mode) w [list ActiveGUI $w]
trace variable ::S(details) w [list ActiveGUI $w]
trace variable ::S(speed) w [list ActiveGUI $w]
grid $w.message -in $w.ctrl -row 98 -sticky ew -pady 5
grid $w.message.e -sticky nsew
grid $w.speed -in $w.ctrl -row 99 -sticky ew -pady {0 5}
pack $w.speed.scale -fill both -expand 1
grid $w.about -in $w.ctrl -row 100 -sticky ew
bind $w.reset <3> {set S(mode) -1} ;# Debugging
## See Code / Dismiss buttons hack!
set btns [addSeeDismiss $w.ctrl.buttons $w]
grid [ttk::separator $w.ctrl.sep] -sticky ew -pady 4
set i 0
foreach b [winfo children $btns] {
if {[winfo class $b] eq "TButton"} {
grid [set b2 [ttk::button $w.ctrl.b[incr i]]] -sticky ew
foreach b3 [$b configure] {
set b3 [lindex $b3 0]
# Some options are read-only; ignore those errors
catch {$b2 configure $b3 [$b cget $b3]}
}
}
}
destroy $btns
}
proc DoDetailFrame {w} {
set w2 $w.details.f
ttk::frame $w2
set bd 2
ttk::label $w2.l -textvariable S(cnt) -background white
grid $w2.l - - - -sticky ew -row 0
for {set i 1} {1} {incr i} {
if {[info procs "Move$i"] eq ""} break
ttk::label $w2.l$i -text $i -anchor e -width 2 -background white
ttk::label $w2.ll$i -textvariable STEP($i) -width 5 -background white
set row [expr {($i + 1) / 2}]
set col [expr {(($i + 1) & 1) * 2}]
grid $w2.l$i -sticky ew -row $row -column $col
grid $w2.ll$i -sticky ew -row $row -column [incr col]
}
grid columnconfigure $w2 1 -weight 1
}
# Map or unmap the ctrl window
proc ShowCtrl {w} {
if {[winfo ismapped $w.ctrl]} {
pack forget $w.ctrl
$w.show config -text "\u00bb"
} else {
pack $w.ctrl -side right -fill both -ipady 5
$w.show config -text "\u00ab"
}
}
proc DrawAll {w} {
ResetStep
$w.c delete all
for {set i 0} {1} {incr i} {
set p "Draw$i"
if {[info procs $p] eq ""} break
$p $w
}
}
proc ActiveGUI {w var1 var2 op} {
global S MGO MSTART MDONE
array set z {0 disabled 1 normal}
set m $S(mode)
set S(pause) [expr {$m == 2}]
$w.start config -state $z([expr {$m != $MGO}])
$w.pause config -state $z([expr {$m != $MSTART && $m != $MDONE}])
$w.step config -state $z([expr {$m != $MGO && $m != $MDONE}])
$w.bstep config -state $z([expr {$m != $MGO && $m != $MDONE}])
$w.reset config -state $z([expr {$m != $MSTART}])
if {$S(details)} {
grid $w.details.f -sticky ew
} else {
grid forget $w.details.f
}
set S(speed) [expr {round($S(speed))}]
$w.speed config -text "Speed: $S(speed)"
}
proc Start {} {
global S MGO
set S(mode) $MGO
}
proc DoButton {w what} {
global S MDONE MGO MSSTEP MBSTEP MPAUSE
if {$what == 0} { ;# Start
if {$S(mode) == $MDONE} {
Reset $w
}
set S(mode) $MGO
} elseif {$what == 1} { ;# Pause
set S(mode) [expr {$S(pause) ? $MPAUSE : $MGO}]
} elseif {$what == 2} { ;# Step
set S(mode) $MSSTEP
} elseif {$what == 3} { ;# Reset
Reset $w
} elseif {$what == 4} { ;# Big step
set S(mode) $MBSTEP
}
}
proc Go {w {who {}}} {
global S speed animationCallbacks MGO MPAUSE MSSTEP MBSTEP
set now [clock clicks -milliseconds]
catch {after cancel $animationCallbacks(goldberg)}
if {$who ne ""} { ;# Start here for debugging
set S(active) $who;
set S(mode) $MGO
}
if {$S(mode) == -1} return ;# Debugging
set n 0
if {$S(mode) != $MPAUSE} { ;# Not paused
set n [NextStep $w] ;# Do the next move
}
if {$S(mode) == $MSSTEP} { ;# Single step
set S(mode) $MPAUSE
}
if {$S(mode) == $MBSTEP && $n} { ;# Big step
set S(mode) $MSSTEP
}
set elapsed [expr {[clock click -milliseconds] - $now}]
set delay [expr {$speed($S(speed)) - $elapsed}]
if {$delay <= 0} {
set delay 1
}
set animationCallbacks(goldberg) [after $delay [list Go $w]]
}
# NextStep: drives the next step of the animation
proc NextStep {w} {
global S MSTART MDONE
set rval 0 ;# Return value
if {$S(mode) != $MSTART && $S(mode) != $MDONE} {
incr S(cnt)
}
set alive {}
foreach {who} $S(active) {
set n ["Move$who" $w]
if {$n & 1} { ;# This guy still alive
lappend alive $who
}
if {$n & 2} { ;# Next guy is active
lappend alive [expr {$who + 1}]
set rval 1
}
if {$n & 4} { ;# End of puzzle flag
set S(mode) $MDONE ;# Done mode
set S(active) {} ;# No more animation
return 1
}
}
set S(active) $alive
return $rval
}
proc About {w} {
set msg "$::S(title)\nby Keith Vetter, March 2003\n(Reproduced by kind\
permission of the author)\n\n\"Man will always find a difficult\
means to perform a simple task.\"\nRube Goldberg"
tk_messageBox -parent $w -message $msg -title About
}
################################################################
#
# All the drawing and moving routines
#
# START HERE! banner
proc Draw0 {w} {
set color $::C(0)
set xy {579 119}
$w.c create text $xy -text "START HERE!" -fill $color -anchor w \
-tag I0 -font {{Times Roman} 12 italic bold}
set xy {719 119 763 119}
$w.c create line $xy -tag I0 -fill $color -width 5 -arrow last \
-arrowshape {18 18 5}
$w.c bind I0 <1> Start
}
proc Move0 {w {step {}}} {
set step [GetStep 0 $step]
if {$::S(mode) > $::MSTART} { ;# Start the ball rolling
MoveAbs $w I0 {-100 -100} ;# Hide the banner
return 2
}
set pos {
{673 119} {678 119} {683 119} {688 119}
{693 119} {688 119} {683 119} {678 119}
}
set step [expr {$step % [llength $pos]}]
MoveAbs $w I0 [lindex $pos $step]
return 1
}
# Dropping ball
proc Draw1 {w} {
set color $::C(1a)
set color2 $::C(1b)
set xy {844 133 800 133 800 346 820 346 820 168 844 168 844 133}
$w.c create poly $xy -width 3 -fill $color -outline {}
set xy {771 133 685 133 685 168 751 168 751 346 771 346 771 133}
$w.c create poly $xy -width 3 -fill $color -outline {}
set xy [box 812 122 9]
$w.c create oval $xy -tag I1 -fill $color2 -outline {}
$w.c bind I1 <1> Start
}
proc Move1 {w {step {}}} {
set step [GetStep 1 $step]
set pos {
{807 122} {802 122} {797 123} {793 124} {789 129} {785 153}
{785 203} {785 278 x} {785 367} {810 392} {816 438} {821 503}
{824 585 y} {838 587} {848 593} {857 601} {-100 -100}
}
if {$step >= [llength $pos]} {
return 0
}
set where [lindex $pos $step]
MoveAbs $w I1 $where
if {[lindex $where 2] eq "y"} {
Move15a $w
}
if {[lindex $where 2] eq "x"} {
return 3
}
return 1
}
# Lighting the match
proc Draw2 {w} {
set color red
set color $::C(2)
set xy {750 369 740 392 760 392} ;# Fulcrum
$w.c create poly $xy -fill $::C(fg) -outline $::C(fg)
set xy {628 335 660 383} ;# Strike box
$w.c create rect $xy -fill {} -outline $::C(fg)
for {set y 0} {$y < 3} {incr y} {
set yy [expr {335+$y*16}]
$w.c create bitmap 628 $yy -bitmap gray25 -anchor nw \
-foreground $::C(fg)
$w.c create bitmap 644 $yy -bitmap gray25 -anchor nw \
-foreground $::C(fg)
}
set xy {702 366 798 366} ;# Lever
$w.c create line $xy -fill $::C(fg) -width 6 -tag I2_0
set xy {712 363 712 355} ;# R strap
$w.c create line $xy -fill $::C(fg) -width 3 -tag I2_1
set xy {705 363 705 355} ;# L strap
$w.c create line $xy -fill $::C(fg) -width 3 -tag I2_2
set xy {679 356 679 360 717 360 717 356 679 356} ;# Match stick
$w.c create line $xy -fill $::C(fg) -tag I2_3
#set xy {662 352 680 365} ;# Match head
set xy {
671 352 677.4 353.9 680 358.5 677.4 363.1 671 365 664.6 363.1
662 358.5 664.6 353.9
}
$w.c create poly $xy -fill $color -outline $color -tag I2_4
}
proc Move2 {w {step {}}} {
set step [GetStep 2 $step]
set stages {0 0 1 2 0 2 1 0 1 2 0 2 1}
set xy(0) {
686 333 692 323 682 316 674 309 671 295 668 307 662 318 662 328
671 336
}
set xy(1) {687 331 698 322 703 295 680 320 668 297 663 311 661 327 671 335}
set xy(2) {
686 331 704 322 688 300 678 283 678 283 674 298 666 309 660 324
672 336
}
if {$step >= [llength $stages]} {
$w.c delete I2
return 0
}
if {$step == 0} { ;# Rotate the match
set beta 20
lassign [Anchor $w I2_0 s] Ox Oy ;# Where to pivot
for {set i 0} {[$w.c find withtag I2_$i] ne ""} {incr i} {
RotateItem $w I2_$i $Ox $Oy $beta
}
$w.c create poly -tag I2 -smooth 1 -fill $::C(2) ;# For the flame
return 1
}
$w.c coords I2 $xy([lindex $stages $step])
return [expr {$step == 7 ? 3 : 1}]
}
# Weight and pulleys
proc Draw3 {w} {
set color $::C(3a)
set color2 $::C(3b)
set xy {602 296 577 174 518 174}
foreach {x y} $xy { ;# 3 Pulleys
$w.c create oval [box $x $y 13] -fill $color -outline $::C(fg) \
-width 3
$w.c create oval [box $x $y 2] -fill $::C(fg) -outline $::C(fg)
}
set xy {750 309 670 309} ;# Wall to flame
$w.c create line $xy -tag I3_s -width 3 -fill $::C(fg) -smooth 1
set xy {670 309 650 309} ;# Flame to pulley 1
$w.c create line $xy -tag I3_0 -width 3 -fill $::C(fg)
set xy {650 309 600 309} ;# Flame to pulley 1
$w.c create line $xy -tag I3_1 -width 3 -fill $::C(fg)
set xy {589 296 589 235} ;# Pulley 1 half way to 2
$w.c create line $xy -tag I3_2 -width 3 -fill $::C(fg)
set xy {589 235 589 174} ;# Pulley 1 other half to 2
$w.c create line $xy -width 3 -fill $::C(fg)
set xy {577 161 518 161} ;# Across the top
$w.c create line $xy -width 3 -fill $::C(fg)
set xy {505 174 505 205} ;# Down to weight
$w.c create line $xy -tag I3_w -width 3 -fill $::C(fg)
# Draw the weight as 2 circles, two rectangles and 1 rounded rectangle
set xy {515 207 495 207}
foreach {x1 y1 x2 y2} $xy {
$w.c create oval [box $x1 $y1 6] -tag I3_ -fill $color2 \
-outline $color2
$w.c create oval [box $x2 $y2 6] -tag I3_ -fill $color2 \
-outline $color2
incr y1 -6; incr y2 6
$w.c create rect $x1 $y1 $x2 $y2 -tag I3_ -fill $color2 \
-outline $color2
}
set xy {492 220 518 263}
set xy [RoundRect $w $xy 15]
$w.c create poly $xy -smooth 1 -tag I3_ -fill $color2 -outline $color2
set xy {500 217 511 217}
$w.c create line $xy -tag I3_ -fill $color2 -width 10
set xy {502 393 522 393 522 465} ;# Bottom weight target
$w.c create line $xy -tag I3__ -fill $::C(fg) -join miter -width 10
}
proc Move3 {w {step {}}} {
set step [GetStep 3 $step]
set pos {{505 247} {505 297} {505 386.5} {505 386.5}}
set rope(0) {750 309 729 301 711 324 690 300}
set rope(1) {750 309 737 292 736 335 717 315 712 320}
set rope(2) {750 309 737 309 740 343 736 351 725 340}
set rope(3) {750 309 738 321 746 345 742 356}
if {$step >= [llength $pos]} {
return 0
}
$w.c delete "I3_$step" ;# Delete part of the rope
MoveAbs $w I3_ [lindex $pos $step] ;# Move weight down
$w.c coords I3_s $rope($step) ;# Flapping rope end
$w.c coords I3_w [concat 505 174 [lindex $pos $step]]
if {$step == 2} {
$w.c move I3__ 0 30
return 2
}
return 1
}
# Cage and door
proc Draw4 {w} {
set color $::C(4)
lassign {527 356 611 464} x0 y0 x1 y1
for {set y $y0} {$y <= $y1} {incr y 12} { ;# Horizontal bars
$w.c create line $x0 $y $x1 $y -fill $color -width 1
}
for {set x $x0} {$x <= $x1} {incr x 12} { ;# Vertical bars
$w.c create line $x $y0 $x $y1 -fill $color -width 1
}
set xy {518 464 518 428} ;# Swing gate
$w.c create line $xy -tag I4 -fill $color -width 3
}
proc Move4 {w {step {}}} {
set step [GetStep 4 $step]
set angles {-10 -20 -30 -30}
if {$step >= [llength $angles]} {
return 0
}
RotateItem $w I4 518 464 [lindex $angles $step]
$w.c raise I4
return [expr {$step == 3 ? 3 : 1}]
}
# Mouse
proc Draw5 {w} {
set color $::C(5a)
set color2 $::C(5b)
set xy {377 248 410 248 410 465 518 465} ;# Mouse course
lappend xy 518 428 451 428 451 212 377 212
$w.c create poly $xy -fill $color2 -outline $::C(fg) -width 3
set xy {
534.5 445.5 541 440 552 436 560 436 569 440 574 446 575 452 574 454
566 456 554 456 545 456 537 454 530 452
}
$w.c create poly $xy -tag {I5 I5_0} -fill $color
set xy {573 452 592 458 601 460 613 456} ;# Tail
$w.c create line $xy -tag {I5 I5_1} -fill $color -smooth 1 -width 3
set xy [box 540 446 2] ;# Eye
set xy {540 444 541 445 541 447 540 448 538 447 538 445}
#.c create oval $xy -tag {I5 I5_2} -fill $::C(bg) -outline {}
$w.c create poly $xy -tag {I5 I5_2} -fill $::C(bg) -outline {} -smooth 1
set xy {538 454 535 461} ;# Front leg
$w.c create line $xy -tag {I5 I5_3} -fill $color -width 2
set xy {566 455 569 462} ;# Back leg
$w.c create line $xy -tag {I5 I5_4} -fill $color -width 2
set xy {544 455 545 460} ;# 2nd front leg
$w.c create line $xy -tag {I5 I5_5} -fill $color -width 2
set xy {560 455 558 460} ;# 2nd back leg
$w.c create line $xy -tag {I5 I5_6} -fill $color -width 2
}
proc Move5 {w {step {}}} {
set step [GetStep 5 $step]
set pos {
{553 452} {533 452} {513 452} {493 452} {473 452}
{463 442 30} {445.5 441.5 30} {425.5 434.5 30} {422 414} {422 394}
{422 374} {422 354} {422 334} {422 314} {422 294}
{422 274 -30} {422 260.5 -30 x} {422.5 248.5 -28} {425 237}
}
if {$step >= [llength $pos]} {
return 0
}
lassign [lindex $pos $step] x y beta next
MoveAbs $w I5 [list $x $y]
if {$beta ne ""} {
lassign [Centroid $w I5_0] Ox Oy
foreach id {0 1 2 3 4 5 6} {
RotateItem $w I5_$id $Ox $Oy $beta
}
}
if {$next eq "x"} {
return 3
}
return 1
}
# Dropping gumballs
array set XY6 {
-1 {366 207} -2 {349 204} -3 {359 193} -4 {375 192} -5 {340 190}
-6 {349 177} -7 {366 177} -8 {380 176} -9 {332 172} -10 {342 161}
-11 {357 164} -12 {372 163} -13 {381 149} -14 {364 151} -15 {349 146}
-16 {333 148} 0 {357 219}
1 {359 261} 2 {359 291} 3 {359 318} 4 {361 324} 5 {365 329} 6 {367 334}
7 {367 340} 8 {366 346} 9 {364 350} 10 {361 355} 11 {359 370} 12 {359 391}
13,0 {360 456} 13,1 {376 456} 13,2 {346 456} 13,3 {330 456}
13,4 {353 444} 13,5 {368 443} 13,6 {339 442} 13,7 {359 431}
13,8 {380 437} 13,9 {345 428} 13,10 {328 434} 13,11 {373 424}
13,12 {331 420} 13,13 {360 417} 13,14 {345 412} 13,15 {376 410}
13,16 {360 403}
}
proc Draw6 {w} {
set color $::C(6)
set xy {324 130 391 204} ;# Ball holder
set xy [RoundRect $w $xy 10]
$w.c create poly $xy -smooth 1 -outline $::C(fg) -width 3 -fill $color
set xy {339 204 376 253} ;# Below the ball holder
$w.c create rect $xy -fill {} -outline $::C(fg) -width 3 -fill $color \
-tag I6c
set xy [box 346 339 28]
$w.c create oval $xy -fill $color -outline {} ;# Rotor
$w.c create arc $xy -outline $::C(fg) -width 2 -style arc \
-start 80 -extent 205
$w.c create arc $xy -outline $::C(fg) -width 2 -style arc \
-start -41 -extent 85
set xy [box 346 339 15] ;# Center of rotor
$w.c create oval $xy -outline $::C(fg) -fill $::C(fg) -tag I6m
set xy {352 312 352 254 368 254 368 322} ;# Top drop to rotor
$w.c create poly $xy -fill $color -outline {}
$w.c create line $xy -fill $::C(fg) -width 2
set xy {353 240 367 300} ;# Poke bottom hole
$w.c create rect $xy -fill $color -outline {}
set xy {341 190 375 210} ;# Poke another hole
$w.c create rect $xy -fill $color -outline {}
set xy {368 356 368 403 389 403 389 464 320 464 320 403 352 403 352 366}
$w.c create poly $xy -fill $color -outline {} -width 2 ;# Below rotor
$w.c create line $xy -fill $::C(fg) -width 2
set xy [box 275 342 7] ;# On/off rotor
$w.c create oval $xy -outline $::C(fg) -fill $::C(fg)
set xy {276 334 342 325} ;# Fan belt top
$w.c create line $xy -fill $::C(fg) -width 3
set xy {276 349 342 353} ;# Fan belt bottom
$w.c create line $xy -fill $::C(fg) -width 3
set xy {337 212 337 247} ;# What the mouse pushes
$w.c create line $xy -fill $::C(fg) -width 3 -tag I6_
set xy {392 212 392 247}
$w.c create line $xy -fill $::C(fg) -width 3 -tag I6_
set xy {337 230 392 230}
$w.c create line $xy -fill $::C(fg) -width 7 -tag I6_
set who -1 ;# All the balls
set colors {red cyan orange green blue darkblue}
lappend colors {*}$colors {*}$colors
for {set i 0} {$i < 17} {incr i} {
set loc [expr {-1 * $i}]
set color [lindex $colors $i]
$w.c create oval [box {*}$::XY6($loc) 5] -fill $color \
-outline $color -tag I6_b$i
}
Draw6a $w 12 ;# The wheel
}
proc Draw6a {w beta} {
$w.c delete I6_0
lassign {346 339} Ox Oy
for {set i 0} {$i < 4} {incr i} {
set b [expr {$beta + $i * 45}]
lassign [RotateC 28 0 0 0 $b] x y
set xy [list [expr {$Ox+$x}] [expr {$Oy+$y}] \
[expr {$Ox-$x}] [expr {$Oy-$y}]]
$w.c create line $xy -tag I6_0 -fill $::C(fg) -width 2
}
}
proc Move6 {w {step {}}} {
set step [GetStep 6 $step]
if {$step > 62} {
return 0
}
if {$step < 2} { ;# Open gate for balls to drop
$w.c move I6_ -7 0
if {$step == 1} { ;# Poke a hole
set xy {348 226 365 240}
$w.c create rect $xy -fill [$w.c itemcget I6c -fill] -outline {}
}
return 1
}
set s [expr {$step - 1}] ;# Do the gumball drop dance
for {set i 0} {$i <= int(($s-1) / 3)} {incr i} {
set tag "I6_b$i"
if {[$w.c find withtag $tag] eq ""} break
set loc [expr {$s - 3 * $i}]
if {[info exists ::XY6($loc,$i)]} {
MoveAbs $w $tag $::XY6($loc,$i)
} elseif {[info exists ::XY6($loc)]} {
MoveAbs $w $tag $::XY6($loc)
}
}
if {($s % 3) == 1} {
set first [expr {($s + 2) / 3}]
for {set i $first} {1} {incr i} {
set tag "I6_b$i"
if {[$w.c find withtag $tag] eq ""} break
set loc [expr {$first - $i}]
MoveAbs $w $tag $::XY6($loc)
}
}
if {$s >= 3} { ;# Rotate the motor
set idx [expr {$s % 3}]
#Draw6a $w [lindex {12 35 64} $idx]
Draw6a $w [expr {12 + $s * 15}]
}
return [expr {$s == 3 ? 3 : 1}]
}
# On/off switch
proc Draw7 {w} {
set color $::C(7)
set xy {198 306 277 374} ;# Box
$w.c create rect $xy -outline $::C(fg) -width 2 -fill $color -tag I7z
$w.c lower I7z
set xy {275 343 230 349}
$w.c create line $xy -tag I7 -fill $::C(fg) -arrow last \
-arrowshape {23 23 8} -width 6
set xy {225 324} ;# On button
$w.c create oval [box {*}$xy 3] -fill $::C(fg) -outline $::C(fg)
set xy {218 323} ;# On text
set font {{Times Roman} 8}
$w.c create text $xy -text "on" -anchor e -fill $::C(fg) -font $font
set xy {225 350} ;# Off button
$w.c create oval [box {*}$xy 3] -fill $::C(fg) -outline $::C(fg)
set xy {218 349} ;# Off button
$w.c create text $xy -text "off" -anchor e -fill $::C(fg) -font $font
}
proc Move7 {w {step {}}} {
set step [GetStep 7 $step]
set numsteps 30
if {$step > $numsteps} {
return 0
}
set beta [expr {30.0 / $numsteps}]
RotateItem $w I7 275 343 $beta
return [expr {$step == $numsteps ? 3 : 1}]
}
# Electricity to the fan
proc Draw8 {w} {
Sine $w 271 248 271 306 5 8 -tag I8_s -fill $::C(8) -width 3
}
proc Move8 {w {step {}}} {
set step [GetStep 8 $step]
if {$step > 3} {
return 0
}
if {$step == 0} {
Sparkle $w [Anchor $w I8_s s] I8
return 1
} elseif {$step == 1} {
MoveAbs $w I8 [Anchor $w I8_s c]
} elseif {$step == 2} {
MoveAbs $w I8 [Anchor $w I8_s n]
} else {
$w.c delete I8
}
return [expr {$step == 2 ? 3 : 1}]
}
# Fan
proc Draw9 {w} {
set color $::C(9)
set xy {266 194 310 220}
$w.c create oval $xy -outline $color -fill $color
set xy {280 209 296 248}
$w.c create oval $xy -outline $color -fill $color
set xy {288 249 252 249 260 240 280 234 296 234 316 240 324 249 288 249}
$w.c create poly $xy -fill $color -smooth 1
set xy {248 205 265 214 264 205 265 196} ;# Spinner
$w.c create poly $xy -fill $color
set xy {255 206 265 234} ;# Fan blades
$w.c create oval $xy -fill {} -outline $::C(fg) -width 3 -tag I9_0
set xy {255 176 265 204}
$w.c create oval $xy -fill {} -outline $::C(fg) -width 3 -tag I9_0
set xy {255 206 265 220}
$w.c create oval $xy -fill {} -outline $::C(fg) -width 1 -tag I9_1
set xy {255 190 265 204}
$w.c create oval $xy -fill {} -outline $::C(fg) -width 1 -tag I9_1
}
proc Move9 {w {step {}}} {
set step [GetStep 9 $step]
if {$step & 1} {
$w.c itemconfig I9_0 -width 4
$w.c itemconfig I9_1 -width 1
$w.c lower I9_1 I9_0
} else {
$w.c itemconfig I9_0 -width 1
$w.c itemconfig I9_1 -width 4
$w.c lower I9_0 I9_1
}
if {$step == 0} {
return 3
}
return 1
}
# Boat
proc Draw10 {w} {
set color $::C(10a)
set color2 $::C(10b)
set xy {191 230 233 230 233 178 191 178} ;# Sail
$w.c create poly $xy -fill $color -width 3 -outline $::C(fg) -tag I10
set xy [box 209 204 31] ;# Front
$w.c create arc $xy -outline {} -fill $color -style pie \
-start 120 -extent 120 -tag I10
$w.c create arc $xy -outline $::C(fg) -width 3 -style arc \
-start 120 -extent 120 -tag I10
set xy [box 249 204 31] ;# Back
$w.c create arc $xy -outline {} -fill $::C(bg) -width 3 -style pie \
-start 120 -extent 120 -tag I10
$w.c create arc $xy -outline $::C(fg) -width 3 -style arc \
-start 120 -extent 120 -tag I10
set xy {200 171 200 249} ;# Mast
$w.c create line $xy -fill $::C(fg) -width 3 -tag I10
set xy {159 234 182 234} ;# Bow sprit
$w.c create line $xy -fill $::C(fg) -width 3 -tag I10
set xy {180 234 180 251 220 251} ;# Hull
$w.c create line $xy -fill $::C(fg) -width 6 -tag I10
set xy {92 255 221 255} ;# Waves
Sine $w {*}$xy 2 25 -fill $color2 -width 1 -tag I10w
set xy [lrange [$w.c coords I10w] 4 end-4] ;# Water
set xy [concat $xy 222 266 222 277 99 277]
$w.c create poly $xy -fill $color2 -outline $color2
set xy {222 266 222 277 97 277 97 266} ;# Water bottom
$w.c create line $xy -fill $::C(fg) -width 3
set xy [box 239 262 17]
$w.c create arc $xy -outline $::C(fg) -width 3 -style arc \
-start 95 -extent 103
set xy [box 76 266 21]
$w.c create arc $xy -outline $::C(fg) -width 3 -style arc -extent 190
}
proc Move10 {w {step {}}} {
set step [GetStep 10 $step]
set pos {
{195 212} {193 212} {190 212} {186 212} {181 212} {176 212}
{171 212} {166 212} {161 212} {156 212} {151 212} {147 212} {142 212}
{137 212} {132 212 x} {127 212} {121 212} {116 212} {111 212}
}
if {$step >= [llength $pos]} {
return 0
}
set where [lindex $pos $step]
MoveAbs $w I10 $where
if {[lindex $where 2] eq "x"} {
return 3
}
return 1
}
# 2nd ball drop
proc Draw11 {w} {
set color $::C(11a)
set color2 $::C(11b)
set xy {23 264 55 591} ;# Color the down tube
$w.c create rect $xy -fill $color -outline {}
set xy [box 71 460 48] ;# Color the outer loop
$w.c create oval $xy -fill $color -outline {}
set xy {55 264 55 458} ;# Top right side
$w.c create line $xy -fill $::C(fg) -width 3
set xy {55 504 55 591} ;# Bottom right side
$w.c create line $xy -fill $::C(fg) -width 3
set xy [box 71 460 48] ;# Outer loop
$w.c create arc $xy -outline $::C(fg) -width 3 -style arc \
-start 110 -extent -290 -tag I11i
set xy [box 71 460 16] ;# Inner loop
$w.c create oval $xy -outline $::C(fg) -fill {} -width 3 -tag I11i
$w.c create oval $xy -outline $::C(fg) -fill $::C(bg) -width 3
set xy {23 264 23 591} ;# Left side
$w.c create line $xy -fill $::C(fg) -width 3
set xy [box 1 266 23] ;# Top left curve
$w.c create arc $xy -outline $::C(fg) -width 3 -style arc -extent 90
set xy [box 75 235 9] ;# The ball
$w.c create oval $xy -fill $color2 -outline {} -width 3 -tag I11
}
proc Move11 {w {step {}}} {
set step [GetStep 11 $step]
set pos {
{75 235} {70 235} {65 237} {56 240} {46 247} {38 266} {38 296}
{38 333} {38 399} {38 475} {74 496} {105 472} {100 437} {65 423}
{-100 -100} {38 505} {38 527 x} {38 591}
}
if {$step >= [llength $pos]} {
return 0
}
set where [lindex $pos $step]
MoveAbs $w I11 $where
if {[lindex $where 2] eq "x"} {
return 3
}
return 1
}
# Hand
proc Draw12 {w} {
set xy {20 637 20 617 20 610 20 590 40 590 40 590 60 590 60 610 60 610}
lappend xy 60 610 65 620 60 631 ;# Thumb
lappend xy 60 631 60 637 60 662 60 669 52 669 56 669 50 669 50 662 50 637
set y0 637 ;# Bumps for fingers
set y1 645
for {set x 50} {$x > 20} {incr x -10} {
set x1 [expr {$x - 5}]
set x2 [expr {$x - 10}]
lappend xy $x $y0 $x1 $y1 $x2 $y0
}
$w.c create poly $xy -fill $::C(12) -outline $::C(fg) -smooth 1 -tag I12 \
-width 3
}
proc Move12 {w {step {}}} {
set step [GetStep 12 $step]
set pos {{42.5 641 x}}
if {$step >= [llength $pos]} {
return 0
}
set where [lindex $pos $step]
MoveAbs $w I12 $where
if {[lindex $where 2] eq "x"} {
return 3
}
return 1
}
# Fax
proc Draw13 {w} {
set color $::C(13a)
set xy {86 663 149 663 149 704 50 704 50 681 64 681 86 671}
set xy2 {784 663 721 663 721 704 820 704 820 681 806 681 784 671}
set radii {2 9 9 8 5 5 2}
RoundPoly $w.c $xy $radii -width 3 -outline $::C(fg) -fill $color
RoundPoly $w.c $xy2 $radii -width 3 -outline $::C(fg) -fill $color
set xy {56 677}
$w.c create rect [box {*}$xy 4] -fill {} -outline $::C(fg) -width 3 \
-tag I13
set xy {809 677}
$w.c create rect [box {*}$xy 4] -fill {} -outline $::C(fg) -width 3 \
-tag I13R
set xy {112 687} ;# Label
$w.c create text $xy -text "FAX" -fill $::C(fg) \
-font {{Times Roman} 12 bold}
set xy {762 687}
$w.c create text $xy -text "FAX" -fill $::C(fg) \
-font {{Times Roman} 12 bold}
set xy {138 663 148 636 178 636} ;# Paper guide
$w.c create line $xy -smooth 1 -fill $::C(fg) -width 3
set xy {732 663 722 636 692 636}
$w.c create line $xy -smooth 1 -fill $::C(fg) -width 3
Sine $w 149 688 720 688 5 15 -tag I13_s -fill $::C(fg) -width 3
}
proc Move13 {w {step {}}} {
set step [GetStep 13 $step]
set numsteps 7
if {$step == $numsteps+2} {
MoveAbs $w I13_star {-100 -100}
$w.c itemconfig I13R -fill $::C(13b) -width 2
return 2
}
if {$step == 0} { ;# Button down
$w.c delete I13
Sparkle $w {-100 -100} I13_star ;# Create off screen
return 1
}
lassign [Anchor $w I13_s w] x0 y0
lassign [Anchor $w I13_s e] x1 y1
set x [expr {$x0 + ($x1-$x0) * ($step - 1) / double($numsteps)}]
MoveAbs $w I13_star [list $x $y0]
return 1
}
# Paper in fax
proc Draw14 {w} {
set color $::C(14)
set xy {102 661 113 632 130 618} ;# Left paper edge
$w.c create line $xy -smooth 1 -fill $color -width 3 -tag I14L_0
set xy {148 629 125 640 124 662} ;# Right paper edge
$w.c create line $xy -smooth 1 -fill $color -width 3 -tag I14L_1
Draw14a $w L
set xy {
768.0 662.5 767.991316225 662.433786215 767.926187912 662.396880171
}
$w.c create line $xy -smooth 1 -fill $color -width 3 -tag I14R_0
$w.c lower I14R_0
# NB. these numbers are VERY sensitive, you must start with final size
# and shrink down to get the values
set xy {
745.947897349 662.428358855 745.997829056 662.452239237 746.0 662.5
}
$w.c create line $xy -smooth 1 -fill $color -width 3 -tag I14R_1
$w.c lower I14R_1
}
proc Draw14a {w side} {
set color $::C(14)
set xy [$w.c coords I14${side}_0]
set xy2 [$w.c coords I14${side}_1]
lassign $xy x0 y0 x1 y1 x2 y2
lassign $xy2 x3 y3 x4 y4 x5 y5
set zz [concat \
$x0 $y0 $x0 $y0 $xy $x2 $y2 $x2 $y2 \
$x3 $y3 $x3 $y3 $xy2 $x5 $y5 $x5 $y5]
$w.c delete I14$side
$w.c create poly $zz -tag I14$side -smooth 1 -fill $color -outline $color \
-width 3
$w.c lower I14$side
}
proc Move14 {w {step {}}} {
set step [GetStep 14 $step]
# Paper going down
set sc [expr {.9 - .05*$step}]
if {$sc < .3} {
$w.c delete I14L
return 0
}
lassign [$w.c coords I14L_0] Ox Oy
$w.c scale I14L_0 $Ox $Oy $sc $sc
lassign [lrange [$w.c coords I14L_1] end-1 end] Ox Oy
$w.c scale I14L_1 $Ox $Oy $sc $sc
Draw14a $w L
# Paper going up
set sc [expr {.35 + .05*$step}]
set sc [expr {1 / $sc}]
lassign [$w.c coords I14R_0] Ox Oy
$w.c scale I14R_0 $Ox $Oy $sc $sc
lassign [lrange [$w.c coords I14R_1] end-1 end] Ox Oy
$w.c scale I14R_1 $Ox $Oy $sc $sc
Draw14a $w R
return [expr {$step == 10 ? 3 : 1}]
}
# Light beam
proc Draw15 {w} {
set color $::C(15a)
set xy {824 599 824 585 820 585 829 585}
$w.c create line $xy -fill $::C(fg) -width 3 -tag I15a
set xy {789 599 836 643}
$w.c create rect $xy -fill $color -outline $::C(fg) -width 3
set xy {778 610 788 632}
$w.c create rect $xy -fill $color -outline $::C(fg) -width 3
set xy {766 617 776 625}
$w.c create rect $xy -fill $color -outline $::C(fg) -width 3
set xy {633 600 681 640}
$w.c create rect $xy -fill $color -outline $::C(fg) -width 3
set xy {635 567 657 599}
$w.c create rect $xy -fill $color -outline $::C(fg) -width 2
set xy {765 557 784 583}
$w.c create rect $xy -fill $color -outline $::C(fg) -width 2
Sine $w 658 580 765 580 3 15 -tag I15_s -fill $::C(fg) -width 3
}
proc Move15a {w} {
set color $::C(15b)
$w.c scale I15a 824 599 1 .3 ;# Button down
set xy {765 621 681 621}
$w.c create line $xy -dash "-" -width 3 -fill $color -tag I15
}
proc Move15 {w {step {}}} {
set step [GetStep 15 $step]
set numsteps 6
if {$step == $numsteps+2} {
MoveAbs $w I15_star {-100 -100}
return 2
}
if {$step == 0} { ;# Break the light beam
Sparkle $w {-100 -100} I15_star
set xy {765 621 745 621}
$w.c coords I15 $xy
return 1
}
lassign [Anchor $w I15_s w] x0 y0
lassign [Anchor $w I15_s e] x1 y1
set x [expr {$x0 + ($x1-$x0) * ($step - 1) / double($numsteps)}]
MoveAbs $w I15_star [list $x $y0]
return 1
}
# Bell
proc Draw16 {w} {
set color $::C(16)
set xy {722 485 791 556}
$w.c create rect $xy -fill {} -outline $::C(fg) -width 3
set xy [box 752 515 25] ;# Bell
$w.c create oval $xy -fill $color -outline black -tag I16b -width 2
set xy [box 752 515 5] ;# Bell button
$w.c create oval $xy -fill black -outline black -tag I16b
set xy {784 523 764 549} ;# Clapper
$w.c create line $xy -width 3 -tag I16c -fill $::C(fg)
set xy [box 784 523 4]
$w.c create oval $xy -fill $::C(fg) -outline $::C(fg) -tag I16d
}
proc Move16 {w {step {}}} {
set step [GetStep 16 $step]
# Note: we never stop
lassign {760 553} Ox Oy
if {$step & 1} {
set beta 12
$w.c move I16b 3 0
} else {
set beta -12
$w.c move I16b -3 0
}
RotateItem $w I16c $Ox $Oy $beta
RotateItem $w I16d $Ox $Oy $beta
return [expr {$step == 1 ? 3 : 1}]
}
# Cat
proc Draw17 {w} {
set color $::C(17)
set xy {584 556 722 556}
$w.c create line $xy -fill $::C(fg) -width 3
set xy {584 485 722 485}
$w.c create line $xy -fill $::C(fg) -width 3
set xy {664 523 717 549} ;# Body
$w.c create arc $xy -outline $::C(fg) -fill $color -width 3 \
-style chord -start 128 -extent -260 -tag I17
set xy {709 554 690 543} ;# Paw
$w.c create oval $xy -outline $::C(fg) -fill $color -width 3 -tag I17
set xy {657 544 676 555}
$w.c create oval $xy -outline $::C(fg) -fill $color -width 3 -tag I17
set xy [box 660 535 15] ;# Lower face
$w.c create arc $xy -outline $::C(fg) -width 3 -style arc \
-start 150 -extent 240 -tag I17_
$w.c create arc $xy -outline {} -fill $color -width 1 -style chord \
-start 150 -extent 240 -tag I17_
set xy {674 529 670 513 662 521 658 521 650 513 647 529} ;# Ears
$w.c create line $xy -fill $::C(fg) -width 3 -tag I17_
$w.c create poly $xy -fill $color -outline {} -width 1 -tag {I17_ I17_c}
set xy {652 542 628 539} ;# Whiskers
$w.c create line $xy -fill $::C(fg) -width 3 -tag I17_
set xy {652 543 632 545}
$w.c create line $xy -fill $::C(fg) -width 3 -tag I17_
set xy {652 546 632 552}
$w.c create line $xy -fill $::C(fg) -width 3 -tag I17_
set xy {668 543 687 538}
$w.c create line $xy -fill $::C(fg) -width 3 -tag {I17_ I17w}
set xy {668 544 688 546}
$w.c create line $xy -fill $::C(fg) -width 3 -tag {I17_ I17w}
set xy {668 547 688 553}
$w.c create line $xy -fill $::C(fg) -width 3 -tag {I17_ I17w}
set xy {649 530 654 538 659 530} ;# Left eye
$w.c create line $xy -fill $::C(fg) -width 2 -smooth 1 -tag I17
set xy {671 530 666 538 661 530} ;# Right eye
$w.c create line $xy -fill $::C(fg) -width 2 -smooth 1 -tag I17
set xy {655 543 660 551 665 543} ;# Mouth
$w.c create line $xy -fill $::C(fg) -width 2 -smooth 1 -tag I17
}
proc Move17 {w {step {}}} {
set step [GetStep 17 $step]
if {$step == 0} {
$w.c delete I17 ;# Delete most of the cat
set xy {655 543 660 535 665 543} ;# Mouth
$w.c create line $xy -fill $::C(fg) -width 3 -smooth 1 -tag I17_
set xy [box 654 530 4] ;# Left eye
$w.c create oval $xy -outline $::C(fg) -width 3 -fill {} -tag I17_
set xy [box 666 530 4] ;# Right eye
$w.c create oval $xy -outline $::C(fg) -width 3 -fill {} -tag I17_
$w.c move I17_ 0 -20 ;# Move face up
set xy {652 528 652 554} ;# Front leg
$w.c create line $xy -fill $::C(fg) -width 3 -tag I17_
set xy {670 528 670 554} ;# 2nd front leg
$w.c create line $xy -fill $::C(fg) -width 3 -tag I17_
set xy {
675 506 694 489 715 513 715 513 715 513 716 525 716 525 716 525
706 530 695 530 679 535 668 527 668 527 668 527 675 522 676 517
677 512
} ;# Body
$w.c create poly $xy -fill [$w.c itemcget I17_c -fill] \
-outline $::C(fg) -width 3 -smooth 1 -tag I17_
set xy {716 514 716 554} ;# Back leg
$w.c create line $xy -fill $::C(fg) -width 3 -tag I17_
set xy {694 532 694 554} ;# 2nd back leg
$w.c create line $xy -fill $::C(fg) -width 3 -tag I17_
set xy {715 514 718 506 719 495 716 488};# Tail
$w.c create line $xy -fill $::C(fg) -width 3 -smooth 1 -tag I17_
$w.c raise I17w ;# Make whiskers visible
$w.c move I17_ -5 0 ;# Move away from wall a bit
return 2
}
return 0
}
# Sling shot
proc Draw18 {w} {
set color $::C(18)
set xy {721 506 627 506} ;# Sling hold
$w.c create line $xy -width 4 -fill $::C(fg) -tag I18
set xy {607 500 628 513} ;# Sling rock
$w.c create oval $xy -fill $color -outline {} -tag I18a
set xy {526 513 606 507 494 502} ;# Sling band
$w.c create line $xy -fill $::C(fg) -width 4 -tag I18b
set xy { 485 490 510 540 510 575 510 540 535 491 } ;# Sling
$w.c create line $xy -fill $::C(fg) -width 6
}
proc Move18 {w {step {}}} {
set step [GetStep 18 $step]
set pos {
{587 506} {537 506} {466 506} {376 506} {266 506 x} {136 506}
{16 506} {-100 -100}
}
set b(0) {490 502 719 507 524 512} ;# Band collapsing
set b(1) {
491 503 524 557 563 505 559 496 546 506 551 525 553 536 538 534
532 519 529 499
}
set b(2) {491 503 508 563 542 533 551 526 561 539 549 550 530 500}
set b(3) {491 503 508 563 530 554 541 562 525 568 519 544 530 501}
if {$step >= [llength $pos]} {
return 0
}
if {$step == 0} {
$w.c delete I18
$w.c itemconfig I18b -smooth 1
}
if {[info exists b($step)]} {
$w.c coords I18b $b($step)
}
set where [lindex $pos $step]
MoveAbs $w I18a $where
if {[lindex $where 2] eq "x"} {
return 3
}
return 1
}
# Water pipe
proc Draw19 {w} {
set color $::C(19)
set xx {249 181 155 118 86 55 22 0}
foreach {x1 x2} $xx {
$w.c create rect $x1 453 $x2 467 -fill $color -outline {} -tag I19
$w.c create line $x1 453 $x2 453 -fill $::C(fg) -width 1;# Pipe top
$w.c create line $x1 467 $x2 467 -fill $::C(fg) -width 1;# Pipe bottom
}
$w.c raise I11i
set xy [box 168 460 16] ;# Bulge by the joint
$w.c create oval $xy -fill $color -outline {}
$w.c create arc $xy -outline $::C(fg) -width 1 -style arc \
-start 21 -extent 136
$w.c create arc $xy -outline $::C(fg) -width 1 -style arc \
-start -21 -extent -130
set xy {249 447 255 473} ;# First joint 26x6
$w.c create rect $xy -fill $color -outline $::C(fg) -width 1
set xy [box 257 433 34] ;# Bend up
$w.c create arc $xy -outline {} -fill $color -width 1 \
-style pie -start 0 -extent -91
$w.c create arc $xy -outline $::C(fg) -width 1 \
-style arc -start 0 -extent -90
set xy [box 257 433 20]
$w.c create arc $xy -outline {} -fill $::C(bg) -width 1 \
-style pie -start 0 -extent -92
$w.c create arc $xy -outline $::C(fg) -width 1 \
-style arc -start 0 -extent -90
set xy [box 257 421 34] ;# Bend left
$w.c create arc $xy -outline {} -fill $color -width 1 \
-style pie -start 1 -extent 91
$w.c create arc $xy -outline $::C(fg) -width 1 \
-style arc -start 0 -extent 90
set xy [box 257 421 20]
$w.c create arc $xy -outline {} -fill $::C(bg) -width 1 \
-style pie -start 0 -extent 90
$w.c create arc $xy -outline $::C(fg) -width 1 \
-style arc -start 0 -extent 90
set xy [box 243 421 34] ;# Bend down
$w.c create arc $xy -outline {} -fill $color -width 1 \
-style pie -start 90 -extent 90
$w.c create arc $xy -outline $::C(fg) -width 1 \
-style arc -start 90 -extent 90
set xy [box 243 421 20]
$w.c create arc $xy -outline {} -fill $::C(bg) -width 1 \
-style pie -start 90 -extent 90
$w.c create arc $xy -outline $::C(fg) -width 1 \
-style arc -start 90 -extent 90
set xy {270 427 296 433} ;# 2nd joint bottom
$w.c create rect $xy -fill $color -outline $::C(fg) -width 1
set xy {270 421 296 427} ;# 2nd joint top
$w.c create rect $xy -fill $color -outline $::C(fg) -width 1
set xy {249 382 255 408} ;# Third joint right
$w.c create rect $xy -fill $color -outline $::C(fg) -width 1
set xy {243 382 249 408} ;# Third joint left
$w.c create rect $xy -fill $color -outline $::C(fg) -width 1
set xy {203 420 229 426} ;# Last joint
$w.c create rect $xy -fill $color -outline $::C(fg) -width 1
set xy [box 168 460 6] ;# Handle joint
$w.c create oval $xy -fill $::C(fg) -outline {} -tag I19a
set xy {168 460 168 512} ;# Handle bar
$w.c create line $xy -fill $::C(fg) -width 5 -tag I19b
}
proc Move19 {w {step {}}} {
set step [GetStep 19 $step]
set angles {30 30 30}
if {$step == [llength $angles]} {
return 2
}
RotateItem $w I19b {*}[Centroid $w I19a] [lindex $angles $step]
return 1
}
# Water pouring
proc Draw20 {w} {
}
proc Move20 {w {step {}}} {
set step [GetStep 20 $step]
set pos {451 462 473 484 496 504 513 523 532}
set freq {20 40 40 40 40 40 40 40 40}
set pos {
{451 20} {462 40} {473 40} {484 40} {496 40} {504 40} {513 40}
{523 40} {532 40 x}
}
if {$step >= [llength $pos]} {
return 0
}
$w.c delete I20
set where [lindex $pos $step]
lassign $where y f
H2O $w $y $f
if {[lindex $where 2] eq "x"} {
return 3
}
return 1
}
proc H2O {w y f} {
set color $::C(20)
$w.c delete I20
Sine $w 208 428 208 $y 4 $f -tag {I20 I20s} -width 3 -fill $color \
-smooth 1
$w.c create line [$w.c coords I20s] -width 3 -fill $color -smooth 1 \
-tag {I20 I20a}
$w.c create line [$w.c coords I20s] -width 3 -fill $color -smooth 1 \
-tag {I20 I20b}
$w.c move I20a 8 0
$w.c move I20b 16 0
}
# Bucket
proc Draw21 {w} {
set color $::C(21)
set xy {217 451 244 490} ;# Right handle
$w.c create line $xy -fill $::C(fg) -width 2 -tag I21_a
set xy {201 467 182 490} ;# Left handle
$w.c create line $xy -fill $::C(fg) -width 2 -tag I21_a
set xy {245 490 237 535} ;# Right side
set xy2 {189 535 181 490} ;# Left side
$w.c create poly [concat $xy $xy2] -fill $color -outline {} \
-tag {I21 I21f}
$w.c create line $xy -fill $::C(fg) -width 2 -tag I21
$w.c create line $xy2 -fill $::C(fg) -width 2 -tag I21
set xy {182 486 244 498} ;# Top
$w.c create oval $xy -fill $color -outline {} -width 2 -tag {I21 I21f}
$w.c create oval $xy -fill {} -outline $::C(fg) -width 2 -tag {I21 I21t}
set xy {189 532 237 540} ;# Bottom
$w.c create oval $xy -fill $color -outline $::C(fg) -width 2 \
-tag {I21 I21b}
}
proc Move21 {w {step {}}} {
set step [GetStep 21 $step]
set numsteps 30
if {$step >= $numsteps} {
return 0
}
lassign [$w.c coords I21b] x1 y1 x2 y2
#lassign [$w.c coords I21t] X1 Y1 X2 Y2
lassign {183 492 243 504} X1 Y1 X2 Y2
set f [expr {$step / double($numsteps)}]
set y2 [expr {$y2 - 3}]
set xx1 [expr {$x1 + ($X1 - $x1) * $f}]
set yy1 [expr {$y1 + ($Y1 - $y1) * $f}]
set xx2 [expr {$x2 + ($X2 - $x2) * $f}]
set yy2 [expr {$y2 + ($Y2 - $y2) * $f}]
#H2O $w $yy1 40
$w.c itemconfig I21b -fill $::C(20)
$w.c delete I21w
$w.c create poly $x2 $y2 $x1 $y1 $xx1 $yy1 $xx2 $yy1 -tag {I21 I21w} \
-outline {} -fill $::C(20)
$w.c lower I21w I21
$w.c raise I21b
$w.c lower I21f
return [expr {$step == $numsteps-1 ? 3 : 1}]
}
# Bucket drop
proc Draw22 {w} {
}
proc Move22 {w {step {}}} {
set step [GetStep 22 $step]
set pos {{213 513} {213 523} {213 543 x} {213 583} {213 593}}
if {$step == 0} {$w.c itemconfig I21f -fill $::C(22)}
if {$step >= [llength $pos]} {
return 0
}
set where [lindex $pos $step]
MoveAbs $w I21 $where
H2O $w [lindex $where 1] 40
$w.c delete I21_a ;# Delete handles
if {[lindex $where 2] eq "x"} {
return 3
}
return 1
}
# Blow dart
proc Draw23 {w} {
set color $::C(23a)
set color2 $::C(23b)
set color3 $::C(23c)
set xy {185 623 253 650} ;# Block
$w.c create rect $xy -fill black -outline $::C(fg) -width 2 -tag I23a
set xy {187 592 241 623} ;# Balloon
$w.c create oval $xy -outline {} -fill $color -tag I23b
$w.c create arc $xy -outline $::C(fg) -width 3 -tag I23b \
-style arc -start 12 -extent 336
set xy {239 604 258 589 258 625 239 610} ;# Balloon nozzle
$w.c create poly $xy -outline {} -fill $color -tag I23b
$w.c create line $xy -fill $::C(fg) -width 3 -tag I23b
set xy {285 611 250 603} ;# Dart body
$w.c create oval $xy -fill $color2 -outline $::C(fg) -width 3 -tag I23d
set xy {249 596 249 618 264 607 249 596} ;# Dart tail
$w.c create poly $xy -fill $color3 -outline $::C(fg) -width 3 -tag I23d
set xy {249 607 268 607} ;# Dart detail
$w.c create line $xy -fill $::C(fg) -width 3 -tag I23d
set xy {285 607 305 607} ;# Dart needle
$w.c create line $xy -fill $::C(fg) -width 3 -tag I23d
}
proc Move23 {w {step {}}} {
set step [GetStep 23 $step]
set pos {
{277 607} {287 607} {307 607 x} {347 607} {407 607} {487 607}
{587 607} {687 607} {787 607} {-100 -100}
}
if {$step >= [llength $pos]} {
return 0
}
if {$step <= 1} {
$w.c scale I23b {*}[Anchor $w I23a n] .9 .5
}
set where [lindex $pos $step]
MoveAbs $w I23d $where
if {[lindex $where 2] eq "x"} {
return 3
}
return 1
}
# Balloon
proc Draw24 {w} {
set color $::C(24a)
set xy {366 518 462 665} ;# Balloon
$w.c create oval $xy -fill $color -outline $::C(fg) -width 3 -tag I24
set xy {414 666 414 729} ;# String
$w.c create line $xy -fill $::C(fg) -width 3 -tag I24
set xy {410 666 404 673 422 673 418 666} ;# Nozzle
$w.c create poly $xy -fill $color -outline $::C(fg) -width 3 -tag I24
set xy {387 567 390 549 404 542} ;# Reflections
$w.c create line $xy -fill $::C(fg) -smooth 1 -width 2 -tag I24
set xy {395 568 399 554 413 547}
$w.c create line $xy -fill $::C(fg) -smooth 1 -width 2 -tag I24
set xy {403 570 396 555 381 553}
$w.c create line $xy -fill $::C(fg) -smooth 1 -width 2 -tag I24
set xy {408 564 402 547 386 545}
$w.c create line $xy -fill $::C(fg) -smooth 1 -width 2 -tag I24
}
proc Move24 {w {step {}}} {
global S
set step [GetStep 24 $step]
if {$step > 4} {
return 0
} elseif {$step == 4} {
return 2
}
if {$step == 0} {
$w.c delete I24 ;# Exploding balloon
set xy {
347 465 361 557 271 503 272 503 342 574 259 594 259 593 362 626
320 737 320 740 398 691 436 738 436 739 476 679 528 701 527 702
494 627 548 613 548 613 480 574 577 473 577 473 474 538 445 508
431 441 431 440 400 502 347 465 347 465
}
$w.c create poly $xy -tag I24 -fill $::C(24b) -outline $::C(24a) \
-width 10 -smooth 1
set msg [subst $S(message)]
$w.c create text [Centroid $w I24] -text $msg -tag {I24 I24t} \
-justify center -font {{Times Roman} 18 bold}
return 1
}
$w.c itemconfig I24t -font [list {Times Roman} [expr {18 + 6*$step}] bold]
$w.c move I24 0 -60
$w.c scale I24 {*}[Centroid $w I24] 1.25 1.25
return 1
}
# Displaying the message
proc Move25 {w {step {}}} {
global S
set step [GetStep 25 $step]
if {$step == 0} {
set ::XY(25) [clock clicks -milliseconds]
return 1
}
set elapsed [expr {[clock clicks -milliseconds] - $::XY(25)}]
if {$elapsed < 5000} {
return 1
}
return 2
}
# Collapsing balloon
proc Move26 {w {step {}}} {
global S
set step [GetStep 26 $step]
if {$step >= 3} {
$w.c delete I24 I26
$w.c create text 430 755 -anchor s -tag I26 \
-text "click to continue" -font {{Times Roman} 24 bold}
bind $w.c <1> [list Reset $w]
return 4
}
$w.c scale I24 {*}[Centroid $w I24] .8 .8
$w.c move I24 0 60
$w.c itemconfig I24t -font [list {Times Roman} [expr {30 - 6*$step}] bold]
return 1
}
################################################################
#
# Helper functions
#
proc box {x y r} {
return [list [expr {$x-$r}] [expr {$y-$r}] [expr {$x+$r}] [expr {$y+$r}]]
}
proc MoveAbs {w item xy} {
lassign $xy x y
lassign [Centroid $w $item] Ox Oy
set dx [expr {$x - $Ox}]
set dy [expr {$y - $Oy}]
$w.c move $item $dx $dy
}
proc RotateItem {w item Ox Oy beta} {
set xy [$w.c coords $item]
set xy2 {}
foreach {x y} $xy {
lappend xy2 {*}[RotateC $x $y $Ox $Oy $beta]
}
$w.c coords $item $xy2
}
proc RotateC {x y Ox Oy beta} {
# rotates vector (Ox,Oy)->(x,y) by beta degrees clockwise
set x [expr {$x - $Ox}] ;# Shift to origin
set y [expr {$y - $Oy}]
set beta [expr {$beta * atan(1) * 4 / 180.0}] ;# Radians
set xx [expr {$x * cos($beta) - $y * sin($beta)}] ;# Rotate
set yy [expr {$x * sin($beta) + $y * cos($beta)}]
set xx [expr {$xx + $Ox}] ;# Shift back
set yy [expr {$yy + $Oy}]
return [list $xx $yy]
}
proc Reset {w} {
global S
DrawAll $w
bind $w.c <1> {}
set S(mode) $::MSTART
set S(active) 0
}
# Each Move## keeps its state info in STEP, this retrieves and increments it
proc GetStep {who step} {
global STEP
if {$step ne ""} {
set STEP($who) $step
} elseif {![info exists STEP($who)] || $STEP($who) eq ""} {
set STEP($who) 0
} else {
incr STEP($who)
}
return $STEP($who)
}
proc ResetStep {} {
global STEP
set ::S(cnt) 0
foreach a [array names STEP] {
set STEP($a) ""
}
}
proc Sine {w x0 y0 x1 y1 amp freq args} {
set PI [expr {4 * atan(1)}]
set step 2
set xy {}
if {$y0 == $y1} { ;# Horizontal
for {set x $x0} {$x <= $x1} {incr x $step} {
set beta [expr {($x - $x0) * 2 * $PI / $freq}]
set y [expr {$y0 + $amp * sin($beta)}]
lappend xy $x $y
}
} else {
for {set y $y0} {$y <= $y1} {incr y $step} {
set beta [expr {($y - $y0) * 2 * $PI / $freq}]
set x [expr {$x0 + $amp * sin($beta)}]
lappend xy $x $y
}
}
return [$w.c create line $xy {*}$args]
}
proc RoundRect {w xy radius args} {
lassign $xy x0 y0 x3 y3
set r [winfo pixels $w.c $radius]
set d [expr {2 * $r}]
# Make sure that the radius of the curve is less than 3/8 size of the box!
set maxr 0.75
if {$d > $maxr * ($x3 - $x0)} {
set d [expr {$maxr * ($x3 - $x0)}]
}
if {$d > $maxr * ($y3 - $y0)} {
set d [expr {$maxr * ($y3 - $y0)}]
}
set x1 [expr { $x0 + $d }]
set x2 [expr { $x3 - $d }]
set y1 [expr { $y0 + $d }]
set y2 [expr { $y3 - $d }]
set xy [list $x0 $y0 $x1 $y0 $x2 $y0 $x3 $y0 $x3 $y1 $x3 $y2]
lappend xy $x3 $y3 $x2 $y3 $x1 $y3 $x0 $y3 $x0 $y2 $x0 $y1
return $xy
}
proc RoundPoly {canv xy radii args} {
set lenXY [llength $xy]
set lenR [llength $radii]
if {$lenXY != 2*$lenR} {
error "wrong number of vertices and radii"
}
set knots {}
lassign [lrange $xy end-1 end] x0 y0
lassign $xy x1 y1
lappend xy {*}[lrange $xy 0 1]
for {set i 0} {$i < $lenXY} {incr i 2} {
set radius [lindex $radii [expr {$i/2}]]
set r [winfo pixels $canv $radius]
lassign [lrange $xy [expr {$i + 2}] [expr {$i + 3}]] x2 y2
set z [_RoundPoly2 $x0 $y0 $x1 $y1 $x2 $y2 $r]
lappend knots {*}$z
lassign [list $x1 $y1] x0 y0
lassign [list $x2 $y2] x1 y1
}
set n [$canv create polygon $knots -smooth 1 {*}$args]
return $n
}
proc _RoundPoly2 {x0 y0 x1 y1 x2 y2 radius} {
set d [expr {2 * $radius}]
set maxr 0.75
set v1x [expr {$x0 - $x1}]
set v1y [expr {$y0 - $y1}]
set v2x [expr {$x2 - $x1}]
set v2y [expr {$y2 - $y1}]
set vlen1 [expr {sqrt($v1x*$v1x + $v1y*$v1y)}]
set vlen2 [expr {sqrt($v2x*$v2x + $v2y*$v2y)}]
if {$d > $maxr * $vlen1} {
set d [expr {$maxr * $vlen1}]
}
if {$d > $maxr * $vlen2} {
set d [expr {$maxr * $vlen2}]
}
lappend xy [expr {$x1 + $d * $v1x/$vlen1}] [expr {$y1 + $d * $v1y/$vlen1}]
lappend xy $x1 $y1
lappend xy [expr {$x1 + $d * $v2x/$vlen2}] [expr {$y1 + $d * $v2y/$vlen2}]
return $xy
}
proc Sparkle {w Oxy tag} {
set xy {299 283 298 302 295 314 271 331 239 310 242 292 256 274 281 273}
foreach {x y} $xy {
$w.c create line 271 304 $x $y -fill white -width 3 -tag $tag
}
MoveAbs $w $tag $Oxy
}
proc Centroid {w item} {
return [Anchor $w $item c]
}
proc Anchor {w item where} {
lassign [$w.c bbox $item] x1 y1 x2 y2
if {[string match *n* $where]} {
set y $y1
} elseif {[string match *s* $where]} {
set y $y2
} else {
set y [expr {($y1 + $y2) / 2.0}]
}
if {[string match *w* $where]} {
set x $x1
} elseif {[string match *e* $where]} {
set x $x2
} else {
set x [expr {($x1 + $x2) / 2.0}]
}
return [list $x $y]
}
DoDisplay $w
Reset $w
Go $w ;# Start everything going
demos/hello 0000755 00000001000 15170274642 0006703 0 ustar 00 #!/bin/sh
# the next line restarts using wish \
exec wish8.6 "$0" ${1+"$@"}
# hello --
# Simple Tk script to create a button that prints "Hello, world".
# Click on the button to terminate the program.
package require Tk
# The first line below creates the button, and the second line
# asks the packer to shrink-wrap the application's main window
# around the button.
button .hello -text "Hello, world" -command {
puts stdout "Hello, world"; destroy .
}
pack .hello
# Local Variables:
# mode: tcl
# End:
demos/hscale.tcl 0000644 00000002731 15170274642 0007631 0 ustar 00 # hscale.tcl --
#
# This demonstration script shows an example with a horizontal scale.
if {![info exists widgetDemo]} {
error "This script should be run from the \"widget\" demo."
}
package require Tk
set w .hscale
catch {destroy $w}
toplevel $w
wm title $w "Horizontal Scale Demonstration"
wm iconname $w "hscale"
positionWindow $w
label $w.msg -font $font -wraplength 3.5i -justify left -text "An arrow and a horizontal scale are displayed below. If you click or drag mouse button 1 in the scale, you can change the length of the arrow."
pack $w.msg -side top -padx .5c
## See Code / Dismiss buttons
set btns [addSeeDismiss $w.buttons $w]
pack $btns -side bottom -fill x
frame $w.frame -borderwidth 10
pack $w.frame -side top -fill x
canvas $w.frame.canvas -width 50 -height 50 -bd 0 -highlightthickness 0
$w.frame.canvas create polygon 0 0 1 1 2 2 -fill DeepSkyBlue3 -tags poly
$w.frame.canvas create line 0 0 1 1 2 2 0 0 -fill black -tags line
scale $w.frame.scale -orient horizontal -length 284 -from 0 -to 250 \
-command "setWidth $w.frame.canvas" -tickinterval 50
pack $w.frame.canvas -side top -expand yes -anchor s -fill x -padx 15
pack $w.frame.scale -side bottom -expand yes -anchor n
$w.frame.scale set 75
proc setWidth {w width} {
incr width 21
set x2 [expr {$width - 30}]
if {$x2 < 21} {
set x2 21
}
$w coords poly 20 15 20 35 $x2 35 $x2 45 $width 25 $x2 5 $x2 15 20 15
$w coords line 20 15 20 35 $x2 35 $x2 45 $width 25 $x2 5 $x2 15 20 15
}
demos/icon.tcl 0000644 00000004017 15170274642 0007321 0 ustar 00 # icon.tcl --
#
# This demonstration script creates a toplevel window containing
# buttons that display bitmaps instead of text.
if {![info exists widgetDemo]} {
error "This script should be run from the \"widget\" demo."
}
package require Tk
set w .icon
catch {destroy $w}
toplevel $w
wm title $w "Iconic Button Demonstration"
wm iconname $w "icon"
positionWindow $w
label $w.msg -font $font -wraplength 5i -justify left -text "This window shows three ways of using bitmaps or images in radiobuttons and checkbuttons. On the left are two radiobuttons, each of which displays a bitmap and an indicator. In the middle is a checkbutton that displays a different image depending on whether it is selected or not. On the right is a checkbutton that displays a single bitmap but changes its background color to indicate whether or not it is selected."
pack $w.msg -side top
## See Code / Dismiss buttons
set btns [addSeeDismiss $w.buttons $w]
pack $btns -side bottom -fill x
# Main widget program sets variable tk_demoDirectory
image create bitmap flagup \
-file [file join $tk_demoDirectory images flagup.xbm] \
-maskfile [file join $tk_demoDirectory images flagup.xbm]
image create bitmap flagdown \
-file [file join $tk_demoDirectory images flagdown.xbm] \
-maskfile [file join $tk_demoDirectory images flagdown.xbm]
frame $w.frame -borderwidth 10
pack $w.frame -side top
checkbutton $w.frame.b1 -image flagdown -selectimage flagup \
-indicatoron 0
$w.frame.b1 configure -selectcolor [$w.frame.b1 cget -background]
checkbutton $w.frame.b2 \
-bitmap @[file join $tk_demoDirectory images letters.xbm] \
-indicatoron 0 -selectcolor SeaGreen1
frame $w.frame.left
pack $w.frame.left $w.frame.b1 $w.frame.b2 -side left -expand yes -padx 5m
radiobutton $w.frame.left.b3 \
-bitmap @[file join $tk_demoDirectory images letters.xbm] \
-variable letters -value full
radiobutton $w.frame.left.b4 \
-bitmap @[file join $tk_demoDirectory images noletter.xbm] \
-variable letters -value empty
pack $w.frame.left.b3 $w.frame.left.b4 -side top -expand yes
demos/image1.tcl 0000644 00000001752 15170274642 0007537 0 ustar 00 # image1.tcl --
#
# This demonstration script displays two image widgets.
if {![info exists widgetDemo]} {
error "This script should be run from the \"widget\" demo."
}
package require Tk
set w .image1
catch {destroy $w}
toplevel $w
wm title $w "Image Demonstration #1"
wm iconname $w "Image1"
positionWindow $w
label $w.msg -font $font -wraplength 4i -justify left -text "This demonstration displays two images, each in a separate label widget."
pack $w.msg -side top
## See Code / Dismiss buttons
set btns [addSeeDismiss $w.buttons $w]
pack $btns -side bottom -fill x
# Main widget program sets variable tk_demoDirectory
catch {image delete image1a}
image create photo image1a -file [file join $tk_demoDirectory images earth.gif]
label $w.l1 -image image1a -bd 1 -relief sunken
catch {image delete image1b}
image create photo image1b \
-file [file join $tk_demoDirectory images earthris.gif]
label $w.l2 -image image1b -bd 1 -relief sunken
pack $w.l1 $w.l2 -side top -padx .5m -pady .5m
demos/image2.tcl 0000644 00000006430 15170274642 0007536 0 ustar 00 # image2.tcl --
#
# This demonstration script creates a simple collection of widgets
# that allow you to select and view images in a Tk label.
if {![info exists widgetDemo]} {
error "This script should be run from the \"widget\" demo."
}
package require Tk
# loadDir --
# This procedure reloads the directory listbox from the directory
# named in the demo's entry.
#
# Arguments:
# w - Name of the toplevel window of the demo.
proc loadDir w {
global dirName
$w.f.list delete 0 end
foreach i [lsort [glob -type f -directory $dirName *]] {
$w.f.list insert end [file tail $i]
}
}
# selectAndLoadDir --
# This procedure pops up a dialog to ask for a directory to load into
# the listobx and (if the user presses OK) reloads the directory
# listbox from the directory named in the demo's entry.
#
# Arguments:
# w - Name of the toplevel window of the demo.
proc selectAndLoadDir w {
global dirName
set dir [tk_chooseDirectory -initialdir $dirName -parent $w -mustexist 1]
if {$dir ne ""} {
set dirName $dir
loadDir $w
}
}
# loadImage --
# Given the name of the toplevel window of the demo and the mouse
# position, extracts the directory entry under the mouse and loads
# that file into a photo image for display.
#
# Arguments:
# w - Name of the toplevel window of the demo.
# x, y- Mouse position within the listbox.
proc loadImage {w x y} {
global dirName
set file [file join $dirName [$w.f.list get @$x,$y]]
if {[catch {
image2a configure -file $file
}]} then {
# Mark the file as not loadable
$w.f.list itemconfigure @$x,$y -bg \#c00000 -selectbackground \#ff0000
}
}
set w .image2
catch {destroy $w}
toplevel $w
wm title $w "Image Demonstration #2"
wm iconname $w "Image2"
positionWindow $w
label $w.msg -font $font -wraplength 4i -justify left -text "This demonstration allows you to view images using a Tk \"photo\" image. First type a directory name in the listbox, then type Return to load the directory into the listbox. Then double-click on a file name in the listbox to see that image."
pack $w.msg -side top
## See Code / Dismiss buttons
set btns [addSeeDismiss $w.buttons $w]
pack $btns -side bottom -fill x
frame $w.mid
pack $w.mid -fill both -expand 1
labelframe $w.dir -text "Directory:"
# Main widget program sets variable tk_demoDirectory
set dirName [file join $tk_demoDirectory images]
entry $w.dir.e -width 30 -textvariable dirName
button $w.dir.b -pady 0 -padx 2m -text "Select Dir." \
-command "selectAndLoadDir $w"
bind $w.dir.e <Return> "loadDir $w"
pack $w.dir.e -side left -fill both -padx 2m -pady 2m -expand true
pack $w.dir.b -side left -fill y -padx {0 2m} -pady 2m
labelframe $w.f -text "File:" -padx 2m -pady 2m
listbox $w.f.list -width 20 -height 10 -yscrollcommand "$w.f.scroll set"
ttk::scrollbar $w.f.scroll -command "$w.f.list yview"
pack $w.f.list $w.f.scroll -side left -fill y -expand 1
$w.f.list insert 0 earth.gif earthris.gif teapot.ppm
bind $w.f.list <Double-1> "loadImage $w %x %y"
catch {image delete image2a}
image create photo image2a
labelframe $w.image -text "Image:"
label $w.image.image -image image2a
pack $w.image.image -padx 2m -pady 2m
grid $w.dir - -sticky ew -padx 1m -pady 1m -in $w.mid
grid $w.f $w.image -sticky nw -padx 1m -pady 1m -in $w.mid
grid columnconfigure $w.mid 1 -weight 1
demos/items.tcl 0000644 00000023625 15170274642 0007520 0 ustar 00 # items.tcl --
#
# This demonstration script creates a canvas that displays the
# canvas item types.
if {![info exists widgetDemo]} {
error "This script should be run from the \"widget\" demo."
}
package require Tk
set w .items
catch {destroy $w}
toplevel $w
wm title $w "Canvas Item Demonstration"
wm iconname $w "Items"
positionWindow $w
set c $w.frame.c
label $w.msg -font $font -wraplength 5i -justify left -text "This window contains a canvas widget with examples of the various kinds of items supported by canvases. The following operations are supported:\n Button-1 drag:\tmoves item under pointer.\n Button-2 drag:\trepositions view.\n Button-3 drag:\tstrokes out area.\n Ctrl+f:\t\tprints items under area."
pack $w.msg -side top
## See Code / Dismiss buttons
set btns [addSeeDismiss $w.buttons $w]
pack $btns -side bottom -fill x
frame $w.frame
pack $w.frame -side top -fill both -expand yes
canvas $c -scrollregion {0c 0c 30c 24c} -width 15c -height 10c \
-relief sunken -borderwidth 2 \
-xscrollcommand "$w.frame.hscroll set" \
-yscrollcommand "$w.frame.vscroll set"
ttk::scrollbar $w.frame.vscroll -command "$c yview"
ttk::scrollbar $w.frame.hscroll -orient horiz -command "$c xview"
grid $c -in $w.frame \
-row 0 -column 0 -rowspan 1 -columnspan 1 -sticky news
grid $w.frame.vscroll \
-row 0 -column 1 -rowspan 1 -columnspan 1 -sticky news
grid $w.frame.hscroll \
-row 1 -column 0 -rowspan 1 -columnspan 1 -sticky news
grid rowconfig $w.frame 0 -weight 1 -minsize 0
grid columnconfig $w.frame 0 -weight 1 -minsize 0
# Display a 3x3 rectangular grid.
$c create rect 0c 0c 30c 24c -width 2
$c create line 0c 8c 30c 8c -width 2
$c create line 0c 16c 30c 16c -width 2
$c create line 10c 0c 10c 24c -width 2
$c create line 20c 0c 20c 24c -width 2
set font1 {Helvetica 12}
set font2 {Helvetica 24 bold}
if {[winfo depth $c] > 1} {
set blue DeepSkyBlue3
set red red
set bisque bisque3
set green SeaGreen3
} else {
set blue black
set red black
set bisque black
set green black
}
# Set up demos within each of the areas of the grid.
$c create text 5c .2c -text Lines -anchor n
$c create line 1c 1c 3c 1c 1c 4c 3c 4c -width 2m -fill $blue \
-cap butt -join miter -tags item
$c create line 4.67c 1c 4.67c 4c -arrow last -tags item
$c create line 6.33c 1c 6.33c 4c -arrow both -tags item
$c create line 5c 6c 9c 6c 9c 1c 8c 1c 8c 4.8c 8.8c 4.8c 8.8c 1.2c \
8.2c 1.2c 8.2c 4.6c 8.6c 4.6c 8.6c 1.4c 8.4c 1.4c 8.4c 4.4c \
-width 3 -fill $red -tags item
# Main widget program sets variable tk_demoDirectory
$c create line 1c 5c 7c 5c 7c 7c 9c 7c -width .5c \
-stipple @[file join $tk_demoDirectory images gray25.xbm] \
-arrow both -arrowshape {15 15 7} -tags item
$c create line 1c 7c 1.75c 5.8c 2.5c 7c 3.25c 5.8c 4c 7c -width .5c \
-cap round -join round -tags item
$c create text 15c .2c -text "Curves (smoothed lines)" -anchor n
$c create line 11c 4c 11.5c 1c 13.5c 1c 14c 4c -smooth on \
-fill $blue -tags item
$c create line 15.5c 1c 19.5c 1.5c 15.5c 4.5c 19.5c 4c -smooth on \
-arrow both -width 3 -tags item
$c create line 12c 6c 13.5c 4.5c 16.5c 7.5c 18c 6c \
16.5c 4.5c 13.5c 7.5c 12c 6c -smooth on -width 3m -cap round \
-stipple @[file join $tk_demoDirectory images gray25.xbm] \
-fill $red -tags item
$c create text 25c .2c -text Polygons -anchor n
$c create polygon 21c 1.0c 22.5c 1.75c 24c 1.0c 23.25c 2.5c \
24c 4.0c 22.5c 3.25c 21c 4.0c 21.75c 2.5c -fill $green \
-outline black -width 4 -tags item
$c create polygon 25c 4c 25c 4c 25c 1c 26c 1c 27c 4c 28c 1c \
29c 1c 29c 4c 29c 4c -fill $red -smooth on -tags item
$c create polygon 22c 4.5c 25c 4.5c 25c 6.75c 28c 6.75c \
28c 5.25c 24c 5.25c 24c 6.0c 26c 6c 26c 7.5c 22c 7.5c \
-stipple @[file join $tk_demoDirectory images gray25.xbm] \
-outline black -tags item
$c create text 5c 8.2c -text Rectangles -anchor n
$c create rectangle 1c 9.5c 4c 12.5c -outline $red -width 3m -tags item
$c create rectangle 0.5c 13.5c 4.5c 15.5c -fill $green -tags item
$c create rectangle 6c 10c 9c 15c -outline {} \
-stipple @[file join $tk_demoDirectory images gray25.xbm] \
-fill $blue -tags item
$c create text 15c 8.2c -text Ovals -anchor n
$c create oval 11c 9.5c 14c 12.5c -outline $red -width 3m -tags item
$c create oval 10.5c 13.5c 14.5c 15.5c -fill $green -tags item
$c create oval 16c 10c 19c 15c -outline {} \
-stipple @[file join $tk_demoDirectory images gray25.xbm] \
-fill $blue -tags item
$c create text 25c 8.2c -text Text -anchor n
$c create rectangle 22.4c 8.9c 22.6c 9.1c
$c create text 22.5c 9c -anchor n -font $font1 -width 4c \
-text "A short string of text, word-wrapped, justified left, and anchored north (at the top). The rectangles show the anchor points for each piece of text." -tags item
$c create rectangle 25.4c 10.9c 25.6c 11.1c
$c create text 25.5c 11c -anchor w -font $font1 -fill $blue \
-text "Several lines,\n each centered\nindividually,\nand all anchored\nat the left edge." \
-justify center -tags item
$c create rectangle 24.9c 13.9c 25.1c 14.1c
$c create text 25c 14c -font $font2 -anchor c -fill $red -angle 15 \
-text "Angled characters" -tags item
$c create text 5c 16.2c -text Arcs -anchor n
$c create arc 0.5c 17c 7c 20c -fill $green -outline black \
-start 45 -extent 270 -style pieslice -tags item
$c create arc 6.5c 17c 9.5c 20c -width 4m -style arc \
-outline $blue -start -135 -extent 270 -tags item \
-outlinestipple @[file join $tk_demoDirectory images gray25.xbm]
$c create arc 0.5c 20c 9.5c 24c -width 4m -style pieslice \
-fill {} -outline $red -start 225 -extent -90 -tags item
$c create arc 5.5c 20.5c 9.5c 23.5c -width 4m -style chord \
-fill $blue -outline {} -start 45 -extent 270 -tags item
image create photo items.ousterhout \
-file [file join $tk_demoDirectory images ouster.png]
image create photo items.ousterhout.active -format "png -alpha 0.5" \
-file [file join $tk_demoDirectory images ouster.png]
$c create text 15c 16.2c -text "Bitmaps and Images" -anchor n
$c create image 13c 20c -tags item -image items.ousterhout \
-activeimage items.ousterhout.active
$c create bitmap 17c 18.5c -tags item \
-bitmap @[file join $tk_demoDirectory images noletter.xbm]
$c create bitmap 17c 21.5c -tags item \
-bitmap @[file join $tk_demoDirectory images letters.xbm]
$c create text 25c 16.2c -text Windows -anchor n
button $c.button -text "Press Me" -command "butPress $c $red"
$c create window 21c 18c -window $c.button -anchor nw -tags item
entry $c.entry -width 20 -relief sunken
$c.entry insert end "Edit this text"
$c create window 21c 21c -window $c.entry -anchor nw -tags item
scale $c.scale -from 0 -to 100 -length 6c -sliderlength .4c \
-width .5c -tickinterval 0
$c create window 28.5c 17.5c -window $c.scale -anchor n -tags item
$c create text 21c 17.9c -text Button: -anchor sw
$c create text 21c 20.9c -text Entry: -anchor sw
$c create text 28.5c 17.4c -text Scale: -anchor s
# Set up event bindings for canvas:
$c bind item <Any-Enter> "itemEnter $c"
$c bind item <Any-Leave> "itemLeave $c"
bind $c <2> "$c scan mark %x %y"
bind $c <B2-Motion> "$c scan dragto %x %y"
bind $c <3> "itemMark $c %x %y"
bind $c <B3-Motion> "itemStroke $c %x %y"
bind $c <<NextChar>> "itemsUnderArea $c"
bind $c <1> "itemStartDrag $c %x %y"
bind $c <B1-Motion> "itemDrag $c %x %y"
# Utility procedures for highlighting the item under the pointer:
proc itemEnter {c} {
global restoreCmd
if {[winfo depth $c] == 1} {
set restoreCmd {}
return
}
set type [$c type current]
if {$type == "window" || $type == "image"} {
set restoreCmd {}
return
} elseif {$type == "bitmap"} {
set bg [lindex [$c itemconf current -background] 4]
set restoreCmd [list $c itemconfig current -background $bg]
$c itemconfig current -background SteelBlue2
return
} elseif {$type == "image"} {
set restoreCmd [list $c itemconfig current -state normal]
$c itemconfig current -state active
return
}
set fill [lindex [$c itemconfig current -fill] 4]
if {(($type == "rectangle") || ($type == "oval") || ($type == "arc"))
&& ($fill == "")} {
set outline [lindex [$c itemconfig current -outline] 4]
set restoreCmd "$c itemconfig current -outline $outline"
$c itemconfig current -outline SteelBlue2
} else {
set restoreCmd "$c itemconfig current -fill $fill"
$c itemconfig current -fill SteelBlue2
}
}
proc itemLeave {c} {
global restoreCmd
eval $restoreCmd
}
# Utility procedures for stroking out a rectangle and printing what's
# underneath the rectangle's area.
proc itemMark {c x y} {
global areaX1 areaY1
set areaX1 [$c canvasx $x]
set areaY1 [$c canvasy $y]
$c delete area
}
proc itemStroke {c x y} {
global areaX1 areaY1 areaX2 areaY2
set x [$c canvasx $x]
set y [$c canvasy $y]
if {($areaX1 != $x) && ($areaY1 != $y)} {
$c delete area
$c addtag area withtag [$c create rect $areaX1 $areaY1 $x $y \
-outline black]
set areaX2 $x
set areaY2 $y
}
}
proc itemsUnderArea {c} {
global areaX1 areaY1 areaX2 areaY2
set area [$c find withtag area]
set items ""
foreach i [$c find enclosed $areaX1 $areaY1 $areaX2 $areaY2] {
if {[lsearch [$c gettags $i] item] != -1} {
lappend items $i
}
}
puts stdout "Items enclosed by area: $items"
set items ""
foreach i [$c find overlapping $areaX1 $areaY1 $areaX2 $areaY2] {
if {[lsearch [$c gettags $i] item] != -1} {
lappend items $i
}
}
puts stdout "Items overlapping area: $items"
}
set areaX1 0
set areaY1 0
set areaX2 0
set areaY2 0
# Utility procedures to support dragging of items.
proc itemStartDrag {c x y} {
global lastX lastY
set lastX [$c canvasx $x]
set lastY [$c canvasy $y]
}
proc itemDrag {c x y} {
global lastX lastY
set x [$c canvasx $x]
set y [$c canvasy $y]
$c move current [expr {$x-$lastX}] [expr {$y-$lastY}]
set lastX $x
set lastY $y
}
# Procedure that's invoked when the button embedded in the canvas
# is invoked.
proc butPress {w color} {
set i [$w create text 25c 18.1c -text "Oooohhh!!" -fill $color -anchor n]
after 500 "$w delete $i"
}
demos/ixset 0000755 00000017604 15170274642 0006755 0 ustar 00 #!/bin/sh
# the next line restarts using wish \
exec wish8.6 "$0" ${1+"$@"}
# ixset --
# A nice interface to "xset" to change X server settings
#
# History :
# 91/11/23 : pda@masi.ibp.fr, jt@ratp.fr : design
# 92/08/01 : pda@masi.ibp.fr : cleaning
package require Tk
#
# Button actions
#
proc quit {} {
destroy .
}
proc ok {} {
writesettings
quit
}
proc cancel {} {
readsettings
dispsettings
.buttons.apply configure -state disabled
.buttons.cancel configure -state disabled
}
proc apply {} {
writesettings
.buttons.apply configure -state disabled
.buttons.cancel configure -state disabled
}
#
# Read current settings
#
proc readsettings {} {
global kbdrep ; set kbdrep "on"
global kbdcli ; set kbdcli 0
global bellvol ; set bellvol 100
global bellpit ; set bellpit 440
global belldur ; set belldur 100
global mouseacc ; set mouseacc "3/1"
global mousethr ; set mousethr 4
global screenbla ; set screenbla "blank"
global screentim ; set screentim 600
global screencyc ; set screencyc 600
set xfd [open "|xset q" r]
while {[gets $xfd line] > -1} {
switch -- [lindex $line 0] {
auto {
set rpt [lindex $line 1]
if {$rpt eq "repeat:"} {
set kbdrep [lindex $line 2]
set kbdcli [lindex $line 6]
}
}
bell {
set bellvol [lindex $line 2]
set bellpit [lindex $line 5]
set belldur [lindex $line 8]
}
acceleration: {
set mouseacc [lindex $line 1]
set mousethr [lindex $line 3]
}
prefer {
set bla [lindex $line 2]
set screenbla [expr {$bla eq "yes" ? "blank" : "noblank"}]
}
timeout: {
set screentim [lindex $line 1]
set screencyc [lindex $line 3]
}
}
}
close $xfd
# puts stdout [format "Key REPEAT = %s\n" $kbdrep]
# puts stdout [format "Key CLICK = %s\n" $kbdcli]
# puts stdout [format "Bell VOLUME = %s\n" $bellvol]
# puts stdout [format "Bell PITCH = %s\n" $bellpit]
# puts stdout [format "Bell DURATION = %s\n" $belldur]
# puts stdout [format "Mouse ACCELERATION = %s\n" $mouseacc]
# puts stdout [format "Mouse THRESHOLD = %s\n" $mousethr]
# puts stdout [format "Screen BLANCK = %s\n" $screenbla]
# puts stdout [format "Screen TIMEOUT = %s\n" $screentim]
# puts stdout [format "Screen CYCLE = %s\n" $screencyc]
}
#
# Write settings into the X server
#
proc writesettings {} {
global kbdrep kbdcli bellvol bellpit belldur
global mouseacc mousethr screenbla screentim screencyc
set bellvol [.bell.vol get]
set bellpit [.bell.val.pit.entry get]
set belldur [.bell.val.dur.entry get]
if {$kbdrep eq "on"} {
set kbdcli [.kbd.val.cli get]
} else {
set kbdcli "off"
}
set mouseacc [.mouse.hor.acc.entry get]
set mousethr [.mouse.hor.thr.entry get]
set screentim [.screen.tim.entry get]
set screencyc [.screen.cyc.entry get]
exec xset \
b $bellvol $bellpit $belldur \
c $kbdcli \
r $kbdrep \
m $mouseacc $mousethr \
s $screentim $screencyc \
s $screenbla
}
#
# Sends all settings to the window
#
proc dispsettings {} {
global kbdrep kbdcli bellvol bellpit belldur
global mouseacc mousethr screenbla screentim screencyc
.bell.vol set $bellvol
.bell.val.pit.entry delete 0 end
.bell.val.pit.entry insert 0 $bellpit
.bell.val.dur.entry delete 0 end
.bell.val.dur.entry insert 0 $belldur
.kbd.val.onoff [expr {$kbdrep eq "on" ? "select" : "deselect"}]
.kbd.val.cli set $kbdcli
.mouse.hor.acc.entry delete 0 end
.mouse.hor.acc.entry insert 0 $mouseacc
.mouse.hor.thr.entry delete 0 end
.mouse.hor.thr.entry insert 0 $mousethr
.screen.blank [expr {$screenbla eq "blank" ? "select" : "deselect"}]
.screen.pat [expr {$screenbla ne "blank" ? "select" : "deselect"}]
.screen.tim.entry delete 0 end
.screen.tim.entry insert 0 $screentim
.screen.cyc.entry delete 0 end
.screen.cyc.entry insert 0 $screencyc
}
#
# Create all windows, and pack them
#
proc labelentry {path text length {range {}}} {
frame $path
label $path.label -text $text
if {[llength $range]} {
spinbox $path.entry -width $length -relief sunken \
-from [lindex $range 0] -to [lindex $range 1]
} else {
entry $path.entry -width $length -relief sunken
}
pack $path.label -side left
pack $path.entry -side right -expand y -fill x
}
proc createwindows {} {
#
# Buttons
#
frame .buttons
button .buttons.ok -default active -command ok -text "Ok"
button .buttons.apply -default normal -command apply -text "Apply" \
-state disabled
button .buttons.cancel -default normal -command cancel -text "Cancel" \
-state disabled
button .buttons.quit -default normal -command quit -text "Quit"
pack .buttons.ok .buttons.apply .buttons.cancel .buttons.quit \
-side left -expand yes -pady 5
bind . <Return> {.buttons.ok flash; .buttons.ok invoke}
bind . <Escape> {.buttons.quit flash; .buttons.quit invoke}
bind . <1> {
if {![string match .buttons* %W]} {
.buttons.apply configure -state normal
.buttons.cancel configure -state normal
}
}
bind . <Key> {
if {![string match .buttons* %W]} {
switch -glob %K {
Return - Escape - Tab - *Shift* {}
default {
.buttons.apply configure -state normal
.buttons.cancel configure -state normal
}
}
}
}
#
# Bell settings
#
labelframe .bell -text "Bell Settings" -padx 1.5m -pady 1.5m
scale .bell.vol \
-from 0 -to 100 -length 200 -tickinterval 20 \
-label "Volume (%)" -orient horizontal
frame .bell.val
labelentry .bell.val.pit "Pitch (Hz)" 6 {25 20000}
labelentry .bell.val.dur "Duration (ms)" 6 {1 10000}
pack .bell.val.pit -side left -padx 5
pack .bell.val.dur -side right -padx 5
pack .bell.vol .bell.val -side top -expand yes
#
# Keyboard settings
#
labelframe .kbd -text "Keyboard Repeat Settings" -padx 1.5m -pady 1.5m
frame .kbd.val
checkbutton .kbd.val.onoff \
-text "On" \
-onvalue "on" -offvalue "off" -variable kbdrep \
-relief flat
scale .kbd.val.cli \
-from 0 -to 100 -length 200 -tickinterval 20 \
-label "Click Volume (%)" -orient horizontal
pack .kbd.val.onoff -side left -fill x -expand yes -padx {0 1m}
pack .kbd.val.cli -side left -expand yes -fill x -padx {1m 0}
pack .kbd.val -side top -expand yes -pady 2 -fill x
#
# Mouse settings
#
labelframe .mouse -text "Mouse Settings" -padx 1.5m -pady 1.5m
frame .mouse.hor
labelentry .mouse.hor.acc "Acceleration" 5
labelentry .mouse.hor.thr "Threshold (pixels)" 3 {1 2000}
pack .mouse.hor.acc -side left -padx {0 1m}
pack .mouse.hor.thr -side right -padx {1m 0}
pack .mouse.hor -side top -expand yes
#
# Screen Saver settings
#
labelframe .screen -text "Screen-saver Settings" -padx 1.5m -pady 1.5m
radiobutton .screen.blank \
-variable screenblank -text "Blank" -relief flat \
-value "blank" -variable screenbla -anchor w
radiobutton .screen.pat \
-variable screenblank -text "Pattern" -relief flat \
-value "noblank" -variable screenbla -anchor w
labelentry .screen.tim "Timeout (s)" 5 {1 100000}
labelentry .screen.cyc "Cycle (s)" 5 {1 100000}
grid .screen.blank .screen.tim -sticky e
grid .screen.pat .screen.cyc -sticky e
grid configure .screen.blank .screen.pat -sticky ew
#
# Main window
#
pack .buttons -side top -fill both
pack .bell .kbd .mouse .screen -side top -fill both -expand yes \
-padx 1m -pady 1m
#
# Let the user resize our window
#
wm minsize . 10 10
}
##############################################################################
# Main program
#
# Listen what "xset" tells us...
#
readsettings
#
# Create all windows
#
createwindows
#
# Write xset parameters
#
dispsettings
#
# Now, wait for user actions...
#
# Local Variables:
# mode: tcl
# End:
demos/knightstour.tcl 0000644 00000021664 15170274642 0010761 0 ustar 00 # Copyright (C) 2008 Pat Thoyts <patthoyts@users.sourceforge.net>
#
# Calculate a Knight's tour of a chessboard.
#
# This uses Warnsdorff's rule to calculate the next square each
# time. This specifies that the next square should be the one that
# has the least number of available moves.
#
# Using this rule it is possible to get to a position where
# there are no squares available to move into. In this implementation
# this occurs when the starting square is d6.
#
# To solve this fault an enhancement to the rule is that if we
# have a choice of squares with an equal score, we should choose
# the one nearest the edge of the board.
#
# If the call to the Edgemost function is commented out you can see
# this occur.
#
# You can drag the knight to a specific square to start if you wish.
# If you let it repeat then it will choose random start positions
# for each new tour.
package require Tk 8.5
# Return a list of accessible squares from a given square
proc ValidMoves {square} {
set moves {}
foreach pair {{-1 -2} {-2 -1} {-2 1} {-1 2} {1 2} {2 1} {2 -1} {1 -2}} {
set col [expr {($square % 8) + [lindex $pair 0]}]
set row [expr {($square / 8) + [lindex $pair 1]}]
if {$row > -1 && $row < 8 && $col > -1 && $col < 8} {
lappend moves [expr {$row * 8 + $col}]
}
}
return $moves
}
# Return the number of available moves for this square
proc CheckSquare {square} {
variable visited
set moves 0
foreach test [ValidMoves $square] {
if {[lsearch -exact -integer $visited $test] == -1} {
incr moves
}
}
return $moves
}
# Select the next square to move to. Returns -1 if there are no available
# squares remaining that we can move to.
proc Next {square} {
variable visited
set minimum 9
set nextSquare -1
foreach testSquare [ValidMoves $square] {
if {[lsearch -exact -integer $visited $testSquare] == -1} {
set count [CheckSquare $testSquare]
if {$count < $minimum} {
set minimum $count
set nextSquare $testSquare
} elseif {$count == $minimum} {
# to remove the enhancement to Warnsdorff's rule
# remove the next line:
set nextSquare [Edgemost $nextSquare $testSquare]
}
}
}
return $nextSquare
}
# Select the square nearest the edge of the board
proc Edgemost {a b} {
set colA [expr {3-int(abs(3.5-($a%8)))}]
set colB [expr {3-int(abs(3.5-($b%8)))}]
set rowA [expr {3-int(abs(3.5-($a/8)))}]
set rowB [expr {3-int(abs(3.5-($b/8)))}]
return [expr {($colA * $rowA) < ($colB * $rowB) ? $a : $b}]
}
# Display a square number as a standard chess square notation.
proc N {square} {
return [format %c%d [expr {97 + $square % 8}] \
[expr {$square / 8 + 1}]]
}
# Perform a Knight's move and schedule the next move.
proc MovePiece {dlg last square} {
variable visited
variable delay
variable continuous
$dlg.f.txt insert end "[llength $visited]. [N $last] .. [N $square]\n" {}
$dlg.f.txt see end
$dlg.f.c itemconfigure [expr {1+$last}] -state normal -outline black
$dlg.f.c itemconfigure [expr {1+$square}] -state normal -outline red
$dlg.f.c moveto knight {*}[lrange [$dlg.f.c coords [expr {1+$square}]] 0 1]
lappend visited $square
set next [Next $square]
if {$next ne -1} {
variable aid [after $delay [list MovePiece $dlg $square $next]]
} else {
$dlg.tf.b1 configure -state normal
if {[llength $visited] == 64} {
variable initial
if {$initial == $square} {
$dlg.f.txt insert end "Closed tour!"
} else {
$dlg.f.txt insert end "Success\n" {}
if {$continuous} {
after [expr {$delay * 2}] [namespace code \
[list Tour $dlg [expr {int(rand() * 64)}]]]
}
}
} else {
$dlg.f.txt insert end "FAILED!\n" {}
}
}
}
# Begin a new tour of the board given a random start position
proc Tour {dlg {square {}}} {
variable visited {}
$dlg.f.txt delete 1.0 end
$dlg.tf.b1 configure -state disabled
for {set n 0} {$n < 64} {incr n} {
$dlg.f.c itemconfigure $n -state disabled -outline black
}
if {$square eq {}} {
set coords [lrange [$dlg.f.c coords knight] 0 1]
set square [expr {[$dlg.f.c find closest {*}$coords 0 65]-1}]
}
variable initial $square
after idle [list MovePiece $dlg $initial $initial]
}
proc Stop {} {
variable aid
catch {after cancel $aid}
}
proc Exit {dlg} {
Stop
destroy $dlg
}
proc SetDelay {new} {
variable delay [expr {int($new)}]
}
proc DragStart {w x y} {
$w dtag selected
$w addtag selected withtag current
variable dragging [list $x $y]
}
proc DragMotion {w x y} {
variable dragging
if {[info exists dragging]} {
$w move selected [expr {$x - [lindex $dragging 0]}] \
[expr {$y - [lindex $dragging 1]}]
variable dragging [list $x $y]
}
}
proc DragEnd {w x y} {
set square [$w find closest $x $y 0 65]
$w moveto selected {*}[lrange [$w coords $square] 0 1]
$w dtag selected
variable dragging ; unset dragging
}
proc CreateGUI {} {
catch {destroy .knightstour}
set dlg [toplevel .knightstour]
wm title $dlg "Knights tour"
wm withdraw $dlg
set f [ttk::frame $dlg.f]
set c [canvas $f.c -width 240 -height 240]
text $f.txt -width 10 -height 1 -background white \
-yscrollcommand [list $f.vs set] -font {Arial 8}
ttk::scrollbar $f.vs -command [list $f.txt yview]
variable delay 600
variable continuous 0
ttk::frame $dlg.tf
ttk::label $dlg.tf.ls -text Speed
ttk::scale $dlg.tf.sc -from 8 -to 2000 -command [list SetDelay] \
-variable [namespace which -variable delay]
ttk::checkbutton $dlg.tf.cc -text Repeat \
-variable [namespace which -variable continuous]
ttk::button $dlg.tf.b1 -text Start -command [list Tour $dlg]
ttk::button $dlg.tf.b2 -text Exit -command [list Exit $dlg]
set square 0
for {set row 7} {$row != -1} {incr row -1} {
for {set col 0} {$col < 8} {incr col} {
if {(($col & 1) ^ ($row & 1))} {
set fill tan3 ; set dfill tan4
} else {
set fill bisque ; set dfill bisque3
}
set coords [list [expr {$col * 30 + 4}] [expr {$row * 30 + 4}] \
[expr {$col * 30 + 30}] [expr {$row * 30 + 30}]]
$c create rectangle $coords -fill $fill -disabledfill $dfill \
-width 2 -state disabled
}
}
if {[tk windowingsystem] ne "x11"} {
catch {eval font create KnightFont -size -24}
$c create text 0 0 -font KnightFont -text "\u265e" \
-anchor nw -tags knight -fill black -activefill "#600000"
} else {
# On X11 we cannot reliably tell if the \u265e glyph is available
# so just use a polygon
set pts {
2 25 24 25 21 19 20 8 14 0 10 0 0 13 0 16
2 17 4 14 5 15 3 17 5 17 9 14 10 15 5 21
}
$c create polygon $pts -tag knight -offset 8 \
-fill black -activefill "#600000"
}
$c moveto knight {*}[lrange [$c coords [expr {1 + int(rand() * 64)}]] 0 1]
$c bind knight <ButtonPress-1> [namespace code [list DragStart %W %x %y]]
$c bind knight <Motion> [namespace code [list DragMotion %W %x %y]]
$c bind knight <ButtonRelease-1> [namespace code [list DragEnd %W %x %y]]
grid $c $f.txt $f.vs -sticky news
grid rowconfigure $f 0 -weight 1
grid columnconfigure $f 1 -weight 1
grid $f - - - - - -sticky news
set things [list $dlg.tf.ls $dlg.tf.sc $dlg.tf.cc $dlg.tf.b1]
if {![info exists ::widgetDemo]} {
lappend things $dlg.tf.b2
if {[tk windowingsystem] ne "aqua"} {
set things [linsert $things 0 [ttk::sizegrip $dlg.tf.sg]]
}
}
pack {*}$things -side right
if {[tk windowingsystem] eq "aqua"} {
pack configure {*}$things -padx {4 4} -pady {12 12}
pack configure [lindex $things 0] -padx {4 24}
pack configure [lindex $things end] -padx {16 4}
}
grid $dlg.tf - - - - - -sticky ew
if {[info exists ::widgetDemo]} {
grid [addSeeDismiss $dlg.buttons $dlg] - - - - - -sticky ew
}
grid rowconfigure $dlg 0 -weight 1
grid columnconfigure $dlg 0 -weight 1
bind $dlg <Control-F2> {console show}
bind $dlg <Return> [list $dlg.tf.b1 invoke]
bind $dlg <Escape> [list $dlg.tf.b2 invoke]
bind $dlg <Destroy> [namespace code [list Stop]]
wm protocol $dlg WM_DELETE_WINDOW [namespace code [list Exit $dlg]]
wm deiconify $dlg
tkwait window $dlg
}
if {![winfo exists .knightstour]} {
if {![info exists widgetDemo]} { wm withdraw . }
set r [catch [linsert $argv 0 CreateGUI] err]
if {$r} {
tk_messageBox -icon error -title "Error" -message $err
}
if {![info exists widgetDemo]} { exit $r }
}
demos/label.tcl 0000644 00000002543 15170274642 0007452 0 ustar 00 # label.tcl --
#
# This demonstration script creates a toplevel window containing
# several label widgets.
if {![info exists widgetDemo]} {
error "This script should be run from the \"widget\" demo."
}
package require Tk
set w .label
catch {destroy $w}
toplevel $w
wm title $w "Label Demonstration"
wm iconname $w "label"
positionWindow $w
label $w.msg -font $font -wraplength 4i -justify left -text "Five labels are displayed below: three textual ones on the left, and an image label and a text label on the right. Labels are pretty boring because you can't do anything with them."
pack $w.msg -side top
## See Code / Dismiss buttons
set btns [addSeeDismiss $w.buttons $w]
pack $btns -side bottom -fill x
frame $w.left
frame $w.right
pack $w.left $w.right -side left -expand yes -padx 10 -pady 10 -fill both
label $w.left.l1 -text "First label"
label $w.left.l2 -text "Second label, raised" -relief raised
label $w.left.l3 -text "Third label, sunken" -relief sunken
pack $w.left.l1 $w.left.l2 $w.left.l3 -side top -expand yes -pady 2 -anchor w
# Main widget program sets variable tk_demoDirectory
image create photo label.ousterhout \
-file [file join $tk_demoDirectory images ouster.png]
label $w.right.picture -borderwidth 2 -relief sunken -image label.ousterhout
label $w.right.caption -text "Tcl/Tk Creator"
pack $w.right.picture $w.right.caption -side top
demos/labelframe.tcl 0000644 00000003467 15170274642 0010473 0 ustar 00 # labelframe.tcl --
#
# This demonstration script creates a toplevel window containing
# several labelframe widgets.
if {![info exists widgetDemo]} {
error "This script should be run from the \"widget\" demo."
}
package require Tk
set w .labelframe
catch {destroy $w}
toplevel $w
wm title $w "Labelframe Demonstration"
wm iconname $w "labelframe"
positionWindow $w
# Some information
label $w.msg -font $font -wraplength 4i -justify left -text "Labelframes are\
used to group related widgets together. The label may be either \
plain text or another widget."
pack $w.msg -side top
## See Code / Dismiss buttons
set btns [addSeeDismiss $w.buttons $w]
pack $btns -side bottom -fill x
# Demo area
frame $w.f
pack $w.f -side bottom -fill both -expand 1
set w $w.f
# A group of radiobuttons in a labelframe
labelframe $w.f -text "Value" -padx 2 -pady 2
grid $w.f -row 0 -column 0 -pady 2m -padx 2m
foreach value {1 2 3 4} {
radiobutton $w.f.b$value -text "This is value $value" \
-variable lfdummy -value $value
pack $w.f.b$value -side top -fill x -pady 2
}
# Using a label window to control a group of options.
proc lfEnableButtons {w} {
foreach child [winfo children $w] {
if {$child == "$w.cb"} continue
if {$::lfdummy2} {
$child configure -state normal
} else {
$child configure -state disabled
}
}
}
labelframe $w.f2 -pady 2 -padx 2
checkbutton $w.f2.cb -text "Use this option." -variable lfdummy2 \
-command "lfEnableButtons $w.f2" -padx 0
$w.f2 configure -labelwidget $w.f2.cb
grid $w.f2 -row 0 -column 1 -pady 2m -padx 2m
set t 0
foreach str {Option1 Option2 Option3} {
checkbutton $w.f2.b$t -text $str
pack $w.f2.b$t -side top -fill x -pady 2
incr t
}
lfEnableButtons $w.f2
grid columnconfigure $w {0 1} -weight 1
demos/license.terms 0000644 00000004333 15170274642 0010364 0 ustar 00 This software is copyrighted by the Regents of the University of
California, Sun Microsystems, Inc., Scriptics Corporation, ActiveState
Corporation, Apple Inc. and other parties. The following terms apply to
all files associated with the software unless explicitly disclaimed in
individual files.
The authors hereby grant permission to use, copy, modify, distribute,
and license this software and its documentation for any purpose, provided
that existing copyright notices are retained in all copies and that this
notice is included verbatim in any distributions. No written agreement,
license, or royalty fee is required for any of the authorized uses.
Modifications to this software may be copyrighted by their authors
and need not follow the licensing terms described here, provided that
the new terms are clearly indicated on the first page of each file where
they apply.
IN NO EVENT SHALL THE AUTHORS OR DISTRIBUTORS BE LIABLE TO ANY PARTY
FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
ARISING OUT OF THE USE OF THIS SOFTWARE, ITS DOCUMENTATION, OR ANY
DERIVATIVES THEREOF, EVEN IF THE AUTHORS HAVE BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
THE AUTHORS AND DISTRIBUTORS SPECIFICALLY DISCLAIM ANY WARRANTIES,
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE, 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.
GOVERNMENT USE: If you are acquiring this software on behalf of the
U.S. government, the Government shall have only "Restricted Rights"
in the software and related documentation as defined in the Federal
Acquisition Regulations (FARs) in Clause 52.227.19 (c) (2). If you
are acquiring the software on behalf of the Department of Defense, the
software shall be classified as "Commercial Computer Software" and the
Government shall have only "Restricted Rights" as defined in Clause
252.227-7013 (b) (3) of DFARs. Notwithstanding the foregoing, the
authors grant the U.S. Government and others acting in its behalf
permission to use and distribute the software in accordance with the
terms specified in this license.
demos/menu.tcl 0000644 00000015172 15170274642 0007341 0 ustar 00 # menu.tcl --
#
# This demonstration script creates a window with a bunch of menus
# and cascaded menus using menubars.
if {![info exists widgetDemo]} {
error "This script should be run from the \"widget\" demo."
}
package require Tk
set w .menu
catch {destroy $w}
toplevel $w
wm title $w "Menu Demonstration"
wm iconname $w "menu"
positionWindow $w
label $w.msg -font $font -wraplength 4i -justify left
if {[tk windowingsystem] eq "aqua"} {
catch {set origUseCustomMDEF $::tk::mac::useCustomMDEF; set ::tk::mac::useCustomMDEF 1}
$w.msg configure -text "This window has a menubar with cascaded menus. You can invoke entries with an accelerator by typing Command+x, where \"x\" is the character next to the command key symbol. The rightmost menu can be torn off into a palette by selecting the first item in the menu."
} else {
$w.msg configure -text "This window contains a menubar with cascaded menus. You can post a menu from the keyboard by typing Alt+x, where \"x\" is the character underlined on the menu. You can then traverse among the menus using the arrow keys. When a menu is posted, you can invoke the current entry by typing space, or you can invoke any entry by typing its underlined character. If a menu entry has an accelerator, you can invoke the entry without posting the menu just by typing the accelerator. The rightmost menu can be torn off into a palette by selecting the first item in the menu."
}
pack $w.msg -side top
set menustatus " "
frame $w.statusBar
label $w.statusBar.label -textvariable menustatus -relief sunken -bd 1 -font "Helvetica 10" -anchor w
pack $w.statusBar.label -side left -padx 2 -expand yes -fill both
pack $w.statusBar -side bottom -fill x -pady 2
## See Code / Dismiss buttons
set btns [addSeeDismiss $w.buttons $w]
pack $btns -side bottom -fill x
menu $w.menu -tearoff 0
set m $w.menu.file
menu $m -tearoff 0
$w.menu add cascade -label "File" -menu $m -underline 0
$m add command -label "Open..." -command {error "this is just a demo: no action has been defined for the \"Open...\" entry"}
$m add command -label "New" -command {error "this is just a demo: no action has been defined for the \"New\" entry"}
$m add command -label "Save" -command {error "this is just a demo: no action has been defined for the \"Save\" entry"}
$m add command -label "Save As..." -command {error "this is just a demo: no action has been defined for the \"Save As...\" entry"}
$m add separator
$m add command -label "Print Setup..." -command {error "this is just a demo: no action has been defined for the \"Print Setup...\" entry"}
$m add command -label "Print..." -command {error "this is just a demo: no action has been defined for the \"Print...\" entry"}
$m add separator
$m add command -label "Dismiss Menus Demo" -command "destroy $w"
set m $w.menu.basic
$w.menu add cascade -label "Basic" -menu $m -underline 0
menu $m -tearoff 0
$m add command -label "Long entry that does nothing"
if {[tk windowingsystem] eq "aqua"} {
set modifier Command
} elseif {[tk windowingsystem] == "win32"} {
set modifier Control
} else {
set modifier Meta
}
foreach i {A B C D E F} {
$m add command -label "Print letter \"$i\"" -underline 14 \
-accelerator Meta+$i -command "puts $i" -accelerator $modifier+$i
bind $w <$modifier-[string tolower $i]> "puts $i"
}
set m $w.menu.cascade
$w.menu add cascade -label "Cascades" -menu $m -underline 0
menu $m -tearoff 0
$m add command -label "Print hello" \
-command {puts stdout "Hello"} -accelerator $modifier+H -underline 6
bind $w <$modifier-h> {puts stdout "Hello"}
$m add command -label "Print goodbye" -command {\
puts stdout "Goodbye"} -accelerator $modifier+G -underline 6
bind $w <$modifier-g> {puts stdout "Goodbye"}
$m add cascade -label "Check buttons" \
-menu $w.menu.cascade.check -underline 0
$m add cascade -label "Radio buttons" \
-menu $w.menu.cascade.radio -underline 0
set m $w.menu.cascade.check
menu $m -tearoff 0
$m add check -label "Oil checked" -variable oil
$m add check -label "Transmission checked" -variable trans
$m add check -label "Brakes checked" -variable brakes
$m add check -label "Lights checked" -variable lights
$m add separator
$m add command -label "Show current values" \
-command "showVars $w.menu.cascade.dialog oil trans brakes lights"
$m invoke 1
$m invoke 3
set m $w.menu.cascade.radio
menu $m -tearoff 0
$m add radio -label "10 point" -variable pointSize -value 10
$m add radio -label "14 point" -variable pointSize -value 14
$m add radio -label "18 point" -variable pointSize -value 18
$m add radio -label "24 point" -variable pointSize -value 24
$m add radio -label "32 point" -variable pointSize -value 32
$m add sep
$m add radio -label "Roman" -variable style -value roman
$m add radio -label "Bold" -variable style -value bold
$m add radio -label "Italic" -variable style -value italic
$m add sep
$m add command -label "Show current values" \
-command "showVars $w.menu.cascade.dialog pointSize style"
$m invoke 1
$m invoke 7
set m $w.menu.icon
$w.menu add cascade -label "Icons" -menu $m -underline 0
menu $m -tearoff 0
# Main widget program sets variable tk_demoDirectory
image create photo lilearth -file [file join $tk_demoDirectory \
images earthmenu.png]
$m add command -image lilearth \
-hidemargin 1 -command [list \
tk_dialog $w.pattern {Bitmap Menu Entry} \
"The menu entry you invoked displays a photoimage rather than\
a text string. Other than this, it is just like any other\
menu entry." {} 0 OK ]
foreach i {info questhead error} {
$m add command -bitmap $i -hidemargin 1 -command [list \
puts "You invoked the $i bitmap" ]
}
$m entryconfigure 2 -columnbreak 1
set m $w.menu.more
$w.menu add cascade -label "More" -menu $m -underline 0
menu $m -tearoff 0
foreach i {{An entry} {Another entry} {Does nothing} {Does almost nothing} {Make life meaningful}} {
$m add command -label $i -command [list puts "You invoked \"$i\""]
}
$m entryconfigure "Does almost nothing" -bitmap questhead -compound left \
-command [list \
tk_dialog $w.compound {Compound Menu Entry} \
"The menu entry you invoked displays both a bitmap and a\
text string. Other than this, it is just like any other\
menu entry." {} 0 OK ]
set m $w.menu.colors
$w.menu add cascade -label "Colors" -menu $m -underline 1
menu $m -tearoff 1
foreach i {red orange yellow green blue} {
$m add command -label $i -background $i -command [list \
puts "You invoked \"$i\"" ]
}
$w configure -menu $w.menu
bind Menu <<MenuSelect>> {
global $menustatus
if {[catch {%W entrycget active -label} label]} {
set label " "
}
set menustatus $label
update idletasks
}
if {[tk windowingsystem] eq "aqua"} {catch {set ::tk::mac::useCustomMDEF $origUseCustomMDEF}}
demos/msgbox.tcl 0000644 00000003716 15170274642 0007675 0 ustar 00 # msgbox.tcl --
#
# This demonstration script creates message boxes of various type
if {![info exists widgetDemo]} {
error "This script should be run from the \"widget\" demo."
}
package require Tk
set w .msgbox
catch {destroy $w}
toplevel $w
wm title $w "Message Box Demonstration"
wm iconname $w "messagebox"
positionWindow $w
label $w.msg -font $font -wraplength 4i -justify left -text "Choose the icon and type option of the message box. Then press the \"Message Box\" button to see the message box."
pack $w.msg -side top
pack [addSeeDismiss $w.buttons $w {} {
ttk::button $w.buttons.vars -text "Message Box" -command "showMessageBox $w"
}] -side bottom -fill x
#pack $w.buttons.dismiss $w.buttons.code $w.buttons.vars -side left -expand 1
frame $w.left
frame $w.right
pack $w.left $w.right -side left -expand yes -fill y -pady .5c -padx .5c
label $w.left.label -text "Icon"
frame $w.left.sep -relief ridge -bd 1 -height 2
pack $w.left.label -side top
pack $w.left.sep -side top -fill x -expand no
set msgboxIcon info
foreach i {error info question warning} {
radiobutton $w.left.b$i -text $i -variable msgboxIcon \
-relief flat -value $i -width 16 -anchor w
pack $w.left.b$i -side top -pady 2 -anchor w -fill x
}
label $w.right.label -text "Type"
frame $w.right.sep -relief ridge -bd 1 -height 2
pack $w.right.label -side top
pack $w.right.sep -side top -fill x -expand no
set msgboxType ok
foreach t {abortretryignore ok okcancel retrycancel yesno yesnocancel} {
radiobutton $w.right.$t -text $t -variable msgboxType \
-relief flat -value $t -width 16 -anchor w
pack $w.right.$t -side top -pady 2 -anchor w -fill x
}
proc showMessageBox {w} {
global msgboxIcon msgboxType
set button [tk_messageBox -icon $msgboxIcon -type $msgboxType \
-title Message -parent $w\
-message "This is a \"$msgboxType\" type messagebox with the \"$msgboxIcon\" icon"]
tk_messageBox -icon info -message "You have selected \"$button\"" -type ok\
-parent $w
}
demos/paned1.tcl 0000644 00000002126 15170274642 0007540 0 ustar 00 # paned1.tcl --
#
# This demonstration script creates a toplevel window containing
# a paned window that separates two windows horizontally.
if {![info exists widgetDemo]} {
error "This script should be run from the \"widget\" demo."
}
package require Tk
set w .paned1
catch {destroy $w}
toplevel $w
wm title $w "Horizontal Paned Window Demonstration"
wm iconname $w "paned1"
positionWindow $w
label $w.msg -font $font -wraplength 4i -justify left -text "The sash between the two coloured windows below can be used to divide the area between them. Use the left mouse button to resize without redrawing by just moving the sash, and use the middle mouse button to resize opaquely (always redrawing the windows in each position.)"
pack $w.msg -side top
## See Code / Dismiss buttons
set btns [addSeeDismiss $w.buttons $w]
pack $btns -side bottom -fill x
panedwindow $w.pane
pack $w.pane -side top -expand yes -fill both -pady 2 -padx 2m
label $w.pane.left -text "This is the\nleft side" -bg yellow
label $w.pane.right -text "This is the\nright side" -bg cyan
$w.pane add $w.pane.left $w.pane.right
demos/pendulum.tcl 0000644 00000016654 15170274642 0010234 0 ustar 00 # pendulum.tcl --
#
# This demonstration illustrates how Tcl/Tk can be used to construct
# simulations of physical systems.
if {![info exists widgetDemo]} {
error "This script should be run from the \"widget\" demo."
}
package require Tk
set w .pendulum
catch {destroy $w}
toplevel $w
wm title $w "Pendulum Animation Demonstration"
wm iconname $w "pendulum"
positionWindow $w
label $w.msg -font $font -wraplength 4i -justify left -text "This demonstration shows how Tcl/Tk can be used to carry out animations that are linked to simulations of physical systems. In the left canvas is a graphical representation of the physical system itself, a simple pendulum, and in the right canvas is a graph of the phase space of the system, which is a plot of the angle (relative to the vertical) against the angular velocity. The pendulum bob may be repositioned by clicking and dragging anywhere on the left canvas."
pack $w.msg
## See Code / Dismiss buttons
set btns [addSeeDismiss $w.buttons $w]
pack $btns -side bottom -fill x
# Create some structural widgets
pack [panedwindow $w.p] -fill both -expand 1
$w.p add [labelframe $w.p.l1 -text "Pendulum Simulation"]
$w.p add [labelframe $w.p.l2 -text "Phase Space"]
# Create the canvas containing the graphical representation of the
# simulated system.
canvas $w.c -width 320 -height 200 -background white -bd 2 -relief sunken
$w.c create text 5 5 -anchor nw -text "Click to Adjust Bob Start Position"
# Coordinates of these items don't matter; they will be set properly below
$w.c create line 0 25 320 25 -tags plate -fill grey50 -width 2
$w.c create oval 155 20 165 30 -tags pivot -fill grey50 -outline {}
$w.c create line 1 1 1 1 -tags rod -fill black -width 3
$w.c create oval 1 1 2 2 -tags bob -fill yellow -outline black
pack $w.c -in $w.p.l1 -fill both -expand true
# Create the canvas containing the phase space graph; this consists of
# a line that gets gradually paler as it ages, which is an extremely
# effective visual trick.
canvas $w.k -width 320 -height 200 -background white -bd 2 -relief sunken
$w.k create line 160 200 160 0 -fill grey75 -arrow last -tags y_axis
$w.k create line 0 100 320 100 -fill grey75 -arrow last -tags x_axis
for {set i 90} {$i>=0} {incr i -10} {
# Coordinates of these items don't matter; they will be set properly below
$w.k create line 0 0 1 1 -smooth true -tags graph$i -fill grey$i
}
$w.k create text 0 0 -anchor ne -text "\u03b8" -tags label_theta
$w.k create text 0 0 -anchor ne -text "\u03b4\u03b8" -tags label_dtheta
pack $w.k -in $w.p.l2 -fill both -expand true
# Initialize some variables
set points {}
set Theta 45.0
set dTheta 0.0
set pi 3.1415926535897933
set length 150
set home 160
# This procedure makes the pendulum appear at the correct place on the
# canvas. If the additional arguments "at $x $y" are passed (the 'at'
# is really just syntactic sugar) instead of computing the position of
# the pendulum from the length of the pendulum rod and its angle, the
# length and angle are computed in reverse from the given location
# (which is taken to be the centre of the pendulum bob.)
proc showPendulum {canvas {at {}} {x {}} {y {}}} {
global Theta dTheta pi length home
if {$at eq "at" && ($x!=$home || $y!=25)} {
set dTheta 0.0
set x2 [expr {$x - $home}]
set y2 [expr {$y - 25}]
set length [expr {hypot($x2, $y2)}]
set Theta [expr {atan2($x2, $y2) * 180/$pi}]
} else {
set angle [expr {$Theta * $pi/180}]
set x [expr {$home + $length*sin($angle)}]
set y [expr {25 + $length*cos($angle)}]
}
$canvas coords rod $home 25 $x $y
$canvas coords bob \
[expr {$x-15}] [expr {$y-15}] [expr {$x+15}] [expr {$y+15}]
}
showPendulum $w.c
# Update the phase-space graph according to the current angle and the
# rate at which the angle is changing (the first derivative with
# respect to time.)
proc showPhase {canvas} {
global Theta dTheta points psw psh
lappend points [expr {$Theta+$psw}] [expr {-20*$dTheta+$psh}]
if {[llength $points] > 100} {
set points [lrange $points end-99 end]
}
for {set i 0} {$i<100} {incr i 10} {
set list [lrange $points end-[expr {$i-1}] end-[expr {$i-12}]]
if {[llength $list] >= 4} {
$canvas coords graph$i $list
}
}
}
# Set up some bindings on the canvases. Note that when the user
# clicks we stop the animation until they release the mouse
# button. Also note that both canvases are sensitive to <Configure>
# events, which allows them to find out when they have been resized by
# the user.
bind $w.c <Destroy> {
after cancel $animationCallbacks(pendulum)
unset animationCallbacks(pendulum)
}
bind $w.c <1> {
after cancel $animationCallbacks(pendulum)
showPendulum %W at %x %y
}
bind $w.c <B1-Motion> {
showPendulum %W at %x %y
}
bind $w.c <ButtonRelease-1> {
showPendulum %W at %x %y
set animationCallbacks(pendulum) [after 15 repeat [winfo toplevel %W]]
}
bind $w.c <Configure> {
%W coords plate 0 25 %w 25
set home [expr %w/2]
%W coords pivot [expr $home-5] 20 [expr $home+5] 30
}
bind $w.k <Configure> {
set psh [expr %h/2]
set psw [expr %w/2]
%W coords x_axis 2 $psh [expr %w-2] $psh
%W coords y_axis $psw [expr %h-2] $psw 2
%W coords label_dtheta [expr $psw-4] 6
%W coords label_theta [expr %w-6] [expr $psh+4]
}
# This procedure is the "business" part of the simulation that does
# simple numerical integration of the formula for a simple rotational
# pendulum.
proc recomputeAngle {} {
global Theta dTheta pi length
set scaling [expr {3000.0/$length/$length}]
# To estimate the integration accurately, we really need to
# compute the end-point of our time-step. But to do *that*, we
# need to estimate the integration accurately! So we try this
# technique, which is inaccurate, but better than doing it in a
# single step. What we really want is bound up in the
# differential equation:
# .. - sin theta
# theta + theta = -----------
# length
# But my math skills are not good enough to solve this!
# first estimate
set firstDDTheta [expr {-sin($Theta * $pi/180)*$scaling}]
set midDTheta [expr {$dTheta + $firstDDTheta}]
set midTheta [expr {$Theta + ($dTheta + $midDTheta)/2}]
# second estimate
set midDDTheta [expr {-sin($midTheta * $pi/180)*$scaling}]
set midDTheta [expr {$dTheta + ($firstDDTheta + $midDDTheta)/2}]
set midTheta [expr {$Theta + ($dTheta + $midDTheta)/2}]
# Now we do a double-estimate approach for getting the final value
# first estimate
set midDDTheta [expr {-sin($midTheta * $pi/180)*$scaling}]
set lastDTheta [expr {$midDTheta + $midDDTheta}]
set lastTheta [expr {$midTheta + ($midDTheta + $lastDTheta)/2}]
# second estimate
set lastDDTheta [expr {-sin($lastTheta * $pi/180)*$scaling}]
set lastDTheta [expr {$midDTheta + ($midDDTheta + $lastDDTheta)/2}]
set lastTheta [expr {$midTheta + ($midDTheta + $lastDTheta)/2}]
# Now put the values back in our globals
set dTheta $lastDTheta
set Theta $lastTheta
}
# This method ties together the simulation engine and the graphical
# display code that visualizes it.
proc repeat w {
global animationCallbacks
# Simulate
recomputeAngle
# Update the display
showPendulum $w.c
showPhase $w.k
# Reschedule ourselves
set animationCallbacks(pendulum) [after 15 [list repeat $w]]
}
# Start the simulation after a short pause
set animationCallbacks(pendulum) [after 500 [list repeat $w]]
demos/images/earth.gif 0000644 00000145000 15170274642 0010722 0 ustar 00 GIF87a@� � �� ( (( 00(88(88(@80@@0@H0@H8@80H@0HH0H88H@8HH8HP8HX8HH@HP@HX@H`@H80P@0P88P@8PH8PP8P@@PH@PP@PX@P`@PPHPXHP`HPhHP88X@8XH8XP8X@@XH@XP@XX@XHHXPHXXHX`HXhHXXPX`PXhPXpPXhXX@@`H@`P@`HH`PH`XH``H`PP`XP``P`hP`pP``X`hX`pX`xX`p``x``H@hHHhPHhXHh`HhPPhXPh`PhhPhpPhXXh`XhhXhpXhxXhh`hp`hx`h�`hxhh�hh�hhPPpXPp`PpXXp`XphXppXph`pp`px`p�`pphpxhp�hp�hp�hp�pp�pp�pp�pp�xp�xpPPxXXx`XxhXxh`xp`xx`xphxxhx�hx�hxxpx�px�px�px�px�xx�xx�xx�xx��x��x��x��xh`�ph�xh�xp��p��p��x��x��x��x��x�����������������������������x��x��x����������������������������������������������������������������������������������������������������������������������������������Ȩ�Ȱ�������Ȩ����Ȱ�а�и�Ȱ�ȸ�и������ȸ�ȸ�и�� , @� � 0X@� ��
4@��B�:<� �
D|HAC�+~l8`cńD "G�Z� �X����/��s�+Z̘�ٯ_�x���S`Uy�괩0H|��3�
���ηP��6gN�.�0���&�����]�v���]t:F�6m��o�
&lA�e0\H��h�i1D��C�b���5�4`�A��9< 3�J�N�,X���C" ��H�'�$��4�|>����9c�x�#
P��1֫�/�II�J/U��U}�,Ք|��ҋ+�P�$x��E�evYN,�fq���ESc$*�Wc���!v�tمVaT��]T�Ze��ڐ��f�l�m@�k�ep��E)���5g%q9�\K�T�Dx9\�Ids$0���%�vY
$'��i@y�B�0�0#�5�8�+�X�J%��� ,�0��3� #��}2��5�\C�}X5�+���d�v�igݨ�`n)�_�l��㉍��@�.��Z��EcZ����4֕��l�XZh�+dZ��k���$٤oR��. $�x5�� DqyQṯTfC+UW����M��$ӹk҄/h� ����4�6��5��B�%����'�dB!�d�q,���-�t� 0�D��6�`�L0̼bU~��R/�����aX�Z8���[;KXdg��@�kqX��K�u|l��1�t����Zh�Z��U�A��Җm����o��q
���ed/���Q��o/@�M��J�"��x��$Pax����3�T�L��L3M4�3i+��L+�\�q#��~�(�|2�,�RL5洓8�h��8�g��3�830���p!^�@�:Q��I4�oU_�MH۔V^��]� E�L�ָR�V��,j�)l�ӆ-Jr+e����0��Kb���l��rg����_�9@��S��I�.�%P��U����F9�A�q���@�5�A�X���`
a F�Nu8L�'шD|B��0G9�a;qp�w&�3���l<���,z�
^P�<�@O����
/�� � ��h��U�����5-G
��
���%Z�K͐��3�XlD[�x���7tL��9�J���7�`�����$�5�9��Np�~!�� U�
XP���0 �^���X���Axb�H�#Rw�~���,��
n1� �7��[����8��f���YZ��fM�3uq^��(�
�F�1Z�3�O}���t�Ϥ��I�.��!�O6ԪMْ������R��"�U��AD<-��� ��ܚ����- �6�JUb��P�0_Ģ��C ��>�a
m�2?�Q5y@f�z
d&"�HF:�qi����8�Q
n|�������f,��Ђ8p� F-mi�����J|M{˭~�W� F�D� ht���k;��AU�5��F4Y�Ml4�?�Q�Q�K�:���&"u�-�H-ы]
����9e���r�@ �"\+��AO���1h� OX��`�� �G��8EtOq�<�ay`�vW'h8C���.�эj����F9�юr�����5��WZ͏v��t�hgli�;��}��0�gӸ��H`U�q�gX���F��}�oԆ��ą_��w�EQvAD���,�<��t� ^�йʓ��"'xџT��� �+�Q�lHü� &S�+Յ�OmD���j����-Fqc�N��;�Q�f�#��9xW�lbì@��h��TM0nQ�*�Pڥ%� 44W�Ѕ���i"�O�4Z:�@i�f�m�H�c��h?�z�7��ۼ����̍��ߪ��$Ān�DA� �)D5f ma� W�"���UV1 L�B׀�5�*�*��ʐ�2`��<<5��T]R��CcH#���d!�Z�ΐ��!fw�C��2���J�,�UUe�ע[-������[�(3:�@� � 4���N�egf����cl�6�R8\�j��RN���@@������W��#�:�� r*�1fh��F1��eK[��a�Ug
k ]�&! QO���}D����=;xP�(Tg�]p��8/4���w�������cTT!��~gd#��L3�ʉ�̢�kUp4Lf�����٣A_�,�f�6��ԛAgE��Ss,�������8I���v����� ���@���:�6��p�җ����c�I�� ��'ۏ0E�U���x�1G���OY�����vx���xʧP���B�[Z@9×��1D�)��j�>�q�l�>C�OC2i�5-�H����$lS��z�!�b,g�.�A@��Z��/��0� ��A�p����n���W�U�
��eK�t�P|��
�f^Fv��q`b`��C��u�l�f�Y�
��֠�
�3
�0
`���� cF�@Y�� dQij�#>�*Op+�B�E*`��x7,�!�o�Os�>���, G"?��iI�?P�-��"��I
�%T,WQncj\rI�q��H�a7�/@�
�`�p
� �0�gh��{��]���^7|�DT`Fpa�v��m��C�|��0
�` <� �
�P� g�P���<� �& 7��O�gX���=�
�_m�`�f=o�h��,�-
�y���$��?q0�Z��H�j����z�Fb�� �Z)�j��Rc� � ��t���@��U�(�|Og
�W�C7�TcG0G`CB�TUfeNG}K���pTy��0��
��`�@�@�`�0����� 3�V��g�� S#;�gvv�3�t1Gi!���,�B!"?�wH��y5�8��.Q��1c�r��E /vrqA[b� ��
�`H�e����X�� ��?�tӇ�7Ąm@EZ�]v0نtM�Է]���0
��
�H��D��
��
�3��?�)� �_�Q��4�r�#�"Jsptd�۹*���g�b���{y��pi-�"6�rGH��"
�&��b�E7��j�"''e7�Gs/�
������8f��u?X|[e
E���Ier�g0LL�TŔ�ְ�@�ζ]Rh
W�
�P�@D��� �
��&��03�3VT�O�Q5KW�F,Dz}�hw�7��G=U����$-�a��6.fT�a��&b[m� �z� ��/ �r��!�! ��c@���ڡ��{� �`�:}c�����F0E X�u�f
�����E ��{��
�� 1��
�Ъ�`S�P� 27�
��
3�Z�W�!��O�O$b#�`�1�#v����a=;aXr�*�I#�s?j#%^����2��)R�r��#'sj��8� �q�3w�
��ӥ]<h|��l���MmɀGP8�P}�`]�`�p|�Ry��ʋI� `z���| |Ъ�� �P����
���� 3�@ �6���ohqRF4}�*��h�QX��!h��्��K*yJZ�gYQ��kl�z�z��7ɦ�GR
1c�.� � ^��TJu���m�W��ȯ�e]Rm�0Qp9���p
�`� ���Kŋ��z`ip���Ъ��
�j �0��0��
��
'[��(pG��""`}Xt�h�XX�h�J�Wg@�I?uy�G�VH0t��tC����ci��0Q X��Qc�3?��^�d��r@L�z�L����u9�� �09 ``
4�]b�{ć�9���j`�+�}�S�@ �* � ��
�� �� ����J�� Iq�xȏ�ҳsp��`wp��b�2,Zc$��������W�´e%"�$�I�?�r�ë �P�ư�&�ר�5���T�5�H��`�p�h��tu��܆Tm�`�W�jP�� ��
��\ }p��k �� \� $�J��
�y e�opeJ�p�_�A>�sx0,����`��>��B-Պ5e�6��a����T��&L%9zފ%�/����)�İ�6�;ʩs]��]�%a�����B���T�؛�FP�TPePg`Tl�z���
�P�ż�[�X� �` �� '���[+X�q8a�S�����L��"qƺ�d�u�X[�G���;�N��,�b"b�g��Ia���j3w4�d�)4<���Ч��; �c�P a`Ѧ���P
y�x�l����lr�]�Cp��d R0U�ePS�����`�^L��\̒ '� ��J��
n��iA�bT�u��lq�}�!L*Pva��u!��O�fiYS-�;Y�ȈQc�% ꘉ�I��I!���k7A"�^P� ޖdg;�O��ѩ|��L�m��� �P� ��
3L]>� m`XPFPT`V@S0e@U�˾,f�� ��
}���
�����K��P �����J��ƪ�c�͓N�l5�ԏ�W��X;[G ƞ��!�s���q��$�� +h�b����!z:'�TR1Q*�#��0��3LÓ�]�{I'�=ʃ������]��:�p���p1X�W�K`�S �}P���m�f��d�W�~��@ �� ����k�ƌ��
�� ��ۨD H0!j�rq6b���l!GO�A/k�ϽG��`�a��y %�Z�Jbܚr8��:����A[8Ű���Ϧ���9��a��=�]�> �;�p�u��:��e�L�B�F��ZE��~�y�ppT`�k�˽|�@ ���� ����
���}���< ۈ �P��AD���L�y�gR�n�h���k�܄�,�g��̂��"�~�������hz]���
�YyA�Y~zJ.������9���]7�����u]�u�cp
�Ђ]���LP����]0Lx�ӵl�P
�����X��7�pS0K`g@~g��P �|p[�pװ ��
��,> ��`4�
��B���o��gYm�sE'A��Ȳ`��>���F���d�^�aq
Aar/f4!Q��������� 0�
Ġ�.X�`+�.�a���-�]o�P ��.���uN�0��v����� ����u'��S`W�fPY��o�i0���p ���
��JWlۓ�
�` � ������Ple|W�K�>г#�3�ٙ`8��B@��fP�Q�ǀ`s�`hy�ޗ�b(����Q� s�izR�
���U���K�a`�����]�~�^�>�Pp]R�:���|��H��Po �on�j�jоj�� ���
U�H��H�*Oʹ�;w�תU�x�2�J� D^x �A�"M����(�L��Bʙ%D���fM�x�T��&�"1����i�N3p��!�Lx���a�]0�lX�.(���Y�e�:V-��2`PR�%V���u��aĉ/n�q�<vƄ ��e(L~@�f��.�?4� ���);]�0YM:��<�?2e͚1c�v%
��aj��C��$A���D�O�L���I���&K��H��P�B��(Q�l[9sڮ�����*T�x� �>S�5_B�)��Dz�'��`&�XЂFʀ��0�����J����P�����.��+D��+��X�D�0k,��&�dd����˂.���;̘�SF�>#�����2̘`��2��J�4�a�u��טx
GJa���0%�FF���"+R1&��8��?�(�+����?8y�N��7Ԁ�K��C�4���;�bH@��r�ن�s����R�ύ�Ͽ�n�৮`u ��^��U�N��Wa5��� Xʦ�dЩ/TV�4�`��F|ˁ�J,���*�Z��E�,jG�Q�h��`���H#�<��ߚ�,J)E��v��4&��R̉�s�h�-M�FYn1�0a�SLI�����1�*���5�d�7��"
9Ta�
?��"�>��4�@�꾋D�����DM��F�q��l��SS1��˯&�X�6��d� �Q�il[��`l��0¥,lC��j���KķN��E߲�� ����p_ꀒ^��melC�7����D"{m�zK��}��a`З��|x�R�1��v�#�<���M>y�LSdi�Y���;VL�(c
)�X�6@Ʉ+F>c�5�PC5�Ï?��4���= გIa��l��a�цR7�(>=Bh�$�V����'&1��ت���?� ��� Y`K�R�!E�*p��h�-�M-
��\�%�� �.|1�KdD��x@�pF6��8kH�HyH�l*����Aa��`�|���sAa�~�t:]4ц0ĢSz�2���6�B���"�ЈG�b���bLј������@��F�� �/h! Z��7�o
|�á �(=�A��D&A�=���0�<��x���xF0�a���>)��}�6 ��
@ J�B6��MW2�OJ�f^�A�zJT�v��h �\����B���ny!a]H�j�(.
�QYH�B�<`n�E3����7���'"#�1�3���� �%,`�
V���/��t��-q=�\t!BPf��#�!�4�9��-0��Ɲ�F��1��2a
U�B���&hao�� )ꔁj���J���D�J�Bh}�!�!
u�#��;��_�DEQ9 ��k�]� W5 �e���N~���V�L�`�nR��)EC�������"��"�@�Z]�QW��X�$YHE3�q$~�����l��$;l�2P�����A6x�
N��@t���>C'�� 0`�F��<Xl�SF�
c�[�����'0&$#=.���AhP���E(��p�5�
o�%�@�F��~0Cx�@TID�|�� 0�W$�R�G=�1�p���/:�
I�@�k�N�:�Dl����5��2?kS+wR�
T�*ls�������v9�7E"n��n|������-H�So(�6����h�yR&3\������@K���ز
a��|�����W�@��ޢ����E'j�]�B��F�T�[4�H����#d�Y��������z� �`�l�}�$�JH����#A`4�G�Aw�#�XE*V���(B� ���+P,�k
hl#��Q
$l%��Ō�ܢ�������=a�����E���\^�T ʐ�˭f!=�E����e�T�O���.0y�x`�#�%��cLbi\�O������.�Q�]��i�;ea
p�F�`IGQ
�8��J���p�7�a
{P��`h�N�V�C�ڻ�3����"f��A�Bg(���`�XB��o�uh�10*"57x`*v��V֠�l�� 쓟Z)(lk����A��e�
���5ͻ��n�Taa\�qɘ�+�!
ih�0�`�.~�wdz
��weXSZ(C!x�L�0�:�a��. ��D�"�(�-LQ
B����n��c0��0�(Fz�<�"�YG<�|�[@T7�6�%�p�#$a�k��ܠC���R ����7�AjD ��9�B
���*$Q�3�a���$*�
nH���<��_hV����,��: ɕ��%^� a��_я�����I��x�H
cI�Ðpa!n !�����Ċ�1��hё��,XgP�;�5��OX�[��. �6�0P�',��#�}aBЅ]X[(D@��KOȅb�D�MH�d a`��ӄC�0`0�X�cx�OPs�d�
:�X3eh.ܐ Z��!�AR#Ђ?��L2)��9P��$�)0��J��7��J�4�;B�K�A�?�H`?�O��n�x��v0�kX���H�?@��[��U�p��H
�a����5a�
J��1s�����0A�8�kA�i����1�I��1B�S8�D�C�H�|0�/�:X�PH�#H�(����iPFp.0D�X�9 �C�j�gQ�O@G��%x<x\����[��n�"��]8��8I��c3j�#�"�9!���Y30*Ȃ0 ?P�-�o�Z��5Ȃ� *��TH�* -0�Ѓ>��>*�b4c�Exp�o`a�Ō����K���5�X����0��%�0��a@�a��X��h��H�8�����;2�i¶�&�ˑ�\����Y��:s"�[��JBp�<x�.|SC6���Rh�˰'<`�jP�b�d�Y`<hDh�L8�C�G�[�g�Q�O�OXF��3�O(�hp�Px[Xq�/�#:�9�K>�F��@� !h�*��#�8P�3p��j@f���8�+��70�>�� ��1P��4�9��>?�M�3spu`Y �kH�����5@�T&]s�8;X9�i��� �˝@ƾ4
�+�1�1���Y�p,i;�����jy����x
��T ��O�d�"1�.p��C�F�]�F�)q�ePs0�n��h��\�O8�E@R B6h�6�O�g��O�[ Q��PX<�CRh1]c�R 7k��n��2E����Q(�D�H� ����� ��+�#��+:�>848��I��,��H�7��YZ`��2��@���@ �O`�m �W��ˈ#�A��$H|�V"ѬQ�����ډ�� dT�\ۉA
�������cڊȌ0iq l�,L���"E�4sq� ��gp[H���L`6��8�z�8 ;0M] �}�(�k�sX�[p����`ȄE0NQ��1��#�MOȄ6h�C�RhMdXyn �pX�䍃�F�3���eHISX�m��I�HO�p*h*��G$� � ��,p"�D�z�&P38��+H8�b�e��b�K83(�K��BЄWh�f��k�]��X�F$��� �%}�- �� �p�K� `����+�M����s �k�h+Rċ��;����Xa��X �N�L�#��8�6�>�N �X ��F`�NXs�Rh�b��d D�dHM(�tpp��%8�!P0�M F�|��xk@�r��1h�RX��3Bh�D(�upe�u��{��%��/�%$!��1�\03 ��*)�Z#p�؋C<�*�D3���a�a9Іf�y؇{xmX�@�=(5�䐄Ah��W�i؆qp�a��T�UP�U(�8�%��Y"�^�+RƲ�b� X�������l�����Jl��ٛ�HL��;f���TȪV��Z�C��.��`.�G��Z�\�a����8Q���d��h�[pY��Fp�1p4+9P[�X�# �:`�G�{Ȇ|��S�K�=u��]@&)kp�]X�|�?4X��:0:`�+H�$�K�j��(�*0A�'�g�-@:(_�A�/�p�/(:x�7(@�/Єi�} �| �_��q�48��M�VPM`�
�.��:���% ����p%� r];2�W26����06��Ѹ�ײ���
R�,��b,9!���� �\�N�K @P/IƃC��8`E@�i�X��XЅj0Ƴ�]xHiЅ�#kM�D�D@�f�i�{HdH�f ��e�-�h��|�}�[��Pe>kH�S�s�QX�nX{�Kx�-й-p'���ԄE��PX�z�[8P�b��mJX�f�A��k �ixz��Y�'8�@H�j�އ}("v5�?��U��IPahT����T��A��$
��Z9�^�5��8��0A�a Qi��Wdi6���� G��K,�H �D�$��
�5���U�j@��A�@h���6�<ȅv Z G�z�Yh;�j pu�b0b(�]�p��{@�j��a��H�P��qp�y����P�
+b��Ƀ�=k(�6R�x�Mȁ/�8��- D�8ȄL�G�C(z�ip,8U�9�r`q�Om�t��w�}Phx��s@m(�D0�x��}��FWh|��9�N�nIO�K؈���km5T�C �7H�_t�㟛X �� �j�3.���
�b���1Y�^؋���n�������4 ���0��I�@��[��?�1�o�XE�o��l�%�G8�t����O ,��Rh�嚇{؇y�Pz�x��LPx�1 G�n� ��\��rK<e8��8�[c��Մ<0�E ��O*xU#H�G�L@����l�I�,0�:j��{�lh,�w�y�f�}��r�O��}gtF�v�Z ��9�?�3�WSL8L��&0�� ���[j0���� �Wa����]Y����@x% 3�����od��l�i� �¡���T�I؞��: c���p@Kh�Q�M�,�0x��5Yi�68�X�;�zz0x�x�q�{��6`0��<9�SpwH}�|�n�q0�O�8B(Z�!~S�`
��y �#p�+�_ �?�d��zx
f�!`�C�{�v�oH_��rhg�Oh!�lĨ��vo_�}��I��.�Mj����T�6F�$�R�T�Ra:���0<��僘1]Z�)s4mVp0s� ش���ΗG_ּ`4��20`�`��,`��+��p%�k�^�NP[umծ8x� ^�PI�4�O?���V1Y�4с#��:��\��fK(Z��ɓV�X+E������3{��YSϚ8Y���3���,��<y��؇�\�G�d-[�n�,y��Y�Θ�{����P<��!��'4Fz�ⶮ=w��(�$�V�z��rV.-����4ӈS�A�<��8��Cρ
)4�5�t�N0�2�+��e &�tXIG��JH�B� ^���R5�ĔL2�AND�T�AL��cL�DAM4�d@UN��AQ��T\��Whqu�Y\�Yd��Y\]�V�U9@/��ŗ$|��x�bL0�x�
'm�B� ���u`-��2M:���&X���#�.��ӎ9�D�M:��sO7���'��!r�L<��@q�X��0�"B��\g�I#7��h!�cܑ�)���N8�a
3��Ҋ%X�A�/h�r�-�l2!��s=��m�|�7�c�<�$$�>��s����%���
9�r &� /�L�^!��� u�фI��(�L�$�K1U@�M,%ԑ0�<��KQy3>=�]Y>�@_M`VUau�&�h�e��j�uW!z��|H���RK4�dB�%��׆��!p.��R!�ʂ�#��L0�2�|� )���i7�TC�<��1�vx�I8눳8���8�8c�)���t�u#O>ݠ!�&���
5А(��篿��Q�/���g�2�%N�1
��̼��KE�[��Q����<�C�B���I'��BL0Ŵ�7��+�\��*U�J*�Q�7t@�N1�����D�H-��~�$�F���Ԥ%e�J�,� �l�+��W������+� ���B5��xA������V�0�� B��| � �Bp"�� �v�mX8Ju�g�#��D��eXC�x�-!�j�c��=��R�"�xDp���n�V���,d�wt��08J7�}�c]�#��8!
�*E7̑����X�M�"�(�1��J�cyw@��`"�
SHB*�`8�A��Pq�ѝ_�!���6��g�C�� &a Y\���_%藊�bNX �.���,�H�Y��� 0',9RN^�@�H ��"�D�Jj� �3a)K�D���O1mI�hy�8�H���� b@C� a� �8,"��C�A�E�ጵ��"́Y��à1�:`�ְC�O��٨F<�1c$�?���-v!�j�� N���7i`O�P�:�!
�����Q�+4� q�;��'[�j�G V�9$r�x�/� {�� G3�"8O E0�ΰ�"H�
�p�;��xt��F-BA�N �G9b��?�!�lPT9��=L�x�%N/���L��²�
���Z6@���-�ɍ���
f�.j�UR��}t�V����ݮ�� �/�֗H@��(�6�� 8�AlXh�g�� G4�wpG!�HG�:��t|�2�7M|J���g$C����b�b�����*$�p�-�a�9ZC��ۉ��6� �h"Q�[�h8�ġ�}���s�#��ǐ��Y@��ؐ�+L� W�B�`)�1@9��YmP��(<�ÎK��� ��
_t��ĉ觊K QJ�frkb@�W�,A�Nx\�w&�K��T32W�Y����r $�
к��j�� 3p ���"~ .�ޡ
[4#H%��:��x=��@p!�Uq�Qx$"�H�=����a�PF3�q�O$��p�2�z��Z�(Ƹ!G�b���M6��qHC�PF<�s��5�ȃ0,1M����
l0���N�AJ��pT>��Qh8Cg�%�p�9��
T���P�XX��x��5�^Ă��F;ށ�a��o�$�a�̠�$T�U���� ��������2I? �6z�8e"�Ŭ&J�ٓ��"��L�a1KY̲/eILn Z]¤=��aG&!�w��/�$�6��t�9ʡ�$ ��G�����#�xD)��o�X��p�:�q�`�¡�<���C����=�Qc4���8�-}��X��G:�*�:āM8�)>�1,{
y�"� Gz�#!�x� 1牂1o��*�`*�U@�0�DD�p��5H�'`B�0��;�1�O Ђ+B����]�Y�/��\B%�(Ad���� ��N��q���Sۅ� �p%TT�S\�[�Et}�W�ɖ0��p@1�U�P@vu�D
C�%t�g��6���E��"�%T��x��.�ф@=|���:�8��=ĊT��:�с�BH�=��s�["��-P�p����'�2��;ܑ5�:̞>�Ð}�;hB(���`�!�A8|�5��>��<��&�B5غHC7p�3P�p�T�AL�T\A4�p ��<A"C6d'�P����,8�5|J8�2d-l%D! /�ACeB�`B*T���� �Sɤ����`�������S� EnES�Dd�8�E
��ߕ�mY��ҬPK� /H
*P�, �7��9h ����A��A'd��\B �"x�̃3@�:ЃKJ>�C:t|�.���%�<����-D�=��u��>G5܂�!�����.Ș� �(x6��8�pe
���eC.h��1# �<9X����<��z$AL���U�"���B8AP� $'�B � �5�«xC���6���m�*ȁ7�*L�+�H@�9�m�����Z��̜`O�]<��MLIV�����?�ZAM�`����\@�j�.�C;�C9`����H^����_N��$&� d,�B,@�/P�OiG҆;�^.�I$�:��2�b7`[7�B2(�90鬃1�Q7�;��-|\=<���s�~h�d,�$��"��"`A�`O4L�1 C�
A�A�B0��*Q� �A�A�_���$��6�wZ�|%���APLA��/��=����803��%�B/�%T!��%BJ� @���l�f˜]>
=�c��LM8MWp��uI�$�Lڡ�L���n@DZ2��7��8h�$�&�B%�H��I�A!�B��e{ �H��!�7P�=,�M�;`�1�A�8�0 C5�C<�B)x"�B.��9��1���A)h�)��Aԃ:Ȃ.t��C<h/ +��`�"�.8�~��)x��K�$�`�aUA��hd����h/�������ܙ��
hAJ�� $�!�~�5��ȁ%�AL'l�2�it%Ap���V����]L��
�����V�����LP�Z�E�ӟ
'�I[ ���[0 VЅ@�4M�C`C3h��@`&`�`����T&P��^A!h���\�
�3�Gb�4D�7�.p�.4B)$��'8�)܂-C,�'�)<8�C>�B�A��C6T$E�<L<�C��C5(�1H�1tb=�.C-P�f��! �'X�+�g6X��\��A�4���(� ��A���\���dl�zA�����lA",�=�C4d4�!��+��%X�FhB/��%����J�� jL�Lʎ������Ҍ;�N�cL,V���A!@��Щ������Y��j��+xV00C%|�* � �H�֨��&\���Ё!��('0A� ��0C-�A(,B�JC2��-<
7Л0��.C4�B2����.�-�tC��;��B"�.�2�纜�4T���[)dΐ�2��@ �6����&�2TB!`�h���r�.�p�QA|�(�%�B5љ�������%d(���H���<Vn�38C0l0�+\BB%\hf�V�$���.ۄʶ�,�t�]����Z��,�S<�\��Aa c ��Sv�/4��S�I*��/80��I^�$`B ���]f*��z�@'