home *** CD-ROM | disk | FTP | other *** search
/ PC World 2005 June / PCWorld_2005-06_cd.bin / software / vyzkuste / firewally / firewally.exe / framework-2.3.exe / labeledframe.itk < prev    next >
Text File  |  2003-09-01  |  18KB  |  497 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. itcl::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.   # Protected methods
  106.   #
  107.   protected {
  108.     method _positionLabel {{when later}}
  109.     method _collapseMargin {}
  110.     method _setMarginThickness {value}
  111.     method smt {value} { _setMarginThickness $value }
  112.   }
  113.  
  114.   #
  115.   # Private methods/data
  116.   #
  117.   private {
  118.     proc _initTable {}
  119.  
  120.     variable _reposition ""  ;# non-null => _positionLabel pending
  121.     variable itk_hull ""
  122.  
  123.     common _LAYOUT_TABLE 
  124.   }
  125. }
  126.  
  127. #
  128. # Provide a lowercased access method for the Labeledframe class.
  129. proc ::iwidgets::labeledframe {pathName args} {
  130.     uplevel ::iwidgets::Labeledframe $pathName $args
  131. }
  132.  
  133. # -----------------------------------------------------------------------------
  134. #                        CONSTRUCTOR
  135. # -----------------------------------------------------------------------------
  136. itcl::body iwidgets::Labeledframe::constructor { args } {
  137.   #
  138.   #  Create a window with the same name as this object
  139.   #
  140.   set itk_hull [namespace tail $this]
  141.   set itk_interior $itk_hull
  142.  
  143.   itk_component add hull {
  144.     frame $itk_hull \
  145.           -relief groove \
  146.           -class [namespace tail [info class]]
  147.   } {
  148.     keep -background -cursor -relief -borderwidth
  149.     rename -highlightbackground -background background Background
  150.     rename -highlightcolor -background background Background
  151.   }
  152.   bind itk-delete-$itk_hull <Destroy> "itcl::delete object $this"
  153.  
  154.   set tags [bindtags $itk_hull]
  155.   bindtags $itk_hull [linsert $tags 0 itk-delete-$itk_hull]
  156.  
  157.   #
  158.   # Create the childsite frame window
  159.   # _______
  160.   # |_____|
  161.   # |_|X|_|
  162.   # |_____|
  163.   #
  164.   itk_component add childsite {
  165.     frame $itk_interior.childsite -highlightthickness 0 -bd 0
  166.   } 
  167.  
  168.   #
  169.   # Create the label to be positioned within the grooved relief
  170.   # of the hull frame.
  171.   #
  172.   itk_component add label {
  173.     label $itk_interior.label -highlightthickness 0 -bd 0
  174.   } { 
  175.     usual
  176.     rename -bitmap -labelbitmap labelBitmap Bitmap
  177.     rename -font -labelfont labelFont Font
  178.     rename -image -labelimage labelImage Image
  179.     rename -text -labeltext labelText Text
  180.     rename -textvariable -labelvariable labelVariable Variable
  181.     ignore -highlightthickness -highlightcolor
  182.   }
  183.  
  184.   grid $itk_component(childsite) -row 1 -column 1 -sticky nsew
  185.   grid columnconfigure $itk_interior 1 -weight 1
  186.   grid rowconfigure    $itk_interior 1 -weight 1
  187.  
  188.   bind $itk_component(label) <Configure> +[itcl::code $this _positionLabel]
  189.  
  190.   #
  191.   # Initialize the class array of layout configuration options.  Since
  192.   # this is a one time only thing.
  193.   #
  194.   _initTable
  195.  
  196.   eval itk_initialize $args
  197.  
  198.   # 
  199.   # When idle, position the label.
  200.   #
  201.   _positionLabel
  202. }
  203.  
  204. # -----------------------------------------------------------------------------
  205. #                           DESTRUCTOR
  206. # -----------------------------------------------------------------------------
  207. itcl::body iwidgets::Labeledframe::destructor {} {
  208.  
  209.   if {$_reposition != ""} {
  210.     after cancel $_reposition
  211.   }
  212.  
  213.   if {[winfo exists $itk_hull]} {
  214.     set tags [bindtags $itk_hull]
  215.     set i [lsearch $tags itk-delete-$itk_hull]
  216.     if {$i >= 0} {
  217.       bindtags $itk_hull [lreplace $tags $i $i]
  218.     }
  219.     destroy $itk_hull
  220.   }
  221. }
  222.  
  223. # -----------------------------------------------------------------------------
  224. #                             OPTIONS
  225. # -----------------------------------------------------------------------------
  226.  
  227. # ------------------------------------------------------------------
  228. # OPTION: -ipadx
  229. #
  230. # Specifies the width of the horizontal gap from the border to the
  231. # the child site.
  232. # ------------------------------------------------------------------
  233. itcl::configbody iwidgets::Labeledframe::ipadx {
  234.   grid configure $itk_component(childsite) -padx $itk_option(-ipadx)
  235.   _positionLabel
  236. }
  237.  
  238. # ------------------------------------------------------------------
  239. # OPTION: -ipady
  240. #
  241. # Specifies the width of the vertical gap from the border to the
  242. # the child site.
  243. # ------------------------------------------------------------------
  244. itcl::configbody iwidgets::Labeledframe::ipady {
  245.   grid configure $itk_component(childsite) -pady $itk_option(-ipady)
  246.   _positionLabel
  247. }
  248.  
  249. # -----------------------------------------------------------------------------
  250. # OPTION: -labelmargin
  251. #
  252. # Set the margin of the most adjacent side of the label to the hull
  253. # relief.
  254. # ----------------------------------------------------------------------------
  255. itcl::configbody iwidgets::Labeledframe::labelmargin {
  256.   _positionLabel
  257. }
  258.  
  259. # -----------------------------------------------------------------------------
  260. # OPTION: -labelpos
  261. #
  262. # Set the position of the label within the relief of the hull frame
  263. # widget.
  264. # ----------------------------------------------------------------------------
  265. itcl::configbody iwidgets::Labeledframe::labelpos {
  266.   _positionLabel
  267. }
  268.  
  269. # -----------------------------------------------------------------------------
  270. #                            PROCS
  271. # -----------------------------------------------------------------------------
  272.  
  273. # -----------------------------------------------------------------------------
  274. # PRIVATE PROC: _initTable
  275. #
  276. # Initializes the _LAYOUT_TABLE common variable of the Labeledframe
  277. # class.  The initialization is performed in its own proc ( as opposed
  278. # to in the class definition ) so that the initialization occurs only
  279. # once.
  280. #
  281. # _LAYOUT_TABLE common array description:
  282. #   Provides a table of the configuration option values
  283. #   used to place the label widget within the grooved relief of the hull
  284. #   frame for each of the 12 possible "-labelpos" values.
  285. #
  286. #   Each of the 12 rows is layed out as follows:
  287. #     {"-relx" "-rely" <rowconfigure|columnconfigure> <row/column number>}
  288. # -----------------------------------------------------------------------------
  289. itcl::body iwidgets::Labeledframe::_initTable {} {
  290.   array set _LAYOUT_TABLE {
  291.     nw-relx 0.0  nw-rely 0.0  nw-wrap 0 nw-conf rowconfigure    nw-num 0
  292.     n-relx  0.5  n-rely  0.0  n-wrap  0 n-conf  rowconfigure    n-num  0
  293.     ne-relx 1.0  ne-rely 0.0  ne-wrap 0 ne-conf rowconfigure    ne-num 0
  294.  
  295.     sw-relx 0.0  sw-rely 1.0  sw-wrap 0 sw-conf rowconfigure    sw-num 2
  296.     s-relx  0.5  s-rely  1.0  s-wrap  0 s-conf  rowconfigure    s-num  2
  297.     se-relx 1.0  se-rely 1.0  se-wrap 0 se-conf rowconfigure    se-num 2
  298.  
  299.     en-relx 1.0  en-rely 0.0  en-wrap 1 en-conf columnconfigure en-num 2
  300.     e-relx  1.0  e-rely  0.5  e-wrap  1 e-conf  columnconfigure e-num  2
  301.     es-relx 1.0  es-rely 1.0  es-wrap 1 es-conf columnconfigure es-num 2
  302.  
  303.     wn-relx 0.0  wn-rely 0.0  wn-wrap 1 wn-conf columnconfigure wn-num 0
  304.     w-relx  0.0  w-rely  0.5  w-wrap  1 w-conf  columnconfigure w-num  0
  305.     ws-relx 0.0  ws-rely 1.0  ws-wrap 1 ws-conf columnconfigure ws-num 0
  306.     }
  307.  
  308.   #
  309.   # Since this is a one time only thing, we'll redefine the proc to be empty
  310.   # afterwards so it only happens once.
  311.   #
  312.   # NOTE: Be careful to use the "body" command, or the proc will get lost!
  313.   #
  314.   itcl::body ::iwidgets::Labeledframe::_initTable {} {}
  315. }
  316.  
  317. # -----------------------------------------------------------------------------
  318. #                            METHODS
  319. # -----------------------------------------------------------------------------
  320.  
  321. # -----------------------------------------------------------------------------
  322. # PUBLIC METHOD:: childsite
  323. #
  324. # -----------------------------------------------------------------------------
  325. itcl::body iwidgets::Labeledframe::childsite {} {
  326.   return $itk_component(childsite)
  327. }
  328.  
  329. # -----------------------------------------------------------------------------
  330. # PROTECTED METHOD: _positionLabel ?when?
  331. #
  332. # Places the label in the relief of the hull.  If "when" is "now", the
  333. # change is applied immediately.  If it is "later" or it is not
  334. # specified, then the change is applied later, when the application
  335. # is idle.
  336. # -----------------------------------------------------------------------------
  337. itcl::body iwidgets::Labeledframe::_positionLabel {{when later}} {
  338.  
  339.   if {$when == "later"} {
  340.     if {$_reposition == ""} {
  341.       set _reposition [after idle [itcl::code $this _positionLabel now]]
  342.     }
  343.     return
  344.   } 
  345.  
  346.   set pos $itk_option(-labelpos)
  347.  
  348.   #
  349.   # If there is not an entry for the "relx" value associated with
  350.   # the given "-labelpos" option value, then it invalid.
  351.   #
  352.   if { [catch {set relx $_LAYOUT_TABLE($pos-relx)}] } {
  353.     error "bad labelpos option\"$itk_option(-labelpos)\": should be\
  354.                   nw, n, ne, sw, s, se, en, e, es, wn, w, or ws"
  355.   }
  356.  
  357.   update idletasks
  358.   $itk_component(label) configure -wraplength $_LAYOUT_TABLE($pos-wrap)
  359.   set labelWidth [winfo reqwidth $itk_component(label)]
  360.   set labelHeight [winfo reqheight $itk_component(label)]
  361.   set borderwidth $itk_option(-borderwidth)
  362.   set margin $itk_option(-labelmargin)
  363.  
  364.   switch $pos {
  365.     nw {
  366.       set labelThickness $labelHeight
  367.       set minsize [expr {$labelThickness/2.0}]
  368.       set xPos [expr {$minsize+$borderwidth+$margin}]
  369.       set yPos -$minsize
  370.     }
  371.     n {
  372.       set labelThickness $labelHeight
  373.       set minsize [expr {$labelThickness/2.0}]
  374.       set xPos [expr {-$labelWidth/2.0}]
  375.       set yPos -$minsize
  376.     }
  377.     ne  {
  378.       set labelThickness $labelHeight
  379.       set minsize [expr {$labelThickness/2.0}]
  380.       set xPos [expr {-($minsize+$borderwidth+$margin+$labelWidth)}]
  381.       set yPos -$minsize
  382.     }
  383.  
  384.     sw  {
  385.       set labelThickness $labelHeight
  386.       set minsize [expr {$labelThickness/2.0}]
  387.       set xPos [expr {$minsize+$borderwidth+$margin}]
  388.       set yPos -$minsize
  389.     }
  390.     s {
  391.       set labelThickness $labelHeight
  392.       set minsize [expr {$labelThickness/2.0}]
  393.       set xPos [expr {-$labelWidth/2.0}]
  394.       set yPos [expr {-$labelHeight/2.0}]
  395.     }
  396.     se {
  397.       set labelThickness $labelHeight
  398.       set minsize [expr {$labelThickness/2.0}]
  399.       set xPos [expr {-($minsize+$borderwidth+$margin+$labelWidth)}]
  400.       set yPos [expr {-$labelHeight/2.0}]
  401.     }
  402.  
  403.     wn {
  404.       set labelThickness $labelWidth
  405.       set minsize [expr {$labelThickness/2.0}]
  406.       set xPos -$minsize
  407.       set yPos [expr {$minsize+$margin+$borderwidth}]
  408.     }
  409.     w {
  410.       set labelThickness $labelWidth
  411.       set minsize [expr {$labelThickness/2.0}]
  412.       set xPos -$minsize
  413.       set yPos [expr {-($labelHeight/2.0)}]
  414.     }
  415.     ws {
  416.       set labelThickness $labelWidth
  417.       set minsize [expr {$labelThickness/2.0}]
  418.       set xPos -$minsize
  419.       set yPos [expr {-($minsize+$borderwidth+$margin+$labelHeight)}]
  420.     }
  421.  
  422.     en {
  423.       set labelThickness $labelWidth
  424.       set minsize [expr {$labelThickness/2.0}]
  425.       set xPos -$minsize
  426.       set yPos [expr {$minsize+$borderwidth+$margin}]
  427.     }
  428.     e {
  429.       set labelThickness $labelWidth
  430.       set minsize [expr {$labelThickness/2.0}]
  431.       set xPos -$minsize
  432.       set yPos [expr {-($labelHeight/2.0)}]
  433.     }
  434.     es {
  435.       set labelThickness $labelWidth
  436.       set minsize [expr {$labelThickness/2.0}]
  437.       set xPos -$minsize
  438.       set yPos [expr {-($minsize+$borderwidth+$margin+$labelHeight)}]
  439.     }
  440.   }
  441.   _setMarginThickness $minsize
  442.  
  443.   place $itk_component(label) \
  444.         -relx $_LAYOUT_TABLE($pos-relx) -x $xPos \
  445.         -rely $_LAYOUT_TABLE($pos-rely) -y $yPos \
  446.         -anchor nw
  447.  
  448.   set what $_LAYOUT_TABLE($pos-conf)
  449.   set number $_LAYOUT_TABLE($pos-num)
  450.  
  451.   grid $what $itk_interior $number -minsize $minsize
  452.  
  453.   set _reposition ""
  454. }
  455.  
  456. # -----------------------------------------------------------------------------
  457. # PROTECTED METHOD: _collapseMargin
  458. #
  459. # Resets the "-minsize" of all rows and columns of the hull's grid
  460. # used to set the label margin to 0
  461. # -----------------------------------------------------------------------------
  462. itcl::body iwidgets::Labeledframe::_collapseMargin {} {
  463.   grid columnconfigure $itk_interior 0 -minsize 0
  464.   grid columnconfigure $itk_interior 2 -minsize 0
  465.   grid rowconfigure $itk_interior 0 -minsize 0
  466.   grid rowconfigure $itk_interior 2 -minsize 0
  467. }
  468.  
  469. # -----------------------------------------------------------------------------
  470. # PROTECTED METHOD: _setMarginThickness
  471. #
  472. # Set the margin thickness ( i.e. the hidden "-highlightthickness"
  473. # of the hull ) to the input value.
  474. #
  475. # The "-highlightthickness" option of the hull frame is not intended to be
  476. # configured by users of this class, but does need to be configured to properly
  477. # place the label whenever the label is configured.
  478. #
  479. # Therefore, since I can't find a better way at this time, I achieve this 
  480. # configuration by: adding the "-highlightthickness" option back into
  481. # the hull frame; configuring the "-highlightthickness" option to properly
  482. # place the label;  and then remove the "-highlightthickness" option from the
  483. # hull.
  484. #
  485. # This way the option is not visible or configurable without some hacking.
  486. #
  487. # -----------------------------------------------------------------------------
  488. itcl::body iwidgets::Labeledframe::_setMarginThickness {value} {
  489.   itk_option add hull.highlightthickness
  490.   $itk_component(hull) configure -highlightthickness $value
  491.   itk_option remove hull.highlightthickness
  492. }
  493.  
  494.  
  495.