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