home *** CD-ROM | disk | FTP | other *** search
Text File | 1997-06-04 | 7.4 KB | 329 lines | [TEXT/CWIE] |
- // MADE - Macintosh Application Development Essentials
- // ---------------------------------------------------
-
- // (c) Gideon Greenspan, Sig Software - June 1997 - http://www.kagi.com/gdg/
-
- // These files can only be used for experimental standalone purposes. To obtain
- // fully commented code, and licenses for standalone, shareware, internal and
- // commercial usage, run the enclosed Register application.
-
- // Essential Events.c
- //
- // AppleEvent, Drag Manager handlers, initialisation and event handling.
- //
- // Version 1.0.0 - 10th November 1996
-
- #include "Essential Headers.h"
- #include "Essential Prototypes.h"
-
- WindowPtr frontWindow=0;
-
- #if Use_AppleEvents
-
- // NOTE : UPP (Universal Procedure Pointers) are used to ensure compatiblity under 680x0,
- // PowerPC, and who knows what other future compilers.
-
- #include <AppleEvents.h>
-
- #if Handle_Open_Documents_Event
- pascal OSErr EventOpenHandler(AppleEvent*, AppleEvent*, long);
- AEEventHandlerUPP EventOpenUPP;
- #endif
-
- #if Handle_Print_Documents_Event
- pascal OSErr EventPrintHandler(AppleEvent*, AppleEvent*, long);
- AEEventHandlerUPP EventPrintUPP;
- #endif
-
- #if Handle_Open_Documents_Event || Handle_Print_Documents_Event
- OSErr EventOpenPrintHandler(AppleEvent *event, AppleEvent*, long, Boolean);
- #endif
-
- #if Handle_Quit_Application_Event
- pascal OSErr EventQuitHandler(AppleEvent*, AppleEvent*, long);
- AEEventHandlerUPP EventQuitUPP;
- #endif
-
- #endif
-
- void MainEventLoop()
- {
- EventRecord theEvent;
- char keyCharacter;
- short mousePart;
- WindowPtr mouseWindow, oldPort;
- Rect growLimits;
- long growResult;
- Point localPoint;
- Error error=0;
-
- WaitNextEvent(everyEvent, &theEvent, Event_Sleep_Time, 0);
-
- mousePart=FindWindow(theEvent.where, &mouseWindow);
-
- if (frontWindow) {
-
- localPoint=theEvent.where;
- GlobalToLocal(&localPoint);
- MySetTheCursor(localPoint);
-
- } else SetCursor(&qd.arrow);
-
- if (mousePart==inContent) {
- localPoint=theEvent.where;
-
- GetPort(&oldPort);
- SetPort(mouseWindow);
- GlobalToLocal(&localPoint);
- SetPort(oldPort);
- }
-
- switch (theEvent.what) {
-
- case nullEvent:
- MyPerformIdleTasks();
- break;
-
- case keyDown: case autoKey: // keyDown and autoKey not distinguished between
- keyCharacter=theEvent.message&charCodeMask;
-
- if (theEvent.modifiers&cmdKey) {
- MyEnableMenus();
- SelectMenuItem(MenuKey(keyCharacter));
-
- } else
- MyHandleKeyDown(keyCharacter, theEvent.modifiers);
-
- break;
-
- case mouseDown:
- switch (mousePart) {
-
- case inMenuBar:
- MyEnableMenus();
- SelectMenuItem(MenuSelect(theEvent.where));
- break;
-
- case inSysWindow:
- SystemClick(&theEvent, mouseWindow);
- break;
-
- case inContent:
- if (mouseWindow==frontWindow)
- MyHandleMouseDown(localPoint, theEvent.modifiers);
- else
- SelectWindow(mouseWindow);
- break;
-
- case inDrag:
- DragWindow(mouseWindow, theEvent.where, &qd.screenBits.bounds);
- break;
-
- case inGrow:
- if (mouseWindow==frontWindow) {
-
- MyResizeBounds(&growLimits);
-
- growResult=GrowWindow(frontWindow, theEvent.where, &growLimits);
-
- if (growResult) {
- SizeWindow(frontWindow, LoWord(growResult), HiWord(growResult), true);
- // last parameter specifies that new bit should be updated
- MySizedWindow();
- }
-
- } else
- SelectWindow(mouseWindow);
- break;
-
- case inGoAway:
- if (mouseWindow==frontWindow) {
-
- if (TrackGoAway(frontWindow, theEvent.where)) {
-
- MyCloseWindow();
- frontWindow=0;
- }
-
- } else
- SelectWindow(mouseWindow);
- break;
-
- case inZoomIn: case inZoomOut:
- if (mouseWindow==frontWindow) {
-
- ZoomWindow(frontWindow, mousePart, false);
- // All sorts of things could be done here but this is default behaviour
- MySizedWindow();
-
- } else
- SelectWindow(mouseWindow);
- break;
- }
- break;
-
- case updateEvt:
- BeginUpdate((WindowPtr)theEvent.message);
- GetPort(&oldPort);
- SetPort((WindowPtr)theEvent.message);
-
- MyDrawWindow((WindowPtr)theEvent.message);
- SetPort(oldPort);
- EndUpdate((WindowPtr)theEvent.message);
- break;
-
- case activateEvt:
- if (theEvent.modifiers&activeFlag) {
- frontWindow=(WindowPtr)theEvent.message;
- SetPort(frontWindow);
- // This is essential - all window-based actions depend on this call
- MyActivateWindow();
-
- } else {
- MyDeactivateWindow();
- frontWindow=0;
- }
- break;
-
- #if Use_AppleEvents
- case kHighLevelEvent:
- error=AEProcessAppleEvent(&theEvent);
- if (error!=errAEEventNotHandled)
- TestError(error);
- break;
- #endif
-
- }
- }
-
- #if Use_AppleEvents
-
- Error CheckRequiredParams(AppleEvent *appleEvent)
- {
- Error error=0;
- DescType returnType;
- Size actualSize;
-
- error=AEGetAttributePtr(appleEvent, keyMissedKeywordAttr,
- typeWildCard, &returnType, 0, 0, &actualSize);
-
- if (error==errAEDescNotFound) error=0;
- else if (error==0) error=errAEEventNotHandled;
-
- return error;
- }
-
- Error InitAppleEvents()
- {
- Error error=0;
-
- // NOTE: the refCon parameter in the AEInstallEventHandler call need not be zero; you can
- // pass a long word in that will get given to your handlers when they are called
-
- #if Handle_Open_Documents_Event
-
- EventOpenUPP=NewAEEventHandlerProc(EventOpenHandler);
- error=AEInstallEventHandler(
- kCoreEventClass, kAEOpenDocuments, EventOpenUPP, 0, false);
- TestError(error);
- _i(error)
-
- #endif
-
- #if Handle_Print_Documents_Event
-
- EventPrintUPP=NewAEEventHandlerProc(EventPrintHandler);
- error=AEInstallEventHandler(
- kCoreEventClass, kAEPrintDocuments, EventPrintUPP, 0, false);
- TestError(error);
- _i(error)
-
- #endif
-
- #if Handle_Quit_Application_Event
-
- EventQuitUPP=NewAEEventHandlerProc(EventQuitHandler);
- error=AEInstallEventHandler(
- kCoreEventClass, kAEQuitApplication, EventQuitUPP, 0, false);
- TestError(error);
-
- #endif
- _e
- return error;
- }
-
- #if Handle_Open_Documents_Event
-
- pascal OSErr EventOpenHandler(AppleEvent* eventIn, AppleEvent* eventOut, long refCon)
- {
- return EventOpenPrintHandler(eventIn, eventOut, refCon, false);
- }
-
- #endif
-
- #if Handle_Print_Documents_Event
-
- pascal OSErr EventPrintHandler(AppleEvent* eventIn, AppleEvent* eventOut, long refCon)
- {
- return EventOpenPrintHandler(eventIn, eventOut, refCon, true);
- }
-
- #endif
-
- #if Handle_Open_Documents_Event || Handle_Print_Documents_Event
-
- OSErr EventOpenPrintHandler(AppleEvent *eventIn, AppleEvent*, long, Boolean printing)
- {
- AEDescList docList;
- DescType returnType;
- Size actualSize;
- long docNum, numDocs;
- FSSpec fileSpec;
- AEKeyword keyword;
- Error error=0;
-
- error=AEGetParamDesc(eventIn, keyDirectObject, typeAEList, &docList);
- _i(error)
- error=CheckRequiredParams(eventIn);
- _i(error)
- error=AECountItems(&docList, &numDocs);
- _i(error)
-
- for (docNum=1; docNum<=numDocs; docNum++) {
- error=AEGetNthPtr(&docList, docNum, typeFSS, &keyword,
- &returnType, &fileSpec, sizeof(fileSpec), &actualSize);
- _i(error)
-
- if (printing)
- MyPrintDocument(&fileSpec);
- else
- MyOpenDocument(&fileSpec);
- }
-
- error=AEDisposeDesc(&docList);
-
- _e
- return error;
- }
-
- #endif
-
- #if Handle_Quit_Application_Event
-
- pascal OSErr EventQuitHandler(AppleEvent* event, AppleEvent*, long)
- {
- Error error=0;
-
- error=CheckRequiredParams(event);
- _i(error);
-
- applicationHasQuit=true;
-
- _e
- return error;
- }
-
- #endif
-
- #endif
-