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 / shell.itk < prev    next >
Text File  |  1999-02-24  |  13KB  |  372 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.2 1998/08/11 14:42:15 welch 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. 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. 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 [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. configbody iwidgets::Shell::master {}
  125.  
  126. # ------------------------------------------------------------------
  127. # OPTION: -modality
  128. #
  129. # Specify the modality of the dialog.
  130. # ------------------------------------------------------------------
  131. 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. 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. 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. 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. 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. 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. 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.     wm deiconify $itk_component(hull)
  242.     raise $itk_component(hull)
  243.     tkwait visibility $itk_component(hull)
  244.     
  245.     if {$itk_option(-modality) == "application"} {
  246.         if {$grabstack != {}} {
  247.             grab release [lindex $grabstack end]
  248.         }
  249.  
  250.     set err 1
  251.     while {$err == 1} {
  252.         set err [catch [list grab $itk_component(hull)]]
  253.         if {$err == 1} {
  254.         after 1000
  255.         }
  256.     }
  257.  
  258.         lappend grabstack [list grab $itk_component(hull)]
  259.         
  260.         tkwait variable [scope _wait($this)]
  261.         return $_result
  262.         
  263.     } elseif {$itk_option(-modality) == "global" }  {
  264.         if {$grabstack != {}} {
  265.             grab release [lindex $grabstack end]
  266.         }
  267.  
  268.     set err 1
  269.     while {$err == 1} {
  270.         set err [catch [list grab -global $itk_component(hull)]]
  271.         if {$err == 1} {
  272.         after 1000
  273.         }
  274.     }
  275.  
  276.         lappend grabstack [list grab -global $itk_component(hull)]
  277.  
  278.         tkwait variable [scope _wait($this)]
  279.         return $_result
  280.     }
  281. }
  282.  
  283. # ------------------------------------------------------------------
  284. # METHOD: deactivate
  285. #
  286. # Deactivate the display of the dialog.  The method takes an optional
  287. # argument to passed to the "activate" method which returns the value.
  288. # This is only effective for application and global modal dialogs.
  289. # ------------------------------------------------------------------
  290. body iwidgets::Shell::deactivate {args} {
  291.  
  292.     if {! [winfo ismapped $itk_component(hull)]} {
  293.         return
  294.     }
  295.     
  296.     if {$itk_option(-modality) == "none"} {
  297.         wm withdraw $itk_component(hull)
  298.     } elseif {$itk_option(-modality) == "application"} {
  299.         grab release $itk_component(hull)
  300.         if {$grabstack != {}} {
  301.             if {[set grabstack [lreplace $grabstack end end]] != {}} {
  302.                 eval [lindex $grabstack end]
  303.             }
  304.         }
  305.  
  306.         wm withdraw $itk_component(hull)
  307.         
  308.     } elseif {$itk_option(-modality) == "global"} {
  309.         grab release $itk_component(hull)
  310.         if {$grabstack != {}} {
  311.             if {[set grabstack [lreplace $grabstack end end]] != {}} {
  312.                 eval [lindex $grabstack end]
  313.             }
  314.         }
  315.  
  316.         wm withdraw $itk_component(hull)
  317.     }
  318.     
  319.     if {[llength $args]} {
  320.         set _result $args
  321.     } else {
  322.         set _result {}
  323.     }
  324.     
  325.     set _wait($this) 1
  326.     return
  327. }
  328.  
  329. # ------------------------------------------------------------------
  330. # METHOD: center
  331. #
  332. # Centers the dialog with respect to another widget or the screen
  333. # as a whole.
  334. # ------------------------------------------------------------------
  335. body iwidgets::Shell::center {{widget {}}} {
  336.     update idletasks
  337.  
  338.     set hull $itk_component(hull)
  339.     set w [winfo reqwidth $hull]
  340.     set h [winfo reqheight $hull]
  341.     set sh [winfo screenheight $hull]     ;# display screen's height/width
  342.     set sw [winfo screenwidth $hull]
  343.  
  344.     #
  345.     # User can request it centered with respect to root by passing in '{}'
  346.     #
  347.     if { $widget == "" } {
  348.         set reqX [expr {($sw-$w)/2}]
  349.         set reqY [expr {($sh-$h)/2}]
  350.     } else {
  351.         set wfudge 5      ;# wm width fudge factor
  352.         set hfudge 20     ;# wm height fudge factor
  353.         set widgetW [winfo width $widget]
  354.         set widgetH [winfo height $widget]
  355.         set reqX [expr [winfo rootx $widget]+($widgetW-($widgetW/2))-($w/2)]
  356.         set reqY [expr [winfo rooty $widget]+($widgetH-($widgetH/2))-($h/2)]
  357.  
  358.         #
  359.         # Adjust for errors - if too long or too tall
  360.         #
  361.         if { [expr $reqX+$w+$wfudge] > $sw } { set reqX [expr $sw-$w-$wfudge] }
  362.         if { $reqX < $wfudge } { set reqX $wfudge }
  363.         if { [expr $reqY+$h+$hfudge] > $sh } { set reqY [expr $sh-$h-$hfudge] }
  364.         if { $reqY < $hfudge } { set reqY $hfudge }
  365.     } 
  366.  
  367.     wm geometry $hull +$reqX+$reqY
  368. }
  369.  
  370.