tclets.tcl
上传用户:rrhhcc
上传日期:2015-12-11
资源大小:54129k
文件大小:6k
源码类别:

通讯编程

开发平台:

Visual C++

  1. # tclets.tcl --
  2. #
  3. # Drag & Drop Tclets
  4. # by Ray Johnson
  5. #
  6. # A simple way to create Tcl applications.  This applications will copy a
  7. # droped Tcl file into a copy of a stub application (the user can pick).
  8. # The file is placed into the TEXT resource named "tclshrc" which is
  9. # automatically executed on startup.
  10. #
  11. # RCS: @(#) $Id: tclets.tcl,v 1.3 2001/08/06 18:29:41 dgp Exp $
  12. #
  13. # Copyright (c) 1997 Sun Microsystems, Inc.
  14. #
  15. # See the file "license.terms" for information on usage and redistribution
  16. # of this file, and for a DISCLAIMER OF ALL WARRANTIES.
  17. #
  18. namespace eval ::tk {}
  19. namespace eval ::tk::mac {}
  20. # ::tk::mac::OpenDocument --
  21. #
  22. # This procedure is a called whenever Wish recieves an "Open" event.  The
  23. # procedure must be named ::tk::mac::OpenDocument for this to work.
  24. # Passed in files are assumed to be Tcl files that the user wants to be
  25. # made into Tclets.  (Only the first one is used.)  The procedure then
  26. # creates a copy of the stub app and places the Tcl file in the new
  27. # application's resource fork.
  28. #
  29. # Parameters:
  30. # args List of files
  31. #
  32. # Results:
  33. #  One success a new Tclet is created.
  34. proc ::tk::mac::OpenDocument {args} {
  35.     variable Droped_to_start
  36.     
  37.     # We only deal with the one file droped on the App
  38.     set tclFile [lindex $args 0]
  39.     set stub [GetStub]
  40.     
  41.     # Give a helper screen to guide user
  42.     toplevel .helper -menu .bar
  43.     ::tk::unsupported::MacWindowStyle style .helper dBoxProc
  44.     message .helper.m -aspect 300 -text 
  45. "Select the name & location of your target Tcl application."
  46.     pack .helper.m
  47.     wm geometry .helper +20+40
  48.     update idletasks
  49.     
  50.     # Get the target file from the end user
  51.     set target [tk_getSaveFile]
  52.     destroy .helper
  53.     if {$target == ""} return
  54.     
  55.     # Copy stub, copy the droped file into the stubs text resource
  56.     file copy $stub $target
  57.     set id [open $tclFile r]
  58.     set rid [resource open $target w]
  59.     resource write -name tclshrc -file $rid TEXT [read $id]
  60.     resource close $rid
  61.     close $id
  62.     
  63.     # This is a hint to the start-up code - always set to true
  64.     set Droped_to_start true
  65. }
  66. # ::tk::mac::GetStub --
  67. #
  68. # Get the location of our stub application.  The value may be cached,
  69. # in the preferences file, or we may need to ask the user.
  70. #
  71. # Parameters:
  72. # None.
  73. #
  74. # Results:
  75. #  A path to the stub application.
  76. proc ::tk::mac::GetStub {} {
  77.     global env
  78.     variable Stub_location
  79.     
  80.     if {[info exists Stub_location]} {
  81. return $Stub_location
  82.     }
  83.     
  84.     set file $env(PREF_FOLDER)
  85.     append file "D&D Tclet Preferences"
  86.     
  87.     
  88.     if {[file exists $file]} {
  89. uplevel #0 [list source $file]
  90. if {[info exists Stub_location] && [file exists $Stub_location]} {
  91.     return $Stub_location
  92. }
  93.     }
  94.     SelectStub
  95.     if {[info exists Stub_location]} {
  96. return $Stub_location
  97.     } else {
  98. exit
  99.     }
  100. }
  101. # ::tk::mac::SelectStub --
  102. #
  103. # This procedure uses tk_getOpenFile to allow the user to select
  104. # the copy of "Wish" that is used as the basis for Tclets.  The
  105. # result is stored in a preferences file.
  106. #
  107. # Parameters:
  108. # None.
  109. #
  110. # Results:
  111. #  None.  The prefernce file is updated.
  112. proc ::tk::mac::SelectStub {} {
  113.     global env 
  114.     variable Stub_location
  115.     # Give a helper screen to guide user
  116.     toplevel .helper -menu .bar
  117.     ::tk::unsupported::MacWindowStyle style .helper dBoxProc
  118.     message .helper.m -aspect 300 -text 
  119.         "Select "Wish" stub to clone.  A copy of this application will be made to create your Tclet." 
  120.     pack .helper.m
  121.     wm geometry .helper +20+40
  122.     update idletasks
  123.     set new_location [tk_getOpenFile]
  124.     destroy .helper
  125.     if {$new_location != ""} {
  126. set Stub_location $new_location
  127. set file [file join $env(PREF_FOLDER) "D&D Tclet Preferences"]
  128.     
  129. set id [open $file w]
  130. puts $id [list set [namespace which -variable Stub_location] 
  131. $Stub_location]
  132. close $id
  133.     }
  134. }
  135. # ::tk::mac::CreateMenus --
  136. #
  137. # Create the menubar for this application.
  138. #
  139. # Parameters:
  140. # None.
  141. #
  142. # Results:
  143. #  None.
  144. proc ::tk::mac::CreateMenus {} {
  145.     menu .bar
  146.     .bar add cascade -menu .bar.file -label File
  147.     .bar add cascade -menu .bar.apple
  148.     . configure -menu .bar
  149.     
  150.     menu .bar.apple -tearoff 0
  151.     .bar.apple add command -label "About Drag & Drop Tclets..." 
  152.     -command [namespace code ShowAbout]
  153.     menu .bar.file -tearoff 0
  154.     .bar.file add command -label "Show Console..." -command {console show}
  155.     .bar.file add command -label "Select Wish Stub..." 
  156.     -command [namespace code SelectStub]
  157.     .bar.file add separator
  158.     .bar.file add command -label "Quit" -accel Command-Q -command exit
  159. }
  160. # ::tk::mac::ShowAbout --
  161. #
  162. # Show the about box for Drag & Drop Tclets.
  163. #
  164. # Parameters:
  165. # None.
  166. #
  167. # Results:
  168. #  None.
  169. proc ::tk::mac::ShowAbout {} {
  170.     tk_messageBox -icon info -type ok -message 
  171. "Drag & Drop Tclets
  172. by Ray Johnsonnn
  173. Copyright (c) 1997 Sun Microsystems, Inc."
  174. }
  175. # ::tk::mac::Start --
  176. #
  177. # This procedure provides the main start-up code for the application.
  178. # It should be run first thing on start up.  It will create the UI
  179. # and set up the rest of the state of the application.
  180. #
  181. # Parameters:
  182. # None.
  183. #
  184. # Results:
  185. #  None.
  186. proc ::tk::mac::Start {} {
  187.     variable Droped_to_start
  188.     # Hide . & console - see if we ran as a droped item
  189.     wm geometry . 1x1-25000-25000
  190.     console hide
  191.     # Run update - if we get any drop events we know that we were
  192.     # started by a drag & drop - if so, we quit automatically when done
  193.     set Droped_to_start false
  194.     update
  195.     if {$Droped_to_start == "true"} {
  196. exit
  197.     }
  198.     
  199.     # We were not started by a drag & drop - create the UI
  200.     CreateMenus
  201. }
  202. # Now that everything is defined, lets start the app!
  203. ::tk::mac::Start