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