From b71341acf5830b04a43871b623a6fd311ff724df Mon Sep 17 00:00:00 2001 From: "C. Alexander Leigh" Date: Tue, 14 Feb 2023 11:13:51 -0800 Subject: [PATCH] lc-isf-tc: Implemented the ability to travel between screens --- .../src/main/java/lc/isf/app/AppBinder.java | 9 +++- .../main/java/lc/isf/app/NavigateReturn.java | 34 +++++++++++++++ .../java/lc/isf/screen/JsonScreenPackage.java | 11 +++-- .../java/lc/isf/tc/InteractiveSession.java | 13 +++++- .../main/java/lc/isf/tc/ScreenController.java | 19 +++++++-- .../main/java/lc/isf/tc/ScreenPointer.java | 41 +++++++++++++++++++ .../screen/{logon.json => login.json} | 0 .../resources/screen/{logon.scn => login.scn} | 0 lc-isf-tc/src/main/resources/screen/main.json | 1 + lc-isf-tc/src/main/resources/screen/main.scn | 10 +++++ 10 files changed, 125 insertions(+), 13 deletions(-) create mode 100644 lc-isf-tc/src/main/java/lc/isf/app/NavigateReturn.java create mode 100644 lc-isf-tc/src/main/java/lc/isf/tc/ScreenPointer.java rename lc-isf-tc/src/main/resources/screen/{logon.json => login.json} (100%) rename lc-isf-tc/src/main/resources/screen/{logon.scn => login.scn} (100%) create mode 100644 lc-isf-tc/src/main/resources/screen/main.json create mode 100644 lc-isf-tc/src/main/resources/screen/main.scn diff --git a/lc-isf-tc/src/main/java/lc/isf/app/AppBinder.java b/lc-isf-tc/src/main/java/lc/isf/app/AppBinder.java index b0b28daff..a59f673e1 100644 --- a/lc-isf-tc/src/main/java/lc/isf/app/AppBinder.java +++ b/lc-isf-tc/src/main/java/lc/isf/app/AppBinder.java @@ -20,7 +20,14 @@ public class AppBinder { apps.put(APP_SYS, new ScreenApp() { @Override public CallReturn call(String func, Map values) { - return new MessageReturn("Test 1-2-3"); + String un = values.get("%unm"); + String pw = values.get("%upw"); + + if (un.equals("test") && pw.equals("Vancouver99")) { + return new NavigateReturn(AppBinder.APP_SYS, "main"); + } + + return new MessageReturn("Invalid login."); } @Override diff --git a/lc-isf-tc/src/main/java/lc/isf/app/NavigateReturn.java b/lc-isf-tc/src/main/java/lc/isf/app/NavigateReturn.java new file mode 100644 index 000000000..5f732168d --- /dev/null +++ b/lc-isf-tc/src/main/java/lc/isf/app/NavigateReturn.java @@ -0,0 +1,34 @@ +package lc.isf.app; + +import java.util.Objects; + +public class NavigateReturn implements CallReturn { + private final String appName; + private final String screenName; + + public NavigateReturn(String appName, String screenName) { + this.appName = appName; + this.screenName = screenName; + } + + public String getAppName() { + return appName; + } + + public String getScreenName() { + return screenName; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + NavigateReturn that = (NavigateReturn) o; + return Objects.equals(appName, that.appName) && Objects.equals(screenName, that.screenName); + } + + @Override + public int hashCode() { + return Objects.hash(appName, screenName); + } +} diff --git a/lc-isf-tc/src/main/java/lc/isf/screen/JsonScreenPackage.java b/lc-isf-tc/src/main/java/lc/isf/screen/JsonScreenPackage.java index 7a2ba9ec1..570adbb3c 100644 --- a/lc-isf-tc/src/main/java/lc/isf/screen/JsonScreenPackage.java +++ b/lc-isf-tc/src/main/java/lc/isf/screen/JsonScreenPackage.java @@ -1,7 +1,6 @@ package lc.isf.screen; import com.googlecode.lanterna.gui2.Button; -import lc.isf.app.CallReturn; import lc.isf.tc.ScreenController; import lc.isf.widget.ButtonWidget; import lc.isf.widget.FieldWidget; @@ -27,9 +26,11 @@ public class JsonScreenPackage implements ScreenPackage { public JsonScreenPackage(String fileBase, ScreenController ctl) throws IOException { this.fileBase = fileBase; + logger.info("JSON init. [fileBase: {}]", fileBase); try (InputStream is = getClass().getResourceAsStream(fileBase + ".json")) { JSONObject obj = new JSONObject(is); - JSONObject widgets = obj.getJSONObject("widgets"); + JSONObject widgets = obj.optJSONObject("widgets"); + if (widgets == null) return; for (String key : widgets.keySet()) { JSONObject def = widgets.getJSONObject(key); String type = def.getString(KEY_TYPE); @@ -55,14 +56,12 @@ public class JsonScreenPackage implements ScreenPackage { String label = def.getString("label"); cols = def.optInt(KEY_COLS, 5); rows = def.optInt(KEY_ROWS, 1); - String call = def.getString("call"); + String funcName = def.getString("call"); ButtonWidget buttonWidget = new ButtonWidget(label, cols, rows); buttonWidget.getComponent().addListener(new Button.Listener() { @Override public void onTriggered(Button button) { - logger.info("Call: [func: {}]", call); - CallReturn ret = ctl.call(call); - ctl.process(ret); + ctl.call(funcName); } }); this.widgets.put(key, buttonWidget); diff --git a/lc-isf-tc/src/main/java/lc/isf/tc/InteractiveSession.java b/lc-isf-tc/src/main/java/lc/isf/tc/InteractiveSession.java index 8a0bad79b..7ffc81f08 100644 --- a/lc-isf-tc/src/main/java/lc/isf/tc/InteractiveSession.java +++ b/lc-isf-tc/src/main/java/lc/isf/tc/InteractiveSession.java @@ -18,12 +18,15 @@ import java.io.IOException; public class InteractiveSession implements Runnable { private static final MechaLogger logger = MechaLoggerFactory.getLogger(InteractiveSession.class); private final Terminal terminal; - private final AppBinder binder; + private ScreenPointer pointer; + public InteractiveSession(Terminal terminal, AppBinder binder) { this.terminal = terminal; this.binder = binder; + + pointer = new ScreenPointer(AppBinder.APP_SYS, "login"); } @Override @@ -31,7 +34,9 @@ public class InteractiveSession implements Runnable { try { //noinspection InfiniteLoopStatement while (true) { - ScreenController sc = new ScreenController(binder.getApplication(AppBinder.APP_SYS)); + ScreenController sc = new ScreenController(binder.getApplication(pointer.getAppName()), + pointer.getScreenName(), + this); sc.handle(terminal); logger.info("Screen finished. Restarting."); } @@ -39,4 +44,8 @@ public class InteractiveSession implements Runnable { throw new RuntimeException(e); } } + + public void setPointer(ScreenPointer pointer) { + this.pointer = pointer; + } } diff --git a/lc-isf-tc/src/main/java/lc/isf/tc/ScreenController.java b/lc-isf-tc/src/main/java/lc/isf/tc/ScreenController.java index 5066f09a5..89164e13f 100644 --- a/lc-isf-tc/src/main/java/lc/isf/tc/ScreenController.java +++ b/lc-isf-tc/src/main/java/lc/isf/tc/ScreenController.java @@ -8,6 +8,7 @@ import com.googlecode.lanterna.screen.TerminalScreen; import com.googlecode.lanterna.terminal.Terminal; import lc.isf.app.CallReturn; import lc.isf.app.MessageReturn; +import lc.isf.app.NavigateReturn; import lc.isf.app.ScreenApp; import lc.isf.screen.ScreenPackage; import lc.isf.widget.Widget; @@ -40,10 +41,12 @@ public class ScreenController { private Window window; private MultiWindowTextGUI textGUI; private ArrayList references; + private InteractiveSession session; - public ScreenController(ScreenApp app) throws IOException { + public ScreenController(ScreenApp app, String screenName, InteractiveSession session) throws IOException { this.app = app; - pkg = app.getScreenFactory().makeScreenPkg("logon", this); + pkg = app.getScreenFactory().makeScreenPkg(screenName, this); + this.session = session; } public Map gatherValues() { @@ -163,12 +166,20 @@ public class ScreenController { logger.info("Processing call return: {}", rv); if (rv instanceof MessageReturn) { popupMessage(((MessageReturn) rv).getMessage()); + } else if (rv instanceof NavigateReturn) { + ScreenPointer ptr = new ScreenPointer((NavigateReturn) rv); + session.setPointer(ptr); + window.close(); } else { popupMessage("ERROR: Unknown call return class."); } } - public CallReturn call(String func) { - return app.call(func, gatherValues()); + /** + * Called by the screen widgets when a function is invoked. This is responsible for routing the call to the + * application. + */ + public void call(String func) { + process(app.call(func, gatherValues())); } } diff --git a/lc-isf-tc/src/main/java/lc/isf/tc/ScreenPointer.java b/lc-isf-tc/src/main/java/lc/isf/tc/ScreenPointer.java new file mode 100644 index 000000000..c79a32dfa --- /dev/null +++ b/lc-isf-tc/src/main/java/lc/isf/tc/ScreenPointer.java @@ -0,0 +1,41 @@ +package lc.isf.tc; + +import lc.isf.app.NavigateReturn; + +import java.util.Objects; + +public class ScreenPointer { + private final String appName; + private final String screenName; + + public ScreenPointer(String appName, String screenName) { + this.appName = appName; + this.screenName = screenName; + } + + public ScreenPointer(NavigateReturn nav) { + this.appName = nav.getAppName(); + this.screenName = nav.getScreenName(); + } + + public String getAppName() { + return appName; + } + + public String getScreenName() { + return screenName; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + ScreenPointer that = (ScreenPointer) o; + return Objects.equals(appName, that.appName) && Objects.equals(screenName, that.screenName); + } + + @Override + public int hashCode() { + return Objects.hash(appName, screenName); + } +} diff --git a/lc-isf-tc/src/main/resources/screen/logon.json b/lc-isf-tc/src/main/resources/screen/login.json similarity index 100% rename from lc-isf-tc/src/main/resources/screen/logon.json rename to lc-isf-tc/src/main/resources/screen/login.json diff --git a/lc-isf-tc/src/main/resources/screen/logon.scn b/lc-isf-tc/src/main/resources/screen/login.scn similarity index 100% rename from lc-isf-tc/src/main/resources/screen/logon.scn rename to lc-isf-tc/src/main/resources/screen/login.scn diff --git a/lc-isf-tc/src/main/resources/screen/main.json b/lc-isf-tc/src/main/resources/screen/main.json new file mode 100644 index 000000000..9e26dfeeb --- /dev/null +++ b/lc-isf-tc/src/main/resources/screen/main.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/lc-isf-tc/src/main/resources/screen/main.scn b/lc-isf-tc/src/main/resources/screen/main.scn new file mode 100644 index 000000000..87018044c --- /dev/null +++ b/lc-isf-tc/src/main/resources/screen/main.scn @@ -0,0 +1,10 @@ + + + + + + + + + + Hello World! \ No newline at end of file -- GitLab