diff options
Diffstat (limited to 'itcl/iwidgets/generic/scrolledtext.itk')
-rw-r--r-- | itcl/iwidgets/generic/scrolledtext.itk | 501 |
1 files changed, 501 insertions, 0 deletions
diff --git a/itcl/iwidgets/generic/scrolledtext.itk b/itcl/iwidgets/generic/scrolledtext.itk new file mode 100644 index 00000000000..67f40ea339f --- /dev/null +++ b/itcl/iwidgets/generic/scrolledtext.itk @@ -0,0 +1,501 @@ +# +# Scrolledtext +# ---------------------------------------------------------------------- +# Implements a scrolled text widget with additional options to manage +# the vertical scrollbar. This includes options to control the method +# in which the scrollbar is displayed, i.e. statically or dynamically. +# Options also exist for adding a label to the scrolled text area and +# controlling its position. Import/export of methods are provided for +# file I/O. +# +# ---------------------------------------------------------------------- +# AUTHOR: Mark L. Ulferts EMAIL: mulferts@austin.dsccc.com +# +# @(#) $Id$ +# ---------------------------------------------------------------------- +# Copyright (c) 1995 DSC Technologies Corporation +# ====================================================================== +# Permission to use, copy, modify, distribute and license this software +# and its documentation for any purpose, and without fee or written +# agreement with DSC, is hereby granted, provided that the above copyright +# notice appears in all copies and that both the copyright notice and +# warranty disclaimer below appear in supporting documentation, and that +# the names of DSC Technologies Corporation or DSC Communications +# Corporation not be used in advertising or publicity pertaining to the +# software without specific, written prior permission. +# +# DSC DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING +# ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, AND NON- +# INFRINGEMENT. THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, AND THE +# AUTHORS AND DISTRIBUTORS HAVE NO OBLIGATION TO PROVIDE MAINTENANCE, +# SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. IN NO EVENT SHALL +# DSC BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR +# ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +# WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTUOUS ACTION, +# ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +# SOFTWARE. +# ====================================================================== + +# +# Usual options. +# +itk::usual Scrolledtext { + keep -activebackground -activerelief -background -borderwidth -cursor \ + -elementborderwidth -foreground -highlightcolor -highlightthickness \ + -insertbackground -insertborderwidth -insertofftime -insertontime \ + -insertwidth -jump -labelfont -selectbackground -selectborderwidth \ + -selectforeground -textbackground -textfont -troughcolor +} + +# ------------------------------------------------------------------ +# SCROLLEDTEXT +# ------------------------------------------------------------------ +itcl::class iwidgets::Scrolledtext { + inherit iwidgets::Scrolledwidget + + constructor {args} {} + destructor {} + + itk_option define -width width Width 0 + itk_option define -height height Height 0 + itk_option define -visibleitems visibleItems VisibleItems 80x24 + + public method bbox {index} + public method childsite {} + public method clear {} + public method import {filename {index end}} + public method export {filename} + public method compare {index1 op index2} + public method debug {args} + public method delete {first {last {}}} + public method dlineinfo {index} + public method get {index1 {index2 {}}} + public method image {option args} + public method index {index} + public method insert {args} + public method mark {option args} + public method scan {option args} + public method search {args} + public method see {index} + public method tag {option args} + public method window {option args} + public method xview {args} + public method yview {args} +} + +# +# Provide a lowercased access method for the Scrolledtext class. +# +proc ::iwidgets::scrolledtext {pathName args} { + uplevel ::iwidgets::Scrolledtext $pathName $args +} + +# +# Use option database to override default resources of base classes. +# +option add *Scrolledtext.labelPos n widgetDefault + +# ------------------------------------------------------------------ +# CONSTRUCTOR +# ------------------------------------------------------------------ +itcl::body iwidgets::Scrolledtext::constructor {args} { + # + # Our -width and -height options are slightly different than + # those implemented by our base class, so we're going to + # remove them and redefine our own. + # + itk_option remove iwidgets::Scrolledwidget::width + itk_option remove iwidgets::Scrolledwidget::height + + # + # Create a clipping frame which will provide the border for + # relief display. + # + itk_component add clipper { + frame $itk_interior.clipper + } { + usual + + keep -borderwidth -relief -highlightthickness -highlightcolor + rename -highlightbackground -background background Background + } + grid $itk_component(clipper) -row 0 -column 0 -sticky nsew + grid rowconfigure $_interior 0 -weight 1 + grid columnconfigure $_interior 0 -weight 1 + + # + # Create the text area. + # + itk_component add text { + text $itk_component(clipper).text \ + -width 1 -height 1 \ + -xscrollcommand \ + [itcl::code $this _scrollWidget $itk_interior.horizsb] \ + -yscrollcommand \ + [itcl::code $this _scrollWidget $itk_interior.vertsb] \ + -borderwidth 0 -highlightthickness 0 + } { + usual + + ignore -highlightthickness -highlightcolor -borderwidth + + keep -exportselection -padx -pady -setgrid \ + -spacing1 -spacing2 -spacing3 -state -tabs -wrap + + rename -font -textfont textFont Font + rename -background -textbackground textBackground Background + } + grid $itk_component(text) -row 0 -column 0 -sticky nsew + grid rowconfigure $itk_component(clipper) 0 -weight 1 + grid columnconfigure $itk_component(clipper) 0 -weight 1 + + # + # Configure the command on the vertical scroll bar in the base class. + # + $itk_component(vertsb) configure \ + -command [itcl::code $itk_component(text) yview] + + # + # Configure the command on the horizontal scroll bar in the base class. + # + $itk_component(horizsb) configure \ + -command [itcl::code $itk_component(text) xview] + + # + # Initialize the widget based on the command line options. + # + eval itk_initialize $args +} + +# ------------------------------------------------------------------ +# DESTURCTOR +# ------------------------------------------------------------------ +itcl::body iwidgets::Scrolledtext::destructor {} { +} + +# ------------------------------------------------------------------ +# OPTIONS +# ------------------------------------------------------------------ + +# ------------------------------------------------------------------ +# OPTION: -width +# +# Specifies the width of the scrolled text as an entire unit. +# The value may be specified in any of the forms acceptable to +# Tk_GetPixels. Any additional space needed to display the other +# components such as labels, margins, and scrollbars force the text +# to be compressed. A value of zero along with the same value for +# the height causes the value given for the visibleitems option +# to be applied which administers geometry constraints in a different +# manner. +# ------------------------------------------------------------------ +itcl::configbody iwidgets::Scrolledtext::width { + if {$itk_option(-width) != 0} { + set shell [lindex [grid info $itk_component(clipper)] 1] + + # + # Due to a bug in the tk4.2 grid, we have to check the + # propagation before setting it. Setting it to the same + # value it already is will cause it to toggle. + # + if {[grid propagate $shell]} { + grid propagate $shell no + } + + $itk_component(text) configure -width 1 + $shell configure \ + -width [winfo pixels $shell $itk_option(-width)] + } else { + configure -visibleitems $itk_option(-visibleitems) + } +} + +# ------------------------------------------------------------------ +# OPTION: -height +# +# Specifies the height of the scrolled text as an entire unit. +# The value may be specified in any of the forms acceptable to +# Tk_GetPixels. Any additional space needed to display the other +# components such as labels, margins, and scrollbars force the text +# to be compressed. A value of zero along with the same value for +# the width causes the value given for the visibleitems option +# to be applied which administers geometry constraints in a different +# manner. +# ------------------------------------------------------------------ +itcl::configbody iwidgets::Scrolledtext::height { + if {$itk_option(-height) != 0} { + set shell [lindex [grid info $itk_component(clipper)] 1] + + # + # Due to a bug in the tk4.2 grid, we have to check the + # propagation before setting it. Setting it to the same + # value it already is will cause it to toggle. + # + if {[grid propagate $shell]} { + grid propagate $shell no + } + + $itk_component(text) configure -height 1 + $shell configure \ + -height [winfo pixels $shell $itk_option(-height)] + } else { + configure -visibleitems $itk_option(-visibleitems) + } +} + +# ------------------------------------------------------------------ +# OPTION: -visibleitems +# +# Specified the widthxheight in characters and lines for the text. +# This option is only administered if the width and height options +# are both set to zero, otherwise they take precedence. With the +# visibleitems option engaged, geometry constraints are maintained +# only on the text. The size of the other components such as +# labels, margins, and scroll bars, are additive and independent, +# effecting the overall size of the scrolled text. In contrast, +# should the width and height options have non zero values, they +# are applied to the scrolled text as a whole. The text is +# compressed or expanded to maintain the geometry constraints. +# ------------------------------------------------------------------ +itcl::configbody iwidgets::Scrolledtext::visibleitems { + if {[regexp {^[0-9]+x[0-9]+$} $itk_option(-visibleitems)]} { + if {($itk_option(-width) == 0) && \ + ($itk_option(-height) == 0)} { + set chars [lindex [split $itk_option(-visibleitems) x] 0] + set lines [lindex [split $itk_option(-visibleitems) x] 1] + + set shell [lindex [grid info $itk_component(clipper)] 1] + + # + # Due to a bug in the tk4.2 grid, we have to check the + # propagation before setting it. Setting it to the same + # value it already is will cause it to toggle. + # + if {! [grid propagate $shell]} { + grid propagate $shell yes + } + + $itk_component(text) configure -width $chars -height $lines + } + + } else { + error "bad visibleitems option\ + \"$itk_option(-visibleitems)\": should be\ + widthxheight" + } +} + +# ------------------------------------------------------------------ +# METHODS +# ------------------------------------------------------------------ + +# ------------------------------------------------------------------ +# METHOD: childsite +# +# Returns the path name of the child site widget. +# ------------------------------------------------------------------ +itcl::body iwidgets::Scrolledtext::childsite {} { + return $itk_component(text) +} + +# ------------------------------------------------------------------ +# METHOD: bbox index +# +# Returns four element list describing the bounding box for the list +# item at index +# ------------------------------------------------------------------ +itcl::body iwidgets::Scrolledtext::bbox {index} { + return [$itk_component(text) bbox $index] +} + +# ------------------------------------------------------------------ +# METHOD clear +# +# Clear the text area. +# ------------------------------------------------------------------ +itcl::body iwidgets::Scrolledtext::clear {} { + $itk_component(text) delete 1.0 end +} + +# ------------------------------------------------------------------ +# METHOD import filename +# +# Load text from an existing file (import filename) +# ------------------------------------------------------------------ +itcl::body iwidgets::Scrolledtext::import {filename {index end}} { + set f [open $filename r] + insert $index [read $f] + close $f +} + +# ------------------------------------------------------------------ +# METHOD export filename +# +# write text to a file (export filename) +# ------------------------------------------------------------------ +itcl::body iwidgets::Scrolledtext::export {filename} { + set f [open $filename w] + + set txt [$itk_component(text) get 1.0 end] + puts $f $txt + + flush $f + close $f +} + +# ------------------------------------------------------------------ +# METHOD compare index1 op index2 +# +# Compare indices according to relational operator. +# ------------------------------------------------------------------ +itcl::body iwidgets::Scrolledtext::compare {index1 op index2} { + return [$itk_component(text) compare $index1 $op $index2] +} + +# ------------------------------------------------------------------ +# METHOD debug ?boolean? +# +# Activates consistency checks in B-tree code associated with text +# widgets. +# ------------------------------------------------------------------ +itcl::body iwidgets::Scrolledtext::debug {args} { + eval $itk_component(text) debug $args +} + +# ------------------------------------------------------------------ +# METHOD delete first ?last? +# +# Delete a range of characters from the text. +# ------------------------------------------------------------------ +itcl::body iwidgets::Scrolledtext::delete {first {last {}}} { + $itk_component(text) delete $first $last +} + +# ------------------------------------------------------------------ +# METHOD dlineinfo index +# +# Returns a five element list describing the area occupied by the +# display line containing index. +# ------------------------------------------------------------------ +itcl::body iwidgets::Scrolledtext::dlineinfo {index} { + return [$itk_component(text) dlineinfo $index] +} + +# ------------------------------------------------------------------ +# METHOD get index1 ?index2? +# +# Return text from start index to end index. +# ------------------------------------------------------------------ +itcl::body iwidgets::Scrolledtext::get {index1 {index2 {}}} { + return [$itk_component(text) get $index1 $index2] +} + +# ------------------------------------------------------------------ +# METHOD image option ?arg arg ...? +# +# Manipulate images dependent on options. +# +# ------------------------------------------------------------------ +itcl::body iwidgets::Scrolledtext::image {option args} { + return [eval $itk_component(text) image $option $args] +} + + +# ------------------------------------------------------------------ +# METHOD index index +# +# Return position corresponding to index. +# ------------------------------------------------------------------ +itcl::body iwidgets::Scrolledtext::index {index} { + return [$itk_component(text) index $index] +} + +# ------------------------------------------------------------------ +# METHOD insert index chars ?tagList? +# +# Insert text at index. +# ------------------------------------------------------------------ +itcl::body iwidgets::Scrolledtext::insert {args} { + eval $itk_component(text) insert $args +} + +# ------------------------------------------------------------------ +# METHOD mark option ?arg arg ...? +# +# Manipulate marks dependent on options. +# ------------------------------------------------------------------ +itcl::body iwidgets::Scrolledtext::mark {option args} { + return [eval $itk_component(text) mark $option $args] +} + +# ------------------------------------------------------------------ +# METHOD scan option args +# +# Implements scanning on texts. +# ------------------------------------------------------------------ +itcl::body iwidgets::Scrolledtext::scan {option args} { + eval $itk_component(text) scan $option $args +} + +# ------------------------------------------------------------------ +# METHOD search ?switches? pattern index ?varName? +# +# Searches the text for characters matching a pattern. +# ------------------------------------------------------------------ +itcl::body iwidgets::Scrolledtext::search {args} { + #----------------------------------------------------------- + # BUG FIX: csmith (Chad Smith: csmith@adc.com), 11/18/99 + #----------------------------------------------------------- + # Need to run this command up one level on the stack since + # the text widget may modify one of the arguments, which is + # the case when -count is specified. + #----------------------------------------------------------- + return [uplevel eval $itk_component(text) search $args] +} + +# ------------------------------------------------------------------ +# METHOD see index +# +# Adjusts the view in the window so the character at index is +# visible. +# ------------------------------------------------------------------ +itcl::body iwidgets::Scrolledtext::see {index} { + $itk_component(text) see $index +} + +# ------------------------------------------------------------------ +# METHOD tag option ?arg arg ...? +# +# Manipulate tags dependent on options. +# ------------------------------------------------------------------ +itcl::body iwidgets::Scrolledtext::tag {option args} { + return [eval $itk_component(text) tag $option $args] +} + +# ------------------------------------------------------------------ +# METHOD window option ?arg arg ...? +# +# Manipulate embedded windows. +# ------------------------------------------------------------------ +itcl::body iwidgets::Scrolledtext::window {option args} { + return [eval $itk_component(text) window $option $args] +} + +# ------------------------------------------------------------------ +# METHOD xview +# +# Changes x view in widget's window. +# ------------------------------------------------------------------ +itcl::body iwidgets::Scrolledtext::xview {args} { + return [eval $itk_component(text) xview $args] +} + +# ------------------------------------------------------------------ +# METHOD yview +# +# Changes y view in widget's window. +# ------------------------------------------------------------------ +itcl::body iwidgets::Scrolledtext::yview {args} { + return [eval $itk_component(text) yview $args] +} + |