123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451 |
- #include "stdafx.h"
- #include "CWindowManager.h"
- CWindowManager::CWindowManager()
- {
- FocusedWindow = NULL;
- CapturedWindow = NULL;
- LastMouseMove = NULL;
-
- FocusChangeCount = 0;
- Root.PrivateSetPosition( 0, 0 );
- Root.PrivateSetSize( 1, 1 );
- return;
- }
- CWindowManager::~CWindowManager()
- {
- return;
- }
- bool CWindowManager::SetWidth( float NewWidth )
- {
- return Root.PrivateSetWidth( NewWidth );
- }
- float CWindowManager::GetWidth()
- {
- return Root.GetWidth();
- }
- bool CWindowManager::SetHeight( float NewHeight )
- {
- return Root.PrivateSetHeight( NewHeight );
- }
- float CWindowManager::GetHeight()
- {
- return Root.GetHeight();
- }
- bool CWindowManager::SetSize( float NewWidth, float NewHeight )
- {
- return Root.PrivateSetSize( NewWidth, NewHeight );
- }
- bool CWindowManager::AddWindow( IWindow &Window )
- {
- return Root.PrivateAddChild( Window );
- }
- bool CWindowManager::RemoveWindow( IWindow &Window )
- {
- return Root.PrivateRemoveChild( Window );
- }
- IWindow *CWindowManager::SetFocusedWindow( IWindow * Window )
- {
- bool FoundWindow = false;
- bool MustResetFocusChangeCount = false;
-
- IWindow *TempWindow = NULL;
- IWindow *OldFocusedWindow = FocusedWindow;
-
- unsigned long MyFocusID = 0;
-
- std::list< IWindow * >::iterator I;
-
- //IF THIS IS THE FIRST CALL TO SETFOCUSEDWINDOW IN A NESTED SET OF CALLS
- //THIS CALL MUST ALSO RESET THE FOCUSCHANGECOUNT TO 0
- if( FocusChangeCount == 0 )
- {
- MustResetFocusChangeCount = true;
- }
-
- //INCREMENT THE FOCUSCHANGECOUNT AND STORE THE LOCAL FOCUSID
- FocusChangeCount = FocusChangeCount + 1;
- MyFocusID = FocusChangeCount;
- //VERIFY THAT THE WINDOW THAT'S GOING TO RECEIVE FOCUS IS VALID
- //IE A NULL WINDOW OR ONE THAT'S IN THE WINDOW LIST
- if( Window != NULL )
- {
- TempWindow = Window;
- while( TempWindow->GetParent() != NULL )
- {
- TempWindow = TempWindow->GetParent();
- }
- FoundWindow = false;
- if( TempWindow == &Root )
- {
- FoundWindow = true;
- }
- if( FoundWindow == false )
- {
- if( MustResetFocusChangeCount == true )
- {
- FocusChangeCount = 0;
- }
- //RETURN UNSUCCESSFULLY
- return FocusedWindow;
- }
- }
-
- //UPDATE FOCUSEDWINDOW -- THE FOCUSEDWINDOW IS NULL DURING THE LOST AND GOTFOCUS EVENTS
- FocusedWindow = NULL;
- //IF THERE IS A CURRENT WINDOW WITH FOCUS CALL ITS ONLOSTFOCUS EVENT AND RETURN AN ERROR IF THE FOCUS DOES NOT END UP AS EXPECTED
- if( OldFocusedWindow != NULL )
- {
- OldFocusedWindow->FireLostFocus( Window );
- if( MyFocusID != FocusChangeCount )
- {
- if( MustResetFocusChangeCount == true )
- {
- FocusChangeCount = 0;
- }
- //RETURN UNSUCCESSFULLY
- return FocusedWindow;
- }
- }
-
- //IF THERE IS A NEW WINDOW TO RECEIVE FOCUS CALL ITS ONGOTFOCUS EVENT AND RETURN AN ERROR IF THE FOCUS DOES NOT END UP AS EXPECTED
- if( FocusedWindow != NULL )
- {
- FocusedWindow->FireGotFocus( OldFocusedWindow );
- if( MyFocusID != FocusChangeCount )
- {
- if( MustResetFocusChangeCount == true )
- {
- FocusChangeCount = 0;
- }
- //RETURN UNSUCCESSFULLY
- return FocusedWindow;
- }
- }
-
- //JUMP THE WINDOW AND ALL IT'S ANCESTORS TO THE TOP OF THE Z ORDER FOR VISUAL FOCUS
- FocusedWindow = Window;
- TempWindow = FocusedWindow;
-
- while( TempWindow != NULL )
- {
- TempWindow->JumpToFront();
- TempWindow = TempWindow->GetParent();
- }
-
- //RESET THE FOCUSCHANGECOUNT IF NECESSARY
- if( MustResetFocusChangeCount == true )
- {
- FocusChangeCount = 0;
- }
- //RETURN SUCCESSFULLY
- return FocusedWindow;
- }
- IWindow *CWindowManager::GetFocusedWindow()
- {
- return FocusedWindow;
- }
- IWindow *CWindowManager::GetWindowFromXY( float X, float Y )
- {
- std::list< IWindow * >::const_reverse_iterator I;
-
- IWindow *Window = NULL;
-
- for( I = Root.GetChildren().rbegin(); I != Root.GetChildren().rend(); I++ )
- {
- if( (*I)->GetVisible() == true )
- {
- Window = GetChildFromXY( *I, X, Y );
- if( Window != NULL )
- {
- return Window;
- }
- }
- }
-
- return NULL;
- }
- void CWindowManager::OnRender( double TimeSlice )
- {
- std::list< IWindow * >::const_iterator I;
- for( I = Root.GetChildren().begin(); I != Root.GetChildren().end(); I++ )
- {
- if( (*I)->GetVisible() == true )
- {
- RenderWindow( *I, TimeSlice );
- }
- }
-
- return;
- }
- void CWindowManager::OnClick( float X, float Y, unsigned long Button )
- {
- IWindow *TempWindow;
- TempWindow = GetWindowFromXY( X, Y );
- if( TempWindow != NULL )
- {
- TempWindow->FireClick( X - TempWindow->GetAbsoluteLeft() , Y - TempWindow->GetAbsoluteTop() , Button );
- }
-
- return;
- }
- void CWindowManager::OnDoubleClick( float X, float Y, unsigned long Button )
- {
- IWindow *TempWindow;
-
- TempWindow = GetWindowFromXY( X, Y );
- if( TempWindow != NULL )
- {
- TempWindow->FireDoubleClick( X - TempWindow->GetAbsoluteLeft() , Y - TempWindow->GetAbsoluteTop() , Button );
- }
-
- return;
- }
- void CWindowManager::OnMouseDown( float X, float Y, unsigned long Button )
- {
- IWindow *TempWindow;
-
- TempWindow = GetWindowFromXY( X, Y );
- CapturedWindow = TempWindow;
- SetFocusedWindow( TempWindow );
- if( TempWindow != NULL )
- {
- TempWindow->FireMouseDown( X - TempWindow->GetAbsoluteLeft() , Y - TempWindow->GetAbsoluteTop() , Button );
- }
- return;
- }
- void CWindowManager::OnMouseWheel( float X, float Y, unsigned long Button )
- {
- IWindow *TempWindow;
-
- TempWindow = GetWindowFromXY( X, Y );
- if( TempWindow != NULL )
- {
- TempWindow->FireMouseWheel( X - TempWindow->GetAbsoluteLeft() , Y - TempWindow->GetAbsoluteTop() , Button );
- }
- return;
- }
- void CWindowManager::OnMouseUp( float X, float Y, unsigned long Button )
- {
- IWindow *TempWindow;
-
- if( CapturedWindow == NULL )
- {
- TempWindow = GetWindowFromXY( X, Y );
- } else {
- TempWindow = CapturedWindow;
- }
- if( TempWindow != NULL )
- {
- TempWindow->FireMouseUp( X - TempWindow->GetAbsoluteLeft() , Y - TempWindow->GetAbsoluteTop() , Button );
- if( CapturedWindow == GetWindowFromXY( X, Y ) )
- {
- TempWindow->FireClick( X - TempWindow->GetAbsoluteLeft() , Y - TempWindow->GetAbsoluteTop() , Button );
- }
- }
-
- CapturedWindow = NULL;
- if( LastMouseMove != TempWindow )
- {
- if( LastMouseMove != NULL )
- {
- LastMouseMove->FireMouseExit( X, Y, Button );
- }
- if( TempWindow != NULL )
- {
- TempWindow->FireMouseEnter( X, Y, Button );
- }
- }
- LastMouseMove = TempWindow;
- return;
- }
- void CWindowManager::OnMouseMove( float X, float Y, unsigned long Button )
- {
- IWindow *TempWindow;
-
- if( CapturedWindow == NULL )
- {
- TempWindow = GetWindowFromXY( X, Y );
- if( LastMouseMove != TempWindow )
- {
- if( LastMouseMove != NULL )
- {
- LastMouseMove->FireMouseExit( X, Y, Button );
- }
- if( TempWindow != NULL )
- {
- TempWindow->FireMouseEnter( X, Y, Button );
- }
- }
- LastMouseMove = TempWindow;
- } else {
- TempWindow = CapturedWindow;
- }
- if( TempWindow != NULL )
- {
- TempWindow->FireMouseMove( X - TempWindow->GetAbsoluteLeft() , Y - TempWindow->GetAbsoluteTop() , Button );
- }
-
- return;
- }
- void CWindowManager::OnMouseEnter( float X, float Y, unsigned long Button )
- {
- return;
- }
- void CWindowManager::OnMouseExit( float X, float Y, unsigned long Button )
- {
- return;
- }
- void CWindowManager::OnKeyPress( unsigned long KeyCode )
- {
- std::list< IWindow * >::const_iterator I;
- std::list< IWindow * >::const_iterator NextI;
-
- if( FocusedWindow == NULL )
- {
- return;
- }
-
- //DEAL WITH FOCUS SWITCHING
- if( KeyCode == 9 )
- {
- if( FocusedWindow->GetParent() != NULL )
- {
- for( I = FocusedWindow->GetParent()->GetChildren().begin(); I != FocusedWindow->GetParent()->GetChildren().end(); I++ )
- {
- if( FocusedWindow == *I )
- {
- NextI = I++;
- if( NextI != FocusedWindow->GetParent()->GetChildren().end() )
- {
- FocusedWindow = *NextI;
- } else {
- FocusedWindow = *(FocusedWindow->GetParent()->GetChildren().begin() );
- }
- break;
- }
- }
- }
- }
-
- FocusedWindow->FireKeyPress( KeyCode );
-
- return;
- }
- void CWindowManager::OnKeyDown( unsigned long KeyCode )
- {
- if( FocusedWindow == NULL )
- {
- return;
- }
-
- FocusedWindow->FireKeyDown( KeyCode );
-
- return;
- }
- void CWindowManager::OnKeyUp( unsigned long KeyCode )
- {
- if( FocusedWindow == NULL )
- {
- return;
- }
-
- FocusedWindow->FireKeyUp( KeyCode );
-
- return;
- }
- void CWindowManager::RenderWindow( IWindow * Window, double TimeSlice )
- {
- std::list< IWindow * >::const_iterator I;
-
- Window->FireRender( TimeSlice );
-
- for( I = Window->GetChildren().begin(); I != Window->GetChildren().end(); I++ )
- {
- if( (*I)->GetVisible() == true )
- {
- RenderWindow( *I, TimeSlice );
- }
- }
-
- return;
- }
- IWindow *CWindowManager::GetChildFromXY( IWindow * Window, float X, float Y )
- {
- IWindow *TempWindow = NULL;
- std::list< IWindow * >::const_reverse_iterator I;
-
- for( I = Window->GetChildren().rbegin(); I != Window->GetChildren().rend(); I++ )
- {
- if( (*I)->GetVisible() == true )
- {
- TempWindow = GetChildFromXY( *I, X, Y );
- if( TempWindow != NULL )
- {
- return TempWindow;
- }
- }
- }
-
- if( X >= Window->GetAbsoluteLeft() && X <= ( Window->GetAbsoluteLeft() + Window->GetWidth() ) && Y >= Window->GetAbsoluteTop() && Y <= ( Window->GetAbsoluteTop() + Window->GetHeight() ) )
- {
- return Window;
- }
-
- return NULL;
- }
|