Clarify portability and main program.
[python/dscho.git] / Mac / Contrib / BBPy / PythonSlave.py
blobcc63e1d4420104479b9a4055cf4e3b81dc2f7760
1 """PythonSlave.py
2 An application that responds to three types of apple event:
3 'pyth'/'EXEC': execute direct parameter as Python
4 'aevt', 'quit': quit
5 'aevt', 'odoc': perform python scripts
7 Copyright © 1996, Just van Rossum, Letterror
8 """
10 __version__ = "0.1.3"
12 import FrameWork
13 import sys
14 import traceback
15 import aetools
16 import string
17 import AE
18 import EasyDialogs
19 import os
20 import Qd
21 from Types import *
22 from Events import charCodeMask, cmdKey
23 import MacOS
24 import Evt
26 def dummyfunc(): pass
28 modulefilename = dummyfunc.func_code.co_filename
30 def Interact(timeout = 50000000): # timeout after 10 days...
31 AE.AEInteractWithUser(timeout)
34 class PythonSlave(FrameWork.Application):
35 def __init__(self):
36 FrameWork.Application.__init__(self)
37 AE.AEInstallEventHandler('pyth', 'EXEC', ExecHandler)
38 AE.AEInstallEventHandler('aevt', 'quit', QuitHandler)
39 AE.AEInstallEventHandler('aevt', 'odoc', OpenDocumentHandler)
41 def makeusermenus(self):
42 self.filemenu = m = FrameWork.Menu(self.menubar, "File")
43 self._quititem = FrameWork.MenuItem(m, "Quit", "Q", self._quit)
45 def do_kHighLevelEvent(self, event):
46 (what, message, when, where, modifiers) = event
47 try:
48 AE.AEProcessAppleEvent(event)
49 except AE.Error, detail:
50 print "Apple Event was not handled, error:", detail
52 def do_key(self, event):
53 (what, message, when, where, modifiers) = event
54 c = chr(message & charCodeMask)
55 if modifiers & cmdKey and c == '.':
56 return
57 FrameWork.Application.do_key(self, event)
59 def idle(self, event):
60 Qd.InitCursor()
62 def quit(self, *args):
63 raise self
65 def getabouttext(self):
66 return "About PythonSlaveŠ"
68 def do_about(self, id, item, window, event):
69 EasyDialogs.Message("PythonSlave " + __version__ + "\rCopyright © 1996, Letterror, JvR")
72 def ExecHandler(theAppleEvent, theReply):
73 parameters, args = aetools.unpackevent(theAppleEvent)
74 if parameters.has_key('----'):
75 if parameters.has_key('NAME'):
76 print '--- executing "' + parameters['NAME'] + '" ---'
77 else:
78 print '--- executing "<unknown>" ---'
79 stuff = parameters['----']
80 MyExec(stuff + "\n") # execute input
81 print '--- done ---'
82 return 0
84 def MyExec(stuff):
85 stuff = string.splitfields(stuff, '\r') # convert return chars
86 stuff = string.joinfields(stuff, '\n') # to newline chars
87 Interact()
88 saveyield = MacOS.EnableAppswitch(1)
89 try:
90 exec stuff in {}
91 except:
92 MacOS.EnableAppswitch(saveyield)
93 traceback.print_exc()
94 MacOS.EnableAppswitch(saveyield)
96 def OpenDocumentHandler(theAppleEvent, theReply):
97 parameters, args = aetools.unpackevent(theAppleEvent)
98 docs = parameters['----']
99 if type(docs) <> ListType:
100 docs = [docs]
101 for doc in docs:
102 fss, a = doc.Resolve()
103 path = fss.as_pathname()
104 if path <> modulefilename:
105 MyExecFile(path)
106 return 0
108 def MyExecFile(path):
109 saveyield = MacOS.EnableAppswitch(1)
110 savewd = os.getcwd()
111 os.chdir(os.path.split(path)[0])
112 print '--- Executing file "' + os.path.split(path)[1] + '"'
113 try:
114 execfile(path, {"__name__": "__main__"})
115 except:
116 traceback.print_exc()
117 MacOS.EnableAppswitch(saveyield)
118 MacOS.EnableAppswitch(saveyield)
119 os.chdir(savewd)
120 print "--- done ---"
122 def QuitHandler(theAppleEvent, theReply):
123 slave.quit()
124 return 0
127 slave = PythonSlave()
128 print "PythonSlave", __version__, "ready."
129 slave.mainloop()