text.tcl –

This file defines the default bindings for Tk text widgets and provides

procedures that help in implementing the bindings.

RCS: @(#) $Id: text.tcl,v 1.24.2.9 2006/09/10 17:07:36 das Exp $

Copyright (c) 1992-1994 The Regents of the University of California.

Copyright (c) 1994-1997 Sun Microsystems, Inc.

Copyright (c) 1998 by Scriptics Corporation.

See the file “license.terms” for information on usage and redistribution

of this file, and for a DISCLAIMER OF ALL WARRANTIES.

#———————————————————————––

Elements of ::tk::Priv that are used in this file:

afterId - If non-null, it means that auto-scanning is underway

and it gives the “after” id for the next auto-scan

command to be executed.

char - Character position on the line; kept in order

to allow moving up or down past short lines while

still remembering the desired position.

mouseMoved - Non-zero means the mouse has moved a significant

amount since the button went down (so, for example,

start dragging out a selection).

prevPos - Used when moving up or down lines via the keyboard.

Keeps track of the previous insert position, so

we can distinguish a series of ups and downs, all

in a row, from a new up or down.

selectMode - The style of selection currently underway:

char, word, or line.

x, y - Last known mouse coordinates for scanning

and auto-scanning.

#———————————————————————––

#———————————————————————––

The code below creates the default class bindings for text widgets.

#———————————————————————––

Standard Motif bindings:

bind Text <1> {
tk::TextButton1 %W %x %y
%W tag remove sel 0.0 end
}
bind Text {
set tk::Priv(x) %x
set tk::Priv(y) %y
tk::TextSelectTo %W %x %y
}
bind Text {
set tk::Priv(selectMode) word
tk::TextSelectTo %W %x %y
catch {%W mark set insert sel.last}
}
bind Text {
set tk::Priv(selectMode) line
tk::TextSelectTo %W %x %y
catch {%W mark set insert sel.last}
}
bind Text {
tk::TextResetAnchor %W @%x,%y
set tk::Priv(selectMode) char
tk::TextSelectTo %W %x %y
}
bind Text {
set tk::Priv(selectMode) word
tk::TextSelectTo %W %x %y 1
}
bind Text {
set tk::Priv(selectMode) line
tk::TextSelectTo %W %x %y
}
bind Text {
set tk::Priv(x) %x
set tk::Priv(y) %y
tk::TextAutoScan %W
}
bind Text {
tk::CancelRepeat
}
bind Text {
tk::CancelRepeat
}
bind Text {
%W mark set insert @%x,%y
}
bind Text {
tk::TextSetCursor %W insert-1c
}
bind Text {
tk::TextSetCursor %W insert+1c
}
bind Text {
tk::TextSetCursor %W [tk::TextUpDownLine %W -1]
}
bind Text {
tk::TextSetCursor %W [tk::TextUpDownLine %W 1]
}
bind Text {
tk::TextKeySelect %W [%W index {insert - 1c}]
}
bind Text {
tk::TextKeySelect %W [%W index {insert + 1c}]
}
bind Text {
tk::TextKeySelect %W [tk::TextUpDownLine %W -1]
}
bind Text {
tk::TextKeySelect %W [tk::TextUpDownLine %W 1]
}
bind Text {
tk::TextSetCursor %W [tk::TextPrevPos %W insert tcl_startOfPreviousWord]
}
bind Text {
tk::TextSetCursor %W [tk::TextNextWord %W insert]
}
bind Text {
tk::TextSetCursor %W [tk::TextPrevPara %W insert]
}
bind Text {
tk::TextSetCursor %W [tk::TextNextPara %W insert]
}
bind Text {
tk::TextKeySelect %W [tk::TextPrevPos %W insert tcl_startOfPreviousWord]
}
bind Text {
tk::TextKeySelect %W [tk::TextNextWord %W insert]
}
bind Text {
tk::TextKeySelect %W [tk::TextPrevPara %W insert]
}
bind Text {
tk::TextKeySelect %W [tk::TextNextPara %W insert]
}
bind Text {
tk::TextSetCursor %W [tk::TextScrollPages %W -1]
}
bind Text {
tk::TextKeySelect %W [tk::TextScrollPages %W -1]
}
bind Text {
tk::TextSetCursor %W [tk::TextScrollPages %W 1]
}
bind Text {
tk::TextKeySelect %W [tk::TextScrollPages %W 1]
}
bind Text {
%W xview scroll -1 page
}
bind Text {
%W xview scroll 1 page
}

bind Text {
tk::TextSetCursor %W {insert linestart}
}
bind Text {
tk::TextKeySelect %W {insert linestart}
}
bind Text {
tk::TextSetCursor %W {insert lineend}
}
bind Text {
tk::TextKeySelect %W {insert lineend}
}
bind Text {
tk::TextSetCursor %W 1.0
}
bind Text {
tk::TextKeySelect %W 1.0
}
bind Text {
tk::TextSetCursor %W {end - 1 char}
}
bind Text {
tk::TextKeySelect %W {end - 1 char}
}

bind Text {
if { [%W cget -state] eq “normal” } {
tk::TextInsert %W \t
focus %W
break
}
}
bind Text {
# Needed only to keep binding from triggering; doesn’t
# have to actually do anything.
break
}
bind Text {
focus [tk_focusNext %W]
}
bind Text {
focus [tk_focusPrev %W]
}
bind Text {
tk::TextInsert %W \t
}
bind Text {
tk::TextInsert %W \n
if {[%W cget -autoseparators]} {%W edit separator}
}
bind Text {
if {[%W tag nextrange sel 1.0 end] ne “”} {
%W delete sel.first sel.last
} else {
%W delete insert
%W see insert
}
}
bind Text {
if {[%W tag nextrange sel 1.0 end] ne “”} {
%W delete sel.first sel.last
} elseif {[%W compare insert != 1.0]} {
%W delete insert-1c
%W see insert
}
}

bind Text {
%W mark set anchor insert
}
bind Text