home *** CD-ROM | disk | FTP | other *** search
/ PC World 2000 December / PCWorld_2000-12_cd.bin / Komunikace / Comanche / comanche.exe / lib / iwidgets3.0.0 / scripts / labeledframe.itk < prev    next >
Text File  |  1999-02-24  |  17KB  |  492 lines

  1. #
  2. # Labeledframe
  3. # ----------------------------------------------------------------------
  4. # Implements a hull frame with a grooved relief, a label, and a
  5. # frame childsite.
  6. #
  7. # The frame childsite can be filled with any widget via a derived class
  8. # or though the use of the childsite method.  This class was designed
  9. # to be a general purpose base class for supporting the combination of
  10. # a labeled frame and a childsite.  The options include the ability to
  11. # position the label at configurable locations within the grooved relief
  12. # of the hull frame, and control the display of the label.
  13. #
  14. #  To following demonstrates the different values which the "-labelpos"
  15. #  option may be set to and the resulting layout of the label when
  16. #  one executes the following command with "-labeltext" set to "LABEL":
  17. #
  18. #  example:
  19. #   labeledframe .w -labeltext LABEL -labelpos <ne,n,nw,se,s,sw,en,e,es,wn,s,ws>
  20. #
  21. #      ne          n         nw         se          s         sw
  22. #
  23. #   *LABEL****  **LABEL**  ****LABEL*  **********  ********* **********
  24. #   *        *  *       *  *        *  *        *  *       * *        *  
  25. #   *        *  *       *  *        *  *        *  *       * *        *  
  26. #   *        *  *       *  *        *  *        *  *       * *        *
  27. #   **********  *********  **********  *LABEL****  **LABEL** ****LABEL*
  28. #
  29. #      en          e         es         wn          s         ws
  30. #
  31. #   **********  *********  *********  *********  *********  **********
  32. #   *        *  *        * *       *  *        * *       *  *        *
  33. #   L        *  *        * *       *  *        L *       *  *        *
  34. #   A        *  L        * *       *  *        A *       L  *        L
  35. #   B        *  A        * L       *  *        B *       A  *        A
  36. #   E        *  B        * A       *  *        E *       B  *        B
  37. #   L        *  E        * B       *  *        L *       E  *        E
  38. #   *        *  L        * E       *  *        * *       L  *        L
  39. #   *        *  *        * L       *  *        * *       *  *        *
  40. #   **********  ********** *********  ********** *********  **********
  41. #
  42. # ----------------------------------------------------------------------
  43. #  AUTHOR: John A. Tucker               EMAIL: jatucker@spd.dsccc.com
  44. #
  45. # ======================================================================
  46. #            Copyright (c) 1997 DSC Technologies Corporation
  47. # ======================================================================
  48. # Permission to use, copy, modify, distribute and license this software 
  49. # and its documentation for any purpose, and without fee or written 
  50. # agreement with DSC, is hereby granted, provided that the above copyright 
  51. # notice appears in all copies and that both the copyright notice and 
  52. # warranty disclaimer below appear in supporting documentation, and that 
  53. # the names of DSC Technologies Corporation or DSC Communications 
  54. # Corporation not be used in advertising or publicity pertaining to the 
  55. # software without specific, written prior permission.
  56. # DSC DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING 
  57. # ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, AND NON-
  58. # INFRINGEMENT. THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, AND THE
  59. # AUTHORS AND DISTRIBUTORS HAVE NO OBLIGATION TO PROVIDE MAINTENANCE, 
  60. # SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. IN NO EVENT SHALL 
  61. # DSC BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR 
  62. # ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, 
  63. # WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTUOUS ACTION,
  64. # ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS 
  65. # SOFTWARE.
  66. # ======================================================================
  67.  
  68. #
  69. # Default resources.
  70. #
  71. option add *Labeledframe.labelMargin    10      widgetDefault
  72. option add *Labeledframe.labelFont     \
  73.       "-Adobe-Helvetica-Bold-R-Normal--*-120-*-*-*-*-*-*"  widgetDefault
  74. option add *Labeledframe.labelPos       n       widgetDefault
  75. option add *Labeledframe.borderWidth    2      widgetDefault
  76. option add *Labeledframe.relief         groove widgetDefault
  77.  
  78.  
  79. #
  80. # Usual options.
  81. #
  82. itk::usual Labeledframe {
  83.     keep -background -cursor -labelfont -foreground
  84. }
  85.  
  86. class iwidgets::Labeledframe {
  87.  
  88.   inherit itk::Archetype
  89.  
  90.   itk_option define -ipadx iPadX IPad 0
  91.   itk_option define -ipady iPadY IPad 0
  92.  
  93.   itk_option define -labelmargin labelMargin LabelMargin 10
  94.   itk_option define -labelpos labelPos LabelPos n
  95.  
  96.   constructor {args} {}
  97.   destructor {}
  98.  
  99.   #
  100.   # Public methods
  101.   #
  102.   public method childsite {}
  103.  
  104.   #
  105.   # Private methods
  106.   #
  107.     method smt {value} { _setMarginThickness $value }
  108.   private {
  109.     method _positionLabel {{when later}}
  110.     method _collapseMargin {}
  111.     method _setMarginThickness {value}
  112.  
  113.     proc _initTable {}
  114.  
  115.     variable _reposition ""  ;# non-null => _positionLabel pending
  116.     variable itk_hull ""
  117.  
  118.     common _LAYOUT_TABLE 
  119.   }
  120. }
  121.  
  122. #
  123. # Provide a lowercased access method for the Labeledframe class.
  124. proc ::iwidgets::labeledframe {pathName args} {
  125.     uplevel ::iwidgets::Labeledframe $pathName $args
  126. }
  127.  
  128. # -----------------------------------------------------------------------------
  129. #                        CONSTRUCTOR
  130. # -----------------------------------------------------------------------------
  131. body iwidgets::Labeledframe::constructor { args } {
  132.   #
  133.   #  Create a window with the same name as this object
  134.   #
  135.   set itk_hull [namespace tail $this]
  136.   set itk_interior $itk_hull
  137.  
  138.   itk_component add hull {
  139.     frame $itk_hull \
  140.           -relief groove \
  141.           -class [namespace tail [info class]]
  142.   } {
  143.     keep -background -cursor -relief -borderwidth
  144.     rename -highlightbackground -background background Background
  145.     rename -highlightcolor -background background Background
  146.   }
  147.   bind itk-delete-$itk_hull <Destroy> "delete object $this"
  148.  
  149.   set tags [bindtags $itk_hull]
  150.   bindtags $itk_hull [linsert $tags 0 itk-delete-$itk_hull]
  151.  
  152.   #
  153.   # Create the childsite frame window
  154.   # _______
  155.   # |_____|
  156.   # |_|X|_|
  157.   # |_____|
  158.   #
  159.   itk_component add childsite {
  160.     frame $itk_interior.childsite -highlightthickness 0 -bd 0
  161.   } 
  162.  
  163.   #
  164.   # Create the label to be positioned within the grooved relief
  165.   # of the hull frame.
  166.   #
  167.   itk_component add label {
  168.     label $itk_interior.label -highlightthickness 0 -bd 0
  169.   } { 
  170.     usual
  171.     rename -bitmap -labelbitmap labelBitmap Bitmap
  172.     rename -font -labelfont labelFont Font
  173.     rename -image -labelimage labelImage Image
  174.     rename -text -labeltext labelText Text
  175.     rename -textvariable -labelvariable labelVariable Variable
  176.     ignore -highlightthickness -highlightcolor
  177.   }
  178.  
  179.   grid $itk_component(childsite) -row 1 -column 1 -sticky nsew
  180.   grid columnconfigure $itk_interior 1 -weight 1
  181.   grid rowconfigure    $itk_interior 1 -weight 1
  182.  
  183.   bind $itk_component(label) <Configure> +[code $this _positionLabel]
  184.  
  185.   #
  186.   # Initialize the class array of layout configuration options.  Since
  187.   # this is a one time only thing.
  188.   #
  189.   _initTable
  190.  
  191.   eval itk_initialize $args
  192.  
  193.   # 
  194.   # When idle, position the label.
  195.   #
  196.   _positionLabel
  197. }
  198.  
  199. # -----------------------------------------------------------------------------
  200. #                           DESTURCTOR
  201. # -----------------------------------------------------------------------------
  202. body iwidgets::Labeledframe::destructor {} {
  203.  
  204.   if {$_reposition != ""} {
  205.     after cancel $_reposition
  206.   }
  207.  
  208.   if {[winfo exists $itk_hull]} {
  209.     set tags [bindtags $itk_hull]
  210.     set i [lsearch $tags itk-delete-$itk_hull]
  211.     if {$i >= 0} {
  212.       bindtags $itk_hull [lreplace $tags $i $i]
  213.     }
  214.     destroy $itk_hull
  215.   }
  216. }
  217.  
  218. # -----------------------------------------------------------------------------
  219. #                             OPTIONS
  220. # -----------------------------------------------------------------------------
  221.  
  222. # ------------------------------------------------------------------
  223. # OPTION: -ipadx
  224. #
  225. # Specifies the width of the horizontal gap from the border to the
  226. # the child site.
  227. # ------------------------------------------------------------------
  228. configbody iwidgets::Labeledframe::ipadx {
  229.   grid configure $itk_component(childsite) -padx $itk_option(-ipadx)
  230.   _positionLabel
  231. }
  232.  
  233. # ------------------------------------------------------------------
  234. # OPTION: -ipady
  235. #
  236. # Specifies the width of the vertical gap from the border to the
  237. # the child site.
  238. # ------------------------------------------------------------------
  239. configbody iwidgets::Labeledframe::ipady {
  240.   grid configure $itk_component(childsite) -pady $itk_option(-ipady)
  241.   _positionLabel
  242. }
  243.  
  244. # -----------------------------------------------------------------------------
  245. # OPTION: -labelmargin
  246. #
  247. # Set the margin of the most adjacent side of the label to the hull
  248. # relief.
  249. # ----------------------------------------------------------------------------
  250. configbody iwidgets::Labeledframe::labelmargin {
  251.   _positionLabel
  252. }
  253.  
  254. # -----------------------------------------------------------------------------
  255. # OPTION: -labelpos
  256. #
  257. # Set the position of the label within the relief of the hull frame
  258. # widget.
  259. # ----------------------------------------------------------------------------
  260. configbody iwidgets::Labeledframe::labelpos {
  261.   _positionLabel
  262. }
  263.  
  264. # -----------------------------------------------------------------------------
  265. #                            PROCS
  266. # -----------------------------------------------------------------------------
  267.  
  268. # -----------------------------------------------------------------------------
  269. # PRIVATE PROC: _initTable
  270. #
  271. # Initializes the _LAYOUT_TABLE common variable of the Labeledframe
  272. # class.  The initialization is performed in its own proc ( as opposed
  273. # to in the class definition ) so that the initialization occurs only
  274. # once.
  275. #
  276. # _LAYOUT_TABLE common array description:
  277. #   Provides a table of the configuration option values
  278. #   used to place the label widget within the grooved relief of the hull
  279. #   frame for each of the 12 possible "-labelpos" values.
  280. #
  281. #   Each of the 12 rows is layed out as follows:
  282. #     {"-relx" "-rely" <rowconfigure|columnconfigure> <row/column number>}
  283. # -----------------------------------------------------------------------------
  284. body iwidgets::Labeledframe::_initTable {} {
  285.   array set _LAYOUT_TABLE {
  286.     nw-relx 0.0  nw-rely 0.0  nw-wrap 0 nw-conf rowconfigure    nw-num 0
  287.     n-relx  0.5  n-rely  0.0  n-wrap  0 n-conf  rowconfigure    n-num  0
  288.     ne-relx 1.0  ne-rely 0.0  ne-wrap 0 ne-conf rowconfigure    ne-num 0
  289.  
  290.     sw-relx 0.0  sw-rely 1.0  sw-wrap 0 sw-conf rowconfigure    sw-num 2
  291.     s-relx  0.5  s-rely  1.0  s-wrap  0 s-conf  rowconfigure    s-num  2
  292.     se-relx 1.0  se-rely 1.0  se-wrap 0 se-conf rowconfigure    se-num 2
  293.  
  294.     en-relx 1.0  en-rely 0.0  en-wrap 1 en-conf columnconfigure en-num 2
  295.     e-relx  1.0  e-rely  0.5  e-wrap  1 e-conf  columnconfigure e-num  2
  296.     es-relx 1.0  es-rely 1.0  es-wrap 1 es-conf columnconfigure es-num 2
  297.  
  298.     wn-relx 0.0  wn-rely 0.0  wn-wrap 1 wn-conf columnconfigure wn-num 0
  299.     w-relx  0.0  w-rely  0.5  w-wrap  1 w-conf  columnconfigure w-num  0
  300.     ws-relx 0.0  ws-rely 1.0  ws-wrap 1 ws-conf columnconfigure ws-num 0
  301.     }
  302.  
  303.   #
  304.   # Since this is a one time only thing, we'll redefine the proc to be empty
  305.   # afterwards so it only happens once.
  306.   #
  307.   # NOTE: Be careful to use the "body" command, or the proc will get lost!
  308.   #
  309.   itcl::body ::iwidgets::Labeledframe::_initTable {} {}
  310. }
  311.  
  312. # -----------------------------------------------------------------------------
  313. #                            METHODS
  314. # -----------------------------------------------------------------------------
  315.  
  316. # -----------------------------------------------------------------------------
  317. # PUBLIC METHOD:: childsite
  318. #
  319. # -----------------------------------------------------------------------------
  320. body iwidgets::Labeledframe::childsite {} {
  321.   return $itk_component(childsite)
  322. }
  323.  
  324. # -----------------------------------------------------------------------------
  325. # PROTECTED METHOD: _positionLabel ?when?
  326. #
  327. # Places the label in the relief of the hull.  If "when" is "now", the
  328. # change is applied immediately.  If it is "later" or it is not
  329. # specified, then the change is applied later, when the application
  330. # is idle.
  331. # -----------------------------------------------------------------------------
  332. body iwidgets::Labeledframe::_positionLabel {{when later}} {
  333.  
  334.   if {$when == "later"} {
  335.     if {$_reposition == ""} {
  336.       set _reposition [after idle [code $this _positionLabel now]]
  337.     }
  338.     return
  339.   } 
  340.  
  341.   set pos $itk_option(-labelpos)
  342.  
  343.   #
  344.   # If there is not an entry for the "relx" value associated with
  345.   # the given "-labelpos" option value, then it invalid.
  346.   #
  347.   if { [catch {set relx $_LAYOUT_TABLE($pos-relx)}] } {
  348.     error "bad labelpos option\"$itk_option(-labelpos)\": should be\
  349.                   nw, n, ne, sw, s, se, en, e, es, wn, w, or ws"
  350.   }
  351.  
  352.   update idletasks
  353.   $itk_component(label) configure -wraplength $_LAYOUT_TABLE($pos-wrap)
  354.   set labelWidth [winfo reqwidth $itk_component(label)]
  355.   set labelHeight [winfo reqheight $itk_component(label)]
  356.   set borderwidth $itk_option(-borderwidth)
  357.   set margin $itk_option(-labelmargin)
  358.  
  359.   switch $pos {
  360.     nw {
  361.       set labelThickness $labelHeight
  362.       set minsize [expr $labelThickness/2.0]
  363.       set xPos [expr $minsize+$borderwidth+$margin]
  364.       set yPos -$minsize
  365.     }
  366.     n {
  367.       set labelThickness $labelHeight
  368.       set minsize [expr $labelThickness/2.0]
  369.       set xPos [expr -$labelWidth/2.0]
  370.       set yPos -$minsize
  371.     }
  372.     ne  {
  373.       set labelThickness $labelHeight
  374.       set minsize [expr $labelThickness/2.0]
  375.       set xPos [expr -($minsize+$borderwidth+$margin+$labelWidth)]
  376.       set yPos -$minsize
  377.     }
  378.  
  379.     sw  {
  380.       set labelThickness $labelHeight
  381.       set minsize [expr $labelThickness/2.0]
  382.       set xPos [expr $minsize+$borderwidth+$margin]
  383.       set yPos -$minsize
  384.     }
  385.     s {
  386.       set labelThickness $labelHeight
  387.       set minsize [expr $labelThickness/2.0]
  388.       set xPos [expr -$labelWidth/2.0]
  389.       set yPos [expr -$labelHeight/2.0]
  390.     }
  391.     se {
  392.       set labelThickness $labelHeight
  393.       set minsize [expr $labelThickness/2.0]
  394.       set xPos [expr -($minsize+$borderwidth+$margin+$labelWidth)]
  395.       set yPos [expr -$labelHeight/2.0]
  396.     }
  397.  
  398.     wn {
  399.       set labelThickness $labelWidth
  400.       set minsize [expr $labelThickness/2.0]
  401.       set xPos -$minsize
  402.       set yPos [expr $minsize+$margin+$borderwidth]
  403.     }
  404.     w {
  405.       set labelThickness $labelWidth
  406.       set minsize [expr $labelThickness/2.0]
  407.       set xPos -$minsize
  408.       set yPos [expr -($labelHeight/2.0)]
  409.     }
  410.     ws {
  411.       set labelThickness $labelWidth
  412.       set minsize [expr $labelThickness/2.0]
  413.       set xPos -$minsize
  414.       set yPos [expr -($minsize+$borderwidth+$margin+$labelHeight)]
  415.     }
  416.  
  417.     en {
  418.       set labelThickness $labelWidth
  419.       set minsize [expr $labelThickness/2.0]
  420.       set xPos -$minsize
  421.       set yPos [expr $minsize+$borderwidth+$margin]
  422.     }
  423.     e {
  424.       set labelThickness $labelWidth
  425.       set minsize [expr $labelThickness/2.0]
  426.       set xPos -$minsize
  427.       set yPos [expr -($labelHeight/2.0)]
  428.     }
  429.     es {
  430.       set labelThickness $labelWidth
  431.       set minsize [expr $labelThickness/2.0]
  432.       set xPos -$minsize
  433.       set yPos [expr -($minsize+$borderwidth+$margin+$labelHeight)]
  434.     }
  435.   }
  436.   _setMarginThickness $minsize
  437.  
  438.   place $itk_component(label) \
  439.         -relx $_LAYOUT_TABLE($pos-relx) -x $xPos \
  440.         -rely $_LAYOUT_TABLE($pos-rely) -y $yPos \
  441.         -anchor nw
  442.  
  443.   set what $_LAYOUT_TABLE($pos-conf)
  444.   set number $_LAYOUT_TABLE($pos-num)
  445.  
  446.   grid $what $itk_interior $number -minsize $minsize
  447.  
  448.   set _reposition ""
  449. }
  450.  
  451. # -----------------------------------------------------------------------------
  452. # PROTECTED METHOD: _collapseMargin
  453. #
  454. # Resets the "-minsize" of all rows and columns of the hull's grid
  455. # used to set the label margin to 0
  456. # -----------------------------------------------------------------------------
  457. body iwidgets::Labeledframe::_collapseMargin {} {
  458.   grid columnconfigure $itk_interior 0 -minsize 0
  459.   grid columnconfigure $itk_interior 2 -minsize 0
  460.   grid rowconfigure $itk_interior 0 -minsize 0
  461.   grid rowconfigure $itk_interior 2 -minsize 0
  462. }
  463.  
  464. # -----------------------------------------------------------------------------
  465. # PROTECTED METHOD: _setMarginThickness
  466. #
  467. # Set the margin thickness ( i.e. the hidden "-highlightthickness"
  468. # of the hull ) to the input value.
  469. #
  470. # The "-highlightthickness" option of the hull frame is not intended to be
  471. # configured by users of this class, but does need to be configured to properly
  472. # place the label whenever the label is configured.
  473. #
  474. # Therefore, since I can't find a better way at this time, I achieve this 
  475. # configuration by: adding the "-highlightthickness" option back into
  476. # the hull frame; configuring the "-highlightthickness" option to properly
  477. # place the label;  and then remove the "-highlightthickness" option from the
  478. # hull.
  479. #
  480. # This way the option is not visible or configurable without some hacking.
  481. #
  482. # -----------------------------------------------------------------------------
  483. body iwidgets::Labeledframe::_setMarginThickness {value} {
  484.   itk_option add hull.highlightthickness
  485.   $itk_component(hull) configure -highlightthickness $value
  486.   itk_option remove hull.highlightthickness
  487. }
  488.  
  489.  
  490.