home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1997 January: Mac OS SDK / Dev.CD Jan 97 SDK2.toast / Development Kits (Disc 2) / OpenDoc Development Framework / ODFDev / ODF / Framewrk / FWEvents / FWEventD.cpp < prev    next >
Encoding:
Text File  |  1996-09-17  |  21.9 KB  |  760 lines  |  [TEXT/MPS ]

  1. //========================================================================================
  2. //
  3. //    File:                FWEventD.cpp
  4. //    Release Version:    $ ODF 2 $
  5. //
  6. //    Copyright:    (c) 1993 - 1996 by Apple Computer, Inc., all rights reserved.
  7. //
  8. //========================================================================================
  9.  
  10. #include "FWFrameW.hpp"
  11.  
  12. #ifndef FWEVENTD_H
  13. #include "FWEventD.h"
  14. #endif
  15.  
  16. #ifndef FWEVENT_H
  17. #include "FWEvent.h"
  18. #endif
  19.  
  20. #ifndef FWEVENTH_H
  21. #include "FWEventH.h"
  22. #endif
  23.  
  24. #ifndef FWFRAME_H
  25. #include "FWFrame.h"
  26. #endif
  27.  
  28. #ifndef FWPRESEN_H
  29. #include "FWPresen.h"
  30. #endif
  31.  
  32. #ifndef FWSELECT_H
  33. #include "FWSelect.h"
  34. #endif
  35.  
  36. #ifndef FWMNUBAR_H
  37. #include "FWMnuBar.h"
  38. #endif
  39.  
  40. #ifndef FWPOINT_H
  41. #include "FWPoint.h"
  42. #endif
  43.  
  44. #ifndef FWODMISS_H
  45. #include "FWODMiss.h"
  46. #endif
  47.  
  48. #ifndef FWCURSOR_H
  49. #include "FWCursor.h"
  50. #endif
  51.  
  52. #ifndef SLMIXOS_H
  53. #include "SLMixOS.h"    // for FW_Beep
  54. #endif
  55.  
  56. // ----- OpenDoc Includes -----
  57.  
  58. #ifndef SOM_ODWindow_xh
  59. #include <Window.xh>
  60. #endif
  61.  
  62. #ifndef SOM_ODFacet_xh
  63. #include <Facet.xh>
  64. #endif
  65.  
  66. // ----- Macintosh Includes -----
  67.  
  68. #if defined(FW_BUILD_MAC) && !defined(__TOOLUTILS__)
  69. #include <ToolUtils.h>
  70. #endif
  71.  
  72. #pragma segment FWEvents
  73.  
  74. //========================================================================================
  75. //    globals
  76. //========================================================================================
  77.  
  78. unsigned short FW_CEventDispatcher::fgAutoRepeatCount = 0;
  79.  
  80. unsigned long FW_CEventDispatcher::fgLastMouseUp = 0;
  81. FW_PlatformPoint FW_CEventDispatcher::fgLastMouseUpWhere;
  82.  
  83. short FW_CEventDispatcher::fgClickCount = 1;
  84.  
  85. //========================================================================================
  86. //    class FW_CEventDispatcher
  87. //========================================================================================
  88.  
  89. //----------------------------------------------------------------------------------------
  90. //    FW_CEventDispatcher::FW_CEventDispatcher
  91. //----------------------------------------------------------------------------------------
  92.  
  93. FW_CEventDispatcher::FW_CEventDispatcher() :
  94.     fLastMouseDownTarget(NULL),
  95.     fLastMouseDownFrame(NULL),
  96.     fEventHandler(NULL),
  97.     fMenuBar(NULL)
  98. {
  99. }
  100.  
  101. //----------------------------------------------------------------------------------------
  102. //    FW_CEventDispatcher::FW_CEventDispatcher
  103. //----------------------------------------------------------------------------------------
  104.  
  105. FW_CEventDispatcher::FW_CEventDispatcher(FW_MEventHandler* theEventHandler, FW_CMenuBar* theMenuBar) :
  106.     fLastMouseDownTarget(NULL),
  107.     fLastMouseDownFrame(NULL),
  108.     fEventHandler(theEventHandler),
  109.     fMenuBar(theMenuBar)
  110. {
  111. }
  112.  
  113. //----------------------------------------------------------------------------------------
  114. //    FW_CEventDispatcher::~FW_CEventDispatcher
  115. //----------------------------------------------------------------------------------------
  116.  
  117. FW_CEventDispatcher::~FW_CEventDispatcher()
  118. {
  119. }
  120.  
  121. //----------------------------------------------------------------------------------------
  122. //    FW_CEventDispatcher::Dispatch
  123. //----------------------------------------------------------------------------------------
  124.  
  125. FW_Handled FW_CEventDispatcher::Dispatch(Environment* ev, 
  126.                                         ODEventData* event, 
  127.                                         FW_CFrame* fwFrame,  
  128.                                         ODFacet* odFacet, 
  129.                                         ODEventInfo* eventInfo)
  130. {
  131.     FW_Handled handled = FW_kNotHandled;
  132.     
  133. #ifdef FW_BUILD_MAC    
  134.     switch (event->what)
  135. #endif
  136. #ifdef FW_BUILD_WIN    
  137.     switch (event->message)
  138. #endif
  139.     {
  140.     
  141. #ifdef FW_BUILD_MAC    
  142.         case nullEvent:
  143. #endif
  144. #ifdef FW_BUILD_WIN    
  145.         case WM_NULL:
  146. #endif
  147.             handled = this->DispatchNullEvent(ev, event, fwFrame, eventInfo);
  148.             break;
  149.  
  150. #ifdef FW_BUILD_MAC    
  151.         case mouseDown:
  152. #endif
  153. #ifdef FW_BUILD_WIN    
  154.         case WM_LBUTTONDOWN:
  155.         case WM_MBUTTONDOWN:
  156.         case WM_RBUTTONDOWN:
  157. #endif
  158. #if FW_OPENDOC_VERSION >= FW_OPENDOC_DR3
  159.         case kODEvtBGMouseDown:
  160. #ifdef FW_BUILD_MAC
  161.             handled = this->DispatchMouseDownEvent(ev, event, fwFrame, odFacet, (event->what == kODEvtBGMouseDown), eventInfo);
  162. #endif
  163. #ifdef FW_BUILD_WIN
  164.             handled = this->DispatchMouseDownEvent(ev, event, fwFrame, odFacet, (event->message == kODEvtBGMouseDown), eventInfo);
  165. #endif
  166.             break;
  167. #else
  168.             handled = this->DispatchMouseDownEvent(ev, event, fwFrame, odFacet, FALSE, eventInfo);
  169.             break;
  170. #endif
  171.  
  172. #ifdef FW_BUILD_MAC    
  173.         case mouseUp:
  174. #endif
  175. #ifdef FW_BUILD_WIN    
  176.         case WM_LBUTTONUP:
  177.         case WM_MBUTTONUP:
  178.         case WM_RBUTTONUP:
  179. #endif
  180.             handled = this->DispatchMouseUpEvent(ev, event, fwFrame, odFacet, eventInfo);
  181.             break;
  182.             
  183. #ifdef FW_BUILD_MAC
  184.         case keyDown:
  185.         case autoKey:
  186. #endif
  187. #ifdef FW_BUILD_WIN
  188.         case WM_KEYDOWN:
  189. #endif
  190.             handled = this->DispatchVirtualKeyDownEvent(ev, event, fwFrame, eventInfo);
  191.             break;
  192.             
  193. #ifdef FW_BUILD_MAC
  194.         case keyUp:
  195. #endif
  196. #ifdef FW_BUILD_WIN
  197.         case WM_KEYUP:
  198. #endif
  199.             handled = this->DispatchVirtualKeyUpEvent(ev, event, fwFrame, eventInfo);
  200.             break;
  201.                         
  202. #ifdef FW_BUILD_WIN
  203.         case WM_CHAR:
  204.             handled = this->DispatchCharKeyEvent(ev, event, fwFrame, eventInfo);
  205.             break;
  206. #endif
  207.  
  208. #ifdef FW_BUILD_MAC
  209.         case activateEvt:
  210. #endif
  211. #ifdef FW_BUILD_WIN
  212.         case WM_ACTIVATE:
  213. #endif
  214.             handled = this->DispatchActivateEvent(ev, event, fwFrame, odFacet, eventInfo);
  215.             break;
  216.         
  217.         case kODEvtMenu:
  218.             handled = this->DispatchMenuEvent(ev, event, fwFrame, eventInfo);
  219.             break;
  220.             
  221. #ifdef FW_BUILD_MAC
  222.         case kODEvtWindow: 
  223.             handled = this->DispatchWindowEvent(ev, fwFrame, event, odFacet, eventInfo);
  224.             break;
  225.         case osEvt:
  226.             handled = this->DispatchOSEvent(ev, fwFrame, event, odFacet, eventInfo);
  227.             break;
  228. #endif
  229.  
  230.         case kODEvtMouseDownEmbedded:
  231. #if FW_OPENDOC_VERSION >= FW_OPENDOC_DR3
  232.         case kODEvtBGMouseDownEmbedded:
  233. #ifdef FW_BUILD_MAC
  234.             handled = this->DispatchEmbeddedMouseDownEvent(ev, event, fwFrame, odFacet, (event->what == kODEvtBGMouseDownEmbedded), eventInfo);
  235. #endif
  236. #ifdef FW_BUILD_WIN
  237.             handled = this->DispatchEmbeddedMouseDownEvent(ev, event, fwFrame, odFacet, (event->message == kODEvtBGMouseDownEmbedded), eventInfo);
  238. #endif
  239.             break;
  240. #else
  241.             handled = this->DispatchEmbeddedMouseDownEvent(ev, event, fwFrame, odFacet, FALSE, eventInfo);
  242.             break;
  243. #endif
  244.             
  245.         case kODEvtMouseUpEmbedded:
  246.             handled = this->DispatchEmbeddedMouseUpEvent(ev, event, fwFrame, odFacet, eventInfo);
  247.             break;
  248.             
  249.         case kODEvtMouseDownBorder:
  250.             handled = this->DispatchBorderMouseDownEvent(ev, event, fwFrame, odFacet, eventInfo);
  251.             break;
  252.             
  253.         case kODEvtMouseEnter:
  254.             handled = fwFrame->HandleMouseEnter(ev, odFacet, FW_CPoint(eventInfo->where), eventInfo);
  255.             break;
  256.             
  257.         case kODEvtMouseWithin:
  258.             handled = fwFrame->HandleMouseWithin(ev, odFacet, FW_CPoint(eventInfo->where), eventInfo);
  259.             break;
  260.             
  261.         case kODEvtMouseLeave:
  262.             handled = fwFrame->HandleMouseLeave(ev, odFacet, eventInfo);
  263.             break;
  264.     }
  265.  
  266.     return handled;
  267. }
  268.  
  269. //----------------------------------------------------------------------------------------
  270. //    FW_CEventDispatcher::DispatchNullEvent
  271. //----------------------------------------------------------------------------------------
  272.  
  273. FW_Handled FW_CEventDispatcher::DispatchNullEvent(Environment* ev, ODEventData* event, FW_CFrame* fwFrame, ODEventInfo* eventInfo)
  274. {
  275.     FW_CNullEvent theNullEvent(ev, event, eventInfo->propagated);    
  276.     FW_MEventHandler* target = fEventHandler;    // = the part by default
  277.     
  278.     if (fwFrame)
  279.     {    
  280.         target = fwFrame->GetTarget(ev);    // [LSD] to change with an idle class
  281.         FW_ASSERT(target != NULL);
  282.     }
  283.     
  284.     return target->HandleIdle(ev, theNullEvent);
  285. }
  286.  
  287. //----------------------------------------------------------------------------------------
  288. //    FW_CEventDispatcher::DispatchMouseDownEvent
  289. //----------------------------------------------------------------------------------------
  290.  
  291. FW_Handled FW_CEventDispatcher::DispatchMouseDownEvent(Environment* ev, 
  292.                                                         ODEventData* event, 
  293.                                                         FW_CFrame* fwFrame,  
  294.                                                         ODFacet* odFacet, 
  295.                                                         FW_Boolean inBackground, 
  296.                                                         ODEventInfo* eventInfo)
  297. {
  298.     // ofFacet is NULL when the user clicks outside a frame with the modal focus
  299.     if (odFacet == NULL) {
  300.         if (inBackground) {
  301.             return FW_kNotHandled;    // Let process manager bring the part to the foreground
  302.         } else {
  303.             FW_Beep();        // Click is lost
  304.             return FW_kHandled;
  305.         }
  306.     }
  307.     
  308.     short numOfClicks = OnMouseDown(ev, event);
  309.     
  310.     FW_CMouseEvent theMouseEvent(ev, event, odFacet, FW_CMouseEvent::kMouseButtonDown, eventInfo->propagated, numOfClicks);
  311.     
  312.     FW_CPoint where = theMouseEvent.GetMousePosition(ev, FW_CMouseEvent::kFrame);
  313.     FW_MEventHandler* target = fwFrame->GetViewContaining(ev, odFacet, where);
  314.  
  315.     fLastMouseDownTarget = target;
  316.     fLastMouseDownFrame = fwFrame;
  317.     
  318.     FW_Handled handled = FW_kNotHandled;
  319.     while (target != NULL && handled == FW_kNotHandled)
  320.     {
  321.         handled = inBackground ? target->PrivDispatchBGMouseDown(ev, theMouseEvent)
  322.                               : target->PrivDispatchMouseDown(ev, theMouseEvent);
  323.             
  324.         target = target->GetNextEventHandler(ev);
  325.     }
  326.     
  327.     return handled;
  328. }
  329.  
  330. //----------------------------------------------------------------------------------------
  331. //    FW_CEventDispatcher::DispatchMouseUpEvent
  332. //----------------------------------------------------------------------------------------
  333.  
  334. FW_Handled FW_CEventDispatcher::DispatchMouseUpEvent(Environment* ev, ODEventData* event, FW_CFrame* fwFrame,  ODFacet* odFacet, ODEventInfo* eventInfo)
  335. {
  336.     // ofFacet is NULL when the user clicks outside a frame with the modal focus
  337.     if (!odFacet) return FW_kHandled;
  338.  
  339.     OnMouseUp(ev, event);
  340.     
  341.     FW_CMouseEvent theMouseEvent(ev, event, odFacet, FW_CMouseEvent::kMouseButtonUp, eventInfo->propagated);
  342.     
  343.     FW_MEventHandler* target = NULL;
  344.     
  345.     if (fLastMouseDownFrame == fwFrame)
  346.         target = fLastMouseDownTarget;
  347.     else
  348.     {
  349.         FW_CPoint where = theMouseEvent.GetMousePosition(ev, FW_CMouseEvent::kFrame);
  350.         target = fwFrame->GetViewContaining(ev, odFacet, where);
  351.     }
  352.  
  353.     fLastMouseDownTarget = NULL;
  354.     fLastMouseDownFrame = NULL;
  355.  
  356.     FW_Handled handled = FW_kNotHandled;
  357.     while (target != NULL && handled == FW_kNotHandled)
  358.     {
  359.         handled = target->PrivDispatchMouseUp(ev, theMouseEvent);
  360.             
  361.         target = target->GetNextEventHandler(ev);
  362.     }
  363.     
  364.     return handled;
  365. }
  366.  
  367. //----------------------------------------------------------------------------------------
  368. //    FW_CEventDispatcher::DispatchEmbeddedMouseDownEvent
  369. //----------------------------------------------------------------------------------------
  370.  
  371. FW_Handled FW_CEventDispatcher::DispatchEmbeddedMouseDownEvent(Environment* ev, 
  372.                                                                 ODEventData* event, 
  373.                                                                 FW_CFrame* fwFrame,  
  374.                                                                 ODFacet* odFacet, 
  375.                                                                 FW_Boolean inBackground,
  376.                                                                 ODEventInfo* eventInfo)
  377. {
  378.     short numOfClicks = OnMouseDown(ev, event);
  379.     
  380.     FW_Handled wasSelected = eventInfo->embeddedFacet->IsSelected(ev) ? FW_kHandled : FW_kNotHandled;
  381.     
  382.     FW_CEmbeddedMouseEvent theEmbeddedMouseEvent(ev, 
  383.                                                 event, 
  384.                                                 odFacet, 
  385.                                                 eventInfo->embeddedFrame, 
  386.                                                 eventInfo->embeddedFacet, 
  387.                                                 FW_CMouseEvent::kMouseButtonDown,
  388.                                                 numOfClicks);
  389.     
  390.     if (!inBackground && fwFrame->ActivateWindow(ev, theEmbeddedMouseEvent.GetFacet(ev), TRUE))
  391.         return FW_kHandled;
  392.  
  393.     FW_CSelection* selection = fwFrame->GetPresentation(ev)->GetSelection(ev);
  394.     if (selection)
  395.         selection->UpdateSelectionOnMouseDown(ev, 
  396.                                                 theEmbeddedMouseEvent, 
  397.                                                 theEmbeddedMouseEvent.GetEmbeddedFacet(ev), 
  398.                                                 FALSE,     // Not in active border
  399.                                                 FALSE);    // Not in Background
  400.  
  401.     FW_CPoint where = theEmbeddedMouseEvent.GetMousePosition(ev, FW_CMouseEvent::kFrame);
  402.     FW_MEventHandler* target = fwFrame->GetViewContaining(ev, odFacet, where);
  403.  
  404.     fLastMouseDownTarget = target;
  405.     fLastMouseDownFrame = fwFrame;
  406.  
  407.     FW_Handled handled = FW_kNotHandled;
  408.     while (target != NULL && handled == FW_kNotHandled)
  409.     {
  410.         handled = inBackground ? target->PrivDispatchBGMouseDownInEmbeddedFrame(ev, theEmbeddedMouseEvent)
  411.                               : target->PrivDispatchMouseDownInEmbeddedFrame(ev, theEmbeddedMouseEvent);
  412.             
  413.         target = target->GetNextEventHandler(ev);
  414.     }
  415.  
  416.     return handled;
  417. }
  418.  
  419. //----------------------------------------------------------------------------------------
  420. //    FW_CEventDispatcher::DispatchEmbeddedMouseUpEvent
  421. //----------------------------------------------------------------------------------------
  422.  
  423. FW_Handled FW_CEventDispatcher::DispatchEmbeddedMouseUpEvent(Environment* ev, 
  424.                                                             ODEventData* event, 
  425.                                                             FW_CFrame* fwFrame,  
  426.                                                             ODFacet* odFacet, 
  427.                                                             ODEventInfo* eventInfo)
  428. {
  429.     OnMouseUp(ev, event);
  430.     
  431.     FW_CEmbeddedMouseEvent theEmbeddedMouseEvent(ev, 
  432.                                                 event, 
  433.                                                 odFacet, 
  434.                                                 eventInfo->embeddedFrame, 
  435.                                                 eventInfo->embeddedFacet, 
  436.                                                 FW_CMouseEvent::kMouseButtonUp,
  437.                                                 eventInfo->propagated);
  438.     
  439.     FW_MEventHandler* target = NULL;
  440.     
  441.     if (fLastMouseDownFrame == fwFrame)
  442.         target = fLastMouseDownTarget;
  443.     else
  444.     {
  445.         FW_CPoint where = theEmbeddedMouseEvent.GetMousePosition(ev, FW_CMouseEvent::kFrame);
  446.         target = fwFrame->GetViewContaining(ev, odFacet, where);
  447.     }
  448.     
  449.     fLastMouseDownTarget = NULL;
  450.     fLastMouseDownFrame = NULL;
  451.  
  452.     FW_Handled handled = FW_kNotHandled;
  453.     while (target != NULL && handled == FW_kNotHandled)
  454.     {
  455.         handled = target->PrivDispatchMouseUpInEmbeddedFrame(ev, theEmbeddedMouseEvent);
  456.             
  457.         target = target->GetNextEventHandler(ev);
  458.     }
  459.     
  460.     return handled;
  461. }
  462.  
  463. //----------------------------------------------------------------------------------------
  464. //    FW_CEventDispatcher::DispatchBorderMouseDownEvent
  465. //----------------------------------------------------------------------------------------
  466.  
  467. FW_Handled FW_CEventDispatcher::DispatchBorderMouseDownEvent(Environment* ev, 
  468.                                                             ODEventData* event, 
  469.                                                             FW_CFrame* fwFrame,  
  470.                                                             ODFacet* odFacet, 
  471.                                                             ODEventInfo* eventInfo)
  472. {
  473.     short numOfClicks = OnMouseDown(ev, event);
  474.     
  475.     FW_CBorderMouseEvent theBorderMouseEvent(ev, 
  476.                                             event, 
  477.                                             odFacet, 
  478.                                             eventInfo->embeddedFrame, 
  479.                                             eventInfo->embeddedFacet,
  480.                                             FW_CMouseEvent::kMouseButtonDown,
  481.                                             numOfClicks);
  482.     
  483.     FW_gClosedHandCursor.Select();
  484.  
  485.     FW_CSelection* selection =    fwFrame->GetPresentation(ev)->GetSelection(ev);
  486.     if (selection)
  487.         selection->UpdateSelectionOnMouseDown(ev, 
  488.                                                 theBorderMouseEvent, 
  489.                                                 theBorderMouseEvent.GetEmbeddedFacet(ev), 
  490.                                                 TRUE, 
  491.                                                 FALSE);
  492.     
  493.     FW_CPoint where = theBorderMouseEvent.GetMousePosition(ev, FW_CMouseEvent::kFrame);
  494.     FW_MEventHandler* target = fwFrame->GetViewContaining(ev, odFacet, where);
  495.  
  496.     fLastMouseDownTarget = target;
  497.     fLastMouseDownFrame = fwFrame;
  498.  
  499.     FW_Handled handled = FW_kNotHandled;
  500.     while (target != NULL && handled == FW_kNotHandled)
  501.     {
  502.         handled = target->PrivDispatchMouseDownInEmbeddedFrameBorder(ev, theBorderMouseEvent);
  503.             
  504.         target = target->GetNextEventHandler(ev);
  505.     }
  506.     
  507.     return handled;
  508. }
  509.  
  510. //----------------------------------------------------------------------------------------
  511. //    FW_CEventDispatcher::DispatchVirtualKeyDownEvent
  512. //----------------------------------------------------------------------------------------
  513.  
  514. FW_Handled FW_CEventDispatcher::DispatchVirtualKeyDownEvent(Environment* ev, 
  515.                                                             ODEventData* event, 
  516.                                                             FW_CFrame* fwFrame, 
  517.                                                             ODEventInfo* eventInfo)
  518. {
  519.     FW_Handled handled = FW_kNotHandled;
  520.     
  521. #ifdef FW_BUILD_MAC
  522.     if (event->what == autoKey)
  523.         fgAutoRepeatCount++;
  524.     else
  525.         fgAutoRepeatCount = 0;
  526.         
  527.     FW_CVirtualKeyEvent theVirtualKeyEvent(ev, event, FW_CVirtualKeyEvent::kKeyDown, fgAutoRepeatCount);
  528. #endif
  529.  
  530. #ifdef FW_BUILD_WIN
  531.     FW_CVirtualKeyEvent theVirtualKeyEvent(ev, event, FW_CVirtualKeyEvent::kKeyDown, LOWORD(event->lParam));
  532. #endif
  533.  
  534.     FW_MEventHandler* target = fwFrame->GetTarget(ev);
  535.     FW_ASSERT(target != NULL);
  536.  
  537.     while (target != NULL && handled == FW_kNotHandled)
  538.     {
  539.         handled = target->PrivDispatchVirtualKey(ev, theVirtualKeyEvent);
  540.             
  541.         target = target->GetNextEventHandler(ev);
  542.     }
  543.     
  544. #ifdef FW_BUILD_MAC
  545.     // If the keycode isn't used try the char
  546.     if (handled == FW_kNotHandled)
  547.         handled = this->DispatchCharKeyEvent(ev, event, fwFrame, eventInfo);
  548. #endif
  549.  
  550.     return handled;
  551. }
  552.  
  553. //----------------------------------------------------------------------------------------
  554. //    FW_CEventDispatcher::DispatchVirtualKeyUpEvent
  555. //----------------------------------------------------------------------------------------
  556.  
  557. FW_Handled FW_CEventDispatcher::DispatchVirtualKeyUpEvent(Environment* ev, 
  558.                                                         ODEventData* event, 
  559.                                                         FW_CFrame* fwFrame, 
  560.                                                         ODEventInfo* eventInfo)
  561. {
  562.     FW_CVirtualKeyEvent theVirtualKeyEvent(ev, event, FW_CVirtualKeyEvent::kKeyUp, eventInfo->propagated);
  563.     
  564.     FW_MEventHandler* target = fwFrame->GetTarget(ev);
  565.     FW_ASSERT(target != NULL);
  566.     
  567.     FW_Handled handled = FW_kNotHandled;
  568.     while (target != NULL && handled == FW_kNotHandled)
  569.     {
  570.         handled = target->PrivDispatchVirtualKey(ev, theVirtualKeyEvent);
  571.             
  572.         target = target->GetNextEventHandler(ev);
  573.     }
  574.     
  575.     return handled;
  576. }
  577.  
  578. //----------------------------------------------------------------------------------------
  579. //    FW_CEventDispatcher::DispatchCharKeyEvent
  580. //----------------------------------------------------------------------------------------
  581.  
  582. FW_Handled FW_CEventDispatcher::DispatchCharKeyEvent(Environment* ev, 
  583.                                                     ODEventData* event, 
  584.                                                     FW_CFrame* fwFrame, 
  585.                                                     ODEventInfo* eventInfo)
  586. {
  587. #ifdef FW_BUILD_MAC
  588.     FW_CCharKeyEvent theCharKeyEvent(ev, event, fgAutoRepeatCount, eventInfo->propagated);
  589. #endif
  590. #ifdef FW_BUILD_WIN
  591.     FW_CCharKeyEvent theCharKeyEvent(ev, event, LOWORD(event->lParam), eventInfo->propagated);
  592. #endif
  593.     
  594.     FW_MEventHandler* target = fwFrame->GetTarget(ev);
  595.     FW_ASSERT(target != NULL);
  596.     
  597.     FW_Handled handled = FW_kNotHandled;
  598.     while (target != NULL && handled == FW_kNotHandled)
  599.     {
  600.         handled = target->PrivDispatchCharKey(ev, theCharKeyEvent);
  601.             
  602.         target = target->GetNextEventHandler(ev);
  603.     }
  604.     
  605.     return handled;
  606. }
  607.  
  608. //----------------------------------------------------------------------------------------
  609. //    FW_CEventDispatcher::DispatchActivateEvent
  610. //----------------------------------------------------------------------------------------
  611.  
  612. FW_Handled FW_CEventDispatcher::DispatchActivateEvent(Environment* ev, 
  613.                                                     ODEventData* event, 
  614.                                                     FW_CFrame* fwFrame,  
  615.                                                     ODFacet* odFacet,
  616.                                                     ODEventInfo* eventInfo)
  617. {
  618.     FW_UNUSED(fwFrame);
  619.     
  620. #ifdef FW_BUILD_MAC
  621.     FW_CActivateEvent theActivateEvent(ev, event, odFacet, (event->modifiers & activeFlag ) != 0, eventInfo->propagated);
  622. #endif
  623. #ifdef FW_BUILD_WIN
  624.     FW_CActivateEvent theActivateEvent(ev, event, odFacet, (event->wParam != WA_INACTIVE), eventInfo->propagated);
  625. #endif
  626.  
  627.     fwFrame->HandleActivateEvent(ev, theActivateEvent);
  628.     return FW_kHandled;
  629. }
  630.  
  631. //----------------------------------------------------------------------------------------
  632. //    FW_CEventDispatcher::DispatchMenuEvent
  633. //----------------------------------------------------------------------------------------
  634.  
  635. FW_Handled FW_CEventDispatcher::DispatchMenuEvent(Environment* ev, 
  636.                                                     ODEventData* event, 
  637.                                                     FW_CFrame* fwFrame,
  638.                                                     ODEventInfo* eventInfo)
  639. {
  640.     ODCommandID theCommand;
  641.     
  642. #ifdef FW_BUILD_MAC
  643.     ODMenuID menu = HiWord(event->message);
  644.     ODMenuItemID item = LoWord(event->message);
  645.     theCommand = fMenuBar->PrivMacGetCommand(ev, menu, item);
  646. #endif
  647. #ifdef FW_BUILD_WIN
  648.     theCommand = event->wParam;
  649. #endif
  650.  
  651.     FW_CMenuEvent theMenuEvent(ev, event, theCommand, eventInfo->propagated);
  652.  
  653.     FW_MEventHandler* target = fwFrame->GetTarget(ev);
  654.     FW_ASSERT(target != NULL);
  655.     
  656.     FW_Handled handled = FW_kNotHandled;
  657.     while (target != NULL && handled == FW_kNotHandled)
  658.     {
  659.         handled = target->PrivDispatchMenuEvent(ev, theMenuEvent);
  660.             
  661.         target = target->GetNextEventHandler(ev);
  662.     }
  663.  
  664. #ifdef FW_BUILD_MAC
  665.     ::HiliteMenu(0);
  666. #endif
  667.  
  668.     return handled;
  669. }
  670.  
  671. #ifdef FW_BUILD_MAC
  672. //----------------------------------------------------------------------------------------
  673. //    FW_CEventDispatcher::DispatchWindowEvent
  674. //----------------------------------------------------------------------------------------
  675.  
  676. FW_Handled FW_CEventDispatcher::DispatchWindowEvent(Environment* ev, 
  677.                                                 FW_CFrame* fwFrame, 
  678.                                                 ODEventData* event, 
  679.                                                 ODFacet* odFacet,
  680.                                                 ODEventInfo* eventInfo)
  681. {
  682. FW_UNUSED(odFacet);
  683.  
  684.     FW_CMacWindowEvent windowEvent(ev, event, eventInfo->propagated);
  685.  
  686.     return fwFrame->HandleWindowEvent(ev, windowEvent);
  687. }
  688. #endif
  689.  
  690. #ifdef FW_BUILD_MAC
  691. //----------------------------------------------------------------------------------------
  692. //    FW_CEventDispatcher::DispatchOSEvent
  693. //----------------------------------------------------------------------------------------
  694.  
  695. FW_Handled FW_CEventDispatcher::DispatchOSEvent(Environment* ev, 
  696.                                                 FW_CFrame* fwFrame, 
  697.                                                 ODEventData* event, 
  698.                                                 ODFacet* odFacet,
  699.                                                 ODEventInfo* eventInfo)
  700. {
  701.     FW_Handled handled = FW_kNotHandled;
  702.     
  703.     if (((unsigned char) ( event->message >> 24 ) & 0x00FF) == 0x01)
  704.     {
  705.         const short kResumeMask = 0x01;    // High byte suspend/resume event 
  706.     
  707.         FW_Boolean goingToBackground = (event->message & kResumeMask) == 0;
  708.         FW_CSuspendResumeEvent suspendResumeEvent(ev, event, odFacet, goingToBackground, eventInfo->propagated);
  709.                     
  710.         handled = fwFrame->HandleSuspendResumeEvent(ev, suspendResumeEvent);
  711.     }
  712.     
  713.     return handled;
  714. }
  715. #endif
  716.  
  717. //----------------------------------------------------------------------------------------
  718. //    FW_CEventDispatcher::OnMouseUp
  719. //----------------------------------------------------------------------------------------
  720.  
  721. void FW_CEventDispatcher::OnMouseUp(Environment* ev, ODEventData* event)
  722. {
  723. FW_UNUSED(ev);
  724. #ifdef FW_BUILD_MAC
  725.     fgLastMouseUp = event->when;
  726.     fgLastMouseUpWhere = event->where;
  727. #endif
  728.  
  729. #ifdef FW_BUILD_WIN
  730.     fgLastMouseUp = 0;
  731. #endif
  732. }
  733.  
  734. //----------------------------------------------------------------------------------------
  735. //    FW_CEventDispatcher::OnMouseDown
  736. //----------------------------------------------------------------------------------------
  737.  
  738. short FW_CEventDispatcher::OnMouseDown(Environment* ev, ODEventData* event)
  739. {
  740. FW_UNUSED(ev);
  741. #ifdef FW_BUILD_MAC
  742.     if (event->when - fgLastMouseUp < ::GetDblTime())
  743.     {
  744.         short deltax = FW_Absolute(event->where.h - fgLastMouseUpWhere.h);
  745.         short deltay = FW_Absolute(event->where.v - fgLastMouseUpWhere.v);
  746.         if (deltax <= 4 && deltay <= 4)
  747.             fgClickCount++;
  748.         else
  749.             fgClickCount = 1;
  750.     }
  751.     else
  752.         fgClickCount = 1;
  753. #endif
  754.  
  755. #ifdef FW_BUILD_WIN
  756.     fgClickCount = 1;
  757. #endif
  758.  
  759.     return fgClickCount;
  760. }