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 / labeledwidget.itk < prev    next >
Text File  |  2003-09-01  |  15KB  |  446 lines

  1. #
  2. # Labeledwidget
  3. # ----------------------------------------------------------------------
  4. # Implements a labeled widget which contains a label and child site.
  5. # The child site is a frame which can filled with any widget via a 
  6. # derived class or though the use of the childsite method.  This class
  7. # was designed to be a general purpose base class for supporting the 
  8. # combination of label widget and a childsite, where a label may be 
  9. # text, bitmap or image.  The options include the ability to position 
  10. # the label around the childsite widget, modify the font and margin, 
  11. # and control the display of the label.  
  12. #
  13. # ----------------------------------------------------------------------
  14. #  AUTHOR: Mark L. Ulferts             EMAIL: mulferts@austin.dsccc.com
  15. #
  16. #  @(#) $Id: labeledwidget.itk,v 1.4 2001/08/20 20:02:53 smithc Exp $
  17. # ----------------------------------------------------------------------
  18. #            Copyright (c) 1995 DSC Technologies Corporation
  19. # ======================================================================
  20. # Permission to use, copy, modify, distribute and license this software 
  21. # and its documentation for any purpose, and without fee or written 
  22. # agreement with DSC, is hereby granted, provided that the above copyright 
  23. # notice appears in all copies and that both the copyright notice and 
  24. # warranty disclaimer below appear in supporting documentation, and that 
  25. # the names of DSC Technologies Corporation or DSC Communications 
  26. # Corporation not be used in advertising or publicity pertaining to the 
  27. # software without specific, written prior permission.
  28. # DSC DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING 
  29. # ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, AND NON-
  30. # INFRINGEMENT. THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, AND THE
  31. # AUTHORS AND DISTRIBUTORS HAVE NO OBLIGATION TO PROVIDE MAINTENANCE, 
  32. # SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. IN NO EVENT SHALL 
  33. # DSC BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR 
  34. # ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, 
  35. # WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTUOUS ACTION,
  36. # ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS 
  37. # SOFTWARE.
  38. # ======================================================================
  39.  
  40. #
  41. # Usual options.
  42. #
  43. itk::usual Labeledwidget {
  44.     keep -background -cursor -foreground -labelfont
  45. }
  46.  
  47. # ------------------------------------------------------------------
  48. #                            LABELEDWIDGET
  49. # ------------------------------------------------------------------
  50. itcl::class iwidgets::Labeledwidget {
  51.     inherit itk::Widget
  52.  
  53.     constructor {args} {}
  54.     destructor {}
  55.  
  56.     itk_option define -disabledforeground disabledForeground \
  57.     DisabledForeground \#a3a3a3
  58.     itk_option define -labelpos labelPos Position w
  59.     itk_option define -labelmargin labelMargin Margin 2
  60.     itk_option define -labeltext labelText Text {}
  61.     itk_option define -labelvariable labelVariable Variable {}
  62.     itk_option define -labelbitmap labelBitmap Bitmap {}
  63.     itk_option define -labelimage labelImage Image {}
  64.     itk_option define -state state State normal
  65.     itk_option define -sticky sticky Sticky nsew
  66.  
  67.     public method childsite
  68.     
  69.     private method _positionLabel {{when later}}
  70.  
  71.     proc alignlabels {args} {}
  72.  
  73.     protected variable _reposition ""  ;# non-null => _positionLabel pending
  74. }
  75.     
  76. #
  77. # Provide a lowercased access method for the Labeledwidget class.
  78. proc ::iwidgets::labeledwidget {pathName args} {
  79.     uplevel ::iwidgets::Labeledwidget $pathName $args
  80. }
  81.  
  82. # ------------------------------------------------------------------
  83. #                        CONSTRUCTOR
  84. # ------------------------------------------------------------------
  85. itcl::body iwidgets::Labeledwidget::constructor {args} {
  86.     #
  87.     # Create a frame for the childsite widget.
  88.     #
  89.     itk_component add -protected lwchildsite {
  90.     frame $itk_interior.lwchildsite
  91.     } 
  92.     
  93.     #
  94.     # Create label.
  95.     #
  96.     itk_component add label {
  97.     label $itk_interior.label
  98.     } {
  99.     usual
  100.     
  101.     rename -font -labelfont labelFont Font
  102.     ignore -highlightcolor -highlightthickness
  103.     }
  104.     
  105.     #
  106.     # Set the interior to be the childsite for derived classes.
  107.     #
  108.     set itk_interior $itk_component(lwchildsite)
  109.  
  110.     #
  111.     # Initialize the widget based on the command line options.
  112.     #
  113.     eval itk_initialize $args
  114.  
  115.     # 
  116.     # When idle, position the label.
  117.     #
  118.     _positionLabel
  119. }
  120.  
  121. # ------------------------------------------------------------------
  122. #                           DESTRUCTOR
  123. # ------------------------------------------------------------------
  124. itcl::body iwidgets::Labeledwidget::destructor {} {
  125.     if {$_reposition != ""} {after cancel $_reposition}
  126. }
  127.  
  128. # ------------------------------------------------------------------
  129. #                             OPTIONS
  130. # ------------------------------------------------------------------
  131.  
  132. # ------------------------------------------------------------------
  133. # OPTION: -disabledforeground
  134. #
  135. # Specified the foreground to be used on the label when disabled.
  136. # ------------------------------------------------------------------
  137. itcl::configbody iwidgets::Labeledwidget::disabledforeground {}
  138.  
  139. # ------------------------------------------------------------------
  140. # OPTION: -labelpos
  141. #
  142. # Set the position of the label on the labeled widget.  The margin
  143. # between the label and childsite comes along for the ride.
  144. # ------------------------------------------------------------------
  145. itcl::configbody iwidgets::Labeledwidget::labelpos {
  146.     _positionLabel
  147. }
  148.  
  149. # ------------------------------------------------------------------
  150. # OPTION: -labelmargin
  151. #
  152. # Specifies the distance between the widget and label.
  153. # ------------------------------------------------------------------
  154. itcl::configbody iwidgets::Labeledwidget::labelmargin {
  155.     _positionLabel
  156. }
  157.  
  158. # ------------------------------------------------------------------
  159. # OPTION: -labeltext
  160. #
  161. # Specifies the label text.
  162. # ------------------------------------------------------------------
  163. itcl::configbody iwidgets::Labeledwidget::labeltext {
  164.     $itk_component(label) configure -text $itk_option(-labeltext)
  165.     
  166.     _positionLabel
  167. }
  168.  
  169. # ------------------------------------------------------------------
  170. # OPTION: -labelvariable
  171. #
  172. # Specifies the label text variable.
  173. # ------------------------------------------------------------------
  174. itcl::configbody iwidgets::Labeledwidget::labelvariable {
  175.     $itk_component(label) configure -textvariable $itk_option(-labelvariable)
  176.     
  177.     _positionLabel
  178. }
  179.  
  180. # ------------------------------------------------------------------
  181. # OPTION: -labelbitmap
  182. #
  183. # Specifies the label bitmap.
  184. # ------------------------------------------------------------------
  185. itcl::configbody iwidgets::Labeledwidget::labelbitmap {
  186.     $itk_component(label) configure -bitmap $itk_option(-labelbitmap)
  187.     
  188.     _positionLabel
  189. }
  190.  
  191. # ------------------------------------------------------------------
  192. # OPTION: -labelimage
  193. #
  194. # Specifies the label image.
  195. # ------------------------------------------------------------------
  196. itcl::configbody iwidgets::Labeledwidget::labelimage {
  197.     $itk_component(label) configure -image $itk_option(-labelimage)
  198.     
  199.     _positionLabel
  200. }
  201.  
  202. # ------------------------------------------------------------------
  203. # OPTION: -sticky
  204. #
  205. # Specifies the stickyness of the child site. This option was added
  206. # by James Bonfield (committed by Chad Smith 8/20/01).
  207. # ------------------------------------------------------------------
  208. itcl::configbody iwidgets::Labeledwidget::sticky {
  209.     grid $itk_component(lwchildsite) -sticky $itk_option(-sticky)
  210. }
  211.  
  212. # ------------------------------------------------------------------
  213. # OPTION: -state
  214. #
  215. # Specifies the state of the label.  
  216. # ------------------------------------------------------------------
  217. itcl::configbody iwidgets::Labeledwidget::state {
  218.     _positionLabel
  219. }
  220.  
  221. # ------------------------------------------------------------------
  222. #                            METHODS
  223. # ------------------------------------------------------------------
  224.  
  225. # ------------------------------------------------------------------
  226. # METHOD: childsite
  227. #
  228. # Returns the path name of the child site widget.
  229. # ------------------------------------------------------------------
  230. itcl::body iwidgets::Labeledwidget::childsite {} {
  231.     return $itk_component(lwchildsite)
  232. }
  233.  
  234. # ------------------------------------------------------------------
  235. # PROCEDURE: alignlabels widget ?widget ...?
  236. #
  237. # The alignlabels procedure takes a list of widgets derived from
  238. # the Labeledwidget class and adjusts the label margin to align 
  239. # the labels.
  240. # ------------------------------------------------------------------
  241. itcl::body iwidgets::Labeledwidget::alignlabels {args} {
  242.     update
  243.     set maxLabelWidth 0
  244.     
  245.     #
  246.     # Verify that all the widgets are of type Labeledwidget and 
  247.     # determine the size of the maximum length label string.
  248.     #
  249.     foreach iwid $args {
  250.     set objcmd [itcl::find objects -isa Labeledwidget *::$iwid]
  251.  
  252.     if {$objcmd == ""} {
  253.         error "$iwid is not a \"Labeledwidget\""
  254.     }
  255.     
  256.     set csWidth [winfo reqwidth $iwid.lwchildsite]
  257.     set shellWidth [winfo reqwidth $iwid]
  258.         
  259.     if {($shellWidth - $csWidth) > $maxLabelWidth} {
  260.         set maxLabelWidth [expr {$shellWidth - $csWidth}]
  261.     }
  262.     }
  263.     
  264.     #
  265.     # Adjust the margins for the labels such that the child sites and
  266.     # labels line up.
  267.     #
  268.     foreach iwid $args {
  269.     set csWidth [winfo reqwidth $iwid.lwchildsite]
  270.     set shellWidth [winfo reqwidth $iwid]
  271.     
  272.     set labelSize [expr {$shellWidth - $csWidth}]
  273.     
  274.     if {$maxLabelWidth > $labelSize} {
  275.         set objcmd [itcl::find objects -isa Labeledwidget *::$iwid]
  276.         set dist [expr {$maxLabelWidth - \
  277.             ($labelSize - [$objcmd cget -labelmargin])}]
  278.         
  279.         $objcmd configure -labelmargin $dist 
  280.     }
  281.     }    
  282. }
  283.  
  284. # ------------------------------------------------------------------
  285. # PROTECTED METHOD: _positionLabel ?when?
  286. #
  287. # Packs the label and label margin.  If "when" is "now", the
  288. # change is applied immediately.  If it is "later" or it is not
  289. # specified, then the change is applied later, when the application
  290. # is idle.
  291. # ------------------------------------------------------------------
  292. itcl::body iwidgets::Labeledwidget::_positionLabel {{when later}} {
  293.     if {$when == "later"} {
  294.     if {$_reposition == ""} {
  295.         set _reposition [after idle [itcl::code $this _positionLabel now]]
  296.     }
  297.     return
  298.  
  299.     } elseif {$when != "now"} {
  300.     error "bad option \"$when\": should be now or later"
  301.     }
  302.  
  303.     #
  304.     # If we have a label, be it text, bitmap, or image continue.
  305.     #
  306.     if {($itk_option(-labeltext) != {}) || \
  307.     ($itk_option(-labelbitmap) != {}) || \
  308.     ($itk_option(-labelimage) != {}) || \
  309.     ($itk_option(-labelvariable) != {})} {
  310.  
  311.     #
  312.     # Set the foreground color based on the state.
  313.     #
  314.     if {[info exists itk_option(-state)]} {
  315.         switch -- $itk_option(-state) {
  316.         disabled {
  317.             $itk_component(label) configure \
  318.             -foreground $itk_option(-disabledforeground)
  319.         }
  320.         normal {
  321.             $itk_component(label) configure \
  322.             -foreground $itk_option(-foreground)
  323.         }
  324.         }
  325.     }
  326.  
  327.     set parent [winfo parent $itk_component(lwchildsite)]
  328.  
  329.     #
  330.     # Switch on the label position option.  Using the grid,
  331.     # adjust the row/column setting of the label, margin, and
  332.     # and childsite.  The margin height/width is adjust based
  333.         # on the orientation as well.  Finally, set the weights such
  334.         # that the childsite takes the heat on expansion and shrinkage.
  335.     #
  336.     switch $itk_option(-labelpos) {
  337.         nw -
  338.         n -
  339.         ne {
  340.         grid $itk_component(label) -row 0 -column 0 \
  341.             -sticky $itk_option(-labelpos)
  342.         grid $itk_component(lwchildsite) -row 2 -column 0 \
  343.             -sticky $itk_option(-sticky)
  344.         
  345.         grid rowconfigure $parent 0 -weight 0 -minsize 0
  346.         grid rowconfigure $parent 1 -weight 0 -minsize \
  347.             [winfo pixels $itk_component(label) \
  348.              $itk_option(-labelmargin)]
  349.         grid rowconfigure $parent 2 -weight 1 -minsize 0
  350.  
  351.         grid columnconfigure $parent 0 -weight 1 -minsize 0
  352.         grid columnconfigure $parent 1 -weight 0 -minsize 0
  353.         grid columnconfigure $parent 2 -weight 0 -minsize 0
  354.         }
  355.  
  356.         en -
  357.         e -
  358.         es {
  359.         grid $itk_component(lwchildsite) -row 0 -column 0 \
  360.             -sticky $itk_option(-sticky)
  361.         grid $itk_component(label) -row 0 -column 2 \
  362.             -sticky $itk_option(-labelpos)
  363.         
  364.         grid rowconfigure $parent 0 -weight 1 -minsize 0
  365.         grid rowconfigure $parent 1 -weight 0 -minsize 0
  366.         grid rowconfigure $parent 2 -weight 0 -minsize 0
  367.  
  368.         grid columnconfigure $parent 0 -weight 1 -minsize 0
  369.         grid columnconfigure $parent 1 -weight 0 -minsize \
  370.             [winfo pixels $itk_component(label) \
  371.             $itk_option(-labelmargin)]
  372.         grid columnconfigure $parent 2 -weight 0 -minsize 0
  373.         }
  374.         
  375.         se -
  376.         s -
  377.         sw {
  378.         grid $itk_component(lwchildsite) -row 0 -column 0 \
  379.             -sticky $itk_option(-sticky)
  380.         grid $itk_component(label) -row 2 -column 0 \
  381.             -sticky $itk_option(-labelpos)
  382.         
  383.         grid rowconfigure $parent 0 -weight 1 -minsize 0
  384.         grid rowconfigure $parent 1 -weight 0 -minsize \
  385.             [winfo pixels $itk_component(label) \
  386.             $itk_option(-labelmargin)]
  387.         grid rowconfigure $parent 2 -weight 0 -minsize 0
  388.  
  389.         grid columnconfigure $parent 0 -weight 1 -minsize 0
  390.         grid columnconfigure $parent 1 -weight 0 -minsize 0
  391.         grid columnconfigure $parent 2 -weight 0 -minsize 0
  392.         }
  393.         
  394.         wn -
  395.         w -
  396.         ws {
  397.         grid $itk_component(lwchildsite) -row 0 -column 2 \
  398.             -sticky $itk_option(-sticky)
  399.         grid $itk_component(label) -row 0 -column 0 \
  400.             -sticky $itk_option(-labelpos)
  401.         
  402.         grid rowconfigure $parent 0 -weight 1 -minsize 0
  403.         grid rowconfigure $parent 1 -weight 0 -minsize 0
  404.         grid rowconfigure $parent 2 -weight 0 -minsize 0
  405.  
  406.         grid columnconfigure $parent 0 -weight 0 -minsize 0
  407.         grid columnconfigure $parent 1 -weight 0 -minsize \
  408.             [winfo pixels $itk_component(label) \
  409.             $itk_option(-labelmargin)]
  410.         grid columnconfigure $parent 2 -weight 1 -minsize 0
  411.         }
  412.  
  413.         default {
  414.         error "bad labelpos option\
  415.             \"$itk_option(-labelpos)\": should be\
  416.             nw, n, ne, sw, s, se, en, e, es, wn, w, or ws"
  417.         }
  418.     }
  419.  
  420.     #
  421.     # Else, neither the  label text, bitmap, or image have a value, so
  422.     # forget them so they don't appear and manage only the childsite.
  423.     #
  424.     } else {
  425.     grid forget $itk_component(label)
  426.  
  427.     grid $itk_component(lwchildsite) -row 0 -column 0 -sticky $itk_option(-sticky)
  428.  
  429.     set parent [winfo parent $itk_component(lwchildsite)]
  430.  
  431.     grid rowconfigure $parent 0 -weight 1 -minsize 0
  432.     grid rowconfigure $parent 1 -weight 0 -minsize 0
  433.     grid rowconfigure $parent 2 -weight 0 -minsize 0
  434.     grid columnconfigure $parent 0 -weight 1 -minsize 0
  435.     grid columnconfigure $parent 1 -weight 0 -minsize 0
  436.     grid columnconfigure $parent 2 -weight 0 -minsize 0
  437.     }
  438.  
  439.     #
  440.     # Reset the resposition flag.
  441.     #
  442.     set _reposition ""
  443. }
  444.