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

  1. #
  2. # Scrolledtext
  3. # ----------------------------------------------------------------------
  4. # Implements a scrolled text widget with additional options to manage
  5. # the vertical scrollbar.  This includes options to control the method
  6. # in which the scrollbar is displayed, i.e. statically or  dynamically.
  7. # Options also exist for adding a label to the scrolled text area and
  8. # controlling its position.  Import/export of methods are provided for 
  9. # file I/O.
  10. #
  11. # ----------------------------------------------------------------------
  12. #  AUTHOR: Mark L. Ulferts               EMAIL: mulferts@spd.dsccc.com
  13. #
  14. #  @(#) $Id: scrolledtext.itk,v 1.1 1998/07/27 18:49:49 stanton Exp $
  15. # ----------------------------------------------------------------------
  16. #            Copyright (c) 1995 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. # Default resources.
  40. #
  41. option add *Scrolledtext.borderWidth 2 widgetDefault
  42. option add *Scrolledtext.relief sunken widgetDefault
  43. option add *Scrolledtext.scrollMargin 3 widgetDefault
  44. option add *Scrolledtext.width 0 widgetDefault
  45. option add *Scrolledtext.height 0 widgetDefault
  46. option add *Scrolledtext.visibleItems 80x24 widgetDefault
  47. option add *Scrolledtext.vscrollMode static widgetDefault
  48. option add *Scrolledtext.hscrollMode static widgetDefault
  49. option add *Scrolledtext.labelPos n widgetDefault
  50.  
  51. #
  52. # Usual options.
  53. #
  54. itk::usual Scrolledtext {
  55.     keep -activebackground -activerelief -background -borderwidth -cursor \
  56.      -elementborderwidth -foreground -highlightcolor -highlightthickness \
  57.      -insertbackground -insertborderwidth -insertofftime -insertontime \
  58.      -insertwidth -jump -labelfont -selectbackground -selectborderwidth \
  59.      -selectforeground -textbackground -textfont -troughcolor 
  60. }
  61.  
  62. # ------------------------------------------------------------------
  63. #                           SCROLLEDTEXT
  64. # ------------------------------------------------------------------
  65. class iwidgets::Scrolledtext {
  66.     inherit iwidgets::Labeledwidget
  67.  
  68.     constructor {args} {}
  69.     destructor {}
  70.  
  71.     itk_option define -scrollmargin scrollMargin Margin 3
  72.     itk_option define -sbwidth sbWidth Width 15
  73.     itk_option define -vscrollmode vscrollMode ScrollMode static
  74.     itk_option define -hscrollmode hscrollMode ScrollMode static
  75.     itk_option define -width width Width 0
  76.     itk_option define -height height Height 0
  77.     itk_option define -visibleitems visibleItems VisibleItems 80x24
  78.  
  79.     public method bbox {index} 
  80.     public method clear {} 
  81.     public method import {filename} 
  82.     public method export {filename} 
  83.     public method compare {index1 op index2} 
  84.     public method debug {args} 
  85.     public method delete {first {last {}}} 
  86.     public method dlineinfo {index} 
  87.     public method get {index1 {index2 {}}} 
  88.     public method index {index} 
  89.     public method insert {args} 
  90.     public method mark {option args} 
  91.     public method scan {option args} 
  92.     public method search {args} 
  93.     public method see {index} 
  94.     public method tag {option args} 
  95.     public method window {option args} 
  96.     public method xview {args} 
  97.     public method yview {args} 
  98.  
  99.     protected method _scrollText {wid first last} 
  100.     protected method _updateFiller {}
  101.     protected method _configureFiller {}
  102.  
  103.     private method _fillerWidth {} 
  104.     private method _vertScrollbarDisplay {mode} 
  105.     private method _horizScrollbarDisplay {mode} 
  106.  
  107.     protected variable _vmode off            ;# Vertical scroll mode
  108.     protected variable _hmode off            ;# Vertical scroll mode
  109.     protected variable _reconfigPlanned ""   ;# non-null, filler update pending
  110.  
  111.     private variable _initialized 0            ;# Initialization flag.
  112. }
  113.  
  114. #
  115. # Provide a lowercased access method for the Scrolledtext class.
  116. proc ::iwidgets::scrolledtext {pathName args} {
  117.     uplevel ::iwidgets::Scrolledtext $pathName $args
  118. }
  119.  
  120. # ------------------------------------------------------------------
  121. #                        CONSTRUCTOR
  122. # ------------------------------------------------------------------
  123. body iwidgets::Scrolledtext::constructor {args} {
  124.     component hull configure -borderwidth 0
  125.  
  126.     #
  127.     # Create some frames to hold both the top and bottom halfs of the 
  128.     # widget.  The top will contain both the list and vertical scroll 
  129.     # bar.  The bottom houses the horizontal scrollbar and some filler.
  130.     #
  131.     itk_component add textframe {
  132.     frame $itk_interior.textframe
  133.     } {
  134.     keep -background -cursor
  135.     }
  136.     pack $itk_component(textframe) -fill both -expand yes
  137.     
  138.     itk_component add bottomframe {
  139.     frame $itk_component(textframe).bot
  140.     } {
  141.     keep -background -cursor
  142.     }
  143.     pack $itk_component(bottomframe) -fill x -side bottom
  144.     
  145.     itk_component add hmargin {
  146.     frame $itk_component(textframe).hm
  147.     } {
  148.     keep -background -cursor
  149.     }
  150.     pack $itk_component(hmargin) -side bottom
  151.     
  152.     itk_component add topframe {
  153.     frame $itk_component(textframe).top
  154.     } {
  155.     keep -background -cursor
  156.     }
  157.     pack $itk_component(topframe) -fill both -expand yes
  158.     
  159.     #
  160.     # Frame around text.
  161.     #
  162.     itk_component add borderFrame {
  163.     frame $itk_component(topframe).borderFrame 
  164.     } {
  165.     keep -background -cursor -borderwidth -relief \
  166.          -highlightthickness -highlightcolor
  167.     rename -highlightbackground -background background Background
  168.     }
  169.  
  170.     # 
  171.     # Create the text area.
  172.     #
  173.     itk_component add text {
  174.     text $itk_component(borderFrame).text \
  175.         -borderwidth 0 -relief flat -highlightthickness 0 \
  176.         -width 1 -height 1 \
  177.             -xscrollcommand \
  178.         [code $this _scrollText $itk_component(bottomframe).horizsb] \
  179.         -yscrollcommand \
  180.         [code $this _scrollText $itk_component(topframe).vertsb]
  181.     
  182.     } {
  183.     keep -cursor -exportselection -foreground \
  184.         -insertbackground -insertborderwidth \
  185.         -insertofftime -insertontime -insertwidth -padx -pady \
  186.         -relief -selectbackground -selectborderwidth \
  187.         -selectforeground -setgrid -spacing1 -spacing2 -spacing3 \
  188.         -state -wrap
  189.  
  190.     rename -font -textfont textFont Font
  191.     rename -background -textbackground textBackground Background
  192.     }
  193.     pack $itk_component(text) -fill both -expand yes 
  194.     
  195.     #
  196.     # Create the vertical margin
  197.     #
  198.     itk_component add vmargin {
  199.     frame $itk_component(topframe).vmargin -width 0
  200.     } {
  201.     keep -background -cursor
  202.     }
  203.     
  204.     # 
  205.     # Create the vertical scroll bar.
  206.     #
  207.     itk_component add vertsb {
  208.     scrollbar $itk_component(topframe).vertsb -orient vertical \
  209.         -command [code $itk_component(text) yview]
  210.     } {
  211.     keep -activebackground -activerelief -background -borderwidth \
  212.         -cursor -elementborderwidth \
  213.         -highlightcolor -jump -highlightthickness -relief \
  214.         -repeatdelay -repeatinterval -troughcolor
  215.     rename -highlightbackground -background background Background
  216.     }
  217.     pack $itk_component(vertsb) -side right -fill y
  218.     pack $itk_component(vmargin) -side right
  219.     pack $itk_component(borderFrame) -fill both -expand yes -side left
  220.     
  221.     #
  222.     # Next the horizontal scrollbar.
  223.     #
  224.     itk_component add horizsb {
  225.     scrollbar $itk_component(bottomframe).horizsb -orient horizontal \
  226.         -command [code $itk_component(text) xview]
  227.     } {
  228.     keep -activebackground -activerelief -background -borderwidth \
  229.         -cursor -elementborderwidth \
  230.         -highlightcolor -jump -highlightthickness -relief \
  231.         -repeatdelay -repeatinterval -troughcolor
  232.     rename -highlightbackground -background background Background
  233.     }
  234.     pack $itk_component(horizsb) -side left -fill x -expand yes
  235.     
  236.     #
  237.     # Create the filler frame and compute its width.
  238.     #
  239.     itk_component add filler {
  240.     frame $itk_component(bottomframe).filler -width [_fillerWidth]
  241.     } {
  242.     keep -background -cursor
  243.     }
  244.     pack $itk_component(filler) -side right 
  245.  
  246.     #
  247.     # Explicitly handle configs that may have been ignored earlier.
  248.     #
  249.     eval itk_initialize $args
  250.     
  251.     bind $itk_component(hmargin) <Configure> [code $this _configureFiller]
  252.     bind $itk_component(vertsb) <Configure> [code $this _configureFiller]
  253.     bind $itk_component(vmargin) <Configure> [code $this _configureFiller]
  254.     bind $itk_component(horizsb) <Configure> [code $this _configureFiller]
  255.  
  256.     set _initialized 1
  257.     configure -scrollmargin $itk_option(-scrollmargin)
  258.     configure -vscrollmode $itk_option(-vscrollmode)
  259. }
  260.  
  261. # ------------------------------------------------------------------
  262. #                           DESTURCTOR
  263. # ------------------------------------------------------------------
  264. body iwidgets::Scrolledtext::destructor {} {
  265.     if {$_reconfigPlanned != ""} {after cancel $_reconfigPlanned}
  266. }
  267.  
  268. # ------------------------------------------------------------------
  269. #                             OPTIONS
  270. # ------------------------------------------------------------------
  271.  
  272. # ------------------------------------------------------------------
  273. # OPTION: -scrollmargin
  274. # Set the distance between the scrollbars and the text area.
  275. # ------------------------------------------------------------------
  276. configbody iwidgets::Scrolledtext::scrollmargin {
  277.     if {$_initialized} {
  278.     set pixels [winfo pixels $itk_component(hmargin) \
  279.         $itk_option(-scrollmargin)]
  280.     
  281.     if {$_hmode == "on"} {
  282.         $itk_component(hmargin) config -width 1 -height $pixels
  283.     }
  284.     
  285.     if {$_vmode == "on"} {
  286.         $itk_component(vmargin) config -width $pixels -height 1
  287.     }
  288.     
  289.     $itk_component(filler) config -width [_fillerWidth] -height 1
  290.     }
  291. }
  292.  
  293. # ------------------------------------------------------------------
  294. # OPTION: -sbwidth
  295. #
  296. # Set the width of the scrollbars.
  297. # ------------------------------------------------------------------
  298. configbody iwidgets::Scrolledtext::sbwidth {
  299.     if {$_initialized} {
  300.     $itk_component(vertsb) configure -width $itk_option(-sbwidth)
  301.     $itk_component(horizsb) configure -width $itk_option(-sbwidth)
  302.     }
  303. }
  304.  
  305. # ------------------------------------------------------------------
  306. # OPTION: -vscrollmode
  307. #
  308. # Enable/disable display and mode of veritcal scrollbar.
  309. # ------------------------------------------------------------------
  310. configbody iwidgets::Scrolledtext::vscrollmode {
  311.     if {$_initialized} {
  312.     switch $itk_option(-vscrollmode) {
  313.         static {
  314.         _vertScrollbarDisplay on
  315.         }
  316.         
  317.         dynamic -
  318.         none {
  319.         _vertScrollbarDisplay off
  320.         }
  321.         
  322.         default {
  323.         error "bad vscrollmode option\
  324.             \"$itk_option(-vscrollmode)\": should\
  325.             be static, dynamic, or none"
  326.         }
  327.     }
  328.     }
  329. }
  330.  
  331. # ------------------------------------------------------------------
  332. # OPTION: -hscrollmode
  333. #
  334. # Enable/disable display and mode of horizontal scrollbars.
  335. # ------------------------------------------------------------------
  336. configbody iwidgets::Scrolledtext::hscrollmode {
  337.     switch $itk_option(-hscrollmode) {
  338.     static {
  339.         _horizScrollbarDisplay on
  340.     }
  341.     
  342.     dynamic -
  343.     none {
  344.         _horizScrollbarDisplay off
  345.     }
  346.     
  347.     default {
  348.         error "bad hscrollmode option\
  349.             \"$itk_option(-hscrollmode)\": should\
  350.             be static, dynamic, or none"
  351.     }
  352.     }
  353. }
  354.  
  355. # ------------------------------------------------------------------
  356. # OPTION: -width
  357. #
  358. # Specifies the width of the scrolled text as an entire unit.
  359. # The value may be specified in any of the forms acceptable to 
  360. # Tk_GetPixels.  Any additional space needed to display the other
  361. # components such as labels, margins, and scrollbars force the text
  362. # to be compressed.  A value of zero along with the same value for 
  363. # the height causes the value given for the visibleitems option 
  364. # to be applied which administers geometry constraints in a different
  365. # manner.
  366. # ------------------------------------------------------------------
  367. configbody iwidgets::Scrolledtext::width {
  368.     if {$itk_option(-width) != 0} {
  369.     pack propagate $itk_component(shell) no
  370.     
  371.     $itk_component(text) configure -width 1
  372.     $itk_component(shell) configure \
  373.         -width [winfo pixels \
  374.         $itk_component(shell) $itk_option(-width)] 
  375.     } else {
  376.     if {$_initialized} {
  377.         configure -visibleitems $itk_option(-visibleitems)
  378.     }
  379.     }
  380. }
  381.  
  382. # ------------------------------------------------------------------
  383. # OPTION: -height
  384. #
  385. # Specifies the height of the scrolled text as an entire unit.
  386. # The value may be specified in any of the forms acceptable to 
  387. # Tk_GetPixels.  Any additional space needed to display the other
  388. # components such as labels, margins, and scrollbars force the text
  389. # to be compressed.  A value of zero along with the same value for 
  390. # the width causes the value given for the visibleitems option 
  391. # to be applied which administers geometry constraints in a different
  392. # manner.
  393. # ------------------------------------------------------------------
  394. configbody iwidgets::Scrolledtext::height {
  395.     if {$itk_option(-height) != 0} {
  396.     pack propagate $itk_component(shell) no
  397.     
  398.     $itk_component(text) configure -height 1
  399.     $itk_component(shell) configure \
  400.         -height [winfo pixels \
  401.         $itk_component(shell) $itk_option(-height)] 
  402.     } else {
  403.     if {$_initialized} {
  404.         configure -visibleitems $itk_option(-visibleitems)
  405.     }
  406.     }
  407. }
  408.  
  409. # ------------------------------------------------------------------
  410. # OPTION: -visibleitems
  411. #
  412. # Specified the widthxheight in characters and lines for the text.
  413. # This option is only administered if the width and height options
  414. # are both set to zero, otherwise they take precedence.  With the
  415. # visibleitems option engaged, geometry constraints are maintained
  416. # only on the text.  The size of the other components such as 
  417. # labels, margins, and scroll bars, are additive and independent, 
  418. # effecting the overall size of the scrolled text.  In contrast,
  419. # should the width and height options have non zero values, they
  420. # are applied to the scrolled text as a whole.  The text is 
  421. # compressed or expanded to maintain the geometry constraints.
  422. # ------------------------------------------------------------------
  423. configbody iwidgets::Scrolledtext::visibleitems {
  424.     if {[regexp {^[0-9]+x[0-9]+$} $itk_option(-visibleitems)]} {
  425.     if {($itk_option(-width) == 0) && \
  426.         ($itk_option(-height) == 0)} {
  427.         set chars [lindex [split $itk_option(-visibleitems) x] 0]
  428.         set lines [lindex [split $itk_option(-visibleitems) x] 1]
  429.         
  430.         pack propagate $itk_component(shell) yes
  431.         
  432.         $itk_component(text) configure \
  433.             -width $chars -height $lines
  434.     }
  435.     
  436.     } else {
  437.     error "bad visibleitems option\
  438.         \"$itk_option(-visibleitems)\": should be\
  439.         widthxheight"
  440.     }
  441. }
  442.  
  443. # ------------------------------------------------------------------
  444. #                            METHODS
  445. # ------------------------------------------------------------------
  446.  
  447. # ------------------------------------------------------------------
  448. # METHOD: bbox index
  449. #
  450. # Returns four element list describing the bounding box for the list
  451. # item at index
  452. # ------------------------------------------------------------------
  453. body iwidgets::Scrolledtext::bbox {index} {
  454.     return [$itk_component(text) bbox $index]
  455. }
  456.  
  457. # ------------------------------------------------------------------
  458. # METHOD clear 
  459. #
  460. # Clear the text area.
  461. # ------------------------------------------------------------------
  462. body iwidgets::Scrolledtext::clear {} {
  463.     $itk_component(text) delete 1.0 end
  464. }
  465.  
  466. # ------------------------------------------------------------------
  467. # METHOD import filename
  468. #
  469. # Load text from an existing file (import filename)
  470. # ------------------------------------------------------------------
  471. body iwidgets::Scrolledtext::import {filename} {
  472.     set f [open $filename r]
  473.     insert end [read $f]
  474.     close $f
  475. }
  476.  
  477. # ------------------------------------------------------------------
  478. # METHOD export filename
  479. #
  480. # write text to a file (export filename)
  481. # ------------------------------------------------------------------
  482. body iwidgets::Scrolledtext::export {filename} {
  483.     set f [open $filename w]
  484.     
  485.     set txt [$itk_component(text) get 1.0 end]
  486.     puts $f $txt
  487.     
  488.     flush $f
  489.     close $f
  490. }
  491.  
  492. # ------------------------------------------------------------------
  493. # METHOD compare index1 op index2
  494. #
  495. # Compare indices according to relational operator.
  496. # ------------------------------------------------------------------
  497. body iwidgets::Scrolledtext::compare {index1 op index2} {
  498.     return [$itk_component(text) compare $index1 $op $index2]
  499. }
  500.  
  501. # ------------------------------------------------------------------
  502. # METHOD debug ?boolean?
  503. #
  504. # Activates consistency checks in B-tree code associated with text
  505. # widgets.
  506. # ------------------------------------------------------------------
  507. body iwidgets::Scrolledtext::debug {args} {
  508.     eval $itk_component(text) debug $args
  509. }
  510.  
  511. # ------------------------------------------------------------------
  512. # METHOD delete first ?last?
  513. #
  514. # Delete a range of characters from the text.
  515. # ------------------------------------------------------------------
  516. body iwidgets::Scrolledtext::delete {first {last {}}} {
  517.     $itk_component(text) delete $first $last
  518. }
  519.  
  520. # ------------------------------------------------------------------
  521. # METHOD dlineinfo index
  522. #
  523. # Returns a five element list describing the area occupied by the
  524. # display line containing index.
  525. # ------------------------------------------------------------------
  526. body iwidgets::Scrolledtext::dlineinfo {index} {
  527.     return [$itk_component(text) dlineinfo $index]
  528. }
  529.  
  530. # ------------------------------------------------------------------
  531. # METHOD get index1 ?index2?
  532. #
  533. # Return text from start index to end index.
  534. # ------------------------------------------------------------------
  535. body iwidgets::Scrolledtext::get {index1 {index2 {}}} {
  536.     return [$itk_component(text) get $index1 $index2]
  537. }
  538.  
  539. # ------------------------------------------------------------------
  540. # METHOD index index
  541. #
  542. # Return position corresponding to index.
  543. # ------------------------------------------------------------------
  544. body iwidgets::Scrolledtext::index {index} {
  545.     return [$itk_component(text) index $index]
  546. }
  547.  
  548. # ------------------------------------------------------------------
  549. # METHOD insert index chars ?tagList?
  550. #
  551. # Insert text at index.
  552. # ------------------------------------------------------------------
  553. body iwidgets::Scrolledtext::insert {args} {
  554.     eval $itk_component(text) insert $args
  555. }
  556.  
  557. # ------------------------------------------------------------------
  558. # METHOD mark option ?arg arg ...?
  559. #
  560. # Manipulate marks dependent on options.
  561. # ------------------------------------------------------------------
  562. body iwidgets::Scrolledtext::mark {option args} {
  563.     return [eval $itk_component(text) mark $option $args]
  564. }
  565.  
  566. # ------------------------------------------------------------------
  567. # METHOD scan option args
  568. #
  569. # Implements scanning on texts.
  570. # ------------------------------------------------------------------
  571. body iwidgets::Scrolledtext::scan {option args} {
  572.     eval $itk_component(text) scan $option $args
  573. }
  574.  
  575. # ------------------------------------------------------------------
  576. # METHOD search ?switches? pattern index ?varName?
  577. #
  578. # Searches the text for characters matching a pattern.
  579. # ------------------------------------------------------------------
  580. body iwidgets::Scrolledtext::search {args} {
  581.     return [eval $itk_component(text) search $args]
  582. }
  583.  
  584. # ------------------------------------------------------------------
  585. # METHOD see index
  586. #
  587. # Adjusts the view in the window so the character at index is 
  588. # visible.
  589. # ------------------------------------------------------------------
  590. body iwidgets::Scrolledtext::see {index} {
  591.     $itk_component(text) see $index
  592. }
  593.  
  594. # ------------------------------------------------------------------
  595. # METHOD tag option ?arg arg ...?
  596. #
  597. # Manipulate tags dependent on options.
  598. # ------------------------------------------------------------------
  599. body iwidgets::Scrolledtext::tag {option args} {
  600.     return [eval $itk_component(text) tag $option $args]
  601. }
  602.  
  603. # ------------------------------------------------------------------
  604. # METHOD window option ?arg arg ...?
  605. #
  606. # Manipulate embedded windows.
  607. # ------------------------------------------------------------------
  608. body iwidgets::Scrolledtext::window {option args} {
  609.     return [eval $itk_component(text) window $option $args]
  610. }
  611.  
  612. # ------------------------------------------------------------------
  613. # METHOD xview
  614. #
  615. # Changes x view in widget's window.
  616. # ------------------------------------------------------------------
  617. body iwidgets::Scrolledtext::xview {args} {
  618.     return [eval $itk_component(text) xview $args]
  619. }
  620.  
  621. # ------------------------------------------------------------------
  622. # METHOD yview
  623. #
  624. # Changes y view in widget's window.
  625. # ------------------------------------------------------------------
  626. body iwidgets::Scrolledtext::yview {args} {
  627.     return [eval $itk_component(text) yview $args]
  628. }
  629.  
  630. # ------------------------------------------------------------------
  631. # PRIVATE METHOD: _fillerWidth 
  632. #
  633. # Compute the width of the filler frame based on the vertical 
  634. # scrollbar width plus the margin.
  635. # ------------------------------------------------------------------
  636. body iwidgets::Scrolledtext::_fillerWidth {} {
  637.     if {$_vmode == "on"} {
  638.     return [expr [winfo reqwidth $itk_component(vertsb)] + \
  639.         [winfo reqwidth $itk_component(vmargin)]]
  640.     } else {
  641.     return 1
  642.     }
  643. }
  644.  
  645. # ------------------------------------------------------------------
  646. # PROTECTED METHOD: _configureFiller 
  647. #
  648. # Set up to do an update of the filler if one is not all ready 
  649. # planned.
  650. # ------------------------------------------------------------------
  651. body iwidgets::Scrolledtext::_configureFiller {} {
  652.     if {$_reconfigPlanned == ""} {
  653.     set _reconfigPlanned [after idle [code $this _updateFiller]]
  654.     }
  655. }
  656.  
  657. # ------------------------------------------------------------------
  658. # PROTECTED METHOD: _updateFiller 
  659. #
  660. # Update the width of the filler following a configure event on 
  661. # a scrollbar or margin.
  662. # ------------------------------------------------------------------
  663. body iwidgets::Scrolledtext::_updateFiller {} {
  664.     $itk_component(filler) config -width [_fillerWidth] -height 1
  665.     set _reconfigPlanned ""
  666. }
  667.  
  668. # ------------------------------------------------------------------
  669. # PRIVATE METHOD: _vertScrollbarDisplay mode
  670. #
  671. # Displays the vertical scrollbar based on the input mode.
  672. # ------------------------------------------------------------------
  673. body iwidgets::Scrolledtext::_vertScrollbarDisplay {mode} {
  674.     switch $mode  {
  675.     on {
  676.         set _vmode on
  677.         
  678.         $itk_component(vmargin) config -height 1 -width \
  679.             [winfo pixels $itk_component(vmargin) \
  680.             $itk_option(-scrollmargin)]
  681.         
  682.         pack forget $itk_component(borderFrame)
  683.         pack forget $itk_component(vmargin)
  684.         pack $itk_component(vertsb) -side right -fill y
  685.         pack $itk_component(vmargin) -side right
  686.         pack $itk_component(borderFrame) -fill both -expand yes -side left 
  687.     }
  688.     
  689.     off {
  690.         set _vmode off
  691.         
  692.         pack forget $itk_component(vertsb)
  693.         
  694.         $itk_component(vmargin) config -width 1 -height 1
  695.         $itk_component(filler) config -width 1 -height 1
  696.     }
  697.     
  698.     default {
  699.         error "invalid argument \"$mode\": should be on or off"
  700.     }
  701.     }
  702. }
  703.  
  704. # ------------------------------------------------------------------
  705. # PRIVATE METHOD: _horizScrollbarDisplay mode
  706. #
  707. # Displays the horizontal scrollbar based on the input mode.
  708. # ------------------------------------------------------------------
  709. body iwidgets::Scrolledtext::_horizScrollbarDisplay {mode} {
  710.     switch $mode  {
  711.     on {
  712.         set _hmode on
  713.         
  714.         $itk_component(hmargin) config -width 1 -height \
  715.             [winfo pixels $itk_component(hmargin) \
  716.             $itk_option(-scrollmargin)]
  717.         
  718.         pack $itk_component(horizsb) -side left -fill x -expand yes
  719.     }
  720.     
  721.     off {
  722.         set _hmode off
  723.         
  724.         pack forget $itk_component(horizsb)
  725.         
  726.         $itk_component(hmargin) config -width 1 -height 1
  727.         $itk_component(filler) config -width 1 -height 1
  728.     }
  729.     
  730.     default {
  731.         error "invalid argument \"$mode\": should be on or off"
  732.     }
  733.     }
  734. }
  735.  
  736. # ------------------------------------------------------------------
  737. # PRIVATE METHOD: _scrollText wid first last
  738. #
  739. # Performs scrolling and display of scrollbars based on the first and
  740. # last text views as well as the current -vscrollmode and -hscrollmode
  741. # settings.
  742. # ------------------------------------------------------------------
  743. body iwidgets::Scrolledtext::_scrollText {wid first last} {
  744.     $wid set $first $last
  745.     
  746.     if {$wid == $itk_component(vertsb)} {
  747.     if {$itk_option(-vscrollmode) == "dynamic"} {
  748.         if {($first == 0) && ($last == 1)} {
  749.         if {$_vmode != "off"} {
  750.             _vertScrollbarDisplay off
  751.         }
  752.         
  753.         } else {
  754.         if {$_vmode != "on"} {
  755.             _vertScrollbarDisplay on
  756.         }
  757.         }
  758.     }
  759.     
  760.     } elseif {$wid == $itk_component(horizsb)} {
  761.     if {$itk_option(-hscrollmode) == "dynamic"} {
  762.         if {($first == 0) && ($last == 1)} {
  763.         if {$_hmode != "off"} {
  764.             _horizScrollbarDisplay off
  765.         }
  766.         
  767.         } else {
  768.         if {$_hmode != "on"} {
  769.             _horizScrollbarDisplay on
  770.         }
  771.         }
  772.     }
  773.     }
  774. }
  775.