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 / pushbutton.itk < prev    next >
Text File  |  1999-02-24  |  13KB  |  365 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@spd.dsccc.com
  12. #            Bret A. Schuhmacher    EMAIL: bas@wn.com
  13. #
  14. #   @(#) $Id: pushbutton.itk,v 1.1 1998/07/27 18:49:46 stanton 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. # Default resources.
  40. #
  41. option add *Pushbutton.borderWidth 2 widgetDefault
  42. option add *Pushbutton.highlightThickness 2 widgetDefault
  43. option add *Pushbutton.padX 11 widgetDefault
  44. option add *Pushbutton.padY  4 widgetDefault
  45. option add *Pushbutton.defaultRingPad 4 widgetDefault
  46.  
  47. #
  48. # Usual options.
  49. #
  50. itk::usual Pushbutton {
  51.     keep -activebackground -activeforeground -background -borderwidth \
  52.      -cursor -disabledforeground -font -foreground -highlightbackground \
  53.      -highlightcolor -highlightthickness 
  54. }
  55.  
  56. # ------------------------------------------------------------------
  57. #                            PUSHBUTTON
  58. # ------------------------------------------------------------------
  59. class iwidgets::Pushbutton {
  60.     inherit itk::Widget
  61.  
  62.     constructor {args} {}
  63.     destructor {}
  64.  
  65.     itk_option define -padx padX Pad 4
  66.     itk_option define -pady padY Pad 4
  67.     itk_option define -font font Font \
  68.         -Adobe-Helvetica-Bold-R-Normal--*-120-*-*-*-*-*-*
  69.     itk_option define -text text Text {}
  70.     itk_option define -bitmap bitmap Bitmap {}
  71.     itk_option define -image image Image {}
  72.     itk_option define -highlightthickness highlightThickness \
  73.         HighlightThickness 2
  74.     itk_option define -borderwidth borderWidth BorderWidth 2
  75.     itk_option define -defaultring defaultRing DefaultRing 0
  76.     itk_option define -defaultringpad defaultRingPad Pad 4
  77.     itk_option define -height height Height 0
  78.     itk_option define -width width Width 0
  79.     itk_option define -takefocus takeFocus TakeFocus 0
  80.  
  81.     public method flash {} 
  82.     public method invoke {} 
  83.  
  84.     private method _relayout {{when later}} 
  85.  
  86.     protected variable _reposition ""  ;# non-null => _relayout pending
  87. }
  88.  
  89. #
  90. # Provide a lowercased access method for the Pushbutton class.
  91. proc ::iwidgets::pushbutton {pathName args} {
  92.     uplevel ::iwidgets::Pushbutton $pathName $args
  93. }
  94.  
  95. # ------------------------------------------------------------------
  96. #                        CONSTRUCTOR
  97. # ------------------------------------------------------------------
  98. body iwidgets::Pushbutton::constructor {args} {
  99.     #
  100.     # Reconfigure the hull to act as the outer sunken ring of
  101.     # the pushbutton, complete with focus ring.
  102.     #
  103.     itk_option add hull.borderwidth hull.relief
  104.     itk_option add hull.highlightcolor
  105.     itk_option add hull.highlightbackground
  106.     
  107.     component hull configure \
  108.         -borderwidth [$this cget -borderwidth]
  109.     
  110.     pack propagate $itk_component(hull) no
  111.     
  112.     itk_component add pushButton {
  113.     button $itk_component(hull).pushButton \
  114.         } {
  115.     keep -activebackground -activeforeground -anchor -background \
  116.         -cursor -disabledforeground -foreground -justify \
  117.         -textvariable -underline -wraplength -state -command \
  118.         -highlightcolor
  119.     rename -highlightbackground -background background Background
  120.     }
  121.     pack $itk_component(pushButton) -expand 1 -fill both 
  122.     
  123.     #
  124.     # Explicitly handle configs that may have been ignored earlier.
  125.     #
  126.     eval itk_initialize $args
  127.  
  128.     #
  129.     # Layout the pushbutton.
  130.     #
  131.     _relayout
  132. }
  133.  
  134. # ------------------------------------------------------------------
  135. #                           DESTRUCTOR
  136. # ------------------------------------------------------------------
  137. body iwidgets::Pushbutton::destructor {} {
  138.     if {$_reposition != ""} {after cancel $_reposition}
  139. }
  140.  
  141. # ------------------------------------------------------------------
  142. #                             OPTIONS
  143. # ------------------------------------------------------------------
  144.  
  145. # ------------------------------------------------------------------
  146. # OPTION: -padx
  147. #
  148. # Specifies the extra space surrounding the label in the x direction.
  149. # ------------------------------------------------------------------
  150. configbody iwidgets::Pushbutton::padx {
  151.     $itk_component(pushButton) configure -padx $itk_option(-padx)
  152.  
  153.     _relayout
  154. }
  155.  
  156. # ------------------------------------------------------------------
  157. # OPTION: -pady
  158. #
  159. # Specifies the extra space surrounding the label in the y direction.
  160. # ------------------------------------------------------------------
  161. configbody iwidgets::Pushbutton::pady {
  162.     $itk_component(pushButton) configure -pady $itk_option(-pady)
  163.  
  164.     _relayout
  165. }
  166.  
  167. # ------------------------------------------------------------------
  168. # OPTION: -font
  169. #
  170. # Specifies the label font.
  171. # ------------------------------------------------------------------
  172. configbody iwidgets::Pushbutton::font {
  173.     $itk_component(pushButton) configure -font $itk_option(-font)
  174.  
  175.     _relayout
  176. }
  177.  
  178. # ------------------------------------------------------------------
  179. # OPTION: -text
  180. #
  181. # Specifies the label text.
  182. # ------------------------------------------------------------------
  183. configbody iwidgets::Pushbutton::text {
  184.     $itk_component(pushButton) configure -text $itk_option(-text)
  185.  
  186.     _relayout
  187. }
  188.  
  189. # ------------------------------------------------------------------
  190. # OPTION: -bitmap
  191. #
  192. # Specifies the label bitmap.
  193. # ------------------------------------------------------------------
  194. configbody iwidgets::Pushbutton::bitmap {
  195.     $itk_component(pushButton) configure -bitmap $itk_option(-bitmap)
  196.  
  197.     _relayout
  198. }
  199.  
  200. # ------------------------------------------------------------------
  201. # OPTION: -image
  202. #
  203. # Specifies the label image.
  204. # ------------------------------------------------------------------
  205. configbody iwidgets::Pushbutton::image {
  206.     $itk_component(pushButton) configure -image $itk_option(-image)
  207.  
  208.     _relayout
  209. }
  210.  
  211. # ------------------------------------------------------------------
  212. # OPTION: -highlightthickness
  213. #
  214. # Specifies the thickness of the highlight ring.
  215. # ------------------------------------------------------------------
  216. configbody iwidgets::Pushbutton::highlightthickness {
  217.     $itk_component(pushButton) configure \
  218.         -highlightthickness $itk_option(-highlightthickness)
  219.  
  220.     _relayout
  221. }
  222.  
  223. # ------------------------------------------------------------------
  224. # OPTION: -borderwidth
  225. #
  226. # Specifies the width of the relief border.
  227. # ------------------------------------------------------------------
  228. configbody iwidgets::Pushbutton::borderwidth {
  229.     $itk_component(pushButton) configure -borderwidth $itk_option(-borderwidth)
  230.  
  231.     _relayout
  232. }
  233.  
  234. # ------------------------------------------------------------------
  235. # OPTION: -defaultring
  236. #
  237. # Boolean describing whether the button displays its default ring.  
  238. # ------------------------------------------------------------------
  239. configbody iwidgets::Pushbutton::defaultring {
  240.     _relayout
  241. }
  242.  
  243. # ------------------------------------------------------------------
  244. # OPTION: -defaultringpad
  245. #
  246. # The size of the padded default ring around the button.
  247. # ------------------------------------------------------------------
  248. configbody iwidgets::Pushbutton::defaultringpad {
  249.     pack $itk_component(pushButton) \
  250.         -padx $itk_option(-defaultringpad) \
  251.         -pady $itk_option(-defaultringpad)
  252. }
  253.  
  254. # ------------------------------------------------------------------
  255. # OPTION: -height
  256. #
  257. # Specifies the height of the button inclusive of any default ring.
  258. # A value of zero lets the push button determine the height based
  259. # on the requested height plus highlightring and defaultringpad.
  260. # ------------------------------------------------------------------
  261. configbody iwidgets::Pushbutton::height {
  262.     _relayout
  263. }
  264.  
  265. # ------------------------------------------------------------------
  266. # OPTION: -width
  267. #
  268. # Specifies the width of the button inclusive of any default ring.
  269. # A value of zero lets the push button determine the width based
  270. # on the requested width plus highlightring and defaultringpad.
  271. # ------------------------------------------------------------------
  272. configbody iwidgets::Pushbutton::width {
  273.     _relayout
  274. }
  275.  
  276. # ------------------------------------------------------------------
  277. #                            METHODS
  278. # ------------------------------------------------------------------
  279.  
  280. # ------------------------------------------------------------------
  281. # METHOD: flash
  282. #
  283. # Thin wrap of standard button widget flash method.
  284. # ------------------------------------------------------------------
  285. body iwidgets::Pushbutton::flash {} {
  286.     $itk_component(pushButton) flash
  287. }
  288.  
  289. # ------------------------------------------------------------------
  290. # METHOD: invoke
  291. #
  292. # Thin wrap of standard button widget invoke method.
  293. # ------------------------------------------------------------------
  294. body iwidgets::Pushbutton::invoke {} {
  295.     $itk_component(pushButton) invoke
  296. }
  297.  
  298. # ------------------------------------------------------------------
  299. # PRIVATE METHOD: _relayout ?when?
  300. #
  301. # Adjust the width and height of the Pushbutton to accomadate all the
  302. # current options settings.  Add back in the highlightthickness to 
  303. # the button such that the correct reqwidth and reqheight are computed.  
  304. # Set the width and height based on the reqwidth/reqheight, 
  305. # highlightthickness, and ringpad.  Finally, configure the defaultring
  306. # properly. If "when" is "now", the change is applied immediately.  If 
  307. # it is "later" or it is not specified, then the change is applied later,
  308. # when the application is idle.
  309. # ------------------------------------------------------------------
  310. body iwidgets::Pushbutton::_relayout {{when later}} {
  311.     if {$when == "later"} {
  312.     if {$_reposition == ""} {
  313.         set _reposition [after idle [code $this _relayout now]]
  314.     }
  315.     return
  316.     } elseif {$when != "now"} {
  317.     error "bad option \"$when\": should be now or later"
  318.     }
  319.  
  320.     set _reposition ""
  321.  
  322.     if {$itk_option(-width) == 0} {
  323.     set w [expr [winfo reqwidth $itk_component(pushButton)] \
  324.         + 2 * $itk_option(-highlightthickness) \
  325.         + 2 * $itk_option(-borderwidth) \
  326.         + 2 * $itk_option(-defaultringpad)]
  327.     } else {
  328.     set w $itk_option(-width)
  329.     }
  330.     
  331.     if {$itk_option(-height) == 0} {
  332.     set h [expr [winfo reqheight $itk_component(pushButton)] \
  333.         + 2 * $itk_option(-highlightthickness) \
  334.         + 2 * $itk_option(-borderwidth) \
  335.         + 2 * $itk_option(-defaultringpad)]
  336.     } else {
  337.     set h $itk_option(-height)
  338.     }
  339.     
  340.     component hull configure -width $w -height $h
  341.     
  342.     if {$itk_option(-defaultring)} {
  343.     component hull configure -relief sunken \
  344.         -highlightthickness [$this cget -highlightthickness] \
  345.         -takefocus 1
  346.  
  347.     configure -takefocus 1
  348.     
  349.     component pushButton configure \
  350.         -highlightthickness 0 -takefocus 0
  351.     
  352.     } else {
  353.     component hull configure -relief flat \
  354.         -highlightthickness 0 -takefocus 0
  355.     
  356.     component pushButton configure \
  357.         -highlightthickness [$this cget -highlightthickness] \
  358.         -takefocus 1
  359.  
  360.     configure -takefocus 0
  361.     }
  362. }
  363.