home *** CD-ROM | disk | FTP | other *** search
Text File | 1991-05-01 | 20.1 KB | 776 lines | [TEXT/MPS ] |
- // UEvtHandler.cp
- // Copyright © 1984-1991 by Apple Computer Inc. All rights reserved.
-
-
- #ifndef __UEVTHANDLER__
- #include <UEvtHandler.h>
- #endif
-
- #ifndef __STDIO__
- #include <StdIo.h>
- #endif
-
- #ifndef __UGEOMETRY__
- #include <UGeometry.h>
- #endif
-
- #ifndef __UBEHAVIOR__
- #include <UBehavior.h>
- #endif
-
- #ifndef __RESOURCES__
- #include <Resources.h>
- #endif
-
- #ifndef __STDLIB__
- #include <StdLib.h>
- #endif
-
- #ifndef __UAPPLICATION__
- #include <UApplication.h>
- #endif
-
- #ifndef __UVIEW__
- #include <UView.h>
- #endif
-
- #ifndef __UMACAPPUTILITIES__
- #include <UMacAppUtilities.h>
- #endif
-
- #ifndef __UERRORMGR__
- #include <UErrorMgr.h>
- #endif
-
- #ifndef __UMACAPPGLOBALS__
- #include <UMacAppGlobals.h>
- #endif
-
- //--------------------------------------------------------------------------------------------------
- Point gStdHysteresis;
-
- //--------------------------------------------------------------------------------------------------
- #pragma segment MAEvtHandlerRes
-
- Boolean CHandlerIterator::More()
- {
- return (fCurrentHandler != NULL);
- }
-
- //--------------------------------------------------------------------------------------------------
- #pragma segment MAEvtHandlerRes
-
- void CHandlerIterator::Reset()
- {
- fCurrentHandler = fFirstHandler;
- }
-
- //--------------------------------------------------------------------------------------------------
- #pragma segment MAEvtHandlerRes
-
- void CHandlerIterator::Advance()
- {
- fCurrentHandler = fNextHandler;
- if (fCurrentHandler)
- fNextHandler = fCurrentHandler->GetNextHandler();
- }
-
- //--------------------------------------------------------------------------------------------------
- #pragma segment MAEvtHandlerRes
-
- pascal void TEvtHandler::Initialize(void) // override
- {
- inherited::Initialize();
-
- fNextHandler = NULL;
- fIdleFreq = kMaxIdleTime; // Assume it never wants idle time
- fLastIdle = 0;
- fEnabled = TRUE; // Default to taking events
- fBehavior = NULL;
- fIdentifier = kNoIdentifier;
- }
-
- //--------------------------------------------------------------------------------------------------
- #pragma segment MAEvtHandlerRes
-
- pascal void TEvtHandler::IEvtHandler(TEvtHandler* itsNextHandler)
- {
- this->IObject();
- fNextHandler = itsNextHandler;
- }
-
- //--------------------------------------------------------------------------------------------------
- #pragma segment MAEvtHandlerRes
-
- pascal void TEvtHandler::BecameWindowTarget(void)
- {
- this->HandleEvent(mBecameWindowTarget,this,NULL);
- }
-
- //--------------------------------------------------------------------------------------------------
- #pragma segment MAEvtHandlerRes
-
- pascal void TEvtHandler::BecameApplicationTarget(void)
- {
- this->HandleEvent(mBecameApplicationTarget,this,NULL);
- }
-
- //--------------------------------------------------------------------------------------------------
- #pragma segment MAEvtHandlerRes
-
- pascal Boolean TEvtHandler::IsEnabled(void)
- {
- return fEnabled;
- }
-
- //--------------------------------------------------------------------------------------------------
- #pragma segment MAEvtHandlerRes
-
- pascal void TEvtHandler::SetEnable(Boolean state)
- {
- fEnabled = state;
- }
-
- //--------------------------------------------------------------------------------------------------
- #pragma segment MAClose
-
- pascal void TEvtHandler::Free(void) // override
- {
- TEvtHandler * nextHandler;
-
- if (gApplication->GetTarget() == this)
- {
- nextHandler = this->GetNextHandler();
- if (nextHandler == NULL)
- gApplication->SetTarget(gApplication);
- else
- gApplication->SetTarget(nextHandler);
- }
- fNextHandler = NULL;
-
- fBehavior = (TBehavior*)FreeIfObject(fBehavior);
-
- inherited::Free();
- }
-
- //--------------------------------------------------------------------------------------------------
- #pragma segment MANonRes
-
- pascal TEvtHandler* TEvtHandler::AddHandler(TEvtHandler* headOfChain)
- {
- // add headOfChain to the end of the chain
- if (fNextHandler != NULL)
- fNextHandler->AddHandler(headOfChain);
- else
- fNextHandler = headOfChain;
- return this; // new head of chain
- }
-
- //--------------------------------------------------------------------------------------------------
- #pragma segment MANonRes
-
- pascal TEvtHandler* TEvtHandler::RemoveHandler(TEvtHandler* headOfChain)
- {
- TEvtHandler * prevCohandler;
- TEvtHandler * currCohandler;
- TEvtHandler * newHeadOfChain;
-
- prevCohandler = NULL;
- currCohandler = headOfChain;
- newHeadOfChain = headOfChain;
- while (currCohandler != NULL)
- {
- if (currCohandler == this) // found it
- {
- if (prevCohandler == NULL) /* I was the head of the chain, so there will
- be a new head of chain */
- newHeadOfChain = fNextHandler;
- else
- prevCohandler->fNextHandler = fNextHandler;// take me out of the link
- fNextHandler = NULL; /* remember that i'm not in the chain anymore
- */
- currCohandler = NULL; // So loop will end
- }
- else
- {
- prevCohandler = currCohandler;
- currCohandler = currCohandler->fNextHandler;
- }
- }
- return newHeadOfChain;
- }
-
- //--------------------------------------------------------------------------------------------------
- #pragma segment MAFields
-
- pascal void TEvtHandler::Fields(TObject* obj)
- {
- obj->DoToField("TEvtHandler", NULL, bClass);
- obj->DoToField("fNextHandler", &fNextHandler, bObject);
- obj->DoToField("fBehavior", &fBehavior, bObject);
- obj->DoToField("fIdleFreq", &fIdleFreq, bLongInt);
- obj->DoToField("fLastIdle", &fLastIdle, bLongInt);
- obj->DoToField("fEnabled", &fEnabled, bBoolean);
- obj->DoToField("fIdentifier", &fIdentifier, bIDType);
-
- inherited::Fields(obj);
- }
-
- //--------------------------------------------------------------------------------------------------
- #pragma segment MAEvtHandlerRes
-
- pascal void TEvtHandler::DoAppleCommand(CmdNumber aCmdNumber,
- const AppleEvent& message,
- const AppleEvent& reply)
- {
- TEvtHandler * nextHandler;
-
- nextHandler = this->GetNextHandler();
-
- if ( nextHandler != NULL)
- nextHandler->HandleAppleCommand(aCmdNumber, message, reply);
- else
- {
- // Nobody handled the event. Let the AppleEvent Manager search through
- // the system handlers. gApplication->DispatchAppleEvent will catch the
- // failure and report it back to the AppleEvent Manager.
- FailOSErr(errAEEventNotHandled);
- #if qDebugMsg
- fprintf(stderr, "No one handled the AppleEvent %1d", aCmdNumber);
- #endif
- }
- }
-
- //--------------------------------------------------------------------------------------------------
- #pragma segment MAEvtHandlerRes
-
- pascal void TEvtHandler::HandleAppleCommand(CmdNumber aCmdNumber,
- const AppleEvent& message,
- const AppleEvent& reply)
- {
- TBehavior* aBehavior;
-
- aBehavior = this->GetFirstBehavior();
- if ( aBehavior )
- aBehavior->DoAppleCommand ( aCmdNumber, message, reply );
- else
- this->DoAppleCommand ( aCmdNumber, message, reply );
-
- }
-
- //--------------------------------------------------------------------------------------------------
- #pragma segment MAEvtHandlerRes
-
- pascal void TEvtHandler::DoCommandKey(TToolboxEvent* event)
- {
- TEvtHandler * nextHandler;
-
- nextHandler = this->GetNextHandler();
- if (nextHandler)
- nextHandler->HandleCommandKey(event);
-
- }
-
- //--------------------------------------------------------------------------------------------------
- #pragma segment MAEvtHandlerRes
-
- pascal void TEvtHandler::HandleCommandKey(TToolboxEvent* event)
- {
- TBehavior* aBehavior;
-
- aBehavior = this->GetFirstBehavior();
- if ( aBehavior )
- aBehavior->DoCommandKey ( event );
- else
- this->DoCommandKey ( event );
-
- }
-
- //--------------------------------------------------------------------------------------------------
- #pragma segment MAEvtHandlerRes
-
- pascal Boolean TEvtHandler::DoCoHandlerEvent(TEvent*)
- {
- return FALSE;
- }
-
- //--------------------------------------------------------------------------------------------------
- #pragma segment MAHelp
-
- pascal void TEvtHandler::DoHelp(TToolboxEvent* event,
- long& message)
- {
- TEvtHandler * nextHandler;
-
- nextHandler = this->GetNextHandler();
-
- if (nextHandler != NULL)
- nextHandler->DoHelp(event, message);
- }
-
- //--------------------------------------------------------------------------------------------------
- #pragma segment MAEvtHandlerRes
-
- pascal long TEvtHandler::NextIdle(void)
- {
- if ((fIdleFreq != kMaxIdleTime) && (this->IsEnabled()))// Does it idle at all?
- {
- if (fLastIdle == 0) // if never idled then it needs idling now
- return TickCount();
- else
- return (fLastIdle + fIdleFreq);
- }
- else
- return kMaxIdleTime;
- }
-
- //--------------------------------------------------------------------------------------------------
- #pragma segment MAEvtHandlerRes
-
- pascal void TEvtHandler::HandleIdle(IdlePhase phase)
- {
- if ((fIdleFreq != kMaxIdleTime) && (this->IsEnabled()))// Does it idle at all?
- {
- /* idleBegin and idleEnd don't respect fIdleFreq because they are
- notifications that the application is beginning/ending idle.
- idleContinues, however, are parceled out at the fIdleFreq. */
- if ((phase != idleContinue) || (TickCount() - fLastIdle >= fIdleFreq))
- {
- /* don't store the fLastIdle if the I FREE'd myself or
- the idlePhase is not idleContinue */
- if (!(this->DoIdle(phase)) && (phase == idleContinue))
- fLastIdle = TickCount();
- }
- }
- }
-
- //--------------------------------------------------------------------------------------------------
- #pragma segment MAEvtHandlerRes
-
- pascal Boolean TEvtHandler::DoIdle(IdlePhase)
- {
- return FALSE; // Did not free myself
- }
-
- //--------------------------------------------------------------------------------------------------
- #pragma segment MAEvtHandlerRes
-
- pascal void TEvtHandler::DoKeyCommand(TToolboxEvent* event)
- {
- TEvtHandler * nextHandler;
-
- nextHandler = this->GetNextHandler();
- if (nextHandler)
- nextHandler->HandleKeyCommand(event);
-
- }
-
- //--------------------------------------------------------------------------------------------------
- #pragma segment MAEvtHandlerRes
-
- pascal void TEvtHandler::HandleKeyCommand(TToolboxEvent* event)
- {
- TBehavior* aBehavior;
-
- aBehavior = this->GetFirstBehavior();
- if ( aBehavior )
- aBehavior->DoKeyCommand ( event );
- else
- this->DoKeyCommand ( event );
-
- }
-
- //--------------------------------------------------------------------------------------------------
- #pragma segment MASelCommand
-
- pascal void TEvtHandler::DoMenuCommand(CmdNumber aCmdNumber)
- {
- TEvtHandler * nextHandler;
-
- nextHandler = this->GetNextHandler();
- if ( nextHandler )
- nextHandler->HandleMenuCommand(aCmdNumber);
- else
- {
- #if qDebugMsg
- fprintf(stderr, "No one handled the command %1d", aCmdNumber);
- #endif
- }
-
- }
-
- //--------------------------------------------------------------------------------------------------
- #pragma segment MAEvtHandlerRes
-
- pascal void TEvtHandler::HandleMenuCommand(CmdNumber aCmdNumber)
- {
- TBehavior* aBehavior;
-
- aBehavior = this->GetFirstBehavior();
- if ( aBehavior )
- aBehavior->DoMenuCommand ( aCmdNumber );
- else
- this->DoMenuCommand ( aCmdNumber );
-
- }
-
- //--------------------------------------------------------------------------------------------------
- #pragma segment MAEvtHandlerRes
-
- pascal Boolean TEvtHandler::DoMultiClick(Point lastDownPt,
- Point newDownPt)
- {
- TEvtHandler * nextHandler;
-
- nextHandler = this->GetNextHandler();
- if (nextHandler != NULL)
- return (nextHandler->DoMultiClick(lastDownPt, newDownPt));
- else
- return ((abs(lastDownPt.h - newDownPt.h) <= (gStdHysteresis.h)) && (abs(lastDownPt.v - newDownPt.v) <= (gStdHysteresis.v)));
- }
-
- //--------------------------------------------------------------------------------------------------
- #pragma segment MAEvtHandlerRes
-
- pascal void TEvtHandler::DoSetupMenus(void)
- {
- TEvtHandler * nextHandler;
-
- nextHandler = this->GetNextHandler();
- if (nextHandler)
- nextHandler->HandleSetupMenus();
- }
-
- //--------------------------------------------------------------------------------------------------
- #pragma segment MAEvtHandlerRes
-
- pascal void TEvtHandler::HandleSetupMenus(void)
- {
- TBehavior* aBehavior;
-
- aBehavior = this->GetFirstBehavior();
- if ( aBehavior )
- aBehavior->DoSetupMenus();
- else
- this->DoSetupMenus();
-
- }
-
- //--------------------------------------------------------------------------------------------------
- #pragma segment MAEvtHandlerRes
-
- pascal void TEvtHandler::EachHandler(pascal void(* DoToEvtHandler)(TEvtHandler* anEvtHandler,
- void* staticLink),
- void* staticLink)
- {
- CHandlerIterator iter(this);
-
- for (TEvtHandler* aHandler = iter.FirstHandler(); iter.More(); aHandler = iter.NextHandler())
- DoToEvtHandler(aHandler, staticLink);
- }
-
- //--------------------------------------------------------------------------------------------------
- #pragma segment MAEvtHandlerRes
-
- pascal TEvtHandler* TEvtHandler::FirstHandlerThat(pascal Boolean(* TestEvtHandler)(TEvtHandler* anEvtHandler,
- void* staticLink),
- void* staticLink)
- {
- CHandlerIterator iter(this);
-
- for (TEvtHandler* aHandler = iter.FirstHandler(); iter.More(); aHandler = iter.NextHandler())
- if (TestEvtHandler(aHandler, staticLink))
- return aHandler;
- return NULL;
- }
-
- //--------------------------------------------------------------------------------------------------
- #pragma segment MAEvtHandlerRes
-
- pascal TEvtHandler* TEvtHandler::GetNextHandler(void)
- {
- return fNextHandler;
- }
-
- //--------------------------------------------------------------------------------------------------
- #pragma segment MADebug
-
- pascal long TEvtHandler::LookupSymbol(Str255& sym)
- {
- TEvtHandler * nextHandler;
-
- nextHandler = this->GetNextHandler();
- if (nextHandler != NULL)
- return (nextHandler->LookupSymbol(sym));
- else
- return (-1);
- }
-
- //--------------------------------------------------------------------------------------------------
- #pragma segment MAEvtHandlerRes
-
- pascal void TEvtHandler::CommitLastCommand(void)
- {
- TEvtHandler * nextHandler;
-
- nextHandler = this->GetNextHandler();
- if (nextHandler != NULL)
- nextHandler->CommitLastCommand();
- }
-
- //--------------------------------------------------------------------------------------------------
- #pragma segment MAEvtHandlerRes
-
- pascal TEvent* TEvtHandler::RetrieveAnEvent(void) // Override
- {
- TEvtHandler * nextHandler;
-
- nextHandler = this->GetNextHandler();
- if (nextHandler != NULL)
- return nextHandler->RetrieveAnEvent();
- else
- return NULL;
- }
-
- //--------------------------------------------------------------------------------------------------
- #pragma segment MAEvtHandlerRes
-
- pascal TCommand* TEvtHandler::GetLastCommand(void)
- {
- TEvtHandler * nextHandler;
-
- nextHandler = this->GetNextHandler();
- if (nextHandler != NULL)
- return (nextHandler->GetLastCommand());
- else
- return NULL;
- }
-
- //--------------------------------------------------------------------------------------------------
- #pragma segment MAEvtHandlerRes
-
- pascal void TEvtHandler::PerformCommand(TCommand* command)
- {
- TEvtHandler * nextHandler;
-
- nextHandler = this->GetNextHandler();
- if (nextHandler != NULL)
- nextHandler->PerformCommand(command);
- else
- {
- #if qDebug
- WrLblHexLongint("No one performed the command ", (long)(command));
- #endif
-
- if (command->ShouldFreeOnCompletion())
- command = (TCommand *)(FreeIfObject(command));
- }
- }
-
- //--------------------------------------------------------------------------------------------------
- #pragma segment MAEvtHandlerRes
-
- pascal void TEvtHandler::SetIdleFreq(long newIdleFreq)
- {
- fIdleFreq = newIdleFreq;
- }
-
- //--------------------------------------------------------------------------------------------------
- #pragma segment MAEvtHandlerRes
-
- pascal void TEvtHandler::RemoveBehavior (TBehavior* theBehavior)
- {
- if (theBehavior == fBehavior)
- fBehavior = fBehavior->GetNextBehavior();
- else
- fBehavior->Remove(theBehavior);
- }
-
- //--------------------------------------------------------------------------------------------------
- #pragma segment MAEvtHandlerRes
-
- pascal void TEvtHandler::AddBehavior (TBehavior* theBehavior)
- {
- theBehavior->SetOwner(this); // make this object its owner
-
- if (fBehavior)
- fBehavior->SetNextBehavior (theBehavior);
- else
- fBehavior = theBehavior;
- }
-
- //--------------------------------------------------------------------------------------------------
- #pragma segment MAEvtHandlerRes
-
- pascal TBehavior* TEvtHandler::GetFirstBehavior ( void )
- {
- return fBehavior;
- }
-
- //--------------------------------------------------------------------------------------------------
- #pragma segment MAEvtHandlerRes
-
- pascal void TEvtHandler::PostAnEvent(TEvent* event)
- {
- TEvtHandler * nextHandler;
-
- nextHandler = this->GetNextHandler();
- if (nextHandler != NULL)
- nextHandler->PostAnEvent(event);
- else
- {
- #if qDebug
- WrLblHexLongint("No one posted the event ", (long)(event));
- #endif
-
- if (event->ShouldFreeOnCompletion())
- event = (TEvent *)(FreeIfObject(event));
- }
- }
-
- //--------------------------------------------------------------------------------------------------
- #pragma segment MAEvtHandlerRes
-
- pascal void TEvtHandler::PostCommand(TCommand* command)
-
- {
- //!!! Left in for compatibility.
- TEvtHandler * nextHandler;
-
- nextHandler = this->GetNextHandler();
- if (nextHandler != NULL)
- nextHandler->PostCommand(command);
- else
- {
- #if qDebug
- WrLblHexLongint("No one posted the command ", (long)(command));
- #endif
-
- if (command->ShouldFreeOnCompletion())
- command = (TCommand*)(FreeIfObject(command));
- }
- }
-
- //--------------------------------------------------------------------------------------------------
- #pragma segment MAEvtHandlerRes
-
- pascal void TEvtHandler::ResignedWindowTarget(void)
-
- {
- this->HandleEvent(mResignedWindowTarget,this,NULL);
- }
-
- //--------------------------------------------------------------------------------------------------
- #pragma segment MAEvtHandlerRes
-
- pascal void TEvtHandler::ResignedApplicationTarget(void)
-
- {
- this->HandleEvent(mResignedApplicationTarget,this,NULL);
- }
-
- //--------------------------------------------------------------------------------------------------
- #pragma segment MATerminate
-
- pascal void TEvtHandler::Terminate(void)
-
- {
- }
-
- //--------------------------------------------------------------------------------------------------
- #pragma segment MAEvtHandlerRes
-
- pascal Boolean TEvtHandler::WantToBecomeTarget(void)
-
- {
- return FALSE;
- }
-
- //--------------------------------------------------------------------------------------------------
- #pragma segment MAEvtHandlerRes
-
- pascal long TEvtHandler::WillingToResignTarget(void)
-
- {
- return 0; // kValidValue
- }
-
- //--------------------------------------------------------------------------------------------------
- #pragma segment MAEvtHandlerRes
-
- pascal void TEvtHandler::KeyEventToComponents(TToolboxEvent* event)
-
- {
- TEvtHandler * nextHandler = this->GetNextHandler();
- if (nextHandler)
- nextHandler->KeyEventToComponents(event);
- else
- {
- if ((event->fEventRecord.what == keyDown) || (event->fEventRecord.what == autoKey))
- {
- // Default extractions
- event->fCharacter = (char)(event->fEventRecord.message & charCodeMask);
- event->fKeyCode = (unsigned short)(event->fEventRecord.message & keyCodeMask) >> 8;
- }
- }
- }
-
- //--------------------------------------------------------------------------------------------------
- #pragma segment MAEvtHandlerRes
-
- pascal void TEvtHandler::TargetValidationSucceeded()
-
- {
- }
-
- //--------------------------------------------------------------------------------------------------
- #pragma segment MAEvtHandlerRes
-
- pascal void TEvtHandler::TargetValidationFailed(long reason)
-
- {
- }
-
-
- //--------------------------------------------------------------------------------------------------
- #pragma segment MAEvtHandlerRes
-
- pascal void TEvtHandler::DoEvent(EvtNumber eventNumber,
- TEvtHandler* source,
- TEvent* event)
- {
- TEvtHandler * nextHandler;
-
- nextHandler = this->GetNextHandler();
- if (nextHandler)
- nextHandler->HandleEvent(eventNumber, source, event);
- else if (gIntenseDebugging)
- {
- fprintf(stderr, "in TEvtHandler.DoHandleEvent: no one handled the event: %1d", eventNumber);
- WrLblHexLongint(" From source: ", (long)(source));
- fprintf(stderr, "\n");
- WrLblHexLongint(" Event object: ", (long)(event));
- fprintf(stderr, "\n");
- }
- }
-
- //--------------------------------------------------------------------------------------------------
- #pragma segment MAEvtHandlerRes
-
- pascal void TEvtHandler::HandleEvent( EvtNumber eventNumber,
- TEvtHandler* source,
- TEvent* event)
- {
- TBehavior* aBehavior;
-
- aBehavior = this->GetFirstBehavior();
- if ( aBehavior )
- aBehavior->DoEvent ( eventNumber, source, event );
- else
- this->DoEvent ( eventNumber, source, event );
-
- }
-
-
-
-