package de.lessvoid.nifty.controls;
import de.lessvoid.nifty.Nifty;
import de.lessvoid.nifty.elements.Element;
import de.lessvoid.nifty.input.NiftyInputEvent;
import de.lessvoid.nifty.input.NiftyInputMapping;
import de.lessvoid.nifty.input.keyboard.KeyboardInputEvent;
import de.lessvoid.nifty.screen.KeyInputHandler;
import de.lessvoid.nifty.screen.Screen;
import de.lessvoid.xml.xpp3.Attributes;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import java.util.ArrayList;
import java.util.List;
/**
* NiftyInputControl.
*
* @author void
*/
public class NiftyInputControl {
@Nonnull
private final Controller controller;
@Nonnull
private final NiftyInputMapping inputMapper;
@Nonnull
private final List<KeyInputHandler> preInputHandler = new ArrayList<KeyInputHandler>();
@Nonnull
private final List<KeyInputHandler> postInputHandler = new ArrayList<KeyInputHandler>();
/**
* @param controllerParam controller
* @param inputMapperParam input mapper
*/
public NiftyInputControl(
@Nonnull final Controller controllerParam,
@Nonnull final NiftyInputMapping inputMapperParam) {
this.controller = controllerParam;
this.inputMapper = inputMapperParam;
}
/**
* keyboard event.
*
* @param nifty nifty
* @param inputEvent keyboard event
* @return return true when the input event has been processed and false when it has not been handled
*/
public boolean keyEvent(
@Nonnull final Nifty nifty,
@Nonnull final KeyboardInputEvent inputEvent,
@Nonnull final String elementId) {
NiftyInputEvent converted = inputMapper.convert(inputEvent);
if (converted == null) {
return false;
}
for (KeyInputHandler handler : preInputHandler) {
if (handler.keyEvent(converted)) {
return true;
}
}
nifty.publishEvent(elementId, converted);
if (controller.inputEvent(converted)) {
return true;
}
for (KeyInputHandler handler : postInputHandler) {
if (handler.keyEvent(converted)) {
return true;
}
}
return false;
}
public void addInputHandler(@Nonnull final KeyInputHandler handler) {
postInputHandler.add(handler);
}
public void addPreInputHandler(@Nonnull final KeyInputHandler handler) {
preInputHandler.add(handler);
}
public void onStartScreen(@Nonnull final Nifty nifty, @Nonnull final Screen screen) {
controller.onStartScreen();
}
public void onEndScreen(@Nonnull final Nifty nifty, @Nonnull final Screen screen, @Nullable final String elementId) {
controller.onEndScreen();
nifty.unsubscribeAnnotations(controller);
if (elementId != null) {
nifty.unsubscribeElement(screen, elementId);
}
}
/**
* forward the onForward method to the controller.
*
* @param getFocus get focus
*/
public void onFocus(final boolean getFocus) {
controller.onFocus(getFocus);
}
/**
* get controller.
*
* @return controller
*/
@Nonnull
public Controller getController() {
return controller;
}
/**
* Get control when it matches the given class.
*
* @param <T> type of class
* @param requestedControlClass class that is requested
* @return the instance or null
*/
@Nullable
public <T extends Controller> T getControl(@Nonnull final Class<T> requestedControlClass) {
if (requestedControlClass.isInstance(controller)) {
return requestedControlClass.cast(controller);
}
return null;
}
@Nullable
public <T extends NiftyControl> T getNiftyControl(@Nonnull final Class<T> requestedControlClass) {
if (requestedControlClass.isInstance(controller)) {
return requestedControlClass.cast(controller);
}
return null;
}
public void bindControl(
@Nonnull final Nifty nifty,
@Nonnull final Screen screen,
@Nonnull final Element element,
@Nonnull final Attributes attributes) {
controller.bind(
nifty,
screen,
element,
new Parameters(attributes.createProperties()));
}
public void initControl(@Nonnull final Attributes attributes) {
controller.init(new Parameters(attributes.createProperties()));
}
}