From 4154e935bc693e66a7702848e8056e27e8740692 Mon Sep 17 00:00:00 2001 From: sirjonasxx <36828922+sirjonasxx@users.noreply.github.com> Date: Mon, 5 Nov 2018 22:59:22 +0100 Subject: [PATCH] fix bug where first packet(s) would not show in logger, HConnection needs reimplementation later --- .../main/java/gearth/misc/AdminValidator.java | 2 +- .../java/gearth/ui/UiLoggerController.java | 63 ++++++++++++------- .../ui/logger/loggerdisplays/UiLogger.java | 38 ++++++++--- 3 files changed, 71 insertions(+), 32 deletions(-) diff --git a/G-Earth/src/main/java/gearth/misc/AdminValidator.java b/G-Earth/src/main/java/gearth/misc/AdminValidator.java index d2d37a9..ca31aab 100644 --- a/G-Earth/src/main/java/gearth/misc/AdminValidator.java +++ b/G-Earth/src/main/java/gearth/misc/AdminValidator.java @@ -4,7 +4,7 @@ import java.io.PrintStream; import java.util.prefs.Preferences; /** - * Created by Jeunez on 5/11/2018. + * Created by Jonas on 5/11/2018. */ public class AdminValidator { diff --git a/G-Earth/src/main/java/gearth/ui/UiLoggerController.java b/G-Earth/src/main/java/gearth/ui/UiLoggerController.java index 9869b79..9e7a4b5 100644 --- a/G-Earth/src/main/java/gearth/ui/UiLoggerController.java +++ b/G-Earth/src/main/java/gearth/ui/UiLoggerController.java @@ -2,12 +2,11 @@ package gearth.ui; import gearth.protocol.HPacket; import gearth.ui.logger.loggerdisplays.PacketLogger; +import javafx.application.Platform; import javafx.event.ActionEvent; -import javafx.event.EventHandler; import javafx.fxml.Initializable; import javafx.scene.control.CheckMenuItem; import javafx.scene.control.Label; -import javafx.scene.input.ScrollEvent; import javafx.scene.layout.BorderPane; import javafx.scene.layout.FlowPane; import org.fxmisc.flowless.VirtualizedScrollPane; @@ -15,10 +14,7 @@ import org.fxmisc.richtext.StyleClassedTextArea; import org.fxmisc.richtext.model.StyleSpansBuilder; import java.net.URL; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.ResourceBundle; +import java.util.*; public class UiLoggerController implements Initializable { public FlowPane flowPane; @@ -38,6 +34,9 @@ public class UiLoggerController implements Initializable { private boolean displayStructure = true; private boolean autoScroll = true; + private volatile boolean initialized = false; + private final List appendLater = new ArrayList<>(); + @Override public void initialize(URL arg0, ResourceBundle arg1) { area = new StyleClassedTextArea(); @@ -46,6 +45,15 @@ public class UiLoggerController implements Initializable { VirtualizedScrollPane vsPane = new VirtualizedScrollPane<>(area); borderPane.setCenter(vsPane); + + synchronized (appendLater) { + initialized = true; + if (!appendLater.isEmpty()) { + appendLog(appendLater); + } + } + + } public void appendMessage(HPacket packet, int types) { @@ -83,27 +91,38 @@ public class UiLoggerController implements Initializable { elements.add(new Element("\n" + expr, "structure")); elements.add(new Element("\n--------------------\n", "")); - AppendLog(elements); + + synchronized (appendLater) { + if (initialized) { + appendLog(elements); + } + else { + appendLater.addAll(elements); + } + } + } - private void AppendLog(ArrayList elements) { - StringBuilder sb = new StringBuilder(); - StyleSpansBuilder> styleSpansBuilder = new StyleSpansBuilder<>(0); + 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()); - } + 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()); - area.setStyleSpans(oldLen, styleSpansBuilder.create()); - - if (autoScroll) { - area.moveTo(area.getLength()); - area.requestFollowCaret(); - } + 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(); + } + }); } public void toggleViewIncoming() { diff --git a/G-Earth/src/main/java/gearth/ui/logger/loggerdisplays/UiLogger.java b/G-Earth/src/main/java/gearth/ui/logger/loggerdisplays/UiLogger.java index 630f385..2855660 100644 --- a/G-Earth/src/main/java/gearth/ui/logger/loggerdisplays/UiLogger.java +++ b/G-Earth/src/main/java/gearth/ui/logger/loggerdisplays/UiLogger.java @@ -2,24 +2,20 @@ package gearth.ui.logger.loggerdisplays; import gearth.protocol.HPacket; import gearth.ui.UiLoggerController; -import javafx.application.Platform; import javafx.event.Event; -import javafx.event.EventHandler; import javafx.fxml.FXMLLoader; import javafx.scene.Parent; import javafx.scene.Scene; -import javafx.scene.input.KeyCode; -import javafx.scene.input.KeyCodeCombination; -import javafx.scene.input.KeyCombination; -import javafx.scene.input.KeyEvent; import javafx.stage.Modality; import javafx.stage.Stage; import java.io.IOException; +import java.util.ArrayList; +import java.util.List; public class UiLogger implements PacketLogger { private Stage stage; - private UiLoggerController controller; + private UiLoggerController controller = null; @Override public void start() { @@ -27,7 +23,13 @@ public class UiLogger implements PacketLogger { try { Parent root = loader.load(); - controller = loader.getController(); + synchronized (appendLater) { + controller = loader.getController(); + for (Elem elem : appendLater) { + controller.appendMessage(elem.packet, elem.types); + } + } + stage = new Stage(); stage.setTitle("G-Earth | Packet Logger"); stage.initModality(Modality.NONE); @@ -78,9 +80,27 @@ public class UiLogger implements PacketLogger { //Platform.runLater(() -> controller.appendSplitLine()); } + private class Elem { + HPacket packet; + int types; + Elem(HPacket packet, int types) { + this.packet = packet; + this.types = types; + } + } + + private final List appendLater = new ArrayList<>(); + @Override public void appendMessage(HPacket packet, int types) { - Platform.runLater(() -> controller.appendMessage(packet, types)); + synchronized (appendLater) { + if (controller == null) { + appendLater.add(new Elem(packet, types)); + } + else { + controller.appendMessage(packet, types); + } + } } @Override