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 / notebook.itk < prev    next >
Text File  |  1999-02-24  |  30KB  |  918 lines

  1. #
  2. # Notebook Widget
  3. # ----------------------------------------------------------------------
  4. # The Notebook command creates a new window (given by the pathName 
  5. # argument) and makes it into a Notebook widget. Additional options, 
  6. # described above may be specified on the command line or in the 
  7. # option database to configure aspects of the Notebook such as its 
  8. # colors, font, and text. The Notebook command returns its pathName 
  9. # argument. At the time this command is invoked, there must not exist 
  10. # a window named pathName, but path Name's parent must exist.
  11. # A Notebook is a widget that contains a set of pages. It displays one 
  12. # page from the set as the selected page. When a page is selected, the 
  13. # page's contents are displayed in the page area. When first created a 
  14. # Notebook has no pages. Pages may be added or deleted using widget commands 
  15. # described below.
  16. # A special option may be provided to the Notebook. The -auto option 
  17. # specifies whether the Nptebook will automatically handle the unpacking 
  18. # and packing of pages when pages are selected. A value of true signifies 
  19. # that the notebook will automatically manage it. This is the default 
  20. # value. A value of false signifies the notebook will not perform automatic 
  21. # switching of pages.
  22. #
  23. # WISH LIST:
  24. #   This section lists possible future enhancements.
  25. #
  26. # ----------------------------------------------------------------------
  27. #  AUTHOR: Bill W. Scott                 EMAIL: bscott@spd.dsccc.com
  28. #
  29. #  @(#) $Id: notebook.itk,v 1.1 1998/07/27 18:49:39 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 *Notebook.background          #d9d9d9      widgetDefault
  57. option add *Notebook.auto                true         widgetDefault
  58.  
  59. #
  60. # Usual options.
  61. #
  62. itk::usual Notebook {
  63.     keep -background -cursor
  64. }
  65.  
  66. # ------------------------------------------------------------------
  67. #                            NOTEBOOK
  68. # ------------------------------------------------------------------
  69. class iwidgets::Notebook {
  70.     inherit itk::Widget
  71.     
  72.     constructor {args} {}
  73.     
  74.     itk_option define -background background Background #d9d9d9 
  75.     itk_option define -auto auto Auto true 
  76.     itk_option define -scrollcommand scrollCommand ScrollCommand {}
  77.     
  78.     public method add { args }
  79.     public method childsite { args }
  80.     public method delete { args } 
  81.     public method index { index } 
  82.     public method insert { args } 
  83.     public method prev { } 
  84.     public method next { } 
  85.     public method pageconfigure { args } 
  86.     public method select { index } 
  87.     public method view { args } 
  88.     
  89.     private method _childSites { } 
  90.     private method _scrollCommand { } 
  91.     private method _index { pathList index select} 
  92.     private method _createPage { args } 
  93.     private method _deletePages { fromPage toPage } 
  94.     private method _configurePages { args } 
  95.     private method _tabCommand { } 
  96.     
  97.     private variable _currPage -1  ;# numerical index of current page selected
  98.     private variable _pages {}     ;# list of Page components
  99.     private variable _uniqueID 0   ;# one-up number for unique page numbering
  100.     
  101. }
  102.  
  103. #
  104. # Provide a lowercase access method for the Notebook class
  105. #
  106. proc ::iwidgets::notebook {pathName args} {
  107.     uplevel ::iwidgets::Notebook $pathName $args
  108. }
  109.  
  110. # ------------------------------------------------------------------
  111. #                      CONSTRUCTOR
  112. # ------------------------------------------------------------------
  113. body iwidgets::Notebook::constructor {args}  {
  114.     #
  115.     # Create the outermost frame to maintain geometry.
  116.     #
  117.     itk_component add cs {
  118.     frame $itk_interior.cs 
  119.     } {
  120.     keep -cursor -background -width -height
  121.     }
  122.     pack $itk_component(cs) -fill both -expand yes
  123.     pack propagate $itk_component(cs) no
  124.     
  125.     eval itk_initialize $args
  126.     
  127.     # force bg of all pages to reflect Notebook's background.
  128.     _configurePages -background $itk_option(-background)
  129. }
  130.  
  131. # ------------------------------------------------------------------
  132. #                      OPTIONS
  133. # ------------------------------------------------------------------
  134. # ------------------------------------------------------------------
  135. # OPTION -background
  136. #
  137. # Sets the bg color of all the pages in the Notebook.
  138. # ------------------------------------------------------------------
  139. configbody iwidgets::Notebook::background {
  140.     if {$itk_option(-background) != {}} {
  141.     _configurePages -background $itk_option(-background)
  142.     }
  143. }
  144.  
  145. # ------------------------------------------------------------------
  146. # OPTION -auto
  147. #
  148. # Determines whether pages are automatically unpacked and
  149. # packed when pages get selected.
  150. # ------------------------------------------------------------------
  151. configbody iwidgets::Notebook::auto {
  152.     if {$itk_option(-auto) != {}} {
  153.     }
  154. }
  155.  
  156. # ------------------------------------------------------------------
  157. # OPTION -scrollcommand
  158. #
  159. # Command string to be invoked when the notebook 
  160. # has any changes to its current page, or number of pages.
  161. # typically for scrollbars.
  162. # ------------------------------------------------------------------
  163. configbody iwidgets::Notebook::scrollcommand {
  164.     if {$itk_option(-scrollcommand) != {}} {
  165.     _scrollCommand
  166.     }
  167. }
  168.  
  169. # ------------------------------------------------------------------
  170. # METHOD: add add ?<option> <value>...?
  171. # Creates a page and appends it to the list of pages.
  172. # processes pageconfigure for the page added.
  173. # ------------------------------------------------------------------
  174. body iwidgets::Notebook::add { args } {
  175.     # The args list should be an even # of params, if not then
  176.     # prob missing value for last item in args list. Signal error.
  177.     set len [llength $args]
  178.     if { [expr $len % 2] } {
  179.     error "value for \"[lindex $args [expr $len - 1]]\" missing"
  180.     }
  181.     
  182.     # add a Page component
  183.     set pathName [eval _createPage $args]
  184.     lappend _pages $pathName
  185.     
  186.     # update scroller
  187.     _scrollCommand 
  188.     
  189.     # return childsite for the Page component
  190.     return [eval $pathName childsite]
  191. }
  192.  
  193. # ------------------------------------------------------------------
  194. # METHOD: childsite ?<index>?
  195. #
  196. # If index is supplied, returns the child site widget corresponding 
  197. # to the page index.  If called with no arguments, returns a list 
  198. # of all child sites
  199. # ------------------------------------------------------------------
  200. body iwidgets::Notebook::childsite { args } {
  201.     set len [llength $args]
  202.     
  203.     switch $len {
  204.     0 {
  205.         # ... called with no arguments, return a list
  206.         if { [llength $args] == 0 } {
  207.         return [_childSites]
  208.         }
  209.     }
  210.     1 {
  211.         set index [lindex $args 0]
  212.         # ... otherwise, return child site for the index given
  213.         # empty notebook
  214.         if { $_pages == {} } {
  215.         error "can't get childsite,\
  216.             no pages in the notebook \"$itk_component(hull)\""
  217.         }
  218.         
  219.         set index [_index $_pages $index $_currPage]
  220.         
  221.         # index out of range
  222.         if { $index < 0 || $index >= [llength $_pages] } {
  223.         error "bad Notebook page index in childsite method:\
  224.             should be between 0 and [expr [llength $_pages] - 1]"
  225.         }
  226.         
  227.         set pathName [lindex $_pages $index]
  228.         
  229.         set cs [eval $pathName childsite]
  230.         return $cs
  231.     }
  232.     default {
  233.         # ... too many parameters passed
  234.         error "wrong # args: should be\
  235.             \"$itk_component(hull) childsite ?index?\""
  236.     }
  237.     }
  238. }
  239.  
  240. # ------------------------------------------------------------------
  241. # METHOD: delete <index1> ?<index2>?
  242. # Deletes a page or range of pages from the notebook
  243. # ------------------------------------------------------------------
  244. body iwidgets::Notebook::delete { args } {
  245.     # empty notebook
  246.     if { $_pages == {} } {
  247.     error "can't delete page, no pages in the notebook\
  248.         \"$itk_component(hull)\""
  249.     }
  250.     
  251.     set len [llength $args]
  252.     switch -- $len {
  253.     1 {
  254.         set fromPage [_index $_pages [lindex $args 0] $_currPage]
  255.         
  256.         if { $fromPage < 0 || $fromPage >= [llength $_pages] } {
  257.         error "bad Notebook page index in delete method:\
  258.             should be between 0 and [expr [llength $_pages] - 1]"
  259.         }
  260.         
  261.         set toPage $fromPage
  262.         _deletePages $fromPage $toPage
  263.     }
  264.     
  265.     2 {
  266.         set fromPage [_index $_pages [lindex $args 0] $_currPage]
  267.         
  268.         if { $fromPage < 0 || $fromPage >= [llength $_pages] } {
  269.         error "bad Notebook page index1 in delete method:\
  270.             should be between 0 and [expr [llength $_pages] - 1]"
  271.         }
  272.         
  273.         set toPage [_index $_pages [lindex $args 1] $_currPage]
  274.         
  275.         if { $toPage < 0 || $toPage >= [llength $_pages] } {
  276.         error "bad Notebook page index2 in delete method:\
  277.             should be between 0 and [expr [llength $_pages] - 1]"
  278.         error "bad Notebook page index2"
  279.         }
  280.         
  281.         if { $fromPage > $toPage } {
  282.         error "bad Notebook page index1 in delete method:\
  283.             index1 is greater than index2"
  284.         }
  285.         
  286.         _deletePages $fromPage $toPage
  287.         
  288.     }
  289.     
  290.     default {
  291.         # ... too few/many parameters passed
  292.         error "wrong # args: should be\
  293.             \"$itk_component(hull) delete index1 ?index2?\""
  294.     }
  295.     }
  296. }
  297.  
  298. # ------------------------------------------------------------------
  299. # METHOD: index <index>
  300. #
  301. # Given an index identifier returns the numeric index of the page
  302. # ------------------------------------------------------------------
  303. body iwidgets::Notebook::index {index} {
  304.     set number [_index $_pages $index $_currPage]
  305.     if { $number < 0 || $number >= [llength $_pages] } {
  306.     error "bad Notebook page index in index method:\
  307.         should be between 0 and [expr [llength $_pages] - 1]"
  308.     }
  309.     return $number
  310. }
  311.  
  312. # ------------------------------------------------------------------
  313. # METHOD: insert <index> ?<option> <value>...?
  314. #
  315. # Inserts a page before a index. The before page may
  316. # be specified as a label or a page position. 
  317. # ------------------------------------------------------------------
  318. body iwidgets::Notebook::insert { args } {
  319.     # ... Error: no args passed
  320.     set len [llength $args]
  321.     if { $len == 0 } {
  322.     error "wrong # args: should be\
  323.         \"$itk_component(hull) insert index ?option value?\""
  324.     }
  325.     
  326.     # ... set up index and args 
  327.     set index [lindex $args 0]
  328.     set args [lrange $args 1 $len]
  329.     
  330.     # ... Error: unmatched option value pair (len is odd)
  331.     # The args list should be an even # of params, if not then
  332.     # prob missing value for last item in args list. Signal error.
  333.     set len [llength $args]
  334.     if { [expr $len % 2] } {
  335.     error "value for \"[lindex $args [expr $len - 1]]\" missing"
  336.     }
  337.     
  338.     # ... Error: catch notebook empty
  339.     if { $_pages == {} } {
  340.     error "can't insert page, no pages in the notebook\
  341.         \"$itk_component(hull)\""
  342.     }
  343.     
  344.     # ok, get the page
  345.     set page [_index $_pages $index $_currPage]
  346.     
  347.     # ... Error: catch bad value for before page.
  348.     if { $page < 0 || $page >= [llength $_pages] } {
  349.     error "bad Notebook page index in insert method:\
  350.         should be between 0 and [expr [llength $_pages] - 1]"
  351.     }
  352.     
  353.     # ... Start the business of inserting
  354.     # create the new page and get its path name...
  355.     set pathName [eval _createPage $args]
  356.     
  357.     # grab the name of the page currently selected. (to keep in sync)
  358.     set currPathName [lindex $_pages $_currPage]
  359.     
  360.     # insert pathName before $page
  361.     set _pages [linsert $_pages $page $pathName]
  362.     
  363.     # keep the _currPage in sync with the insert.
  364.     set _currPage [lsearch -exact $_pages $currPathName]
  365.     
  366.     # give scrollcommand chance to update
  367.     _scrollCommand 
  368.     
  369.     # give them child site back...
  370.     return [eval $pathName childsite]
  371. }
  372.  
  373. # ------------------------------------------------------------------
  374. # METHOD: prev
  375. #
  376. # Selects the previous page. Wraps at first back to last page.
  377. # ------------------------------------------------------------------
  378. body iwidgets::Notebook::prev { } {
  379.     # catch empty notebook
  380.     if { $_pages == {} } {
  381.     error "can't move to previous page,\
  382.         no pages in the notebook \"$itk_component(hull)\""
  383.     }
  384.     
  385.     # bump to the previous page and wrap if necessary
  386.     set prev [expr $_currPage - 1]
  387.     if { $prev < 0 } {
  388.     set prev [expr [llength $_pages] - 1]
  389.     }
  390.     
  391.     select $prev
  392.     
  393.     return $prev
  394. }
  395.  
  396. # ------------------------------------------------------------------
  397. # METHOD: next
  398. #
  399. # Selects the next page. Wraps at last back to first page.
  400. # ------------------------------------------------------------------
  401. body iwidgets::Notebook::next { } {
  402.     # catch empty notebook
  403.     if { $_pages == {} } {
  404.     error "can't move to next page,\
  405.         no pages in the notebook \"$itk_component(hull)\""
  406.     }
  407.     
  408.     # bump to the next page and wrap if necessary
  409.     set next [expr $_currPage + 1]
  410.     if { $next >= [llength $_pages] } {
  411.     set next 0
  412.     }
  413.     
  414.     select $next
  415.     
  416.     return $next
  417. }
  418.  
  419. # ------------------------------------------------------------------
  420. # METHOD: pageconfigure <index> ?<option> <value>...?
  421. #
  422. # Performs configure on a given page denoted by index.  Index may 
  423. # be a page number or a pattern matching the label associated with 
  424. # a page.
  425. # ------------------------------------------------------------------
  426. body iwidgets::Notebook::pageconfigure { args } {
  427.     # ... Error: no args passed
  428.     set len [llength $args]
  429.     if { $len == 0 } {
  430.     error "wrong # args: should be\
  431.         \"$itk_component(hull) pageconfigure index ?option value?\""
  432.     }
  433.     
  434.     # ... set up index and args 
  435.     set index [lindex $args 0]
  436.     set args [lrange $args 1 $len]
  437.     
  438.     set page [_index $_pages $index $_currPage]
  439.     
  440.     # ... Error: page out of range
  441.     if { $page < 0 || $page >= [llength $_pages] } {
  442.     error "bad Notebook page index in pageconfigure method:\
  443.         should be between 0 and [expr [llength $_pages] - 1]"
  444.     }
  445.     
  446.     # Configure the page component
  447.     set pathName [lindex $_pages $page]
  448.     return [eval $pathName configure $args]
  449. }
  450.  
  451. # ------------------------------------------------------------------
  452. # METHOD: select <index>
  453. #
  454. # Select a page by index.  Hide the last _currPage if it existed.
  455. # Then show the new one if it exists.  Returns the currently 
  456. # selected page or -1 if tried to do a select select when there is 
  457. # no selection.
  458. # ------------------------------------------------------------------
  459. body iwidgets::Notebook::select { index } {
  460.     global page$itk_component(hull)
  461.     
  462.     # ... Error: empty notebook
  463.     if { $_pages == {} } {
  464.     error "can't select page $index,\
  465.         no pages in the notebook \"$itk_component(hull)\""
  466.     }
  467.     
  468.     # if there is not current selection just ignore trying this selection
  469.     if { $index == "select" && $_currPage == -1 } {
  470.     return -1
  471.     }
  472.     
  473.     set reqPage [_index $_pages $index $_currPage]
  474.     
  475.     if { $reqPage < 0 || $reqPage >= [llength $_pages] } {
  476.     error "bad Notebook page index in select method:\
  477.         should be between 0 and [expr [llength $_pages] - 1]"
  478.     }
  479.     
  480.     # if we already have this page selected, then ignore selection.
  481.     if { $reqPage == $_currPage } {
  482.     return $_currPage
  483.     }
  484.     
  485.     # if we are handling packing and unpacking the unpack if we can
  486.     if { $itk_option(-auto) } {
  487.     # if there is a current page packed, then unpack it
  488.     if { $_currPage != -1 } {
  489.         set currPathName [lindex $_pages $_currPage]
  490.         pack forget $currPathName
  491.     }
  492.     }
  493.     
  494.     # set this now so that the -command cmd can do an 'index select'
  495.     # to operate on this page.
  496.     set _currPage $reqPage
  497.     
  498.     # invoke the command for this page
  499.     set cmd [lindex [pageconfigure $index -command] 4]
  500.     eval $cmd
  501.     
  502.     # give scrollcommand chance to update
  503.     _scrollCommand 
  504.     
  505.     # if we are handling packing and unpacking the pack if we can
  506.     if { $itk_option(-auto) } {
  507.     set reqPathName [lindex $_pages $reqPage]
  508.     pack $reqPathName -anchor nw -fill both -expand yes
  509.     }
  510.     
  511.     return $_currPage
  512. }
  513.  
  514.  
  515. # ------------------------------------------------------------------
  516. # METHOD: view
  517. #
  518. # Return the current page
  519. #
  520. #      view <index>
  521. #
  522. # Selects the page denoted by index to be current page
  523. #
  524. #         view 'moveto' <fraction>
  525. #
  526. # Selects the page by using fraction amount
  527. #
  528. #      view 'scroll' <num> <what>
  529. #
  530. # Selects the page by using num as indicator of next or    previous
  531. # ------------------------------------------------------------------
  532. body iwidgets::Notebook::view { args } {
  533.     set len [llength $args]
  534.     switch -- $len {
  535.     0 {
  536.         # Return current page
  537.         return $_currPage
  538.     }
  539.     1 {
  540.         # Select by index
  541.         select [lindex $args 0]
  542.     }
  543.     2 {
  544.         # Select using moveto
  545.         set arg [lindex $args 0]
  546.         if { $arg == "moveto" } {
  547.         set fraction [lindex $args 1]
  548.         if { [catch { set page \
  549.             [expr round($fraction/(1.0/[llength $_pages]))]}]} {
  550.             error "expected floating-point number \
  551.                 but got \"$fraction\""
  552.         }
  553.         if { $page == [llength $_pages] } {
  554.             incr page -1
  555.         }
  556.         
  557.         if { $page >= 0 && $page < [llength $_pages] } {
  558.             select $page
  559.         }
  560.         } else {
  561.         error "expected \"moveto\" but got $arg"
  562.         }
  563.     }
  564.     3 {
  565.         # Select using scroll keyword
  566.         set arg [lindex $args 0]
  567.         if { $arg == "scroll" } {
  568.         set amount [lindex $args 1]
  569.         # check for integer value
  570.         if { ! [regexp {^[-]*[0-9]*$} $amount] } {
  571.             error "expected integer but got \"$amount\""
  572.         }
  573.         set page [expr $_currPage + $amount]
  574.         if { $page >= 0 && $page < [llength $_pages] } {
  575.             select $page
  576.         }
  577.         
  578.         } else {
  579.         error "expected \"scroll\" but got $arg"
  580.         }
  581.     }
  582.     default {
  583.         set arg [lindex $args 0]
  584.         if { $arg == "moveto" } {
  585.         error "wrong # args: should be\
  586.             \"$itk_component(hull) view moveto fraction\""
  587.         } elseif { $arg == "scroll" } {
  588.         error "wrong # args: should be\
  589.             \"$itk_component(hull) view scroll units|pages\""
  590.         } else {
  591.         error "wrong # args: should be\
  592.             \"$itk_component(hull) view index\""
  593.         }
  594.     }
  595.     }
  596. }
  597.  
  598. # ------------------------------------------------------------------
  599. # PRIVATE METHOD: _childSites
  600. #
  601. # Returns a list of child sites for all pages in the notebook.
  602. # ------------------------------------------------------------------
  603. body iwidgets::Notebook::_childSites { } {
  604.     # empty notebook
  605.     if { $_pages == {} } {
  606.     error "can't get childsite list,\
  607.         no pages in the notebook \"$itk_component(hull)\""
  608.     }
  609.     
  610.     set csList {}
  611.     
  612.     foreach pathName $_pages { 
  613.     lappend csList [eval $pathName childsite]
  614.     }
  615.     
  616.     return $csList
  617. }
  618.  
  619. # ------------------------------------------------------------------
  620. # PRIVATE METHOD: _scrollCommand
  621. #
  622. # If there is a -scrollcommand set up, then call the tcl command
  623. # and suffix onto it the standard 4 numbers scrollbars get.
  624. #
  625. # Invoke the scrollcommand, this is like the y/xscrollcommand
  626. # it is designed to talk to scrollbars and the the
  627. # tabset also knows how to obey scrollbar protocol.
  628. # ------------------------------------------------------------------
  629. body iwidgets::Notebook::_scrollCommand { } {
  630.     if { $itk_option(-scrollcommand) != {} && $_currPage != -1 }  {
  631.     set relTop [expr ($_currPage*1.0) / [llength $_pages]]
  632.     set relBottom [expr (($_currPage+1)*1.0) / [llength $_pages]]
  633.     set scrollCommand "$itk_option(-scrollcommand) $relTop $relBottom"
  634.     
  635.     uplevel #0 $scrollCommand
  636.     }
  637. }
  638.  
  639. # ------------------------------------------------------------------
  640. # PRIVATE METHOD: _index
  641. #
  642. # pathList : list of path names to search thru if index is a label
  643. # index    : either number, 'select', 'end', or pattern
  644. # select   : current selection
  645. #
  646. # _index takes takes the value $index converts it to
  647. # a numeric identifier. If the value is not already
  648. # an integer it looks it up in the $pathList array.
  649. # If it fails it returns -1
  650. # ------------------------------------------------------------------
  651. body iwidgets::Notebook::_index { pathList index select} {
  652.     switch -- $index {
  653.     select {
  654.         set number $select
  655.     }
  656.     end {
  657.         set number [expr [llength $pathList] -1]
  658.     }
  659.     default {
  660.         # is it a number already?
  661.         if { [regexp {^[0-9]+$} $index] } {
  662.         set number $index
  663.         if { $number < 0 || $number >= [llength $pathList] } {
  664.             set number -1
  665.         }
  666.         
  667.         # otherwise it is a label
  668.         } else {
  669.         # look thru the pathList of pathNames and 
  670.         # get each label and compare with index.
  671.         # if we get a match then set number to postion in $pathList
  672.         # and break out.
  673.         # otherwise number is still -1
  674.         set i 0
  675.         set number -1
  676.         foreach pathName $pathList {
  677.             set label [lindex [$pathName configure -label] 4]
  678.             if { [string match $index $label] } {
  679.             set number $i
  680.             break
  681.             }
  682.             incr i
  683.         }
  684.         }
  685.     }
  686.     }
  687.     
  688.     return $number
  689. }
  690.  
  691. # ------------------------------------------------------------------
  692. # PRIVATE METHOD: _createPage
  693. #
  694. # Creates a page, using unique page naming, propagates background
  695. # and keeps unique id up to date.
  696. # ------------------------------------------------------------------
  697. body iwidgets::Notebook::_createPage { args } {
  698.     #
  699.     # create an internal name for the page: .n.cs.page0, .n.cs.page1, etc.
  700.     #
  701.     set pathName $itk_component(cs).page$_uniqueID
  702.     
  703.     eval iwidgets::Page $pathName -background $itk_option(-background) $args
  704.     
  705.     incr _uniqueID
  706.     return $pathName
  707.     
  708. }
  709.  
  710. # ------------------------------------------------------------------
  711. # PRIVATE METHOD: _deletePages
  712. #
  713. # Deletes pages from $fromPage to $toPage.
  714. #
  715. # Operates in two passes, destroys all the widgets
  716. # Then removes the pathName from the page list
  717. #
  718. # Also keeps the current selection in bounds.
  719. # ------------------------------------------------------------------
  720. body iwidgets::Notebook::_deletePages { fromPage toPage } {
  721.     for { set page $fromPage } { $page <= $toPage } { incr page } {
  722.     # kill the widget
  723.     set pathName [lindex $_pages $page]
  724.     destroy $pathName
  725.     }
  726.     
  727.     # physically remove the page
  728.     set _pages [lreplace $_pages $fromPage $toPage]
  729.     
  730.     # If we deleted a selected page set our selection to none
  731.     if { $_currPage >= $fromPage && $_currPage <= $toPage } {
  732.     set $_currPage -1
  733.     }
  734.     
  735.     # make sure _currPage stays in sync with new numbering...
  736.     if { $_pages == {} } {
  737.     # if deleted only remaining page,
  738.     # reset current page to undefined
  739.     set _currPage -1
  740.     
  741.     # or if the current page was the last page, it needs come back
  742.     } elseif { $_currPage >= [llength $_pages] } {
  743.     incr _currPage -1
  744.     if { $_currPage < 0 } {
  745.         # but only to zero
  746.         set _currPage 0
  747.     }
  748.     }
  749.     
  750.     # give scrollcommand chance to update
  751.     _scrollCommand 
  752. }
  753.  
  754. # ------------------------------------------------------------------
  755. # PRIVATE METHOD: _configurePages
  756. #
  757. # Does the pageconfigure method on each page in the notebook
  758. # ------------------------------------------------------------------
  759. body iwidgets::Notebook::_configurePages { args } {
  760.     # make sure we have pages
  761.     if { [catch {set _pages}] } {
  762.     return
  763.     }
  764.     
  765.     # go thru all pages and pageconfigure them.
  766.     foreach pathName $_pages {
  767.     eval "$pathName configure $args"
  768.     }
  769. }
  770.  
  771. # ------------------------------------------------------------------
  772. # PRIVATE METHOD: _tabCommand
  773. #
  774. # Calls the command that was passed in through the 
  775. # $itk_option(-tabcommand) argument.
  776. #
  777. # This method is up for debate... do we need the -tabcommand option?
  778. # ------------------------------------------------------------------
  779. body iwidgets::Notebook::_tabCommand { } {
  780.     global page$itk_component(hull)
  781.     
  782.     if { $itk_option(-tabcommand) != {} } {
  783.     set newTabCmdStr $itk_option(-tabcommand)
  784.     lappend newTabCmdStr [set page$itk_component(hull)]
  785.     
  786.     #eval $newTabCmdStr
  787.     uplevel #0 $newTabCmdStr
  788.     }
  789. }
  790.     
  791. #
  792. # Page widget
  793. # ------------------------------------------------------------------
  794. #
  795. # The Page command creates a new window (given by the pathName argument) 
  796. # and makes it into a Page widget. Additional options, described above 
  797. # may be specified on the com mand line or in the option database to 
  798. # configure aspects of the Page such as its back ground, cursor, and 
  799. # geometry. The Page command returns its pathName argument. At the time 
  800. # this command is invoked, there must not exist a window named pathName, 
  801. # but path Name's parent must exist.
  802. # A Page is a frame that holds a child site. It is nothing more than a 
  803. # frame widget with some intelligence built in. Its primary purpose is 
  804. # to support the Notebook's concept of a page. It allows another widget 
  805. # like the Notebook to treat a page as a single object. The Page has an 
  806. # associated label and knows how to return its child site.
  807. #
  808. # ------------------------------------------------------------------
  809. #  AUTHOR: Bill W. Scott                 EMAIL: bscott@spd.dsccc.com
  810. #
  811. # ------------------------------------------------------------------
  812. #               Copyright (c) 1995  DSC Communications Corp.
  813. # ======================================================================
  814. # Permission is hereby granted, without written agreement and without
  815. # license or royalty fees, to use, copy, modify, and distribute this
  816. # software and its documentation for any purpose, provided that the
  817. # above copyright notice and the following two paragraphs appear in
  818. # all copies of this software.
  819. #
  820. # IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
  821. # DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
  822. # ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
  823. # IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
  824. # DAMAGE.
  825. #
  826. # THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
  827. # BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
  828. # FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
  829. # ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
  830. # PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
  831. # ======================================================================
  832. #
  833. # Option database default resources:
  834. #
  835. option add *Page.disabledForeground #a3a3a3     widgetDefault
  836. option add *Page.label              {}       widgetDefault
  837. option add *Page.command            {}       widgetDefault
  838.  
  839. class iwidgets::Page {
  840.     inherit itk::Widget
  841.     
  842.     constructor {args} {}
  843.     
  844.     itk_option define \
  845.         -disabledforeground disabledForeground DisabledForeground #a3a3a3 
  846.     itk_option define -label label Label {} 
  847.     itk_option define -command command Command {}
  848.     
  849.     public method childsite { } 
  850. }
  851.  
  852. # ------------------------------------------------------------------
  853. #                          CONSTRUCTOR
  854. # ------------------------------------------------------------------
  855. body iwidgets::Page::constructor {args} {
  856.     #
  857.     # Create the outermost frame to maintain geometry.
  858.     #
  859.     itk_component add cs {
  860.     frame $itk_interior.cs 
  861.     } {
  862.     keep -cursor -background -width -height
  863.     }
  864.     pack $itk_component(cs) -fill both -expand yes 
  865.     pack propagate $itk_component(cs) no
  866.     
  867.     eval itk_initialize $args
  868. }
  869.  
  870. # ------------------------------------------------------------------
  871. #                            OPTIONS
  872. # ------------------------------------------------------------------
  873. # ------------------------------------------------------------------
  874. # OPTION -disabledforeground
  875. #
  876. # Sets the disabledForeground color of this page
  877. # ------------------------------------------------------------------
  878. configbody iwidgets::Page::disabledforeground {
  879. }
  880.  
  881. # ------------------------------------------------------------------
  882. # OPTION -label
  883. #
  884. # Sets the label of this page.  The label is a string identifier 
  885. # for this page.
  886. # ------------------------------------------------------------------
  887. configbody iwidgets::Page::label {
  888. }
  889.  
  890. # ------------------------------------------------------------------
  891. # OPTION -command
  892. #
  893. # The Tcl Command to associate with this page.
  894. # ------------------------------------------------------------------
  895. configbody iwidgets::Page::command {
  896. }
  897.  
  898. # ------------------------------------------------------------------
  899. #                            METHODS
  900. # ------------------------------------------------------------------
  901.  
  902. # ------------------------------------------------------------------
  903. # METHOD: childsite
  904. #
  905. # Returns the child site widget of this page
  906. # ------------------------------------------------------------------
  907. body iwidgets::Page::childsite { } {
  908.     return $itk_component(cs)
  909. }
  910.  
  911.