summaryrefslogtreecommitdiff
path: root/iwidgets/generic/scrolledwidget.itk
diff options
context:
space:
mode:
Diffstat (limited to 'iwidgets/generic/scrolledwidget.itk')
-rw-r--r--iwidgets/generic/scrolledwidget.itk376
1 files changed, 376 insertions, 0 deletions
diff --git a/iwidgets/generic/scrolledwidget.itk b/iwidgets/generic/scrolledwidget.itk
new file mode 100644
index 00000000000..58094dd79fa
--- /dev/null
+++ b/iwidgets/generic/scrolledwidget.itk
@@ -0,0 +1,376 @@
+#
+# Scrolledwidget
+# ----------------------------------------------------------------------
+# Implements a general purpose base class for scrolled widgets, by
+# creating the necessary horizontal and vertical scrollbars and
+# providing protected methods for controlling their display. The
+# derived class needs to take advantage of the fact that the grid
+# is used and the vertical scrollbar is in row 0, column 2 and the
+# horizontal scrollbar in row 2, column 0.
+#
+# ----------------------------------------------------------------------
+# AUTHOR: Mark Ulferts mulferts@austin.dsccc.com
+#
+# @(#) $Id$
+# ----------------------------------------------------------------------
+# Copyright (c) 1997 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 Scrolledwidget {
+ keep -background -borderwidth -cursor -highlightcolor -highlightthickness
+ keep -activebackground -activerelief -jump -troughcolor
+ keep -labelfont -foreground
+}
+
+# ------------------------------------------------------------------
+# SCROLLEDWIDGET
+# ------------------------------------------------------------------
+itcl::class iwidgets::Scrolledwidget {
+ inherit iwidgets::Labeledwidget
+
+ constructor {args} {}
+ destructor {}
+
+ itk_option define -sbwidth sbWidth Width 15
+ itk_option define -scrollmargin scrollMargin ScrollMargin 3
+ itk_option define -vscrollmode vscrollMode VScrollMode static
+ itk_option define -hscrollmode hscrollMode HScrollMode static
+ itk_option define -width width Width 30
+ itk_option define -height height Height 30
+
+ protected method _scrollWidget {wid first last}
+ protected method _vertScrollbarDisplay {mode}
+ protected method _horizScrollbarDisplay {mode}
+ protected method _configureEvent {}
+
+ protected variable _vmode off ;# Vertical scroll mode
+ protected variable _hmode off ;# Vertical scroll mode
+ protected variable _recheckHoriz 1 ;# Flag to check need for
+ ;# horizontal scrollbar
+ protected variable _recheckVert 1 ;# Flag to check need for
+ ;# vertical scrollbar
+
+ protected variable _interior {}
+}
+
+#
+# Provide a lowercased access method for the Scrolledwidget class.
+#
+proc ::iwidgets::scrolledwidget {pathName args} {
+ uplevel ::iwidgets::Scrolledwidget $pathName $args
+}
+
+#
+# Use option database to override default resources of base classes.
+#
+option add *Scrolledwidget.labelPos n widgetDefault
+
+# ------------------------------------------------------------------
+# CONSTRUCTOR
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledwidget::constructor {args} {
+
+ #
+ # Turn off the borderwidth on the hull and save off the
+ # interior for later use.
+ #
+ component hull configure -borderwidth 0
+ set _interior $itk_interior
+
+ #
+ # Check if the scrollbars need mapping upon a configure event.
+ #
+ bind $_interior <Configure> [itcl::code $this _configureEvent]
+
+ #
+ # Turn off propagation in the containing shell.
+ #
+ # 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 $_interior]} {
+ grid propagate $_interior no
+ }
+
+ #
+ # Create the vertical scroll bar
+ #
+ itk_component add vertsb {
+ scrollbar $itk_interior.vertsb -orient vertical
+ } {
+ usual
+ keep -borderwidth -elementborderwidth -jump -relief
+ rename -highlightbackground -background background Background
+ }
+
+ #
+ # Create the horizontal scrollbar
+ #
+ itk_component add horizsb {
+ scrollbar $itk_interior.horizsb -orient horizontal
+ } {
+ usual
+ keep -borderwidth -elementborderwidth -jump -relief
+ rename -highlightbackground -background background Background
+ }
+
+ #
+ # Initialize the widget based on the command line options.
+ #
+ eval itk_initialize $args
+}
+
+# ------------------------------------------------------------------
+# DESTURCTOR
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledwidget::destructor {} {
+}
+
+# ------------------------------------------------------------------
+# OPTIONS
+# ------------------------------------------------------------------
+
+# ------------------------------------------------------------------
+# OPTION: -sbwidth
+#
+# Set the width of the scrollbars.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Scrolledwidget::sbwidth {
+ $itk_component(vertsb) configure -width $itk_option(-sbwidth)
+ $itk_component(horizsb) configure -width $itk_option(-sbwidth)
+}
+
+# ------------------------------------------------------------------
+# OPTION: -scrollmargin
+#
+# Set the distance between the scrollbars and the list box.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Scrolledwidget::scrollmargin {
+ set pixels [winfo pixels $_interior $itk_option(-scrollmargin)]
+
+ if {$_hmode == "on"} {
+ grid rowconfigure $_interior 1 -minsize $pixels
+ }
+
+ if {$_vmode == "on"} {
+ grid columnconfigure $_interior 1 -minsize $pixels
+ }
+}
+
+# ------------------------------------------------------------------
+# OPTION: -vscrollmode
+#
+# Enable/disable display and mode of veritcal scrollbars.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Scrolledwidget::vscrollmode {
+ switch $itk_option(-vscrollmode) {
+ static {
+ _vertScrollbarDisplay on
+ }
+
+ dynamic -
+ none {
+ _vertScrollbarDisplay off
+ }
+
+ default {
+ error "bad vscrollmode option\
+ \"$itk_option(-vscrollmode)\": should be\
+ static, dynamic, or none"
+ }
+ }
+}
+
+# ------------------------------------------------------------------
+# OPTION: -hscrollmode
+#
+# Enable/disable display and mode of horizontal scrollbars.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Scrolledwidget::hscrollmode {
+ switch $itk_option(-hscrollmode) {
+ static {
+ _horizScrollbarDisplay on
+ }
+
+ dynamic -
+ none {
+ _horizScrollbarDisplay off
+ }
+
+ default {
+ error "bad hscrollmode option\
+ \"$itk_option(-hscrollmode)\": should be\
+ static, dynamic, or none"
+ }
+ }
+}
+
+# ------------------------------------------------------------------
+# OPTION: -width
+#
+# Specifies the width of the scrolled widget. The value may be
+# specified in any of the forms acceptable to Tk_GetPixels.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Scrolledwidget::width {
+ $_interior configure -width \
+ [winfo pixels $_interior $itk_option(-width)]
+}
+
+# ------------------------------------------------------------------
+# OPTION: -height
+#
+# Specifies the height of the scrolled widget. The value may be
+# specified in any of the forms acceptable to Tk_GetPixels.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Scrolledwidget::height {
+ $_interior configure -height \
+ [winfo pixels $_interior $itk_option(-height)]
+}
+
+# ------------------------------------------------------------------
+# METHODS
+# ------------------------------------------------------------------
+
+# ------------------------------------------------------------------
+# PROTECTED METHOD: _vertScrollbarDisplay mode
+#
+# Displays the vertical scrollbar based on the input mode.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledwidget::_vertScrollbarDisplay {mode} {
+ switch $mode {
+ on {
+ set _vmode on
+
+ grid columnconfigure $_interior 1 -minsize \
+ [winfo pixels $_interior $itk_option(-scrollmargin)]
+ grid $itk_component(vertsb) -row 0 -column 2 -sticky ns
+ }
+
+ off {
+ set _vmode off
+
+ grid columnconfigure $_interior 1 -minsize 0
+ grid forget $itk_component(vertsb)
+ }
+
+ default {
+ error "invalid argument \"$mode\": should be on or off"
+ }
+ }
+}
+
+# ------------------------------------------------------------------
+# PROTECTED METHOD: _horizScrollbarDisplay mode
+#
+# Displays the horizontal scrollbar based on the input mode.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledwidget::_horizScrollbarDisplay {mode} {
+ switch $mode {
+ on {
+ set _hmode on
+
+ grid rowconfigure $_interior 1 -minsize \
+ [winfo pixels $_interior $itk_option(-scrollmargin)]
+ grid $itk_component(horizsb) -row 2 -column 0 -sticky ew
+ }
+
+ off {
+ set _hmode off
+
+ grid rowconfigure $_interior 1 -minsize 0
+ grid forget $itk_component(horizsb)
+ }
+
+ default {
+ error "invalid argument \"$mode\": should be on or off"
+ }
+ }
+}
+
+# ------------------------------------------------------------------
+# PROTECTED METHOD: _scrollWidget wid first last
+#
+# Performs scrolling and display of scrollbars based on the total
+# and maximum frame size as well as the current -vscrollmode and
+# -hscrollmode settings. Parameters are automatic scroll parameters.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledwidget::_scrollWidget {wid first last} {
+ $wid set $first $last
+
+ if {$wid == $itk_component(vertsb)} {
+ if {$itk_option(-vscrollmode) == "dynamic"} {
+ if {($_recheckVert != 1) && ($_vmode == "on")} {
+ return
+ } else {
+ set _recheckVert 0
+ }
+
+ if {($first == 0) && ($last == 1)} {
+ if {$_vmode != "off"} {
+ _vertScrollbarDisplay off
+ }
+
+ } else {
+ if {$_vmode != "on"} {
+ _vertScrollbarDisplay on
+ }
+ }
+ }
+
+ } elseif {$wid == $itk_component(horizsb)} {
+ if {$itk_option(-hscrollmode) == "dynamic"} {
+ if {($_recheckHoriz != 1) && ($_hmode == "on")} {
+ return
+ } else {
+ set _recheckHoriz 0
+ }
+
+ if {($first == 0) && ($last == 1)} {
+ if {$_hmode != "off"} {
+ _horizScrollbarDisplay off
+ }
+
+ } else {
+ if {$_hmode != "on"} {
+ _horizScrollbarDisplay on
+ }
+ }
+ }
+ }
+}
+
+# ------------------------------------------------------------------
+# PROTECTED METHOD: _configureEvent
+#
+# Resets the recheck flags which determine if we'll try and map
+# the scrollbars in dynamic mode.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Scrolledwidget::_configureEvent {} {
+ update idletasks
+ set _recheckVert 1
+ set _recheckHoriz 1
+}