home *** CD-ROM | disk | FTP | other *** search
/ PC World 2000 December / PCWorld_2000-12_cd.bin / Komunikace / Comanche / comanche.exe / lib / iwidgets3.0.0 / scripts / scrolledwidget.itk < prev    next >
Text File  |  1999-02-24  |  12KB  |  377 lines

  1. #
  2. # Scrolledwidget
  3. # ----------------------------------------------------------------------
  4. # Implements a general purpose base class for scrolled widgets, by
  5. # creating the necessary horizontal and vertical scrollbars and 
  6. # providing protected methods for controlling their display.  The 
  7. # derived class needs to take advantage of the fact that the grid
  8. # is used and the vertical scrollbar is in row 0, column 2 and the
  9. # horizontal scrollbar in row 2, column 0.
  10. #
  11. # ----------------------------------------------------------------------
  12. #  AUTHOR: Mark Ulferts                        mulferts@austin.dsccc.com 
  13. #
  14. #  @(#) $Id: scrolledwidget.itk,v 1.1 1998/07/27 18:53:16 stanton Exp $
  15. # ----------------------------------------------------------------------
  16. #            Copyright (c) 1997 DSC Technologies Corporation
  17. # ======================================================================
  18. # Permission to use, copy, modify, distribute and license this software 
  19. # and its documentation for any purpose, and without fee or written 
  20. # agreement with DSC, is hereby granted, provided that the above copyright 
  21. # notice appears in all copies and that both the copyright notice and 
  22. # warranty disclaimer below appear in supporting documentation, and that 
  23. # the names of DSC Technologies Corporation or DSC Communications 
  24. # Corporation not be used in advertising or publicity pertaining to the 
  25. # software without specific, written prior permission.
  26. # DSC DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING 
  27. # ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, AND NON-
  28. # INFRINGEMENT. THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, AND THE
  29. # AUTHORS AND DISTRIBUTORS HAVE NO OBLIGATION TO PROVIDE MAINTENANCE, 
  30. # SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. IN NO EVENT SHALL 
  31. # DSC BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR 
  32. # ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, 
  33. # WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTUOUS ACTION,
  34. # ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS 
  35. # SOFTWARE.
  36. # ======================================================================
  37.  
  38. #
  39. # Usual options.
  40. #
  41. itk::usual Scrolledwidget {
  42.     keep -background -borderwidth -cursor -highlightcolor -highlightthickness 
  43.     keep -activebackground -activerelief -jump -troughcolor
  44.     keep -labelfont -foreground
  45. }
  46.  
  47. # ------------------------------------------------------------------
  48. #                            SCROLLEDWIDGET
  49. # ------------------------------------------------------------------
  50. class iwidgets::Scrolledwidget {
  51.     inherit iwidgets::Labeledwidget
  52.  
  53.     constructor {args} {}
  54.     destructor {}
  55.  
  56.     itk_option define -sbwidth sbWidth Width 15
  57.     itk_option define -scrollmargin scrollMargin ScrollMargin 3 
  58.     itk_option define -vscrollmode vscrollMode VScrollMode static 
  59.     itk_option define -hscrollmode hscrollMode HScrollMode static 
  60.     itk_option define -width width Width 30 
  61.     itk_option define -height height Height 30 
  62.  
  63.     protected method _scrollWidget {wid first last} 
  64.     protected method _vertScrollbarDisplay {mode} 
  65.     protected method _horizScrollbarDisplay {mode} 
  66.     protected method _configureEvent {}
  67.  
  68.     protected variable _vmode off            ;# Vertical scroll mode
  69.     protected variable _hmode off            ;# Vertical scroll mode
  70.     protected variable _recheckHoriz 1       ;# Flag to check need for 
  71.                                              ;#  horizontal scrollbar
  72.     protected variable _recheckVert 1        ;# Flag to check need for 
  73.                                              ;#  vertical scrollbar
  74.  
  75.     protected variable _interior {}
  76. }
  77.  
  78. #
  79. # Provide a lowercased access method for the Scrolledwidget class.
  80. proc ::iwidgets::scrolledwidget {pathName args} {
  81.     uplevel ::iwidgets::Scrolledwidget $pathName $args
  82. }
  83.  
  84. #
  85. # Use option database to override default resources of base classes.
  86. #
  87. option add *Scrolledwidget.labelPos n widgetDefault
  88.  
  89. # ------------------------------------------------------------------
  90. #                        CONSTRUCTOR
  91. # ------------------------------------------------------------------
  92. body iwidgets::Scrolledwidget::constructor {args} {
  93.  
  94.     #
  95.     # Turn off the borderwidth on the hull and save off the 
  96.     # interior for later use.
  97.     #
  98.     component hull configure -borderwidth 0
  99.     set _interior $itk_interior
  100.  
  101.     #
  102.     # Check if the scrollbars need mapping upon a configure event.
  103.     #
  104.     bind $_interior <Configure> [code $this _configureEvent]
  105.  
  106.     #
  107.     # Turn off propagation in the containing shell.
  108.     #
  109.     # Due to a bug in the tk4.2 grid, we have to check the 
  110.     # propagation before setting it.  Setting it to the same
  111.     # value it already is will cause it to toggle.
  112.     #
  113.     if {[grid propagate $_interior]} {
  114.     grid propagate $_interior no
  115.     }
  116.     
  117.     # 
  118.     # Create the vertical scroll bar
  119.     #
  120.     itk_component add vertsb {
  121.     scrollbar $itk_interior.vertsb -orient vertical 
  122.     } {
  123.     usual
  124.     keep -borderwidth -elementborderwidth -jump -relief 
  125.     rename -highlightbackground -background background Background
  126.     }
  127.  
  128.     #
  129.     # Create the horizontal scrollbar
  130.     #
  131.     itk_component add horizsb {
  132.     scrollbar $itk_interior.horizsb -orient horizontal 
  133.     } {
  134.     usual
  135.     keep -borderwidth -elementborderwidth -jump -relief 
  136.     rename -highlightbackground -background background Background
  137.     }
  138.     
  139.     #
  140.     # Initialize the widget based on the command line options.
  141.     #
  142.     eval itk_initialize $args
  143. }
  144.  
  145. # ------------------------------------------------------------------
  146. #                           DESTURCTOR
  147. # ------------------------------------------------------------------
  148. body iwidgets::Scrolledwidget::destructor {} {
  149. }
  150.  
  151. # ------------------------------------------------------------------
  152. #                             OPTIONS
  153. # ------------------------------------------------------------------
  154.  
  155. # ------------------------------------------------------------------
  156. # OPTION: -sbwidth
  157. #
  158. # Set the width of the scrollbars.
  159. # ------------------------------------------------------------------
  160. configbody iwidgets::Scrolledwidget::sbwidth {
  161.     $itk_component(vertsb) configure -width $itk_option(-sbwidth)
  162.     $itk_component(horizsb) configure -width $itk_option(-sbwidth)
  163. }
  164.  
  165. # ------------------------------------------------------------------
  166. # OPTION: -scrollmargin
  167. #
  168. # Set the distance between the scrollbars and the list box.
  169. # ------------------------------------------------------------------
  170. configbody iwidgets::Scrolledwidget::scrollmargin {
  171.     set pixels [winfo pixels $_interior    $itk_option(-scrollmargin)]
  172.         
  173.     if {$_hmode == "on"} {
  174.     grid rowconfigure $_interior 1 -minsize $pixels
  175.     }
  176.     
  177.     if {$_vmode == "on"} {
  178.     grid columnconfigure $_interior 1 -minsize $pixels
  179.     }
  180. }
  181.  
  182. # ------------------------------------------------------------------
  183. # OPTION: -vscrollmode
  184. #
  185. # Enable/disable display and mode of veritcal scrollbars.
  186. # ------------------------------------------------------------------
  187. configbody iwidgets::Scrolledwidget::vscrollmode {
  188.     switch $itk_option(-vscrollmode) {
  189.         static {
  190.             _vertScrollbarDisplay on
  191.         }
  192.     
  193.         dynamic -
  194.         none {
  195.             _vertScrollbarDisplay off
  196.         }
  197.     
  198.         default {
  199.             error "bad vscrollmode option\
  200.             \"$itk_option(-vscrollmode)\": should be\
  201.             static, dynamic, or none"
  202.         }
  203.     }
  204. }
  205.  
  206. # ------------------------------------------------------------------
  207. # OPTION: -hscrollmode
  208. #
  209. # Enable/disable display and mode of horizontal scrollbars.
  210. # ------------------------------------------------------------------
  211. configbody iwidgets::Scrolledwidget::hscrollmode {
  212.     switch $itk_option(-hscrollmode) {
  213.         static {
  214.             _horizScrollbarDisplay on
  215.         }
  216.     
  217.         dynamic -
  218.         none {
  219.             _horizScrollbarDisplay off
  220.         }
  221.     
  222.         default {
  223.             error "bad hscrollmode option\
  224.             \"$itk_option(-hscrollmode)\": should be\
  225.             static, dynamic, or none"
  226.         }
  227.     }
  228. }
  229.  
  230. # ------------------------------------------------------------------
  231. # OPTION: -width
  232. #
  233. # Specifies the width of the scrolled widget.  The value may be 
  234. # specified in any of the forms acceptable to Tk_GetPixels.  
  235. # ------------------------------------------------------------------
  236. configbody iwidgets::Scrolledwidget::width {
  237.     $_interior configure -width \
  238.     [winfo pixels $_interior $itk_option(-width)] 
  239. }
  240.  
  241. # ------------------------------------------------------------------
  242. # OPTION: -height
  243. #
  244. # Specifies the height of the scrolled widget.  The value may be 
  245. # specified in any of the forms acceptable to Tk_GetPixels.  
  246. # ------------------------------------------------------------------
  247. configbody iwidgets::Scrolledwidget::height {
  248.     $_interior configure -height \
  249.     [winfo pixels $_interior $itk_option(-height)] 
  250. }
  251.  
  252. # ------------------------------------------------------------------
  253. #                            METHODS
  254. # ------------------------------------------------------------------
  255.  
  256. # ------------------------------------------------------------------
  257. # PROTECTED METHOD: _vertScrollbarDisplay mode
  258. #
  259. # Displays the vertical scrollbar based on the input mode.
  260. # ------------------------------------------------------------------
  261. body iwidgets::Scrolledwidget::_vertScrollbarDisplay {mode} {
  262.     switch $mode  {
  263.     on {
  264.         set _vmode on
  265.         
  266.         grid columnconfigure $_interior 1 -minsize \
  267.             [winfo pixels $_interior $itk_option(-scrollmargin)]
  268.         grid $itk_component(vertsb) -row 0 -column 2 -sticky ns
  269.     }
  270.     
  271.     off {
  272.         set _vmode off
  273.         
  274.         grid columnconfigure $_interior 1 -minsize 0
  275.         grid forget $itk_component(vertsb) 
  276.     }
  277.     
  278.     default {
  279.         error "invalid argument \"$mode\": should be on or off"
  280.     }
  281.     }
  282. }
  283.  
  284. # ------------------------------------------------------------------
  285. # PROTECTED METHOD: _horizScrollbarDisplay mode
  286. #
  287. # Displays the horizontal scrollbar based on the input mode.
  288. # ------------------------------------------------------------------
  289. body iwidgets::Scrolledwidget::_horizScrollbarDisplay {mode} {
  290.     switch $mode  {
  291.     on {
  292.         set _hmode on
  293.         
  294.         grid rowconfigure $_interior 1 -minsize \
  295.             [winfo pixels $_interior $itk_option(-scrollmargin)]
  296.         grid $itk_component(horizsb) -row 2 -column 0 -sticky ew
  297.     }
  298.     
  299.     off {
  300.         set _hmode off
  301.         
  302.         grid rowconfigure $_interior 1 -minsize 0
  303.         grid forget $itk_component(horizsb) 
  304.     }
  305.     
  306.     default {
  307.         error "invalid argument \"$mode\": should be on or off"
  308.     }
  309.     }
  310. }
  311.  
  312. # ------------------------------------------------------------------
  313. # PROTECTED METHOD: _scrollWidget wid first last
  314. #
  315. # Performs scrolling and display of scrollbars based on the total 
  316. # and maximum frame size as well as the current -vscrollmode and 
  317. # -hscrollmode settings.  Parameters are automatic scroll parameters.
  318. # ------------------------------------------------------------------
  319. body iwidgets::Scrolledwidget::_scrollWidget {wid first last} {
  320.     $wid set $first $last
  321.  
  322.     if {$wid == $itk_component(vertsb)} {
  323.     if {$itk_option(-vscrollmode) == "dynamic"} {
  324.         if {($_recheckVert != 1) && ($_vmode == "on")} {
  325.         return
  326.         } else {
  327.         set _recheckVert 0
  328.         }
  329.  
  330.         if {($first == 0) && ($last == 1)} {
  331.         if {$_vmode != "off"} {
  332.             _vertScrollbarDisplay off
  333.         }
  334.         
  335.         } else {
  336.         if {$_vmode != "on"} {
  337.             _vertScrollbarDisplay on
  338.         }
  339.         }
  340.     }
  341.     
  342.     } elseif {$wid == $itk_component(horizsb)} {
  343.     if {$itk_option(-hscrollmode) == "dynamic"} {
  344.         if {($_recheckHoriz != 1) && ($_hmode == "on")} {
  345.         return
  346.         } else {
  347.         set _recheckHoriz 0
  348.         }
  349.  
  350.         if {($first == 0) && ($last == 1)} {
  351.         if {$_hmode != "off"} {
  352.             _horizScrollbarDisplay off
  353.         }
  354.         
  355.         } else {
  356.         if {$_hmode != "on"} {
  357.             _horizScrollbarDisplay on
  358.         }
  359.         }
  360.     }
  361.     }
  362. }
  363.  
  364. # ------------------------------------------------------------------
  365. # PROTECTED METHOD: _configureEvent
  366. #
  367. # Resets the recheck flags which determine if we'll try and map
  368. # the scrollbars in dynamic mode.  
  369. # ------------------------------------------------------------------
  370. body iwidgets::Scrolledwidget::_configureEvent {} {
  371.     update idletasks
  372.     set _recheckVert 1
  373.     set _recheckHoriz 1
  374. }
  375.