Tk Library Source Code

Artifact [5680c2ef5a]
Login

Artifact 5680c2ef5ac835dcb8c8ea3d3abc5b3ee480c95a:

Attachment "patch.txt" to ticket [654976ffff] added by lukekalemyers 2002-12-17 10:22:27.
1441a1442,1443
> 	$m add command -label "Find" -underline 0 \
> 		-command "::tkchat::findDialog .txt {}"
2773a2776,2871
> }
> 
> ## ::tkchat::findDialog - dialog interface to ::tkchat::find
> # ARGS:	w	- text widget
> #	str	- optional seed string for ::tkchat::findString
> ##
> proc ::tkchat::findDialog {w {str {}}} {
> 
> 	# The pathname of the dialog toplevel
> 	set base .find
> 
> 	# Create the dialog only if this procedure has not been called before
> 	# and the dialog does not yet exist.
>     if {![winfo exists $base]} {
> 		toplevel $base
> 		wm withdraw $base
> 		wm title $base "tkchat Find"
> 		
> 		pack [frame $base.f] -fill y -expand 1 -pady 5 -padx 5
> 		label $base.f.l -text "Find text:"
> 		entry $base.f.e \
> 			-textvariable ::tkchat::findString \
> 			-highlightthickness 0
> 		pack $base.f.l -side left
> 
> 		pack [frame $base.opt] -fill y -expand 1 -padx 5
> 		checkbutton $base.opt.c -text "Case sensitive" \
> 			-variable ::tkchat::case -underline 5
> 		checkbutton $base.opt.r -text "Use regexp" \
> 			-variable ::tkchat::regexp -underline 0
> 		pack $base.f.e $base.opt.c $base.opt.r -side left -fill x -expand 1
> 
> 		pack [frame $base.btn] -fill y -expand 1 -pady 5 -padx 5
> 		button $base.btn.fnd -text "Find" -width 6 -underline 0 -default active
> 		button $base.btn.c -text "Close" -width 6 -underline 0
> 		eval pack [winfo children $base.btn] -padx 9 \
> 			-side left
> 		
> 		# Keyboard Shortcuts
> 		bind $base <Alt-s>      [list $base.opt.c invoke]
> 		bind $base <Alt-f>      [list $base.btn.fnd invoke]
> 		bind $base <Alt-u>      [list $base.opt.r invoke]
> 		bind $base <Alt-c>      [list $base.btn.c invoke]
> 		bind $base <Escape>     [list $base.btn.c invoke]
> 		bind $base.f.e <Return> [list $base.btn.fnd invoke]
> 
>     }
>     $base.btn.fnd config \
> 		-command "::tkchat::find [list $w] \$::tkchat::findString \
> 	    -case \$::tkchat::case -reg \$::tkchat::regexp"
>     $base.btn.c config \
> 		-command "
>     [list $w] tag remove find 1.0 end
>     wm withdraw [list $base]
>     "
> 
>     if {[string compare normal [wm state $base]]} {
> 		wm deiconify $base
>     } else { raise $base }
>     $base.f.e select range 0 end
> 
> 	$base.btn.fnd invoke
> 
> 	focus $base.f.e
> 		
> }
> 
> ## ::tkchat::find - searches in text widget $w for $str and highlights it
> ## If $str is empty, it just deletes any highlighting
> # ARGS: w	- text widget
> #	str	- string to search for
> #	-case	TCL_BOOLEAN	whether to be case sensitive	DEFAULT: 0
> #	-regexp	TCL_BOOLEAN	whether to use $str as pattern	DEFAULT: 0
> ##
> proc ::tkchat::find {w str args} {
>     $w tag remove find 1.0 end
>     set truth {^(1|yes|true|on)$}
>     set opts  {}
>     foreach {key val} $args {
> 	switch -glob -- $key {
> 	    -c* { if {[regexp -nocase $truth $val]} { set case 1 } }
> 	    -r* { if {[regexp -nocase $truth $val]} { lappend opts -regexp } }
> 	    default { return -code error "Unknown option $key" }
> 	}
>     }
>     if {![info exists case]} { lappend opts -nocase }
>     if {[string match {} $str]} return
>     $w mark set findmark 1.0
>     while {[string compare {} [set ix [eval $w search $opts -count numc -- \
> 	    [list $str] findmark end]]]} {
> 	$w tag add find $ix ${ix}+${numc}c
> 	$w mark set findmark ${ix}+1c
>     }
>     $w tag configure find -background yellow
> #    catch {$w see find.first}
>     return [expr {[llength [$w tag ranges find]]/2}]