package net.cis.client.game.ui.debug;
import java.text.SimpleDateFormat;
import java.util.List;
import net.cis.client.game.ui.debug.ctrl.TextFieldInputMappingAdv;
import net.cis.common.script.ReflectionScript;
import com.jme3.app.SimpleApplication;
import com.jme3.niftygui.NiftyJmeDisplay;
import de.lessvoid.nifty.Nifty;
import de.lessvoid.nifty.NiftyEventSubscriber;
import de.lessvoid.nifty.builder.ControlBuilder;
import de.lessvoid.nifty.builder.ControlDefinitionBuilder;
import de.lessvoid.nifty.builder.PanelBuilder;
import de.lessvoid.nifty.builder.TextBuilder;
import de.lessvoid.nifty.controls.ListBox;
import de.lessvoid.nifty.controls.NiftyInputControl;
import de.lessvoid.nifty.controls.TextField;
import de.lessvoid.nifty.controls.listbox.builder.ListBoxBuilder;
import de.lessvoid.nifty.elements.Element;
import de.lessvoid.nifty.input.NiftyInputEvent;
import de.lessvoid.nifty.screen.KeyInputHandler;
import de.lessvoid.nifty.screen.Screen;
import de.lessvoid.nifty.screen.ScreenController;
import de.lessvoid.nifty.tools.Color;
public class DebugGUI implements ScreenController
{
private SimpleApplication simpleApplication;
private Nifty nifty;
private boolean isInPause = false;
private TextField textfield;
private ListBox<DebugEntry> debugEntries;
private ListBox<String> codeSuggestions;
private ReflectionScript script;
private static final Color RED = new Color(1, 0, 0, 1);
private static final Color YELLOW = new Color(1, 1, 0, 1);
private static final Color GREEN = new Color(0, 1, 0, 1);
private static final SimpleDateFormat timeFormat = new SimpleDateFormat("HH:mm:ss");
public DebugGUI(SimpleApplication sa)
{
simpleApplication = sa;
script = new ReflectionScript(sa);
initDisplay();
initInputTextField();
initDebugTextListbox();
initCodeSuggesitonListbox();
}
protected void initDisplay()
{
NiftyJmeDisplay niftyDisplay = new NiftyJmeDisplay(simpleApplication.getAssetManager(), simpleApplication.getInputManager(), simpleApplication.getAudioRenderer(), simpleApplication.getGuiViewPort());
nifty = niftyDisplay.getNifty();
nifty.fromXml("hud/debug/debugGUI.xml", "debugGUI", this);
simpleApplication.getGuiViewPort().addProcessor(niftyDisplay);
}
protected void initInputTextField()
{
textfield = nifty.getScreen("debugGUI").findNiftyControl("txtInput", TextField.class);
Element elem = textfield.getElement();
elem.attachInputControl(new NiftyInputControl(elem.getAttachedInputControl().getController(), new TextFieldInputMappingAdv()));
elem.getAttachedInputControl().addInputHandler(new KeyInputHandler() {
@Override
public boolean keyEvent(NiftyInputEvent inputEvent) {
return onTextChanged(inputEvent);
}
});
}
@SuppressWarnings("unchecked")
protected void initDebugTextListbox()
{
//((ListBox<DebugEntry>)nifty.getScreen("debugGUI").findNiftyControl("listbox", ListBox.class)).setListBoxViewConverter(new DebugEntryViewConverter());
ControlDefinitionBuilder rowControlBuilder = new ControlDefinitionBuilder("row") {
{
panel(new PanelBuilder() {
{
childLayoutHorizontal();
width("100%");
alignLeft();
text(new TextBuilder("#lbTextElem") {
{
width("100%");
style("base-font");
alignLeft();
textHAlignLeft();
}
});
}
});
}
};
rowControlBuilder.registerControlDefintion(nifty);
new ListBoxBuilder("debugEntries") {{ viewConverterClass(DebugEntryViewConverter.class); displayItems(12); selectionModeDisabled(); hideHorizontalScrollbar(); width("100%"); height("100%"); childLayoutVertical(); optionalVerticalScrollbar(); alignLeft(); valignBottom(); control(new ControlBuilder("row")); }}
.build(nifty, nifty.getScreen("debugGUI"), nifty.getScreen("debugGUI").findElementByName("chatpanel"));
debugEntries = nifty.getScreen("debugGUI").findNiftyControl("debugEntries", ListBox.class);
}
@SuppressWarnings("unchecked")
protected void initCodeSuggesitonListbox()
{
codeSuggestions = (ListBox<String>)nifty.getScreen("debugGUI").findNiftyControl("scriptHelp", ListBox.class);
codeSuggestions.getElement().hide();
}
public void togglePauseMode()
{
isInPause = !isInPause;
simpleApplication.getInputManager().setCursorVisible(isInPause);
nifty.getScreen("debugGUI").findElementByName("mainMenu").setVisible(isInPause);
if(!isInPause)
{
nifty.getScreen("debugGUI").findElementByName("chatlayer").disable();
codeSuggestions.getElement().hide();
}
else
{
nifty.getScreen("debugGUI").findElementByName("chatlayer").enable();
}
}
public void onMainMenuClick(String command)
{
if(command.equalsIgnoreCase("exit"))
simpleApplication.stop();
if(command.equalsIgnoreCase("blah"))
{
addDebugOutput("Hello World!");
}
else
System.out.println("Unknown Command: " + command);
}
public void addDebugOutput(String s){addDebugOutput(s, DebugLogLevel.Info);}
public void addDebugOutput(String s, DebugLogLevel l)
{
Color c = (l == DebugLogLevel.Error ? RED : (l == DebugLogLevel.Warning ? YELLOW : GREEN));
debugEntries.addItem(new DebugEntry(timeFormat.format(System.currentTimeMillis()) + "> " +s, c));
debugEntries.showItemByIndex(debugEntries.itemCount() - 1);
}
@Override
public void bind(Nifty arg0, Screen arg1) {
}
@Override
public void onEndScreen() {
}
@Override
public void onStartScreen() {
}
//It's a PRE-Input event
@NiftyEventSubscriber(id="txtInput")
public void onTextChanged(final String id, final NiftyInputEvent event)
{
System.out.println(event.toString() + " [" + event.getCharacter() + "] --> " + textfield.getText());
System.out.println(nifty.getScreen("debugGUI").findElementByName("chatlayer").getStyle());
codeSuggestions.getElement().show();
}
//The PostInputEvent
protected boolean onTextChanged(NiftyInputEvent inputEvent)
{
String toEval = textfield.getText().trim();
script.setEvalString(toEval);
codeSuggestions.clear();
if(inputEvent == NiftyInputEvent.SubmitText)
{
String ret = script.eval();
addDebugOutput(ret, ret.startsWith("Err") ? DebugLogLevel.Error : (ret.startsWith("Warn") ? DebugLogLevel.Warning : DebugLogLevel.Info));
return false;
}
List<String> suggestions = script.getSuggestions();
if(suggestions != null)
codeSuggestions.addAllItems(suggestions);
return false;
}
}