home *** CD-ROM | disk | FTP | other *** search
/ Practical Programming in Tcl & Tk (4th Edition) / TCLBOOK4.BIN / mac / exsource.old / 23_3.tcl < prev    next >
Text File  |  2003-04-15  |  4KB  |  153 lines

  1. #
  2. # Example 23-3
  3. # A browser for the code examples in the book.
  4. #
  5.  
  6. #!/usr/local/bin/wish
  7. #    Browser for the Tcl and Tk examples in the book.
  8.  
  9. # browse(dir) is the directory containing all the tcl files
  10. # Please edit to match your system configuration.
  11.  
  12. switch $tcl_platform(platform) {
  13.     "unix" {set browse(dir) /cdrom/tclbook2/exsource}
  14.     "windows" {set browse(dir) D:/exsource}
  15.     "macintosh" {set browse(dir) /tclbook2/exsource}
  16. }
  17.  
  18. wm minsize . 30 5
  19. wm title . "Tcl Example Browser"
  20.  
  21. # Create a row of buttons along the top
  22.  
  23. set f [frame .menubar]
  24. pack $f -fill x
  25. button $f.quit -text Quit -command exit
  26. button $f.next -text Next -command Next
  27. button $f.prev -text Previous -command Previous
  28.  
  29. # The Run and Reset buttons use EvalEcho that
  30. # is defined by the Tcl shell in Example 23-4 on page 359
  31.  
  32. button $f.load -text Run -command Run
  33. button $f.reset -text Reset -command Reset
  34. pack $f.quit $f.reset $f.load $f.next $f.prev -side right
  35.  
  36. # A label identifies the current example
  37.  
  38. label $f.label -textvariable browse(current)
  39. pack $f.label -side right -fill x -expand true
  40.  
  41. # Create the menubutton and menu
  42.  
  43. menubutton $f.ex -text Examples -menu $f.ex.m
  44. pack $f.ex -side left
  45. set m [menu $f.ex.m]
  46.  
  47. # Create the text to display the example
  48. # Scrolled_Text is defined in Example 31-1 on page 464
  49.  
  50. set browse(text) [Scrolled_Text .body \
  51.     -width 80 -height 10\
  52.     -setgrid true]
  53. pack .body -fill both -expand true
  54.  
  55. # Look through the example files for their ID number.
  56.  
  57. foreach f [lsort -dictionary [glob [file join $browse(dir) *]]] {
  58.     if [catch {open $f} in] {
  59.         puts stderr "Cannot open $f: $in"
  60.         continue
  61.     }
  62.     while {[gets $in line] >= 0} {
  63.         if [regexp {^# Example ([0-9]+)-([0-9]+)} $line \
  64.                 x chap ex] {
  65.             lappend examples($chap) $ex
  66.             lappend browse(list) $f
  67.             # Read example title
  68.             gets $in line
  69.             set title($chap-$ex) [string trim $line "# "]
  70.             set file($chap-$ex) $f
  71.             close $in
  72.             break
  73.         }
  74.     }
  75. }
  76.  
  77. # Create two levels of cascaded menus.
  78. # The first level divides up the chapters into chunks.
  79. # The second level has an entry for each example.
  80.  
  81. option add *Menu.tearOff 0
  82. set limit 8
  83. set c 0; set i 0
  84. foreach chap [lsort -integer [array names examples]] {
  85.     if {$i == 0} {
  86.         $m add cascade -label "Chapter $chap..." \
  87.             -menu $m.$c
  88.         set sub1 [menu $m.$c]
  89.         incr c
  90.     }
  91.     set i [expr ($i +1) % $limit]
  92.     $sub1 add cascade -label "Chapter $chap" -menu $sub1.sub$i
  93.     set sub2 [menu $sub1.sub$i ]
  94.     foreach ex [lsort -integer $examples($chap)] {
  95.         $sub2 add command -label "$chap-$ex $title($chap-$ex)" \
  96.             -command [list Browse $file($chap-$ex)]
  97.     }
  98. }
  99.  
  100. # Display a specified file. The label is updated to
  101. # reflect what is displayed, and the text is left
  102. # in a read-only mode after the example is inserted.
  103.  
  104. proc Browse { file } {
  105.     global browse
  106.     set browse(current) [file tail $file]
  107.     set browse(curix) [lsearch $browse(list) $file]
  108.     set t $browse(text)
  109.     $t config -state normal
  110.     $t delete 1.0 end
  111.     if [catch {open $file} in] {
  112.         $t insert end $in
  113.     } else {
  114.         $t insert end [read $in]
  115.         close $in
  116.     }
  117.     $t config -state disabled
  118. }
  119.  
  120. # Browse the next and previous files in the list
  121.  
  122. set browse(curix) -1
  123. proc Next {} {
  124.     global browse
  125.     if {$browse(curix) < [llength $browse(list)] - 1} {
  126.         incr browse(curix)
  127.     }
  128.     Browse [lindex $browse(list) $browse(curix)]
  129. }
  130. proc Previous {} {
  131.     global browse
  132.     if {$browse(curix) > 0} {
  133.         incr browse(curix) -1
  134.     }
  135.     Browse [lindex $browse(list) $browse(curix)]
  136. }
  137.  
  138. # Run the example in the shell
  139.  
  140. proc Run {} {
  141.     global browse
  142.     EvalEcho [list source \
  143.         [file join $browse(dir) $browse(current)]]
  144. }
  145.  
  146. # Reset the slave in the eval server
  147.  
  148. proc Reset {} {
  149.     EvalEcho reset
  150. }
  151.  
  152.  
  153.