From 23e28ba7a92fed280bb6cda027e12cc2c071fd83 Mon Sep 17 00:00:00 2001 From: sirjonasxx <36828922+sirjonasxx@users.noreply.github.com> Date: Mon, 27 Apr 2020 05:11:13 +0200 Subject: [PATCH] implement Extension Console --- .../blockreplacepackets/blockreplace.fxml | 2 +- .../java/gearth/extensions/Extension.java | 11 +- .../java/gearth/extensions/ExtensionForm.java | 5 +- .../extensions/ExtensionFormLauncher.java | 2 +- .../java/gearth/extensions/IExtension.java | 3 +- .../extensionhandler/ExtensionHandler.java | 6 - .../ui/extensions/ExtensionsController.java | 27 +++++ .../gearth/ui/extensions/logger/Element.java | 11 ++ .../ui/extensions/logger/ExtensionLogger.java | 93 +++++++++++++++ .../logger/ExtensionLoggerController.java | 111 ++++++++++++++++++ .../uilogger/UiLoggerController.java | 2 - .../src/main/resources/gearth/ui/G-Earth.fxml | 2 +- .../gearth/ui/connection/Connection.fxml | 2 +- .../gearth/ui/extensions/Extensions.fxml | 107 ++++++----------- .../ui/extensions/logger/ExtensionLogger.fxml | 10 ++ .../gearth/ui/extensions/logger/logger.css | 49 ++++++++ .../main/resources/gearth/ui/extra/Extra.fxml | 2 +- .../main/resources/gearth/ui/info/Info.fxml | 2 +- .../gearth/ui/injection/Injection.fxml | 2 +- .../resources/gearth/ui/logger/Logger.fxml | 2 +- .../gearth/ui/logger/uilogger/UiLogger.fxml | 2 +- .../gearth/ui/scheduler/Scheduler.fxml | 2 +- .../main/resources/gearth/ui/tools/Tools.fxml | 2 +- 23 files changed, 364 insertions(+), 93 deletions(-) create mode 100644 G-Earth/src/main/java/gearth/ui/extensions/logger/Element.java create mode 100644 G-Earth/src/main/java/gearth/ui/extensions/logger/ExtensionLogger.java create mode 100644 G-Earth/src/main/java/gearth/ui/extensions/logger/ExtensionLoggerController.java create mode 100644 G-Earth/src/main/resources/gearth/ui/extensions/logger/ExtensionLogger.fxml create mode 100644 G-Earth/src/main/resources/gearth/ui/extensions/logger/logger.css diff --git a/Extensions/BlockReplacePackets/src/main/java/extensions/blockreplacepackets/blockreplace.fxml b/Extensions/BlockReplacePackets/src/main/java/extensions/blockreplacepackets/blockreplace.fxml index fb7940c..5df9e8a 100644 --- a/Extensions/BlockReplacePackets/src/main/java/extensions/blockreplacepackets/blockreplace.fxml +++ b/Extensions/BlockReplacePackets/src/main/java/extensions/blockreplacepackets/blockreplace.fxml @@ -11,7 +11,7 @@ - + diff --git a/G-Earth/src/main/java/gearth/extensions/Extension.java b/G-Earth/src/main/java/gearth/extensions/Extension.java index b8ea668..3f9be54 100644 --- a/G-Earth/src/main/java/gearth/extensions/Extension.java +++ b/G-Earth/src/main/java/gearth/extensions/Extension.java @@ -15,7 +15,7 @@ import java.util.Map; /** * Created by Jonas on 23/06/18. */ -public abstract class Extension implements IExtension{ +public abstract class Extension implements IExtension { public interface MessageListener { void act(HMessage message); @@ -160,6 +160,7 @@ public abstract class Extension implements IExtension{ } else if (packet.headerId() == NetworkExtensionInfo.OUTGOING_MESSAGES_IDS.INIT) { initExtension(); + writeToConsole("green","Extension \"" + getInfoAnnotations().Title() + "\" succesfully initialized"); } else if (packet.headerId() == NetworkExtensionInfo.OUTGOING_MESSAGES_IDS.ONDOUBLECLICK) { onClick(); @@ -314,6 +315,14 @@ public abstract class Extension implements IExtension{ } } + /** + * Write to the console in G-Earth + * @param s the text to be written + */ + public void writeToConsole(String colorClass, String s) { + writeToConsole("[" + colorClass + "]" + s); + } + private boolean isOnClickMethodUsed() { diff --git a/G-Earth/src/main/java/gearth/extensions/ExtensionForm.java b/G-Earth/src/main/java/gearth/extensions/ExtensionForm.java index 6f246a1..983ba74 100644 --- a/G-Earth/src/main/java/gearth/extensions/ExtensionForm.java +++ b/G-Earth/src/main/java/gearth/extensions/ExtensionForm.java @@ -8,7 +8,7 @@ import gearth.protocol.HPacket; /** * Created by Jonas on 22/09/18. */ -public abstract class ExtensionForm implements IExtension{ +public abstract class ExtensionForm implements IExtension { volatile Extension extension; volatile Stage primaryStage; @@ -28,6 +28,9 @@ public abstract class ExtensionForm implements IExtension{ public void writeToConsole(String s) { extension.writeToConsole(s); } + public void writeToConsole(String colorClass, String s) { + extension.writeToConsole(colorClass, s); + } public void intercept(HMessage.Direction direction, Extension.MessageListener messageListener) { extension.intercept(direction, messageListener); } diff --git a/G-Earth/src/main/java/gearth/extensions/ExtensionFormLauncher.java b/G-Earth/src/main/java/gearth/extensions/ExtensionFormLauncher.java index 570de6a..0eec47b 100644 --- a/G-Earth/src/main/java/gearth/extensions/ExtensionFormLauncher.java +++ b/G-Earth/src/main/java/gearth/extensions/ExtensionFormLauncher.java @@ -7,7 +7,7 @@ import javafx.stage.Stage; /** * Created by Jeunez on 6/11/2018. */ -public class ExtensionFormLauncher extends Application{ +public class ExtensionFormLauncher extends Application { private static Class extension; private static String[] args; diff --git a/G-Earth/src/main/java/gearth/extensions/IExtension.java b/G-Earth/src/main/java/gearth/extensions/IExtension.java index 74a46eb..f317e9e 100644 --- a/G-Earth/src/main/java/gearth/extensions/IExtension.java +++ b/G-Earth/src/main/java/gearth/extensions/IExtension.java @@ -13,7 +13,8 @@ public interface IExtension { void intercept(HMessage.Direction direction, int headerId, Extension.MessageListener messageListener); void intercept(HMessage.Direction direction, Extension.MessageListener messageListener); boolean requestFlags(Extension.FlagsCheckListener flagRequestCallback); - void writeToConsole(String s); // not implemented in g-earth yet + void writeToConsole(String colorClass, String s); + void writeToConsole(String s); void onConnect(OnConnectionListener listener); } diff --git a/G-Earth/src/main/java/gearth/services/extensionhandler/ExtensionHandler.java b/G-Earth/src/main/java/gearth/services/extensionhandler/ExtensionHandler.java index 1621ecb..3ec62c6 100644 --- a/G-Earth/src/main/java/gearth/services/extensionhandler/ExtensionHandler.java +++ b/G-Earth/src/main/java/gearth/services/extensionhandler/ExtensionHandler.java @@ -167,12 +167,6 @@ public class ExtensionHandler { } } - @Override - public void log(String text) { - // todo make simple logger for Extensions, the implementation now is temporary - System.out.println(text); - } - @Override public void hasClosed() { synchronized (gEarthExtensions) { diff --git a/G-Earth/src/main/java/gearth/ui/extensions/ExtensionsController.java b/G-Earth/src/main/java/gearth/ui/extensions/ExtensionsController.java index a6c7ee4..9d7f80b 100644 --- a/G-Earth/src/main/java/gearth/ui/extensions/ExtensionsController.java +++ b/G-Earth/src/main/java/gearth/ui/extensions/ExtensionsController.java @@ -1,11 +1,15 @@ package gearth.ui.extensions; +import gearth.services.extensionhandler.ExtensionConnectedListener; import gearth.services.extensionhandler.ExtensionHandler; +import gearth.services.extensionhandler.extensions.ExtensionListener; +import gearth.services.extensionhandler.extensions.GEarthExtension; import gearth.services.extensionhandler.extensions.implementations.network.NetworkExtensionsProducer; import gearth.services.extensionhandler.extensions.implementations.network.executer.ExecutionInfo; import gearth.services.extensionhandler.extensions.implementations.network.executer.ExtensionRunner; import gearth.services.extensionhandler.extensions.implementations.network.executer.ExtensionRunnerFactory; import gearth.ui.SubForm; +import gearth.ui.extensions.logger.ExtensionLogger; import javafx.application.Platform; import javafx.event.ActionEvent; import javafx.scene.control.Button; @@ -30,14 +34,19 @@ public class ExtensionsController extends SubForm { public VBox extensioncontainer; public GridPane header_ext; public ScrollPane scroller; + public Button btn_viewExtensionConsole; private ExtensionRunner extensionRunner = null; private ExtensionHandler extensionHandler; private NetworkExtensionsProducer networkExtensionsProducer; // needed for port + private ExtensionLogger extensionLogger = null; + + public void initialize() { scroller.widthProperty().addListener(observable -> header_ext.setPrefWidth(scroller.getWidth())); + extensionLogger = new ExtensionLogger(); } protected void onParentSet() { @@ -60,6 +69,14 @@ public class ExtensionsController extends SubForm { extensionRunner = ExtensionRunnerFactory.get(); extensionRunner.runAllExtensions(networkExtensionsProducer.getPort()); + + + extensionHandler.getObservable().addListener(e -> e.getExtensionObservable().addListener(new ExtensionListener() { + @Override + protected void log(String text) { + extensionLogger.log(text); + } + })); } @@ -73,4 +90,14 @@ public class ExtensionsController extends SubForm { extensionRunner.installAndRunExtension(selectedFile.getPath(), networkExtensionsProducer.getPort()); } } + + public void extConsoleBtnClicked(ActionEvent actionEvent) { + if (!extensionLogger.isVisible()) { + extensionLogger.show(); + } + else { + extensionLogger.hide(); + } + + } } diff --git a/G-Earth/src/main/java/gearth/ui/extensions/logger/Element.java b/G-Earth/src/main/java/gearth/ui/extensions/logger/Element.java new file mode 100644 index 0000000..6dee891 --- /dev/null +++ b/G-Earth/src/main/java/gearth/ui/extensions/logger/Element.java @@ -0,0 +1,11 @@ +package gearth.ui.extensions.logger; + +class Element { + final String text; + final String className; + + Element(String text, String className) { + this.text = text; + this.className = className; + } +} diff --git a/G-Earth/src/main/java/gearth/ui/extensions/logger/ExtensionLogger.java b/G-Earth/src/main/java/gearth/ui/extensions/logger/ExtensionLogger.java new file mode 100644 index 0000000..ac49d83 --- /dev/null +++ b/G-Earth/src/main/java/gearth/ui/extensions/logger/ExtensionLogger.java @@ -0,0 +1,93 @@ +package gearth.ui.extensions.logger; + +import javafx.fxml.FXMLLoader; +import javafx.scene.Parent; +import javafx.scene.Scene; +import javafx.scene.image.Image; +import javafx.stage.Modality; +import javafx.stage.Stage; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +public class ExtensionLogger { + private Stage stage; + private ExtensionLoggerController controller = null; + + private final List appendOnLoad = new ArrayList<>(); + + volatile boolean isVisible = false; + + public ExtensionLogger() { + FXMLLoader loader = new FXMLLoader(getClass().getResource("/gearth/ui/extensions/logger/ExtensionLogger.fxml")); + + try { + Parent root = loader.load(); + synchronized (appendOnLoad) { + controller = loader.getController(); + for (String s : appendOnLoad) { + controller.log(s); + } + appendOnLoad.clear(); + } + + + stage = new Stage(); + stage.setTitle("G-Earth | Extension Console"); + stage.initModality(Modality.NONE); + stage.getIcons().add(new Image(getClass().getResourceAsStream("/gearth/G-EarthLogoSmaller.png"))); + stage.setAlwaysOnTop(true); + stage.setMinHeight(235); + stage.setMinWidth(370); + + Scene scene = new Scene(root); + scene.getStylesheets().add("/gearth/ui/bootstrap3.css"); + scene.getStylesheets().add("/gearth/ui/extensions/logger/logger.css"); + ExtensionLoggerController controller = loader.getController(); + controller.setStage(stage); + + stage.setScene(scene); + + // don't let the user close this window on their own + stage.setOnCloseRequest(windowEvent -> { + stage.hide(); + isVisible = false; + }); + } catch (IOException e) { + e.printStackTrace(); + } + } + + public void show() { + if (stage != null){ + stage.show(); + if (stage.isIconified()) { + stage.setIconified(false); + } + isVisible = true; + } + } + + public void hide() { + if (stage != null) { + stage.hide(); + isVisible = false; + } + } + + public void log(String s) { + synchronized (appendOnLoad) { + if (controller == null) { + appendOnLoad.add(s); + } + else { + controller.log(s); + } + } + } + + public boolean isVisible() { + return isVisible; + } +} diff --git a/G-Earth/src/main/java/gearth/ui/extensions/logger/ExtensionLoggerController.java b/G-Earth/src/main/java/gearth/ui/extensions/logger/ExtensionLoggerController.java new file mode 100644 index 0000000..1a1540d --- /dev/null +++ b/G-Earth/src/main/java/gearth/ui/extensions/logger/ExtensionLoggerController.java @@ -0,0 +1,111 @@ +package gearth.ui.extensions.logger; + +import javafx.application.Platform; +import javafx.fxml.Initializable; +import javafx.scene.control.ScrollPane; +import javafx.scene.layout.BorderPane; +import javafx.stage.Stage; +import org.fxmisc.flowless.VirtualizedScrollPane; +import org.fxmisc.richtext.StyleClassedTextArea; +import org.fxmisc.richtext.model.StyleSpansBuilder; + +import java.net.URL; +import java.util.*; + +public class ExtensionLoggerController implements Initializable { + public BorderPane borderPane; + + private Stage stage = null; + private StyleClassedTextArea area; + + private volatile boolean initialized = false; + private final List appendOnLoad = new ArrayList<>(); + + + @Override + public void initialize(URL arg0, ResourceBundle arg1) { + area = new StyleClassedTextArea(); + area.getStyleClass().add("white"); + area.setWrapText(true); + area.setEditable(false); + + VirtualizedScrollPane vsPane = new VirtualizedScrollPane<>(area); + borderPane.setCenter(vsPane); + + synchronized (appendOnLoad) { + initialized = true; + if (!appendOnLoad.isEmpty()) { + appendLog(appendOnLoad); + appendOnLoad.clear(); + } + } + } + + private synchronized void appendLog(List elements) { + Platform.runLater(() -> { + StringBuilder sb = new StringBuilder(); + StyleSpansBuilder> styleSpansBuilder = new StyleSpansBuilder<>(0); + + for (Element element : elements) { + sb.append(element.text); + + styleSpansBuilder.add(Collections.singleton(element.className), element.text.length()); + } + + int oldLen = area.getLength(); + area.appendText(sb.toString()); +// System.out.println(sb.toString()); + area.setStyleSpans(oldLen, styleSpansBuilder.create()); + +// if (autoScroll) { + area.moveTo(area.getLength()); + area.requestFollowCaret(); +// } + }); + } + + void log(String s) { + s = cleanTextContent(s); + ArrayList elements = new ArrayList<>(); + + String classname, text; + if (s.startsWith("[") && s.contains("]")) { + classname = s.substring(1, s.indexOf("]")); + text = s.substring(s.indexOf("]") + 1); + } + else { + classname = "black"; + text = s; + } + + elements.add(new Element(text + "\n", classname.toLowerCase())); + + synchronized (appendOnLoad) { + if (initialized) { + appendLog(elements); + } + else { + appendOnLoad.addAll(elements); + } + } + } + + void setStage(Stage stage) { + this.stage = stage; + } + + private static String cleanTextContent(String text) + { +// // strips off all non-ASCII characters +// text = text.replaceAll("[^\\x00-\\x7F]", ""); +// +// // erases all the ASCII control characters + text = text.replaceAll("[\\p{Cntrl}&&[^\n\t]]", ""); + + // removes non-printable characters from Unicode +// text = text.replaceAll("\\p{C}", ""); + + return text.trim(); + } + +} diff --git a/G-Earth/src/main/java/gearth/ui/logger/loggerdisplays/uilogger/UiLoggerController.java b/G-Earth/src/main/java/gearth/ui/logger/loggerdisplays/uilogger/UiLoggerController.java index ad2226c..1d20f7b 100644 --- a/G-Earth/src/main/java/gearth/ui/logger/loggerdisplays/uilogger/UiLoggerController.java +++ b/G-Earth/src/main/java/gearth/ui/logger/loggerdisplays/uilogger/UiLoggerController.java @@ -67,8 +67,6 @@ public class UiLoggerController implements Initializable { appendLater.clear(); } } - - } private static String cleanTextContent(String text) diff --git a/G-Earth/src/main/resources/gearth/ui/G-Earth.fxml b/G-Earth/src/main/resources/gearth/ui/G-Earth.fxml index 3a7fc67..ecfd221 100644 --- a/G-Earth/src/main/resources/gearth/ui/G-Earth.fxml +++ b/G-Earth/src/main/resources/gearth/ui/G-Earth.fxml @@ -7,7 +7,7 @@ - - + diff --git a/G-Earth/src/main/resources/gearth/ui/extensions/Extensions.fxml b/G-Earth/src/main/resources/gearth/ui/extensions/Extensions.fxml index 11784c1..1b4807b 100644 --- a/G-Earth/src/main/resources/gearth/ui/extensions/Extensions.fxml +++ b/G-Earth/src/main/resources/gearth/ui/extensions/Extensions.fxml @@ -1,112 +1,77 @@ - - - - - - - - - + + + - + - + - - + + - + - + - - - - - + + + + + - + - + - - + - + - + - - - - + + + + + - + - + - + -