207 lines
6.5 KiB
Tcl
207 lines
6.5 KiB
Tcl
#==============================================================================
|
|
# Contains Wcb procedures for text and ctext widgets.
|
|
#
|
|
# REMARK: Everything stated below for text widgets is valid for ctext widgets,
|
|
# too.
|
|
#
|
|
# Copyright (c) 1999-2005 Csaba Nemethi (E-mail: csaba.nemethi@t-online.de)
|
|
#==============================================================================
|
|
|
|
#
|
|
# Namespace initialization
|
|
# ========================
|
|
#
|
|
|
|
namespace eval wcb {
|
|
#
|
|
# Some regexp patterns:
|
|
#
|
|
if {$tk_version >= 8.1} {
|
|
variable alphaOrNlPat {^[[:alpha:]\n]*$}
|
|
variable digitOrNlPat {^[[:digit:]\n]*$}
|
|
variable alnumOrNlPat {^[[:alnum:]\n]*$}
|
|
} else {
|
|
# Ugly because of the \n:
|
|
variable alphaOrNlPat "^\[A-Za-z\n]*$"
|
|
variable digitOrNlPat "^\[0-9\n]*$"
|
|
variable alnumOrNlPat "^\[A-Za-z0-9\n]*$"
|
|
}
|
|
}
|
|
|
|
#
|
|
# Simple before-insert callback routines for text widgets
|
|
# =======================================================
|
|
#
|
|
|
|
#------------------------------------------------------------------------------
|
|
# wcb::checkStrsForRegExp
|
|
#
|
|
# Checks whether the strings to be inserted into the text widget w, contained
|
|
# in the list args of the form "string ?tagList string tagList ...?", are
|
|
# matched by the regular expression exp; if not, it cancels the insert
|
|
# operation.
|
|
#------------------------------------------------------------------------------
|
|
proc wcb::checkStrsForRegExp {exp w idx args} {
|
|
foreach {str tagList} $args {
|
|
if {![regexp -- $exp $str]} {
|
|
cancel
|
|
return ""
|
|
}
|
|
}
|
|
}
|
|
|
|
#------------------------------------------------------------------------------
|
|
# wcb::checkStrsForAlpha
|
|
#
|
|
# Checks whether the strings to be inserted into the text widget w, contained
|
|
# in the list args of the form "string ?tagList string tagList ...?", are
|
|
# alphabetic; if not, it cancels the insert operation.
|
|
#------------------------------------------------------------------------------
|
|
proc wcb::checkStrsForAlpha {w idx args} {
|
|
variable alphaOrNlPat
|
|
checkStrsForRegExp $alphaOrNlPat $w $idx $args
|
|
}
|
|
|
|
#------------------------------------------------------------------------------
|
|
# wcb::checkStrsForNum
|
|
#
|
|
# Checks whether the strings to be inserted into the text widget w, contained
|
|
# in the list args of the form "string ?tagList string tagList ...?", are
|
|
# numeric; if not, it cancels the insert operation.
|
|
#------------------------------------------------------------------------------
|
|
proc wcb::checkStrsForNum {w idx args} {
|
|
variable digitOrNlPat
|
|
checkStrsForRegExp $digitOrNlPat $w $idx $args
|
|
}
|
|
|
|
#------------------------------------------------------------------------------
|
|
# wcb::checkStrsForAlnum
|
|
#
|
|
# Checks whether the strings to be inserted into the text widget w, contained
|
|
# in the list args of the form "string ?tagList string tagList ...?", are
|
|
# alphanumeric; if not, it cancels the insert operation.
|
|
#------------------------------------------------------------------------------
|
|
proc wcb::checkStrsForAlnum {w idx args} {
|
|
variable alnumOrNlPat
|
|
checkStrsForRegExp $alnumOrNlPat $w $idx $args
|
|
}
|
|
|
|
#------------------------------------------------------------------------------
|
|
# wcb::convStrsToUpper
|
|
#
|
|
# Replaces the strings to be inserted into the text widget w, contained in the
|
|
# list args of the form "string ?tagList string tagList ...?", with their
|
|
# uppercase equivalents.
|
|
#------------------------------------------------------------------------------
|
|
proc wcb::convStrsToUpper {w idx args} {
|
|
set n 1
|
|
foreach {str tagList} $args {
|
|
replace $n $n [string toupper $str]
|
|
incr n 2
|
|
}
|
|
}
|
|
|
|
#------------------------------------------------------------------------------
|
|
# wcb::convStrsToLower
|
|
#
|
|
# Replaces the strings to be inserted into the text widget w, contained in the
|
|
# list args of the form "string ?tagList string tagList ...?", with their
|
|
# lowercase equivalents.
|
|
#------------------------------------------------------------------------------
|
|
proc wcb::convStrsToLower {w idx args} {
|
|
set n 1
|
|
foreach {str tagList} $args {
|
|
replace $n $n [string tolower $str]
|
|
incr n 2
|
|
}
|
|
}
|
|
|
|
#
|
|
# Private procedure
|
|
# =================
|
|
#
|
|
|
|
#------------------------------------------------------------------------------
|
|
# wcb::textWidgetCmd
|
|
#
|
|
# Processes the Tcl command corresponding to a text widget w with registered
|
|
# callbacks. In this procedure, the execution of the commands insert, delete,
|
|
# and mark set insert is preceded by calls to the corresponding before-
|
|
# callbacks and followed by calls to the corresponding after-callbacks, in the
|
|
# global scope.
|
|
#------------------------------------------------------------------------------
|
|
proc wcb::textWidgetCmd {w argList} {
|
|
set orig [list ::_$w]
|
|
|
|
set argCount [llength $argList]
|
|
if {$argCount == 0} {
|
|
# Let Tk report the error
|
|
return [uplevel 2 $orig $argList]
|
|
}
|
|
|
|
set option [lindex $argList 0]
|
|
set opLen [string length $option]
|
|
set opArgs [lrange $argList 1 end]
|
|
|
|
if {[string first $option "insert"] == 0 && $opLen >= 3} {
|
|
if {$argCount >= 2} {
|
|
return [wcb::processCmd $w insert insert $opArgs]
|
|
} else {
|
|
# Let Tk report the error
|
|
return [uplevel 2 $orig $argList]
|
|
}
|
|
|
|
} elseif {[string first $option "delete"] == 0 && $opLen >= 3} {
|
|
if {$argCount == 2 || $argCount == 3} {
|
|
return [wcb::processCmd $w delete delete $opArgs]
|
|
} else {
|
|
# Let Tk report the error
|
|
return [uplevel 2 $orig $argList]
|
|
}
|
|
|
|
} elseif {[string first $option "mark"] == 0} {
|
|
set markOption [lindex $opArgs 0]
|
|
|
|
if {[string first $markOption "set"] == 0} {
|
|
if {$argCount == 4 &&
|
|
[string compare [lindex $opArgs 1] "insert"] == 0} {
|
|
set markOpArgs [lrange $opArgs 2 end]
|
|
return [wcb::processCmd $w motion "mark set insert" \
|
|
$markOpArgs]
|
|
} else {
|
|
return [uplevel 2 $orig $argList]
|
|
}
|
|
} else {
|
|
return [uplevel 2 $orig $argList]
|
|
}
|
|
|
|
} elseif {[string first $option "tag"] == 0} {
|
|
set tagOption [lindex $opArgs 0]
|
|
|
|
if {[string first $tagOption "add"] == 0} {
|
|
if {$argCount >= 4 &&
|
|
[string compare [lindex $opArgs 1] "sel"] == 0} {
|
|
set selOpArgs [lrange $opArgs 2 end]
|
|
return [wcb::processCmd $w selset "tag add sel" \
|
|
$selOpArgs]
|
|
} else {
|
|
return [uplevel 2 $orig $argList]
|
|
}
|
|
} elseif {[string first $tagOption "remove"] == 0} {
|
|
if {$argCount >= 4 &&
|
|
[string compare [lindex $opArgs 1] "sel"] == 0} {
|
|
set selOpArgs [lrange $opArgs 2 end]
|
|
return [wcb::processCmd $w selclear "tag remove sel" \
|
|
$selOpArgs]
|
|
} else {
|
|
return [uplevel 2 $orig $argList]
|
|
}
|
|
} else {
|
|
return [uplevel 2 $orig $argList]
|
|
}
|
|
|
|
} else {
|
|
return [uplevel 2 $orig $argList]
|
|
}
|
|
}
|