|
|
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: # $tk_priv(selectMode@$w) holds one of "char", "word", or "line" to ! 18: # indicate which selection mode is active. ! 19: ! 20: # The procedure below is invoked when dragging one end of the selection. ! 21: # The arguments are the text window name and the index of the character ! 22: # that is to be the new end of the selection. ! 23: ! 24: proc tk_textSelectTo {w x {y ""}} { ! 25: global tk_priv ! 26: if {$y != ""} { ! 27: set index @$x,$y ! 28: } else { ! 29: set index $x ! 30: } ! 31: ! 32: if {![info exists tk_priv(selectMode@$w)]} { ! 33: set tk_priv(selectMode@$w) "char" ! 34: } ! 35: case $tk_priv(selectMode@$w) { ! 36: char { ! 37: if [$w compare $index < anchor] { ! 38: set first $index ! 39: set last anchor ! 40: } else { ! 41: set first anchor ! 42: set last [$w index $index+1c] ! 43: } ! 44: } ! 45: word { ! 46: if [$w compare $index < anchor] { ! 47: set first [$w index "$index wordstart"] ! 48: set last [$w index "anchor wordend"] ! 49: } else { ! 50: set first [$w index "anchor wordstart"] ! 51: set last [$w index "$index wordend"] ! 52: } ! 53: } ! 54: line { ! 55: if [$w compare $index < anchor] { ! 56: set first [$w index "$index linestart"] ! 57: set last [$w index "anchor lineend + 1c"] ! 58: } else { ! 59: set first [$w index "anchor linestart"] ! 60: set last [$w index "$index lineend + 1c"] ! 61: } ! 62: } ! 63: } ! 64: $w tag remove sel 0.0 $first ! 65: $w tag add sel $first $last ! 66: $w tag remove sel $last end ! 67: } ! 68: ! 69: # The procedure below is invoked to backspace over one character in ! 70: # a text widget. The name of the widget is passed as argument. ! 71: ! 72: proc tk_textBackspace w { ! 73: catch {$w delete insert-1c insert} ! 74: } ! 75: ! 76: # The procedure below compares three indices, a, b, and c. Index b must ! 77: # be less than c. The procedure returns 1 if a is closer to b than to c, ! 78: # and 0 otherwise. The "w" argument is the name of the text widget in ! 79: # which to do the comparison. ! 80: ! 81: proc tk_textIndexCloser {w a b c} { ! 82: set a [$w index $a] ! 83: set b [$w index $b] ! 84: set c [$w index $c] ! 85: if [$w compare $a <= $b] { ! 86: return 1 ! 87: } ! 88: if [$w compare $a >= $c] { ! 89: return 0 ! 90: } ! 91: scan $a "%d.%d" lineA chA ! 92: scan $b "%d.%d" lineB chB ! 93: scan $c "%d.%d" lineC chC ! 94: if {$chC == 0} { ! 95: incr lineC -1 ! 96: set chC [string length [$w get $lineC.0 $lineC.end]] ! 97: } ! 98: if {$lineB != $lineC} { ! 99: return [expr {($lineA-$lineB) < ($lineC-$lineA)}] ! 100: } ! 101: return [expr {($chA-$chB) < ($chC-$chA)}] ! 102: } ! 103: ! 104: # The procedure below is called to reset the selection anchor to ! 105: # whichever end is FARTHEST from the index argument. ! 106: ! 107: proc tk_textResetAnchor {w x y} { ! 108: global tk_priv ! 109: set index @$x,$y ! 110: if {[$w tag ranges sel] == ""} { ! 111: set tk_priv(selectMode@$w) char ! 112: $w mark set anchor $index ! 113: return ! 114: } ! 115: if [tk_textIndexCloser $w $index sel.first sel.last] { ! 116: if {![info exists tk_priv(selectMode@$w)]} { ! 117: set tk_priv(selectMode@$w) "char" ! 118: } ! 119: if {$tk_priv(selectMode@$w) == "char"} { ! 120: $w mark set anchor sel.last ! 121: } else { ! 122: $w mark set anchor sel.last-1c ! 123: } ! 124: } else { ! 125: $w mark set anchor sel.first ! 126: } ! 127: } ! 128: ! 129: proc tk_textDown {w x y} { ! 130: global tk_priv ! 131: set tk_priv(selectMode@$w) char ! 132: $w mark set insert @$x,$y ! 133: $w mark set anchor insert ! 134: if {[lindex [$w config -state] 4] == "normal"} {focus $w} ! 135: } ! 136: ! 137: proc tk_textDoubleDown {w x y} { ! 138: global tk_priv ! 139: set tk_priv(selectMode@$w) word ! 140: $w mark set insert "@$x,$y wordstart" ! 141: tk_textSelectTo $w insert ! 142: } ! 143: ! 144: proc tk_textTripleDown {w x y} { ! 145: global tk_priv ! 146: set tk_priv(selectMode@$w) line ! 147: $w mark set insert "@$x,$y linestart" ! 148: tk_textSelectTo $w insert ! 149: } ! 150: ! 151: proc tk_textAdjustTo {w x y} { ! 152: tk_textResetAnchor $w $x $y ! 153: tk_textSelectTo $w $x $y ! 154: } ! 155: ! 156: proc tk_textKeyPress {w a} { ! 157: if {"$a" != ""} { ! 158: $w insert insert $a ! 159: $w yview -pickplace insert ! 160: } ! 161: } ! 162: ! 163: proc tk_textReturnPress {w} { ! 164: $w insert insert \n ! 165: $w yview -pickplace insert ! 166: } ! 167: ! 168: proc tk_textDelPress {w} { ! 169: tk_textBackspace $w ! 170: $w yview -pickplace insert ! 171: } ! 172: ! 173: proc tk_textCutPress {w} { ! 174: catch {$w delete sel.first sel.last} ! 175: } ! 176: ! 177: proc tk_textCopyPress {w} { ! 178: set sel "" ! 179: catch {set sel [selection -window $w get]} ! 180: $w insert $sel ! 181: $w yview -pickplace insert ! 182: } ! 183: ! 184:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.