📄 catalog
字号:
#!/bin/sh# ----------------------------------------------------------------------# PROGRAM: demo program for [incr Widgets]# ----------------------------------------------------------------------# Michael J. McLennan# Bell Labs Innovations for Lucent Technologies# mmclennan@lucent.com# http://www.tcltk.com/itcl/# ======================================================================# Copyright (c) 1993-1998 Lucent Technologies, Inc.# ======================================================================#\exec wish8.4 "$0"package require Iwidgets 4.0# ----------------------------------------------------------------------option add *Scrolledtext.textBackground white startupFileoption add *Scrolledlistbox.textBackground white startupFileoption add *Scrolledhtml.textBackground white startupFileoption add *Scrolledhtml.padX 10 startupFileoption add *boxColor blue startupFileoption add *boxTextColor white startupFile# ----------------------------------------------------------------------# USAGE: iw_demo_file <name>## Returns the proper demo file name for a demo called <name>.# ----------------------------------------------------------------------proc iw_demo_file {name} { global iwidgets::library return [file join $library demos $name]}# ----------------------------------------------------------------------# USAGE: iw_demo_manpage <name>## Returns the proper man page file for a demo called <name>.# ----------------------------------------------------------------------proc iw_demo_manpage {name} { global iwidgets::library return [file join $library demos html $name.n.html]}# ----------------------------------------------------------------------# USAGE: iw_load_demo <name>## Loads a demo program with the given <name>. Demos can be written# as if they will pop up in the main application window, but they will# pop up inside the tab notebook instead.# ----------------------------------------------------------------------proc iw_load_demo {name} { global widgets catch {eval destroy [winfo children $widgets(info-example)]} iw_lock on iw_status "Loading..." set win [frame $widgets(info-example).inner] pack $win -expand yes set loadcmd { set fid [open [iw_demo_file $name] r] set code [read $fid] close $fid } if {[catch $loadcmd result] == 0} { regsub -all "(\"|\{|\\\[| |\n|^|\t)((\\.\[A-Za-z0-9\]+)+)" \ $code "\\1$win\\2" code regsub -all "(\"|\{|\\\[| |\n|^)(\\. )" \ $code "\\1$win " code if {[catch {uplevel #0 $code} result] == 0} { $widgets(info-code) clear $widgets(info-code) import [iw_demo_file $name] iw_draw_hier $name iw_load_manpage $name iw_lock off iw_status "" return } } catch {eval destroy [winfo children $win]} label $win.err -background white -wraplength 4i \ -text "Can't load demo:\n$result" pack $win.err -expand yes iw_lock off iw_status ""}# overload a few critical functions that might be used by demo programs...rename exit tcl_exitproc exit {{status 0}} { # do nothing}rename puts tcl_putsproc puts {args} { global widgets if {[llength $args] == 1} { iw_status [lindex $args 0] } else { eval tcl_puts $args }}# ----------------------------------------------------------------------# USAGE: iw_load_manpage## Loads the man page for the current demo. Man pages are not# automatically loaded unless the man page viewer is visible.# This procedure checks to see if the viewer is visible, and loads# the man page if needed.# ----------------------------------------------------------------------set iwManPage ""proc iw_load_manpage {{name ""}} { global widgets iwManPage if {[winfo ismapped $widgets(info-manpage)]} { if {$name == ""} { set name [$widgets(list) getcurselection] } if {$name != $iwManPage} { iw_lock on iw_status "Loading man page..." $widgets(info-manpage) import [iw_demo_manpage $name] iw_lock off iw_status "" place forget $widgets(info-manpage-feedback) } set iwManPage $name }}# ----------------------------------------------------------------------# USAGE: iw_manpage_progress## Handles the progress meter whenever an HTML man page is rendered.# If the progress meter is not showing, it is put up, and the current# state is updated. If the meter is at 100%, it is taken down.# ----------------------------------------------------------------------proc iw_manpage_progress {n} { global widgets remaining if {![winfo ismapped $widgets(info-manpage-feedback)]} { $widgets(info-manpage-feedback) configure -steps $n $widgets(info-manpage-feedback) reset place $widgets(info-manpage-feedback) -relx 0.5 -rely 0.5 \ -anchor c -width 200 update set remaining $n } $widgets(info-manpage-feedback) step [expr $remaining - $n] set remaining $n}# ----------------------------------------------------------------------# USAGE: iw_status <message>## Displays a status <message> near the top of the window.# ----------------------------------------------------------------------proc iw_status {message} { global widgets $widgets(status) configure -text $message update}# ----------------------------------------------------------------------# USAGE: iw_lock <state>## Locks or unlocks the main window. Sets a grab on the main menu,# so that all events are sent to it.# ----------------------------------------------------------------------proc iw_lock {state} { global widgets if {$state} { grab set $widgets(mainMenu) . configure -cursor watch } else { grab release $widgets(mainMenu) . configure -cursor "" }}# ----------------------------------------------------------------------# USAGE: iw_draw_hier <name>## Queries the hierarchy for a particular class in demo <name> and# draws a class diagram into a display window. Usually invoked when# a demo is loaded to display the class hierarchy for the associated# widget.# ----------------------------------------------------------------------proc iw_draw_hier {name} { global widgets set canv $widgets(info-hier) $canv delete all set class [string toupper [string index $name 0]][string tolower [string range $name 1 end]] if {[catch [list namespace eval iwidgets [list itcl::find classes $class]]] == 0} { set objs [namespace eval iwidgets [list itcl::find objects -class $class]] if {[llength $objs]} { update idletasks set bases [[lindex $objs 0] info heritage] iw_draw_level [lrange $bases 1 end] $canv [lindex $bases 0] set bbox [$canv bbox all] $canv move all [expr [lindex $bbox 0] * -1] [expr [lindex $bbox 1] * -1] $canv xview moveto 0 $canv yview moveto 0 set bbox [$canv bbox all] set x [expr ([winfo width $widgets(info)] / 2) - ([lindex $bbox 2] / 2)] set y 10 $canv move all $x $y } }}# ----------------------------------------------------------------------# USAGE: iw_draw_level <bases> <canv> <class>## Draws one level of the hierarchy for <class>.# ----------------------------------------------------------------------proc iw_draw_level {bases canv class} { set org [iw_draw_box $canv $class] set top $org set offset 0 if {[llength $bases]} { $canv lower [$canv create line $offset $org \ $offset [expr $top-10] \ -40 [expr $top-10] \ -24 [expr $top-10] \ -20 [expr $top-16] \ -16 [expr $top-10] \ -20 [expr $top-16] \ -20 [expr $top-26]] $canv move all 20 [expr -($top-26+$org)] set del [iw_draw_level [lrange $bases 1 end] $canv [lindex $bases 0]] $canv move all -20 [expr $top-26+$org] set top [expr $top+$del-30+$org] incr offset 4 } return $top}# ----------------------------------------------------------------------# USAGE: iw_draw_box <canv> <class>## Draws one box for a class hierarchy onto a canvas window.# ----------------------------------------------------------------------proc iw_draw_box {canv class} { set bg [option get $canv boxColor BoxColor] set textbg [option get $canv boxTextColor BoxTextColor] set cname [string trimleft $class :] $canv create text 0 0 -anchor center -text $cname \ -fill $textbg -tags $class set bbox [$canv bbox $class] set x0 [expr [lindex $bbox 0]-4] set y0 [expr [lindex $bbox 1]-4] set x1 [expr [lindex $bbox 2]+4] set y1 [expr [lindex $bbox 3]+4] $canv create rectangle $x0 $y0 $x1 $y1 \ -outline black -fill $bg $canv raise $class return $y0}# ----------------------------------------------------------------------wm title . {[incr Widgets] Demo}wm geometry . 750x440frame .mbar -borderwidth 2 -relief raisedpack .mbar -fill xset widgets(mainMenu) [menubutton .mbar.main -text "Main" -menu .mbar.main.m]pack .mbar.main -side leftmenu .mbar.main.m.mbar.main.m add command -label "About..." -command {.about activate}.mbar.main.m add separator.mbar.main.m add command -label "Quit" -command tcl_exitiwidgets::panedwindow .pw -orient verticalpack .pw -expand yes -fill both.pw add "widgets"set pane [.pw childsite "widgets"]set widgets(list) $pane.wlistiwidgets::scrolledlistbox $widgets(list) -labeltext "Select a widget:" \ -selectioncommand {iw_load_demo [$widgets(list) getcurselection]} \ -labelpos nw -vscrollmode dynamic -hscrollmode none \ -exportselection nopack $widgets(list) -expand yes -fill both -padx 8.pw add "info"set pane [.pw childsite "info"]set widgets(info) $pane.info.pw fraction 25 75set widgets(status) [label $pane.status]pack $pane.status -anchor wiwidgets::tabnotebook $widgets(info) -tabpos spack $widgets(info) -expand yes -fill bothset widgets(info-example) [$widgets(info) add -label "Example"]$widgets(info-example) configure -background whiteset win [$widgets(info) add -label "Example Code"]set widgets(info-code) [iwidgets::scrolledtext $win.code \ -wrap none -vscrollmode dynamic -hscrollmode none]pack $widgets(info-code) -expand yes -fill both -padx 4 -pady 4set win [$widgets(info) add -label "Inheritance"]set widgets(info-hier) [iwidgets::scrolledcanvas $win.canv -textbackground white \ -vscrollmode dynamic -hscrollmode dynamic]pack $widgets(info-hier) -expand yes -fill both -padx 4 -pady 4set win [$widgets(info) add -label "Man Page"]set widgets(info-manpage) [iwidgets::scrolledhtml $win.html \ -wrap word -vscrollmode dynamic -hscrollmode none \ -feedback "iw_manpage_progress" \ -linkcommand "$win.html import -link"]pack $widgets(info-manpage) -expand yes -fill both -padx 4 -pady 4set widgets(info-manpage-feedback) [iwidgets::feedback $win.html.fb \ -borderwidth 2]bind $widgets(info-manpage) <Map> {iw_load_manpage}$widgets(info) select "Example"# ----------------------------------------------------------------------# "About" window# ----------------------------------------------------------------------iwidgets::dialog .about -title {About: [incr Widgets] Demo} -modality none.about hide "Apply".about hide "Help".about hide "Cancel".about buttonconfigure "OK" -command ".about deactivate".about default "OK"set win [.about childsite]label $win.title -text {[incr Widgets]}pack $win.titlecatch {$win.title configure -font -*-helvetica-bold-o-normal-*-*-180-*}set file [file join ${iwidgets::library} demos iwidgets.gif]label $win.icon -image [image create photo -file $file]pack $win.icon -side leftlabel $win.by -text "Contributed By"pack $win.bycatch {$win.by configure -font -*-helvetica-medium-r-normal-*-*-100-*}label $win.authors -text "Mark L. UlfertsSue YockeyJohn SiglerBill ScottAlfredo JahnTako SchotanusKris RaneyJohn TuckerMitch GormanJohn ReekieKen CopelandTony Parent Chad SmithandMichael McLennan"pack $win.authorscatch {$win.authors configure -font -*-helvetica-medium-o-normal-*-*-120-*}# ----------------------------------------------------------------------# Load up a list of demos...# ----------------------------------------------------------------------foreach file [lsort [glob [file join ${iwidgets::library} demos *]]] { set name [file tail $file] if {![file isdirectory $file] && ![string match *.* $name] && ![string match catalog $name] && ![string match scopedobject $name]} { if {$name == "mainwindow"} { # This demo is doesn't work well with the catalog # so we skip it. continue } $widgets(list) insert end $name }}$widgets(list) selection set 0uplevel #0 [$widgets(list) cget -selectioncommand]
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -