home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 7 / Apprentice-Release7.iso / Source Code / Libraries / Aidan's Class Libraries / Source / Window & Dialog Classes / ModalLayer.cpp < prev    next >
Encoding:
Text File  |  1997-07-20  |  2.2 KB  |  106 lines  |  [TEXT/CWIE]

  1. //Copyright (c) 1997 Aidan Cully
  2. //All rights reserved
  3.  
  4. #include "CLModalLayer.h"
  5. #include "CLBaseWindow.h"
  6.  
  7. TModalLayer *gModalWindowLayer=0;
  8.  
  9. TModalLayer::TModalLayer()
  10. {
  11.     TWindowLayer *oFront= sFrontLayer;
  12.     mBelow= oFront;
  13.     sFrontLayer= this;
  14.     gModalWindowLayer= this;
  15.     mActive= false;
  16. }
  17.  
  18. void TModalLayer::SelectWindow( TBaseWindow *win )
  19. {
  20. }
  21.  
  22. void TModalLayer::SendBehind( TBaseWindow *moved, TBaseWindow *fore )
  23. {
  24. }
  25.  
  26. TBaseWindow *TModalLayer::FindWindow( Point pt )
  27. {
  28.     if( !mhWindows.MoveFirst() )
  29.         return( 0 );
  30.     TBaseWindow *win;
  31.     mhWindows.GetData( win );
  32.     RgnHandle rgn= ::NewRgn();
  33.     RgnHandle clip= ::NewRgn();
  34.     ::GetWindowStructureRgn( win->GetWindow(), rgn );
  35.     win->ClipAbove( clip );
  36.     ::SectRgn( clip, rgn, rgn );
  37.     ::DisposeRgn( clip );
  38.     bool ret= ::PtInRgn( pt, rgn );
  39.     ::DisposeRgn( rgn );
  40.     if( ret )
  41.         return( win );
  42.     return( 0 );
  43. }
  44.  
  45. void TModalLayer::CalcMouseMove( Point pt, RgnHandle rgn )
  46. {
  47.     if( !::FrontWindow() )
  48.         return;
  49.     TBaseWindow *frontWin= ((TBaseWindow*)::GetWRefCon( ::FrontWindow() ));
  50.     RgnHandle above= ::NewRgn();
  51.     frontWin->ClipAbove( above );
  52.     Rect bigRect;
  53.     ::SetRect( &bigRect, -32767, -32767, 32767, 32767 );
  54.     if( !::PtInRgn( pt, above ) ) {
  55.         ::RectRgn( rgn, &bigRect );
  56.         ::DiffRgn( rgn, above, rgn );
  57.         ::DisposeRgn( above );
  58.         return;
  59.     }
  60.     ::CopyRgn( above, rgn );
  61.     if( CalcMouseMoveBelow( pt, rgn ) ) {
  62.         ::DisposeRgn( above );
  63.         return;
  64.     }
  65. }
  66.  
  67. bool TModalLayer::CalcMouseMoveBelow( Point pt, RgnHandle rgn )
  68. {
  69.     if( !mhWindows.MoveFirst() )
  70.         if( mBelow )
  71.             return( ((TModalLayer*)mBelow)->CalcMouseMoveBelow( pt, rgn ) );
  72.         else
  73.             return( false );
  74.     TBaseWindow *win;
  75.     mhWindows.GetData( win );
  76.     win->CalcMouseMove( pt, rgn );
  77.     return( true );
  78. }
  79.  
  80. void TModalLayer::MakeActive( bool active )
  81. {
  82.     if( mActive==active )
  83.         return;
  84.     TWindowLayer *iter= mBelow;
  85.     while( iter ) {
  86.         iter->MakeActive( !active );
  87.         iter= ((TModalLayer*)iter)->mBelow;
  88.     }
  89.     mActive= active;
  90. }
  91.  
  92. void TModalLayer::AddWindow( TBaseWindow *win )
  93. {
  94.     if( !mhWindows.MoveFirst() )
  95.         MakeActive( true );
  96.     TWindowLayer::AddWindow( win );
  97. }
  98.  
  99. void TModalLayer::RemoveWindow( TBaseWindow *win )
  100. {
  101.     bool inact= mhWindows.MoveFirst();
  102.  
  103.     TWindowLayer::RemoveWindow( win );
  104.     if( inact&&!mhWindows.MoveFirst() )
  105.         MakeActive( false );
  106. }