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 / labeledwidget.itk < prev    next >
Text File  |  1999-02-24  |  14KB  |  438 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.1 1998/07/27 18:53:09 stanton 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. 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.  
  66.     public method childsite
  67.     
  68.     protected method _positionLabel {{when later}}
  69.  
  70.     proc alignlabels {args} {}
  71.  
  72.     protected variable _reposition ""  ;# non-null => _positionLabel pending
  73. }
  74.     
  75. #
  76. # Provide a lowercased access method for the Labeledwidget class.
  77. proc ::iwidgets::labeledwidget {pathName args} {
  78.     uplevel ::iwidgets::Labeledwidget $pathName $args
  79. }
  80.  
  81. # ------------------------------------------------------------------
  82. #                        CONSTRUCTOR
  83. # ------------------------------------------------------------------
  84. body iwidgets::Labeledwidget::constructor {args} {
  85.     #
  86.     # Create a frame for the childsite widget.
  87.     #
  88.     itk_component add -protected lwchildsite {
  89.     frame $itk_interior.lwchildsite
  90.     } 
  91.     
  92.     #
  93.     # Create label.
  94.     #
  95.     itk_component add label {
  96.     label $itk_interior.label
  97.     } {
  98.     usual
  99.     
  100.     rename -font -labelfont labelFont Font
  101.     ignore -highlightcolor -highlightthickness
  102.     }
  103.     
  104.     #
  105.     # Set the interior to be the childsite for derived classes.
  106.     #
  107.     set itk_interior $itk_component(lwchildsite)
  108.  
  109.     #
  110.     # Initialize the widget based on the command line options.
  111.     #
  112.     eval itk_initialize $args
  113.  
  114.     # 
  115.     # When idle, position the label.
  116.     #
  117.     _positionLabel
  118. }
  119.  
  120. # ------------------------------------------------------------------
  121. #                           DESTURCTOR
  122. # ------------------------------------------------------------------
  123. body iwidgets::Labeledwidget::destructor {} {
  124.     if {$_reposition != ""} {after cancel $_reposition}
  125. }
  126.  
  127. # ------------------------------------------------------------------
  128. #                             OPTIONS
  129. # ------------------------------------------------------------------
  130.  
  131. # ------------------------------------------------------------------
  132. # OPTION: -disabledforeground
  133. #
  134. # Specified the foreground to be used on the label when disabled.
  135. # ------------------------------------------------------------------
  136. configbody iwidgets::Labeledwidget::disabledforeground {}
  137.  
  138. # ------------------------------------------------------------------
  139. # OPTION: -labelpos
  140. #
  141. # Set the position of the label on the labeled widget.  The margin
  142. # between the label and childsite comes along for the ride.
  143. # ------------------------------------------------------------------
  144. configbody iwidgets::Labeledwidget::labelpos {
  145.     _positionLabel
  146. }
  147.  
  148. # ------------------------------------------------------------------
  149. # OPTION: -labelmargin
  150. #
  151. # Specifies the distance between the widget and label.
  152. # ------------------------------------------------------------------
  153. configbody iwidgets::Labeledwidget::labelmargin {
  154.     _positionLabel
  155. }
  156.  
  157. # ------------------------------------------------------------------
  158. # OPTION: -labeltext
  159. #
  160. # Specifies the label text.
  161. # ------------------------------------------------------------------
  162. configbody iwidgets::Labeledwidget::labeltext {
  163.     $itk_component(label) configure -text $itk_option(-labeltext)
  164.     
  165.     _positionLabel
  166. }
  167.  
  168. # ------------------------------------------------------------------
  169. # OPTION: -labelvariable
  170. #
  171. # Specifies the label text variable.
  172. # ------------------------------------------------------------------
  173. configbody iwidgets::Labeledwidget::labelvariable {
  174.     $itk_component(label) configure -textvariable $itk_option(-labelvariable)
  175.     
  176.     uplevel [list trace variable \
  177.          $itk_option(-labelvariable) w [code _positionLabel]]
  178.  
  179.     _positionLabel
  180. }
  181.  
  182. # ------------------------------------------------------------------
  183. # OPTION: -labelbitmap
  184. #
  185. # Specifies the label bitmap.
  186. # ------------------------------------------------------------------
  187. configbody iwidgets::Labeledwidget::labelbitmap {
  188.     $itk_component(label) configure -bitmap $itk_option(-labelbitmap)
  189.     
  190.     _positionLabel
  191. }
  192.  
  193. # ------------------------------------------------------------------
  194. # OPTION: -labelimage
  195. #
  196. # Specifies the label image.
  197. # ------------------------------------------------------------------
  198. configbody iwidgets::Labeledwidget::labelimage {
  199.     $itk_component(label) configure -image $itk_option(-labelimage)
  200.     
  201.     _positionLabel
  202. }
  203.  
  204. # ------------------------------------------------------------------
  205. # OPTION: -state
  206. #
  207. # Specifies the state of the label.  
  208. # ------------------------------------------------------------------
  209. configbody iwidgets::Labeledwidget::state {
  210.     _positionLabel
  211. }
  212.  
  213. # ------------------------------------------------------------------
  214. #                            METHODS
  215. # ------------------------------------------------------------------
  216.  
  217. # ------------------------------------------------------------------
  218. # METHOD: childsite
  219. #
  220. # Returns the path name of the child site widget.
  221. # ------------------------------------------------------------------
  222. body iwidgets::Labeledwidget::childsite {} {
  223.     return $itk_component(lwchildsite)
  224. }
  225.  
  226. # ------------------------------------------------------------------
  227. # PROCEDURE: alignlabels widget ?widget ...?
  228. #
  229. # The alignlabels procedure takes a list of widgets derived from
  230. # the Labeledwidget class and adjusts the label margin to align 
  231. # the labels.
  232. # ------------------------------------------------------------------
  233. body iwidgets::Labeledwidget::alignlabels {args} {
  234.     update
  235.     set maxLabelWidth 0
  236.     
  237.     #
  238.     # Verify that all the widgets are of type Labeledwidget and 
  239.     # determine the size of the maximum length label string.
  240.     #
  241.     foreach iwid $args {
  242.     set objcmd [itcl::find objects -isa Labeledwidget *::$iwid]
  243.  
  244.     if {$objcmd == ""} {
  245.         error "$iwid is not a \"Labeledwidget\""
  246.     }
  247.     
  248.     set csWidth [winfo reqwidth $iwid.lwchildsite]
  249.     set shellWidth [winfo reqwidth $iwid]
  250.         
  251.     if {[expr $shellWidth - $csWidth] > $maxLabelWidth} {
  252.         set maxLabelWidth [expr $shellWidth - $csWidth]
  253.     }
  254.     }
  255.     
  256.     #
  257.     # Adjust the margins for the labels such that the child sites and
  258.     # labels line up.
  259.     #
  260.     foreach iwid $args {
  261.     set csWidth [winfo reqwidth $iwid.lwchildsite]
  262.     set shellWidth [winfo reqwidth $iwid]
  263.     
  264.     set labelSize [expr $shellWidth - $csWidth]
  265.     
  266.     if {$maxLabelWidth > $labelSize} {
  267.         set objcmd [itcl::find objects -isa Labeledwidget *::$iwid]
  268.         set dist [expr $maxLabelWidth - \
  269.             ($labelSize - [$objcmd cget -labelmargin])]
  270.         
  271.         $objcmd configure -labelmargin $dist 
  272.     }
  273.     }    
  274. }
  275.  
  276. # ------------------------------------------------------------------
  277. # PROTECTED METHOD: _positionLabel ?when?
  278. #
  279. # Packs the label and label margin.  If "when" is "now", the
  280. # change is applied immediately.  If it is "later" or it is not
  281. # specified, then the change is applied later, when the application
  282. # is idle.
  283. # ------------------------------------------------------------------
  284. body iwidgets::Labeledwidget::_positionLabel {{when later}} {
  285.     if {$when == "later"} {
  286.     if {$_reposition == ""} {
  287.         set _reposition [after idle [code $this _positionLabel now]]
  288.     }
  289.     return
  290.  
  291.     } elseif {$when != "now"} {
  292.     error "bad option \"$when\": should be now or later"
  293.     }
  294.  
  295.     #
  296.     # If we have a label, be it text, bitmap, or image continue.
  297.     #
  298.     if {($itk_option(-labeltext) != {}) || \
  299.     ($itk_option(-labelbitmap) != {}) || \
  300.     ($itk_option(-labelimage) != {}) || \
  301.     ($itk_option(-labelvariable) != {})} {
  302.  
  303.     #
  304.     # Set the foreground color based on the state.
  305.     #
  306.     if {[info exists itk_option(-state)]} {
  307.         switch -- $itk_option(-state) {
  308.         disabled {
  309.             $itk_component(label) configure \
  310.             -foreground $itk_option(-disabledforeground)
  311.         }
  312.         normal {
  313.             $itk_component(label) configure \
  314.             -foreground $itk_option(-foreground)
  315.         }
  316.         }
  317.     }
  318.  
  319.     set parent [winfo parent $itk_component(lwchildsite)]
  320.  
  321.     #
  322.     # Switch on the label position option.  Using the grid,
  323.     # adjust the row/column setting of the label, margin, and
  324.     # and childsite.  The margin height/width is adjust based
  325.         # on the orientation as well.  Finally, set the weights such
  326.         # that the childsite takes the heat on expansion and shrinkage.
  327.     #
  328.     switch $itk_option(-labelpos) {
  329.         nw -
  330.         n -
  331.         ne {
  332.         grid $itk_component(label) -row 0 -column 0 \
  333.             -sticky $itk_option(-labelpos)
  334.         grid $itk_component(lwchildsite) -row 2 -column 0 \
  335.             -sticky nsew
  336.         
  337.         grid rowconfigure $parent 0 -weight 0 -minsize 0
  338.         grid rowconfigure $parent 1 -weight 0 -minsize \
  339.             [winfo pixels $itk_component(label) \
  340.              $itk_option(-labelmargin)]
  341.         grid rowconfigure $parent 2 -weight 1 -minsize 0
  342.  
  343.         grid columnconfigure $parent 0 -weight 1 -minsize 0
  344.         grid columnconfigure $parent 1 -weight 0 -minsize 0
  345.         grid columnconfigure $parent 2 -weight 0 -minsize 0
  346.         }
  347.  
  348.         en -
  349.         e -
  350.         es {
  351.         grid $itk_component(lwchildsite) -row 0 -column 0 \
  352.             -sticky nsew
  353.         grid $itk_component(label) -row 0 -column 2 \
  354.             -sticky $itk_option(-labelpos)
  355.         
  356.         grid rowconfigure $parent 0 -weight 1 -minsize 0
  357.         grid rowconfigure $parent 1 -weight 0 -minsize 0
  358.         grid rowconfigure $parent 2 -weight 0 -minsize 0
  359.  
  360.         grid columnconfigure $parent 0 -weight 1 -minsize 0
  361.         grid columnconfigure $parent 1 -weight 0 -minsize \
  362.             [winfo pixels $itk_component(label) \
  363.             $itk_option(-labelmargin)]
  364.         grid columnconfigure $parent 2 -weight 0 -minsize 0
  365.         }
  366.         
  367.         se -
  368.         s -
  369.         sw {
  370.         grid $itk_component(lwchildsite) -row 0 -column 0 \
  371.             -sticky nsew
  372.         grid $itk_component(label) -row 2 -column 0 \
  373.             -sticky $itk_option(-labelpos)
  374.         
  375.         grid rowconfigure $parent 0 -weight 1 -minsize 0
  376.         grid rowconfigure $parent 1 -weight 0 -minsize \
  377.             [winfo pixels $itk_component(label) \
  378.             $itk_option(-labelmargin)]
  379.         grid rowconfigure $parent 2 -weight 0 -minsize 0
  380.  
  381.         grid columnconfigure $parent 0 -weight 1 -minsize 0
  382.         grid columnconfigure $parent 1 -weight 0 -minsize 0
  383.         grid columnconfigure $parent 2 -weight 0 -minsize 0
  384.         }
  385.         
  386.         wn -
  387.         w -
  388.         ws {
  389.         grid $itk_component(lwchildsite) -row 0 -column 2 \
  390.             -sticky nsew
  391.         grid $itk_component(label) -row 0 -column 0 \
  392.             -sticky $itk_option(-labelpos)
  393.         
  394.         grid rowconfigure $parent 0 -weight 1 -minsize 0
  395.         grid rowconfigure $parent 1 -weight 0 -minsize 0
  396.         grid rowconfigure $parent 2 -weight 0 -minsize 0
  397.  
  398.         grid columnconfigure $parent 0 -weight 0 -minsize 0
  399.         grid columnconfigure $parent 1 -weight 0 -minsize \
  400.             [winfo pixels $itk_component(label) \
  401.             $itk_option(-labelmargin)]
  402.         grid columnconfigure $parent 2 -weight 1 -minsize 0
  403.         }
  404.  
  405.         default {
  406.         error "bad labelpos option\
  407.             \"$itk_option(-labelpos)\": should be\
  408.             nw, n, ne, sw, s, se, en, e, es, wn, w, or ws"
  409.         }
  410.     }
  411.  
  412.     #
  413.     # Else, neither the  label text, bitmap, or image have a value, so
  414.     # forget them so they don't appear and manage only the childsite.
  415.     #
  416.     } else {
  417.     grid forget $itk_component(label)
  418.  
  419.     grid $itk_component(lwchildsite) -row 0 -column 0 -sticky nsew
  420.  
  421.     set parent [winfo parent $itk_component(lwchildsite)]
  422.  
  423.     grid rowconfigure $parent 0 -weight 1 -minsize 0
  424.     grid rowconfigure $parent 1 -weight 0 -minsize 0
  425.     grid rowconfigure $parent 2 -weight 0 -minsize 0
  426.     grid columnconfigure $parent 0 -weight 1 -minsize 0
  427.     grid columnconfigure $parent 1 -weight 0 -minsize 0
  428.     grid columnconfigure $parent 2 -weight 0 -minsize 0
  429.     }
  430.  
  431.     #
  432.     # Reset the resposition flag.
  433.     #
  434.     set _reposition ""
  435. }
  436.