Changed license to Creative Commons Zero (CC0).
[sixth-3d.git] / src / main / java / eu / svjatoslav / sixth / e3d / gui / humaninput / KeyboardFocusStack.java
1 /*
2  * Sixth 3D engine. Author: Svjatoslav Agejenko. 
3  * This project is released under Creative Commons Zero (CC0) license.
4  *
5 *
6  */
7
8 package eu.svjatoslav.sixth.e3d.gui.humaninput;
9
10 import eu.svjatoslav.sixth.e3d.gui.ViewPanel;
11
12 import java.util.Stack;
13
14 public class KeyboardFocusStack {
15
16     private final ViewPanel viewPanel;
17     private WorldNavigationUserInputTracker defaultInputHandler = new WorldNavigationUserInputTracker();
18     private Stack<UserInputHandler> inputHandlers = new Stack<>();
19     private UserInputHandler currentUserInputHandler;
20
21     public KeyboardFocusStack(final ViewPanel viewPanel) {
22         this.viewPanel = viewPanel;
23         pushFocusOwner(defaultInputHandler);
24     }
25
26     public UserInputHandler getCurrentFocusOwner() {
27         return currentUserInputHandler;
28     }
29
30     public void popFocusOwner() {
31         if (currentUserInputHandler != null)
32             currentUserInputHandler.focusLost(viewPanel);
33
34         if (inputHandlers.isEmpty())
35             return;
36
37         currentUserInputHandler = inputHandlers.pop();
38         currentUserInputHandler.focusReceived(viewPanel);
39     }
40
41     public boolean pushFocusOwner(final UserInputHandler newInputHandler) {
42         boolean updateNeeded = false;
43
44         if (currentUserInputHandler == newInputHandler)
45             return false;
46
47         if (currentUserInputHandler != null) {
48             updateNeeded = currentUserInputHandler.focusLost(viewPanel);
49             inputHandlers.push(currentUserInputHandler);
50         }
51
52         currentUserInputHandler = newInputHandler;
53         updateNeeded |= currentUserInputHandler.focusReceived(viewPanel);
54
55         return updateNeeded;
56     }
57 }