You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
1106 lines
37 KiB
Plaintext
1106 lines
37 KiB
Plaintext
#
|
|
# 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_"
|
|
}
|