package provide pdtk_text 0.1 # these procs are currently all in the global namespace because all of them # are used by 'pd' and therefore need to be in the global namespace. namespace eval ::pdtk_text:: { # proc to sanitize the 'text' proc unescape {text} { return [subst -nocommands -novariables $text] } } # create a new text object (ie. obj, msg, comment) # the initializing string ends in an extra space. This is done in case # the last character should have been a backslash ('\') which would have # had the effect of escaping the closing brace. We trim off the last # character in the string to compensate via [string range]. proc pdtk_text_new {tkcanvas tags x y text font_size color} { $tkcanvas create text $x $y -tags $tags \ -text [::pdtk_text::unescape $text] \ -fill $color -anchor nw -font [get_font_for_size $font_size] set mytag [lindex $tags 0] $tkcanvas bind $mytag "$tkcanvas icursor $mytag 0" $tkcanvas bind $mytag "$tkcanvas icursor $mytag end" # select all $tkcanvas bind $mytag \ "pdtk_text_selectall $tkcanvas $mytag" if {$::windowingsystem eq "aqua"} { # emacs bindings for Mac OS X $tkcanvas bind $mytag "$tkcanvas icursor $mytag 0" $tkcanvas bind $mytag "$tkcanvas icursor $mytag end" } } # change the text in an existing text box proc pdtk_text_set {tkcanvas tag text} { $tkcanvas itemconfig $tag -text [::pdtk_text::unescape $text] } # paste into an existing text box by literally "typing" the contents of the # clipboard, i.e. send the contents one character at a time via 'pd key' proc pdtk_pastetext {tkcanvas} { if { [catch {set buf [clipboard get]}] } { # no selection... do nothing } else { # turn unicode-encoded stuff (\u...) into unicode characters # 'unescape' needs a trailing space... set buf [::pdtk_text::unescape "${buf} " ] for {set i 0} {$i < [expr [string length $buf] - 1]} {incr i 1} { set cha [string index $buf $i] scan $cha %c keynum pdsend "[winfo toplevel $tkcanvas] key 1 $keynum 0" } } } # select all of the text in an existing text box proc pdtk_text_selectall {tkcanvas mytag} { if {$::editmode([winfo toplevel $tkcanvas])} { $tkcanvas select from $mytag 0 $tkcanvas select to $mytag end } } # de/activate a text box for editing based on $editing flag proc pdtk_text_editing {mytoplevel tag editing} { set tkcanvas [tkcanvas_name $mytoplevel] if {$editing == 0} {selection clear $tkcanvas} $tkcanvas focus $tag set ::editingtext($mytoplevel) $editing }