home *** CD-ROM | disk | FTP | other *** search
/ PC World 2005 June / PCWorld_2005-06_cd.bin / software / vyzkuste / firewally / firewally.exe / framework-2.3.exe / scrolledtext.itk < prev    next >
Text File  |  2003-09-01  |  18KB  |  502 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@austin.dsccc.com
  13. #
  14. #  @(#) $Id: scrolledtext.itk,v 1.5 2002/09/10 03:05:25 smithc 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. # Usual options.
  40. #
  41. itk::usual Scrolledtext {
  42.     keep -activebackground -activerelief -background -borderwidth -cursor \
  43.      -elementborderwidth -foreground -highlightcolor -highlightthickness \
  44.      -insertbackground -insertborderwidth -insertofftime -insertontime \
  45.      -insertwidth -jump -labelfont -selectbackground -selectborderwidth \
  46.      -selectforeground -textbackground -textfont -troughcolor 
  47. }
  48.  
  49. # ------------------------------------------------------------------
  50. #                           SCROLLEDTEXT
  51. # ------------------------------------------------------------------
  52. itcl::class iwidgets::Scrolledtext {
  53.     inherit iwidgets::Scrolledwidget
  54.  
  55.     constructor {args} {}
  56.     destructor {}
  57.  
  58.     itk_option define -width width Width 0
  59.     itk_option define -height height Height 0
  60.     itk_option define -visibleitems visibleItems VisibleItems 80x24
  61.  
  62.     public method bbox {index} 
  63.     public method childsite {} 
  64.     public method clear {} 
  65.     public method import {filename {index end}} 
  66.     public method export {filename} 
  67.     public method compare {index1 op index2} 
  68.     public method debug {args} 
  69.     public method delete {first {last {}}} 
  70.     public method dlineinfo {index} 
  71.     public method get {index1 {index2 {}}} 
  72.     public method image {option args}
  73.     public method index {index} 
  74.     public method insert {args} 
  75.     public method mark {option args} 
  76.     public method scan {option args} 
  77.     public method search {args} 
  78.     public method see {index} 
  79.     public method tag {option args} 
  80.     public method window {option args} 
  81.     public method xview {args} 
  82.     public method yview {args} 
  83. }
  84.  
  85. #
  86. # Provide a lowercased access method for the Scrolledtext class.
  87. proc ::iwidgets::scrolledtext {pathName args} {
  88.     uplevel ::iwidgets::Scrolledtext $pathName $args
  89. }
  90.  
  91. #
  92. # Use option database to override default resources of base classes.
  93. #
  94. option add *Scrolledtext.labelPos n widgetDefault
  95.  
  96. # ------------------------------------------------------------------
  97. #                        CONSTRUCTOR
  98. # ------------------------------------------------------------------
  99. itcl::body iwidgets::Scrolledtext::constructor {args} {
  100.     #
  101.     # Our -width and -height options are slightly different than
  102.     # those implemented by our base class, so we're going to
  103.     # remove them and redefine our own.
  104.     #
  105.     itk_option remove iwidgets::Scrolledwidget::width
  106.     itk_option remove iwidgets::Scrolledwidget::height
  107.  
  108.     #
  109.     # Create a clipping frame which will provide the border for
  110.     # relief display.
  111.     #
  112.     itk_component add clipper {
  113.     frame $itk_interior.clipper
  114.     } {
  115.     usual
  116.  
  117.     keep -borderwidth -relief -highlightthickness -highlightcolor
  118.     rename -highlightbackground -background background Background
  119.     }    
  120.     grid $itk_component(clipper) -row 0 -column 0 -sticky nsew
  121.     grid rowconfigure $_interior 0 -weight 1
  122.     grid columnconfigure $_interior 0 -weight 1
  123.  
  124.     # 
  125.     # Create the text area.
  126.     #
  127.     itk_component add text {
  128.     text $itk_component(clipper).text \
  129.         -width 1 -height 1 \
  130.             -xscrollcommand \
  131.         [itcl::code $this _scrollWidget $itk_interior.horizsb] \
  132.         -yscrollcommand \
  133.         [itcl::code $this _scrollWidget $itk_interior.vertsb] \
  134.             -borderwidth 0 -highlightthickness 0
  135.     } {
  136.     usual
  137.  
  138.     ignore -highlightthickness -highlightcolor -borderwidth
  139.  
  140.     keep -exportselection -padx -pady -setgrid \
  141.          -spacing1 -spacing2 -spacing3 -state -tabs -wrap
  142.  
  143.     rename -font -textfont textFont Font
  144.     rename -background -textbackground textBackground Background
  145.     }
  146.     grid $itk_component(text) -row 0 -column 0 -sticky nsew
  147.     grid rowconfigure $itk_component(clipper) 0 -weight 1
  148.     grid columnconfigure $itk_component(clipper) 0 -weight 1
  149.     
  150.     # 
  151.     # Configure the command on the vertical scroll bar in the base class.
  152.     #
  153.     $itk_component(vertsb) configure \
  154.     -command [itcl::code $itk_component(text) yview]
  155.  
  156.     #
  157.     # Configure the command on the horizontal scroll bar in the base class.
  158.     #
  159.     $itk_component(horizsb) configure \
  160.         -command [itcl::code $itk_component(text) xview]
  161.     
  162.     #
  163.     # Initialize the widget based on the command line options.
  164.     #
  165.     eval itk_initialize $args
  166. }
  167.  
  168. # ------------------------------------------------------------------
  169. #                           DESTURCTOR
  170. # ------------------------------------------------------------------
  171. itcl::body iwidgets::Scrolledtext::destructor {} {
  172. }
  173.  
  174. # ------------------------------------------------------------------
  175. #                             OPTIONS
  176. # ------------------------------------------------------------------
  177.  
  178. # ------------------------------------------------------------------
  179. # OPTION: -width
  180. #
  181. # Specifies the width of the scrolled text as an entire unit.
  182. # The value may be specified in any of the forms acceptable to 
  183. # Tk_GetPixels.  Any additional space needed to display the other
  184. # components such as labels, margins, and scrollbars force the text
  185. # to be compressed.  A value of zero along with the same value for 
  186. # the height causes the value given for the visibleitems option 
  187. # to be applied which administers geometry constraints in a different
  188. # manner.
  189. # ------------------------------------------------------------------
  190. itcl::configbody iwidgets::Scrolledtext::width {
  191.     if {$itk_option(-width) != 0} {
  192.     set shell [lindex [grid info $itk_component(clipper)] 1]
  193.  
  194.     #
  195.     # Due to a bug in the tk4.2 grid, we have to check the 
  196.     # propagation before setting it.  Setting it to the same
  197.     # value it already is will cause it to toggle.
  198.     #
  199.     if {[grid propagate $shell]} {
  200.         grid propagate $shell no
  201.     }
  202.     
  203.     $itk_component(text) configure -width 1
  204.     $shell configure \
  205.         -width [winfo pixels $shell $itk_option(-width)] 
  206.     } else {
  207.     configure -visibleitems $itk_option(-visibleitems)
  208.     }
  209. }
  210.  
  211. # ------------------------------------------------------------------
  212. # OPTION: -height
  213. #
  214. # Specifies the height of the scrolled text as an entire unit.
  215. # The value may be specified in any of the forms acceptable to 
  216. # Tk_GetPixels.  Any additional space needed to display the other
  217. # components such as labels, margins, and scrollbars force the text
  218. # to be compressed.  A value of zero along with the same value for 
  219. # the width causes the value given for the visibleitems option 
  220. # to be applied which administers geometry constraints in a different
  221. # manner.
  222. # ------------------------------------------------------------------
  223. itcl::configbody iwidgets::Scrolledtext::height {
  224.     if {$itk_option(-height) != 0} {
  225.     set shell [lindex [grid info $itk_component(clipper)] 1]
  226.  
  227.     #
  228.     # Due to a bug in the tk4.2 grid, we have to check the 
  229.     # propagation before setting it.  Setting it to the same
  230.     # value it already is will cause it to toggle.
  231.     #
  232.     if {[grid propagate $shell]} {
  233.         grid propagate $shell no
  234.     }
  235.     
  236.     $itk_component(text) configure -height 1
  237.     $shell configure \
  238.         -height [winfo pixels $shell $itk_option(-height)] 
  239.     } else {
  240.     configure -visibleitems $itk_option(-visibleitems)
  241.     }
  242. }
  243.  
  244. # ------------------------------------------------------------------
  245. # OPTION: -visibleitems
  246. #
  247. # Specified the widthxheight in characters and lines for the text.
  248. # This option is only administered if the width and height options
  249. # are both set to zero, otherwise they take precedence.  With the
  250. # visibleitems option engaged, geometry constraints are maintained
  251. # only on the text.  The size of the other components such as 
  252. # labels, margins, and scroll bars, are additive and independent, 
  253. # effecting the overall size of the scrolled text.  In contrast,
  254. # should the width and height options have non zero values, they
  255. # are applied to the scrolled text as a whole.  The text is 
  256. # compressed or expanded to maintain the geometry constraints.
  257. # ------------------------------------------------------------------
  258. itcl::configbody iwidgets::Scrolledtext::visibleitems {
  259.     if {[regexp {^[0-9]+x[0-9]+$} $itk_option(-visibleitems)]} {
  260.     if {($itk_option(-width) == 0) && \
  261.         ($itk_option(-height) == 0)} {
  262.         set chars [lindex [split $itk_option(-visibleitems) x] 0]
  263.         set lines [lindex [split $itk_option(-visibleitems) x] 1]
  264.         
  265.         set shell [lindex [grid info $itk_component(clipper)] 1]
  266.  
  267.         #
  268.         # Due to a bug in the tk4.2 grid, we have to check the 
  269.         # propagation before setting it.  Setting it to the same
  270.         # value it already is will cause it to toggle.
  271.         #
  272.         if {! [grid propagate $shell]} {
  273.         grid propagate $shell yes
  274.         }
  275.         
  276.         $itk_component(text) configure -width $chars -height $lines
  277.     }
  278.     
  279.     } else {
  280.     error "bad visibleitems option\
  281.         \"$itk_option(-visibleitems)\": should be\
  282.         widthxheight"
  283.     }
  284. }
  285.  
  286. # ------------------------------------------------------------------
  287. #                            METHODS
  288. # ------------------------------------------------------------------
  289.  
  290. # ------------------------------------------------------------------
  291. # METHOD: childsite
  292. #
  293. # Returns the path name of the child site widget.
  294. # ------------------------------------------------------------------
  295. itcl::body iwidgets::Scrolledtext::childsite {} {
  296.     return $itk_component(text)
  297. }
  298.  
  299. # ------------------------------------------------------------------
  300. # METHOD: bbox index
  301. #
  302. # Returns four element list describing the bounding box for the list
  303. # item at index
  304. # ------------------------------------------------------------------
  305. itcl::body iwidgets::Scrolledtext::bbox {index} {
  306.     return [$itk_component(text) bbox $index]
  307. }
  308.  
  309. # ------------------------------------------------------------------
  310. # METHOD clear 
  311. #
  312. # Clear the text area.
  313. # ------------------------------------------------------------------
  314. itcl::body iwidgets::Scrolledtext::clear {} {
  315.     $itk_component(text) delete 1.0 end
  316. }
  317.  
  318. # ------------------------------------------------------------------
  319. # METHOD import filename
  320. #
  321. # Load text from an existing file (import filename)
  322. # ------------------------------------------------------------------
  323. itcl::body iwidgets::Scrolledtext::import {filename {index end}} {
  324.     set f [open $filename r]
  325.     insert $index [read $f]
  326.     close $f
  327. }
  328.  
  329. # ------------------------------------------------------------------
  330. # METHOD export filename
  331. #
  332. # write text to a file (export filename)
  333. # ------------------------------------------------------------------
  334. itcl::body iwidgets::Scrolledtext::export {filename} {
  335.     set f [open $filename w]
  336.     
  337.     set txt [$itk_component(text) get 1.0 end]
  338.     puts $f $txt
  339.     
  340.     flush $f
  341.     close $f
  342. }
  343.  
  344. # ------------------------------------------------------------------
  345. # METHOD compare index1 op index2
  346. #
  347. # Compare indices according to relational operator.
  348. # ------------------------------------------------------------------
  349. itcl::body iwidgets::Scrolledtext::compare {index1 op index2} {
  350.     return [$itk_component(text) compare $index1 $op $index2]
  351. }
  352.  
  353. # ------------------------------------------------------------------
  354. # METHOD debug ?boolean?
  355. #
  356. # Activates consistency checks in B-tree code associated with text
  357. # widgets.
  358. # ------------------------------------------------------------------
  359. itcl::body iwidgets::Scrolledtext::debug {args} {
  360.     eval $itk_component(text) debug $args
  361. }
  362.  
  363. # ------------------------------------------------------------------
  364. # METHOD delete first ?last?
  365. #
  366. # Delete a range of characters from the text.
  367. # ------------------------------------------------------------------
  368. itcl::body iwidgets::Scrolledtext::delete {first {last {}}} {
  369.     $itk_component(text) delete $first $last
  370. }
  371.  
  372. # ------------------------------------------------------------------
  373. # METHOD dlineinfo index
  374. #
  375. # Returns a five element list describing the area occupied by the
  376. # display line containing index.
  377. # ------------------------------------------------------------------
  378. itcl::body iwidgets::Scrolledtext::dlineinfo {index} {
  379.     return [$itk_component(text) dlineinfo $index]
  380. }
  381.  
  382. # ------------------------------------------------------------------
  383. # METHOD get index1 ?index2?
  384. #
  385. # Return text from start index to end index.
  386. # ------------------------------------------------------------------
  387. itcl::body iwidgets::Scrolledtext::get {index1 {index2 {}}} {
  388.     return [$itk_component(text) get $index1 $index2]
  389. }
  390.  
  391. # ------------------------------------------------------------------
  392. # METHOD image option ?arg arg ...?
  393. #
  394. # Manipulate images dependent on options.
  395. #
  396. # ------------------------------------------------------------------
  397. itcl::body iwidgets::Scrolledtext::image {option args} {
  398.   return [eval $itk_component(text) image $option $args]
  399. }
  400.  
  401.  
  402. # ------------------------------------------------------------------
  403. # METHOD index index
  404. #
  405. # Return position corresponding to index.
  406. # ------------------------------------------------------------------
  407. itcl::body iwidgets::Scrolledtext::index {index} {
  408.     return [$itk_component(text) index $index]
  409. }
  410.  
  411. # ------------------------------------------------------------------
  412. # METHOD insert index chars ?tagList?
  413. #
  414. # Insert text at index.
  415. # ------------------------------------------------------------------
  416. itcl::body iwidgets::Scrolledtext::insert {args} {
  417.     eval $itk_component(text) insert $args
  418. }
  419.  
  420. # ------------------------------------------------------------------
  421. # METHOD mark option ?arg arg ...?
  422. #
  423. # Manipulate marks dependent on options.
  424. # ------------------------------------------------------------------
  425. itcl::body iwidgets::Scrolledtext::mark {option args} {
  426.     return [eval $itk_component(text) mark $option $args]
  427. }
  428.  
  429. # ------------------------------------------------------------------
  430. # METHOD scan option args
  431. #
  432. # Implements scanning on texts.
  433. # ------------------------------------------------------------------
  434. itcl::body iwidgets::Scrolledtext::scan {option args} {
  435.     eval $itk_component(text) scan $option $args
  436. }
  437.  
  438. # ------------------------------------------------------------------
  439. # METHOD search ?switches? pattern index ?varName?
  440. #
  441. # Searches the text for characters matching a pattern.
  442. # ------------------------------------------------------------------
  443. itcl::body iwidgets::Scrolledtext::search {args} {
  444.     #-----------------------------------------------------------
  445.     # BUG FIX: csmith (Chad Smith: csmith@adc.com), 11/18/99
  446.     #-----------------------------------------------------------
  447.     # Need to run this command up one level on the stack since
  448.     # the text widget may modify one of the arguments, which is
  449.     # the case when -count is specified.
  450.     #-----------------------------------------------------------
  451.     return [uplevel eval $itk_component(text) search $args]
  452. }
  453.  
  454. # ------------------------------------------------------------------
  455. # METHOD see index
  456. #
  457. # Adjusts the view in the window so the character at index is 
  458. # visible.
  459. # ------------------------------------------------------------------
  460. itcl::body iwidgets::Scrolledtext::see {index} {
  461.     $itk_component(text) see $index
  462. }
  463.  
  464. # ------------------------------------------------------------------
  465. # METHOD tag option ?arg arg ...?
  466. #
  467. # Manipulate tags dependent on options.
  468. # ------------------------------------------------------------------
  469. itcl::body iwidgets::Scrolledtext::tag {option args} {
  470.     return [eval $itk_component(text) tag $option $args]
  471. }
  472.  
  473. # ------------------------------------------------------------------
  474. # METHOD window option ?arg arg ...?
  475. #
  476. # Manipulate embedded windows.
  477. # ------------------------------------------------------------------
  478. itcl::body iwidgets::Scrolledtext::window {option args} {
  479.     return [eval $itk_component(text) window $option $args]
  480. }
  481.  
  482. # ------------------------------------------------------------------
  483. # METHOD xview
  484. #
  485. # Changes x view in widget's window.
  486. # ------------------------------------------------------------------
  487. itcl::body iwidgets::Scrolledtext::xview {args} {
  488.     return [eval $itk_component(text) xview $args]
  489. }
  490.  
  491. # ------------------------------------------------------------------
  492. # METHOD yview
  493. #
  494. # Changes y view in widget's window.
  495. # ------------------------------------------------------------------
  496. itcl::body iwidgets::Scrolledtext::yview {args} {
  497.     return [eval $itk_component(text) yview $args]
  498. }
  499.  
  500.