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 / shell.itk < prev    next >
Text File  |  2003-09-01  |  13KB  |  376 lines

  1. # Shell
  2. # ----------------------------------------------------------------------
  3. # This class is implements a shell which is a top level widget
  4. # giving a childsite and providing activate, deactivate, and center 
  5. # methods.
  6. #    
  7. # ----------------------------------------------------------------------
  8. #  AUTHOR: Mark L. Ulferts              EMAIL: mulferts@austin.dsccc.com
  9. #          Kris Raney                   EMAIL: kraney@spd.dsccc.com
  10. #
  11. #  @(#) $Id: shell.itk,v 1.7 2002/02/25 06:43:26 mgbacke Exp $
  12. # ----------------------------------------------------------------------
  13. #            Copyright (c) 1996 DSC Technologies Corporation
  14. # ======================================================================
  15. # Permission to use, copy, modify, distribute and license this software 
  16. # and its documentation for any purpose, and without fee or written 
  17. # agreement with DSC, is hereby granted, provided that the above copyright 
  18. # notice appears in all copies and that both the copyright notice and 
  19. # warranty disclaimer below appear in supporting documentation, and that 
  20. # the names of DSC Technologies Corporation or DSC Communications 
  21. # Corporation not be used in advertising or publicity pertaining to the 
  22. # software without specific, written prior permission.
  23. # DSC DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING 
  24. # ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, AND NON-
  25. # INFRINGEMENT. THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, AND THE
  26. # AUTHORS AND DISTRIBUTORS HAVE NO OBLIGATION TO PROVIDE MAINTENANCE, 
  27. # SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. IN NO EVENT SHALL 
  28. # DSC BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR 
  29. # ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, 
  30. # WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTUOUS ACTION,
  31. # ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS 
  32. # SOFTWARE.
  33. # ======================================================================
  34.  
  35. #
  36. # Usual options.
  37. #
  38. itk::usual Shell {
  39.     keep -background -cursor -modality 
  40. }
  41.  
  42. # ------------------------------------------------------------------
  43. #                            SHELL
  44. # ------------------------------------------------------------------
  45. itcl::class iwidgets::Shell {
  46.     inherit itk::Toplevel
  47.  
  48.     constructor {args} {}
  49.  
  50.     itk_option define -master master Window "" 
  51.     itk_option define -modality modality Modality none
  52.     itk_option define -padx padX Pad 0
  53.     itk_option define -pady padY Pad 0
  54.     itk_option define -width width Width 0
  55.     itk_option define -height height Height 0
  56.  
  57.     public method childsite {}
  58.     public method activate {}
  59.     public method deactivate {args}
  60.     public method center {{widget {}}}
  61.  
  62.     private variable _result {}     ;# Resultant value for modal activation.
  63.     private variable _busied {}     ;# List of busied top level widgets.
  64.  
  65.     common grabstack {}
  66.     common _wait
  67. }
  68.  
  69. #
  70. # Provide a lowercased access method for the Shell class.
  71. proc ::iwidgets::shell {pathName args} {
  72.     uplevel ::iwidgets::Shell $pathName $args
  73. }
  74.  
  75. # ------------------------------------------------------------------
  76. #                        CONSTRUCTOR
  77. # ------------------------------------------------------------------
  78. itcl::body iwidgets::Shell::constructor {args} {
  79.     itk_option add hull.width hull.height
  80.  
  81.     #
  82.     # Maintain a withdrawn state until activated.  
  83.     #
  84.     wm withdraw $itk_component(hull)
  85.     
  86.     #
  87.     # Create the user child site
  88.     #
  89.     itk_component add -protected shellchildsite {
  90.         frame $itk_interior.shellchildsite
  91.     } 
  92.     pack $itk_component(shellchildsite) -fill both -expand yes
  93.  
  94.     #
  95.     # Set the itk_interior variable to be the childsite for derived 
  96.     # classes.
  97.     #
  98.     set itk_interior $itk_component(shellchildsite)
  99.  
  100.     #
  101.     # Bind the window manager delete protocol to deactivation of the 
  102.     # widget.  This can be overridden by the user via the execution 
  103.     # of a similar command outside the class.
  104.     #
  105.     wm protocol $itk_component(hull) WM_DELETE_WINDOW [itcl::code $this deactivate]
  106.     
  107.     #
  108.     # Initialize the widget based on the command line options.
  109.     #
  110.     eval itk_initialize $args
  111. }
  112.  
  113. # ------------------------------------------------------------------
  114. #                             OPTIONS
  115. # ------------------------------------------------------------------
  116.  
  117. # ------------------------------------------------------------------
  118. # OPTION: -master
  119. #
  120. # Specifies the master window for the shell.  The window manager is
  121. # informed that the shell is a transient window whose master is
  122. # -masterwindow.
  123. # ------------------------------------------------------------------
  124. itcl::configbody iwidgets::Shell::master {}
  125.  
  126. # ------------------------------------------------------------------
  127. # OPTION: -modality
  128. #
  129. # Specify the modality of the dialog.
  130. # ------------------------------------------------------------------
  131. itcl::configbody iwidgets::Shell::modality {
  132.     switch $itk_option(-modality) {
  133.         none -
  134.         application -
  135.         global {
  136.         }
  137.         
  138.         default {
  139.             error "bad modality option \"$itk_option(-modality)\":\
  140.                     should be none, application, or global"
  141.         }
  142.     }
  143. }
  144.  
  145. # ------------------------------------------------------------------
  146. # OPTION: -padx
  147. #
  148. # Specifies a padding distance for the childsite in the X-direction.
  149. # ------------------------------------------------------------------
  150. itcl::configbody iwidgets::Shell::padx {
  151.     pack config $itk_component(shellchildsite) -padx $itk_option(-padx)
  152. }
  153.  
  154. # ------------------------------------------------------------------
  155. # OPTION: -pady
  156. #
  157. # Specifies a padding distance for the childsite in the Y-direction.
  158. # ------------------------------------------------------------------
  159. itcl::configbody iwidgets::Shell::pady {
  160.     pack config $itk_component(shellchildsite) -pady $itk_option(-pady)
  161. }
  162.  
  163. # ------------------------------------------------------------------
  164. # OPTION: -width
  165. #
  166. # Specifies the width of the shell.  The value may be specified in 
  167. # any of the forms acceptable to Tk_GetPixels.  A value of zero 
  168. # causes the width to be adjusted to the required value based on 
  169. # the size requests of the components placed in the childsite.  
  170. # Otherwise, the width is fixed.
  171. # ------------------------------------------------------------------
  172. itcl::configbody iwidgets::Shell::width {
  173.     #
  174.     # The width option was added to the hull in the constructor.
  175.     # So, any width value given is passed automatically to the
  176.     # hull.  All we have to do is play with the propagation.
  177.     #
  178.     if {$itk_option(-width) != 0} {
  179.     pack propagate $itk_component(hull) no
  180.     } else {
  181.     pack propagate $itk_component(hull) yes
  182.     }
  183. }
  184.  
  185. # ------------------------------------------------------------------
  186. # OPTION: -height
  187. #
  188. # Specifies the height of the shell.  The value may be specified in 
  189. # any of the forms acceptable to Tk_GetPixels.  A value of zero 
  190. # causes the height to be adjusted to the required value based on 
  191. # the size requests of the components placed in the childsite.
  192. # Otherwise, the height is fixed.
  193. # ------------------------------------------------------------------
  194. itcl::configbody iwidgets::Shell::height {
  195.     #
  196.     # The height option was added to the hull in the constructor.
  197.     # So, any height value given is passed automatically to the
  198.     # hull.  All we have to do is play with the propagation.
  199.     #
  200.     if {$itk_option(-height) != 0} {
  201.     pack propagate $itk_component(hull) no
  202.     } else {
  203.     pack propagate $itk_component(hull) yes
  204.     }
  205. }
  206.  
  207. # ------------------------------------------------------------------
  208. #                            METHODS
  209. # ------------------------------------------------------------------
  210.  
  211. # ------------------------------------------------------------------
  212. # METHOD: childsite
  213. #
  214. # Return the pathname of the user accessible area.
  215. # ------------------------------------------------------------------
  216. itcl::body iwidgets::Shell::childsite {} {
  217.     return $itk_component(shellchildsite)
  218. }
  219.  
  220. # ------------------------------------------------------------------
  221. # METHOD: activate
  222. #
  223. # Display the dialog and wait based on the modality.  For application
  224. # and global modal activations, perform a grab operation, and wait
  225. # for the result.  The result may be returned via an argument to the
  226. # "deactivate" method.
  227. # ------------------------------------------------------------------
  228. itcl::body iwidgets::Shell::activate {} {
  229.  
  230.     if {[winfo ismapped $itk_component(hull)]} {
  231.         raise $itk_component(hull)
  232.     return
  233.     }
  234.     
  235.     if {($itk_option(-master) != {}) && \
  236.         [winfo exists $itk_option(-master)]} {
  237.     wm transient $itk_component(hull) $itk_option(-master)
  238.     } 
  239.  
  240.     set _wait($this) 0
  241.     raise $itk_component(hull)
  242.     wm deiconify $itk_component(hull)
  243.     tkwait visibility $itk_component(hull)
  244.  
  245.     # Need to flush the event loop.  This line added as a result of
  246.     # SF ticket #227885.
  247.     update idletasks
  248.     
  249.     if {$itk_option(-modality) == "application"} {
  250.         if {$grabstack != {}} {
  251.             grab release [lindex $grabstack end]
  252.         }
  253.  
  254.     set err 1
  255.     while {$err == 1} {
  256.         set err [catch [list grab $itk_component(hull)]]
  257.         if {$err == 1} {
  258.         after 1000
  259.         }
  260.     }
  261.  
  262.         lappend grabstack [list grab $itk_component(hull)]
  263.         
  264.         tkwait variable [itcl::scope _wait($this)]
  265.         return $_result
  266.         
  267.     } elseif {$itk_option(-modality) == "global" }  {
  268.         if {$grabstack != {}} {
  269.             grab release [lindex $grabstack end]
  270.         }
  271.  
  272.     set err 1
  273.     while {$err == 1} {
  274.         set err [catch [list grab -global $itk_component(hull)]]
  275.         if {$err == 1} {
  276.         after 1000
  277.         }
  278.     }
  279.  
  280.         lappend grabstack [list grab -global $itk_component(hull)]
  281.  
  282.         tkwait variable [itcl::scope _wait($this)]
  283.         return $_result
  284.     }
  285. }
  286.  
  287. # ------------------------------------------------------------------
  288. # METHOD: deactivate
  289. #
  290. # Deactivate the display of the dialog.  The method takes an optional
  291. # argument to passed to the "activate" method which returns the value.
  292. # This is only effective for application and global modal dialogs.
  293. # ------------------------------------------------------------------
  294. itcl::body iwidgets::Shell::deactivate {args} {
  295.  
  296.     if {! [winfo ismapped $itk_component(hull)]} {
  297.         return
  298.     }
  299.     
  300.     if {$itk_option(-modality) == "none"} {
  301.         wm withdraw $itk_component(hull)
  302.     } elseif {$itk_option(-modality) == "application"} {
  303.         grab release $itk_component(hull)
  304.         if {$grabstack != {}} {
  305.             if {[set grabstack [lreplace $grabstack end end]] != {}} {
  306.                 eval [lindex $grabstack end]
  307.             }
  308.         }
  309.  
  310.         wm withdraw $itk_component(hull)
  311.         
  312.     } elseif {$itk_option(-modality) == "global"} {
  313.         grab release $itk_component(hull)
  314.         if {$grabstack != {}} {
  315.             if {[set grabstack [lreplace $grabstack end end]] != {}} {
  316.                 eval [lindex $grabstack end]
  317.             }
  318.         }
  319.  
  320.         wm withdraw $itk_component(hull)
  321.     }
  322.     
  323.     if {[llength $args]} {
  324.         set _result $args
  325.     } else {
  326.         set _result {}
  327.     }
  328.     
  329.     set _wait($this) 1
  330.     return
  331. }
  332.  
  333. # ------------------------------------------------------------------
  334. # METHOD: center
  335. #
  336. # Centers the dialog with respect to another widget or the screen
  337. # as a whole.
  338. # ------------------------------------------------------------------
  339. itcl::body iwidgets::Shell::center {{widget {}}} {
  340.     update idletasks
  341.  
  342.     set hull $itk_component(hull)
  343.     set w [winfo width $hull]
  344.     set h [winfo height $hull]
  345.     set sh [winfo screenheight $hull]     ;# display screen's height/width
  346.     set sw [winfo screenwidth $hull]
  347.  
  348.     #
  349.     # User can request it centered with respect to root by passing in '{}'
  350.     #
  351.     if { $widget == "" } {
  352.         set reqX [expr {($sw-$w)/2}]
  353.         set reqY [expr {($sh-$h)/2}]
  354.     } else {
  355.         set wfudge 5      ;# wm width fudge factor
  356.         set hfudge 20     ;# wm height fudge factor
  357.         set widgetW [winfo width $widget]
  358.         set widgetH [winfo height $widget]
  359.         set reqX [expr {[winfo rootx $widget]+($widgetW-($widgetW/2))-($w/2)}]
  360.         set reqY [expr {[winfo rooty $widget]+($widgetH-($widgetH/2))-($h/2)}]
  361.  
  362.         #
  363.         # Adjust for errors - if too long or too tall
  364.         #
  365.         if { ($reqX+$w+$wfudge) > $sw } { set reqX [expr {$sw-$w-$wfudge}] }
  366.         if { $reqX < $wfudge } { set reqX $wfudge }
  367.         if { ($reqY+$h+$hfudge) > $sh } { set reqY [expr {$sh-$h-$hfudge}] }
  368.         if { $reqY < $hfudge } { set reqY $hfudge }
  369.     } 
  370.  
  371.     wm geometry $hull +$reqX+$reqY
  372. }
  373.  
  374.