- # search.tcl --
- #
- # This demonstration script creates a collection of widgets that
- # allow you to load a file into a text widget, then perform searches
- # on that file.
- #
- # RCS: @(#) $Id: search.tcl,v 1.2 1998/09/14 18:23:30 stanton Exp $
- if {![info exists widgetDemo]} {
- error "This script should be run from the "widget" demo."
- }
- # textLoadFile --
- # This procedure below loads a file into a text widget, discarding
- # the previous contents of the widget. Tags for the old widget are
- # not affected, however.
- #
- # Arguments:
- # w - The window into which to load the file. Must be a
- # text widget.
- # file - The name of the file to load. Must be readable.
- proc textLoadFile {w file} {
- set f [open $file]
- $w delete 1.0 end
- while {![eof $f]} {
- $w insert end [read $f 10000]
- }
- close $f
- }
- # textSearch --
- # Search for all instances of a given string in a text widget and
- # apply a given tag to each instance found.
- #
- # Arguments:
- # w - The window in which to search. Must be a text widget.
- # string - The string to search for. The search is done using
- # exact matching only; no special characters.
- # tag - Tag to apply to each instance of a matching string.
- proc textSearch {w string tag} {
- $w tag remove search 0.0 end
- if {$string == ""} {
- return
- }
- set cur 1.0
- while 1 {
- set cur [$w search -count length $string $cur end]
- if {$cur == ""} {
- break
- }
- $w tag add $tag $cur "$cur + $length char"
- set cur [$w index "$cur + $length char"]
- }
- }
- # textToggle --
- # This procedure is invoked repeatedly to invoke two commands at
- # periodic intervals. It normally reschedules itself after each
- # execution but if an error occurs (e.g. because the window was
- # deleted) then it doesn't reschedule itself.
- #
- # Arguments:
- # cmd1 - Command to execute when procedure is called.
- # sleep1 - Ms to sleep after executing cmd1 before executing cmd2.
- # cmd2 - Command to execute in the *next* invocation of this
- # procedure.
- # sleep2 - Ms to sleep after executing cmd2 before executing cmd1 again.
- proc textToggle {cmd1 sleep1 cmd2 sleep2} {
- catch {
- eval $cmd1
- after $sleep1 [list textToggle $cmd2 $sleep2 $cmd1 $sleep1]
- }
- }
- set w .search
- catch {destroy $w}
- toplevel $w
- wm title $w "Text Demonstration - Search and Highlight"
- wm iconname $w "search"
- positionWindow $w
- frame $w.buttons
- pack $w.buttons -side bottom -fill x -pady 2m
- button $w.buttons.dismiss -text Dismiss -command "destroy $w"
- button $w.buttons.code -text "See Code" -command "showCode $w"
- pack $w.buttons.dismiss $w.buttons.code -side left -expand 1
- frame $w.file
- label $w.file.label -text "File name:" -width 13 -anchor w
- entry $w.file.entry -width 40 -textvariable fileName
- button $w.file.button -text "Load File"
- -command "textLoadFile $w.text $fileName"
- pack $w.file.label $w.file.entry -side left
- pack $w.file.button -side left -pady 5 -padx 10
- bind $w.file.entry <Return> "
- textLoadFile $w.text $fileName
- focus $w.string.entry
- "
- focus $w.file.entry
- frame $w.string
- label $w.string.label -text "Search string:" -width 13 -anchor w
- entry $w.string.entry -width 40 -textvariable searchString
- button $w.string.button -text "Highlight"
- -command "textSearch $w.text $searchString search"
- pack $w.string.label $w.string.entry -side left
- pack $w.string.button -side left -pady 5 -padx 10
- bind $w.string.entry <Return> "textSearch $w.text $searchString search"
- text $w.text -yscrollcommand "$w.scroll set" -setgrid true
- scrollbar $w.scroll -command "$w.text yview"
- pack $w.file $w.string -side top -fill x
- pack $w.scroll -side right -fill y
- pack $w.text -expand yes -fill both
- # Set up display styles for text highlighting.
- if {[winfo depth $w] > 1} {
- textToggle "$w.text tag configure search -background
- #ce5555 -foreground white" 800 "$w.text tag configure
- search -background {} -foreground {}" 200
- } else {
- textToggle "$w.text tag configure search -background
- black -foreground white" 800 "$w.text tag configure
- search -background {} -foreground {}" 200
- }
- $w.text insert 1.0
- {This window demonstrates how to use the tagging facilities in text
- widgets to implement a searching mechanism. First, type a file name
- in the top entry, then type <Return> or click on "Load File". Then
- type a string in the lower entry and type <Return> or click on
- "Load File". This will cause all of the instances of the string to
- be tagged with the tag "search", and it will arrange for the tag's
- display attributes to change to make all of the strings blink.}
- $w.text mark set insert 0.0
- set fileName ""
- set searchString ""