#
# 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: notebook.itk,v 1.4 2001/08/15 18:33:31 smithc Exp $
# ----------------------------------------------------------------------
#            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)
}

