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