Added 'description' class attribute to every command class (to help the
[python/dscho.git] / Mac / Contrib / BBPy / source / BBPy_main.c
bloba96b271abb34c6ca5e8da3bde49cd1bcc5298d79
1 /* BBPython
2 A simple menu command to send the contents of a window to the Python interpreter
4 copyright © 1996 Just van Rossum, Letterror: just@knoware.nl
6 All Rights Reserved
7 */
9 #include "BBPy.h"
11 OSErr SendTextAsAE(ExternalCallbackBlock *callbacks, Ptr theText, long theSize, Str255 windowTitle)
13 OSErr err;
14 AEDesc theEvent;
15 AEAddressDesc theTarget;
16 AppleEvent theReply;
17 AEDesc theTextDesc;
18 AEDesc theNameDesc;
19 OSType pythonSig = 'Pyth';
20 FSSpec docSpec;
21 short itemHit;
22 long time;
23 EventRecord theDummyEvent;
25 /* initialize AE descriptor for python's signature */
26 err = AECreateDesc (typeApplSignature, &pythonSig, sizeof(OSType), &theTarget);
27 if(err != noErr) return err;
29 /* initialize AE descriptor for the title of our window */
30 err = AECreateDesc (typeChar, &windowTitle[1], windowTitle[0], &theNameDesc);
31 if(err != noErr) return err;
33 /* initialize AE descriptor for the content of our window */
34 err = AECreateDesc ('TEXT', theText, theSize, &theTextDesc);
35 if(err != noErr) return err;
37 /* initialize AppleEvent */
38 err = AECreateAppleEvent ('pyth', 'EXEC', &theTarget, kAutoGenerateReturnID, kAnyTransactionID, &theEvent);
39 if(err != noErr) return err;
41 /* add the content of our window to the AppleEvent */
42 err = AEPutParamDesc (&theEvent, keyDirectObject, &theTextDesc);
43 if(err != noErr) return err;
45 /* add the title of our window to the AppleEvent */
46 err = AEPutParamDesc (&theEvent, 'NAME', &theNameDesc);
47 if(err != noErr) return err;
49 /* send the AppleEvent */
50 err = AESend (&theEvent, &theReply, kAEWaitReply, kAEHighPriority, kNoTimeOut, NULL, NULL);
51 if(err == connectionInvalid) {
52 // launch PythonSlave.py
53 itemHit = Alert(128, NULL);
54 if(itemHit == 2) return noErr; /* user cancelled */
56 if( ! GetPythonSlaveSpec(&docSpec) )
57 return noErr; /* user cancelled */
59 err = LaunchPythonSlave(&docSpec);
60 if(err != noErr) return err;
61 } else if(err != noErr)
62 return err;
64 /* clean up */
65 err = AEDisposeDesc (&theTarget);
66 if(err != noErr) return err;
68 err = AEDisposeDesc (&theNameDesc);
69 if(err != noErr) return err;
71 err = AEDisposeDesc (&theTextDesc);
72 if(err != noErr) return err;
74 err = AEDisposeDesc (&theEvent);
75 if(err != noErr) return err;
77 err = AEDisposeDesc (&theReply);
78 if(err != noErr) return err;
80 /* everything is cool */
81 return noErr;
84 pascal void main(ExternalCallbackBlock *callbacks, WindowPtr theWindow)
86 long oldA4;
87 OSErr err;
88 Handle windowContents;
89 Str255 windowTitle;
91 //RememberA0(); /* Can't find header file for this. Seems to work anyway. */
93 oldA4 = SetUpA4();
95 GetWTitle(theWindow, windowTitle);
96 windowContents = callbacks->GetWindowContents(theWindow);
98 HLock(windowContents);
99 err = SendTextAsAE(callbacks, *windowContents, GetHandleSize(windowContents), windowTitle);
100 if(err != noErr) callbacks->ReportOSError(err);
101 HUnlock(windowContents);
103 RestoreA4(oldA4);