home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 7 / Apprentice-Release7.iso / Source Code / C / Frameworks / MADE 1.0.1 / Essential Events.c < prev    next >
Encoding:
Text File  |  1997-06-04  |  7.4 KB  |  329 lines  |  [TEXT/CWIE]

  1. // MADE - Macintosh Application Development Essentials
  2. // ---------------------------------------------------
  3.  
  4. // (c) Gideon Greenspan, Sig Software - June 1997 - http://www.kagi.com/gdg/
  5.  
  6. // These files can only be used for experimental standalone purposes. To obtain
  7. // fully commented code, and licenses for standalone, shareware, internal and
  8. // commercial usage, run the enclosed Register application.
  9.  
  10. // Essential Events.c
  11. //
  12. // AppleEvent, Drag Manager handlers, initialisation and event handling.
  13. //
  14. // Version 1.0.0 - 10th November 1996
  15.  
  16. #include "Essential Headers.h"
  17. #include "Essential Prototypes.h"
  18.  
  19. WindowPtr    frontWindow=0;
  20.  
  21. #if Use_AppleEvents
  22.  
  23. // NOTE : UPP (Universal Procedure Pointers) are used to ensure compatiblity under 680x0,
  24. // PowerPC, and who knows what other future compilers.
  25.  
  26.     #include <AppleEvents.h>
  27.  
  28.     #if Handle_Open_Documents_Event
  29.         pascal OSErr        EventOpenHandler(AppleEvent*, AppleEvent*, long);
  30.         AEEventHandlerUPP    EventOpenUPP;
  31.     #endif
  32.  
  33.     #if Handle_Print_Documents_Event
  34.         pascal OSErr        EventPrintHandler(AppleEvent*, AppleEvent*, long);
  35.         AEEventHandlerUPP    EventPrintUPP;
  36.     #endif
  37.     
  38.     #if Handle_Open_Documents_Event || Handle_Print_Documents_Event
  39.         OSErr                 EventOpenPrintHandler(AppleEvent *event, AppleEvent*, long, Boolean);
  40.     #endif
  41.     
  42.     #if Handle_Quit_Application_Event
  43.         pascal OSErr        EventQuitHandler(AppleEvent*, AppleEvent*, long);
  44.         AEEventHandlerUPP    EventQuitUPP;
  45.     #endif
  46.  
  47. #endif
  48.  
  49. void MainEventLoop()
  50. {
  51.     EventRecord    theEvent;
  52.     char        keyCharacter;
  53.     short        mousePart;
  54.     WindowPtr    mouseWindow, oldPort;
  55.     Rect        growLimits;
  56.     long        growResult;
  57.     Point        localPoint;
  58.     Error        error=0;
  59.     
  60.     WaitNextEvent(everyEvent, &theEvent, Event_Sleep_Time, 0);
  61.     
  62.     mousePart=FindWindow(theEvent.where, &mouseWindow);
  63.     
  64.     if (frontWindow) {
  65.  
  66.         localPoint=theEvent.where;
  67.         GlobalToLocal(&localPoint);
  68.         MySetTheCursor(localPoint);
  69.  
  70.     } else SetCursor(&qd.arrow);
  71.  
  72.     if (mousePart==inContent) {
  73.         localPoint=theEvent.where;
  74.         
  75.         GetPort(&oldPort);
  76.         SetPort(mouseWindow);
  77.         GlobalToLocal(&localPoint);
  78.         SetPort(oldPort);
  79.     }
  80.     
  81.     switch (theEvent.what) {
  82.  
  83.         case nullEvent:
  84.             MyPerformIdleTasks();
  85.             break;
  86.             
  87.         case keyDown: case autoKey: // keyDown and autoKey not distinguished between
  88.             keyCharacter=theEvent.message&charCodeMask;
  89.             
  90.             if (theEvent.modifiers&cmdKey) {
  91.                 MyEnableMenus();
  92.                 SelectMenuItem(MenuKey(keyCharacter));
  93.  
  94.             } else
  95.                 MyHandleKeyDown(keyCharacter, theEvent.modifiers);
  96.  
  97.             break;
  98.             
  99.         case mouseDown:
  100.             switch (mousePart) {
  101.                 
  102.                 case inMenuBar:
  103.                     MyEnableMenus();
  104.                     SelectMenuItem(MenuSelect(theEvent.where));
  105.                     break;
  106.                     
  107.                 case inSysWindow:
  108.                     SystemClick(&theEvent, mouseWindow);
  109.                     break;
  110.                     
  111.                 case inContent:
  112.                     if (mouseWindow==frontWindow)
  113.                         MyHandleMouseDown(localPoint, theEvent.modifiers);
  114.                     else
  115.                         SelectWindow(mouseWindow);
  116.                     break;
  117.                     
  118.                 case inDrag:
  119.                     DragWindow(mouseWindow, theEvent.where, &qd.screenBits.bounds);
  120.                     break;
  121.                     
  122.                 case inGrow:
  123.                     if (mouseWindow==frontWindow) {
  124.  
  125.                         MyResizeBounds(&growLimits);
  126.  
  127.                         growResult=GrowWindow(frontWindow, theEvent.where, &growLimits);
  128.  
  129.                         if (growResult) {
  130.                             SizeWindow(frontWindow, LoWord(growResult), HiWord(growResult), true);
  131.                                 // last parameter specifies that new bit should be updated
  132.                             MySizedWindow();
  133.                         }
  134.  
  135.                     } else
  136.                         SelectWindow(mouseWindow);
  137.                     break;
  138.                     
  139.                 case inGoAway:
  140.                     if (mouseWindow==frontWindow) {
  141.  
  142.                         if (TrackGoAway(frontWindow, theEvent.where)) {
  143.                         
  144.                             MyCloseWindow();
  145.                             frontWindow=0;
  146.                         }
  147.  
  148.                     } else
  149.                         SelectWindow(mouseWindow);
  150.                     break;
  151.                     
  152.                 case inZoomIn: case inZoomOut:
  153.                     if (mouseWindow==frontWindow) {
  154.  
  155.                         ZoomWindow(frontWindow, mousePart, false);
  156.                             // All sorts of things could be done here but this is default behaviour
  157.                         MySizedWindow();
  158.  
  159.                     } else
  160.                         SelectWindow(mouseWindow);
  161.                     break;
  162.             }
  163.             break;
  164.             
  165.         case updateEvt:
  166.             BeginUpdate((WindowPtr)theEvent.message);
  167.             GetPort(&oldPort);
  168.             SetPort((WindowPtr)theEvent.message);
  169.             
  170.             MyDrawWindow((WindowPtr)theEvent.message);
  171.             SetPort(oldPort);
  172.             EndUpdate((WindowPtr)theEvent.message);
  173.             break;
  174.             
  175.         case activateEvt:
  176.             if (theEvent.modifiers&activeFlag) {
  177.                 frontWindow=(WindowPtr)theEvent.message;
  178.                 SetPort(frontWindow);
  179.                     // This is essential - all window-based actions depend on this call
  180.                 MyActivateWindow();
  181.     
  182.             } else {
  183.                 MyDeactivateWindow();
  184.                 frontWindow=0;
  185.             }
  186.             break;
  187.             
  188. #if Use_AppleEvents
  189.         case kHighLevelEvent:
  190.             error=AEProcessAppleEvent(&theEvent);
  191.             if (error!=errAEEventNotHandled)
  192.                 TestError(error);
  193.             break;
  194. #endif
  195.  
  196.     }
  197. }
  198.  
  199. #if Use_AppleEvents
  200.  
  201.     Error CheckRequiredParams(AppleEvent *appleEvent)
  202.     {
  203.         Error        error=0;
  204.         DescType    returnType;
  205.         Size        actualSize;
  206.  
  207.         error=AEGetAttributePtr(appleEvent, keyMissedKeywordAttr,
  208.             typeWildCard, &returnType, 0, 0, &actualSize);
  209.  
  210.         if (error==errAEDescNotFound) error=0;
  211.         else if (error==0) error=errAEEventNotHandled;
  212.  
  213.         return error;
  214.     }
  215.  
  216.     Error InitAppleEvents()
  217.     {
  218.         Error    error=0;
  219.         
  220.         // NOTE: the refCon parameter in the AEInstallEventHandler call need not be zero; you can
  221.         // pass a long word in that will get given to your handlers when they are called
  222.  
  223.         #if Handle_Open_Documents_Event
  224.  
  225.             EventOpenUPP=NewAEEventHandlerProc(EventOpenHandler);
  226.             error=AEInstallEventHandler(
  227.                 kCoreEventClass, kAEOpenDocuments, EventOpenUPP, 0, false);
  228.             TestError(error);
  229.                 _i(error)
  230.  
  231.         #endif    
  232.  
  233.         #if Handle_Print_Documents_Event
  234.  
  235.             EventPrintUPP=NewAEEventHandlerProc(EventPrintHandler);
  236.             error=AEInstallEventHandler(
  237.                 kCoreEventClass, kAEPrintDocuments, EventPrintUPP, 0, false);
  238.             TestError(error);
  239.                 _i(error)
  240.  
  241.         #endif    
  242.  
  243.         #if Handle_Quit_Application_Event
  244.  
  245.             EventQuitUPP=NewAEEventHandlerProc(EventQuitHandler);
  246.             error=AEInstallEventHandler(
  247.                 kCoreEventClass, kAEQuitApplication, EventQuitUPP, 0, false);
  248.             TestError(error);
  249.             
  250.         #endif
  251.         _e
  252.         return error;
  253.     }
  254.     
  255.     #if Handle_Open_Documents_Event
  256.     
  257.         pascal OSErr EventOpenHandler(AppleEvent* eventIn, AppleEvent* eventOut, long refCon)
  258.         {
  259.             return EventOpenPrintHandler(eventIn, eventOut, refCon, false);
  260.         }
  261.         
  262.     #endif
  263.     
  264.     #if Handle_Print_Documents_Event
  265.     
  266.         pascal OSErr EventPrintHandler(AppleEvent* eventIn, AppleEvent* eventOut, long refCon)
  267.         {
  268.             return EventOpenPrintHandler(eventIn, eventOut, refCon, true);
  269.         }
  270.         
  271.     #endif
  272.     
  273.     #if Handle_Open_Documents_Event || Handle_Print_Documents_Event
  274.     
  275.         OSErr EventOpenPrintHandler(AppleEvent *eventIn, AppleEvent*, long, Boolean printing)
  276.         {
  277.             AEDescList    docList;
  278.             DescType    returnType;
  279.             Size        actualSize;
  280.             long        docNum, numDocs;
  281.             FSSpec        fileSpec;
  282.             AEKeyword    keyword;
  283.             Error        error=0;
  284.             
  285.             error=AEGetParamDesc(eventIn, keyDirectObject, typeAEList, &docList);
  286.                 _i(error)
  287.             error=CheckRequiredParams(eventIn);
  288.                 _i(error)
  289.             error=AECountItems(&docList, &numDocs);
  290.                 _i(error)
  291.             
  292.             for (docNum=1; docNum<=numDocs; docNum++) {
  293.                 error=AEGetNthPtr(&docList, docNum, typeFSS, &keyword,
  294.                     &returnType, &fileSpec, sizeof(fileSpec), &actualSize);
  295.                     _i(error)
  296.                 
  297.                 if (printing)
  298.                     MyPrintDocument(&fileSpec);
  299.                 else
  300.                     MyOpenDocument(&fileSpec);
  301.             }
  302.             
  303.             error=AEDisposeDesc(&docList);
  304.  
  305.             _e
  306.             return error;
  307.         }
  308.  
  309.     #endif
  310.     
  311.     #if Handle_Quit_Application_Event
  312.     
  313.         pascal OSErr EventQuitHandler(AppleEvent* event, AppleEvent*, long)
  314.         {
  315.             Error    error=0;
  316.             
  317.             error=CheckRequiredParams(event);
  318.                 _i(error);
  319.             
  320.             applicationHasQuit=true;
  321.  
  322.             _e
  323.             return error;
  324.         }
  325.         
  326.     #endif
  327.  
  328. #endif
  329.