From 06f50abcc4aea54cce056ca28a98d60c7e0a20fd Mon Sep 17 00:00:00 2001
From: tobias <tobias@thecodedev.de>
Date: Thu, 5 Sep 2019 20:53:18 +0200
Subject: [PATCH] Fixed #123 - Start automatic playout log sessions

---
 .../java/de/tobias/playpad/PlayPadImpl.java   | 21 ++++++++++++---
 .../java/de/tobias/playpad/PlayPadMain.java   |  2 ++
 .../main/java/de/tobias/playpad/PlayPad.java  |  7 +++++
 .../tobias/playpad/plugin/GlobalListener.java |  8 ++++++
 .../plugin/playout/PlayoutLogPlugin.java      |  2 ++
 .../playout/storage/PlayoutLogSettings.java   | 16 +++++++++++
 .../PlayoutLogViewController.java             | 13 +++++++--
 .../resources/lang/playoutlog_de.properties   |  1 +
 .../view/dialog/PlayoutLogDialog.fxml         |  9 ++++---
 .../plugin/playout/ProjectListener.scala      | 27 +++++++++++++++++++
 pom.xml                                       |  4 +--
 11 files changed, 99 insertions(+), 11 deletions(-)
 create mode 100644 PlayWallCore/src/main/java/de/tobias/playpad/plugin/GlobalListener.java
 create mode 100644 PlayWallPlugins/PlayWallPluginPlayoutLog/src/main/java/de/tobias/playpad/plugin/playout/storage/PlayoutLogSettings.java
 create mode 100644 PlayWallPlugins/PlayWallPluginPlayoutLog/src/main/scala/de/tobias/playpad/plugin/playout/ProjectListener.scala

diff --git a/PlayWall/src/main/java/de/tobias/playpad/PlayPadImpl.java b/PlayWall/src/main/java/de/tobias/playpad/PlayPadImpl.java
index 79931607..5d28708b 100644
--- a/PlayWall/src/main/java/de/tobias/playpad/PlayPadImpl.java
+++ b/PlayWall/src/main/java/de/tobias/playpad/PlayPadImpl.java
@@ -38,6 +38,7 @@ public class PlayPadImpl implements PlayPad {
 	private List<WindowListener<IMainViewController>> mainViewListeners = new ArrayList<>();
 	private List<SettingsListener> settingsListeners = new ArrayList<>();
 	private List<PadListener> padListeners = new ArrayList<>();
+	private List<GlobalListener> globalListeners = new ArrayList<>();
 
 	private MainViewController mainViewController;
 	private Image stageIcon;
@@ -98,6 +99,21 @@ public class PlayPadImpl implements PlayPad {
 		return padListeners;
 	}
 
+	@Override
+	public void addGlobalListener(GlobalListener globalListener) {
+		globalListeners.add(globalListener);
+	}
+
+	@Override
+	public void removeGlobalListener(GlobalListener globalListener) {
+		globalListeners.remove(globalListener);
+	}
+
+	@Override
+	public List<GlobalListener> getGlobalListeners() {
+		return globalListeners;
+	}
+
 	@Override
 	public IMainViewController getMainViewController() {
 		return mainViewController;
@@ -150,6 +166,7 @@ public class PlayPadImpl implements PlayPad {
 			mainViewController = new MainViewController(e -> {
 				currentProject = project;
 				mainViewController.openProject(project);
+				globalListeners.forEach(l -> l.currentProjectDidChanged(project));
 				if (onLoaded != null) {
 					onLoaded.accept(e);
 				}
@@ -160,9 +177,7 @@ public class PlayPadImpl implements PlayPad {
 			currentProject = project;
 			mainViewController.openProject(project);
 
-			if (onLoaded != null) {
-				onLoaded.accept(mainViewController);
-			}
+			globalListeners.forEach(l -> l.currentProjectDidChanged(project));
 		}
 	}
 
diff --git a/PlayWall/src/main/java/de/tobias/playpad/PlayPadMain.java b/PlayWall/src/main/java/de/tobias/playpad/PlayPadMain.java
index 838e086c..6a98e632 100644
--- a/PlayWall/src/main/java/de/tobias/playpad/PlayPadMain.java
+++ b/PlayWall/src/main/java/de/tobias/playpad/PlayPadMain.java
@@ -3,6 +3,7 @@ package de.tobias.playpad;
 import de.thecodelabs.logger.FileOutputOption;
 import de.thecodelabs.logger.LogLevelFilter;
 import de.thecodelabs.logger.Logger;
+import de.thecodelabs.storage.proxy.SettingsProxy;
 import de.thecodelabs.storage.settings.UserDefaults;
 import de.thecodelabs.utils.application.App;
 import de.thecodelabs.utils.application.ApplicationUtils;
@@ -128,6 +129,7 @@ public class PlayPadMain extends Application {
 			ProfileReferenceManager.saveProfiles();
 			ProjectReferenceManager.saveProjects();
 			impl.getGlobalSettings().save();
+			SettingsProxy.saveAll();
 		} catch (Exception e) {
 			Logger.error(e);
 		}
diff --git a/PlayWallCore/src/main/java/de/tobias/playpad/PlayPad.java b/PlayWallCore/src/main/java/de/tobias/playpad/PlayPad.java
index 4f2ff4f3..58f86d87 100644
--- a/PlayWallCore/src/main/java/de/tobias/playpad/PlayPad.java
+++ b/PlayWallCore/src/main/java/de/tobias/playpad/PlayPad.java
@@ -2,6 +2,7 @@ package de.tobias.playpad;
 
 import de.thecodelabs.utils.ui.NVC;
 import de.thecodelabs.versionizer.service.UpdateService;
+import de.tobias.playpad.plugin.GlobalListener;
 import de.tobias.playpad.plugin.PadListener;
 import de.tobias.playpad.plugin.SettingsListener;
 import de.tobias.playpad.plugin.WindowListener;
@@ -74,6 +75,12 @@ public interface PlayPad {
 	 */
 	List<PadListener> getPadListener();
 
+	void addGlobalListener(GlobalListener globalListener);
+
+	void removeGlobalListener(GlobalListener globalListener);
+
+	List<GlobalListener> getGlobalListeners();
+
 	/**
 	 * Gibt eine Refernz auf das Hauptfenster zurück.
 	 *
diff --git a/PlayWallCore/src/main/java/de/tobias/playpad/plugin/GlobalListener.java b/PlayWallCore/src/main/java/de/tobias/playpad/plugin/GlobalListener.java
new file mode 100644
index 00000000..2d89b1d0
--- /dev/null
+++ b/PlayWallCore/src/main/java/de/tobias/playpad/plugin/GlobalListener.java
@@ -0,0 +1,8 @@
+package de.tobias.playpad.plugin;
+
+import de.tobias.playpad.project.Project;
+
+public interface GlobalListener {
+
+	void currentProjectDidChanged(Project newProject);
+}
diff --git a/PlayWallPlugins/PlayWallPluginPlayoutLog/src/main/java/de/tobias/playpad/plugin/playout/PlayoutLogPlugin.java b/PlayWallPlugins/PlayWallPluginPlayoutLog/src/main/java/de/tobias/playpad/plugin/playout/PlayoutLogPlugin.java
index ebae0ba2..517278cd 100644
--- a/PlayWallPlugins/PlayWallPluginPlayoutLog/src/main/java/de/tobias/playpad/plugin/playout/PlayoutLogPlugin.java
+++ b/PlayWallPlugins/PlayWallPluginPlayoutLog/src/main/java/de/tobias/playpad/plugin/playout/PlayoutLogPlugin.java
@@ -20,6 +20,8 @@ public class PlayoutLogPlugin implements PlayPadPluginStub, PluginArtifact {
 
 		module = new Module(descriptor.getName(), descriptor.getArtifactId());
 		PlayPadPlugin.getInstance().addMainViewListener(new MainViewControllerListener());
+		PlayPadPlugin.getInstance().addGlobalListener(new ProjectListener());
+
 		PlayOutLogInitializer.init();
 
 		Logger.debug("Enable Playout Log Plugin");
diff --git a/PlayWallPlugins/PlayWallPluginPlayoutLog/src/main/java/de/tobias/playpad/plugin/playout/storage/PlayoutLogSettings.java b/PlayWallPlugins/PlayWallPluginPlayoutLog/src/main/java/de/tobias/playpad/plugin/playout/storage/PlayoutLogSettings.java
new file mode 100644
index 00000000..a4ee3885
--- /dev/null
+++ b/PlayWallPlugins/PlayWallPluginPlayoutLog/src/main/java/de/tobias/playpad/plugin/playout/storage/PlayoutLogSettings.java
@@ -0,0 +1,16 @@
+package de.tobias.playpad.plugin.playout.storage;
+
+import de.thecodelabs.storage.proxy.DefaultBoolean;
+import de.thecodelabs.storage.proxy.Setter;
+import de.thecodelabs.storage.proxy.Settings;
+import de.thecodelabs.storage.settings.annotation.FilePath;
+
+@FilePath("PlayOutLog.json")
+public interface PlayoutLogSettings extends Settings {
+
+	@DefaultBoolean(false)
+	boolean autoStartLogging();
+
+	@Setter
+	void autoStartLogging(boolean value);
+}
diff --git a/PlayWallPlugins/PlayWallPluginPlayoutLog/src/main/java/de/tobias/playpad/plugin/playout/viewcontroller/PlayoutLogViewController.java b/PlayWallPlugins/PlayWallPluginPlayoutLog/src/main/java/de/tobias/playpad/plugin/playout/viewcontroller/PlayoutLogViewController.java
index 59674600..2d4c8ac3 100644
--- a/PlayWallPlugins/PlayWallPluginPlayoutLog/src/main/java/de/tobias/playpad/plugin/playout/viewcontroller/PlayoutLogViewController.java
+++ b/PlayWallPlugins/PlayWallPluginPlayoutLog/src/main/java/de/tobias/playpad/plugin/playout/viewcontroller/PlayoutLogViewController.java
@@ -2,6 +2,7 @@ package de.tobias.playpad.plugin.playout.viewcontroller;
 
 import com.itextpdf.text.DocumentException;
 import de.thecodelabs.logger.Logger;
+import de.thecodelabs.storage.proxy.SettingsProxy;
 import de.thecodelabs.utils.ui.NVC;
 import de.thecodelabs.utils.ui.NVCStage;
 import de.thecodelabs.utils.ui.icon.FontAwesomeType;
@@ -12,12 +13,14 @@ import de.tobias.playpad.log.LogSeason;
 import de.tobias.playpad.log.LogSeasons;
 import de.tobias.playpad.plugin.playout.Strings;
 import de.tobias.playpad.plugin.playout.export.PlayoutLogPdfExport;
+import de.tobias.playpad.plugin.playout.storage.PlayoutLogSettings;
 import de.tobias.playpad.project.Project;
 import de.tobias.playpad.project.ProjectSettings;
 import de.tobias.playpad.viewcontroller.main.MenuToolbarViewController;
 import javafx.event.ActionEvent;
 import javafx.fxml.FXML;
 import javafx.scene.control.Button;
+import javafx.scene.control.CheckBox;
 import javafx.scene.control.ListView;
 import javafx.scene.control.TextField;
 import javafx.stage.FileChooser;
@@ -43,6 +46,8 @@ public class PlayoutLogViewController extends NVC {
 	private Button deleteButton;
 	@FXML
 	private Button finishButton;
+	@FXML
+	private CheckBox autoStartCheckbox;
 
 	private FontIcon logIcon;
 
@@ -70,6 +75,10 @@ public class PlayoutLogViewController extends NVC {
 			startButton.setText(Localization.getString(Strings.PLAYOUT_LOG_DIALOG_BUTTON_START));
 			nameTextField.setDisable(false);
 		}
+
+		autoStartCheckbox.setSelected(SettingsProxy.getSettings(PlayoutLogSettings.class).autoStartLogging());
+		autoStartCheckbox.selectedProperty().addListener((observable, oldValue, newValue) ->
+				SettingsProxy.getSettings(PlayoutLogSettings.class).autoStartLogging(newValue));
 	}
 
 	@Override
@@ -77,8 +86,8 @@ public class PlayoutLogViewController extends NVC {
 		stage.getIcons().add(PlayPadPlugin.getInstance().getIcon());
 
 		stage.setTitle(Localization.getString(Strings.UI_DIALOG_PLAYOUT_LOG_TITLE));
-		stage.setMinWidth(375);
-		stage.setMinHeight(400);
+		stage.setMinWidth(450);
+		stage.setMinHeight(600);
 
 		stage.initModality(Modality.WINDOW_MODAL);
 
diff --git a/PlayWallPlugins/PlayWallPluginPlayoutLog/src/main/resources/lang/playoutlog_de.properties b/PlayWallPlugins/PlayWallPluginPlayoutLog/src/main/resources/lang/playoutlog_de.properties
index 1da74c46..14b1772a 100644
--- a/PlayWallPlugins/PlayWallPluginPlayoutLog/src/main/resources/lang/playoutlog_de.properties
+++ b/PlayWallPlugins/PlayWallPluginPlayoutLog/src/main/resources/lang/playoutlog_de.properties
@@ -2,6 +2,7 @@ UI.Dialog.PlayoutLog.Title=PlayoutLog
 main.menuitem.log=Playout Log...
 
 PlayoutLogDialog.Label.Headline=PlayOut Log
+PlayoutLogDialog.Checkbox.AutoStart=Automatisch Starten bei Programmstart
 PlayoutLogDialog.Button.Start=Starten
 PlayoutLogDialog.Button.Stop=Stoppen
 PlayoutLogDialog.Button.Export=Exportieren...
diff --git a/PlayWallPlugins/PlayWallPluginPlayoutLog/src/main/resources/view/dialog/PlayoutLogDialog.fxml b/PlayWallPlugins/PlayWallPluginPlayoutLog/src/main/resources/view/dialog/PlayoutLogDialog.fxml
index 5d5250eb..5a6e94f2 100644
--- a/PlayWallPlugins/PlayWallPluginPlayoutLog/src/main/resources/view/dialog/PlayoutLogDialog.fxml
+++ b/PlayWallPlugins/PlayWallPluginPlayoutLog/src/main/resources/view/dialog/PlayoutLogDialog.fxml
@@ -1,11 +1,10 @@
 <?xml version="1.0" encoding="UTF-8"?>
 
-
 <?import javafx.geometry.Insets?>
 <?import javafx.scene.control.*?>
 <?import javafx.scene.layout.*?>
 <VBox maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" spacing="14.0"
-      xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1">
+      xmlns="http://javafx.com/javafx/8.0.141" xmlns:fx="http://javafx.com/fxml/1">
     <children>
         <Label styleClass="headline" text="%PlayoutLogDialog.Label.Headline"/>
         <HBox spacing="14.0">
@@ -20,7 +19,7 @@
         <HBox maxWidth="1.7976931348623157E308" spacing="14.0" VBox.vgrow="ALWAYS">
             <children>
                 <ListView fx:id="logList" maxWidth="1.7976931348623157E308" prefHeight="200.0" prefWidth="300.0"
-                          HBox.hgrow="ALWAYS" styleClass="dark-list"/>
+                          styleClass="dark-list" HBox.hgrow="ALWAYS"/>
                 <VBox maxWidth="1.7976931348623157E308" spacing="14.0" HBox.hgrow="ALWAYS">
                     <children>
                         <Button fx:id="exportButton" maxWidth="1.7976931348623157E308" mnemonicParsing="false"
@@ -33,8 +32,10 @@
                 </VBox>
             </children>
         </HBox>
-        <HBox alignment="TOP_RIGHT">
+        <HBox alignment="CENTER_LEFT">
             <children>
+                <CheckBox fx:id="autoStartCheckbox" maxWidth="1.7976931348623157E308" mnemonicParsing="false"
+                          text="%PlayoutLogDialog.Checkbox.AutoStart" HBox.hgrow="ALWAYS"/>
                 <Button fx:id="finishButton" defaultButton="true" mnemonicParsing="false"
                         onAction="#finishButtonHandler" text="Fertig"/>
             </children>
diff --git a/PlayWallPlugins/PlayWallPluginPlayoutLog/src/main/scala/de/tobias/playpad/plugin/playout/ProjectListener.scala b/PlayWallPlugins/PlayWallPluginPlayoutLog/src/main/scala/de/tobias/playpad/plugin/playout/ProjectListener.scala
new file mode 100644
index 00000000..348472da
--- /dev/null
+++ b/PlayWallPlugins/PlayWallPluginPlayoutLog/src/main/scala/de/tobias/playpad/plugin/playout/ProjectListener.scala
@@ -0,0 +1,27 @@
+package de.tobias.playpad.plugin.playout
+
+import java.text.SimpleDateFormat
+
+import de.thecodelabs.logger.Logger
+import de.thecodelabs.storage.proxy.SettingsProxy
+import de.tobias.playpad.log.LogSeasons
+import de.tobias.playpad.plugin.GlobalListener
+import de.tobias.playpad.plugin.playout.storage.PlayoutLogSettings
+import de.tobias.playpad.project.Project
+
+class ProjectListener extends GlobalListener {
+
+	private val dateFormatter = new SimpleDateFormat("dd.MM.yyyy HH:mm:ss")
+
+	override def currentProjectDidChanged(newProject: Project): Unit = {
+		val autoStart = SettingsProxy.getSettings(classOf[PlayoutLogSettings]).autoStartLogging()
+		if (autoStart) {
+			Logger.info("Start new PlayOutLog session")
+
+			val settings = newProject.getSettings
+
+			val logSeason = LogSeasons.createLogSeason(dateFormatter.format(System.currentTimeMillis), settings.getColumns, settings.getRows)
+			logSeason.createProjectSnapshot(newProject)
+		}
+	}
+}
diff --git a/pom.xml b/pom.xml
index e85b40e3..7f547e3a 100644
--- a/pom.xml
+++ b/pom.xml
@@ -18,8 +18,8 @@
         <components.version>${project.version}</components.version>
 
         <jlibs.version>2.0.6</jlibs.version>
-        <libPlugins.version>2.2.0</libPlugins.version>
-        <versionizer-api.version>1.1.0</versionizer-api.version>
+        <libPlugins.version>2.2.1</libPlugins.version>
+        <versionizer-api.version>1.1.1</versionizer-api.version>
 
         <jlayer.version>1.0.1</jlayer.version>
 
-- 
GitLab