WJG (03-03-09) In response to the question of how to perform a text search in these widgets the following code example shows how it can be done.
# GnoclText-Search.tcl #!/bin/sh # the next line restarts using tclsh \ exec tclsh "$0" "$@" package require Gnocl # w (w)idget to search # s (s)tring to search for # h (h)ight all occuracnces (Boolean: default = 1) # e (e)xact match (Boolean: default = 1) # c (c)ase sensitive (Boolean: default = 0) # returns list of all occurances # proc gnocl::textFind { w s {h 1} {e 1} {c 0} {command {} } } { # create tag if not available already $w tag create _find_ -foreground red -onEvent {puts "HI %t %x %y"} # foreach line of the text buffer for {set i 0 } {$i < [$w getLineCount ] } {incr i} { # get the contexts set j [expr $i+1] set tmp [$w get "$i 0" "$j 0"] # make modifications for exact/partial match if {$e } { puts "not exact match" } else { puts "partial match" } # make modifications for case sensitivity if {$c } { puts "not case senstive" } else { puts "case sensitive" set s [string tolower $s] set tmp [string tolower $tmp] } # apply tag to each item, # maybe add bindings to the tag? set lst [gnocl::stringSearch $s $tmp] foreach col $lst { set colb [expr $col + [string length $s] ] $w tag apply "$i $col" "$i $colb" -tags _find_ } } return $lst } # w (w)ord to search for # s (s)tring to search within # returns list of all occurances # proc gnocl::stringSearch {w s} { set list "" set i [string first $w $s 0] set j [string length $w] while { $i != -1 } { lappend list $i incr i $j set i [string first $w $s $i] } return $list } # insert the current entry value to the top of the list proc listUpdate {w} { # get existing values set items [$w cget -items] # get current value set value [$w cget -value] # is the current item in the list? if not, add it. if { [lsearch $items $value] == -1} { # add to the front of the list set items [linsert $items 0 $value ] # update $w configure -items $items } } # The Ubiquitous Demo! if {1} { set text [gnocl::text -baseColor #F5F6BE -baseFont {Sans 15}] set win [gnocl::window -title "Text" -child $text -width 600 -height 480 -visible 0] $win configure -visible 1 $win configure -title DEMONSTRATION $text tag create bold -fontWeight bold -foreground blue $text insert end "Apple Banana Cherry\n" for {set i 0 } {$i < 10} {incr i} { $text insert end "ABCD EFGH IJKL MNOP QRST UVWX YZ\n" $text insert end "123Hello\n" -tags bold $text insert end "ABCD EFGH IJKL MNOP QRST UVWX YZ\n" $text insert end "01234567Hello\n" -tags bold $text insert end "ABCD Hello IJKL Hello QRST Hello YZ\n" } $text setCursor "0 5" foreach i {4 5 6} { set len [$text getLineLength "$i 0"] puts "Line length of line $i = $len" } gnocl::textFind $text ABC gnocl::mainLoop }
The planned 0.9.93 release of Gnocl takes advantage of the Gtk library functions to handle text searching and word replacement.