# ------------------------------------------------------------------------------ # easyCtextCommenting.tcl for [tG²] # Copyright (C) 2012-2013 by Sedat Serper # Permission is hereby granted, free of charge, to any person obtaining a copy of # this software and associated documentation files (the ``Software''), to deal in # the Software without restriction, including without limitation the rights to use, # copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the # Software, and to permit persons to whom the Software is furnished to do so, # subject to the following conditions: # # The above copyright notice and this permission notice shall be included in all # copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS # FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHOR # BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF # CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE # SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # ------------------------------------------------------------------------------ # ------------------------------------------------------------------------------ # Purpose : set's bindings of ctext widget to enable user to insert or remove # hash character by mouse control, assumes line numbers of ctext # widget is set visible # Scripting & idea : Sedat Serper [SeS] # Related wiki pages: https://wiki.tcl-lang.org/24080 # Implementation: easyCtextCommenting <ctext widget path> # Usage : click with button-3, drag along the line numbers to toggle hash character # Note : As implemented in Source Editor of tG² (C) 2011-2013 # ------------------------------------------------------------------------------ # OVER-QUOTED VERSION (less preferred way of scripting) proc easyCtextCommenting {wid} { set ::oLS 0 set ::lineSelected -1 eval " bind \$wid.l <ButtonPress-3> { set markChar \[$wid.l index @0,%y\] set ::lineSelected \[lindex \[split \$markChar .\] 0\] set ::lineSelected \[$wid.l get \$lineSelected.0 \$lineSelected.end\] set ::oLs -1 $wid configure -autoseparators false } bind \$wid.l <ButtonRelease-3> { set ::lineSelected -1 $wid configure -autoseparators true } bind \$wid.l <Motion> { if {\$::lineSelected >=0} { catch { set markChar \[$wid.l index @0,%y\] set ::lineSelected \[lindex \[split \$markChar .\] 0\] set ::lineSelected \[$wid.l get \$lineSelected.0 \$lineSelected.end\] if {\$::oLs != \$::lineSelected} { set ::oLs \$::lineSelected if {\[$wid get \$::oLs.0 \$::oLs.1\] != \"\#\"} { $wid insert \$::oLs.0 \# } else { $wid delete \$::oLs.0 \$::oLs.1 } } } } } " } # BRACED VERSION (more preferred way of scripting) proc easyCtextCommenting {wid {sensButton 3}} { set ::oLS 0 set ::lineSelected -1 bind $wid.l <ButtonPress-$sensButton> { set markChar [%W index @0,%y] set ::lineSelected [lindex [split $markChar .] 0] set ::lineSelected [%W get $lineSelected.0 $lineSelected.end] set ::oLs -1 [file rootname %W] configure -autoseparators false } bind $wid.l <ButtonRelease-$sensButton> { set ::lineSelected -1 [file rootname %W] configure -autoseparators true } bind $wid.l <Motion> { if {$::lineSelected >=0} { catch { set markChar [%W index @0,%y] set ::lineSelected [lindex [split $markChar .] 0] set ::lineSelected [%W get $lineSelected.0 $lineSelected.end] if {$::oLs != $::lineSelected} { set ::oLs $::lineSelected if {[[file rootname %W] get $::oLs.0 $::oLs.1] != "#"} { [file rootname %W] insert $::oLs.0 # } else { [file rootname %W] delete $::oLs.0 $::oLs.1 } } } } } } # ------------------------------------------------------------------------------ # Test code (tested with ActiveState's tcl/tk v8.4.19 on a Win Vista machine) # ------------------------------------------------------------------------------ package require ctext pack [ctext .ct] -expand 1 -fill both easyCtextCommenting .ct