home *** CD-ROM | disk | FTP | other *** search
Text File | 1997-07-20 | 2.2 KB | 106 lines | [TEXT/CWIE] |
- //Copyright (c) 1997 Aidan Cully
- //All rights reserved
-
- #include "CLModalLayer.h"
- #include "CLBaseWindow.h"
-
- TModalLayer *gModalWindowLayer=0;
-
- TModalLayer::TModalLayer()
- {
- TWindowLayer *oFront= sFrontLayer;
- mBelow= oFront;
- sFrontLayer= this;
- gModalWindowLayer= this;
- mActive= false;
- }
-
- void TModalLayer::SelectWindow( TBaseWindow *win )
- {
- }
-
- void TModalLayer::SendBehind( TBaseWindow *moved, TBaseWindow *fore )
- {
- }
-
- TBaseWindow *TModalLayer::FindWindow( Point pt )
- {
- if( !mhWindows.MoveFirst() )
- return( 0 );
- TBaseWindow *win;
- mhWindows.GetData( win );
- RgnHandle rgn= ::NewRgn();
- RgnHandle clip= ::NewRgn();
- ::GetWindowStructureRgn( win->GetWindow(), rgn );
- win->ClipAbove( clip );
- ::SectRgn( clip, rgn, rgn );
- ::DisposeRgn( clip );
- bool ret= ::PtInRgn( pt, rgn );
- ::DisposeRgn( rgn );
- if( ret )
- return( win );
- return( 0 );
- }
-
- void TModalLayer::CalcMouseMove( Point pt, RgnHandle rgn )
- {
- if( !::FrontWindow() )
- return;
- TBaseWindow *frontWin= ((TBaseWindow*)::GetWRefCon( ::FrontWindow() ));
- RgnHandle above= ::NewRgn();
- frontWin->ClipAbove( above );
- Rect bigRect;
- ::SetRect( &bigRect, -32767, -32767, 32767, 32767 );
- if( !::PtInRgn( pt, above ) ) {
- ::RectRgn( rgn, &bigRect );
- ::DiffRgn( rgn, above, rgn );
- ::DisposeRgn( above );
- return;
- }
- ::CopyRgn( above, rgn );
- if( CalcMouseMoveBelow( pt, rgn ) ) {
- ::DisposeRgn( above );
- return;
- }
- }
-
- bool TModalLayer::CalcMouseMoveBelow( Point pt, RgnHandle rgn )
- {
- if( !mhWindows.MoveFirst() )
- if( mBelow )
- return( ((TModalLayer*)mBelow)->CalcMouseMoveBelow( pt, rgn ) );
- else
- return( false );
- TBaseWindow *win;
- mhWindows.GetData( win );
- win->CalcMouseMove( pt, rgn );
- return( true );
- }
-
- void TModalLayer::MakeActive( bool active )
- {
- if( mActive==active )
- return;
- TWindowLayer *iter= mBelow;
- while( iter ) {
- iter->MakeActive( !active );
- iter= ((TModalLayer*)iter)->mBelow;
- }
- mActive= active;
- }
-
- void TModalLayer::AddWindow( TBaseWindow *win )
- {
- if( !mhWindows.MoveFirst() )
- MakeActive( true );
- TWindowLayer::AddWindow( win );
- }
-
- void TModalLayer::RemoveWindow( TBaseWindow *win )
- {
- bool inact= mhWindows.MoveFirst();
-
- TWindowLayer::RemoveWindow( win );
- if( inact&&!mhWindows.MoveFirst() )
- MakeActive( false );
- }