home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 7 / Apprentice-Release7.iso / Source Code / Libraries / Aidan's Class Libraries / Source / Action / MouseHandler.cpp < prev    next >
Encoding:
Text File  |  1997-07-20  |  3.1 KB  |  155 lines  |  [TEXT/CWIE]

  1. //Copyright (c) 1997 Aidan Cully
  2. //All rights reserved
  3.  
  4. #include "CLMouseHandler.h"
  5. #include "CLBaseWindow.h"
  6. #include "CLActionHandler.h"
  7. #include "CLApplication.h"
  8. #include "CLWindowLayer.h"
  9. #include "CLMouseListener.h"
  10.  
  11. TMouseHandler *TMouseHandler::sCurMouse= 0;
  12.  
  13. TMouseHandler::TMouseHandler()
  14. {
  15.     mMouseMoveRgn= ::NewRgn();
  16.     sCurMouse= this;
  17.     mCurListener= 0;
  18. }
  19.  
  20. TMouseHandler::~TMouseHandler()
  21. {
  22.     ::DisposeRgn( mMouseMoveRgn );
  23. }
  24.  
  25. void TMouseHandler::NewDispatcher()
  26. {
  27. }
  28.  
  29. void TMouseHandler::OldDispatcher()
  30. {
  31.     CalcMouseMoveRgn();
  32. }
  33.  
  34. void TMouseHandler::DispatchEvent( const EventRecord &ev )
  35. {
  36.     BuildEvent( ev );
  37. }
  38.  
  39. void TMouseHandler::BuildEvent( const EventRecord &ev )
  40. {
  41.     TMouseButtonEvent mev;
  42.     mev.when= ev.when;
  43.     mev.where= ev.where;
  44.     short partCode;
  45.     WindowRef theWindow;
  46.  
  47.     switch( ev.what ) {
  48.     case mouseDown:
  49.     case mouseUp:
  50.         partCode = FindWindow( ev.where, &theWindow );
  51.         mev.button= ev.what==mouseDown;
  52.         switch( partCode ) {
  53.         case inMenuBar:
  54.             if( ev.what == mouseDown ) {
  55.                 if( MActionHandler::sCurHandler )
  56.                     MActionHandler::sCurHandler->HandleAction( MenuSelect( ev.where ) );
  57.                 break;
  58.             }
  59.         default:
  60.             if( ev.what==mouseUp )
  61.                 if( theWindow!=mCurWindow ) {
  62.                     mCurWindow= theWindow;
  63.                     return;
  64.                 }
  65.             //if( theWindow&&!mCurListener )
  66.                 //((TBaseWindow*)GetWRefCon(theWindow))->HandleMouse( &mev );
  67.             if( mCurListener )
  68.                 mCurListener->HandleMouse( &mev );
  69.             mCurWindow= theWindow;
  70.             break;
  71.         }
  72.         break;
  73.     case osEvt:
  74.         if( (ev.message>>24)==mouseMovedMessage ) {
  75.             SetListener( 0 );
  76.             CalcMouseMoveRgn();
  77.         }
  78.     default:
  79.         break;
  80.     }
  81. }
  82.  
  83. void TMouseHandler::CalcMouseMoveRgn()
  84. {
  85.     Point where;
  86.     EventRecord ev;
  87.     GWorldPtr oldWorld, world;
  88.     GDHandle oldDev, dev;
  89.     TApplication::SCurApp()->GetGlobalWorld( world, dev );
  90.     ::GetGWorld( &oldWorld, &oldDev );
  91.     ::SetGWorld( world, dev );
  92.     GrafPtr oldPort;
  93.     ::GetPort( &oldPort );
  94.     ::SetPort( TApplication::SCurApp()->GetGlobalPort() );
  95.     ::WaitNextEvent( 1, &ev, 0, 0 );
  96.     ::SetPort( oldPort );
  97.     ::SetGWorld( oldWorld, oldDev );
  98.     TMouseEvent mev;
  99.     mev.when= ev.when;
  100.     where= ev.where;
  101.     mev.where= where;
  102.     MMouseListener *oldLis= mCurListener;
  103.  
  104.     if( mMouseMoveRgn ) {
  105.         TWindowLayer::FrontLayer()->CalcMouseMove( where, mMouseMoveRgn );
  106.         if( oldLis!=mCurListener ) {
  107.             if( oldLis )
  108.                 oldLis->HandleMouseMoved( &mev, false );
  109.             if( mCurListener )
  110.                 mCurListener->HandleMouseMoved( &mev, true );
  111.         }
  112.     }
  113. }
  114.  
  115. RgnHandle TMouseHandler::MouseMoveRgn()
  116. {
  117.     return( mMouseMoveRgn );
  118. }
  119.  
  120. void TMouseHandler::SetListener( MMouseListener *listener )
  121. {
  122.     EventRecord ev;
  123.     ::WaitNextEvent( 1, &ev, 0, 0 );
  124.     TMouseEvent mev;
  125.     mev.when= ev.when;
  126.     mev.where= ev.where;
  127.     if( listener!=mCurListener ) {
  128.         if( mCurListener )
  129.             mCurListener->HandleMouseMoved( &mev, false );
  130.         if( listener )
  131.             listener->HandleMouseMoved( &mev, true );
  132.         else
  133.             ::SetCursor( &qd.arrow );
  134.         mCurListener= listener;
  135.     }
  136. }
  137.  
  138. MMouseListener *TMouseHandler::GetListener()
  139. {
  140.     return( mCurListener );
  141. }
  142.  
  143. void TMouseHandler::GetPosition( Point &pt )
  144. {
  145.     EventRecord ev;
  146.     ::WaitNextEvent( 1, &ev, 0, 0 );
  147.     pt= ev.where;
  148. }
  149.  
  150. Boolean TMouseHandler::GetButton()
  151. {
  152.     EventRecord ev;
  153.     ::WaitNextEvent( 1, &ev, 0, 0 );
  154.     return( Button() );
  155. }