#
# Cygnus enhanced version of the iwidget Pane class
# ----------------------------------------------------------------------
# Implements a pane for a paned window widget.  The pane is itself a 
# frame with a child site for other widgets.  The pane class performs
# basic option management.
#
# ----------------------------------------------------------------------
#  AUTHOR: Mark L. Ulferts              EMAIL: mulferts@austin.dsccc.com
#
#  @(#) $Id: pane.tcl,v 1.2 1999/01/28 01:18:26 jingham 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.
# ======================================================================

#
# Usual options.
#
itk::usual Pane {
  keep -background -cursor
}

# ------------------------------------------------------------------
#                               PANE
# ------------------------------------------------------------------
itcl::class cyg::Pane {
  inherit itk::Widget
  
  constructor {args} {}
  
  itk_option define -maximum maximum Maximum 0
  itk_option define -minimum minimum Minimum 10
  itk_option define -margin margin Margin 0
  itk_option define -resizable resizable Resizable 1
  
  public method childSite {} {}
}

#
# Provide a lowercased access method for the Pane class.
# 
proc ::cyg::pane {pathName args} {
  uplevel ::cyg::Pane $pathName $args
}

# ------------------------------------------------------------------
#                        CONSTRUCTOR
# ------------------------------------------------------------------
itcl::body cyg::Pane::constructor {args} {
  # 
  # Create the pane childsite.
  #
  itk_component add childsite {
    frame $itk_interior.childsite 
  } {
    keep -background -cursor
  }
  pack $itk_component(childsite) -fill both -expand yes
  
  #
  # Set the itk_interior variable to be the childsite for derived 
  # classes.
  #
  set itk_interior $itk_component(childsite)
  
  eval itk_initialize $args
}

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

# ------------------------------------------------------------------
# OPTION: -minimum
#
# Specifies the minimum size that the pane may reach.
# ------------------------------------------------------------------
itcl::configbody cyg::Pane::minimum {
  set pixels [winfo pixels $itk_component(hull) $itk_option(-minimum)]
  set $itk_option(-minimum) $pixels
}

# ------------------------------------------------------------------
# OPTION: -maximum
#
# Specifies the maximum size that the pane may reach.
# ------------------------------------------------------------------
itcl::configbody cyg::Pane::maximum {
  set pixels [winfo pixels $itk_component(hull) $itk_option(-maximum)]
  set $itk_option(-maximum) $pixels
}

# ------------------------------------------------------------------
# OPTION: -margin
#
# Specifies the border distance between the pane and pane contents.
# This is done by setting the borderwidth of the pane to the margin.
# ------------------------------------------------------------------
itcl::configbody cyg::Pane::margin {
  set pixels [winfo pixels $itk_component(hull) $itk_option(-margin)]
  set itk_option(-margin) $pixels
  $itk_component(childsite) configure -borderwidth $itk_option(-margin)
}

# ------------------------------------------------------------------
#                            METHODS
# ------------------------------------------------------------------

# ------------------------------------------------------------------
# METHOD: childSite
#
# Return the pane child site path name.
# ------------------------------------------------------------------
itcl::body cyg::Pane::childSite {} {
  return $itk_component(childsite)
}
