394 lines
		
	
	
	
		
			12 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
		
		
			
		
	
	
			394 lines
		
	
	
	
		
			12 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
|  | #!/bin/sh | ||
|  | # the next line restarts using wish \ | ||
|  | exec wish "$0" "$@" | ||
|  | 
 | ||
|  | # widget -- | ||
|  | # This script demonstrates the various widgets provided by Tk, | ||
|  | # along with many of the features of the Tk toolkit.  This file | ||
|  | # only contains code to generate the main window for the | ||
|  | # application, which invokes individual demonstrations.  The | ||
|  | # code for the actual demonstrations is contained in separate | ||
|  | # ".tcl" files is this directory, which are sourced by this script | ||
|  | # as needed. | ||
|  | # | ||
|  | # RCS: @(#) $Id: widget,v 1.8 2002/08/31 06:12:28 das Exp $ | ||
|  | 
 | ||
|  | eval destroy [winfo child .] | ||
|  | wm title . "Widget Demonstration" | ||
|  | if {$tcl_platform(platform) eq "unix"} { | ||
|  |     # This won't work everywhere, but there's no other way in core Tk | ||
|  |     # at the moment to display a coloured icon. | ||
|  |     image create photo TclPowered \ | ||
|  | 	    -file [file join $tk_library images logo64.gif] | ||
|  |     wm iconwindow . [toplevel ._iconWindow] | ||
|  |     pack [label ._iconWindow.i -image TclPowered] | ||
|  |     wm iconname . "tkWidgetDemo" | ||
|  | } | ||
|  | 
 | ||
|  | array set widgetFont { | ||
|  |     main   {Helvetica 12} | ||
|  |     bold   {Helvetica 12 bold} | ||
|  |     title  {Helvetica 18 bold} | ||
|  |     status {Helvetica 10} | ||
|  |     vars   {Helvetica 14} | ||
|  | } | ||
|  | 
 | ||
|  | set widgetDemo 1 | ||
|  | set font $widgetFont(main) | ||
|  | 
 | ||
|  | #---------------------------------------------------------------- | ||
|  | # The code below create the main window, consisting of a menu bar | ||
|  | # and a text widget that explains how to use the program, plus lists | ||
|  | # all of the demos as hypertext items. | ||
|  | #---------------------------------------------------------------- | ||
|  | 
 | ||
|  | menu .menuBar -tearoff 0 | ||
|  | .menuBar add cascade -menu .menuBar.file -label "File" -underline 0 | ||
|  | menu .menuBar.file -tearoff 0 | ||
|  | 
 | ||
|  | # On the Mac use the specia .apple menu for the about item | ||
|  | if {[string equal [tk windowingsystem] "classic"]} { | ||
|  |     .menuBar add cascade -menu .menuBar.apple | ||
|  |     menu .menuBar.apple -tearoff 0 | ||
|  |     .menuBar.apple add command -label "About..." -command "aboutBox" | ||
|  | } else { | ||
|  |     .menuBar.file add command -label "About..." -command "aboutBox" \ | ||
|  | 	-underline 0 -accelerator "<F1>" | ||
|  |     .menuBar.file add sep | ||
|  | } | ||
|  | 
 | ||
|  | .menuBar.file add command -label "Quit" -command "exit" -underline 0 \ | ||
|  |     -accelerator "Meta-Q" | ||
|  | . configure -menu .menuBar | ||
|  | bind . <F1> aboutBox | ||
|  | 
 | ||
|  | frame .statusBar | ||
|  | label .statusBar.lab -text "   " -relief sunken -bd 1 \ | ||
|  | 	-font $widgetFont(status) -anchor w | ||
|  | label .statusBar.foo -width 8 -relief sunken -bd 1 \ | ||
|  | 	-font $widgetFont(status) -anchor w | ||
|  | pack .statusBar.lab -side left -padx 2 -expand yes -fill both | ||
|  | pack .statusBar.foo -side left -padx 2 | ||
|  | pack .statusBar -side bottom -fill x -pady 2 | ||
|  | 
 | ||
|  | frame .textFrame | ||
|  | scrollbar .s -orient vertical -command {.t yview} -highlightthickness 0 \ | ||
|  |     -takefocus 1 | ||
|  | pack .s -in .textFrame -side right -fill y | ||
|  | text .t -yscrollcommand {.s set}  -wrap word  -width 70  -height 30 \ | ||
|  | 	-font $widgetFont(main)  -setgrid 1  -highlightthickness 0 \ | ||
|  | 	-padx 4  -pady 2  -takefocus 0 | ||
|  | pack .t -in .textFrame -expand y -fill both -padx 1 | ||
|  | pack  .textFrame -expand yes -fill both | ||
|  | 
 | ||
|  | # Create a bunch of tags to use in the text widget, such as those for | ||
|  | # section titles and demo descriptions.  Also define the bindings for | ||
|  | # tags. | ||
|  | 
 | ||
|  | .t tag configure title -font $widgetFont(title) | ||
|  | .t tag configure bold  -font $widgetFont(bold) | ||
|  | 
 | ||
|  | # We put some "space" characters to the left and right of each demo description | ||
|  | # so that the descriptions are highlighted only when the mouse cursor | ||
|  | # is right over them (but not when the cursor is to their left or right) | ||
|  | # | ||
|  | .t tag configure demospace -lmargin1 1c -lmargin2 1c | ||
|  | 
 | ||
|  | 
 | ||
|  | if {[winfo depth .] == 1} { | ||
|  |     .t tag configure demo -lmargin1 1c -lmargin2 1c \ | ||
|  | 	-underline 1 | ||
|  |     .t tag configure visited -lmargin1 1c -lmargin2 1c \ | ||
|  | 	-underline 1 | ||
|  |     .t tag configure hot -background black -foreground white | ||
|  | } else { | ||
|  |     .t tag configure demo -lmargin1 1c -lmargin2 1c \ | ||
|  | 	-foreground blue -underline 1 | ||
|  |     .t tag configure visited -lmargin1 1c -lmargin2 1c \ | ||
|  | 	-foreground #303080 -underline 1 | ||
|  |     .t tag configure hot -foreground red -underline 1 | ||
|  | } | ||
|  | .t tag bind demo <ButtonRelease-1> { | ||
|  |     invoke [.t index {@%x,%y}] | ||
|  | } | ||
|  | set lastLine "" | ||
|  | .t tag bind demo <Enter> { | ||
|  |     set lastLine [.t index {@%x,%y linestart}] | ||
|  |     .t tag add hot "$lastLine +1 chars" "$lastLine lineend -1 chars" | ||
|  |     .t config -cursor hand2 | ||
|  |     showStatus [.t index {@%x,%y}] | ||
|  | } | ||
|  | .t tag bind demo <Leave> { | ||
|  |     .t tag remove hot 1.0 end | ||
|  |     .t config -cursor xterm | ||
|  |     .statusBar.lab config -text "" | ||
|  | } | ||
|  | .t tag bind demo <Motion> { | ||
|  |     set newLine [.t index {@%x,%y linestart}] | ||
|  |     if {[string compare $newLine $lastLine] != 0} { | ||
|  | 	.t tag remove hot 1.0 end | ||
|  | 	set lastLine $newLine | ||
|  | 
 | ||
|  | 	set tags [.t tag names {@%x,%y}] | ||
|  | 	set i [lsearch -glob $tags demo-*] | ||
|  | 	if {$i >= 0} { | ||
|  | 	    .t tag add hot "$lastLine +1 chars" "$lastLine lineend -1 chars" | ||
|  | 	} | ||
|  |     } | ||
|  |     showStatus [.t index {@%x,%y}] | ||
|  | } | ||
|  | 
 | ||
|  | # Create the text for the text widget. | ||
|  | 
 | ||
|  | proc addDemoSection {title demos} { | ||
|  |     .t insert end "\n" {} $title title " \n " demospace | ||
|  |     set num 0 | ||
|  |     foreach {name description} $demos { | ||
|  | 	.t insert end "[incr num]. $description." [list demo demo-$name] | ||
|  | 	.t insert end " \n " demospace | ||
|  |     } | ||
|  | } | ||
|  | 
 | ||
|  | .t insert end "Tk Widget Demonstrations\n" title | ||
|  | .t insert end "\nThis application provides a front end for several short\ | ||
|  | 	scripts that demonstrate what you can do with Tk widgets.  Each of\ | ||
|  | 	the numbered lines below describes a demonstration;  you can click\ | ||
|  | 	on it to invoke the demonstration.  Once the demonstration window\ | ||
|  | 	appears, you can click the " {} "See Code" bold " button to see the\ | ||
|  | 	Tcl/Tk code that created the demonstration.  If you wish, you can\ | ||
|  | 	edit the code and click the " {} "Rerun Demo" bold " button in the\ | ||
|  | 	code window to reinvoke the demonstration with the modified code.\n" | ||
|  | 
 | ||
|  | addDemoSection "Labels, buttons, checkbuttons, and radiobuttons" { | ||
|  |     label	"Labels (text and bitmaps)" | ||
|  |     button	"Buttons" | ||
|  |     check	"Check-buttons (select any of a group)" | ||
|  |     radio	"Radio-buttons (select one of a group)" | ||
|  |     puzzle	"A 15-puzzle game made out of buttons" | ||
|  |     icon	"Iconic buttons that use bitmaps" | ||
|  |     image1	"Two labels displaying images" | ||
|  |     image2	"A simple user interface for viewing images" | ||
|  |     labelframe	"Labelled frames" | ||
|  | } | ||
|  | addDemoSection "Listboxes" { | ||
|  |     states	"The 50 states" | ||
|  |     colors	"Colors: change the color scheme for the application" | ||
|  |     sayings	"A collection of famous and infamous sayings" | ||
|  | } | ||
|  | addDemoSection "Entries and Spin-boxes" { | ||
|  |     entry1	"Entries without scrollbars" | ||
|  |     entry2	"Entries with scrollbars" | ||
|  |     entry3	"Validated entries and password fields" | ||
|  |     spin	"Spin-boxes" | ||
|  |     form	"Simple Rolodex-like form" | ||
|  | } | ||
|  | addDemoSection "Text" { | ||
|  |     text	"Basic editable text" | ||
|  |     style	"Text display styles" | ||
|  |     bind	"Hypertext (tag bindings)" | ||
|  |     twind	"A text widget with embedded windows" | ||
|  |     search	"A search tool built with a text widget" | ||
|  | } | ||
|  | addDemoSection "Canvases" { | ||
|  |     items	"The canvas item types" | ||
|  |     plot	"A simple 2-D plot" | ||
|  |     ctext	"Text items in canvases" | ||
|  |     arrow	"An editor for arrowheads on canvas lines" | ||
|  |     ruler	"A ruler with adjustable tab stops" | ||
|  |     floor	"A building floor plan" | ||
|  |     cscroll	"A simple scrollable canvas" | ||
|  | } | ||
|  | addDemoSection "Scales" { | ||
|  |     hscale	"Horizontal scale" | ||
|  |     vscale	"Vertical scale" | ||
|  | } | ||
|  | addDemoSection "Paned Windows" { | ||
|  |     paned1	"Horizontal paned window" | ||
|  |     paned2	"Vertical paned window" | ||
|  | } | ||
|  | addDemoSection "Menus" { | ||
|  |     menu	"Menus and cascades (sub-menus)" | ||
|  |     menubu	"Menu-buttons" | ||
|  | } | ||
|  | addDemoSection "Common Dialogs" { | ||
|  |     msgbox	"Message boxes" | ||
|  |     filebox	"File selection dialog" | ||
|  |     clrpick	"Color picker" | ||
|  | } | ||
|  | addDemoSection "Miscellaneous" { | ||
|  |     bitmap	"The built-in bitmaps" | ||
|  |     dialog1	"A dialog box with a local grab" | ||
|  |     dialog2	"A dialog box with a global grab" | ||
|  | } | ||
|  | 
 | ||
|  | .t configure -state disabled | ||
|  | focus .s | ||
|  | 
 | ||
|  | # positionWindow -- | ||
|  | # This procedure is invoked by most of the demos to position a | ||
|  | # new demo window. | ||
|  | # | ||
|  | # Arguments: | ||
|  | # w -		The name of the window to position. | ||
|  | 
 | ||
|  | proc positionWindow w { | ||
|  |     wm geometry $w +300+300 | ||
|  | } | ||
|  | 
 | ||
|  | # showVars -- | ||
|  | # Displays the values of one or more variables in a window, and | ||
|  | # updates the display whenever any of the variables changes. | ||
|  | # | ||
|  | # Arguments: | ||
|  | # w -		Name of new window to create for display. | ||
|  | # args -	Any number of names of variables. | ||
|  | 
 | ||
|  | proc showVars {w args} { | ||
|  |     global widgetFont | ||
|  |     catch {destroy $w} | ||
|  |     toplevel $w | ||
|  |     wm title $w "Variable values" | ||
|  |     label $w.title -text "Variable values:" -width 20 -anchor center \ | ||
|  | 	    -font $widgetFont(vars) | ||
|  |     pack $w.title -side top -fill x | ||
|  |     set len 1 | ||
|  |     foreach i $args { | ||
|  | 	if {[string length $i] > $len} { | ||
|  | 	    set len [string length $i] | ||
|  | 	} | ||
|  |     } | ||
|  |     foreach i $args { | ||
|  | 	frame $w.$i | ||
|  | 	label $w.$i.name -text "$i: " -width [expr $len + 2] -anchor w | ||
|  | 	label $w.$i.value -textvar $i -anchor w | ||
|  | 	pack $w.$i.name -side left | ||
|  | 	pack $w.$i.value -side left -expand 1 -fill x | ||
|  | 	pack $w.$i -side top -anchor w -fill x | ||
|  |     } | ||
|  |     button $w.ok -text OK -command "destroy $w" -default active | ||
|  |     bind $w <Return> "tkButtonInvoke $w.ok" | ||
|  |     pack $w.ok -side bottom -pady 2 | ||
|  | } | ||
|  | 
 | ||
|  | # invoke -- | ||
|  | # This procedure is called when the user clicks on a demo description. | ||
|  | # It is responsible for invoking the demonstration. | ||
|  | # | ||
|  | # Arguments: | ||
|  | # index -	The index of the character that the user clicked on. | ||
|  | 
 | ||
|  | proc invoke index { | ||
|  |     global tk_library | ||
|  |     set tags [.t tag names $index] | ||
|  |     set i [lsearch -glob $tags demo-*] | ||
|  |     if {$i < 0} { | ||
|  | 	return | ||
|  |     } | ||
|  |     set cursor [.t cget -cursor] | ||
|  |     .t configure -cursor watch | ||
|  |     update | ||
|  |     set demo [string range [lindex $tags $i] 5 end] | ||
|  |     uplevel [list source [file join $tk_library demos $demo.tcl]] | ||
|  |     update | ||
|  |     .t configure -cursor $cursor | ||
|  | 
 | ||
|  |     .t tag add visited "$index linestart +1 chars" "$index lineend -1 chars" | ||
|  | } | ||
|  | 
 | ||
|  | # showStatus -- | ||
|  | # | ||
|  | #	Show the name of the demo program in the status bar. This procedure | ||
|  | #	is called when the user moves the cursor over a demo description. | ||
|  | # | ||
|  | proc showStatus index { | ||
|  |     global tk_library | ||
|  |     set tags [.t tag names $index] | ||
|  |     set i [lsearch -glob $tags demo-*] | ||
|  |     set cursor [.t cget -cursor] | ||
|  |     if {$i < 0} { | ||
|  | 	.statusBar.lab config -text " " | ||
|  | 	set newcursor xterm | ||
|  |     } else { | ||
|  | 	set demo [string range [lindex $tags $i] 5 end] | ||
|  | 	.statusBar.lab config -text "Run the \"$demo\" sample program" | ||
|  | 	set newcursor hand2 | ||
|  |     } | ||
|  |     if [string compare $cursor $newcursor] { | ||
|  | 	.t config -cursor $newcursor | ||
|  |     } | ||
|  | } | ||
|  | 
 | ||
|  | 
 | ||
|  | # showCode -- | ||
|  | # This procedure creates a toplevel window that displays the code for | ||
|  | # a demonstration and allows it to be edited and reinvoked. | ||
|  | # | ||
|  | # Arguments: | ||
|  | # w -		The name of the demonstration's window, which can be | ||
|  | #		used to derive the name of the file containing its code. | ||
|  | 
 | ||
|  | proc showCode w { | ||
|  |     global tk_library | ||
|  |     set file [string range $w 1 end].tcl | ||
|  |     if ![winfo exists .code] { | ||
|  | 	toplevel .code | ||
|  | 	frame .code.buttons | ||
|  | 	pack .code.buttons -side bottom -fill x | ||
|  | 	button .code.buttons.dismiss -text Dismiss \ | ||
|  |             -default active -command "destroy .code" | ||
|  | 	button .code.buttons.rerun -text "Rerun Demo" -command { | ||
|  | 	    eval [.code.text get 1.0 end] | ||
|  | 	} | ||
|  | 	pack .code.buttons.dismiss .code.buttons.rerun -side left \ | ||
|  | 	    -expand 1 -pady 2 | ||
|  | 	frame .code.frame | ||
|  | 	pack  .code.frame -expand yes -fill both -padx 1 -pady 1 | ||
|  | 	text .code.text -height 40 -wrap word\ | ||
|  | 	    -xscrollcommand ".code.xscroll set" \ | ||
|  | 	    -yscrollcommand ".code.yscroll set" \ | ||
|  | 	    -setgrid 1 -highlightthickness 0 -pady 2 -padx 3 | ||
|  | 	scrollbar .code.xscroll -command ".code.text xview" \ | ||
|  | 	    -highlightthickness 0 -orient horizontal | ||
|  | 	scrollbar .code.yscroll -command ".code.text yview" \ | ||
|  | 	    -highlightthickness 0 -orient vertical | ||
|  | 
 | ||
|  | 	grid .code.text -in .code.frame -padx 1 -pady 1 \ | ||
|  | 	    -row 0 -column 0 -rowspan 1 -columnspan 1 -sticky news | ||
|  | 	grid .code.yscroll -in .code.frame -padx 1 -pady 1 \ | ||
|  | 	    -row 0 -column 1 -rowspan 1 -columnspan 1 -sticky news | ||
|  | #	grid .code.xscroll -in .code.frame -padx 1 -pady 1 \ | ||
|  | #	    -row 1 -column 0 -rowspan 1 -columnspan 1 -sticky news | ||
|  | 	grid rowconfig    .code.frame 0 -weight 1 -minsize 0 | ||
|  | 	grid columnconfig .code.frame 0 -weight 1 -minsize 0 | ||
|  |     } else { | ||
|  | 	wm deiconify .code | ||
|  | 	raise .code | ||
|  |     } | ||
|  |     wm title .code "Demo code: [file join $tk_library demos $file]" | ||
|  |     wm iconname .code $file | ||
|  |     set id [open [file join $tk_library demos $file]] | ||
|  |     .code.text delete 1.0 end | ||
|  |     .code.text insert 1.0 [read $id] | ||
|  |     .code.text mark set insert 1.0 | ||
|  |     close $id | ||
|  | } | ||
|  | 
 | ||
|  | # aboutBox -- | ||
|  | # | ||
|  | #	Pops up a message box with an "about" message | ||
|  | # | ||
|  | proc aboutBox {} { | ||
|  |     tk_messageBox -icon info -type ok -title "About Widget Demo" -message \ | ||
|  | "Tk widget demonstration | ||
|  | 
 | ||
|  | Copyright (c) 1996-1997 Sun Microsystems, Inc. | ||
|  | 
 | ||
|  | Copyright (c) 1997-2000 Ajuba Solutions, Inc. | ||
|  | 
 | ||
|  | Copyright (c) 2001-2002 Donal K. Fellows" | ||
|  | } | ||
|  | 
 | ||
|  | # Local Variables: | ||
|  | # mode: tcl | ||
|  | # End: |