OpenCores
URL https://opencores.org/ocsvn/or1k/or1k/trunk

Subversion Repositories or1k

[/] [or1k/] [trunk/] [insight/] [itcl/] [iwidgets3.0.0/] [generic/] [tabnotebook.itk] - Rev 1765

Compare with Previous | Blame | View Log

#
# 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                 EMAIL: bscott@spd.dsccc.com
#
#  @(#) $Id: tabnotebook.itk,v 1.1.1.1 2002-01-16 10:24:50 markom 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
# ------------------------------------------------------------------
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 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
# ----------------------------------------------------------------------
body iwidgets::Tabnotebook::constructor {args} {
    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> \
            [code $this _canvasReconfigure %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 [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> \
            [code $this _reconfigureTabset]
    
    _pack $_tabPos
    
}

proc ::iwidgets::tabnotebook {pathName args} {
    uplevel ::iwidgets::Tabnotebook $pathName $args
}


# -------------------------------------------------------------
# DESTRUCTOR: destroy the Tabnotebook
# -------------------------------------------------------------
body iwidgets::Tabnotebook::destructor {} {
}

# ----------------------------------------------------------------------
# OPTION -borderwidth
#
# Thickness of Notebook Border
# ----------------------------------------------------------------------
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
# ----------------------------------------------------------------------
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.
# ----------------------------------------------------------------------
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.
# ----------------------------------------------------------------------
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.
# ----------------------------------------------------------------------
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)
# ----------------------------------------------------------------------
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
# ----------------------------------------------------------------------
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
# ----------------------------------------------------------------------
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).
# ----------------------------------------------------------------------
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).
# ----------------------------------------------------------------------
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.
# ----------------------------------------------------------------------
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.
# ----------------------------------------------------------------------
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.
# ----------------------------------------------------------------------
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
# ----------------------------------------------------------------------
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)
# ----------------------------------------------------------------------
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.
# ----------------------------------------------------------------------
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
# ----------------------------------------------------------------------
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.
# ----------------------------------------------------------------------
configbody iwidgets::Tabnotebook::auto {
    if {$itk_option(-auto) != {}} {
        $itk_component(notebook) configure -auto $itk_option(-auto)
    }
}

# ----------------------------------------------------------------------
# OPTION -start
# ----------------------------------------------------------------------
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.
# ----------------------------------------------------------------------
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.
# ----------------------------------------------------------------------
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.
# ----------------------------------------------------------------------
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.
# ----------------------------------------------------------------------
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.
# ----------------------------------------------------------------------
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
# -------------------------------------------------------------
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
# -------------------------------------------------------------
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> \
            [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
# -------------------------------------------------------------
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
# -------------------------------------------------------------
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
# -------------------------------------------------------------
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
# -------------------------------------------------------------
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.
# -------------------------------------------------------------
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.
# -------------------------------------------------------------
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.
# -------------------------------------------------------------
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
# -------------------------------------------------------------
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
#
# -------------------------------------------------------------
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.
#
# -------------------------------------------------------------
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.
# -------------------------------------------------------------
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.
# -------------------------------------------------------------
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
# -------------------------------------------------------------
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 
# -------------------------------------------------------------
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
# -------------------------------------------------------------
body iwidgets::Tabnotebook::_pageReconfigure { pageName page wid hgt } {
    
}

# -------------------------------------------------------------
# PRIVATE METHOD: _pack
#
# This method packs the notebook and tabset correctly according
# to the current $tabPos
# -------------------------------------------------------------
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
}

Compare with Previous | Blame | View Log

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.