home *** CD-ROM | disk | FTP | other *** search
/ PC World 2000 December / PCWorld_2000-12_cd.bin / Komunikace / Comanche / comanche.exe / lib / iwidgets2.2.0 / scripts / labeledwidget.itk < prev    next >
Text File  |  1999-02-24  |  14KB  |  407 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.  The options include the
  9. # ability to position the label around the childsite widget, modify the
  10. # font and margin, and control the display of the label.  
  11. #
  12. # ----------------------------------------------------------------------
  13. #  AUTHOR: Mark L. Ulferts               EMAIL: mulferts@spd.dsccc.com
  14. #
  15. #  @(#) $Id: labeledwidget.itk,v 1.1 1998/07/27 18:49:33 stanton Exp $
  16. # ----------------------------------------------------------------------
  17. #            Copyright (c) 1995 DSC Technologies Corporation
  18. # ======================================================================
  19. # Permission to use, copy, modify, distribute and license this software 
  20. # and its documentation for any purpose, and without fee or written 
  21. # agreement with DSC, is hereby granted, provided that the above copyright 
  22. # notice appears in all copies and that both the copyright notice and 
  23. # warranty disclaimer below appear in supporting documentation, and that 
  24. # the names of DSC Technologies Corporation or DSC Communications 
  25. # Corporation not be used in advertising or publicity pertaining to the 
  26. # software without specific, written prior permission.
  27. # DSC DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING 
  28. # ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, AND NON-
  29. # INFRINGEMENT. THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, AND THE
  30. # AUTHORS AND DISTRIBUTORS HAVE NO OBLIGATION TO PROVIDE MAINTENANCE, 
  31. # SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. IN NO EVENT SHALL 
  32. # DSC BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR 
  33. # ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, 
  34. # WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTUOUS ACTION,
  35. # ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS 
  36. # SOFTWARE.
  37. # ======================================================================
  38.  
  39. #
  40. # Default resources.
  41. #
  42. option add *Labeledwidget.labelMargin 1 widgetDefault
  43.  
  44. #
  45. # Usual options.
  46. #
  47. itk::usual Labeledwidget {
  48.     keep -background -cursor -foreground -labelfont
  49. }
  50.  
  51. # ------------------------------------------------------------------
  52. #                            LABELEDWIDGET
  53. # ------------------------------------------------------------------
  54. class iwidgets::Labeledwidget {
  55.     inherit itk::Widget
  56.  
  57.     constructor {args} {}
  58.     destructor {}
  59.  
  60.     itk_option define -labelpos labelPos Position w
  61.     itk_option define -labelmargin labelMargin Margin 1
  62.     itk_option define -labeltext labelText Text {}
  63.     itk_option define -labelvariable labelVariable Variable {}
  64.     itk_option define -labelbitmap labelBitmap Bitmap {}
  65.     itk_option define -labelimage labelImage Image {}
  66.  
  67.     public method childsite
  68.     
  69.     protected 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. body iwidgets::Labeledwidget::constructor {args} {
  86.     # 
  87.     # Create the outermost frame to maintain geometry.
  88.     #
  89.     itk_component add shell {
  90.     frame $itk_interior.shell
  91.     } {
  92.     keep -background -cursor
  93.     }
  94.     pack $itk_component(shell) -fill both -expand yes
  95.     
  96.     #
  97.     # Create a frame for the childsite widget.
  98.     #
  99.     itk_component add lwchildsite {
  100.     frame $itk_component(shell).lwchildsite
  101.     } {
  102.     keep -background -cursor
  103.     }
  104.     pack $itk_component(lwchildsite) -fill both -expand yes
  105.     set itk_interior $itk_component(lwchildsite)
  106.     
  107.     #
  108.     # Create label.
  109.     #
  110.     itk_component add label {
  111.     label $itk_component(shell).label
  112.     } {
  113.     keep -background -foreground -cursor 
  114.     
  115.     rename -font -labelfont labelFont Font
  116.     }
  117.     
  118.     #
  119.     # Create margin between label and the child site.
  120.     #
  121.     itk_component add labmargin {
  122.     frame $itk_component(shell).labmargin
  123.     } {
  124.     keep -background -cursor
  125.     }
  126.     
  127.     #
  128.     # Explicitly handle configs that may have been ignored earlier.
  129.     #
  130.     eval itk_initialize $args
  131.  
  132.     # 
  133.     # When idle, position the label.
  134.     #
  135.     _positionLabel
  136. }
  137.  
  138. # ------------------------------------------------------------------
  139. #                           DESTURCTOR
  140. # ------------------------------------------------------------------
  141. body iwidgets::Labeledwidget::destructor {} {
  142.     if {$_reposition != ""} {after cancel $_reposition}
  143. }
  144.  
  145. # ------------------------------------------------------------------
  146. #                             OPTIONS
  147. # ------------------------------------------------------------------
  148.  
  149. # ------------------------------------------------------------------
  150. # OPTION: -labelpos
  151. #
  152. # Set the position of the label on the labeled widget.  The margin
  153. # between the label and childsite comes along for the ride.
  154. # ------------------------------------------------------------------
  155. configbody iwidgets::Labeledwidget::labelpos {
  156.     _positionLabel
  157. }
  158.  
  159. # ------------------------------------------------------------------
  160. # OPTION: -labelmargin
  161. #
  162. # Specifies the distance between the widget and label.
  163. # ------------------------------------------------------------------
  164. configbody iwidgets::Labeledwidget::labelmargin {
  165.     _positionLabel
  166. }
  167.  
  168. # ------------------------------------------------------------------
  169. # OPTION: -labeltext
  170. #
  171. # Specifies the label text.
  172. # ------------------------------------------------------------------
  173. configbody iwidgets::Labeledwidget::labeltext {
  174.     $itk_component(label) configure -text $itk_option(-labeltext)
  175.     
  176.     _positionLabel
  177. }
  178.  
  179. # ------------------------------------------------------------------
  180. # OPTION: -labelvariable
  181. #
  182. # Specifies the label text variable.
  183. # ------------------------------------------------------------------
  184. configbody iwidgets::Labeledwidget::labelvariable {
  185.     $itk_component(label) configure -textvariable $itk_option(-labelvariable)
  186.     
  187.     _positionLabel
  188. }
  189.  
  190. # ------------------------------------------------------------------
  191. # OPTION: -labelbitmap
  192. #
  193. # Specifies the label bitmap.
  194. # ------------------------------------------------------------------
  195. configbody iwidgets::Labeledwidget::labelbitmap {
  196.     $itk_component(label) configure -bitmap $itk_option(-labelbitmap)
  197.     
  198.     _positionLabel
  199. }
  200.  
  201. # ------------------------------------------------------------------
  202. # OPTION: -labelimage
  203. #
  204. # Specifies the label image.
  205. # ------------------------------------------------------------------
  206. configbody iwidgets::Labeledwidget::labelimage {
  207.     $itk_component(label) configure -image $itk_option(-labelimage)
  208.     
  209.     _positionLabel
  210. }
  211.  
  212. # ------------------------------------------------------------------
  213. #                            METHODS
  214. # ------------------------------------------------------------------
  215.  
  216. # ------------------------------------------------------------------
  217. # METHOD: childsite
  218. #
  219. # Returns the path name of the child site widget.
  220. # ------------------------------------------------------------------
  221. body iwidgets::Labeledwidget::childsite {} {
  222.     return $itk_component(lwchildsite)
  223. }
  224.  
  225. # ------------------------------------------------------------------
  226. # PROCEDURE: alignlabels widget ?widget ...?
  227. #
  228. # The alignlabels procedure takes a list of widgets derived from
  229. # the Labeledwidget class and adjusts the label margin to align 
  230. # the labels.
  231. # ------------------------------------------------------------------
  232. body iwidgets::Labeledwidget::alignlabels {args} {
  233.     update
  234.     set maxLabelWidth 0
  235.     
  236.     #
  237.     # Verify that all the widgets are of type Labeledwidget and 
  238.     # determine the size of the maximum length label string.
  239.     #
  240.     foreach iwid $args {
  241.     set objcmd [itcl::find objects -isa Labeledwidget *::$iwid]
  242.  
  243.     if {$objcmd == ""} {
  244.         error "$iwid is not a \"Labeledwidget\""
  245.     }
  246.     
  247.     set csWidth [winfo reqwidth $iwid.shell.lwchildsite]
  248.     set shellWidth [winfo reqwidth $iwid.shell]
  249.         
  250.     if {[expr $shellWidth - $csWidth] > $maxLabelWidth} {
  251.         set maxLabelWidth [expr $shellWidth - $csWidth]
  252.     }
  253.     }
  254.     
  255.     #
  256.     # Adjust the margins for the labels such that the child sites and
  257.     # labels line up.
  258.     #
  259.     foreach iwid $args {
  260.     set csWidth [winfo reqwidth $iwid.shell.lwchildsite]
  261.     set shellWidth [winfo reqwidth $iwid.shell]
  262.     
  263.     set labelSize [expr $shellWidth - $csWidth]
  264.     
  265.     if {$maxLabelWidth > $labelSize} {
  266.         set dist [expr $maxLabelWidth - \
  267.             ($labelSize - [winfo reqwidth $iwid.shell.labmargin])]
  268.         
  269.         set objcmd [itcl::find objects -isa Labeledwidget *::$iwid]
  270.         $objcmd configure -labelmargin $dist 
  271.     }
  272.     }    
  273. }
  274.  
  275. # ------------------------------------------------------------------
  276. # PROTECTED METHOD: _positionLabel ?when?
  277. #
  278. # Packs the label and label margin.  If "when" is "now", the
  279. # change is applied immediately.  If it is "later" or it is not
  280. # specified, then the change is applied later, when the application
  281. # is idle.
  282. # ------------------------------------------------------------------
  283. body iwidgets::Labeledwidget::_positionLabel {{when later}} {
  284.     if {$when == "later"} {
  285.     if {$_reposition == ""} {
  286.         set _reposition [after idle [code $this _positionLabel now]]
  287.     }
  288.     return
  289.     } elseif {$when != "now"} {
  290.     error "bad option \"$when\": should be now or later"
  291.     }
  292.  
  293.     if {($itk_option(-labeltext) != {}) ||
  294.         ($itk_option(-labelbitmap) != {}) ||
  295.         ($itk_option(-labelimage) != {})} {
  296.     switch $itk_option(-labelpos) {
  297.         nw {
  298.         pack configure $itk_component(lwchildsite) -side top
  299.         
  300.         $itk_component(labmargin) configure -width 1 -height \
  301.             [winfo pixels $itk_component(labmargin) \
  302.              $itk_option(-labelmargin)]
  303.         pack configure $itk_component(labmargin) -side top \
  304.             -before $itk_component(lwchildsite)
  305.         pack configure $itk_component(label) -anchor w \
  306.             -side top -before $itk_component(labmargin)
  307.         }
  308.         
  309.         n {
  310.         pack configure $itk_component(lwchildsite) -side top
  311.         
  312.         $itk_component(labmargin) configure -width 1 -height \
  313.             [winfo pixels $itk_component(labmargin) \
  314.             $itk_option(-labelmargin)]
  315.         pack configure $itk_component(labmargin) -side top \
  316.             -before $itk_component(lwchildsite)
  317.         pack configure $itk_component(label) -anchor center \
  318.             -before $itk_component(labmargin) -side top
  319.         }
  320.         
  321.         ne {
  322.         pack configure $itk_component(lwchildsite) -side top
  323.         
  324.         $itk_component(labmargin) configure -width 1 -height \
  325.             [winfo pixels $itk_component(labmargin) \
  326.             $itk_option(-labelmargin)]
  327.         pack configure $itk_component(labmargin) -side top \
  328.             -before $itk_component(lwchildsite)
  329.         pack configure $itk_component(label) -anchor e \
  330.             -side top -before $itk_component(labmargin)
  331.         }
  332.         
  333.         e {
  334.         pack configure $itk_component(lwchildsite) -side right
  335.         
  336.         $itk_component(labmargin) configure -height 1 -width \
  337.             [winfo pixels $itk_component(labmargin) \
  338.             $itk_option(-labelmargin)]
  339.         pack configure $itk_component(labmargin) \
  340.             -side right -before $itk_component(lwchildsite)
  341.         pack configure $itk_component(label) -anchor center \
  342.             -side right -before $itk_component(labmargin)
  343.         }
  344.         
  345.         se {
  346.         pack configure $itk_component(lwchildsite) -side top
  347.         
  348.         $itk_component(labmargin) configure -width 1 -height \
  349.             [winfo pixels $itk_component(labmargin) \
  350.             $itk_option(-labelmargin)]
  351.         pack configure $itk_component(labmargin) \
  352.             -side top -after $itk_component(lwchildsite)
  353.         pack configure $itk_component(label) -anchor e \
  354.             -side bottom -after $itk_component(labmargin)
  355.         }
  356.         
  357.         s {
  358.         pack configure $itk_component(lwchildsite) -side top
  359.         
  360.         $itk_component(labmargin) configure -width 1 -height \
  361.             [winfo pixels $itk_component(labmargin) \
  362.             $itk_option(-labelmargin)]
  363.         pack configure $itk_component(labmargin) \
  364.             -side top -after $itk_component(lwchildsite)
  365.         pack configure $itk_component(label) -anchor center \
  366.             -side bottom -after $itk_component(labmargin)
  367.         }
  368.         
  369.         sw {
  370.         pack configure $itk_component(lwchildsite) -side top
  371.         
  372.         $itk_component(labmargin) configure -width 1 -height \
  373.             [winfo pixels $itk_component(labmargin) \
  374.             $itk_option(-labelmargin)]
  375.         pack configure $itk_component(labmargin) \
  376.             -side top -after $itk_component(lwchildsite)
  377.         pack configure $itk_component(label) -anchor w \
  378.             -side bottom -after $itk_component(labmargin)
  379.         }
  380.         
  381.         w {
  382.         pack configure $itk_component(lwchildsite) -side right
  383.         
  384.         $itk_component(labmargin) configure -height 1 -width \
  385.             [winfo pixels $itk_component(labmargin) \
  386.             $itk_option(-labelmargin)]
  387.         pack configure $itk_component(labmargin) \
  388.             -side left -before $itk_component(lwchildsite)
  389.         pack configure $itk_component(label) -anchor center \
  390.             -side left -before $itk_component(labmargin)
  391.         }
  392.     }
  393.  
  394.     #
  395.     # Else, neither the  label text, bitmap, or image have a value, so
  396.     # un pack them the label and margin.
  397.     #
  398.     } else {
  399.     pack forget $itk_component(label)
  400.     pack forget $itk_component(labmargin)
  401.     }
  402.  
  403.     set _reposition ""
  404. }
  405.