|
|
1.1 ! root 1: # text.tcl -- ! 2: # ! 3: # This file contains Tcl procedures used to manage Tk entries. ! 4: # ! 5: # $Header: /user6/ouster/wish/scripts/RCS/text.tcl,v 1.2 92/07/16 16:26:33 ouster Exp $ SPRITE (Berkeley) ! 6: # ! 7: # Copyright 1992 Regents of the University of California ! 8: # Permission to use, copy, modify, and distribute this ! 9: # software and its documentation for any purpose and without ! 10: # fee is hereby granted, provided that this copyright ! 11: # notice appears in all copies. The University of California ! 12: # makes no representations about the suitability of this ! 13: # software for any purpose. It is provided "as is" without ! 14: # express or implied warranty. ! 15: # ! 16: ! 17: # The procedure below is invoked when dragging one end of the selection. ! 18: # The arguments are the text window name and the index of the character ! 19: # that is to be the new end of the selection. ! 20: ! 21: proc tk_textSelectTo {w index} { ! 22: global tk_priv ! 23: ! 24: case $tk_priv(selectMode) { ! 25: char { ! 26: if [$w compare $index < anchor] { ! 27: set first $index ! 28: set last anchor ! 29: } else { ! 30: set first anchor ! 31: set last [$w index $index+1c] ! 32: } ! 33: } ! 34: word { ! 35: if [$w compare $index < anchor] { ! 36: set first [$w index "$index wordstart"] ! 37: set last [$w index "anchor wordend"] ! 38: } else { ! 39: set first [$w index "anchor wordstart"] ! 40: set last [$w index "$index wordend"] ! 41: } ! 42: } ! 43: line { ! 44: if [$w compare $index < anchor] { ! 45: set first [$w index "$index linestart"] ! 46: set last [$w index "anchor lineend + 1c"] ! 47: } else { ! 48: set first [$w index "anchor linestart"] ! 49: set last [$w index "$index lineend + 1c"] ! 50: } ! 51: } ! 52: } ! 53: $w tag remove sel 0.0 $first ! 54: $w tag add sel $first $last ! 55: $w tag remove sel $last end ! 56: } ! 57: ! 58: # The procedure below is invoked to backspace over one character in ! 59: # a text widget. The name of the widget is passed as argument. ! 60: ! 61: proc tk_textBackspace w { ! 62: $w delete insert-1c insert ! 63: } ! 64: ! 65: # The procedure below compares three indices, a, b, and c. Index b must ! 66: # be less than c. The procedure returns 1 if a is closer to b than to c, ! 67: # and 0 otherwise. The "w" argument is the name of the text widget in ! 68: # which to do the comparison. ! 69: ! 70: proc tk_textIndexCloser {w a b c} { ! 71: set a [$w index $a] ! 72: set b [$w index $b] ! 73: set c [$w index $c] ! 74: if [$w compare $a <= $b] { ! 75: return 1 ! 76: } ! 77: if [$w compare $a >= $c] { ! 78: return 0 ! 79: } ! 80: scan $a "%d.%d" lineA chA ! 81: scan $b "%d.%d" lineB chB ! 82: scan $c "%d.%d" lineC chC ! 83: if {$chC == 0} { ! 84: incr lineC -1 ! 85: set chC [string length [$w get $lineC.0 $lineC.end]] ! 86: } ! 87: if {$lineB != $lineC} { ! 88: return [expr {($lineA-$lineB) < ($lineC-$lineA)}] ! 89: } ! 90: return [expr {($chA-$chB) < ($chC-$chA)}] ! 91: } ! 92: ! 93: # The procedure below is called to reset the selection anchor to ! 94: # whichever end is FARTHEST from the index argument. ! 95: ! 96: proc tk_textResetAnchor {w index} { ! 97: global tk_priv ! 98: if {[$w tag ranges sel] == ""} { ! 99: set tk_priv(selectMode) char ! 100: $w mark set anchor $index ! 101: return ! 102: } ! 103: if [tk_textIndexCloser $w $index sel.first sel.last] { ! 104: if {$tk_priv(selectMode) == "char"} { ! 105: $w mark set anchor sel.last ! 106: } else { ! 107: $w mark set anchor sel.last-1c ! 108: } ! 109: } else { ! 110: $w mark set anchor sel.first ! 111: } ! 112: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.