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 / pushbutton.itk < prev    next >
Text File  |  2003-09-01  |  12KB  |  357 lines

  1. #
  2. # Pushbutton
  3. # ----------------------------------------------------------------------
  4. # Implements a Motif-like Pushbutton with an optional default ring.
  5. #
  6. # WISH LIST:
  7. #    1)  Allow bitmaps and text on the same button face (Tk limitation).
  8. #    2)  provide arm and disarm bitmaps.
  9. #
  10. # ----------------------------------------------------------------------
  11. #   AUTHOR:  Mark L. Ulferts        EMAIL: mulferts@austin.dsccc.com
  12. #            Bret A. Schuhmacher    EMAIL: bas@wn.com
  13. #
  14. #   @(#) $Id: pushbutton.itk,v 1.3 2001/08/17 19:03:44 smithc Exp $
  15. # ----------------------------------------------------------------------
  16. #            Copyright (c) 1995 DSC Technologies Corporation
  17. # ======================================================================
  18. # Permission to use, copy, modify, distribute and license this software 
  19. # and its documentation for any purpose, and without fee or written 
  20. # agreement with DSC, is hereby granted, provided that the above copyright 
  21. # notice appears in all copies and that both the copyright notice and 
  22. # warranty disclaimer below appear in supporting documentation, and that 
  23. # the names of DSC Technologies Corporation or DSC Communications 
  24. # Corporation not be used in advertising or publicity pertaining to the 
  25. # software without specific, written prior permission.
  26. # DSC DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING 
  27. # ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, AND NON-
  28. # INFRINGEMENT. THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, AND THE
  29. # AUTHORS AND DISTRIBUTORS HAVE NO OBLIGATION TO PROVIDE MAINTENANCE, 
  30. # SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. IN NO EVENT SHALL 
  31. # DSC BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR 
  32. # ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, 
  33. # WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTUOUS ACTION,
  34. # ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS 
  35. # SOFTWARE.
  36. # ======================================================================
  37.  
  38. #
  39. # Usual options.
  40. #
  41. itk::usual Pushbutton {
  42.     keep -activebackground -activeforeground -background -borderwidth \
  43.      -cursor -disabledforeground -font -foreground -highlightbackground \
  44.      -highlightcolor -highlightthickness 
  45. }
  46.  
  47. # ------------------------------------------------------------------
  48. #                            PUSHBUTTON
  49. # ------------------------------------------------------------------
  50. itcl::class iwidgets::Pushbutton {
  51.     inherit itk::Widget
  52.  
  53.     constructor {args} {}
  54.     destructor {}
  55.  
  56.     itk_option define -padx padX Pad 11
  57.     itk_option define -pady padY Pad 4
  58.     itk_option define -font font Font \
  59.         -Adobe-Helvetica-Bold-R-Normal--*-120-*-*-*-*-*-*
  60.     itk_option define -text text Text {}
  61.     itk_option define -bitmap bitmap Bitmap {}
  62.     itk_option define -image image Image {}
  63.     itk_option define -highlightthickness highlightThickness \
  64.         HighlightThickness 2
  65.     itk_option define -borderwidth borderWidth BorderWidth 2
  66.     itk_option define -defaultring defaultRing DefaultRing 0
  67.     itk_option define -defaultringpad defaultRingPad Pad 4
  68.     itk_option define -height height Height 0
  69.     itk_option define -width width Width 0
  70.     itk_option define -takefocus takeFocus TakeFocus 0
  71.  
  72.     public method flash {} 
  73.     public method invoke {} 
  74.  
  75.     protected method _relayout {{when later}} 
  76.     protected variable _reposition ""  ;# non-null => _relayout pending
  77. }
  78.  
  79. #
  80. # Provide a lowercased access method for the Pushbutton class.
  81. proc ::iwidgets::pushbutton {pathName args} {
  82.     uplevel ::iwidgets::Pushbutton $pathName $args
  83. }
  84.  
  85. #
  86. # Use option database to override default resources of base classes.
  87. #
  88. option add *Pushbutton.borderWidth 2 widgetDefault
  89.  
  90. # ------------------------------------------------------------------
  91. #                        CONSTRUCTOR
  92. # ------------------------------------------------------------------
  93. itcl::body iwidgets::Pushbutton::constructor {args} {
  94.     #
  95.     # Reconfigure the hull to act as the outer sunken ring of
  96.     # the pushbutton, complete with focus ring.
  97.     #
  98.     itk_option add hull.borderwidth hull.relief
  99.     itk_option add hull.highlightcolor
  100.     itk_option add hull.highlightbackground
  101.     
  102.     component hull configure \
  103.         -borderwidth [$this cget -borderwidth]
  104.     
  105.     pack propagate $itk_component(hull) no
  106.  
  107.     itk_component add pushbutton {
  108.     button $itk_component(hull).pushbutton \
  109.     } {
  110.         usual
  111.     keep -underline -wraplength -state -command 
  112.     }
  113.     pack $itk_component(pushbutton) -expand 1 -fill both 
  114.     
  115.     #
  116.     # Initialize the widget based on the command line options.
  117.     #
  118.     eval itk_initialize $args
  119.  
  120.     #
  121.     # Layout the pushbutton.
  122.     #
  123.     _relayout
  124. }
  125.  
  126. # ------------------------------------------------------------------
  127. #                           DESTRUCTOR
  128. # ------------------------------------------------------------------
  129. itcl::body iwidgets::Pushbutton::destructor {} {
  130.     if {$_reposition != ""} {after cancel $_reposition}
  131. }
  132.  
  133. # ------------------------------------------------------------------
  134. #                             OPTIONS
  135. # ------------------------------------------------------------------
  136.  
  137. # ------------------------------------------------------------------
  138. # OPTION: -padx
  139. #
  140. # Specifies the extra space surrounding the label in the x direction.
  141. # ------------------------------------------------------------------
  142. itcl::configbody iwidgets::Pushbutton::padx {
  143.     $itk_component(pushbutton) configure -padx $itk_option(-padx)
  144.  
  145.     _relayout
  146. }
  147.  
  148. # ------------------------------------------------------------------
  149. # OPTION: -pady
  150. #
  151. # Specifies the extra space surrounding the label in the y direction.
  152. # ------------------------------------------------------------------
  153. itcl::configbody iwidgets::Pushbutton::pady {
  154.     $itk_component(pushbutton) configure -pady $itk_option(-pady)
  155.  
  156.     _relayout
  157. }
  158.  
  159. # ------------------------------------------------------------------
  160. # OPTION: -font
  161. #
  162. # Specifies the label font.
  163. # ------------------------------------------------------------------
  164. itcl::configbody iwidgets::Pushbutton::font {
  165.     $itk_component(pushbutton) configure -font $itk_option(-font)
  166.  
  167.     _relayout
  168. }
  169.  
  170. # ------------------------------------------------------------------
  171. # OPTION: -text
  172. #
  173. # Specifies the label text.
  174. # ------------------------------------------------------------------
  175. itcl::configbody iwidgets::Pushbutton::text {
  176.     $itk_component(pushbutton) configure -text $itk_option(-text)
  177.  
  178.     _relayout
  179. }
  180.  
  181. # ------------------------------------------------------------------
  182. # OPTION: -bitmap
  183. #
  184. # Specifies the label bitmap.
  185. # ------------------------------------------------------------------
  186. itcl::configbody iwidgets::Pushbutton::bitmap {
  187.     $itk_component(pushbutton) configure -bitmap $itk_option(-bitmap)
  188.  
  189.     _relayout
  190. }
  191.  
  192. # ------------------------------------------------------------------
  193. # OPTION: -image
  194. #
  195. # Specifies the label image.
  196. # ------------------------------------------------------------------
  197. itcl::configbody iwidgets::Pushbutton::image {
  198.     $itk_component(pushbutton) configure -image $itk_option(-image)
  199.  
  200.     _relayout
  201. }
  202.  
  203. # ------------------------------------------------------------------
  204. # OPTION: -highlightthickness
  205. #
  206. # Specifies the thickness of the highlight ring.
  207. # ------------------------------------------------------------------
  208. itcl::configbody iwidgets::Pushbutton::highlightthickness {
  209.     $itk_component(pushbutton) configure \
  210.         -highlightthickness $itk_option(-highlightthickness)
  211.  
  212.     _relayout
  213. }
  214.  
  215. # ------------------------------------------------------------------
  216. # OPTION: -borderwidth
  217. #
  218. # Specifies the width of the relief border.
  219. # ------------------------------------------------------------------
  220. itcl::configbody iwidgets::Pushbutton::borderwidth {
  221.     $itk_component(pushbutton) configure -borderwidth $itk_option(-borderwidth)
  222.  
  223.     _relayout
  224. }
  225.  
  226. # ------------------------------------------------------------------
  227. # OPTION: -defaultring
  228. #
  229. # Boolean describing whether the button displays its default ring.  
  230. # ------------------------------------------------------------------
  231. itcl::configbody iwidgets::Pushbutton::defaultring {
  232.     _relayout
  233. }
  234.  
  235. # ------------------------------------------------------------------
  236. # OPTION: -defaultringpad
  237. #
  238. # The size of the padded default ring around the button.
  239. # ------------------------------------------------------------------
  240. itcl::configbody iwidgets::Pushbutton::defaultringpad {
  241.     pack $itk_component(pushbutton) \
  242.         -padx $itk_option(-defaultringpad) \
  243.         -pady $itk_option(-defaultringpad)
  244. }
  245.  
  246. # ------------------------------------------------------------------
  247. # OPTION: -height
  248. #
  249. # Specifies the height of the button inclusive of any default ring.
  250. # A value of zero lets the push button determine the height based
  251. # on the requested height plus highlightring and defaultringpad.
  252. # ------------------------------------------------------------------
  253. itcl::configbody iwidgets::Pushbutton::height {
  254.     _relayout
  255. }
  256.  
  257. # ------------------------------------------------------------------
  258. # OPTION: -width
  259. #
  260. # Specifies the width of the button inclusive of any default ring.
  261. # A value of zero lets the push button determine the width based
  262. # on the requested width plus highlightring and defaultringpad.
  263. # ------------------------------------------------------------------
  264. itcl::configbody iwidgets::Pushbutton::width {
  265.     _relayout
  266. }
  267.  
  268. # ------------------------------------------------------------------
  269. #                            METHODS
  270. # ------------------------------------------------------------------
  271.  
  272. # ------------------------------------------------------------------
  273. # METHOD: flash
  274. #
  275. # Thin wrap of standard button widget flash method.
  276. # ------------------------------------------------------------------
  277. itcl::body iwidgets::Pushbutton::flash {} {
  278.     $itk_component(pushbutton) flash
  279. }
  280.  
  281. # ------------------------------------------------------------------
  282. # METHOD: invoke
  283. #
  284. # Thin wrap of standard button widget invoke method.
  285. # ------------------------------------------------------------------
  286. itcl::body iwidgets::Pushbutton::invoke {} {
  287.     $itk_component(pushbutton) invoke
  288. }
  289.  
  290. # ------------------------------------------------------------------
  291. # PROTECTED METHOD: _relayout ?when?
  292. #
  293. # Adjust the width and height of the Pushbutton to accomadate all the
  294. # current options settings.  Add back in the highlightthickness to 
  295. # the button such that the correct reqwidth and reqheight are computed.  
  296. # Set the width and height based on the reqwidth/reqheight, 
  297. # highlightthickness, and ringpad.  Finally, configure the defaultring
  298. # properly. If "when" is "now", the change is applied immediately.  If 
  299. # it is "later" or it is not specified, then the change is applied later,
  300. # when the application is idle.
  301. # ------------------------------------------------------------------
  302. itcl::body iwidgets::Pushbutton::_relayout {{when later}} {
  303.     if {$when == "later"} {
  304.     if {$_reposition == ""} {
  305.         set _reposition [after idle [itcl::code $this _relayout now]]
  306.     }
  307.     return
  308.     } elseif {$when != "now"} {
  309.     error "bad option \"$when\": should be now or later"
  310.     }
  311.  
  312.     set _reposition ""
  313.  
  314.     if {$itk_option(-width) == 0} {
  315.     set w [expr {[winfo reqwidth $itk_component(pushbutton)] \
  316.         + 2 * $itk_option(-highlightthickness) \
  317.         + 2 * $itk_option(-borderwidth) \
  318.         + 2 * $itk_option(-defaultringpad)}]
  319.     } else {
  320.     set w $itk_option(-width)
  321.     }
  322.     
  323.     if {$itk_option(-height) == 0} {
  324.     set h [expr {[winfo reqheight $itk_component(pushbutton)] \
  325.         + 2 * $itk_option(-highlightthickness) \
  326.         + 2 * $itk_option(-borderwidth) \
  327.         + 2 * $itk_option(-defaultringpad)}]
  328.     } else {
  329.     set h $itk_option(-height)
  330.     }
  331.     
  332.     component hull configure -width $w -height $h
  333.     
  334.     if {$itk_option(-defaultring)} {
  335.     component hull configure -relief sunken \
  336.         -highlightthickness [$this cget -highlightthickness] \
  337.         -takefocus 1
  338.  
  339.     configure -takefocus 1
  340.     
  341.     component pushbutton configure \
  342.         -highlightthickness 0 -takefocus 0
  343.     
  344.     } else {
  345.     component hull configure -relief flat \
  346.         -highlightthickness 0 -takefocus 0
  347.     
  348.     component pushbutton configure \
  349.         -highlightthickness [$this cget -highlightthickness] \
  350.         -takefocus 1
  351.  
  352.     configure -takefocus 0
  353.     }
  354. }
  355.