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

Subversion Repositories or1k

[/] [or1k/] [trunk/] [insight/] [itcl/] [iwidgets3.0.0/] [generic/] [labeledframe.itk] - Rev 578

Go to most recent revision | Compare with Previous | Blame | View Log

#
# 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.labelBorderWidth    2      widgetDefault
option add *Labeledframe.labelRelief         groove widgetDefault


#
# Usual options.
#
itk::usual Labeledframe {
    keep -background -cursor -labelfont -foreground -labelrelief -labelborderwidth
}

class iwidgets::Labeledframe {

  inherit itk::Widget

  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
  itk_option define -labeltext labelText LabelText ""

  constructor {args} {}
  destructor {}

  #
  # Public methods
  #
  public method childsite {}
  public method clientHandlesConfigure {{yes 1}}

  #
  # Private methods
  #
  private {
    method smt {value} { _setMarginThickness $value }
    method _positionLabel {{when later}}
    method _collapseMargin {}
    method _setMarginThickness {value}

    proc _initTable {}

    variable _reposition ""  ;# non-null => _positionLabel pending
    variable dontUpdate 0

    common _LAYOUT_TABLE 
  }
}

#
# Provide a lowercased access method for the Labeledframe class.
# 
proc ::iwidgets::labeledframe {pathName args} {
    uplevel ::iwidgets::Labeledframe $pathName $args
}

# -----------------------------------------------------------------------------
#                        CONSTRUCTOR
# -----------------------------------------------------------------------------
body iwidgets::Labeledframe::constructor { args } {
  #
  #  Create a window with the same name as this object
  #

  itk_component add labelFrame {
    frame $itk_interior.lf \
          -relief groove \
          -class [namespace tail [info class]]
  } {
    keep -background -cursor 
    rename -relief -labelrelief labelRelief LabelRelief 
    rename -borderwidth -labelborderwidth labelBorderWidth LabelBorderWidth
    rename -highlightbackground -background background Background
    rename -highlightcolor -background background Background
  }

  #
  # Create the childsite frame window
  # _______
  # |_____|
  # |_|X|_|
  # |_____|
  #
  itk_component add childsite {
    frame $itk_component(labelFrame).childsite -highlightthickness 0 -bd 0
  } 

  #
  # Create the label to be positioned within the grooved relief
  # of the labelFrame frame.
  #
  itk_component add label {
    label $itk_component(labelFrame).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 -text
  }

  grid $itk_component(childsite) -row 1 -column 1 -sticky nsew
  grid columnconfigure $itk_component(labelFrame) 1 -weight 1
  grid rowconfigure    $itk_component(labelFrame) 1 -weight 1

  lappend after_script [code $this _positionLabel]
  bind $itk_component(label) <Configure> +[code $this _positionLabel]

  pack $itk_component(labelFrame) -fill both -expand 1

  #
  # 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
# -----------------------------------------------------------------------------
body iwidgets::Labeledframe::destructor {} {
  debug "In Labeledframe destructor for $this, reposition is $_reposition"
  if {$_reposition != ""} {
    debug "Canceling reposition $_reposition for $this"
    after cancel $_reposition
    set _reposition DESTRUCTOR
  }
}

# -----------------------------------------------------------------------------
#                             OPTIONS
# -----------------------------------------------------------------------------

# ------------------------------------------------------------------
# OPTION: -ipadx
#
# Specifies the width of the horizontal gap from the border to the
# the child site.
# ------------------------------------------------------------------
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.
# ------------------------------------------------------------------
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 labelFrame
# relief.
# ----------------------------------------------------------------------------
configbody iwidgets::Labeledframe::labelmargin {
  _positionLabel
}

# -----------------------------------------------------------------------------
# OPTION: -labelpos
#
# Set the position of the label within the relief of the labelFrame frame
# widget.
# ----------------------------------------------------------------------------
configbody iwidgets::Labeledframe::labelpos {
  _positionLabel
}

# -----------------------------------------------------------------------------
# OPTION: -labelpos
#
# Set the position of the label within the relief of the labelFrame frame
# widget.
# ----------------------------------------------------------------------------
configbody iwidgets::Labeledframe::labeltext {
  $itk_component(label) configure -text $itk_option(-labeltext)
  _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 labelFrame
#   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>}
# -----------------------------------------------------------------------------
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
#
# -----------------------------------------------------------------------------
body iwidgets::Labeledframe::childsite {} {
  return $itk_component(childsite)
}

# -----------------------------------------------------------------------------
# PUBLIC METHOD:: clientHandlesConfigure
#
# -----------------------------------------------------------------------------
body iwidgets::Labeledframe::clientHandlesConfigure {{yes 1}} {
  if {$yes} {
    set dontUpdate 1
    bind $itk_component(label) <Configure> { }
    return [code $this _positionLabel now]
  } else { 
    bind $itk_component(label) <Configure> [code $this _positionLabel]
    set dontUpdate 0
  }
}
# -----------------------------------------------------------------------------
# PROTECTED METHOD: _positionLabel ?when?
#
# Places the label in the relief of the labelFrame.  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.
# -----------------------------------------------------------------------------
body iwidgets::Labeledframe::_positionLabel {{when later}} {

  if {$when == "later"} {
    if {$_reposition != ""} {
      after cancel $_reposition
    }
    set _reposition [after idle [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"
  }

  if {!$dontUpdate} {
    update idletasks
    if {[string compare $_reposition DESTRUCTOR] == 0} {
      # OOPS...  We are in the process of being destroyed.  Get out of here...
      debug "Stuck in _postionLabel during destruction"
      return
    }
  }

  $itk_component(label) configure -wraplength $_LAYOUT_TABLE($pos-wrap)

  # If there is no text in the label, do not add it to the computation.

  if {$itk_option(-labeltext) == ""} {
      set minsize 0
      if {[place slaves $itk_component(labelFrame)] != ""} {
          place forget $itk_component(label)
      }
    _setMarginThickness 0
  } else {
    set labelWidth [winfo reqwidth $itk_component(label)]
    set labelHeight [winfo reqheight $itk_component(label)]
      set borderwidth $itk_option(-labelborderwidth)
      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_component(labelFrame) $number -minsize $minsize

  set _reposition ""
}

# -----------------------------------------------------------------------------
# PROTECTED METHOD: _collapseMargin
#
# Resets the "-minsize" of all rows and columns of the labelFrame's grid
# used to set the label margin to 0
# -----------------------------------------------------------------------------
body iwidgets::Labeledframe::_collapseMargin {} {
  grid columnconfigure $itk_component(labelFrame) 0 -minsize 0
  grid columnconfigure $itk_component(labelFrame) 2 -minsize 0
  grid rowconfigure $itk_component(labelFrame) 0 -minsize 0
  grid rowconfigure $itk_component(labelFrame) 2 -minsize 0
}

# -----------------------------------------------------------------------------
# PROTECTED METHOD: _setMarginThickness
#
# Set the margin thickness ( i.e. the hidden "-highlightthickness"
# of the labelFrame ) to the input value.
#
# -----------------------------------------------------------------------------
body iwidgets::Labeledframe::_setMarginThickness {value} {
  $itk_component(labelFrame) configure -highlightthickness $value
}


Go to most recent revision | 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.