Annotation of micropolis/res/text.tcl, revision 1.1.1.1

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: 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.