X-Git-Url: http://www2.svjatoslav.eu/gitweb/?a=blobdiff_plain;f=src%2Fmain%2Fjava%2Feu%2Fsvjatoslav%2Fsixth%2Fe3d%2Fgui%2Fhumaninput%2FKeyboardFocusStack.java;fp=src%2Fmain%2Fjava%2Feu%2Fsvjatoslav%2Fsixth%2Fe3d%2Fgui%2Fhumaninput%2FKeyboardFocusStack.java;h=4ee7ed8e096aa30d90d57e938e00fe2b9c5f69dd;hb=70ee733b25c56bed539b89ff5507ae0af842d68a;hp=0000000000000000000000000000000000000000;hpb=afdebf8f4f532ed5b456040c6c481f3cfbf8d236;p=sixth-3d.git diff --git a/src/main/java/eu/svjatoslav/sixth/e3d/gui/humaninput/KeyboardFocusStack.java b/src/main/java/eu/svjatoslav/sixth/e3d/gui/humaninput/KeyboardFocusStack.java new file mode 100644 index 0000000..4ee7ed8 --- /dev/null +++ b/src/main/java/eu/svjatoslav/sixth/e3d/gui/humaninput/KeyboardFocusStack.java @@ -0,0 +1,55 @@ +/* + * Sixth 3D engine. Copyright ©2012-2018, Svjatoslav Agejenko, svjatoslav@svjatoslav.eu + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of version 3 of the GNU Lesser General Public License + * or later as published by the Free Software Foundation. + * + */ + +package eu.svjatoslav.sixth.e3d.gui.humaninput; + +import eu.svjatoslav.sixth.e3d.gui.ViewPanel; + +import java.util.Stack; + +public class KeyboardFocusStack { + + private final ViewPanel viewPanel; + private WorldNavigationUserInputTracker defaultInputHandler = new WorldNavigationUserInputTracker(); + private Stack inputHandlers = new Stack<>(); + private UserInputHandler currentUserInputHandler; + + public KeyboardFocusStack(final ViewPanel viewPanel) { + this.viewPanel = viewPanel; + pushFocusOwner(defaultInputHandler); + } + + public UserInputHandler getCurrentFocusOwner() { + return currentUserInputHandler; + } + + public void popFocusOwner() { + if (currentUserInputHandler != null) + currentUserInputHandler.focusLost(viewPanel); + + if (inputHandlers.isEmpty()) + return; + + currentUserInputHandler = inputHandlers.pop(); + currentUserInputHandler.focusReceived(viewPanel); + } + + public void pushFocusOwner(final UserInputHandler newInputHandler) { + if (currentUserInputHandler == newInputHandler) + return; + + if (currentUserInputHandler != null) { + currentUserInputHandler.focusLost(viewPanel); + inputHandlers.push(currentUserInputHandler); + } + + currentUserInputHandler = newInputHandler; + currentUserInputHandler.focusReceived(viewPanel); + } +}