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 / tabnotebook.itk < prev    next >
Text File  |  2003-09-01  |  38KB  |  1,106 lines

  1. #
  2. # Tabnotebook Widget
  3. # ----------------------------------------------------------------------
  4. # The Tabnotebook command creates a new window (given by the pathName 
  5. # argument) and makes it into a Tabnotebook widget. Additional options, 
  6. # described above may be specified on the command line or in the option 
  7. # database to configure aspects of the Tabnotebook such as its colors, 
  8. # font, and text. The Tabnotebook command returns its pathName argument. 
  9. # At the time this command is invoked, there must not exist a window 
  10. # named pathName, but pathName's parent must exist.
  11. # A Tabnotebook is a widget that contains a set of tabbed pages. It 
  12. # displays one page from the set as the selected page. A Tab displays 
  13. # the label for the page to which it is attached and serves as a page 
  14. # selector.   When a page's tab is selected, the page's contents are 
  15. # displayed in the page area. The selected tab has a three-dimensional 
  16. # effect to make it appear to float above the other tabs. The tabs are 
  17. # displayed as a group along either the left, top, right, or bottom 
  18. # edge. When first created a Tabnotebook has no pages. Pages may be 
  19. # added or deleted using widget commands described below.
  20. # A special option may be provided to the Tabnotebook. The -auto 
  21. # option specifies whether the Tabnotebook will automatically handle 
  22. # the unpacking and packing of pages when pages are selected. A value 
  23. # of true sig nifies that the notebook will automatically manage it. This 
  24. # is the default value. A value of false signifies the notebook will not 
  25. # perform automatic switching of pages.
  26. # ----------------------------------------------------------------------
  27. #  AUTHOR: Bill W. Scott
  28. #
  29. #  CURRENT MAINTAINER: Chad Smith --> csmith@adc.com or itclguy@yahoo.com
  30. #
  31. #  @(#) $Id: tabnotebook.itk,v 1.7 2002/09/05 20:19:35 smithc Exp $
  32. # ----------------------------------------------------------------------
  33. #            Copyright (c) 1995 DSC Technologies Corporation
  34. # ======================================================================
  35. # Permission to use, copy, modify, distribute and license this software 
  36. # and its documentation for any purpose, and without fee or written 
  37. # agreement with DSC, is hereby granted, provided that the above copyright 
  38. # notice appears in all copies and that both the copyright notice and 
  39. # warranty disclaimer below appear in supporting documentation, and that 
  40. # the names of DSC Technologies Corporation or DSC Communications 
  41. # Corporation not be used in advertising or publicity pertaining to the 
  42. # software without specific, written prior permission.
  43. # DSC DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING 
  44. # ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, AND NON-
  45. # INFRINGEMENT. THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, AND THE
  46. # AUTHORS AND DISTRIBUTORS HAVE NO OBLIGATION TO PROVIDE MAINTENANCE, 
  47. # SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. IN NO EVENT SHALL 
  48. # DSC BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR 
  49. # ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, 
  50. # WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTUOUS ACTION,
  51. # ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS 
  52. # SOFTWARE.
  53. # ======================================================================
  54.  
  55. #
  56. # Default resources.
  57. #
  58. option add *Tabnotebook.borderWidth 2 widgetDefault
  59. option add *Tabnotebook.state normal widgetDefault
  60. option add *Tabnotebook.disabledForeground #a3a3a3 widgetDefault
  61. option add *Tabnotebook.scrollCommand {} widgetDefault
  62. option add *Tabnotebook.equalTabs true widgetDefault
  63. option add *Tabnotebook.font \
  64.     -Adobe-Helvetica-Bold-R-Normal--*-120-*-*-*-*-*-* widgetDefault
  65. option add *Tabnotebook.width 300 widgetDefault
  66. option add *Tabnotebook.height 150 widgetDefault
  67. option add *Tabnotebook.foreground Black widgetDefault
  68. option add *Tabnotebook.background #d9d9d9 widgetDefault
  69. option add *Tabnotebook.tabForeground Black widgetDefault
  70. option add *Tabnotebook.tabBackground #d9d9d9 widgetDefault
  71. option add *Tabnotebook.backdrop #d9d9d9 widgetDefault
  72. option add *Tabnotebook.margin 4 widgetDefault
  73. option add *Tabnotebook.tabBorders true widgetDefault
  74. option add *Tabnotebook.bevelAmount 0 widgetDefault
  75. option add *Tabnotebook.raiseSelect false widgetDefault
  76. option add *Tabnotebook.auto true widgetDefault
  77. option add *Tabnotebook.start 4 widgetDefault
  78. option add *Tabnotebook.padX 4 widgetDefault
  79. option add *Tabnotebook.padY 4 widgetDefault
  80. option add *Tabnotebook.gap overlap widgetDefault
  81. option add *Tabnotebook.angle 15 widgetDefault
  82. option add *Tabnotebook.tabPos s widgetDefault
  83.  
  84. #
  85. # Usual options.
  86. #
  87. itk::usual Tabnotebook {
  88.     keep -backdrop -background -borderwidth -cursor -disabledforeground \
  89.      -font -foreground -tabbackground -tabforeground
  90. }
  91.  
  92. # ------------------------------------------------------------------
  93. #                            TABNOTEBOOK
  94. # ------------------------------------------------------------------
  95. itcl::class iwidgets::Tabnotebook {
  96.     inherit itk::Widget
  97.     
  98.     constructor {args} {}
  99.     destructor {}
  100.     
  101.     itk_option define -borderwidth borderWidth BorderWidth 2 
  102.     itk_option define -state state State normal
  103.     itk_option define \
  104.         -disabledforeground disabledForeground DisabledForeground #a3a3a3
  105.     itk_option define -scrollcommand scrollCommand ScrollCommand {}
  106.     itk_option define -equaltabs equalTabs EqualTabs true
  107.     itk_option define -font font Font \
  108.         -Adobe-Helvetica-Bold-R-Normal--*-120-*-*-*-*-*-*
  109.     itk_option define -width width Width 300
  110.     itk_option define -height height Height 150
  111.     itk_option define -foreground foreground Foreground Black
  112.     itk_option define -background background Background  #d9d9d9
  113.     itk_option define -tabforeground tabForeground TabForeground Black
  114.     itk_option define -tabbackground tabBackground TabBackground #d9d9d9
  115.     itk_option define -backdrop backdrop Backdrop #d9d9d9
  116.     itk_option define -margin margin Margin 4 
  117.     itk_option define -tabborders tabBorders TabBorders true 
  118.     itk_option define -bevelamount bevelAmount BevelAmount 0 
  119.     itk_option define -raiseselect raiseSelect RaiseSelect false 
  120.     itk_option define -auto auto Auto true
  121.     itk_option define -start start Start 4 
  122.     itk_option define -padx padX PadX 4 
  123.     itk_option define -pady padY PadY 4 
  124.     itk_option define -gap gap Gap overlap 
  125.     itk_option define -angle angle Angle 15 
  126.     itk_option define -tabpos tabPos TabPos s 
  127.     
  128.     public method add { args }
  129.     public method configure { args } 
  130.     public method childsite { args }
  131.     public method delete { args } 
  132.     public method index { args } 
  133.     public method insert { index args }
  134.     public method prev { } 
  135.     public method next { }
  136.     public method pageconfigure { index args } 
  137.     public method select { index } 
  138.     public method view { args } 
  139.     
  140.     protected method _reconfigureTabset { } 
  141.     protected method _canvasReconfigure { wid hgt }
  142.     protected method _pageReconfigure { pageName page wid hgt }
  143.     
  144.     private method _getArgs { optList args }
  145.     private method _redrawBorder { wid hgt } 
  146.     private method _recomputeBorder { }
  147.     private method _pack { tabPos } 
  148.     private method _resize {newWidth_ newHeight_}
  149.     
  150.     private variable _canvasWidth 0       ;# currently tabnote canvas width
  151.     private variable _canvasHeight 0      ;# currently tabnote canvas height
  152.     private variable _nbOptList {}        ;# list of notebook options available
  153.     private variable _tsOptList {}        ;# list of tabset options available
  154.     
  155.     private variable _tabPos s            ;# holds -tabPos, because of ordering
  156.     
  157.     private variable _borderRecompute false   ;# did we dirty border after cfg?
  158.     private variable _tabsetReconfigure false ;# did we dirty tabsets after cfg?
  159.     
  160. }
  161.  
  162.  
  163. # ----------------------------------------------------------------------
  164. #                              CONSTRUCTOR
  165. # ----------------------------------------------------------------------
  166. itcl::body iwidgets::Tabnotebook::constructor {args} {
  167.     # The following conditional added for SF ticket #514222.   csmith 9/5/02
  168.     if {$::tk_version > 8.3} {
  169.       component hull configure -borderwidth 0 -padx 0 -pady 0
  170.     } else {
  171.       component hull configure -borderwidth 0
  172.     }
  173.  
  174.     #
  175.     # Create the outermost canvas to maintain geometry.
  176.     #
  177.     itk_component add canvas {
  178.     canvas $itk_interior.canvas -highlightthickness 0
  179.     } {
  180.     keep -cursor -background -width -height
  181.     }
  182.     bind $itk_component(canvas) <Configure> [itcl::code $this _resize %w %h]
  183.  
  184.     
  185.     
  186.     # .......................
  187.     # Create the NOTEBOOK
  188.     #
  189.     itk_component add notebook {
  190.     iwidgets::Notebook $itk_interior.canvas.notebook 
  191.     } {
  192.     keep -cursor -background 
  193.     }
  194.     
  195.     #
  196.     # Ouch, create a dummy page, go pageconfigure to get its options
  197.     # and munge them into a list for later doling by pageconfigure
  198.     #
  199.     $itk_component(notebook) add
  200.     set nbConfigList [$itk_component(notebook) pageconfigure 0]
  201.     foreach config $nbConfigList {
  202.     lappend _nbOptList [lindex $config 0]
  203.     }
  204.     $itk_component(notebook) delete 0
  205.     
  206.     # 
  207.     # Create the tabset.
  208.     #
  209.     itk_component add tabset {
  210.     iwidgets::Tabset $itk_interior.canvas.tabset \
  211.         -command [itcl::code $this component notebook select]
  212.     } {
  213.     keep -cursor 
  214.     }
  215.     
  216.     eval itk_initialize $args
  217.     
  218.     #
  219.     # Ouch, create a dummy tab, go tabconfigure to get its options
  220.     # and munge them into a list for later doling by pageconfigure
  221.     #
  222.     $itk_component(tabset) add
  223.     set tsConfigList [$itk_component(tabset) tabconfigure 0]
  224.     foreach config $tsConfigList {
  225.     lappend _tsOptList [lindex $config 0]
  226.     }
  227.     $itk_component(tabset) delete 0
  228.     
  229.     bind $itk_component(tabset) <Configure> \
  230.         [itcl::code $this _reconfigureTabset]
  231.     
  232.     _pack $_tabPos
  233.     $itk_component(hull) configure -width [cget -width] -height [cget -height]
  234. }
  235.  
  236. proc ::iwidgets::tabnotebook {pathName args} {
  237.     uplevel ::iwidgets::Tabnotebook $pathName $args
  238. }
  239.  
  240.  
  241. # -------------------------------------------------------------
  242. # DESTRUCTOR: destroy the Tabnotebook
  243. # -------------------------------------------------------------
  244. itcl::body iwidgets::Tabnotebook::destructor {} {
  245. }
  246.  
  247. # ----------------------------------------------------------------------
  248. # OPTION -borderwidth
  249. #
  250. # Thickness of Notebook Border
  251. # ----------------------------------------------------------------------
  252. itcl::configbody iwidgets::Tabnotebook::borderwidth {
  253.     if {$itk_option(-borderwidth) != {}} {
  254.     #_recomputeBorder
  255.     set _borderRecompute true
  256.     }
  257. }
  258.  
  259. # ----------------------------------------------------------------------
  260. # OPTION -state
  261. #
  262. # State of the tabs in the tab notebook: normal or disabled
  263. # ----------------------------------------------------------------------
  264. itcl::configbody iwidgets::Tabnotebook::state {
  265.     if {$itk_option(-state) != {}} {
  266.     $itk_component(tabset) configure -state $itk_option(-state)
  267.     #_reconfigureTabset
  268.     set _tabsetReconfigure true
  269.     
  270.     }
  271. }
  272.  
  273. # ----------------------------------------------------------------------
  274. # OPTION -disabledforeground
  275. #
  276. # Specifies a foreground color to use for displaying a 
  277. # tab's label when its state is disabled.
  278. # ----------------------------------------------------------------------
  279. itcl::configbody iwidgets::Tabnotebook::disabledforeground {
  280.     
  281.     if {$itk_option(-disabledforeground) != {}} {
  282.     $itk_component(tabset) configure \
  283.         -disabledforeground $itk_option(-disabledforeground)
  284.     #_reconfigureTabset
  285.     set _tabsetReconfigure true
  286.     }
  287. }
  288.  
  289. # ----------------------------------------------------------------------
  290. # OPTION -scrollcommand
  291. #
  292. # Standard option. See options man pages.
  293. # ----------------------------------------------------------------------
  294. itcl::configbody iwidgets::Tabnotebook::scrollcommand {
  295.     
  296.     if {$itk_option(-scrollcommand) != {}} {
  297.     $itk_component(notebook) \
  298.         configure -scrollcommand $itk_option(-scrollcommand)
  299.     }
  300. }
  301.  
  302. # ----------------------------------------------------------------------
  303. # OPTION -equaltabs
  304. #
  305. # Specifies whether to force tabs to be equal sized or not. 
  306. # A value of true means constrain tabs to be equal sized. 
  307. # A value of false allows each tab to size based on the text 
  308. # label size. The value may have any of the forms accepted by 
  309. # the Tcl_GetBoolean, such as true, false, 0, 1, yes, or no.
  310. # ----------------------------------------------------------------------
  311. itcl::configbody iwidgets::Tabnotebook::equaltabs {
  312.     
  313.     if {$itk_option(-equaltabs) != {}} {
  314.     $itk_component(tabset) \
  315.         configure -equaltabs $itk_option(-equaltabs)
  316.     #_reconfigureTabset
  317.     set _tabsetReconfigure true
  318.     }
  319. }
  320.  
  321. # ----------------------------------------------------------------------
  322. # OPTION -font
  323. #
  324. # Font for tab labels when they are set to text (-label set)
  325. # ----------------------------------------------------------------------
  326. itcl::configbody iwidgets::Tabnotebook::font {
  327.     
  328.     if {$itk_option(-font) != {}} {
  329.     $itk_component(tabset) configure -font $itk_option(-font)
  330.     #_reconfigureTabset
  331.     set _tabsetReconfigure true
  332.     }
  333. }
  334.  
  335. # ----------------------------------------------------------------------
  336. # OPTION -width
  337. #
  338. # Width of the Tabnotebook
  339. # ----------------------------------------------------------------------
  340. itcl::configbody iwidgets::Tabnotebook::width {
  341.     if {$itk_option(-width) != {}} {
  342.     $itk_component(canvas) configure -width $itk_option(-width)
  343.     #_recomputeBorder
  344.     set _borderRecompute true
  345.     }
  346. }
  347.  
  348. # ----------------------------------------------------------------------
  349. # OPTION -height
  350. #
  351. # Height of the Tabnotebook
  352. # ----------------------------------------------------------------------
  353. itcl::configbody iwidgets::Tabnotebook::height {
  354.     if {$itk_option(-height) != {}} {
  355.     $itk_component(canvas) configure -height $itk_option(-height)
  356.     #_recomputeBorder
  357.     set _borderRecompute true
  358.     }
  359. }
  360.  
  361. # ----------------------------------------------------------------------
  362. # OPTION -foreground
  363. #
  364. # Specifies a foreground color to use for displaying a page 
  365. # and its associated tab label (this is the selected state).
  366. # ----------------------------------------------------------------------
  367. itcl::configbody iwidgets::Tabnotebook::foreground {
  368.     
  369.     if {$itk_option(-foreground) != {}} {
  370.     $itk_component(tabset) configure \
  371.         -selectforeground $itk_option(-foreground)
  372.     }
  373. }
  374.  
  375. # ----------------------------------------------------------------------
  376. # OPTION -background
  377. #
  378. # Specifies a background color to use for displaying a page 
  379. # and its associated tab bg (this is the selected state).
  380. # ----------------------------------------------------------------------
  381. itcl::configbody iwidgets::Tabnotebook::background {
  382.     
  383.     if {$itk_option(-background) != {}} {
  384.     $itk_component(tabset) configure \
  385.         -selectbackground $itk_option(-background)
  386.     #_recomputeBorder
  387.     set _borderRecompute true
  388.     }
  389. }
  390.  
  391. # ----------------------------------------------------------------------
  392. # OPTION -tabforeground
  393. #
  394. # Specifies a foreground color to use for displaying tab labels 
  395. # when they are in their unselected state.
  396. # ----------------------------------------------------------------------
  397. itcl::configbody iwidgets::Tabnotebook::tabforeground {
  398.     
  399.     if {$itk_option(-tabforeground) != {}} {
  400.     $itk_component(tabset) configure \
  401.         -foreground $itk_option(-tabforeground)
  402.     }
  403. }
  404.  
  405. # ----------------------------------------------------------------------
  406. # OPTION -tabbackground
  407. #
  408. # Specifies a background color to use for displaying tab backgrounds 
  409. # when they are in their unselected state.
  410. # ----------------------------------------------------------------------
  411. itcl::configbody iwidgets::Tabnotebook::tabbackground {
  412.     
  413.     if {$itk_option(-tabbackground) != {}} {
  414.     $itk_component(tabset) configure \
  415.         -background $itk_option(-tabbackground)
  416.     }
  417. }
  418.  
  419. # ----------------------------------------------------------------------
  420. # OPTION -backdrop
  421. #
  422. # Specifies a background color to use when filling in the 
  423. # area behind the tabs.
  424. # ----------------------------------------------------------------------
  425. itcl::configbody iwidgets::Tabnotebook::backdrop {
  426.     
  427.     if {$itk_option(-backdrop) != {}} {
  428.     $itk_component(tabset) configure \
  429.         -backdrop $itk_option(-backdrop)
  430.     }
  431. }
  432.  
  433. # ----------------------------------------------------------------------
  434. # OPTION -margin
  435. #
  436. # Sets the backdrop margin between tab edge and backdrop edge
  437. # ----------------------------------------------------------------------
  438. itcl::configbody iwidgets::Tabnotebook::margin {
  439.     if {$itk_option(-margin) != {}} {
  440.     $itk_component(tabset) configure -margin $itk_option(-margin)
  441.     }
  442. }
  443.  
  444. # ----------------------------------------------------------------------
  445. # OPTION -tabborders
  446. #
  447. # Boolean that specifies whether to draw the borders of
  448. # the unselected tabs (tabs in background)
  449. # ----------------------------------------------------------------------
  450. itcl::configbody iwidgets::Tabnotebook::tabborders {
  451.     if {$itk_option(-tabborders) != {}} {
  452.     $itk_component(tabset) \
  453.         configure -tabborders $itk_option(-tabborders)
  454.     #_reconfigureTabset
  455.     set _tabsetReconfigure true
  456.     }
  457. }
  458.  
  459. # ----------------------------------------------------------------------
  460. # OPTION -bevelamount
  461. #
  462. # Specifies pixel size of tab corners. 0 means no corners.
  463. # ----------------------------------------------------------------------
  464. itcl::configbody iwidgets::Tabnotebook::bevelamount {
  465.     if {$itk_option(-bevelamount) != {}} {
  466.     $itk_component(tabset) \
  467.         configure -bevelamount $itk_option(-bevelamount)
  468.     #_reconfigureTabset
  469.     set _tabsetReconfigure true
  470.     }
  471. }
  472.  
  473. # ----------------------------------------------------------------------
  474. # OPTION -raiseselect
  475. #
  476. # Sets whether to raise selected tabs
  477. # ----------------------------------------------------------------------
  478. itcl::configbody iwidgets::Tabnotebook::raiseselect {
  479.     if {$itk_option(-raiseselect) != {}} {
  480.     $itk_component(tabset) \
  481.         configure -raiseselect $itk_option(-raiseselect)
  482.     #_reconfigureTabset
  483.     set _tabsetReconfigure true
  484.     }
  485. }
  486.  
  487. # ----------------------------------------------------------------------
  488. # OPTION -auto
  489. #
  490. # Determines whether pages are automatically unpacked and
  491. # packed when pages get selected.
  492. # ----------------------------------------------------------------------
  493. itcl::configbody iwidgets::Tabnotebook::auto {
  494.     if {$itk_option(-auto) != {}} {
  495.     $itk_component(notebook) configure -auto $itk_option(-auto)
  496.     }
  497. }
  498.  
  499. # ----------------------------------------------------------------------
  500. # OPTION -start
  501. # ----------------------------------------------------------------------
  502. itcl::configbody iwidgets::Tabnotebook::start {
  503.     
  504.     if {$itk_option(-start) != {}} {
  505.     $itk_component(tabset) configure \
  506.         -start $itk_option(-start)
  507.     #_reconfigureTabset
  508.     set _tabsetReconfigure true
  509.     }
  510. }
  511.  
  512. # ----------------------------------------------------------------------
  513. # OPTION -padx
  514. #
  515. # Specifies a non-negative value indicating how much extra space 
  516. # to request for a tab around its label in the X-direction. 
  517. # When computing how large a window it needs, the tab will add 
  518. # this amount to the width it would normally need The tab will 
  519. # end up with extra internal space to the left and right of its 
  520. # text label. This value may have any of the forms acceptable 
  521. # to Tk_GetPixels.
  522. # ----------------------------------------------------------------------
  523. itcl::configbody iwidgets::Tabnotebook::padx {
  524.     
  525.     if {$itk_option(-padx) != {}} {
  526.     $itk_component(tabset) configure -padx $itk_option(-padx)
  527.     #_reconfigureTabset
  528.     set _tabsetReconfigure true
  529.     }
  530. }
  531.  
  532. # ----------------------------------------------------------------------
  533. # OPTION -pady
  534. #
  535. # Specifies a non-negative value indicating how much extra space to 
  536. # request for a tab around its label in the Y-direction. When computing 
  537. # how large a window it needs, the tab will add this amount to the 
  538. # height it would normally need The tab will end up with extra internal 
  539. # space to the top and bot tom of its text label. This value may have 
  540. # any of the forms acceptable to Tk_GetPixels.
  541. # ----------------------------------------------------------------------
  542. itcl::configbody iwidgets::Tabnotebook::pady {
  543.     
  544.     if {$itk_option(-pady) != {}} {
  545.     $itk_component(tabset) configure -pady $itk_option(-pady)
  546.     #_reconfigureTabset
  547.     set _tabsetReconfigure true
  548.     }
  549. }
  550.  
  551. # ----------------------------------------------------------------------
  552. # OPTION -gap
  553. #
  554. # Specifies the amount of pixel space to place between each tab. 
  555. # Value may be any pixel offset value. In addition, a special keyword 
  556. # 'overlap' can be used as the value to achieve a standard overlap of 
  557. # tabs. This value may have any of the forms acceptable to Tk_GetPixels.
  558. # ----------------------------------------------------------------------
  559. itcl::configbody iwidgets::Tabnotebook::gap {
  560.     
  561.     if {$itk_option(-gap) != {}} {
  562.     $itk_component(tabset) configure -gap $itk_option(-gap)
  563.     #_reconfigureTabset
  564.     set _tabsetReconfigure true
  565.     }
  566. }
  567.  
  568. # ----------------------------------------------------------------------
  569. # OPTION -angle
  570. #
  571. # Specifes the angle of slope from the inner edge to the outer edge 
  572. # of the tab. An angle of 0 specifies square tabs. Valid ranges are 
  573. # 0 to 45 degrees inclusive. Default is 15 degrees. If tabPos is 
  574. # e or w, this option is ignored.
  575. # ----------------------------------------------------------------------
  576. itcl::configbody iwidgets::Tabnotebook::angle {
  577.     
  578.     if {$itk_option(-angle) != {}} {
  579.     $itk_component(tabset) configure -angle $itk_option(-angle)
  580.     #_reconfigureTabset
  581.     set _tabsetReconfigure true
  582.     }
  583. }
  584.  
  585. # ----------------------------------------------------------------------
  586. # OPTION -tabpos
  587. #
  588. # Specifies the location of the set of tabs in relation to the 
  589. # Notebook area. Must be n, s, e, or w.   Defaults to s.
  590. # ----------------------------------------------------------------------
  591. itcl::configbody iwidgets::Tabnotebook::tabpos {
  592.     
  593.     if {$itk_option(-tabpos) != {}} {
  594.     set _tabPos $itk_option(-tabpos)
  595.     $itk_component(tabset) configure \
  596.         -tabpos $itk_option(-tabpos)
  597.     pack forget $itk_component(canvas)
  598.     pack forget $itk_component(tabset)
  599.     pack forget $itk_component(notebook)
  600.     _pack $_tabPos
  601.     }
  602. }
  603.  
  604. # -------------------------------------------------------------
  605. # METHOD: configure ?<option>? ?<value> <option> <value>...?
  606. #
  607. # Acts as an addendum to the itk::Widget::configure method.
  608. #
  609. # Checks the _recomputeBorder flag and the _tabsetReconfigure to
  610. # determine what work has been batched to after the configure
  611. # -------------------------------------------------------------
  612. itcl::body iwidgets::Tabnotebook::configure { args } {
  613.     set result [eval itk::Archetype::configure $args]
  614.     
  615.     # check for flags then do update...
  616.     if { $_borderRecompute == "true" } { 
  617.     _recomputeBorder
  618.     set _borderRecompute false
  619.     }
  620.     
  621.     if { $_tabsetReconfigure == "true" } { 
  622.     _reconfigureTabset
  623.     set _tabsetReconfigure false
  624.     }
  625.     
  626.     return $result
  627.     
  628. }
  629.  
  630. # -------------------------------------------------------------
  631. # METHOD: add ?<option> <value>...?
  632. #
  633. # Creates a page and appends it to the list of pages.
  634. # processes pageconfigure for the page added.
  635. #
  636. # Returns the page's childsite frame
  637. # -------------------------------------------------------------
  638. itcl::body iwidgets::Tabnotebook::add { args } {
  639.     
  640.     # The args list should be an even # of params, if not then
  641.     # prob missing value for last item in args list. Signal error.
  642.     set len [llength $args]
  643.     if { [expr {$len % 2}] } {
  644.     error "value for \"[lindex $args [expr {$len - 1}]]\" missing"
  645.     }
  646.     
  647.     # pick out the notebook args
  648.     set nbArgs [eval _getArgs [list $_nbOptList] $args]
  649.     set pageName [eval $itk_component(notebook) add $nbArgs]
  650.     
  651.     # pick out the tabset args
  652.     set tsArgs [eval _getArgs [list $_tsOptList] $args]
  653.     eval $itk_component(tabset)   add $tsArgs
  654.     
  655.     set page [index end]
  656.     bind $pageName <Configure> \
  657.         [itcl::code $this _pageReconfigure $pageName $page %w %h]
  658.     return $pageName
  659. }
  660.  
  661. # -------------------------------------------------------------
  662. # METHOD: childsite ?<index>?
  663. #
  664. # If index is supplied, returns the child site widget 
  665. # corresponding to the page index.  If called with no arguments,
  666. # returns a list of all child sites
  667. # -------------------------------------------------------------
  668. itcl::body iwidgets::Tabnotebook::childsite { args } {
  669.     return [eval $itk_component(notebook) childsite $args]
  670. }
  671.  
  672. # -------------------------------------------------------------
  673. # METHOD: delete <index1> ?<index2>?
  674. #
  675. # Deletes a page or range of pages from the notebook
  676. # -------------------------------------------------------------
  677. itcl::body iwidgets::Tabnotebook::delete { args } {
  678.     eval $itk_component(notebook) delete $args
  679.     eval $itk_component(tabset)   delete $args
  680. }
  681.  
  682.  
  683. # -------------------------------------------------------------
  684. # METHOD: index <index>
  685. #
  686. # Given an index identifier returns the numeric index of the page
  687. # -------------------------------------------------------------
  688. itcl::body iwidgets::Tabnotebook::index { args } {
  689.     return [eval $itk_component(notebook) index $args]
  690. }
  691.  
  692. # -------------------------------------------------------------
  693. # METHOD: insert <index> ?<option> <value>...?
  694. #
  695. # Inserts a page before a index. The before page may
  696. # be specified as a label or a page position.
  697. #
  698. # Note that since we use eval to preserve the $args list,
  699. # we must use list around $index to keep it together as a unit
  700. #
  701. # Returns the name of the page's child site
  702. # -------------------------------------------------------------
  703. itcl::body iwidgets::Tabnotebook::insert { index args } {
  704.     
  705.     # pick out the notebook args
  706.     set nbArgs [eval _getArgs [list $_nbOptList] $args]
  707.     set pageName [eval $itk_component(notebook) insert [list $index] $nbArgs]
  708.     
  709.     # pick out the tabset args
  710.     set tsArgs [eval _getArgs [list $_tsOptList] $args]
  711.     eval $itk_component(tabset)   insert [list $index] $tsArgs
  712.     
  713.     return $pageName
  714.     
  715. }
  716.  
  717. # -------------------------------------------------------------
  718. # METHOD: prev
  719. #
  720. # Selects the previous page. Wraps at first back to last page.
  721. # -------------------------------------------------------------
  722. itcl::body iwidgets::Tabnotebook::prev { } {
  723.     eval $itk_component(notebook) prev
  724.     eval $itk_component(tabset)   prev
  725. }
  726.  
  727. # -------------------------------------------------------------
  728. # METHOD: next
  729. #
  730. # Selects the next page. Wraps at last back to first page.
  731. # -------------------------------------------------------------
  732. itcl::body iwidgets::Tabnotebook::next { } {
  733.     eval $itk_component(notebook) next
  734.     eval $itk_component(tabset)   next
  735. }
  736.  
  737. # -------------------------------------------------------------
  738. # METHOD: pageconfigure <index> ?<option> <value>...?
  739. #
  740. # Performs configure on a given page denoted by index.
  741. # Index may be a page number or a pattern matching the label
  742. # associated with a page.
  743. # -------------------------------------------------------------
  744. itcl::body iwidgets::Tabnotebook::pageconfigure { index args } {
  745.     
  746.     set nbArgs [eval _getArgs [list $_nbOptList] $args]
  747.     set tsArgs [eval _getArgs [list $_tsOptList] $args]
  748.     
  749.     set len [llength $args]
  750.     switch $len {
  751.     0 {
  752.         # Here is the case where they just want to query options
  753.         set nbConfig \
  754.             [eval $itk_component(notebook) pageconfigure $index $nbArgs]
  755.         set tsConfig \
  756.             [eval $itk_component(tabset)   tabconfigure $index $tsArgs]
  757.         #
  758.         # BUG: this currently just concatenates a page and a tab's
  759.         # config lists together... We should bias to the Page
  760.         # since this is what we are using as primary when both??
  761.         #
  762.         # a pageconfigure index -background will return something like:
  763.         # -background background Background #9D008FF583C1 gray70 \
  764.             # -background background background white gray 70
  765.         #
  766.         return [concat $nbConfig $tsConfig]
  767.     }
  768.     1 {
  769.         # Here is the case where they are asking for only one
  770.         # one options value... need to figure out which one
  771.         # (page or tab) can service this. Then only return
  772.         # that one's result.
  773.         
  774.         if { [llength $nbArgs] != 0 } {
  775.         return [eval $itk_component(notebook) \
  776.             pageconfigure $index $nbArgs]
  777.         } elseif { [llength $tsArgs] != 0 } {
  778.         return [eval $itk_component(tabset) \
  779.             tabconfigure $index $tsArgs]
  780.         } else {
  781.         error "unknown option \"$args\""
  782.         }
  783.         
  784.     }
  785.     default {
  786.         
  787.         # pick out the notebook args
  788.         set nbConfig \
  789.             [eval $itk_component(notebook) \
  790.             pageconfigure [list $index] $nbArgs]
  791.         
  792.         # pick out the tabset args
  793.         set tsConfig \
  794.             [eval $itk_component(tabset)   \
  795.             tabconfigure [list $index] $tsArgs]
  796.         
  797.         return ""
  798.         #return [concat $nbConfig $tsConfig]
  799.         
  800.     }
  801.     }
  802. }
  803.  
  804. # -------------------------------------------------------------
  805. # METHOD: select index
  806. #
  807. # Select a page by index
  808. # -------------------------------------------------------------
  809. itcl::body iwidgets::Tabnotebook::select { index } {
  810.     $itk_component(notebook) select $index
  811.     $itk_component(tabset)   select $index
  812. }
  813.  
  814. # -------------------------------------------------------------
  815. # METHOD: view
  816. #
  817. # Return the current page
  818. #
  819. #         view index
  820. #
  821. # Selects the page denoted by index to be current page
  822. #
  823. #      view 'moveto' fraction
  824. #
  825. # Selects the page by using fraction amount
  826. #
  827. #      view 'scroll' num what
  828. #
  829. # Selects the page by using num as indicator of next or
  830. # previous
  831. #
  832. # -------------------------------------------------------------
  833. itcl::body iwidgets::Tabnotebook::view { args } {
  834.     eval $itk_component(notebook) view $args
  835.     $itk_component(tabset) select [index select]
  836. }
  837.  
  838. # -------------------------------------------------------------
  839. # PRIVATE METHOD: _getArgs
  840. #
  841. # Given an optList returned from a configure on an object and
  842. # given a candidate argument list, peruse throught the optList
  843. # and build a new argument list with only those options found
  844. # in optList.
  845. #
  846. # This is used by the add, insert, and pageconfigure methods.
  847. # It is useful for a container kind of class like Tabnotebook
  848. # to be smart about args it gets for its concept of a "page"
  849. # which is actually a Notebook Page and a Tabset Tab.
  850. #
  851. # -------------------------------------------------------------
  852. itcl::body iwidgets::Tabnotebook::_getArgs { optList args } {
  853.     
  854.     set len [llength $args]
  855.     
  856.     set retArgs {}
  857.     
  858.     for {set i 0} {$i < $len} {incr i} {
  859.     # get the option for this pair
  860.     set opt [lindex $args $i]
  861.     
  862.     # move ahead to the value
  863.     incr i
  864.     
  865.     # option exists!
  866.     if { [lsearch -exact $optList $opt] != -1} {
  867.         lappend retArgs $opt
  868.         if {$i < [llength $args]} {
  869.         lappend retArgs [lindex $args $i]
  870.         }
  871.         # option does not exist
  872.     }
  873.     }
  874.     
  875.     return $retArgs
  876. }
  877.  
  878. # -------------------------------------------------------------
  879. # PROTECTED METHOD: _reconfigureTabset
  880. #
  881. # bound to the tabset reconfigure... We call our canvas 
  882. # reconfigure as if the canvas resized, it then configures
  883. # the tabset correctly.
  884. # -------------------------------------------------------------
  885. itcl::body iwidgets::Tabnotebook::_reconfigureTabset { } {
  886.     _canvasReconfigure $_canvasWidth $_canvasHeight
  887.     
  888. }
  889.  
  890. # -------------------------------------------------------------
  891. # PROTECTED METHOD: _canvasReconfigure
  892. #
  893. # bound to window Reconfigure event of the canvas
  894. # keeps the tabset area stretched in its major dimension.
  895. # -------------------------------------------------------------
  896. itcl::body iwidgets::Tabnotebook::_canvasReconfigure { wid hgt } {
  897.     
  898.     if { $_tabPos == "n" || $_tabPos == "s" } {
  899.     $itk_component(tabset) configure -width $wid
  900.     } else {
  901.     $itk_component(tabset) configure -height $hgt
  902.     }
  903.     
  904.     set _canvasWidth $wid
  905.     set _canvasHeight $hgt
  906.     
  907.     _redrawBorder $wid $hgt 
  908.     
  909. }
  910.  
  911. # -------------------------------------------------------------
  912. # PRIVATE METHOD: _redrawBorder
  913. #
  914. # called by methods when the packing changes, borderwidths, etc.
  915. # and height
  916. # -------------------------------------------------------------
  917. itcl::body iwidgets::Tabnotebook::_redrawBorder { wid hgt } {
  918.     
  919.     # Get the top of the Notebook area...
  920.     
  921.     set nbTop [winfo y $itk_component(notebook)]
  922.     set canTop [expr {$nbTop - $itk_option(-borderwidth)}]
  923.     
  924.     $itk_component(canvas) delete BORDER
  925.     if { $itk_option(-borderwidth) > 0 } {
  926.     
  927.     # For south, east, and west -- draw the top/north edge
  928.     if { $_tabPos != "n" } {
  929.         $itk_component(canvas) create line \
  930.             [expr {floor(0 + ($itk_option(-borderwidth)/2.0))}] \
  931.             [expr {floor(0 + ($itk_option(-borderwidth)/2.0))}] \
  932.             $wid \
  933.             [expr {floor(0 + ($itk_option(-borderwidth)/2.0))}] \
  934.             -width $itk_option(-borderwidth) \
  935.             -fill [iwidgets::colors::topShadow $itk_option(-background)] \
  936.             -tags BORDER
  937.     }
  938.     
  939.     # For north, east, and west -- draw the bottom/south edge
  940.     if { $_tabPos != "s" } {
  941.         $itk_component(canvas) create line \
  942.             [expr {floor(0 + ($itk_option(-borderwidth)/2.0))}] \
  943.             [expr {floor($hgt - ($itk_option(-borderwidth)/2.0))}] \
  944.             [expr {floor($wid - ($itk_option(-borderwidth)/2.0))}] \
  945.             [expr {floor($hgt - ($itk_option(-borderwidth)/2.0))}] \
  946.             -width $itk_option(-borderwidth) \
  947.             -fill [iwidgets::colors::bottomShadow $itk_option(-background)] \
  948.             -tags BORDER
  949.     } 
  950.     
  951.     # For north, south, and east -- draw the left/west edge
  952.     if { $_tabPos != "w" } {
  953.         $itk_component(canvas) create line \
  954.             [expr {floor(0 + ($itk_option(-borderwidth)/2.0))}] \
  955.             0 \
  956.             [expr {floor(0 + ($itk_option(-borderwidth)/2.0))}] \
  957.             $hgt \
  958.             -width $itk_option(-borderwidth) \
  959.             -fill [iwidgets::colors::topShadow $itk_option(-background)] \
  960.             -tags BORDER
  961.     }
  962.     
  963.     # For north, south, and west -- draw the right/east edge
  964.     if { $_tabPos != "e" } {
  965.         $itk_component(canvas) create line \
  966.             [expr {floor($wid - ($itk_option(-borderwidth)/2.0))}] \
  967.             [expr {floor(0 + ($itk_option(-borderwidth)/2.0))}] \
  968.             [expr {floor($wid - ($itk_option(-borderwidth)/2.0))}] \
  969.             $hgt \
  970.             -width $itk_option(-borderwidth) \
  971.             -fill [iwidgets::colors::bottomShadow $itk_option(-background)] \
  972.             -tags BORDER
  973.     }
  974.     }
  975.     
  976. }
  977.  
  978. # -------------------------------------------------------------
  979. # PRIVATE METHOD: _recomputeBorder
  980. #
  981. # Based on current width and height of our canvas, repacks
  982. # the notebook with padding for borderwidth, and calls
  983. # redraw border method 
  984. # -------------------------------------------------------------
  985. itcl::body iwidgets::Tabnotebook::_recomputeBorder { } {
  986.     
  987.     set wid [winfo width $itk_component(canvas)]
  988.     set hgt [winfo height $itk_component(canvas)]
  989.     
  990.     _pack $_tabPos
  991.     _redrawBorder $wid $hgt
  992. }
  993.  
  994. # -------------------------------------------------------------
  995. # PROTECTED METHOD: _pageReconfigure
  996. #
  997. # This method will eventually reconfigure the tab notebook's 
  998. # notebook area to contain the resized child site
  999. # -------------------------------------------------------------
  1000. itcl::body iwidgets::Tabnotebook::_pageReconfigure { pageName page wid hgt } {
  1001. }
  1002.  
  1003. # -------------------------------------------------------------
  1004. # PRIVATE METHOD: _pack
  1005. #
  1006. # This method packs the notebook and tabset correctly according
  1007. # to the current $tabPos
  1008. # -------------------------------------------------------------
  1009. itcl::body iwidgets::Tabnotebook::_pack { tabPos } {
  1010.     
  1011.     pack $itk_component(canvas) -fill both -expand yes 
  1012.     pack propagate $itk_component(canvas) no
  1013.     
  1014.     switch $tabPos {
  1015.     n {
  1016.         # north
  1017.         pack $itk_component(tabset) \
  1018.             -anchor nw \
  1019.             -fill x \
  1020.             -expand no
  1021.         pack $itk_component(notebook) \
  1022.             -fill both \
  1023.             -expand yes \
  1024.             -padx $itk_option(-borderwidth) \
  1025.             -pady $itk_option(-borderwidth) \
  1026.             -side bottom 
  1027.     }
  1028.     s {
  1029.         # south
  1030.         pack $itk_component(notebook) \
  1031.             -anchor nw \
  1032.             -fill both \
  1033.             -expand yes \
  1034.             -padx $itk_option(-borderwidth) \
  1035.             -pady $itk_option(-borderwidth)
  1036.         
  1037.         pack $itk_component(tabset) \
  1038.             -side left \
  1039.             -fill x \
  1040.             -expand yes
  1041.     }
  1042.     w {
  1043.         # west
  1044.         pack $itk_component(tabset) \
  1045.             -anchor nw \
  1046.             -side left \
  1047.             -fill y \
  1048.             -expand no
  1049.         pack $itk_component(notebook) \
  1050.             -anchor nw \
  1051.             -side left \
  1052.             -fill both \
  1053.             -expand yes \
  1054.             -padx $itk_option(-borderwidth) \
  1055.             -pady $itk_option(-borderwidth)
  1056.         
  1057.     }
  1058.     e {
  1059.         # east
  1060.         pack $itk_component(notebook) \
  1061.             -side left \
  1062.             -anchor nw \
  1063.             -fill both \
  1064.             -expand yes \
  1065.             -padx $itk_option(-borderwidth) \
  1066.             -pady $itk_option(-borderwidth)
  1067.         
  1068.         pack $itk_component(tabset) \
  1069.             -fill y \
  1070.             -expand yes
  1071.     }
  1072.     }
  1073.     
  1074.     set wid [winfo width $itk_component(canvas)]
  1075.     set hgt [winfo height $itk_component(canvas)]
  1076.     
  1077.     _redrawBorder $wid $hgt
  1078. }
  1079.  
  1080.  
  1081.  
  1082. # -------------------------------------------------------------
  1083. # PRIVATE METHOD: _resize
  1084. #
  1085. # This method added by csmith, 5/1/01, to fix a bug with the
  1086. # geometry of the tabnotebook.  The hull component's geometry
  1087. # was not being updated properly on <Configure> events.
  1088. # -------------------------------------------------------------
  1089. itcl::body iwidgets::Tabnotebook::_resize {newWidth_ newHeight_} {
  1090.   _canvasReconfigure $newWidth_ $newHeight_
  1091.  
  1092.   # csmith: 9/14/01 - Commenting out the following code due to
  1093.   # SF ticket 461471, which is a dup of the original 452803. Since I
  1094.   # can't remember the exact problem surrounding the need to add
  1095.   # the _resize method, I'm going to do an undo here, leaving the
  1096.   # code for future reference if needed.  Should the original problem
  1097.   # arise again I will reinvestigate the need for _resize.
  1098.   #
  1099.   #  after idle \
  1100.   #    "$this component hull configure -width $newWidth_ -height $newHeight_"
  1101. }
  1102.