|
|
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.