package de.pbauerochse.worklogviewer.fx; import ch.qos.logback.classic.spi.ILoggingEvent; import de.pbauerochse.worklogviewer.logging.ListenableLimitedLogMessagesAppender; import de.pbauerochse.worklogviewer.logging.LogMessageListener; import javafx.application.Platform; import javafx.beans.value.ChangeListener; import javafx.event.EventHandler; import javafx.fxml.FXML; import javafx.fxml.Initializable; import javafx.scene.control.TextArea; import javafx.stage.Window; import javafx.stage.WindowEvent; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.net.URL; import java.util.ResourceBundle; /** * @author Patrick Bauerochse * @since 01.07.15 */ public class LogViewController implements Initializable, LogMessageListener { private static final Logger LOGGER = LoggerFactory.getLogger(LogViewController.class); @FXML private TextArea logMessageTextArea; private EventHandler<WindowEvent> MODAL_CLOSE_EVENT_LISTENER = event -> { ListenableLimitedLogMessagesAppender logMessagesAppender = ListenableLimitedLogMessagesAppender.getInstance(); if (logMessagesAppender != null) { logMessagesAppender.removeListener(this); } }; private ChangeListener<Window> WINDOW_CHANGE_LISTENER = (observable, oldValue, newValue) -> { if (oldValue != null) { oldValue.removeEventHandler(WindowEvent.WINDOW_CLOSE_REQUEST, MODAL_CLOSE_EVENT_LISTENER); } if (newValue != null) { newValue.addEventHandler(WindowEvent.WINDOW_CLOSE_REQUEST, MODAL_CLOSE_EVENT_LISTENER); } }; @Override public void initialize(URL location, ResourceBundle resources) { LOGGER.debug("Initializing"); logMessageTextArea.sceneProperty().addListener((observable, oldValue, newValue) -> { if (oldValue != null) { LOGGER.debug("Removing WindowChangeListener"); oldValue.windowProperty().removeListener(WINDOW_CHANGE_LISTENER); } if (newValue != null) { LOGGER.debug("Adding WindowChangeListener"); newValue.windowProperty().addListener(WINDOW_CHANGE_LISTENER); } }); ListenableLimitedLogMessagesAppender logMessagesAppender = ListenableLimitedLogMessagesAppender.getInstance(); if (logMessagesAppender != null) { logMessagesAppender.addListener(this); logMessageTextArea.setText(logMessagesAppender.getLogMessages()); } } @Override public void onLogMessage(String formattedLogMessage, ILoggingEvent originalEvent) { // important: do not log anything in here otherwise you will get an infinite logging loop Platform.runLater(() -> logMessageTextArea.appendText(formattedLogMessage)); } }