home *** CD-ROM | disk | FTP | other *** search
- /*
- File: Arbitrat.cpp
-
- Contains: Implementation of class ODArbitrator, which arbitrates foci.
-
- Owned by: Richard Rodseth
-
- Copyright: © 1994 - 1995 by Apple Computer, Inc., all rights reserved.
-
- Change History (most recent first):
-
- <14> 10/8/95 TJ Fixes Recomended by Refball
- <13> 8/3/95 RR #1257260: Collapse B classes. Remove
- somInit methods. Don't call IsInitialized
- or SubclassResponsibility
- <12> 5/26/95 RR #1251403: Multithreading naming support
- <11> 5/25/95 jpa Fixed 'for' loop for ANSI compliance.
- [1253324]
- <10> 4/13/95 RR # 1216618 Added ODVolatile
- <9> 4/7/95 RR #1216618 Added SOM_TRY etc.
- <8> 10/18/94 RR Removed unused private BRF, CRF, ARF
- methods. Moved selection focus management
- to focus module. Removed assumptions about
- exclusivity by delegating to focus module
- in more places.
- <7> 9/2/94 RR #1184275 Pass transferringFrame and
- newOwner to focusModule::TransferFocus
- <6> 9/1/94 CC RADAR #1181971 - missing factory methods
- (for JBS)
- <5> 8/23/94 RR Move Ref counting into focus module
- <4> 8/17/94 jpa Call DeleteSOMValues on fFocusModules since
- they're SOM objects [1181531]
- <3> 6/15/94 RR Added function prefix
- <2> 6/10/94 RR Update #ifndefs
- <1> 6/10/94 RR first checked in
-
- To Do:
- In Progress:
-
- */
-
-
- /*
- * This file was generated by the SOM Compiler.
- * Generated using:
- * SOM incremental update: somc/smmain.c
- */
-
-
- #define ODArbitrator_Class_Source
-
- #define VARIABLE_MACROS
-
- #include <Arbitrat.xih>
-
- #ifndef _EXCEPT_
- #include "Except.h"
- #endif
-
- #ifndef _DICTLIST_
- #include "DictList.h"
- #endif
-
- #ifndef SOM_Module_OpenDoc_Foci_defined
- #include "Foci.xh"
- #endif
-
- #ifndef SOM_ODFocusSet_xh
- #include "FocusSet.xh"
- #endif
-
- #ifndef SOM_ODFocusSetIterator_xh
- #include "FocusItr.xh"
- #endif
-
- #ifndef SOM_ODFocusModule_xh
- #include "FocusMod.xh"
- #endif
-
- #ifndef SOM_ODExclusiveFocusModule_xh
- #include "ExcFocus.xh"
- #endif
-
- #ifndef _ODSESSN_
- #include "ODSessn.xh"
- #endif
-
- #ifndef SOM_ODPart_xh
- #include "Part.xh"
- #endif
-
- #ifndef SOM_ODFrame_xh
- #include "Frame.xh"
- #endif
-
- SOM_Scope ODBoolean SOMLINK ODArbitratorRequestFocusSet(ODArbitrator *somSelf, Environment *ev,
- ODFocusSet* focusSet,
- ODFrame* requestingFrame)
- {
- ODArbitratorData *somThis = ODArbitratorGetData(somSelf);
- ODArbitratorMethodDebug("ODArbitrator","RequestFocusSet");
-
- ODFocusSetIterator* iter = kODNULL; ODVolatile(iter);
- ODBoolean allRegistered = kODTrue;
- ODBoolean allWilling = kODTrue;
- ODTypeToken lastFocus;
- ODBoolean success = kODFalse;
-
- SOM_TRY
-
- iter = focusSet->CreateIterator(ev);
-
- // First check if any foci are not registered
- ODTypeToken focus;
- for (focus = iter->First(ev); allRegistered && iter->IsNotComplete(ev);focus = iter->Next(ev))
- {
- allRegistered = somSelf->GetFocusModule(ev,focus) && allRegistered;
- }
- if (!allRegistered)
- THROW(kODErrFocusNotRegistered);
-
- // Now check if existing owners are willing to relinquish each focus
- // Non-exclusive foci aren't checked
-
- for (focus = iter->First(ev); allWilling && iter->IsNotComplete(ev);focus = iter->Next(ev))
- {
- ODFocusModule* focusModule = somSelf->GetFocusModule(ev,focus);
-
- if (focusModule && (!focusModule->BeginRelinquishFocus(ev,focus, requestingFrame)))
- allWilling = kODFalse;
-
- lastFocus = focus;
- }
-
- // Now commit or abort all requests
-
- if (allWilling)
- {
- for (ODTypeToken focus = iter->First(ev); iter->IsNotComplete(ev);focus = iter->Next(ev))
- {
- ODFocusModule* focusModule = somSelf->GetFocusModule(ev, focus);
-
- focusModule->CommitRelinquishFocus(ev, focus, requestingFrame);
- focusModule->SetFocusOwnership(ev, focus, requestingFrame);
-
- }
- success = kODTrue;
- }
- else
- {
- for (ODTypeToken focus = iter->First(ev); (focus != lastFocus) && iter->IsNotComplete(ev);focus = iter->Next(ev))
- {
- ODFocusModule* focusModule = somSelf->GetFocusModule(ev, focus);
-
- focusModule->AbortRelinquishFocus(ev, focus, requestingFrame);
- }
- success = kODFalse;
- }
- ODDeleteObject(iter);
-
- SOM_CATCH_ALL
-
- ODDeleteObject(iter);
-
- SOM_ENDTRY
-
- return success;
- }
-
- SOM_Scope ODBoolean SOMLINK ODArbitratorRequestFocus(ODArbitrator *somSelf, Environment *ev,
- ODTypeToken focus,
- ODFrame* requestingFrame)
- {
- ODArbitratorData *somThis = ODArbitratorGetData(somSelf);
- ODArbitratorMethodDebug("ODArbitrator","RequestFocus");
-
- ODBoolean succeeded = kODFalse;
-
- SOM_TRY
-
- ODFocusModule* focusModule = somSelf->GetFocusModule(ev,focus);
-
- if (focusModule)
- {
- succeeded = focusModule->BeginRelinquishFocus(ev, focus, requestingFrame);
- if (succeeded)
- {
- focusModule->CommitRelinquishFocus(ev, focus, requestingFrame);
- focusModule->SetFocusOwnership(ev, focus, requestingFrame);
- }
- else
- focusModule->AbortRelinquishFocus(ev, focus, requestingFrame);
- }
- else
- {
- succeeded = kODFalse;
- THROW(kODErrFocusNotRegistered);
- }
-
- SOM_CATCH_ALL
-
- succeeded = kODFalse;
-
- SOM_ENDTRY
-
- return succeeded;
- }
-
- SOM_Scope void SOMLINK ODArbitratorRelinquishFocusSet(ODArbitrator *somSelf, Environment *ev,
- ODFocusSet* focusSet,
- ODFrame* relinquishingFrame)
- {
- ODArbitratorData *somThis = ODArbitratorGetData(somSelf);
- ODArbitratorMethodDebug("ODArbitrator","RelinquishFocusSet");
-
- ODFocusSetIterator* iter = kODNULL; ODVolatile(iter);
-
- SOM_TRY
-
- iter = focusSet->CreateIterator(ev);
-
- for (ODTypeToken focus = iter->First(ev); iter->IsNotComplete(ev);focus = iter->Next(ev))
- {
-
- ODFocusModule* focusModule = somSelf->GetFocusModule(ev,focus);
-
- if (focusModule)
- {
- focusModule->UnsetFocusOwnership(ev, focus, relinquishingFrame);
- }
- else
- THROW(kODErrFocusNotRegistered);
- }
- ODDeleteObject(iter);
-
- SOM_CATCH_ALL
-
- ODDeleteObject(iter);
-
- SOM_ENDTRY
- }
-
- SOM_Scope void SOMLINK ODArbitratorRelinquishFocus(ODArbitrator *somSelf, Environment *ev,
- ODTypeToken focus,
- ODFrame* relinquishingFrame)
- {
- ODArbitratorData *somThis = ODArbitratorGetData(somSelf);
- ODArbitratorMethodDebug("ODArbitrator","RelinquishFocus");
-
- SOM_TRY
-
- ODFocusModule* focusModule = somSelf->GetFocusModule(ev, focus);
-
- if (focusModule)
- {
- focusModule->UnsetFocusOwnership(ev, focus, relinquishingFrame);
- }
- else
- THROW(kODErrFocusNotRegistered);
-
- SOM_CATCH_ALL
- SOM_ENDTRY
- }
-
- SOM_Scope void SOMLINK ODArbitratorTransferFocus(ODArbitrator *somSelf, Environment *ev,
- ODTypeToken focus,
- ODFrame* transferringFrame,
- ODFrame* newOwner)
- {
- ODArbitratorData *somThis = ODArbitratorGetData(somSelf);
- ODArbitratorMethodDebug("ODArbitrator","TransferFocus");
-
- SOM_TRY
-
- ODFocusModule* focusModule = somSelf->GetFocusModule(ev, focus);
- if (focusModule)
- focusModule->TransferFocusOwnership(ev, focus,transferringFrame, newOwner);
-
- SOM_CATCH_ALL
- SOM_ENDTRY
- }
-
- SOM_Scope void SOMLINK ODArbitratorTransferFocusSet(ODArbitrator *somSelf, Environment *ev,
- ODFocusSet* focusSet,
- ODFrame* transferringFrame,
- ODFrame* newOwner)
- {
- ODArbitratorData *somThis = ODArbitratorGetData(somSelf);
- ODArbitratorMethodDebug("ODArbitrator","TransferFocusSet");
-
- ODFocusModule* focusModule = kODNULL;
- ODFocusSetIterator* iter = kODNULL; ODVolatile(iter);
-
- SOM_TRY
-
- iter = focusSet->CreateIterator(ev);
-
- for (ODTypeToken focus = iter->First(ev); iter->IsNotComplete(ev);focus = iter->Next(ev))
- {
- focusModule = somSelf->GetFocusModule(ev, focus);
- if (focusModule)
- focusModule->TransferFocusOwnership(ev, focus,transferringFrame, newOwner);
- }
- ODDeleteObject(iter);
-
- SOM_CATCH_ALL
-
- ODDeleteObject(iter);
-
- SOM_ENDTRY
- }
-
- SOM_Scope ODFrame* SOMLINK ODArbitratorAcquireFocusOwner(ODArbitrator *somSelf, Environment *ev,
- ODTypeToken focus)
- {
- ODArbitratorData *somThis = ODArbitratorGetData(somSelf);
- ODArbitratorMethodDebug("ODArbitrator","AcquireFocusOwner");
-
- ODFrame* focusOwner = kODNULL;
- ODFocusModule* focusModule = kODNULL;
-
- SOM_TRY
-
- focusModule = somSelf->GetFocusModule(ev, focus);
- if (focusModule)
- focusOwner = focusModule->AcquireFocusOwner(ev, focus);
- else
- focusOwner = kODNULL;
-
- SOM_CATCH_ALL
- SOM_ENDTRY
-
- return focusOwner;
- }
-
- SOM_Scope ODFocusOwnerIterator* SOMLINK ODArbitratorCreateOwnerIterator(ODArbitrator *somSelf, Environment *ev,
- ODTypeToken focus)
- {
- ODArbitratorData *somThis = ODArbitratorGetData(somSelf);
- ODArbitratorMethodDebug("ODArbitrator","CreateOwnerIterator");
-
- ODFocusOwnerIterator* ownerIterator = kODNULL;
- ODFocusModule* focusModule = kODNULL;
-
- SOM_TRY
-
- focusModule = somSelf->GetFocusModule(ev, focus);
- if (focusModule)
- ownerIterator = focusModule->CreateOwnerIterator(ev, focus);
- else
- THROW(kODErrFocusNotRegistered);
-
- SOM_CATCH_ALL
- SOM_ENDTRY
-
- return ownerIterator;
- }
-
- SOM_Scope void SOMLINK ODArbitratorRegisterFocus(ODArbitrator *somSelf, Environment *ev,
- ODTypeToken focus,
- ODFocusModule* focusModule)
- {
- ODArbitratorData *somThis = ODArbitratorGetData(somSelf);
- ODArbitratorMethodDebug("ODArbitrator","RegisterFocus");
-
- ODFocusModule* existingModule = kODNULL;
- ODFocusModule* newModule = kODNULL; ODVolatile(newModule);
-
- SOM_TRY
-
- existingModule = (ODFocusModule*) _fFocusModules->ValueAtKey((KeyType) focus);
- if (existingModule)
- THROW(kODErrFocusAlreadyRegistered);
- else
- {
- newModule = focusModule;
- if (newModule == kODNULL)
- {
- newModule = new ODExclusiveFocusModule();
- THROW_IF_NULL(newModule); // new doesn't THROW for SOM objects
- ((ODExclusiveFocusModule*) newModule)->InitExclusiveFocusModule(ev, _fSession);
- }
-
- _fFocusModules->AddPair((KeyType) focus, (ValueType) newModule);
- }
-
- SOM_CATCH_ALL
-
- ODDeleteObject(newModule);
-
- SOM_ENDTRY
- }
-
- SOM_Scope void SOMLINK ODArbitratorUnregisterFocus(ODArbitrator *somSelf, Environment *ev,
- ODTypeToken focus)
- {
- ODArbitratorData *somThis = ODArbitratorGetData(somSelf);
- ODArbitratorMethodDebug("ODArbitrator","UnregisterFocus");
-
- SOM_TRY
-
- if (_fFocusModules->ContainsKey((KeyType) focus))
- _fFocusModules->RemoveKey((KeyType) focus);
- else
- THROW(kODErrFocusNotRegistered);
-
- SOM_CATCH_ALL
- SOM_ENDTRY
- }
-
- SOM_Scope ODBoolean SOMLINK ODArbitratorIsFocusRegistered(ODArbitrator *somSelf, Environment *ev,
- ODTypeToken focus)
- {
- ODArbitratorData *somThis = ODArbitratorGetData(somSelf);
- ODArbitratorMethodDebug("ODArbitrator","IsFocusRegistered");
-
- ODBoolean isRegistered = kODFalse;
-
- SOM_TRY
-
- ODFocusModule* focusModule = somSelf->GetFocusModule(ev, focus);
- isRegistered = (focusModule != kODNULL);
-
- SOM_CATCH_ALL
- SOM_ENDTRY
-
- return isRegistered;
- }
-
- SOM_Scope ODBoolean SOMLINK ODArbitratorIsFocusExclusive(ODArbitrator *somSelf, Environment *ev,
- ODTypeToken focus)
- {
- ODArbitratorData *somThis = ODArbitratorGetData(somSelf);
- ODArbitratorMethodDebug("ODArbitrator","IsFocusExclusive");
-
- ODBoolean isExclusive = kODFalse;
- ODFocusModule* focusModule = kODNULL;
-
- SOM_TRY
-
- focusModule = somSelf->GetFocusModule(ev, focus);
- if (focusModule)
- isExclusive = focusModule->IsFocusExclusive(ev, focus);
- else
- THROW(kODErrFocusNotRegistered);
-
- SOM_CATCH_ALL
- SOM_ENDTRY
-
- return isExclusive;
- }
-
- SOM_Scope void SOMLINK ODArbitratorInitArbitrator(ODArbitrator *somSelf, Environment *ev,
- ODSession* session)
- {
- ODArbitratorData *somThis = ODArbitratorGetData(somSelf);
- ODArbitratorMethodDebug("ODArbitrator","InitArbitrator");
-
- DictionaryList* focusModules = kODNULL; ODVolatile(focusModules);
-
-
- SOM_TRY
-
- /* Moved from somInit. SOM itself sets fields to zero
- _fSession = kODNULL;
- _fFocusModules = kODNULL;
- */
-
- somSelf->InitObject(ev);
- _fSession = session;
- focusModules = new DictionaryList(); // "new" THROWS for non-SOM objects
- _fFocusModules = focusModules;
-
- SOM_CATCH_ALL
-
- ODDeleteObject(focusModules);
-
- SOM_ENDTRY
- }
-
-
- SOM_Scope ODFocusModule* SOMLINK ODArbitratorGetFocusModule(ODArbitrator *somSelf, Environment *ev,
- ODTypeToken focus)
- {
- ODArbitratorData *somThis = ODArbitratorGetData(somSelf);
- ODArbitratorMethodDebug("ODArbitrator","GetFocusModule");
-
- ODFocusModule* module = kODNULL;
-
- SOM_TRY
-
- module = (ODFocusModule*) _fFocusModules->ValueAtKey((KeyType) focus);
-
- SOM_CATCH_ALL
- SOM_ENDTRY
-
- return module;
- }
-
- SOM_Scope ODFocusSet* SOMLINK ODArbitratorCreateFocusSet(ODArbitrator *somSelf, Environment *ev)
- {
- ODArbitratorData *somThis = ODArbitratorGetData(somSelf);
- ODArbitratorMethodDebug("ODArbitrator","CreateFocusSet");
-
- ODFocusSet* focusSet = kODNULL; ODVolatile(focusSet);
-
- SOM_TRY
-
- focusSet = new ODFocusSet;
- THROW_IF_NULL(focusSet); // new doesn't THROW for SOM objects
- focusSet->InitFocusSet(ev);
-
- SOM_CATCH_ALL
-
- ODDeleteObject(focusSet);
-
- SOM_ENDTRY
-
- return focusSet;
- }
-
- SOM_Scope void SOMLINK ODArbitratorsomUninit(ODArbitrator *somSelf)
- {
- ODArbitratorData *somThis = ODArbitratorGetData(somSelf);
- ODArbitratorMethodDebug("ODArbitrator","somUninit");
-
- if (_fFocusModules)
- {
- TRY
- _fFocusModules->DeleteSOMValues(); // Delete the Focus Modules
- ODDeleteObject(_fFocusModules);
- CATCH_ALL
- // Ignore exceptions
- ENDTRY
- }
-
- parent_somUninit(somSelf);
- }
-
- SOM_Scope ODSize SOMLINK ODArbitratorPurge(ODArbitrator *somSelf, Environment *ev,
- ODSize size)
- {
- ODArbitratorData *somThis = ODArbitratorGetData(somSelf);
- ODArbitratorMethodDebug("ODArbitrator","Purge");
-
- ODSize purgeSize = 0; ODVolatile( purgeSize );
-
- SOM_TRY
-
- purgeSize = parent_Purge(somSelf,ev,size);
-
- SOM_CATCH_ALL
- WARN("Error %ld trying to purge in ODArbitratorPurge",ErrorCode());
- SetErrorCode(kODNoError); // Eat the exception; Purge should not
- // propagate it because clients function
- // fine whether memory was purged or not.
- SOM_ENDTRY
-
- return purgeSize;
- }
-