home *** CD-ROM | disk | FTP | other *** search
- #
- # Labeledframe
- # ----------------------------------------------------------------------
- # Implements a hull frame with a grooved relief, a label, and a
- # frame childsite.
- #
- # The frame childsite can be filled with any widget via a derived class
- # or though the use of the childsite method. This class was designed
- # to be a general purpose base class for supporting the combination of
- # a labeled frame and a childsite. The options include the ability to
- # position the label at configurable locations within the grooved relief
- # of the hull frame, and control the display of the label.
- #
- # To following demonstrates the different values which the "-labelpos"
- # option may be set to and the resulting layout of the label when
- # one executes the following command with "-labeltext" set to "LABEL":
- #
- # example:
- # labeledframe .w -labeltext LABEL -labelpos <ne,n,nw,se,s,sw,en,e,es,wn,s,ws>
- #
- # ne n nw se s sw
- #
- # *LABEL**** **LABEL** ****LABEL* ********** ********* **********
- # * * * * * * * * * * * *
- # * * * * * * * * * * * *
- # * * * * * * * * * * * *
- # ********** ********* ********** *LABEL**** **LABEL** ****LABEL*
- #
- # en e es wn s ws
- #
- # ********** ********* ********* ********* ********* **********
- # * * * * * * * * * * * *
- # L * * * * * * L * * * *
- # A * L * * * * A * L * L
- # B * A * L * * B * A * A
- # E * B * A * * E * B * B
- # L * E * B * * L * E * E
- # * * L * E * * * * L * L
- # * * * * L * * * * * * *
- # ********** ********** ********* ********** ********* **********
- #
- # ----------------------------------------------------------------------
- # AUTHOR: John A. Tucker EMAIL: jatucker@spd.dsccc.com
- #
- # ======================================================================
- # Copyright (c) 1997 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 *Labeledframe.labelMargin 10 widgetDefault
- option add *Labeledframe.labelFont \
- "-Adobe-Helvetica-Bold-R-Normal--*-120-*-*-*-*-*-*" widgetDefault
- option add *Labeledframe.labelPos n widgetDefault
- option add *Labeledframe.borderWidth 2 widgetDefault
- option add *Labeledframe.relief groove widgetDefault
-
-
- #
- # Usual options.
- #
- itk::usual Labeledframe {
- keep -background -cursor -labelfont -foreground
- }
-
- itcl::class iwidgets::Labeledframe {
-
- inherit itk::Archetype
-
- itk_option define -ipadx iPadX IPad 0
- itk_option define -ipady iPadY IPad 0
-
- itk_option define -labelmargin labelMargin LabelMargin 10
- itk_option define -labelpos labelPos LabelPos n
-
- constructor {args} {}
- destructor {}
-
- #
- # Public methods
- #
- public method childsite {}
-
- #
- # Protected methods
- #
- protected {
- method _positionLabel {{when later}}
- method _collapseMargin {}
- method _setMarginThickness {value}
- method smt {value} { _setMarginThickness $value }
- }
-
- #
- # Private methods/data
- #
- private {
- proc _initTable {}
-
- variable _reposition "" ;# non-null => _positionLabel pending
- variable itk_hull ""
-
- common _LAYOUT_TABLE
- }
- }
-
- #
- # Provide a lowercased access method for the Labeledframe class.
- #
- proc ::iwidgets::labeledframe {pathName args} {
- uplevel ::iwidgets::Labeledframe $pathName $args
- }
-
- # -----------------------------------------------------------------------------
- # CONSTRUCTOR
- # -----------------------------------------------------------------------------
- itcl::body iwidgets::Labeledframe::constructor { args } {
- #
- # Create a window with the same name as this object
- #
- set itk_hull [namespace tail $this]
- set itk_interior $itk_hull
-
- itk_component add hull {
- frame $itk_hull \
- -relief groove \
- -class [namespace tail [info class]]
- } {
- keep -background -cursor -relief -borderwidth
- rename -highlightbackground -background background Background
- rename -highlightcolor -background background Background
- }
- bind itk-delete-$itk_hull <Destroy> "itcl::delete object $this"
-
- set tags [bindtags $itk_hull]
- bindtags $itk_hull [linsert $tags 0 itk-delete-$itk_hull]
-
- #
- # Create the childsite frame window
- # _______
- # |_____|
- # |_|X|_|
- # |_____|
- #
- itk_component add childsite {
- frame $itk_interior.childsite -highlightthickness 0 -bd 0
- }
-
- #
- # Create the label to be positioned within the grooved relief
- # of the hull frame.
- #
- itk_component add label {
- label $itk_interior.label -highlightthickness 0 -bd 0
- } {
- usual
- rename -bitmap -labelbitmap labelBitmap Bitmap
- rename -font -labelfont labelFont Font
- rename -image -labelimage labelImage Image
- rename -text -labeltext labelText Text
- rename -textvariable -labelvariable labelVariable Variable
- ignore -highlightthickness -highlightcolor
- }
-
- grid $itk_component(childsite) -row 1 -column 1 -sticky nsew
- grid columnconfigure $itk_interior 1 -weight 1
- grid rowconfigure $itk_interior 1 -weight 1
-
- bind $itk_component(label) <Configure> +[itcl::code $this _positionLabel]
-
- #
- # Initialize the class array of layout configuration options. Since
- # this is a one time only thing.
- #
- _initTable
-
- eval itk_initialize $args
-
- #
- # When idle, position the label.
- #
- _positionLabel
- }
-
- # -----------------------------------------------------------------------------
- # DESTRUCTOR
- # -----------------------------------------------------------------------------
- itcl::body iwidgets::Labeledframe::destructor {} {
-
- if {$_reposition != ""} {
- after cancel $_reposition
- }
-
- if {[winfo exists $itk_hull]} {
- set tags [bindtags $itk_hull]
- set i [lsearch $tags itk-delete-$itk_hull]
- if {$i >= 0} {
- bindtags $itk_hull [lreplace $tags $i $i]
- }
- destroy $itk_hull
- }
- }
-
- # -----------------------------------------------------------------------------
- # OPTIONS
- # -----------------------------------------------------------------------------
-
- # ------------------------------------------------------------------
- # OPTION: -ipadx
- #
- # Specifies the width of the horizontal gap from the border to the
- # the child site.
- # ------------------------------------------------------------------
- itcl::configbody iwidgets::Labeledframe::ipadx {
- grid configure $itk_component(childsite) -padx $itk_option(-ipadx)
- _positionLabel
- }
-
- # ------------------------------------------------------------------
- # OPTION: -ipady
- #
- # Specifies the width of the vertical gap from the border to the
- # the child site.
- # ------------------------------------------------------------------
- itcl::configbody iwidgets::Labeledframe::ipady {
- grid configure $itk_component(childsite) -pady $itk_option(-ipady)
- _positionLabel
- }
-
- # -----------------------------------------------------------------------------
- # OPTION: -labelmargin
- #
- # Set the margin of the most adjacent side of the label to the hull
- # relief.
- # ----------------------------------------------------------------------------
- itcl::configbody iwidgets::Labeledframe::labelmargin {
- _positionLabel
- }
-
- # -----------------------------------------------------------------------------
- # OPTION: -labelpos
- #
- # Set the position of the label within the relief of the hull frame
- # widget.
- # ----------------------------------------------------------------------------
- itcl::configbody iwidgets::Labeledframe::labelpos {
- _positionLabel
- }
-
- # -----------------------------------------------------------------------------
- # PROCS
- # -----------------------------------------------------------------------------
-
- # -----------------------------------------------------------------------------
- # PRIVATE PROC: _initTable
- #
- # Initializes the _LAYOUT_TABLE common variable of the Labeledframe
- # class. The initialization is performed in its own proc ( as opposed
- # to in the class definition ) so that the initialization occurs only
- # once.
- #
- # _LAYOUT_TABLE common array description:
- # Provides a table of the configuration option values
- # used to place the label widget within the grooved relief of the hull
- # frame for each of the 12 possible "-labelpos" values.
- #
- # Each of the 12 rows is layed out as follows:
- # {"-relx" "-rely" <rowconfigure|columnconfigure> <row/column number>}
- # -----------------------------------------------------------------------------
- itcl::body iwidgets::Labeledframe::_initTable {} {
- array set _LAYOUT_TABLE {
- nw-relx 0.0 nw-rely 0.0 nw-wrap 0 nw-conf rowconfigure nw-num 0
- n-relx 0.5 n-rely 0.0 n-wrap 0 n-conf rowconfigure n-num 0
- ne-relx 1.0 ne-rely 0.0 ne-wrap 0 ne-conf rowconfigure ne-num 0
-
- sw-relx 0.0 sw-rely 1.0 sw-wrap 0 sw-conf rowconfigure sw-num 2
- s-relx 0.5 s-rely 1.0 s-wrap 0 s-conf rowconfigure s-num 2
- se-relx 1.0 se-rely 1.0 se-wrap 0 se-conf rowconfigure se-num 2
-
- en-relx 1.0 en-rely 0.0 en-wrap 1 en-conf columnconfigure en-num 2
- e-relx 1.0 e-rely 0.5 e-wrap 1 e-conf columnconfigure e-num 2
- es-relx 1.0 es-rely 1.0 es-wrap 1 es-conf columnconfigure es-num 2
-
- wn-relx 0.0 wn-rely 0.0 wn-wrap 1 wn-conf columnconfigure wn-num 0
- w-relx 0.0 w-rely 0.5 w-wrap 1 w-conf columnconfigure w-num 0
- ws-relx 0.0 ws-rely 1.0 ws-wrap 1 ws-conf columnconfigure ws-num 0
- }
-
- #
- # Since this is a one time only thing, we'll redefine the proc to be empty
- # afterwards so it only happens once.
- #
- # NOTE: Be careful to use the "body" command, or the proc will get lost!
- #
- itcl::body ::iwidgets::Labeledframe::_initTable {} {}
- }
-
- # -----------------------------------------------------------------------------
- # METHODS
- # -----------------------------------------------------------------------------
-
- # -----------------------------------------------------------------------------
- # PUBLIC METHOD:: childsite
- #
- # -----------------------------------------------------------------------------
- itcl::body iwidgets::Labeledframe::childsite {} {
- return $itk_component(childsite)
- }
-
- # -----------------------------------------------------------------------------
- # PROTECTED METHOD: _positionLabel ?when?
- #
- # Places the label in the relief of the hull. If "when" is "now", the
- # change is applied immediately. If it is "later" or it is not
- # specified, then the change is applied later, when the application
- # is idle.
- # -----------------------------------------------------------------------------
- itcl::body iwidgets::Labeledframe::_positionLabel {{when later}} {
-
- if {$when == "later"} {
- if {$_reposition == ""} {
- set _reposition [after idle [itcl::code $this _positionLabel now]]
- }
- return
- }
-
- set pos $itk_option(-labelpos)
-
- #
- # If there is not an entry for the "relx" value associated with
- # the given "-labelpos" option value, then it invalid.
- #
- if { [catch {set relx $_LAYOUT_TABLE($pos-relx)}] } {
- error "bad labelpos option\"$itk_option(-labelpos)\": should be\
- nw, n, ne, sw, s, se, en, e, es, wn, w, or ws"
- }
-
- update idletasks
- $itk_component(label) configure -wraplength $_LAYOUT_TABLE($pos-wrap)
- set labelWidth [winfo reqwidth $itk_component(label)]
- set labelHeight [winfo reqheight $itk_component(label)]
- set borderwidth $itk_option(-borderwidth)
- set margin $itk_option(-labelmargin)
-
- switch $pos {
- nw {
- set labelThickness $labelHeight
- set minsize [expr {$labelThickness/2.0}]
- set xPos [expr {$minsize+$borderwidth+$margin}]
- set yPos -$minsize
- }
- n {
- set labelThickness $labelHeight
- set minsize [expr {$labelThickness/2.0}]
- set xPos [expr {-$labelWidth/2.0}]
- set yPos -$minsize
- }
- ne {
- set labelThickness $labelHeight
- set minsize [expr {$labelThickness/2.0}]
- set xPos [expr {-($minsize+$borderwidth+$margin+$labelWidth)}]
- set yPos -$minsize
- }
-
- sw {
- set labelThickness $labelHeight
- set minsize [expr {$labelThickness/2.0}]
- set xPos [expr {$minsize+$borderwidth+$margin}]
- set yPos -$minsize
- }
- s {
- set labelThickness $labelHeight
- set minsize [expr {$labelThickness/2.0}]
- set xPos [expr {-$labelWidth/2.0}]
- set yPos [expr {-$labelHeight/2.0}]
- }
- se {
- set labelThickness $labelHeight
- set minsize [expr {$labelThickness/2.0}]
- set xPos [expr {-($minsize+$borderwidth+$margin+$labelWidth)}]
- set yPos [expr {-$labelHeight/2.0}]
- }
-
- wn {
- set labelThickness $labelWidth
- set minsize [expr {$labelThickness/2.0}]
- set xPos -$minsize
- set yPos [expr {$minsize+$margin+$borderwidth}]
- }
- w {
- set labelThickness $labelWidth
- set minsize [expr {$labelThickness/2.0}]
- set xPos -$minsize
- set yPos [expr {-($labelHeight/2.0)}]
- }
- ws {
- set labelThickness $labelWidth
- set minsize [expr {$labelThickness/2.0}]
- set xPos -$minsize
- set yPos [expr {-($minsize+$borderwidth+$margin+$labelHeight)}]
- }
-
- en {
- set labelThickness $labelWidth
- set minsize [expr {$labelThickness/2.0}]
- set xPos -$minsize
- set yPos [expr {$minsize+$borderwidth+$margin}]
- }
- e {
- set labelThickness $labelWidth
- set minsize [expr {$labelThickness/2.0}]
- set xPos -$minsize
- set yPos [expr {-($labelHeight/2.0)}]
- }
- es {
- set labelThickness $labelWidth
- set minsize [expr {$labelThickness/2.0}]
- set xPos -$minsize
- set yPos [expr {-($minsize+$borderwidth+$margin+$labelHeight)}]
- }
- }
- _setMarginThickness $minsize
-
- place $itk_component(label) \
- -relx $_LAYOUT_TABLE($pos-relx) -x $xPos \
- -rely $_LAYOUT_TABLE($pos-rely) -y $yPos \
- -anchor nw
-
- set what $_LAYOUT_TABLE($pos-conf)
- set number $_LAYOUT_TABLE($pos-num)
-
- grid $what $itk_interior $number -minsize $minsize
-
- set _reposition ""
- }
-
- # -----------------------------------------------------------------------------
- # PROTECTED METHOD: _collapseMargin
- #
- # Resets the "-minsize" of all rows and columns of the hull's grid
- # used to set the label margin to 0
- # -----------------------------------------------------------------------------
- itcl::body iwidgets::Labeledframe::_collapseMargin {} {
- grid columnconfigure $itk_interior 0 -minsize 0
- grid columnconfigure $itk_interior 2 -minsize 0
- grid rowconfigure $itk_interior 0 -minsize 0
- grid rowconfigure $itk_interior 2 -minsize 0
- }
-
- # -----------------------------------------------------------------------------
- # PROTECTED METHOD: _setMarginThickness
- #
- # Set the margin thickness ( i.e. the hidden "-highlightthickness"
- # of the hull ) to the input value.
- #
- # The "-highlightthickness" option of the hull frame is not intended to be
- # configured by users of this class, but does need to be configured to properly
- # place the label whenever the label is configured.
- #
- # Therefore, since I can't find a better way at this time, I achieve this
- # configuration by: adding the "-highlightthickness" option back into
- # the hull frame; configuring the "-highlightthickness" option to properly
- # place the label; and then remove the "-highlightthickness" option from the
- # hull.
- #
- # This way the option is not visible or configurable without some hacking.
- #
- # -----------------------------------------------------------------------------
- itcl::body iwidgets::Labeledframe::_setMarginThickness {value} {
- itk_option add hull.highlightthickness
- $itk_component(hull) configure -highlightthickness $value
- itk_option remove hull.highlightthickness
- }
-
-
-