blob: 8185cfe9d3900a639d961b8ba38f2caf2cf47af8 [file] [log] [blame]
#
# Tabnotebook Widget
# ----------------------------------------------------------------------
# The Tabnotebook command creates a new window (given by the pathName
# argument) and makes it into a Tabnotebook widget. Additional options,
# described above may be specified on the command line or in the option
# database to configure aspects of the Tabnotebook such as its colors,
# font, and text. The Tabnotebook command returns its pathName argument.
# At the time this command is invoked, there must not exist a window
# named pathName, but pathName's parent must exist.
#
# A Tabnotebook is a widget that contains a set of tabbed pages. It
# displays one page from the set as the selected page. A Tab displays
# the label for the page to which it is attached and serves as a page
# selector. When a page's tab is selected, the page's contents are
# displayed in the page area. The selected tab has a three-dimensional
# effect to make it appear to float above the other tabs. The tabs are
# displayed as a group along either the left, top, right, or bottom
# edge. When first created a Tabnotebook has no pages. Pages may be
# added or deleted using widget commands described below.
#
# A special option may be provided to the Tabnotebook. The -auto
# option specifies whether the Tabnotebook will automatically handle
# the unpacking and packing of pages when pages are selected. A value
# of true sig nifies 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.
#
# ----------------------------------------------------------------------
# AUTHOR: Bill W. Scott
#
# CURRENT MAINTAINER: Chad Smith --> csmith@adc.com or itclguy@yahoo.com
#
# @(#) $Id: tabnotebook.itk,v 1.7 2002/09/05 20:19:35 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 *Tabnotebook.borderWidth 2 widgetDefault
option add *Tabnotebook.state normal widgetDefault
option add *Tabnotebook.disabledForeground #a3a3a3 widgetDefault
option add *Tabnotebook.scrollCommand {} widgetDefault
option add *Tabnotebook.equalTabs true widgetDefault
option add *Tabnotebook.font \
-Adobe-Helvetica-Bold-R-Normal--*-120-*-*-*-*-*-* widgetDefault
option add *Tabnotebook.width 300 widgetDefault
option add *Tabnotebook.height 150 widgetDefault
option add *Tabnotebook.foreground Black widgetDefault
option add *Tabnotebook.background #d9d9d9 widgetDefault
option add *Tabnotebook.tabForeground Black widgetDefault
option add *Tabnotebook.tabBackground #d9d9d9 widgetDefault
option add *Tabnotebook.backdrop #d9d9d9 widgetDefault
option add *Tabnotebook.margin 4 widgetDefault
option add *Tabnotebook.tabBorders true widgetDefault
option add *Tabnotebook.bevelAmount 0 widgetDefault
option add *Tabnotebook.raiseSelect false widgetDefault
option add *Tabnotebook.auto true widgetDefault
option add *Tabnotebook.start 4 widgetDefault
option add *Tabnotebook.padX 4 widgetDefault
option add *Tabnotebook.padY 4 widgetDefault
option add *Tabnotebook.gap overlap widgetDefault
option add *Tabnotebook.angle 15 widgetDefault
option add *Tabnotebook.tabPos s widgetDefault
#
# Usual options.
#
itk::usual Tabnotebook {
keep -backdrop -background -borderwidth -cursor -disabledforeground \
-font -foreground -tabbackground -tabforeground
}
# ------------------------------------------------------------------
# TABNOTEBOOK
# ------------------------------------------------------------------
itcl::class iwidgets::Tabnotebook {
inherit itk::Widget
constructor {args} {}
destructor {}
itk_option define -borderwidth borderWidth BorderWidth 2
itk_option define -state state State normal
itk_option define \
-disabledforeground disabledForeground DisabledForeground #a3a3a3
itk_option define -scrollcommand scrollCommand ScrollCommand {}
itk_option define -equaltabs equalTabs EqualTabs true
itk_option define -font font Font \
-Adobe-Helvetica-Bold-R-Normal--*-120-*-*-*-*-*-*
itk_option define -width width Width 300
itk_option define -height height Height 150
itk_option define -foreground foreground Foreground Black
itk_option define -background background Background #d9d9d9
itk_option define -tabforeground tabForeground TabForeground Black
itk_option define -tabbackground tabBackground TabBackground #d9d9d9
itk_option define -backdrop backdrop Backdrop #d9d9d9
itk_option define -margin margin Margin 4
itk_option define -tabborders tabBorders TabBorders true
itk_option define -bevelamount bevelAmount BevelAmount 0
itk_option define -raiseselect raiseSelect RaiseSelect false
itk_option define -auto auto Auto true
itk_option define -start start Start 4
itk_option define -padx padX PadX 4
itk_option define -pady padY PadY 4
itk_option define -gap gap Gap overlap
itk_option define -angle angle Angle 15
itk_option define -tabpos tabPos TabPos s
public method add { args }
public method configure { args }
public method childsite { args }
public method delete { args }
public method index { args }
public method insert { index args }
public method prev { }
public method next { }
public method pageconfigure { index args }
public method select { index }
public method view { args }
protected method _reconfigureTabset { }
protected method _canvasReconfigure { wid hgt }
protected method _pageReconfigure { pageName page wid hgt }
private method _getArgs { optList args }
private method _redrawBorder { wid hgt }
private method _recomputeBorder { }
private method _pack { tabPos }
private method _resize {newWidth_ newHeight_}
private variable _canvasWidth 0 ;# currently tabnote canvas width
private variable _canvasHeight 0 ;# currently tabnote canvas height
private variable _nbOptList {} ;# list of notebook options available
private variable _tsOptList {} ;# list of tabset options available
private variable _tabPos s ;# holds -tabPos, because of ordering
private variable _borderRecompute false ;# did we dirty border after cfg?
private variable _tabsetReconfigure false ;# did we dirty tabsets after cfg?
}
# ----------------------------------------------------------------------
# CONSTRUCTOR
# ----------------------------------------------------------------------
itcl::body iwidgets::Tabnotebook::constructor {args} {
# The following conditional added for SF ticket #514222. csmith 9/5/02
if {$::tk_version > 8.3} {
component hull configure -borderwidth 0 -padx 0 -pady 0
} else {
component hull configure -borderwidth 0
}
#
# Create the outermost canvas to maintain geometry.
#
itk_component add canvas {
canvas $itk_interior.canvas -highlightthickness 0
} {
keep -cursor -background -width -height
}
bind $itk_component(canvas) <Configure> [itcl::code $this _resize %w %h]
# .......................
# Create the NOTEBOOK
#
itk_component add notebook {
iwidgets::Notebook $itk_interior.canvas.notebook
} {
keep -cursor -background
}
#
# Ouch, create a dummy page, go pageconfigure to get its options
# and munge them into a list for later doling by pageconfigure
#
$itk_component(notebook) add
set nbConfigList [$itk_component(notebook) pageconfigure 0]
foreach config $nbConfigList {
lappend _nbOptList [lindex $config 0]
}
$itk_component(notebook) delete 0
#
# Create the tabset.
#
itk_component add tabset {
iwidgets::Tabset $itk_interior.canvas.tabset \
-command [itcl::code $this component notebook select]
} {
keep -cursor
}
eval itk_initialize $args
#
# Ouch, create a dummy tab, go tabconfigure to get its options
# and munge them into a list for later doling by pageconfigure
#
$itk_component(tabset) add
set tsConfigList [$itk_component(tabset) tabconfigure 0]
foreach config $tsConfigList {
lappend _tsOptList [lindex $config 0]
}
$itk_component(tabset) delete 0
bind $itk_component(tabset) <Configure> \
[itcl::code $this _reconfigureTabset]
_pack $_tabPos
$itk_component(hull) configure -width [cget -width] -height [cget -height]
}
proc ::iwidgets::tabnotebook {pathName args} {
uplevel ::iwidgets::Tabnotebook $pathName $args
}
# -------------------------------------------------------------
# DESTRUCTOR: destroy the Tabnotebook
# -------------------------------------------------------------
itcl::body iwidgets::Tabnotebook::destructor {} {
}
# ----------------------------------------------------------------------
# OPTION -borderwidth
#
# Thickness of Notebook Border
# ----------------------------------------------------------------------
itcl::configbody iwidgets::Tabnotebook::borderwidth {
if {$itk_option(-borderwidth) != {}} {
#_recomputeBorder
set _borderRecompute true
}
}
# ----------------------------------------------------------------------
# OPTION -state
#
# State of the tabs in the tab notebook: normal or disabled
# ----------------------------------------------------------------------
itcl::configbody iwidgets::Tabnotebook::state {
if {$itk_option(-state) != {}} {
$itk_component(tabset) configure -state $itk_option(-state)
#_reconfigureTabset
set _tabsetReconfigure true
}
}
# ----------------------------------------------------------------------
# OPTION -disabledforeground
#
# Specifies a foreground color to use for displaying a
# tab's label when its state is disabled.
# ----------------------------------------------------------------------
itcl::configbody iwidgets::Tabnotebook::disabledforeground {
if {$itk_option(-disabledforeground) != {}} {
$itk_component(tabset) configure \
-disabledforeground $itk_option(-disabledforeground)
#_reconfigureTabset
set _tabsetReconfigure true
}
}
# ----------------------------------------------------------------------
# OPTION -scrollcommand
#
# Standard option. See options man pages.
# ----------------------------------------------------------------------
itcl::configbody iwidgets::Tabnotebook::scrollcommand {
if {$itk_option(-scrollcommand) != {}} {
$itk_component(notebook) \
configure -scrollcommand $itk_option(-scrollcommand)
}
}
# ----------------------------------------------------------------------
# OPTION -equaltabs
#
# Specifies whether to force tabs to be equal sized or not.
# A value of true means constrain tabs to be equal sized.
# A value of false allows each tab to size based on the text
# label size. The value may have any of the forms accepted by
# the Tcl_GetBoolean, such as true, false, 0, 1, yes, or no.
# ----------------------------------------------------------------------
itcl::configbody iwidgets::Tabnotebook::equaltabs {
if {$itk_option(-equaltabs) != {}} {
$itk_component(tabset) \
configure -equaltabs $itk_option(-equaltabs)
#_reconfigureTabset
set _tabsetReconfigure true
}
}
# ----------------------------------------------------------------------
# OPTION -font
#
# Font for tab labels when they are set to text (-label set)
# ----------------------------------------------------------------------
itcl::configbody iwidgets::Tabnotebook::font {
if {$itk_option(-font) != {}} {
$itk_component(tabset) configure -font $itk_option(-font)
#_reconfigureTabset
set _tabsetReconfigure true
}
}
# ----------------------------------------------------------------------
# OPTION -width
#
# Width of the Tabnotebook
# ----------------------------------------------------------------------
itcl::configbody iwidgets::Tabnotebook::width {
if {$itk_option(-width) != {}} {
$itk_component(canvas) configure -width $itk_option(-width)
#_recomputeBorder
set _borderRecompute true
}
}
# ----------------------------------------------------------------------
# OPTION -height
#
# Height of the Tabnotebook
# ----------------------------------------------------------------------
itcl::configbody iwidgets::Tabnotebook::height {
if {$itk_option(-height) != {}} {
$itk_component(canvas) configure -height $itk_option(-height)
#_recomputeBorder
set _borderRecompute true
}
}
# ----------------------------------------------------------------------
# OPTION -foreground
#
# Specifies a foreground color to use for displaying a page
# and its associated tab label (this is the selected state).
# ----------------------------------------------------------------------
itcl::configbody iwidgets::Tabnotebook::foreground {
if {$itk_option(-foreground) != {}} {
$itk_component(tabset) configure \
-selectforeground $itk_option(-foreground)
}
}
# ----------------------------------------------------------------------
# OPTION -background
#
# Specifies a background color to use for displaying a page
# and its associated tab bg (this is the selected state).
# ----------------------------------------------------------------------
itcl::configbody iwidgets::Tabnotebook::background {
if {$itk_option(-background) != {}} {
$itk_component(tabset) configure \
-selectbackground $itk_option(-background)
#_recomputeBorder
set _borderRecompute true
}
}
# ----------------------------------------------------------------------
# OPTION -tabforeground
#
# Specifies a foreground color to use for displaying tab labels
# when they are in their unselected state.
# ----------------------------------------------------------------------
itcl::configbody iwidgets::Tabnotebook::tabforeground {
if {$itk_option(-tabforeground) != {}} {
$itk_component(tabset) configure \
-foreground $itk_option(-tabforeground)
}
}
# ----------------------------------------------------------------------
# OPTION -tabbackground
#
# Specifies a background color to use for displaying tab backgrounds
# when they are in their unselected state.
# ----------------------------------------------------------------------
itcl::configbody iwidgets::Tabnotebook::tabbackground {
if {$itk_option(-tabbackground) != {}} {
$itk_component(tabset) configure \
-background $itk_option(-tabbackground)
}
}
# ----------------------------------------------------------------------
# OPTION -backdrop
#
# Specifies a background color to use when filling in the
# area behind the tabs.
# ----------------------------------------------------------------------
itcl::configbody iwidgets::Tabnotebook::backdrop {
if {$itk_option(-backdrop) != {}} {
$itk_component(tabset) configure \
-backdrop $itk_option(-backdrop)
}
}
# ----------------------------------------------------------------------
# OPTION -margin
#
# Sets the backdrop margin between tab edge and backdrop edge
# ----------------------------------------------------------------------
itcl::configbody iwidgets::Tabnotebook::margin {
if {$itk_option(-margin) != {}} {
$itk_component(tabset) configure -margin $itk_option(-margin)
}
}
# ----------------------------------------------------------------------
# OPTION -tabborders
#
# Boolean that specifies whether to draw the borders of
# the unselected tabs (tabs in background)
# ----------------------------------------------------------------------
itcl::configbody iwidgets::Tabnotebook::tabborders {
if {$itk_option(-tabborders) != {}} {
$itk_component(tabset) \
configure -tabborders $itk_option(-tabborders)
#_reconfigureTabset
set _tabsetReconfigure true
}
}
# ----------------------------------------------------------------------
# OPTION -bevelamount
#
# Specifies pixel size of tab corners. 0 means no corners.
# ----------------------------------------------------------------------
itcl::configbody iwidgets::Tabnotebook::bevelamount {
if {$itk_option(-bevelamount) != {}} {
$itk_component(tabset) \
configure -bevelamount $itk_option(-bevelamount)
#_reconfigureTabset
set _tabsetReconfigure true
}
}
# ----------------------------------------------------------------------
# OPTION -raiseselect
#
# Sets whether to raise selected tabs
# ----------------------------------------------------------------------
itcl::configbody iwidgets::Tabnotebook::raiseselect {
if {$itk_option(-raiseselect) != {}} {
$itk_component(tabset) \
configure -raiseselect $itk_option(-raiseselect)
#_reconfigureTabset
set _tabsetReconfigure true
}
}
# ----------------------------------------------------------------------
# OPTION -auto
#
# Determines whether pages are automatically unpacked and
# packed when pages get selected.
# ----------------------------------------------------------------------
itcl::configbody iwidgets::Tabnotebook::auto {
if {$itk_option(-auto) != {}} {
$itk_component(notebook) configure -auto $itk_option(-auto)
}
}
# ----------------------------------------------------------------------
# OPTION -start
# ----------------------------------------------------------------------
itcl::configbody iwidgets::Tabnotebook::start {
if {$itk_option(-start) != {}} {
$itk_component(tabset) configure \
-start $itk_option(-start)
#_reconfigureTabset
set _tabsetReconfigure true
}
}
# ----------------------------------------------------------------------
# OPTION -padx
#
# Specifies a non-negative value indicating how much extra space
# to request for a tab around its label in the X-direction.
# When computing how large a window it needs, the tab will add
# this amount to the width it would normally need The tab will
# end up with extra internal space to the left and right of its
# text label. This value may have any of the forms acceptable
# to Tk_GetPixels.
# ----------------------------------------------------------------------
itcl::configbody iwidgets::Tabnotebook::padx {
if {$itk_option(-padx) != {}} {
$itk_component(tabset) configure -padx $itk_option(-padx)
#_reconfigureTabset
set _tabsetReconfigure true
}
}
# ----------------------------------------------------------------------
# OPTION -pady
#
# Specifies a non-negative value indicating how much extra space to
# request for a tab around its label in the Y-direction. When computing
# how large a window it needs, the tab will add this amount to the
# height it would normally need The tab will end up with extra internal
# space to the top and bot tom of its text label. This value may have
# any of the forms acceptable to Tk_GetPixels.
# ----------------------------------------------------------------------
itcl::configbody iwidgets::Tabnotebook::pady {
if {$itk_option(-pady) != {}} {
$itk_component(tabset) configure -pady $itk_option(-pady)
#_reconfigureTabset
set _tabsetReconfigure true
}
}
# ----------------------------------------------------------------------
# OPTION -gap
#
# Specifies the amount of pixel space to place between each tab.
# Value may be any pixel offset value. In addition, a special keyword
# 'overlap' can be used as the value to achieve a standard overlap of
# tabs. This value may have any of the forms acceptable to Tk_GetPixels.
# ----------------------------------------------------------------------
itcl::configbody iwidgets::Tabnotebook::gap {
if {$itk_option(-gap) != {}} {
$itk_component(tabset) configure -gap $itk_option(-gap)
#_reconfigureTabset
set _tabsetReconfigure true
}
}
# ----------------------------------------------------------------------
# OPTION -angle
#
# Specifes the angle of slope from the inner edge to the outer edge
# of the tab. An angle of 0 specifies square tabs. Valid ranges are
# 0 to 45 degrees inclusive. Default is 15 degrees. If tabPos is
# e or w, this option is ignored.
# ----------------------------------------------------------------------
itcl::configbody iwidgets::Tabnotebook::angle {
if {$itk_option(-angle) != {}} {
$itk_component(tabset) configure -angle $itk_option(-angle)
#_reconfigureTabset
set _tabsetReconfigure true
}
}
# ----------------------------------------------------------------------
# OPTION -tabpos
#
# Specifies the location of the set of tabs in relation to the
# Notebook area. Must be n, s, e, or w. Defaults to s.
# ----------------------------------------------------------------------
itcl::configbody iwidgets::Tabnotebook::tabpos {
if {$itk_option(-tabpos) != {}} {
set _tabPos $itk_option(-tabpos)
$itk_component(tabset) configure \
-tabpos $itk_option(-tabpos)
pack forget $itk_component(canvas)
pack forget $itk_component(tabset)
pack forget $itk_component(notebook)
_pack $_tabPos
}
}
# -------------------------------------------------------------
# METHOD: configure ?<option>? ?<value> <option> <value>...?
#
# Acts as an addendum to the itk::Widget::configure method.
#
# Checks the _recomputeBorder flag and the _tabsetReconfigure to
# determine what work has been batched to after the configure
# -------------------------------------------------------------
itcl::body iwidgets::Tabnotebook::configure { args } {
set result [eval itk::Archetype::configure $args]
# check for flags then do update...
if { $_borderRecompute == "true" } {
_recomputeBorder
set _borderRecompute false
}
if { $_tabsetReconfigure == "true" } {
_reconfigureTabset
set _tabsetReconfigure false
}
return $result
}
# -------------------------------------------------------------
# METHOD: add ?<option> <value>...?
#
# Creates a page and appends it to the list of pages.
# processes pageconfigure for the page added.
#
# Returns the page's childsite frame
# -------------------------------------------------------------
itcl::body iwidgets::Tabnotebook::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 { [expr {$len % 2}] } {
error "value for \"[lindex $args [expr {$len - 1}]]\" missing"
}
# pick out the notebook args
set nbArgs [eval _getArgs [list $_nbOptList] $args]
set pageName [eval $itk_component(notebook) add $nbArgs]
# pick out the tabset args
set tsArgs [eval _getArgs [list $_tsOptList] $args]
eval $itk_component(tabset) add $tsArgs
set page [index end]
bind $pageName <Configure> \
[itcl::code $this _pageReconfigure $pageName $page %w %h]
return $pageName
}
# -------------------------------------------------------------
# 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::Tabnotebook::childsite { args } {
return [eval $itk_component(notebook) childsite $args]
}
# -------------------------------------------------------------
# METHOD: delete <index1> ?<index2>?
#
# Deletes a page or range of pages from the notebook
# -------------------------------------------------------------
itcl::body iwidgets::Tabnotebook::delete { args } {
eval $itk_component(notebook) delete $args
eval $itk_component(tabset) delete $args
}
# -------------------------------------------------------------
# METHOD: index <index>
#
# Given an index identifier returns the numeric index of the page
# -------------------------------------------------------------
itcl::body iwidgets::Tabnotebook::index { args } {
return [eval $itk_component(notebook) index $args]
}
# -------------------------------------------------------------
# METHOD: insert <index> ?<option> <value>...?
#
# Inserts a page before a index. The before page may
# be specified as a label or a page position.
#
# Note that since we use eval to preserve the $args list,
# we must use list around $index to keep it together as a unit
#
# Returns the name of the page's child site
# -------------------------------------------------------------
itcl::body iwidgets::Tabnotebook::insert { index args } {
# pick out the notebook args
set nbArgs [eval _getArgs [list $_nbOptList] $args]
set pageName [eval $itk_component(notebook) insert [list $index] $nbArgs]
# pick out the tabset args
set tsArgs [eval _getArgs [list $_tsOptList] $args]
eval $itk_component(tabset) insert [list $index] $tsArgs
return $pageName
}
# -------------------------------------------------------------
# METHOD: prev
#
# Selects the previous page. Wraps at first back to last page.
# -------------------------------------------------------------
itcl::body iwidgets::Tabnotebook::prev { } {
eval $itk_component(notebook) prev
eval $itk_component(tabset) prev
}
# -------------------------------------------------------------
# METHOD: next
#
# Selects the next page. Wraps at last back to first page.
# -------------------------------------------------------------
itcl::body iwidgets::Tabnotebook::next { } {
eval $itk_component(notebook) next
eval $itk_component(tabset) 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::Tabnotebook::pageconfigure { index args } {
set nbArgs [eval _getArgs [list $_nbOptList] $args]
set tsArgs [eval _getArgs [list $_tsOptList] $args]
set len [llength $args]
switch $len {
0 {
# Here is the case where they just want to query options
set nbConfig \
[eval $itk_component(notebook) pageconfigure $index $nbArgs]
set tsConfig \
[eval $itk_component(tabset) tabconfigure $index $tsArgs]
#
# BUG: this currently just concatenates a page and a tab's
# config lists together... We should bias to the Page
# since this is what we are using as primary when both??
#
# a pageconfigure index -background will return something like:
# -background background Background #9D008FF583C1 gray70 \
# -background background background white gray 70
#
return [concat $nbConfig $tsConfig]
}
1 {
# Here is the case where they are asking for only one
# one options value... need to figure out which one
# (page or tab) can service this. Then only return
# that one's result.
if { [llength $nbArgs] != 0 } {
return [eval $itk_component(notebook) \
pageconfigure $index $nbArgs]
} elseif { [llength $tsArgs] != 0 } {
return [eval $itk_component(tabset) \
tabconfigure $index $tsArgs]
} else {
error "unknown option \"$args\""
}
}
default {
# pick out the notebook args
set nbConfig \
[eval $itk_component(notebook) \
pageconfigure [list $index] $nbArgs]
# pick out the tabset args
set tsConfig \
[eval $itk_component(tabset) \
tabconfigure [list $index] $tsArgs]
return ""
#return [concat $nbConfig $tsConfig]
}
}
}
# -------------------------------------------------------------
# METHOD: select index
#
# Select a page by index
# -------------------------------------------------------------
itcl::body iwidgets::Tabnotebook::select { index } {
$itk_component(notebook) select $index
$itk_component(tabset) select $index
}
# -------------------------------------------------------------
# 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::Tabnotebook::view { args } {
eval $itk_component(notebook) view $args
$itk_component(tabset) select [index select]
}
# -------------------------------------------------------------
# PRIVATE METHOD: _getArgs
#
# Given an optList returned from a configure on an object and
# given a candidate argument list, peruse throught the optList
# and build a new argument list with only those options found
# in optList.
#
# This is used by the add, insert, and pageconfigure methods.
# It is useful for a container kind of class like Tabnotebook
# to be smart about args it gets for its concept of a "page"
# which is actually a Notebook Page and a Tabset Tab.
#
# -------------------------------------------------------------
itcl::body iwidgets::Tabnotebook::_getArgs { optList args } {
set len [llength $args]
set retArgs {}
for {set i 0} {$i < $len} {incr i} {
# get the option for this pair
set opt [lindex $args $i]
# move ahead to the value
incr i
# option exists!
if { [lsearch -exact $optList $opt] != -1} {
lappend retArgs $opt
if {$i < [llength $args]} {
lappend retArgs [lindex $args $i]
}
# option does not exist
}
}
return $retArgs
}
# -------------------------------------------------------------
# PROTECTED METHOD: _reconfigureTabset
#
# bound to the tabset reconfigure... We call our canvas
# reconfigure as if the canvas resized, it then configures
# the tabset correctly.
# -------------------------------------------------------------
itcl::body iwidgets::Tabnotebook::_reconfigureTabset { } {
_canvasReconfigure $_canvasWidth $_canvasHeight
}
# -------------------------------------------------------------
# PROTECTED METHOD: _canvasReconfigure
#
# bound to window Reconfigure event of the canvas
# keeps the tabset area stretched in its major dimension.
# -------------------------------------------------------------
itcl::body iwidgets::Tabnotebook::_canvasReconfigure { wid hgt } {
if { $_tabPos == "n" || $_tabPos == "s" } {
$itk_component(tabset) configure -width $wid
} else {
$itk_component(tabset) configure -height $hgt
}
set _canvasWidth $wid
set _canvasHeight $hgt
_redrawBorder $wid $hgt
}
# -------------------------------------------------------------
# PRIVATE METHOD: _redrawBorder
#
# called by methods when the packing changes, borderwidths, etc.
# and height
# -------------------------------------------------------------
itcl::body iwidgets::Tabnotebook::_redrawBorder { wid hgt } {
# Get the top of the Notebook area...
set nbTop [winfo y $itk_component(notebook)]
set canTop [expr {$nbTop - $itk_option(-borderwidth)}]
$itk_component(canvas) delete BORDER
if { $itk_option(-borderwidth) > 0 } {
# For south, east, and west -- draw the top/north edge
if { $_tabPos != "n" } {
$itk_component(canvas) create line \
[expr {floor(0 + ($itk_option(-borderwidth)/2.0))}] \
[expr {floor(0 + ($itk_option(-borderwidth)/2.0))}] \
$wid \
[expr {floor(0 + ($itk_option(-borderwidth)/2.0))}] \
-width $itk_option(-borderwidth) \
-fill [iwidgets::colors::topShadow $itk_option(-background)] \
-tags BORDER
}
# For north, east, and west -- draw the bottom/south edge
if { $_tabPos != "s" } {
$itk_component(canvas) create line \
[expr {floor(0 + ($itk_option(-borderwidth)/2.0))}] \
[expr {floor($hgt - ($itk_option(-borderwidth)/2.0))}] \
[expr {floor($wid - ($itk_option(-borderwidth)/2.0))}] \
[expr {floor($hgt - ($itk_option(-borderwidth)/2.0))}] \
-width $itk_option(-borderwidth) \
-fill [iwidgets::colors::bottomShadow $itk_option(-background)] \
-tags BORDER
}
# For north, south, and east -- draw the left/west edge
if { $_tabPos != "w" } {
$itk_component(canvas) create line \
[expr {floor(0 + ($itk_option(-borderwidth)/2.0))}] \
0 \
[expr {floor(0 + ($itk_option(-borderwidth)/2.0))}] \
$hgt \
-width $itk_option(-borderwidth) \
-fill [iwidgets::colors::topShadow $itk_option(-background)] \
-tags BORDER
}
# For north, south, and west -- draw the right/east edge
if { $_tabPos != "e" } {
$itk_component(canvas) create line \
[expr {floor($wid - ($itk_option(-borderwidth)/2.0))}] \
[expr {floor(0 + ($itk_option(-borderwidth)/2.0))}] \
[expr {floor($wid - ($itk_option(-borderwidth)/2.0))}] \
$hgt \
-width $itk_option(-borderwidth) \
-fill [iwidgets::colors::bottomShadow $itk_option(-background)] \
-tags BORDER
}
}
}
# -------------------------------------------------------------
# PRIVATE METHOD: _recomputeBorder
#
# Based on current width and height of our canvas, repacks
# the notebook with padding for borderwidth, and calls
# redraw border method
# -------------------------------------------------------------
itcl::body iwidgets::Tabnotebook::_recomputeBorder { } {
set wid [winfo width $itk_component(canvas)]
set hgt [winfo height $itk_component(canvas)]
_pack $_tabPos
_redrawBorder $wid $hgt
}
# -------------------------------------------------------------
# PROTECTED METHOD: _pageReconfigure
#
# This method will eventually reconfigure the tab notebook's
# notebook area to contain the resized child site
# -------------------------------------------------------------
itcl::body iwidgets::Tabnotebook::_pageReconfigure { pageName page wid hgt } {
}
# -------------------------------------------------------------
# PRIVATE METHOD: _pack
#
# This method packs the notebook and tabset correctly according
# to the current $tabPos
# -------------------------------------------------------------
itcl::body iwidgets::Tabnotebook::_pack { tabPos } {
pack $itk_component(canvas) -fill both -expand yes
pack propagate $itk_component(canvas) no
switch $tabPos {
n {
# north
pack $itk_component(tabset) \
-anchor nw \
-fill x \
-expand no
pack $itk_component(notebook) \
-fill both \
-expand yes \
-padx $itk_option(-borderwidth) \
-pady $itk_option(-borderwidth) \
-side bottom
}
s {
# south
pack $itk_component(notebook) \
-anchor nw \
-fill both \
-expand yes \
-padx $itk_option(-borderwidth) \
-pady $itk_option(-borderwidth)
pack $itk_component(tabset) \
-side left \
-fill x \
-expand yes
}
w {
# west
pack $itk_component(tabset) \
-anchor nw \
-side left \
-fill y \
-expand no
pack $itk_component(notebook) \
-anchor nw \
-side left \
-fill both \
-expand yes \
-padx $itk_option(-borderwidth) \
-pady $itk_option(-borderwidth)
}
e {
# east
pack $itk_component(notebook) \
-side left \
-anchor nw \
-fill both \
-expand yes \
-padx $itk_option(-borderwidth) \
-pady $itk_option(-borderwidth)
pack $itk_component(tabset) \
-fill y \
-expand yes
}
}
set wid [winfo width $itk_component(canvas)]
set hgt [winfo height $itk_component(canvas)]
_redrawBorder $wid $hgt
}
# -------------------------------------------------------------
# PRIVATE METHOD: _resize
#
# This method added by csmith, 5/1/01, to fix a bug with the
# geometry of the tabnotebook. The hull component's geometry
# was not being updated properly on <Configure> events.
# -------------------------------------------------------------
itcl::body iwidgets::Tabnotebook::_resize {newWidth_ newHeight_} {
_canvasReconfigure $newWidth_ $newHeight_
# csmith: 9/14/01 - Commenting out the following code due to
# SF ticket 461471, which is a dup of the original 452803. Since I
# can't remember the exact problem surrounding the need to add
# the _resize method, I'm going to do an undo here, leaving the
# code for future reference if needed. Should the original problem
# arise again I will reinvestigate the need for _resize.
#
# after idle \
# "$this component hull configure -width $newWidth_ -height $newHeight_"
}