|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
bind Text <1> { |
|
tk::TextButton1 %W %x %y |
|
%W tag remove sel 0.0 end |
|
} |
|
bind Text <B1-Motion> { |
|
set tk::Priv(x) %x |
|
set tk::Priv(y) %y |
|
tk::TextSelectTo %W %x %y |
|
} |
|
bind Text <Double-1> { |
|
set tk::Priv(selectMode) word |
|
tk::TextSelectTo %W %x %y |
|
catch {%W mark set insert sel.first} |
|
} |
|
bind Text <Triple-1> { |
|
set tk::Priv(selectMode) line |
|
tk::TextSelectTo %W %x %y |
|
catch {%W mark set insert sel.first} |
|
} |
|
bind Text <Shift-1> { |
|
tk::TextResetAnchor %W @%x,%y |
|
set tk::Priv(selectMode) char |
|
tk::TextSelectTo %W %x %y |
|
} |
|
bind Text <Double-Shift-1> { |
|
set tk::Priv(selectMode) word |
|
tk::TextSelectTo %W %x %y 1 |
|
} |
|
bind Text <Triple-Shift-1> { |
|
set tk::Priv(selectMode) line |
|
tk::TextSelectTo %W %x %y |
|
} |
|
bind Text <B1-Leave> { |
|
set tk::Priv(x) %x |
|
set tk::Priv(y) %y |
|
tk::TextAutoScan %W |
|
} |
|
bind Text <B1-Enter> { |
|
tk::CancelRepeat |
|
} |
|
bind Text <ButtonRelease-1> { |
|
tk::CancelRepeat |
|
} |
|
bind Text <Control-1> { |
|
%W mark set insert @%x,%y |
|
|
|
|
|
if {[%W cget -autoseparators]} { |
|
%W edit separator |
|
} |
|
} |
|
|
|
bind Text <Double-Control-1> { # nothing } |
|
|
|
bind Text <Control-B1-Motion> { # nothing } |
|
bind Text <<PrevChar>> { |
|
tk::TextSetCursor %W insert-1displayindices |
|
} |
|
bind Text <<NextChar>> { |
|
tk::TextSetCursor %W insert+1displayindices |
|
} |
|
bind Text <<PrevLine>> { |
|
tk::TextSetCursor %W [tk::TextUpDownLine %W -1] |
|
} |
|
bind Text <<NextLine>> { |
|
tk::TextSetCursor %W [tk::TextUpDownLine %W 1] |
|
} |
|
bind Text <<SelectPrevChar>> { |
|
tk::TextKeySelect %W [%W index {insert - 1displayindices}] |
|
} |
|
bind Text <<SelectNextChar>> { |
|
tk::TextKeySelect %W [%W index {insert + 1displayindices}] |
|
} |
|
bind Text <<SelectPrevLine>> { |
|
tk::TextKeySelect %W [tk::TextUpDownLine %W -1] |
|
} |
|
bind Text <<SelectNextLine>> { |
|
tk::TextKeySelect %W [tk::TextUpDownLine %W 1] |
|
} |
|
bind Text <<PrevWord>> { |
|
tk::TextSetCursor %W [tk::TextPrevPos %W insert tcl_startOfPreviousWord] |
|
} |
|
bind Text <<NextWord>> { |
|
tk::TextSetCursor %W [tk::TextNextWord %W insert] |
|
} |
|
bind Text <<PrevPara>> { |
|
tk::TextSetCursor %W [tk::TextPrevPara %W insert] |
|
} |
|
bind Text <<NextPara>> { |
|
tk::TextSetCursor %W [tk::TextNextPara %W insert] |
|
} |
|
bind Text <<SelectPrevWord>> { |
|
tk::TextKeySelect %W [tk::TextPrevPos %W insert tcl_startOfPreviousWord] |
|
} |
|
bind Text <<SelectNextWord>> { |
|
tk::TextKeySelect %W [tk::TextNextWord %W insert] |
|
} |
|
bind Text <<SelectPrevPara>> { |
|
tk::TextKeySelect %W [tk::TextPrevPara %W insert] |
|
} |
|
bind Text <<SelectNextPara>> { |
|
tk::TextKeySelect %W [tk::TextNextPara %W insert] |
|
} |
|
bind Text <Prior> { |
|
tk::TextSetCursor %W [tk::TextScrollPages %W -1] |
|
} |
|
bind Text <Shift-Prior> { |
|
tk::TextKeySelect %W [tk::TextScrollPages %W -1] |
|
} |
|
bind Text <Next> { |
|
tk::TextSetCursor %W [tk::TextScrollPages %W 1] |
|
} |
|
bind Text <Shift-Next> { |
|
tk::TextKeySelect %W [tk::TextScrollPages %W 1] |
|
} |
|
bind Text <Control-Prior> { |
|
%W xview scroll -1 page |
|
} |
|
bind Text <Control-Next> { |
|
%W xview scroll 1 page |
|
} |
|
|
|
bind Text <<LineStart>> { |
|
tk::TextSetCursor %W {insert display linestart} |
|
} |
|
bind Text <<SelectLineStart>> { |
|
tk::TextKeySelect %W {insert display linestart} |
|
} |
|
bind Text <<LineEnd>> { |
|
tk::TextSetCursor %W {insert display lineend} |
|
} |
|
bind Text <<SelectLineEnd>> { |
|
tk::TextKeySelect %W {insert display lineend} |
|
} |
|
bind Text <Control-Home> { |
|
tk::TextSetCursor %W 1.0 |
|
} |
|
bind Text <Control-Shift-Home> { |
|
tk::TextKeySelect %W 1.0 |
|
} |
|
bind Text <Control-End> { |
|
tk::TextSetCursor %W {end - 1 indices} |
|
} |
|
bind Text <Control-Shift-End> { |
|
tk::TextKeySelect %W {end - 1 indices} |
|
} |
|
|
|
bind Text <Tab> { |
|
if {[%W cget -state] eq "normal"} { |
|
tk::TextInsert %W \t |
|
focus %W |
|
break |
|
} |
|
} |
|
bind Text <Shift-Tab> { |
|
|
|
|
|
break |
|
} |
|
bind Text <Control-Tab> { |
|
focus [tk_focusNext %W] |
|
} |
|
bind Text <Control-Shift-Tab> { |
|
focus [tk_focusPrev %W] |
|
} |
|
bind Text <Control-i> { |
|
tk::TextInsert %W \t |
|
} |
|
bind Text <Return> { |
|
tk::TextInsert %W \n |
|
if {[%W cget -autoseparators]} { |
|
%W edit separator |
|
} |
|
} |
|
bind Text <Delete> { |
|
if {[tk::TextCursorInSelection %W]} { |
|
%W delete sel.first sel.last |
|
} else { |
|
if {[%W compare end != insert+1c]} { |
|
%W delete insert |
|
} |
|
%W see insert |
|
} |
|
} |
|
bind Text <BackSpace> { |
|
if {[tk::TextCursorInSelection %W]} { |
|
%W delete sel.first sel.last |
|
} else { |
|
if {[%W compare insert != 1.0]} { |
|
%W delete insert-1c |
|
} |
|
%W see insert |
|
} |
|
} |
|
|
|
bind Text <Control-space> { |
|
%W mark set [tk::TextAnchor %W] insert |
|
} |
|
bind Text <Select> { |
|
%W mark set [tk::TextAnchor %W] insert |
|
} |
|
bind Text <Control-Shift-space> { |
|
set tk::Priv(selectMode) char |
|
tk::TextKeyExtend %W insert |
|
} |
|
bind Text <Shift-Select> { |
|
set tk::Priv(selectMode) char |
|
tk::TextKeyExtend %W insert |
|
} |
|
bind Text <<SelectAll>> { |
|
%W tag add sel 1.0 end |
|
} |
|
bind Text <<SelectNone>> { |
|
%W tag remove sel 1.0 end |
|
|
|
|
|
if {[%W cget -autoseparators]} { |
|
%W edit separator |
|
} |
|
} |
|
bind Text <<Cut>> { |
|
tk_textCut %W |
|
} |
|
bind Text <<Copy>> { |
|
tk_textCopy %W |
|
} |
|
bind Text <<Paste>> { |
|
tk_textPaste %W |
|
} |
|
bind Text <<Clear>> { |
|
|
|
|
|
if {[%W cget -autoseparators]} { |
|
%W edit separator |
|
} |
|
catch {%W delete sel.first sel.last} |
|
if {[%W cget -autoseparators]} { |
|
%W edit separator |
|
} |
|
} |
|
bind Text <<PasteSelection>> { |
|
if {$tk_strictMotif || ![info exists tk::Priv(mouseMoved)] |
|
|| !$tk::Priv(mouseMoved)} { |
|
tk::TextPasteSelection %W %x %y |
|
} |
|
} |
|
bind Text <Insert> { |
|
catch {tk::TextInsert %W [::tk::GetSelection %W PRIMARY]} |
|
} |
|
bind Text <KeyPress> { |
|
tk::TextInsert %W %A |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
bind Text <Alt-KeyPress> {# nothing } |
|
bind Text <Meta-KeyPress> {# nothing} |
|
bind Text <Control-KeyPress> {# nothing} |
|
bind Text <Escape> {# nothing} |
|
bind Text <KP_Enter> {# nothing} |
|
if {[tk windowingsystem] eq "aqua"} { |
|
bind Text <Command-KeyPress> {# nothing} |
|
} |
|
|
|
|
|
|
|
bind Text <Control-d> { |
|
if {!$tk_strictMotif && [%W compare end != insert+1c]} { |
|
%W delete insert |
|
} |
|
} |
|
bind Text <Control-k> { |
|
if {!$tk_strictMotif && [%W compare end != insert+1c]} { |
|
if {[%W compare insert == {insert lineend}]} { |
|
%W delete insert |
|
} else { |
|
%W delete insert {insert lineend} |
|
} |
|
} |
|
} |
|
bind Text <Control-o> { |
|
if {!$tk_strictMotif} { |
|
%W insert insert \n |
|
%W mark set insert insert-1c |
|
} |
|
} |
|
bind Text <Control-t> { |
|
if {!$tk_strictMotif} { |
|
tk::TextTranspose %W |
|
} |
|
} |
|
|
|
bind Text <<Undo>> { |
|
|
|
|
|
|
|
if {[%W cget -autoseparators]} { |
|
%W edit separator |
|
} |
|
catch { %W edit undo } |
|
if {[%W cget -autoseparators]} { |
|
%W edit separator |
|
} |
|
} |
|
|
|
bind Text <<Redo>> { |
|
catch { %W edit redo } |
|
} |
|
|
|
bind Text <Meta-b> { |
|
if {!$tk_strictMotif} { |
|
tk::TextSetCursor %W [tk::TextPrevPos %W insert tcl_startOfPreviousWord] |
|
} |
|
} |
|
bind Text <Meta-d> { |
|
if {!$tk_strictMotif && [%W compare end != insert+1c]} { |
|
%W delete insert [tk::TextNextWord %W insert] |
|
} |
|
} |
|
bind Text <Meta-f> { |
|
if {!$tk_strictMotif} { |
|
tk::TextSetCursor %W [tk::TextNextWord %W insert] |
|
} |
|
} |
|
bind Text <Meta-less> { |
|
if {!$tk_strictMotif} { |
|
tk::TextSetCursor %W 1.0 |
|
} |
|
} |
|
bind Text <Meta-greater> { |
|
if {!$tk_strictMotif} { |
|
tk::TextSetCursor %W end-1c |
|
} |
|
} |
|
bind Text <Meta-BackSpace> { |
|
if {!$tk_strictMotif} { |
|
%W delete [tk::TextPrevPos %W insert tcl_startOfPreviousWord] insert |
|
} |
|
} |
|
bind Text <Meta-Delete> { |
|
if {!$tk_strictMotif} { |
|
%W delete [tk::TextPrevPos %W insert tcl_startOfPreviousWord] insert |
|
} |
|
} |
|
|
|
|
|
|
|
if {[tk windowingsystem] eq "aqua"} { |
|
bind Text <Control-v> { |
|
tk::TextScrollPages %W 1 |
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
bind Text <Control-h> { |
|
if {!$tk_strictMotif && [%W compare insert != 1.0]} { |
|
%W delete insert-1c |
|
%W see insert |
|
} |
|
} |
|
bind Text <2> { |
|
if {!$tk_strictMotif} { |
|
tk::TextScanMark %W %x %y |
|
} |
|
} |
|
bind Text <B2-Motion> { |
|
if {!$tk_strictMotif} { |
|
tk::TextScanDrag %W %x %y |
|
} |
|
} |
|
set ::tk::Priv(prevPos) {} |
|
|
|
|
|
|
|
|
|
|
|
|
|
if {[tk windowingsystem] eq "aqua"} { |
|
bind Text <MouseWheel> { |
|
%W yview scroll [expr {-15 * (%D)}] pixels |
|
} |
|
bind Text <Option-MouseWheel> { |
|
%W yview scroll [expr {-150 * (%D)}] pixels |
|
} |
|
bind Text <Shift-MouseWheel> { |
|
%W xview scroll [expr {-15 * (%D)}] pixels |
|
} |
|
bind Text <Shift-Option-MouseWheel> { |
|
%W xview scroll [expr {-150 * (%D)}] pixels |
|
} |
|
} else { |
|
|
|
|
|
|
|
|
|
|
|
|
|
bind Text <MouseWheel> { |
|
if {%D >= 0} { |
|
%W yview scroll [expr {-%D/3}] pixels |
|
} else { |
|
%W yview scroll [expr {(2-%D)/3}] pixels |
|
} |
|
} |
|
bind Text <Shift-MouseWheel> { |
|
if {%D >= 0} { |
|
%W xview scroll [expr {-%D/3}] pixels |
|
} else { |
|
%W xview scroll [expr {(2-%D)/3}] pixels |
|
} |
|
} |
|
} |
|
|
|
if {"x11" eq [tk windowingsystem]} { |
|
|
|
|
|
|
|
|
|
bind Text <4> { |
|
if {!$tk_strictMotif} { |
|
%W yview scroll -50 pixels |
|
} |
|
} |
|
bind Text <5> { |
|
if {!$tk_strictMotif} { |
|
%W yview scroll 50 pixels |
|
} |
|
} |
|
bind Text <Shift-4> { |
|
if {!$tk_strictMotif} { |
|
%W xview scroll -50 pixels |
|
} |
|
} |
|
bind Text <Shift-5> { |
|
if {!$tk_strictMotif} { |
|
%W xview scroll 50 pixels |
|
} |
|
} |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
proc ::tk::TextClosestGap {w x y} { |
|
set pos [$w index @$x,$y] |
|
set bbox [$w bbox $pos] |
|
if {$bbox eq ""} { |
|
return $pos |
|
} |
|
if {($x - [lindex $bbox 0]) < ([lindex $bbox 2]/2)} { |
|
return $pos |
|
} |
|
$w index "$pos + 1 char" |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
proc ::tk::TextButton1 {w x y} { |
|
variable ::tk::Priv |
|
|
|
set Priv(selectMode) char |
|
set Priv(mouseMoved) 0 |
|
set Priv(pressX) $x |
|
set anchorname [tk::TextAnchor $w] |
|
$w mark set insert [TextClosestGap $w $x $y] |
|
$w mark set $anchorname insert |
|
|
|
|
|
set bbox [$w bbox [$w index $anchorname]] |
|
if {$x > [lindex $bbox 0]} { |
|
$w mark gravity $anchorname right |
|
} else { |
|
$w mark gravity $anchorname left |
|
} |
|
|
|
|
|
if {[tk windowingsystem] eq "win32" \ |
|
|| [$w cget -state] eq "normal"} { |
|
focus $w |
|
} |
|
if {[$w cget -autoseparators]} { |
|
$w edit separator |
|
} |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
set ::tk::Priv(textanchoruid) 0 |
|
|
|
proc ::tk::TextAnchor {w} { |
|
variable Priv |
|
if {![info exists Priv(textanchor,$w)]} { |
|
set Priv(textanchor,$w) tk::anchor[incr Priv(textanchoruid)] |
|
} |
|
return $Priv(textanchor,$w) |
|
} |
|
|
|
proc ::tk::TextSelectTo {w x y {extend 0}} { |
|
variable ::tk::Priv |
|
|
|
set anchorname [tk::TextAnchor $w] |
|
set cur [TextClosestGap $w $x $y] |
|
if {[catch {$w index $anchorname}]} { |
|
$w mark set $anchorname $cur |
|
} |
|
set anchor [$w index $anchorname] |
|
if {[$w compare $cur != $anchor] || (abs($Priv(pressX) - $x) >= 3)} { |
|
set Priv(mouseMoved) 1 |
|
} |
|
switch -- $Priv(selectMode) { |
|
char { |
|
if {[$w compare $cur < $anchorname]} { |
|
set first $cur |
|
set last $anchorname |
|
} else { |
|
set first $anchorname |
|
set last $cur |
|
} |
|
} |
|
word { |
|
|
|
if {[$w mark gravity $anchorname] eq "right"} { |
|
set first $anchorname |
|
set last "$anchorname + 1c" |
|
} else { |
|
set first "$anchorname - 1c" |
|
set last $anchorname |
|
} |
|
|
|
if {[$w compare $cur < $first]} { |
|
set first $cur |
|
} elseif {[$w compare $cur > $last]} { |
|
set last $cur |
|
} |
|
|
|
|
|
set first [TextPrevPos $w "$first + 1c" tcl_wordBreakBefore] |
|
set last [TextNextPos $w "$last - 1c" tcl_wordBreakAfter] |
|
} |
|
line { |
|
|
|
set first "$anchorname linestart" |
|
set last "$anchorname lineend" |
|
|
|
|
|
if {[$w compare $cur < $first]} { |
|
set first "$cur linestart" |
|
} elseif {[$w compare $cur > $last]} { |
|
set last "$cur lineend" |
|
} |
|
set first [$w index $first] |
|
set last [$w index "$last + 1c"] |
|
} |
|
} |
|
if {$Priv(mouseMoved) || ($Priv(selectMode) ne "char")} { |
|
$w tag remove sel 0.0 end |
|
$w mark set insert $cur |
|
$w tag add sel $first $last |
|
$w tag remove sel $last end |
|
update idletasks |
|
} |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
proc ::tk::TextKeyExtend {w index} { |
|
|
|
set anchorname [tk::TextAnchor $w] |
|
set cur [$w index $index] |
|
if {[catch {$w index $anchorname}]} { |
|
$w mark set $anchorname $cur |
|
} |
|
set anchor [$w index $anchorname] |
|
if {[$w compare $cur < $anchorname]} { |
|
set first $cur |
|
set last $anchorname |
|
} else { |
|
set first $anchorname |
|
set last $cur |
|
} |
|
$w tag remove sel 0.0 $first |
|
$w tag add sel $first $last |
|
$w tag remove sel $last end |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
proc ::tk::TextPasteSelection {w x y} { |
|
$w mark set insert [TextClosestGap $w $x $y] |
|
if {![catch {::tk::GetSelection $w PRIMARY} sel]} { |
|
set oldSeparator [$w cget -autoseparators] |
|
if {$oldSeparator} { |
|
$w configure -autoseparators 0 |
|
$w edit separator |
|
} |
|
$w insert insert $sel |
|
if {$oldSeparator} { |
|
$w edit separator |
|
$w configure -autoseparators 1 |
|
} |
|
} |
|
if {[$w cget -state] eq "normal"} { |
|
focus $w |
|
} |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
proc ::tk::TextAutoScan {w} { |
|
variable ::tk::Priv |
|
if {![winfo exists $w]} { |
|
return |
|
} |
|
if {$Priv(y) >= [winfo height $w]} { |
|
$w yview scroll [expr {1 + $Priv(y) - [winfo height $w]}] pixels |
|
} elseif {$Priv(y) < 0} { |
|
$w yview scroll [expr {-1 + $Priv(y)}] pixels |
|
} elseif {$Priv(x) >= [winfo width $w]} { |
|
$w xview scroll 2 units |
|
} elseif {$Priv(x) < 0} { |
|
$w xview scroll -2 units |
|
} else { |
|
return |
|
} |
|
TextSelectTo $w $Priv(x) $Priv(y) |
|
set Priv(afterId) [after 50 [list tk::TextAutoScan $w]] |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
proc ::tk::TextSetCursor {w pos} { |
|
if {[$w compare $pos == end]} { |
|
set pos {end - 1 chars} |
|
} |
|
$w mark set insert $pos |
|
$w tag remove sel 1.0 end |
|
$w see insert |
|
if {[$w cget -autoseparators]} { |
|
$w edit separator |
|
} |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
proc ::tk::TextKeySelect {w new} { |
|
set anchorname [tk::TextAnchor $w] |
|
if {[$w tag nextrange sel 1.0 end] eq ""} { |
|
if {[$w compare $new < insert]} { |
|
$w tag add sel $new insert |
|
} else { |
|
$w tag add sel insert $new |
|
} |
|
$w mark set $anchorname insert |
|
} else { |
|
if {[catch {$w index $anchorname}]} { |
|
$w mark set $anchorname insert |
|
} |
|
if {[$w compare $new < $anchorname]} { |
|
set first $new |
|
set last $anchorname |
|
} else { |
|
set first $anchorname |
|
set last $new |
|
} |
|
$w tag remove sel 1.0 $first |
|
$w tag add sel $first $last |
|
$w tag remove sel $last end |
|
} |
|
$w mark set insert $new |
|
$w see insert |
|
update idletasks |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
proc ::tk::TextResetAnchor {w index} { |
|
if {[$w tag ranges sel] eq ""} { |
|
|
|
|
|
|
|
|
|
return |
|
} |
|
set anchorname [tk::TextAnchor $w] |
|
set a [$w index $index] |
|
set b [$w index sel.first] |
|
set c [$w index sel.last] |
|
if {[$w compare $a < $b]} { |
|
$w mark set $anchorname sel.last |
|
return |
|
} |
|
if {[$w compare $a > $c]} { |
|
$w mark set $anchorname sel.first |
|
return |
|
} |
|
scan $a "%d.%d" lineA chA |
|
scan $b "%d.%d" lineB chB |
|
scan $c "%d.%d" lineC chC |
|
if {$lineB < $lineC+2} { |
|
set total [string length [$w get $b $c]] |
|
if {$total <= 2} { |
|
return |
|
} |
|
if {[string length [$w get $b $a]] < ($total/2)} { |
|
$w mark set $anchorname sel.last |
|
} else { |
|
$w mark set $anchorname sel.first |
|
} |
|
return |
|
} |
|
if {($lineA-$lineB) < ($lineC-$lineA)} { |
|
$w mark set $anchorname sel.last |
|
} else { |
|
$w mark set $anchorname sel.first |
|
} |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
proc ::tk::TextCursorInSelection {w} { |
|
expr { |
|
[llength [$w tag ranges sel]] |
|
&& [$w compare sel.first <= insert] |
|
&& [$w compare sel.last >= insert] |
|
} |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
proc ::tk::TextInsert {w s} { |
|
if {$s eq "" || [$w cget -state] eq "disabled"} { |
|
return |
|
} |
|
set compound 0 |
|
if {[TextCursorInSelection $w]} { |
|
set oldSeparator [$w cget -autoseparators] |
|
if {$oldSeparator} { |
|
$w configure -autoseparators 0 |
|
$w edit separator |
|
set compound 1 |
|
} |
|
$w delete sel.first sel.last |
|
} |
|
$w insert insert $s |
|
$w see insert |
|
if {$compound && $oldSeparator} { |
|
$w edit separator |
|
$w configure -autoseparators 1 |
|
} |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
proc ::tk::TextUpDownLine {w n} { |
|
variable ::tk::Priv |
|
|
|
set i [$w index insert] |
|
if {$Priv(prevPos) ne $i} { |
|
set Priv(textPosOrig) $i |
|
} |
|
set lines [$w count -displaylines $Priv(textPosOrig) $i] |
|
set new [$w index \ |
|
"$Priv(textPosOrig) + [expr {$lines + $n}] displaylines"] |
|
if {[$w compare $new == end] \ |
|
|| [$w compare $new == "insert display linestart"]} { |
|
set new $i |
|
} |
|
set Priv(prevPos) $new |
|
return $new |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
proc ::tk::TextPrevPara {w pos} { |
|
set pos [$w index "$pos linestart"] |
|
while {1} { |
|
if {([$w get "$pos - 1 line"] eq "\n" && ([$w get $pos] ne "\n")) \ |
|
|| $pos eq "1.0"} { |
|
if {[regexp -indices -- {^[ \t]+(.)} \ |
|
[$w get $pos "$pos lineend"] -> index]} { |
|
set pos [$w index "$pos + [lindex $index 0] chars"] |
|
} |
|
if {[$w compare $pos != insert] || [lindex [split $pos .] 0]==1} { |
|
return $pos |
|
} |
|
} |
|
set pos [$w index "$pos - 1 line"] |
|
} |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
proc ::tk::TextNextPara {w start} { |
|
set pos [$w index "$start linestart + 1 line"] |
|
while {[$w get $pos] ne "\n"} { |
|
if {[$w compare $pos == end]} { |
|
return [$w index "end - 1c"] |
|
} |
|
set pos [$w index "$pos + 1 line"] |
|
} |
|
while {[$w get $pos] eq "\n"} { |
|
set pos [$w index "$pos + 1 line"] |
|
if {[$w compare $pos == end]} { |
|
return [$w index "end - 1c"] |
|
} |
|
} |
|
if {[regexp -indices -- {^[ \t]+(.)} \ |
|
[$w get $pos "$pos lineend"] -> index]} { |
|
return [$w index "$pos + [lindex $index 0] chars"] |
|
} |
|
return $pos |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
proc ::tk::TextScrollPages {w count} { |
|
set bbox [$w bbox insert] |
|
$w yview scroll $count pages |
|
if {$bbox eq ""} { |
|
return [$w index @[expr {[winfo height $w]/2}],0] |
|
} |
|
return [$w index @[lindex $bbox 0],[lindex $bbox 1]] |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
proc ::tk::TextTranspose w { |
|
set pos insert |
|
if {[$w compare $pos != "$pos lineend"]} { |
|
set pos [$w index "$pos + 1 char"] |
|
} |
|
set new [$w get "$pos - 1 char"][$w get "$pos - 2 char"] |
|
if {[$w compare "$pos - 1 char" == 1.0]} { |
|
return |
|
} |
|
|
|
set autosep [$w cget -autoseparators] |
|
if {$autosep} { |
|
$w configure -autoseparators 0 |
|
$w edit separator |
|
} |
|
$w delete "$pos - 2 char" $pos |
|
$w insert insert $new |
|
$w see insert |
|
if {$autosep} { |
|
$w edit separator |
|
$w configure -autoseparators $autosep |
|
} |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
proc ::tk_textCopy w { |
|
if {![catch {set data [$w get sel.first sel.last]}]} { |
|
clipboard clear -displayof $w |
|
clipboard append -displayof $w $data |
|
} |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
proc ::tk_textCut w { |
|
if {![catch {set data [$w get sel.first sel.last]}]} { |
|
|
|
|
|
set oldSeparator [$w cget -autoseparators] |
|
if {([$w cget -state] eq "normal") && $oldSeparator} { |
|
$w edit separator |
|
} |
|
clipboard clear -displayof $w |
|
clipboard append -displayof $w $data |
|
$w delete sel.first sel.last |
|
if {([$w cget -state] eq "normal") && $oldSeparator} { |
|
$w edit separator |
|
} |
|
} |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
proc ::tk_textPaste w { |
|
if {![catch {::tk::GetSelection $w CLIPBOARD} sel]} { |
|
set oldSeparator [$w cget -autoseparators] |
|
if {$oldSeparator} { |
|
$w configure -autoseparators 0 |
|
$w edit separator |
|
} |
|
if {[tk windowingsystem] ne "x11"} { |
|
catch { $w delete sel.first sel.last } |
|
} |
|
$w insert insert $sel |
|
if {$oldSeparator} { |
|
$w edit separator |
|
$w configure -autoseparators 1 |
|
} |
|
} |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if {[tk windowingsystem] eq "win32"} { |
|
proc ::tk::TextNextWord {w start} { |
|
TextNextPos $w [TextNextPos $w $start tcl_endOfWord] \ |
|
tcl_startOfNextWord |
|
} |
|
} else { |
|
proc ::tk::TextNextWord {w start} { |
|
TextNextPos $w $start tcl_endOfWord |
|
} |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
proc ::tk::TextNextPos {w start op} { |
|
set text "" |
|
set cur $start |
|
while {[$w compare $cur < end]} { |
|
set text $text[$w get -displaychars $cur "$cur lineend + 1c"] |
|
set pos [$op $text 0] |
|
if {$pos >= 0} { |
|
return [$w index "$start + $pos display chars"] |
|
} |
|
set cur [$w index "$cur lineend +1c"] |
|
} |
|
return end |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
proc ::tk::TextPrevPos {w start op} { |
|
set text "" |
|
set cur $start |
|
while {[$w compare $cur > 0.0]} { |
|
set text [$w get -displaychars "$cur linestart - 1c" $cur]$text |
|
set pos [$op $text end] |
|
if {$pos >= 0} { |
|
return [$w index "$cur linestart - 1c + $pos display chars"] |
|
} |
|
set cur [$w index "$cur linestart - 1c"] |
|
} |
|
return 0.0 |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
proc ::tk::TextScanMark {w x y} { |
|
variable ::tk::Priv |
|
$w scan mark $x $y |
|
set Priv(x) $x |
|
set Priv(y) $y |
|
set Priv(mouseMoved) 0 |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
proc ::tk::TextScanDrag {w x y} { |
|
variable ::tk::Priv |
|
|
|
|
|
if {![info exists Priv(x)]} { |
|
set Priv(x) $x |
|
} |
|
if {![info exists Priv(y)]} { |
|
set Priv(y) $y |
|
} |
|
if {($x != $Priv(x)) || ($y != $Priv(y))} { |
|
set Priv(mouseMoved) 1 |
|
} |
|
if {[info exists Priv(mouseMoved)] && $Priv(mouseMoved)} { |
|
$w scan dragto $x $y |
|
} |
|
} |
|
|