summaryrefslogtreecommitdiff
path: root/iwidgets/generic/notebook.itk
diff options
context:
space:
mode:
Diffstat (limited to 'iwidgets/generic/notebook.itk')
-rw-r--r--iwidgets/generic/notebook.itk946
1 files changed, 946 insertions, 0 deletions
diff --git a/iwidgets/generic/notebook.itk b/iwidgets/generic/notebook.itk
new file mode 100644
index 00000000000..18c5cd95efe
--- /dev/null
+++ b/iwidgets/generic/notebook.itk
@@ -0,0 +1,946 @@
+#
+# Notebook Widget
+# ----------------------------------------------------------------------
+# The Notebook command creates a new window (given by the pathName
+# argument) and makes it into a Notebook widget. Additional options,
+# described above may be specified on the command line or in the
+# option database to configure aspects of the Notebook such as its
+# colors, font, and text. The Notebook command returns its pathName
+# argument. At the time this command is invoked, there must not exist
+# a window named pathName, but path Name's parent must exist.
+#
+# A Notebook is a widget that contains a set of pages. It displays one
+# page from the set as the selected page. When a page is selected, the
+# page's contents are displayed in the page area. When first created a
+# Notebook has no pages. Pages may be added or deleted using widget commands
+# described below.
+#
+# A special option may be provided to the Notebook. The -auto option
+# specifies whether the Nptebook will automatically handle the unpacking
+# and packing of pages when pages are selected. A value of true signifies
+# that the notebook will automatically manage it. This is the default
+# value. A value of false signifies the notebook will not perform automatic
+# switching of pages.
+#
+# WISH LIST:
+# This section lists possible future enhancements.
+#
+# ----------------------------------------------------------------------
+# AUTHOR: Bill W. Scott EMAIL: bscott@spd.dsccc.com
+#
+# @(#) $Id$
+# ----------------------------------------------------------------------
+# Copyright (c) 1995 DSC Technologies Corporation
+# ======================================================================
+# Permission to use, copy, modify, distribute and license this software
+# and its documentation for any purpose, and without fee or written
+# agreement with DSC, is hereby granted, provided that the above copyright
+# notice appears in all copies and that both the copyright notice and
+# warranty disclaimer below appear in supporting documentation, and that
+# the names of DSC Technologies Corporation or DSC Communications
+# Corporation not be used in advertising or publicity pertaining to the
+# software without specific, written prior permission.
+#
+# DSC DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+# ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, AND NON-
+# INFRINGEMENT. THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, AND THE
+# AUTHORS AND DISTRIBUTORS HAVE NO OBLIGATION TO PROVIDE MAINTENANCE,
+# SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. IN NO EVENT SHALL
+# DSC BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
+# ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+# WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTUOUS ACTION,
+# ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+# SOFTWARE.
+# ======================================================================
+
+#
+# Default resources.
+#
+option add *Notebook.background #d9d9d9 widgetDefault
+option add *Notebook.auto true widgetDefault
+
+#
+# Usual options.
+#
+itk::usual Notebook {
+ keep -background -cursor
+}
+
+# ------------------------------------------------------------------
+# NOTEBOOK
+# ------------------------------------------------------------------
+itcl::class iwidgets::Notebook {
+ inherit itk::Widget
+
+ constructor {args} {}
+
+ itk_option define -background background Background #d9d9d9
+ itk_option define -auto auto Auto true
+ itk_option define -scrollcommand scrollCommand ScrollCommand {}
+
+ public method add { args }
+ public method childsite { args }
+ public method delete { args }
+ public method index { args }
+ public method insert { args }
+ public method prev { }
+ public method next { }
+ public method pageconfigure { args }
+ public method pagecget { index option }
+ public method select { index }
+ public method view { args }
+
+ private method _childSites { }
+ private method _scrollCommand { }
+ private method _index { pathList index select}
+ private method _createPage { args }
+ private method _deletePages { fromPage toPage }
+ private method _configurePages { args }
+ private method _tabCommand { }
+
+ private variable _currPage -1 ;# numerical index of current page selected
+ private variable _pages {} ;# list of Page components
+ private variable _uniqueID 0 ;# one-up number for unique page numbering
+
+}
+
+#
+# Provide a lowercase access method for the Notebook class
+#
+proc ::iwidgets::notebook {pathName args} {
+ uplevel ::iwidgets::Notebook $pathName $args
+}
+
+# ------------------------------------------------------------------
+# CONSTRUCTOR
+# ------------------------------------------------------------------
+itcl::body iwidgets::Notebook::constructor {args} {
+ #
+ # Create the outermost frame to maintain geometry.
+ #
+ itk_component add cs {
+ frame $itk_interior.cs
+ } {
+ keep -cursor -background -width -height
+ }
+ pack $itk_component(cs) -fill both -expand yes
+ pack propagate $itk_component(cs) no
+
+ eval itk_initialize $args
+
+ # force bg of all pages to reflect Notebook's background.
+ _configurePages -background $itk_option(-background)
+}
+
+# ------------------------------------------------------------------
+# OPTIONS
+# ------------------------------------------------------------------
+# ------------------------------------------------------------------
+# OPTION -background
+#
+# Sets the bg color of all the pages in the Notebook.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Notebook::background {
+ if {$itk_option(-background) != {}} {
+ _configurePages -background $itk_option(-background)
+ }
+}
+
+# ------------------------------------------------------------------
+# OPTION -auto
+#
+# Determines whether pages are automatically unpacked and
+# packed when pages get selected.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Notebook::auto {
+ if {$itk_option(-auto) != {}} {
+ }
+}
+
+# ------------------------------------------------------------------
+# OPTION -scrollcommand
+#
+# Command string to be invoked when the notebook
+# has any changes to its current page, or number of pages.
+#
+# typically for scrollbars.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Notebook::scrollcommand {
+ if {$itk_option(-scrollcommand) != {}} {
+ _scrollCommand
+ }
+}
+
+# ------------------------------------------------------------------
+# METHOD: add add ?<option> <value>...?
+#
+# Creates a page and appends it to the list of pages.
+# processes pageconfigure for the page added.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Notebook::add { args } {
+ # The args list should be an even # of params, if not then
+ # prob missing value for last item in args list. Signal error.
+ set len [llength $args]
+ if {$len % 2} {
+ error "value for \"[lindex $args [expr {$len - 1}]]\" missing"
+ }
+
+ # add a Page component
+ set pathName [eval _createPage $args]
+ lappend _pages $pathName
+
+ # update scroller
+ _scrollCommand
+
+ # return childsite for the Page component
+ return [eval $pathName childsite]
+}
+
+# ------------------------------------------------------------------
+# METHOD: childsite ?<index>?
+#
+# If index is supplied, returns the child site widget corresponding
+# to the page index. If called with no arguments, returns a list
+# of all child sites
+# ------------------------------------------------------------------
+itcl::body iwidgets::Notebook::childsite { args } {
+ set len [llength $args]
+
+ switch $len {
+ 0 {
+ # ... called with no arguments, return a list
+ if { [llength $args] == 0 } {
+ return [_childSites]
+ }
+ }
+ 1 {
+ set index [lindex $args 0]
+ # ... otherwise, return child site for the index given
+ # empty notebook
+ if { $_pages == {} } {
+ error "can't get childsite,\
+ no pages in the notebook \"$itk_component(hull)\""
+ }
+
+ set index [_index $_pages $index $_currPage]
+
+ # index out of range
+ if { $index < 0 || $index >= [llength $_pages] } {
+ error "bad Notebook page index in childsite method:\
+ should be between 0 and [expr {[llength $_pages] - 1}]"
+ }
+
+ set pathName [lindex $_pages $index]
+
+ set cs [eval $pathName childsite]
+ return $cs
+ }
+ default {
+ # ... too many parameters passed
+ error "wrong # args: should be\
+ \"$itk_component(hull) childsite ?index?\""
+ }
+ }
+}
+
+# ------------------------------------------------------------------
+# METHOD: delete <index1> ?<index2>?
+#
+# Deletes a page or range of pages from the notebook
+# ------------------------------------------------------------------
+itcl::body iwidgets::Notebook::delete { args } {
+ # empty notebook
+ if { $_pages == {} } {
+ error "can't delete page, no pages in the notebook\
+ \"$itk_component(hull)\""
+ }
+
+ set len [llength $args]
+ switch -- $len {
+ 1 {
+ set fromPage [_index $_pages [lindex $args 0] $_currPage]
+
+ if { $fromPage < 0 || $fromPage >= [llength $_pages] } {
+ error "bad Notebook page index in delete method:\
+ should be between 0 and [expr {[llength $_pages] - 1}]"
+ }
+
+ set toPage $fromPage
+ _deletePages $fromPage $toPage
+ }
+
+ 2 {
+ set fromPage [_index $_pages [lindex $args 0] $_currPage]
+
+ if { $fromPage < 0 || $fromPage >= [llength $_pages] } {
+ error "bad Notebook page index1 in delete method:\
+ should be between 0 and [expr {[llength $_pages] - 1}]"
+ }
+
+ set toPage [_index $_pages [lindex $args 1] $_currPage]
+
+ if { $toPage < 0 || $toPage >= [llength $_pages] } {
+ error "bad Notebook page index2 in delete method:\
+ should be between 0 and [expr {[llength $_pages] - 1}]"
+ error "bad Notebook page index2"
+ }
+
+ if { $fromPage > $toPage } {
+ error "bad Notebook page index1 in delete method:\
+ index1 is greater than index2"
+ }
+
+ _deletePages $fromPage $toPage
+
+ }
+
+ default {
+ # ... too few/many parameters passed
+ error "wrong # args: should be\
+ \"$itk_component(hull) delete index1 ?index2?\""
+ }
+ }
+}
+
+# ------------------------------------------------------------------
+# METHOD: index <index>
+#
+# Given an index identifier returns the numeric index of the page
+# ------------------------------------------------------------------
+itcl::body iwidgets::Notebook::index { args } {
+ if { [llength $args] != 1 } {
+ error "wrong # args: should be\
+ \"$itk_component(hull) index index\""
+ }
+
+ set index $args
+
+ set number [_index $_pages $index $_currPage]
+
+ return $number
+}
+
+# ------------------------------------------------------------------
+# METHOD: insert <index> ?<option> <value>...?
+#
+# Inserts a page before a index. The before page may
+# be specified as a label or a page position.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Notebook::insert { args } {
+ # ... Error: no args passed
+ set len [llength $args]
+ if { $len == 0 } {
+ error "wrong # args: should be\
+ \"$itk_component(hull) insert index ?option value?\""
+ }
+
+ # ... set up index and args
+ set index [lindex $args 0]
+ set args [lrange $args 1 $len]
+
+ # ... Error: unmatched option value pair (len is odd)
+ # The args list should be an even # of params, if not then
+ # prob missing value for last item in args list. Signal error.
+ set len [llength $args]
+ if { $len % 2 } {
+ error "value for \"[lindex $args [expr {$len - 1}]]\" missing"
+ }
+
+ # ... Error: catch notebook empty
+ if { $_pages == {} } {
+ error "can't insert page, no pages in the notebook\
+ \"$itk_component(hull)\""
+ }
+
+ # ok, get the page
+ set page [_index $_pages $index $_currPage]
+
+ # ... Error: catch bad value for before page.
+ if { $page < 0 || $page >= [llength $_pages] } {
+ error "bad Notebook page index in insert method:\
+ should be between 0 and [expr {[llength $_pages] - 1}]"
+ }
+
+ # ... Start the business of inserting
+ # create the new page and get its path name...
+ set pathName [eval _createPage $args]
+
+ # grab the name of the page currently selected. (to keep in sync)
+ set currPathName [lindex $_pages $_currPage]
+
+ # insert pathName before $page
+ set _pages [linsert $_pages $page $pathName]
+
+ # keep the _currPage in sync with the insert.
+ set _currPage [lsearch -exact $_pages $currPathName]
+
+ # give scrollcommand chance to update
+ _scrollCommand
+
+ # give them child site back...
+ return [eval $pathName childsite]
+}
+
+# ------------------------------------------------------------------
+# METHOD: prev
+#
+# Selects the previous page. Wraps at first back to last page.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Notebook::prev { } {
+ # catch empty notebook
+ if { $_pages == {} } {
+ error "can't move to previous page,\
+ no pages in the notebook \"$itk_component(hull)\""
+ }
+
+ # bump to the previous page and wrap if necessary
+ set prev [expr {$_currPage - 1}]
+ if { $prev < 0 } {
+ set prev [expr {[llength $_pages] - 1}]
+ }
+
+ select $prev
+
+ return $prev
+}
+
+# ------------------------------------------------------------------
+# METHOD: next
+#
+# Selects the next page. Wraps at last back to first page.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Notebook::next { } {
+ # catch empty notebook
+ if { $_pages == {} } {
+ error "can't move to next page,\
+ no pages in the notebook \"$itk_component(hull)\""
+ }
+
+ # bump to the next page and wrap if necessary
+ set next [expr {$_currPage + 1}]
+ if { $next >= [llength $_pages] } {
+ set next 0
+ }
+
+ select $next
+
+ return $next
+}
+
+# ------------------------------------------------------------------
+# METHOD: pageconfigure <index> ?<option> <value>...?
+#
+# Performs configure on a given page denoted by index. Index may
+# be a page number or a pattern matching the label associated with
+# a page.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Notebook::pageconfigure { args } {
+ # ... Error: no args passed
+ set len [llength $args]
+ if { $len == 0 } {
+ error "wrong # args: should be\
+ \"$itk_component(hull) pageconfigure index ?option value?\""
+ }
+
+ # ... set up index and args
+ set index [lindex $args 0]
+ set args [lrange $args 1 $len]
+
+ set page [_index $_pages $index $_currPage]
+
+ # ... Error: page out of range
+ if { $page < 0 || $page >= [llength $_pages] } {
+ error "bad Notebook page index in pageconfigure method:\
+ should be between 0 and [expr {[llength $_pages] - 1}]"
+ }
+
+ # Configure the page component
+ set pathName [lindex $_pages $page]
+ return [eval $pathName configure $args]
+}
+
+# ------------------------------------------------------------------
+# METHOD: pagecget <index> <option>
+#
+# Performs cget on a given page denoted by index. Index may
+# be a page number or a pattern matching the label associated with
+# a page.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Notebook::pagecget { index option } {
+ set page [_index $_pages $index $_currPage]
+
+ # ... Error: page out of range
+ if { $page < 0 || $page >= [llength $_pages] } {
+ error "bad Notebook page index in pagecget method:\
+ should be between 0 and [expr {[llength $_pages] - 1}]"
+ }
+
+ # Get the page info.
+ set pathName [lindex $_pages $page]
+ return [$pathName cget $option]
+}
+
+# ------------------------------------------------------------------
+# METHOD: select <index>
+#
+# Select a page by index. Hide the last _currPage if it existed.
+# Then show the new one if it exists. Returns the currently
+# selected page or -1 if tried to do a select select when there is
+# no selection.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Notebook::select { index } {
+ global page$itk_component(hull)
+
+ # ... Error: empty notebook
+ if { $_pages == {} } {
+ error "can't select page $index,\
+ no pages in the notebook \"$itk_component(hull)\""
+ }
+
+ # if there is not current selection just ignore trying this selection
+ if { $index == "select" && $_currPage == -1 } {
+ return -1
+ }
+
+ set reqPage [_index $_pages $index $_currPage]
+
+ if { $reqPage < 0 || $reqPage >= [llength $_pages] } {
+ error "bad Notebook page index in select method:\
+ should be between 0 and [expr {[llength $_pages] - 1}]"
+ }
+
+ # if we already have this page selected, then ignore selection.
+ if { $reqPage == $_currPage } {
+ return $_currPage
+ }
+
+ # if we are handling packing and unpacking the unpack if we can
+ if { $itk_option(-auto) } {
+ # if there is a current page packed, then unpack it
+ if { $_currPage != -1 } {
+ set currPathName [lindex $_pages $_currPage]
+ pack forget $currPathName
+ }
+ }
+
+ # set this now so that the -command cmd can do an 'index select'
+ # to operate on this page.
+ set _currPage $reqPage
+
+ # invoke the command for this page
+ set cmd [lindex [pageconfigure $index -command] 4]
+ eval $cmd
+
+ # give scrollcommand chance to update
+ _scrollCommand
+
+ # if we are handling packing and unpacking the pack if we can
+ if { $itk_option(-auto) } {
+ set reqPathName [lindex $_pages $reqPage]
+ pack $reqPathName -anchor nw -fill both -expand yes
+ }
+
+ return $_currPage
+}
+
+
+# ------------------------------------------------------------------
+# METHOD: view
+#
+# Return the current page
+#
+# view <index>
+#
+# Selects the page denoted by index to be current page
+#
+# view 'moveto' <fraction>
+#
+# Selects the page by using fraction amount
+#
+# view 'scroll' <num> <what>
+#
+# Selects the page by using num as indicator of next or previous
+# ------------------------------------------------------------------
+itcl::body iwidgets::Notebook::view { args } {
+ set len [llength $args]
+ switch -- $len {
+ 0 {
+ # Return current page
+ return $_currPage
+ }
+ 1 {
+ # Select by index
+ select [lindex $args 0]
+ }
+ 2 {
+ # Select using moveto
+ set arg [lindex $args 0]
+ if { $arg == "moveto" } {
+ set fraction [lindex $args 1]
+ if { [catch { set page \
+ [expr {round($fraction/(1.0/[llength $_pages]))}]}]} {
+ error "expected floating-point number \
+ but got \"$fraction\""
+ }
+ if { $page == [llength $_pages] } {
+ incr page -1
+ }
+
+ if { $page >= 0 && $page < [llength $_pages] } {
+ select $page
+ }
+ } else {
+ error "expected \"moveto\" but got $arg"
+ }
+ }
+ 3 {
+ # Select using scroll keyword
+ set arg [lindex $args 0]
+ if { $arg == "scroll" } {
+ set amount [lindex $args 1]
+ # check for integer value
+ if { ! [regexp {^[-]*[0-9]*$} $amount] } {
+ error "expected integer but got \"$amount\""
+ }
+ set page [expr {$_currPage + $amount}]
+ if { $page >= 0 && $page < [llength $_pages] } {
+ select $page
+ }
+
+ } else {
+ error "expected \"scroll\" but got $arg"
+ }
+ }
+ default {
+ set arg [lindex $args 0]
+ if { $arg == "moveto" } {
+ error "wrong # args: should be\
+ \"$itk_component(hull) view moveto fraction\""
+ } elseif { $arg == "scroll" } {
+ error "wrong # args: should be\
+ \"$itk_component(hull) view scroll units|pages\""
+ } else {
+ error "wrong # args: should be\
+ \"$itk_component(hull) view index\""
+ }
+ }
+ }
+}
+
+# ------------------------------------------------------------------
+# PRIVATE METHOD: _childSites
+#
+# Returns a list of child sites for all pages in the notebook.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Notebook::_childSites { } {
+ # empty notebook
+ if { $_pages == {} } {
+ error "can't get childsite list,\
+ no pages in the notebook \"$itk_component(hull)\""
+ }
+
+ set csList {}
+
+ foreach pathName $_pages {
+ lappend csList [eval $pathName childsite]
+ }
+
+ return $csList
+}
+
+# ------------------------------------------------------------------
+# PRIVATE METHOD: _scrollCommand
+#
+# If there is a -scrollcommand set up, then call the tcl command
+# and suffix onto it the standard 4 numbers scrollbars get.
+#
+# Invoke the scrollcommand, this is like the y/xscrollcommand
+# it is designed to talk to scrollbars and the the
+# tabset also knows how to obey scrollbar protocol.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Notebook::_scrollCommand { } {
+ if { $itk_option(-scrollcommand) != {} } {
+ if { $_currPage != -1 } {
+ set relTop [expr {($_currPage*1.0) / [llength $_pages]}]
+ set relBottom [expr {(($_currPage+1)*1.0) / [llength $_pages]}]
+ set scrollCommand "$itk_option(-scrollcommand) $relTop $relBottom"
+ } else {
+ set scrollCommand "$itk_option(-scrollcommand) 0 1"
+ }
+ uplevel #0 $scrollCommand
+ }
+}
+
+# ------------------------------------------------------------------
+# PRIVATE METHOD: _index
+#
+# pathList : list of path names to search thru if index is a label
+# index : either number, 'select', 'end', or pattern
+# select : current selection
+#
+# _index takes takes the value $index converts it to
+# a numeric identifier. If the value is not already
+# an integer it looks it up in the $pathList array.
+# If it fails it returns -1
+# ------------------------------------------------------------------
+itcl::body iwidgets::Notebook::_index { pathList index select} {
+ switch -- $index {
+ select {
+ set number $select
+ }
+ end {
+ set number [expr {[llength $pathList] -1}]
+ }
+ default {
+ # is it a number already?
+ if { [regexp {^[0-9]+$} $index] } {
+ set number $index
+ if { $number < 0 || $number >= [llength $pathList] } {
+ set number -1
+ }
+
+ # otherwise it is a label
+ } else {
+ # look thru the pathList of pathNames and
+ # get each label and compare with index.
+ # if we get a match then set number to postion in $pathList
+ # and break out.
+ # otherwise number is still -1
+ set i 0
+ set number -1
+ foreach pathName $pathList {
+ set label [lindex [$pathName configure -label] 4]
+ if { [string match $label $index] } {
+ set number $i
+ break
+ }
+ incr i
+ }
+ }
+ }
+ }
+
+ return $number
+}
+
+# ------------------------------------------------------------------
+# PRIVATE METHOD: _createPage
+#
+# Creates a page, using unique page naming, propagates background
+# and keeps unique id up to date.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Notebook::_createPage { args } {
+ #
+ # create an internal name for the page: .n.cs.page0, .n.cs.page1, etc.
+ #
+ set pathName $itk_component(cs).page$_uniqueID
+
+ eval iwidgets::Page $pathName -background $itk_option(-background) $args
+
+ incr _uniqueID
+ return $pathName
+
+}
+
+# ------------------------------------------------------------------
+# PRIVATE METHOD: _deletePages
+#
+# Deletes pages from $fromPage to $toPage.
+#
+# Operates in two passes, destroys all the widgets
+# Then removes the pathName from the page list
+#
+# Also keeps the current selection in bounds.
+# ------------------------------------------------------------------
+itcl::body iwidgets::Notebook::_deletePages { fromPage toPage } {
+ for { set page $fromPage } { $page <= $toPage } { incr page } {
+ # kill the widget
+ set pathName [lindex $_pages $page]
+ destroy $pathName
+ }
+
+ # physically remove the page
+ set _pages [lreplace $_pages $fromPage $toPage]
+
+ # If we deleted a selected page set our selection to none
+ if { $_currPage >= $fromPage && $_currPage <= $toPage } {
+ set _currPage -1
+ }
+
+ # make sure _currPage stays in sync with new numbering...
+ if { $_pages == {} } {
+ # if deleted only remaining page,
+ # reset current page to undefined
+ set _currPage -1
+
+ # or if the current page was the last page, it needs come back
+ } elseif { $_currPage >= [llength $_pages] } {
+ incr _currPage -1
+ if { $_currPage < 0 } {
+ # but only to zero
+ set _currPage 0
+ }
+ }
+
+ # give scrollcommand chance to update
+ _scrollCommand
+}
+
+# ------------------------------------------------------------------
+# PRIVATE METHOD: _configurePages
+#
+# Does the pageconfigure method on each page in the notebook
+# ------------------------------------------------------------------
+itcl::body iwidgets::Notebook::_configurePages { args } {
+ # make sure we have pages
+ if { [catch {set _pages}] } {
+ return
+ }
+
+ # go thru all pages and pageconfigure them.
+ foreach pathName $_pages {
+ eval "$pathName configure $args"
+ }
+}
+
+# ------------------------------------------------------------------
+# PRIVATE METHOD: _tabCommand
+#
+# Calls the command that was passed in through the
+# $itk_option(-tabcommand) argument.
+#
+# This method is up for debate... do we need the -tabcommand option?
+# ------------------------------------------------------------------
+itcl::body iwidgets::Notebook::_tabCommand { } {
+ global page$itk_component(hull)
+
+ if { $itk_option(-tabcommand) != {} } {
+ set newTabCmdStr $itk_option(-tabcommand)
+ lappend newTabCmdStr [set page$itk_component(hull)]
+
+ #eval $newTabCmdStr
+ uplevel #0 $newTabCmdStr
+ }
+}
+
+#
+# Page widget
+# ------------------------------------------------------------------
+#
+# The Page command creates a new window (given by the pathName argument)
+# and makes it into a Page widget. Additional options, described above
+# may be specified on the com mand line or in the option database to
+# configure aspects of the Page such as its back ground, cursor, and
+# geometry. The Page command returns its pathName argument. At the time
+# this command is invoked, there must not exist a window named pathName,
+# but path Name's parent must exist.
+#
+# A Page is a frame that holds a child site. It is nothing more than a
+# frame widget with some intelligence built in. Its primary purpose is
+# to support the Notebook's concept of a page. It allows another widget
+# like the Notebook to treat a page as a single object. The Page has an
+# associated label and knows how to return its child site.
+#
+# ------------------------------------------------------------------
+# AUTHOR: Bill W. Scott EMAIL: bscott@spd.dsccc.com
+#
+# ------------------------------------------------------------------
+# Copyright (c) 1995 DSC Communications Corp.
+# ======================================================================
+# Permission is hereby granted, without written agreement and without
+# license or royalty fees, to use, copy, modify, and distribute this
+# software and its documentation for any purpose, provided that the
+# above copyright notice and the following two paragraphs appear in
+# all copies of this software.
+#
+# IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+# DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+# ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+# IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+# DAMAGE.
+#
+# THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+# BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+# FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
+# ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+# PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+# ======================================================================
+#
+# Option database default resources:
+#
+option add *Page.disabledForeground #a3a3a3 widgetDefault
+option add *Page.label {} widgetDefault
+option add *Page.command {} widgetDefault
+
+itcl::class iwidgets::Page {
+ inherit itk::Widget
+
+ constructor {args} {}
+
+ itk_option define \
+ -disabledforeground disabledForeground DisabledForeground #a3a3a3
+ itk_option define -label label Label {}
+ itk_option define -command command Command {}
+
+ public method childsite { }
+}
+
+# ------------------------------------------------------------------
+# CONSTRUCTOR
+# ------------------------------------------------------------------
+itcl::body iwidgets::Page::constructor {args} {
+ #
+ # Create the outermost frame to maintain geometry.
+ #
+ itk_component add cs {
+ frame $itk_interior.cs
+ } {
+ keep -cursor -background -width -height
+ }
+ pack $itk_component(cs) -fill both -expand yes
+ pack propagate $itk_component(cs) no
+
+ eval itk_initialize $args
+}
+
+# ------------------------------------------------------------------
+# OPTIONS
+# ------------------------------------------------------------------
+# ------------------------------------------------------------------
+# OPTION -disabledforeground
+#
+# Sets the disabledForeground color of this page
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Page::disabledforeground {
+}
+
+# ------------------------------------------------------------------
+# OPTION -label
+#
+# Sets the label of this page. The label is a string identifier
+# for this page.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Page::label {
+}
+
+# ------------------------------------------------------------------
+# OPTION -command
+#
+# The Tcl Command to associate with this page.
+# ------------------------------------------------------------------
+itcl::configbody iwidgets::Page::command {
+}
+
+# ------------------------------------------------------------------
+# METHODS
+# ------------------------------------------------------------------
+
+# ------------------------------------------------------------------
+# METHOD: childsite
+#
+# Returns the child site widget of this page
+# ------------------------------------------------------------------
+itcl::body iwidgets::Page::childsite { } {
+ return $itk_component(cs)
+}
+