home *** CD-ROM | disk | FTP | other *** search
- /* BBPython
- A simple menu command to send the contents of a window to the Python interpreter
-
- copyright © 1996 Just van Rossum, Letterror: just@knoware.nl
-
- All Rights Reserved
- */
-
- #include "BBPy.h"
-
- OSErr SendTextAsAE(ExternalCallbackBlock *callbacks, Ptr theText, long theSize, Str255 windowTitle)
- {
- OSErr err;
- AEDesc theEvent;
- AEAddressDesc theTarget;
- AppleEvent theReply;
- AEDesc theTextDesc;
- AEDesc theNameDesc;
- OSType pythonSig = 'Pyth';
- FSSpec docSpec;
- short itemHit;
- long time;
- EventRecord theDummyEvent;
-
- /* initialize AE descriptor for python's signature */
- err = AECreateDesc (typeApplSignature, &pythonSig, sizeof(OSType), &theTarget);
- if(err != noErr) return err;
-
- /* initialize AE descriptor for the title of our window */
- err = AECreateDesc (typeChar, &windowTitle[1], windowTitle[0], &theNameDesc);
- if(err != noErr) return err;
-
- /* initialize AE descriptor for the content of our window */
- err = AECreateDesc ('TEXT', theText, theSize, &theTextDesc);
- if(err != noErr) return err;
-
- /* initialize AppleEvent */
- err = AECreateAppleEvent ('pyth', 'EXEC', &theTarget, kAutoGenerateReturnID, kAnyTransactionID, &theEvent);
- if(err != noErr) return err;
-
- /* add the content of our window to the AppleEvent */
- err = AEPutParamDesc (&theEvent, keyDirectObject, &theTextDesc);
- if(err != noErr) return err;
-
- /* add the title of our window to the AppleEvent */
- err = AEPutParamDesc (&theEvent, 'NAME', &theNameDesc);
- if(err != noErr) return err;
-
- /* send the AppleEvent */
- err = AESend (&theEvent, &theReply, kAEWaitReply, kAEHighPriority, kNoTimeOut, NULL, NULL);
- if(err == connectionInvalid) {
- // launch PythonSlave.py
- itemHit = Alert(128, NULL);
- if(itemHit == 2) return noErr; /* user cancelled */
-
- if( ! GetPythonSlaveSpec(&docSpec) )
- return noErr; /* user cancelled */
-
- err = LaunchPythonSlave(&docSpec);
- if(err != noErr) return err;
- } else if(err != noErr)
- return err;
-
- /* clean up */
- err = AEDisposeDesc (&theTarget);
- if(err != noErr) return err;
-
- err = AEDisposeDesc (&theNameDesc);
- if(err != noErr) return err;
-
- err = AEDisposeDesc (&theTextDesc);
- if(err != noErr) return err;
-
- err = AEDisposeDesc (&theEvent);
- if(err != noErr) return err;
-
- err = AEDisposeDesc (&theReply);
- if(err != noErr) return err;
-
- /* everything is cool */
- return noErr;
- }
-
- pascal void main(ExternalCallbackBlock *callbacks, WindowPtr theWindow)
- {
- long oldA4;
- OSErr err;
- Handle windowContents;
- Str255 windowTitle;
-
- //RememberA0(); /* Can't find header file for this. Seems to work anyway. */
-
- oldA4 = SetUpA4();
-
- GetWTitle(theWindow, windowTitle);
- windowContents = callbacks->GetWindowContents(theWindow);
-
- HLock(windowContents);
- err = SendTextAsAE(callbacks, *windowContents, GetHandleSize(windowContents), windowTitle);
- if(err != noErr) callbacks->ReportOSError(err);
- HUnlock(windowContents);
-
- RestoreA4(oldA4);
- }
-