Clone of Akilla's ac2d @ https://github.com/deregtd/AC2D

CWindowManager.cpp 8.8KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451
  1. #include "stdafx.h"
  2. #include "CWindowManager.h"
  3. CWindowManager::CWindowManager()
  4. {
  5. FocusedWindow = NULL;
  6. CapturedWindow = NULL;
  7. LastMouseMove = NULL;
  8. FocusChangeCount = 0;
  9. Root.PrivateSetPosition( 0, 0 );
  10. Root.PrivateSetSize( 1, 1 );
  11. return;
  12. }
  13. CWindowManager::~CWindowManager()
  14. {
  15. return;
  16. }
  17. bool CWindowManager::SetWidth( float NewWidth )
  18. {
  19. return Root.PrivateSetWidth( NewWidth );
  20. }
  21. float CWindowManager::GetWidth()
  22. {
  23. return Root.GetWidth();
  24. }
  25. bool CWindowManager::SetHeight( float NewHeight )
  26. {
  27. return Root.PrivateSetHeight( NewHeight );
  28. }
  29. float CWindowManager::GetHeight()
  30. {
  31. return Root.GetHeight();
  32. }
  33. bool CWindowManager::SetSize( float NewWidth, float NewHeight )
  34. {
  35. return Root.PrivateSetSize( NewWidth, NewHeight );
  36. }
  37. bool CWindowManager::AddWindow( IWindow &Window )
  38. {
  39. return Root.PrivateAddChild( Window );
  40. }
  41. bool CWindowManager::RemoveWindow( IWindow &Window )
  42. {
  43. return Root.PrivateRemoveChild( Window );
  44. }
  45. IWindow *CWindowManager::SetFocusedWindow( IWindow * Window )
  46. {
  47. bool FoundWindow = false;
  48. bool MustResetFocusChangeCount = false;
  49. IWindow *TempWindow = NULL;
  50. IWindow *OldFocusedWindow = FocusedWindow;
  51. unsigned long MyFocusID = 0;
  52. std::list< IWindow * >::iterator I;
  53. //IF THIS IS THE FIRST CALL TO SETFOCUSEDWINDOW IN A NESTED SET OF CALLS
  54. //THIS CALL MUST ALSO RESET THE FOCUSCHANGECOUNT TO 0
  55. if( FocusChangeCount == 0 )
  56. {
  57. MustResetFocusChangeCount = true;
  58. }
  59. //INCREMENT THE FOCUSCHANGECOUNT AND STORE THE LOCAL FOCUSID
  60. FocusChangeCount = FocusChangeCount + 1;
  61. MyFocusID = FocusChangeCount;
  62. //VERIFY THAT THE WINDOW THAT'S GOING TO RECEIVE FOCUS IS VALID
  63. //IE A NULL WINDOW OR ONE THAT'S IN THE WINDOW LIST
  64. if( Window != NULL )
  65. {
  66. TempWindow = Window;
  67. while( TempWindow->GetParent() != NULL )
  68. {
  69. TempWindow = TempWindow->GetParent();
  70. }
  71. FoundWindow = false;
  72. if( TempWindow == &Root )
  73. {
  74. FoundWindow = true;
  75. }
  76. if( FoundWindow == false )
  77. {
  78. if( MustResetFocusChangeCount == true )
  79. {
  80. FocusChangeCount = 0;
  81. }
  82. //RETURN UNSUCCESSFULLY
  83. return FocusedWindow;
  84. }
  85. }
  86. //UPDATE FOCUSEDWINDOW -- THE FOCUSEDWINDOW IS NULL DURING THE LOST AND GOTFOCUS EVENTS
  87. FocusedWindow = NULL;
  88. //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
  89. if( OldFocusedWindow != NULL )
  90. {
  91. OldFocusedWindow->FireLostFocus( Window );
  92. if( MyFocusID != FocusChangeCount )
  93. {
  94. if( MustResetFocusChangeCount == true )
  95. {
  96. FocusChangeCount = 0;
  97. }
  98. //RETURN UNSUCCESSFULLY
  99. return FocusedWindow;
  100. }
  101. }
  102. //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
  103. if( FocusedWindow != NULL )
  104. {
  105. FocusedWindow->FireGotFocus( OldFocusedWindow );
  106. if( MyFocusID != FocusChangeCount )
  107. {
  108. if( MustResetFocusChangeCount == true )
  109. {
  110. FocusChangeCount = 0;
  111. }
  112. //RETURN UNSUCCESSFULLY
  113. return FocusedWindow;
  114. }
  115. }
  116. //JUMP THE WINDOW AND ALL IT'S ANCESTORS TO THE TOP OF THE Z ORDER FOR VISUAL FOCUS
  117. FocusedWindow = Window;
  118. TempWindow = FocusedWindow;
  119. while( TempWindow != NULL )
  120. {
  121. TempWindow->JumpToFront();
  122. TempWindow = TempWindow->GetParent();
  123. }
  124. //RESET THE FOCUSCHANGECOUNT IF NECESSARY
  125. if( MustResetFocusChangeCount == true )
  126. {
  127. FocusChangeCount = 0;
  128. }
  129. //RETURN SUCCESSFULLY
  130. return FocusedWindow;
  131. }
  132. IWindow *CWindowManager::GetFocusedWindow()
  133. {
  134. return FocusedWindow;
  135. }
  136. IWindow *CWindowManager::GetWindowFromXY( float X, float Y )
  137. {
  138. std::list< IWindow * >::const_reverse_iterator I;
  139. IWindow *Window = NULL;
  140. for( I = Root.GetChildren().rbegin(); I != Root.GetChildren().rend(); I++ )
  141. {
  142. if( (*I)->GetVisible() == true )
  143. {
  144. Window = GetChildFromXY( *I, X, Y );
  145. if( Window != NULL )
  146. {
  147. return Window;
  148. }
  149. }
  150. }
  151. return NULL;
  152. }
  153. void CWindowManager::OnRender( double TimeSlice )
  154. {
  155. std::list< IWindow * >::const_iterator I;
  156. for( I = Root.GetChildren().begin(); I != Root.GetChildren().end(); I++ )
  157. {
  158. if( (*I)->GetVisible() == true )
  159. {
  160. RenderWindow( *I, TimeSlice );
  161. }
  162. }
  163. return;
  164. }
  165. void CWindowManager::OnClick( float X, float Y, unsigned long Button )
  166. {
  167. IWindow *TempWindow;
  168. TempWindow = GetWindowFromXY( X, Y );
  169. if( TempWindow != NULL )
  170. {
  171. TempWindow->FireClick( X - TempWindow->GetAbsoluteLeft() , Y - TempWindow->GetAbsoluteTop() , Button );
  172. }
  173. return;
  174. }
  175. void CWindowManager::OnDoubleClick( float X, float Y, unsigned long Button )
  176. {
  177. IWindow *TempWindow;
  178. TempWindow = GetWindowFromXY( X, Y );
  179. if( TempWindow != NULL )
  180. {
  181. TempWindow->FireDoubleClick( X - TempWindow->GetAbsoluteLeft() , Y - TempWindow->GetAbsoluteTop() , Button );
  182. }
  183. return;
  184. }
  185. void CWindowManager::OnMouseDown( float X, float Y, unsigned long Button )
  186. {
  187. IWindow *TempWindow;
  188. TempWindow = GetWindowFromXY( X, Y );
  189. CapturedWindow = TempWindow;
  190. SetFocusedWindow( TempWindow );
  191. if( TempWindow != NULL )
  192. {
  193. TempWindow->FireMouseDown( X - TempWindow->GetAbsoluteLeft() , Y - TempWindow->GetAbsoluteTop() , Button );
  194. }
  195. return;
  196. }
  197. void CWindowManager::OnMouseWheel( float X, float Y, unsigned long Button )
  198. {
  199. IWindow *TempWindow;
  200. TempWindow = GetWindowFromXY( X, Y );
  201. if( TempWindow != NULL )
  202. {
  203. TempWindow->FireMouseWheel( X - TempWindow->GetAbsoluteLeft() , Y - TempWindow->GetAbsoluteTop() , Button );
  204. }
  205. return;
  206. }
  207. void CWindowManager::OnMouseUp( float X, float Y, unsigned long Button )
  208. {
  209. IWindow *TempWindow;
  210. if( CapturedWindow == NULL )
  211. {
  212. TempWindow = GetWindowFromXY( X, Y );
  213. } else {
  214. TempWindow = CapturedWindow;
  215. }
  216. if( TempWindow != NULL )
  217. {
  218. TempWindow->FireMouseUp( X - TempWindow->GetAbsoluteLeft() , Y - TempWindow->GetAbsoluteTop() , Button );
  219. if( CapturedWindow == GetWindowFromXY( X, Y ) )
  220. {
  221. TempWindow->FireClick( X - TempWindow->GetAbsoluteLeft() , Y - TempWindow->GetAbsoluteTop() , Button );
  222. }
  223. }
  224. CapturedWindow = NULL;
  225. if( LastMouseMove != TempWindow )
  226. {
  227. if( LastMouseMove != NULL )
  228. {
  229. LastMouseMove->FireMouseExit( X, Y, Button );
  230. }
  231. if( TempWindow != NULL )
  232. {
  233. TempWindow->FireMouseEnter( X, Y, Button );
  234. }
  235. }
  236. LastMouseMove = TempWindow;
  237. return;
  238. }
  239. void CWindowManager::OnMouseMove( float X, float Y, unsigned long Button )
  240. {
  241. IWindow *TempWindow;
  242. if( CapturedWindow == NULL )
  243. {
  244. TempWindow = GetWindowFromXY( X, Y );
  245. if( LastMouseMove != TempWindow )
  246. {
  247. if( LastMouseMove != NULL )
  248. {
  249. LastMouseMove->FireMouseExit( X, Y, Button );
  250. }
  251. if( TempWindow != NULL )
  252. {
  253. TempWindow->FireMouseEnter( X, Y, Button );
  254. }
  255. }
  256. LastMouseMove = TempWindow;
  257. } else {
  258. TempWindow = CapturedWindow;
  259. }
  260. if( TempWindow != NULL )
  261. {
  262. TempWindow->FireMouseMove( X - TempWindow->GetAbsoluteLeft() , Y - TempWindow->GetAbsoluteTop() , Button );
  263. }
  264. return;
  265. }
  266. void CWindowManager::OnMouseEnter( float X, float Y, unsigned long Button )
  267. {
  268. return;
  269. }
  270. void CWindowManager::OnMouseExit( float X, float Y, unsigned long Button )
  271. {
  272. return;
  273. }
  274. void CWindowManager::OnKeyPress( unsigned long KeyCode )
  275. {
  276. std::list< IWindow * >::const_iterator I;
  277. std::list< IWindow * >::const_iterator NextI;
  278. if( FocusedWindow == NULL )
  279. {
  280. return;
  281. }
  282. //DEAL WITH FOCUS SWITCHING
  283. if( KeyCode == 9 )
  284. {
  285. if( FocusedWindow->GetParent() != NULL )
  286. {
  287. for( I = FocusedWindow->GetParent()->GetChildren().begin(); I != FocusedWindow->GetParent()->GetChildren().end(); I++ )
  288. {
  289. if( FocusedWindow == *I )
  290. {
  291. NextI = I++;
  292. if( NextI != FocusedWindow->GetParent()->GetChildren().end() )
  293. {
  294. FocusedWindow = *NextI;
  295. } else {
  296. FocusedWindow = *(FocusedWindow->GetParent()->GetChildren().begin() );
  297. }
  298. break;
  299. }
  300. }
  301. }
  302. }
  303. FocusedWindow->FireKeyPress( KeyCode );
  304. return;
  305. }
  306. void CWindowManager::OnKeyDown( unsigned long KeyCode )
  307. {
  308. if( FocusedWindow == NULL )
  309. {
  310. return;
  311. }
  312. FocusedWindow->FireKeyDown( KeyCode );
  313. return;
  314. }
  315. void CWindowManager::OnKeyUp( unsigned long KeyCode )
  316. {
  317. if( FocusedWindow == NULL )
  318. {
  319. return;
  320. }
  321. FocusedWindow->FireKeyUp( KeyCode );
  322. return;
  323. }
  324. void CWindowManager::RenderWindow( IWindow * Window, double TimeSlice )
  325. {
  326. std::list< IWindow * >::const_iterator I;
  327. Window->FireRender( TimeSlice );
  328. for( I = Window->GetChildren().begin(); I != Window->GetChildren().end(); I++ )
  329. {
  330. if( (*I)->GetVisible() == true )
  331. {
  332. RenderWindow( *I, TimeSlice );
  333. }
  334. }
  335. return;
  336. }
  337. IWindow *CWindowManager::GetChildFromXY( IWindow * Window, float X, float Y )
  338. {
  339. IWindow *TempWindow = NULL;
  340. std::list< IWindow * >::const_reverse_iterator I;
  341. for( I = Window->GetChildren().rbegin(); I != Window->GetChildren().rend(); I++ )
  342. {
  343. if( (*I)->GetVisible() == true )
  344. {
  345. TempWindow = GetChildFromXY( *I, X, Y );
  346. if( TempWindow != NULL )
  347. {
  348. return TempWindow;
  349. }
  350. }
  351. }
  352. if( X >= Window->GetAbsoluteLeft() && X <= ( Window->GetAbsoluteLeft() + Window->GetWidth() ) && Y >= Window->GetAbsoluteTop() && Y <= ( Window->GetAbsoluteTop() + Window->GetHeight() ) )
  353. {
  354. return Window;
  355. }
  356. return NULL;
  357. }