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