home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1996 October: Mac OS SDK / Dev.CD Oct 96 SDK / Dev.CD Oct 96 SDK2.toast / Development Kits (Disc 2) / OpenDoc / OpenDoc Development / Debugging Support / OpenDoc Source Code / UI / ExcFocus.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  1996-04-22  |  11.0 KB  |  387 lines  |  [TEXT/MPS ]

  1. /*
  2.     File:        ExcFocus.cpp
  3.  
  4.     Contains:    Implementation of ODExclusiveFocusModule
  5.  
  6.     Owned by:    Richard Rodseth
  7.  
  8.     Copyright:    © 1994 - 1995 by Apple Computer, Inc., all rights reserved.
  9.  
  10.     Change History (most recent first):
  11.  
  12.         <24>    10/24/95    jpa        1293441: Eat exceptions in
  13.                                     ResolveClipboardPromises
  14.         <23>     10/8/95    TJ        Fixes Recomended by Refball
  15.         <22>     10/3/95    TJ        Changes done by RefBall Team
  16.         <21>      8/3/95    RR        #1257260: Collapse B classes. Remove
  17.                                     somInit methods. Don't call IsInitialized
  18.                                     or SubclassResponsibility
  19.         <20>     6/28/95    RR        1242642 BB Mostly ref counting. Release
  20.                                     border shape
  21.         <19>     6/25/95    TÇ        1242642 BB: Turn on ODDebug warning if
  22.                                     refcount is wrong in
  23.                                     ODRefCntObjectsomUninit.
  24.         <18>     5/31/95    RR        #1251403 Release after AcquirePart
  25.         <17>     5/26/95    RR        #1251403: Multithreading naming support
  26.         <16>     5/17/95    RR        #1250135/1250137/1250143 Getters increment
  27.                                     refcount
  28.         <15>     5/16/95    CC        1248632, 1244940: SetFocusOwnership:
  29.                                     Externalize the current clipboard draft to
  30.                                     force resolution of promises.
  31.         <14>     5/10/95    JBS        1241913 ODPart::AdjustBorderShape is not
  32.                                     called with null shape
  33.         <13>     4/28/95    RR        1211085 Remove 5$ comments
  34.         <12>      4/7/95    RR        #1216618 Added SOM_TRY etc.
  35.         <11>      4/6/95    RR        #1220104 Use of ODObjectsAreEqual, #1211085
  36.                                     Remove 5$ comments
  37.         <10>     3/13/95    NP        1228158: Always call UseInputWindow when
  38.                                     losing keystroke focus.
  39.          <9>      3/7/95    RR        #1220929 Added cache for selection focus
  40.          <8>      3/1/95    NP        1187682: Call UseInputWindow when keystroke
  41.                                     focus is lost.
  42.          <7>    10/27/94    RR        Call FocusLost in TransferFocus #1192168
  43.          <6>    10/18/94    RR        Added fSession. Detect change in selection
  44.                                     focus. Override BRF, CRF, ARF.
  45.          <5>     9/20/94    RR        When assigning a new frame to fFrame, call
  46.                                     Acquire on the new frame BEFORe
  47.                                     calling Release on the old, in case they're
  48.                                     the same frame.
  49.          <4>      9/2/94    RR        #1184275 Pass transferringFrame and
  50.                                     newOwner to focusModule::TransferFocus
  51.          <3>     8/24/94    RR        Fixed ref counting in SetFocusOwnership
  52.          <2>     8/23/94    RR        Call Acquire and Release
  53.          <1>     6/23/94    RR        first checked in
  54.  
  55.     To Do:
  56.     In Progress:
  57.         
  58. */
  59.  
  60.  
  61. #define ODExclusiveFocusModule_Class_Source
  62. #define VARIABLE_MACROS
  63. #include <ExcFocus.xih>
  64.  
  65. #ifndef _PLFMDEF_
  66. #include "PlfmDef.h"
  67. #endif
  68.  
  69. #ifndef _TEMPOBJ_
  70. #include <TempObj.h>
  71. #endif
  72.  
  73. #ifndef SOM_ODFrame_xh
  74. #include "Frame.xh"
  75. #endif
  76.  
  77. #ifndef SOM_Module_OpenDoc_Foci_defined
  78. #include "Foci.xh"
  79. #endif
  80.  
  81. #ifndef _ODSESSN_
  82. #include "ODSessn.xh"
  83. #endif
  84.  
  85. #ifndef SOM_ODPart_xh
  86. #include "Part.xh"
  87. #endif
  88.  
  89. #ifndef SOM_ODFrame_xh
  90. #include "Frame.xh"
  91. #endif
  92.  
  93. #ifndef SOM_ODFrameFacetIterator_xh
  94. #include "FrFaItr.xh"
  95. #endif
  96.  
  97. #ifndef SOM_ODArbitrator_xh
  98. #include <Arbitrat.xh>
  99. #endif
  100.  
  101. #ifndef SOM_ODClipboard_xh
  102. #include <Clipbd.xh>
  103. #endif
  104.  
  105. #ifndef __TEXTSERVICES__
  106. #include <TextServices.h>    // Platform-dependent
  107. #endif
  108.  
  109. //==============================================================================
  110. // Local function declarations
  111. //==============================================================================
  112.  
  113. ODStatic void ResolveClipboardPromises(Environment *ev, 
  114.                 ODFrame* selectionFrame,
  115.                 ODSession* session);
  116.  
  117. //==============================================================================
  118. // Class ODExclusiveFocusModule
  119. //==============================================================================
  120.  
  121. SOM_Scope void  SOMLINK ODExclusiveFocusModuleInitExclusiveFocusModule(ODExclusiveFocusModule *somSelf, Environment *ev,
  122.         ODSession* session)
  123. {
  124.     ODExclusiveFocusModuleData *somThis = ODExclusiveFocusModuleGetData(somSelf);
  125.     ODExclusiveFocusModuleMethodDebug("ODExclusiveFocusModule","InitExclusiveFocusModule");
  126.  
  127.     SOM_TRY    
  128.     
  129.         /* Moved from somInit. SOM itself sets fields to zero
  130.         _fFrame = kODNULL;
  131.         _fSession = kODNULL;
  132.         _fSelectionFocus = 0;
  133.         _fKeyFocus = 0;
  134.         */
  135.         
  136.         somSelf->InitFocusModule(ev, session);
  137.         _fSession = session;
  138.         _fSelectionFocus = session->Tokenize(ev,kODSelectionFocus);
  139.         _fKeyFocus = _fSession->Tokenize(ev, kODKeyFocus);
  140.  
  141.     SOM_CATCH_ALL
  142.     SOM_ENDTRY
  143. }
  144.  
  145.  
  146. SOM_Scope void  SOMLINK ODExclusiveFocusModulesomUninit(ODExclusiveFocusModule *somSelf)
  147. {
  148.     ODExclusiveFocusModuleData *somThis = ODExclusiveFocusModuleGetData(somSelf);
  149.     ODExclusiveFocusModuleMethodDebug("ODExclusiveFocusModule","somUninit");
  150.  
  151.     parent_somUninit(somSelf);
  152. }
  153.  
  154. SOM_Scope ODBoolean  SOMLINK ODExclusiveFocusModuleIsFocusExclusive(ODExclusiveFocusModule *somSelf, Environment *ev,
  155.         ODTypeToken focus)
  156. {
  157.     ODExclusiveFocusModuleData *somThis = ODExclusiveFocusModuleGetData(somSelf);
  158.     ODExclusiveFocusModuleMethodDebug("ODExclusiveFocusModule","IsFocusExclusive");
  159.  
  160.     ODUnused(focus);
  161.     return kODTrue;
  162. }
  163.  
  164. SOM_Scope void  SOMLINK ODExclusiveFocusModuleSetFocusOwnership(ODExclusiveFocusModule *somSelf, Environment *ev,
  165.         ODTypeToken focus,
  166.         ODFrame* frame)
  167. {
  168.     ODExclusiveFocusModuleData *somThis = ODExclusiveFocusModuleGetData(somSelf);
  169.     ODExclusiveFocusModuleMethodDebug("ODExclusiveFocusModule","SetFocusOwnership");
  170.  
  171.     ODFacet* facet = kODNULL;
  172.     ODFrameFacetIterator* facets = kODNULL;
  173.  
  174.     SOM_TRY
  175.     
  176.         if (focus == _fSelectionFocus) 
  177.         {
  178.             if (_fFrame)
  179.             {
  180.                 _fFrame->InvalidateActiveBorder(ev);
  181.                 TempODFrame contFrame = _fFrame->AcquireContainingFrame(ev); // -- TÇ tempobj'd
  182.                 if ((ODFrame*) contFrame )
  183.                 {
  184.                     TempODPart contPart = contFrame->AcquirePart(ev); // -- TÇ tempobj'd
  185.                     facets = _fFrame->CreateFacetIterator(ev);
  186.                     for ( facet = facets->First(ev);
  187.                             facets->IsNotComplete(ev);
  188.                             facet = facets->Next(ev) )
  189.                     {
  190.                         ODShape* border = contPart->AdjustBorderShape(ev, facet, kODNULL);
  191.                         ODReleaseObject(ev, border);
  192.                     }
  193.                     ODDeleteObject(facets);
  194.                 }
  195.             }
  196.             // Note:  window->Update(ev);
  197.             if (frame)
  198.                 frame->DrawActiveBorder(ev);
  199.             
  200.             ResolveClipboardPromises(ev, _fFrame, _fSession);
  201.         }
  202.         
  203.         if (frame)
  204.             frame->Acquire(ev);
  205.         if (_fFrame)
  206.             _fFrame->Release(ev);    
  207.         _fFrame = frame;
  208.  
  209.     SOM_CATCH_ALL
  210.     SOM_ENDTRY
  211. }
  212.  
  213. SOM_Scope void  SOMLINK ODExclusiveFocusModuleUnsetFocusOwnership(ODExclusiveFocusModule *somSelf, Environment *ev,
  214.         ODTypeToken focus,
  215.         ODFrame* frame)
  216. {
  217.     ODExclusiveFocusModuleData *somThis = ODExclusiveFocusModuleGetData(somSelf);
  218.     ODExclusiveFocusModuleMethodDebug("ODExclusiveFocusModule","UnsetFocusOwnership");
  219.  
  220.     SOM_TRY
  221.  
  222.         if (focus == _fKeyFocus)
  223.         {
  224.             const TSMDocumentID    kAnyDoc = kODNULL;
  225.         
  226.             // Make sure to set this back to a safe state.
  227.             UseInputWindow(kAnyDoc, kODTrue);
  228.         }
  229.     
  230.         if (ODObjectsAreEqual(ev, frame, _fFrame))
  231.         {
  232.             if (focus == _fSelectionFocus) 
  233.             {
  234.                 if ( _fFrame )
  235.                     _fFrame->InvalidateActiveBorder(ev);
  236.                 // Note: window->Update(ev);
  237.             }
  238.         
  239.             if (_fFrame)
  240.                 _fFrame->Release(ev);
  241.             _fFrame = kODNULL;
  242.         }
  243.  
  244.     SOM_CATCH_ALL
  245.     SOM_ENDTRY
  246. }
  247.  
  248. SOM_Scope void  SOMLINK ODExclusiveFocusModuleTransferFocusOwnership(ODExclusiveFocusModule *somSelf, Environment *ev,
  249.         ODTypeToken focus,
  250.         ODFrame* transferringFrame,
  251.         ODFrame* newOwner)
  252. {
  253.     ODExclusiveFocusModuleData *somThis = ODExclusiveFocusModuleGetData(somSelf);
  254.     ODExclusiveFocusModuleMethodDebug("ODExclusiveFocusModule","ODExclusiveFocusModuleTransferFocusOwnership");
  255.  
  256.     SOM_TRY
  257.  
  258.         TempODFrame oldOwner = somSelf->AcquireFocusOwner(ev, focus);
  259.         somSelf->SetFocusOwnership(ev, focus, newOwner);
  260.         
  261.         if (oldOwner && (oldOwner != transferringFrame))
  262.         {
  263.             TempODPart part = oldOwner->AcquirePart(ev);
  264.             part->FocusLost(ev, focus, oldOwner);
  265.         }
  266.         if (newOwner && (newOwner != transferringFrame))
  267.         {
  268.             TempODPart part = newOwner->AcquirePart(ev);
  269.             part->FocusAcquired(ev, focus, newOwner);
  270.         }
  271.  
  272.     SOM_CATCH_ALL
  273.     SOM_ENDTRY
  274. }
  275.  
  276. SOM_Scope ODFrame*  SOMLINK ODExclusiveFocusModuleAcquireFocusOwner(ODExclusiveFocusModule *somSelf, Environment *ev,
  277.         ODTypeToken focus)
  278. {
  279.     ODExclusiveFocusModuleData *somThis = ODExclusiveFocusModuleGetData(somSelf);
  280.     ODExclusiveFocusModuleMethodDebug("ODExclusiveFocusModule","AcquireFocusOwner");
  281.  
  282.     ODUnused(focus);
  283.     if (_fFrame) {
  284.         SOM_TRY
  285.             _fFrame->Acquire(ev);
  286.         SOM_CATCH_ALL
  287.         SOM_ENDTRY
  288.     }
  289.     return _fFrame;
  290. }
  291.  
  292. SOM_Scope ODBoolean  SOMLINK ODExclusiveFocusModuleBeginRelinquishFocus(ODExclusiveFocusModule *somSelf, Environment *ev,
  293.         ODTypeToken focus,
  294.         ODFrame* requestingFrame)
  295. {
  296.     ODExclusiveFocusModuleData *somThis = ODExclusiveFocusModuleGetData(somSelf);
  297.     ODExclusiveFocusModuleMethodDebug("ODExclusiveFocusModule","ODExclusiveFocusModuleBeginRelinquishFocus");
  298.  
  299.     ODBoolean canRelinquish = kODTrue;
  300.     
  301.     SOM_TRY
  302.  
  303.         TempODFrame currentOwner = somSelf->AcquireFocusOwner(ev, focus);
  304.     
  305.         if (currentOwner && (!ODObjectsAreEqual(ev, currentOwner, requestingFrame)))
  306.         {
  307.             TempODPart part = currentOwner->AcquirePart(ev); // -- TÇ tempobj'd
  308.             if ((ODPart*)part)
  309.                 canRelinquish = part->BeginRelinquishFocus(ev, focus, currentOwner, requestingFrame);
  310.         }
  311.  
  312.     SOM_CATCH_ALL
  313.     SOM_ENDTRY
  314.     
  315.     return canRelinquish;
  316. }
  317.  
  318. SOM_Scope void  SOMLINK ODExclusiveFocusModuleCommitRelinquishFocus(ODExclusiveFocusModule *somSelf, Environment *ev,
  319.         ODTypeToken focus,
  320.         ODFrame* requestingFrame)
  321. {
  322.     ODExclusiveFocusModuleData *somThis = ODExclusiveFocusModuleGetData(somSelf);
  323.     ODExclusiveFocusModuleMethodDebug("ODExclusiveFocusModule","ODExclusiveFocusModuleCommitRelinquishFocus");
  324.  
  325.     SOM_TRY
  326.  
  327.         TempODFrame currentOwner = somSelf->AcquireFocusOwner(ev, focus);
  328.         
  329.         if ((currentOwner)  && (!ODObjectsAreEqual(ev, currentOwner,requestingFrame)))
  330.         {
  331.             TempODPart part = currentOwner->AcquirePart(ev); // -- TÇ tempobj'd
  332.             if ((ODPart*)part)
  333.                 part->CommitRelinquishFocus(ev, focus, currentOwner, requestingFrame);
  334.         } 
  335.  
  336.     SOM_CATCH_ALL
  337.     SOM_ENDTRY
  338. }
  339.  
  340. SOM_Scope void  SOMLINK ODExclusiveFocusModuleAbortRelinquishFocus(ODExclusiveFocusModule *somSelf, Environment *ev,
  341.         ODTypeToken focus,
  342.         ODFrame* requestingFrame)
  343. {
  344.     ODExclusiveFocusModuleData *somThis = ODExclusiveFocusModuleGetData(somSelf);
  345.     ODExclusiveFocusModuleMethodDebug("ODExclusiveFocusModule","ODExclusiveFocusModuleAbortRelinquishFocus");
  346.  
  347.     SOM_TRY
  348.  
  349.         TempODFrame currentOwner = somSelf->AcquireFocusOwner(ev, focus);
  350.         if (currentOwner && (!ODObjectsAreEqual(ev, currentOwner,requestingFrame)))
  351.         {
  352.             TempODPart part = currentOwner->AcquirePart(ev); // -- TÇ tempobj'd
  353.             if ((ODPart*)part)
  354.                 part->AbortRelinquishFocus(ev, focus, currentOwner,requestingFrame);
  355.         }
  356.  
  357.     SOM_CATCH_ALL
  358.     SOM_ENDTRY
  359. }
  360.  
  361. ODStatic void ResolveClipboardPromises(Environment *ev, 
  362.                 ODFrame* selectionFrame,
  363.                 ODSession* session)
  364. {
  365.     ODArbitrator* arbitrator = session->GetArbitrator(ev);
  366.  
  367.     ODToken        clipboardFocus = session->Tokenize(ev, kODClipboardFocus);
  368.     TempODFrame clipOwner = arbitrator->AcquireFocusOwner(ev, clipboardFocus);
  369.  
  370.     if ( (clipOwner == selectionFrame) || arbitrator->RequestFocus(ev, clipboardFocus, selectionFrame) )
  371.     {
  372.         ODClipboard* clipboard = session->GetClipboard(ev);
  373.         TRY{
  374.             ODStorageUnit* su = clipboard->GetContentStorageUnit(ev);
  375.             ODDraft* draft = su->GetDraft(ev);
  376.             draft->Externalize(ev);
  377.         }CATCH_ALL{
  378.             WARN("Error %d externalizing clipboard",ErrorCode());
  379.             // If this failed the Clipboard is probably hosed now.
  380.             clipboard->DiscardClipboard(ev);
  381.         }ENDTRY
  382.  
  383.         if ( clipOwner != selectionFrame )
  384.             arbitrator->RelinquishFocus(ev, clipboardFocus, selectionFrame);
  385.     }
  386. }
  387.