From 24913221caf8a9d7b4add45ccace3d299a5c40a6 Mon Sep 17 00:00:00 2001
From: tobias <tobias@thecodedev.de>
Date: Fri, 6 Sep 2019 21:30:55 +0200
Subject: [PATCH] Rewrite project open method; fixed playout log project switch
 error

---
 .../java/de/tobias/playpad/PlayPadImpl.java   | 35 ++++++++++++++-----
 .../DesktopMenuToolbarViewController.java     | 32 +++++------------
 .../playpad/viewcontroller/LaunchDialog.java  | 15 ++------
 .../main/MainViewController.java              | 25 ++++++-------
 .../initialize/OpenLastDocumentTask.scala     |  7 ++--
 .../initialize/ProjectParameterOpenTask.scala |  6 +---
 .../main/java/de/tobias/playpad/PlayPad.java  | 10 ++++--
 .../tobias/playpad/plugin/GlobalAdapter.java  | 16 +++++++++
 .../tobias/playpad/plugin/GlobalListener.java |  4 ++-
 .../main/IMainViewController.java             |  2 ++
 .../resources/lang/playoutlog_de.properties   |  2 +-
 .../plugin/playout/ProjectListener.scala      | 12 ++++---
 .../websocket/listener/ProjectListener.scala  | 12 +++++++
 .../websocket/methods/ProjectOpenMethod.scala | 12 ++-----
 14 files changed, 107 insertions(+), 83 deletions(-)
 create mode 100644 PlayWallCore/src/main/java/de/tobias/playpad/plugin/GlobalAdapter.java
 create mode 100644 PlayWallPlugins/PlayWallPluginWebAPI/src/main/scala/de/tobias/playpad/plugin/api/websocket/listener/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 5d28708b..61fa1739 100644
--- a/PlayWall/src/main/java/de/tobias/playpad/PlayPadImpl.java
+++ b/PlayWall/src/main/java/de/tobias/playpad/PlayPadImpl.java
@@ -13,17 +13,26 @@ import de.tobias.playpad.design.ModernDesignHandler;
 import de.tobias.playpad.initialize.*;
 import de.tobias.playpad.log.LogSeasons;
 import de.tobias.playpad.plugin.*;
+import de.tobias.playpad.profile.ProfileNotFoundException;
 import de.tobias.playpad.project.Project;
+import de.tobias.playpad.project.ProjectNotFoundException;
+import de.tobias.playpad.project.ProjectReader;
+import de.tobias.playpad.project.loader.ProjectLoader;
+import de.tobias.playpad.project.ref.ProjectReference;
 import de.tobias.playpad.server.ConnectionState;
 import de.tobias.playpad.server.Server;
 import de.tobias.playpad.server.Session;
 import de.tobias.playpad.server.SessionDelegate;
 import de.tobias.playpad.settings.GlobalSettings;
+import de.tobias.playpad.viewcontroller.dialog.project.ProjectLoadDialog;
+import de.tobias.playpad.viewcontroller.dialog.project.ProjectReaderDelegateImpl;
 import de.tobias.playpad.viewcontroller.main.IMainViewController;
 import de.tobias.playpad.viewcontroller.main.MainViewController;
 import javafx.application.Application;
 import javafx.application.Platform;
 import javafx.scene.image.Image;
+import javafx.stage.Window;
+import org.dom4j.DocumentException;
 
 import java.io.IOException;
 import java.nio.file.Path;
@@ -161,12 +170,24 @@ public class PlayPadImpl implements PlayPad {
 	}
 
 	@Override
-	public void openProject(Project project, Consumer<NVC> onLoaded) {
+	public void openProject(ProjectReference projectReference, Consumer<NVC> onLoaded) throws ProjectNotFoundException, ProjectReader.ProjectReaderDelegate.ProfileAbortException, ProfileNotFoundException, DocumentException, IOException {
+		if (mainViewController != null) {
+			mainViewController.closeProject();
+			globalListeners.forEach(l -> l.projectClosed(currentProject));
+		}
+
+		Window owner = mainViewController != null ? mainViewController.getContainingWindow() : null;
+
+		ProjectLoader loader = new ProjectLoader(projectReference);
+		loader.setDelegate(ProjectReaderDelegateImpl.getInstance(owner));
+		loader.setListener(new ProjectLoadDialog());
+
+		currentProject = loader.load();
+
 		if (mainViewController == null) {
 			mainViewController = new MainViewController(e -> {
-				currentProject = project;
-				mainViewController.openProject(project);
-				globalListeners.forEach(l -> l.currentProjectDidChanged(project));
+				mainViewController.openProject(currentProject);
+				globalListeners.forEach(l -> l.projectOpened(currentProject));
 				if (onLoaded != null) {
 					onLoaded.accept(e);
 				}
@@ -174,10 +195,8 @@ public class PlayPadImpl implements PlayPad {
 				Platform.setImplicitExit(true);
 			});
 		} else {
-			currentProject = project;
-			mainViewController.openProject(project);
-
-			globalListeners.forEach(l -> l.currentProjectDidChanged(project));
+			mainViewController.openProject(currentProject);
+			globalListeners.forEach(l -> l.projectOpened(currentProject));
 		}
 	}
 
diff --git a/PlayWall/src/main/java/de/tobias/playpad/layout/desktop/DesktopMenuToolbarViewController.java b/PlayWall/src/main/java/de/tobias/playpad/layout/desktop/DesktopMenuToolbarViewController.java
index 9db4259e..ef21688a 100644
--- a/PlayWall/src/main/java/de/tobias/playpad/layout/desktop/DesktopMenuToolbarViewController.java
+++ b/PlayWall/src/main/java/de/tobias/playpad/layout/desktop/DesktopMenuToolbarViewController.java
@@ -24,8 +24,7 @@ import de.tobias.playpad.profile.ref.ProfileReference;
 import de.tobias.playpad.profile.ref.ProfileReferenceManager;
 import de.tobias.playpad.project.Project;
 import de.tobias.playpad.project.ProjectNotFoundException;
-import de.tobias.playpad.project.ProjectReader;
-import de.tobias.playpad.project.loader.ProjectLoader;
+import de.tobias.playpad.project.ProjectReader.ProjectReaderDelegate.ProfileAbortException;
 import de.tobias.playpad.project.page.Page;
 import de.tobias.playpad.project.ref.ProjectReference;
 import de.tobias.playpad.project.ref.ProjectReferenceManager;
@@ -41,7 +40,6 @@ import de.tobias.playpad.viewcontroller.dialog.AboutDialog;
 import de.tobias.playpad.viewcontroller.dialog.ModernPluginViewController;
 import de.tobias.playpad.viewcontroller.dialog.PrintDialog;
 import de.tobias.playpad.viewcontroller.dialog.ProfileViewController;
-import de.tobias.playpad.viewcontroller.dialog.project.ProjectLoadDialog;
 import de.tobias.playpad.viewcontroller.dialog.project.ProjectManagerDialog;
 import de.tobias.playpad.viewcontroller.dialog.project.ProjectNewDialog;
 import de.tobias.playpad.viewcontroller.dialog.project.ProjectReaderDelegateImpl;
@@ -491,10 +489,8 @@ public class DesktopMenuToolbarViewController extends BasicMenuToolbarViewContro
 			ProjectNewDialog dialog = new ProjectNewDialog(mainViewController.getStage());
 			dialog.showAndWait().ifPresent(projectReference -> {
 				try {
-					ProjectLoader loader = new ProjectLoader(projectReference);
-					Project project = loader.load();
-					PlayPadMain.getProgramInstance().openProject(project, null);
-				} catch (DocumentException | IOException | ProjectNotFoundException | ProfileNotFoundException | ProjectReader.ProjectReaderDelegate.ProfileAbortException e) {
+					PlayPadMain.getProgramInstance().openProject(projectReference, null);
+				} catch (DocumentException | IOException | ProjectNotFoundException | ProfileNotFoundException | ProfileAbortException e) {
 					Logger.error(e);
 				}
 			});
@@ -513,13 +509,8 @@ public class DesktopMenuToolbarViewController extends BasicMenuToolbarViewContro
 			if (result.isPresent()) {
 				ProjectReference ref = result.get();
 
-				ProjectReader.ProjectReaderDelegate delegate = ProjectReaderDelegateImpl.getInstance(stage);
 				try {
-					ProjectLoader loader = new ProjectLoader(result.get());
-					loader.setDelegate(delegate);
-					loader.setListener(new ProjectLoadDialog());
-					Project project = loader.load();
-					PlayPadMain.getProgramInstance().openProject(project, null);
+					PlayPadMain.getProgramInstance().openProject(ref, null);
 
 					createRecentDocumentMenuItems();
 				} catch (ProfileNotFoundException e) {
@@ -533,8 +524,8 @@ public class DesktopMenuToolbarViewController extends BasicMenuToolbarViewContro
 					// Neues Profile wählen
 					ProfileReference profile = null;
 					try {
-						profile = delegate.getProfileReference();
-					} catch (ProjectReader.ProjectReaderDelegate.ProfileAbortException ignored) {
+						profile = ProjectReaderDelegateImpl.getInstance(stage).getProfileReference();
+					} catch (ProfileAbortException ignored) {
 					}
 					ref.setProfileReference(profile);
 				} catch (ProjectNotFoundException e) {
@@ -787,14 +778,9 @@ public class DesktopMenuToolbarViewController extends BasicMenuToolbarViewContro
 			MenuItem item = (MenuItem) event.getSource();
 			ProjectReference ref = (ProjectReference) item.getUserData();
 
-			ProjectReader.ProjectReaderDelegate delegate = ProjectReaderDelegateImpl.getInstance(getContainingWindow());
 			try {
 				// Speichern das alte Project in mvc.setProject(Project)
-				ProjectLoader loader = new ProjectLoader(ref);
-				loader.setDelegate(delegate);
-				loader.setListener(new ProjectLoadDialog());
-				Project project = loader.load();
-				PlayPadMain.getProgramInstance().openProject(project, null);
+				PlayPadMain.getProgramInstance().openProject(ref, null);
 			} catch (ProfileNotFoundException e) {
 				Logger.error(e);
 				mainViewController.showError(
@@ -803,8 +789,8 @@ public class DesktopMenuToolbarViewController extends BasicMenuToolbarViewContro
 				// Neues Profile wählen
 				ProfileReference profile = null;
 				try {
-					profile = delegate.getProfileReference();
-				} catch (ProjectReader.ProjectReaderDelegate.ProfileAbortException ignored) {
+					profile = ProjectReaderDelegateImpl.getInstance(getContainingWindow()).getProfileReference();
+				} catch (ProfileAbortException ignored) {
 				}
 				ref.setProfileReference(profile);
 			} catch (ProjectNotFoundException e) {
diff --git a/PlayWall/src/main/java/de/tobias/playpad/viewcontroller/LaunchDialog.java b/PlayWall/src/main/java/de/tobias/playpad/viewcontroller/LaunchDialog.java
index e1a5c599..ef0c65d9 100644
--- a/PlayWall/src/main/java/de/tobias/playpad/viewcontroller/LaunchDialog.java
+++ b/PlayWall/src/main/java/de/tobias/playpad/viewcontroller/LaunchDialog.java
@@ -14,18 +14,15 @@ import de.tobias.playpad.PlayPadPlugin;
 import de.tobias.playpad.Strings;
 import de.tobias.playpad.profile.ProfileNotFoundException;
 import de.tobias.playpad.profile.ref.ProfileReference;
-import de.tobias.playpad.project.Project;
 import de.tobias.playpad.project.ProjectNotFoundException;
 import de.tobias.playpad.project.ProjectReader;
 import de.tobias.playpad.project.importer.ProjectImporter;
-import de.tobias.playpad.project.loader.ProjectLoader;
 import de.tobias.playpad.project.ref.ProjectReference;
 import de.tobias.playpad.project.ref.ProjectReferenceManager;
 import de.tobias.playpad.server.*;
 import de.tobias.playpad.viewcontroller.cell.ProjectCell;
 import de.tobias.playpad.viewcontroller.dialog.ModernPluginViewController;
 import de.tobias.playpad.viewcontroller.dialog.project.ProjectImportDialog;
-import de.tobias.playpad.viewcontroller.dialog.project.ProjectLoadDialog;
 import de.tobias.playpad.viewcontroller.dialog.project.ProjectNewDialog;
 import de.tobias.playpad.viewcontroller.dialog.project.ProjectReaderDelegateImpl;
 import javafx.application.Platform;
@@ -259,7 +256,7 @@ public class LaunchDialog extends NVC implements ChangeListener<ConnectionState>
 		Server server = PlayPadPlugin.getServerHandler().getServer();
 		server.connectionStateProperty().removeListener(this);
 
-		// Es fehlen Module
+		// Modules missing
 		if (!ref.getMissedModules().isEmpty()) {
 			showInfoMessage(Localization.getString(Strings.ERROR_PLUGINS_MISSING));
 
@@ -267,14 +264,8 @@ public class LaunchDialog extends NVC implements ChangeListener<ConnectionState>
 			pluginViewController.getStageContainer().ifPresent(NVCStage::showAndWait);
 		}
 
-		ProjectReader.ProjectReaderDelegate delegate = ProjectReaderDelegateImpl.getInstance(getContainingWindow());
 		try {
-			ProjectLoader loader = new ProjectLoader(ref);
-			loader.setDelegate(delegate);
-			loader.setListener(new ProjectLoadDialog());
-
-			Project project = loader.load();
-			PlayPadMain.getProgramInstance().openProject(project, e -> getStageContainer().ifPresent(NVCStage::close));
+			PlayPadMain.getProgramInstance().openProject(ref, e -> getStageContainer().ifPresent(NVCStage::close));
 		} catch (ProfileNotFoundException e) {
 			Logger.error(e);
 			showErrorMessage(getString(Strings.ERROR_PROFILE_NOT_FOUND, ref.getProfileReference(), e.getLocalizedMessage()));
@@ -282,7 +273,7 @@ public class LaunchDialog extends NVC implements ChangeListener<ConnectionState>
 			// Choose new profile
 			ProfileReference profile = null;
 			try {
-				profile = delegate.getProfileReference();
+				profile = ProjectReaderDelegateImpl.getInstance(getContainingWindow()).getProfileReference();
 			} catch (ProjectReader.ProjectReaderDelegate.ProfileAbortException ignored) {
 			}
 			ref.setProfileReference(profile);
diff --git a/PlayWall/src/main/java/de/tobias/playpad/viewcontroller/main/MainViewController.java b/PlayWall/src/main/java/de/tobias/playpad/viewcontroller/main/MainViewController.java
index c20e5b21..fa81a081 100644
--- a/PlayWall/src/main/java/de/tobias/playpad/viewcontroller/main/MainViewController.java
+++ b/PlayWall/src/main/java/de/tobias/playpad/viewcontroller/main/MainViewController.java
@@ -226,27 +226,22 @@ public class MainViewController extends NVC implements IMainViewController, Noti
 	private void initKeyboardMapper() {
 		registerKeyboardListener(KeyEvent.ANY, event -> {
 			if (event.getTarget() instanceof AnchorPane) {
-				if(!event.isShortcutDown())
-				{
+				if (!event.isShortcutDown()) {
 					KeyCode code = null;
 					KeyEventType type = null;
 
-					if(event.getEventType() == KeyEvent.KEY_PRESSED)
-					{
+					if (event.getEventType() == KeyEvent.KEY_PRESSED) {
 						code = event.getCode();
 						type = KeyEventType.DOWN;
 
-					}
-					else if(event.getEventType() == KeyEvent.KEY_RELEASED)
-					{
+					} else if (event.getEventType() == KeyEvent.KEY_RELEASED) {
 						code = event.getCode();
 						type = KeyEventType.UP;
 
 					}
 
 					// Only execute this, then the right event is triggered and this var is set
-					if(code != null)
-					{
+					if (code != null) {
 						de.thecodelabs.midi.event.KeyEvent keyEvent = new de.thecodelabs.midi.event.KeyEvent(KeyType.KEYBOARD, type, code.ordinal());
 						KeyEventDispatcher.dispatchEvent(keyEvent);
 					}
@@ -377,7 +372,7 @@ public class MainViewController extends NVC implements IMainViewController, Noti
 	}
 
 	@Override
-	public void openProject(Project project) {
+	public void closeProject() {
 		// Remove old listener
 		if (this.openProject != null) {
 			this.openProject.getProjectReference().nameProperty().removeListener(projectTitleListener);
@@ -385,8 +380,15 @@ public class MainViewController extends NVC implements IMainViewController, Noti
 			this.openProject.notFoundMediaProperty().removeListener(notFoundListener);
 			this.openProject.close();
 		}
-
 		removePadContentsFromView();
+		this.openProject = null;
+	}
+
+	@Override
+	public void openProject(Project project) {
+		if (this.openProject != null) {
+			closeProject();
+		}
 
 		openProject = project;
 
@@ -563,7 +565,6 @@ public class MainViewController extends NVC implements IMainViewController, Noti
 		}
 	}
 
-	@Override
 	public void setGridColor(Color color) {
 		this.gridColor = color;
 		try {
diff --git a/PlayWall/src/main/scala/de/tobias/playpad/initialize/OpenLastDocumentTask.scala b/PlayWall/src/main/scala/de/tobias/playpad/initialize/OpenLastDocumentTask.scala
index 1622ce50..6d03affb 100644
--- a/PlayWall/src/main/scala/de/tobias/playpad/initialize/OpenLastDocumentTask.scala
+++ b/PlayWall/src/main/scala/de/tobias/playpad/initialize/OpenLastDocumentTask.scala
@@ -1,9 +1,9 @@
 package de.tobias.playpad.initialize
+
 import java.util.UUID
 
 import de.thecodelabs.utils.application
 import de.tobias.playpad.PlayPadImpl
-import de.tobias.playpad.project.loader.ProjectLoader
 import de.tobias.playpad.project.ref.ProjectReferenceManager
 
 class OpenLastDocumentTask extends PlayPadInitializeTask {
@@ -13,10 +13,7 @@ class OpenLastDocumentTask extends PlayPadInitializeTask {
 		if (instance.getGlobalSettings.isOpenLastDocument) {
 			val value = app.getUserDefaults.getData("project").asInstanceOf[UUID]
 			if (value != null) {
-				val loader = new ProjectLoader(ProjectReferenceManager.getProject(value))
-				val project = loader.load
-				instance.openProject(project, null)
-
+				instance.openProject(ProjectReferenceManager.getProject(value), null)
 				throw new PlayPadInitializeAbortException(this)
 			}
 		}
diff --git a/PlayWall/src/main/scala/de/tobias/playpad/initialize/ProjectParameterOpenTask.scala b/PlayWall/src/main/scala/de/tobias/playpad/initialize/ProjectParameterOpenTask.scala
index 6a8fd104..a659cbc9 100644
--- a/PlayWall/src/main/scala/de/tobias/playpad/initialize/ProjectParameterOpenTask.scala
+++ b/PlayWall/src/main/scala/de/tobias/playpad/initialize/ProjectParameterOpenTask.scala
@@ -4,7 +4,6 @@ import java.util.UUID
 
 import de.thecodelabs.utils.application
 import de.tobias.playpad.PlayPadImpl
-import de.tobias.playpad.project.loader.ProjectLoader
 import de.tobias.playpad.project.ref.ProjectReferenceManager
 ;
 
@@ -18,10 +17,7 @@ class ProjectParameterOpenTask extends PlayPadInitializeTask {
 		if (!parameter.getRaw.isEmpty) {
 			if (parameter.getNamed.containsKey("project")) {
 				val uuid = UUID.fromString(parameter.getNamed.get("project"))
-				val loader = new ProjectLoader(ProjectReferenceManager.getProject(uuid))
-				val project = loader.load
-				instance.openProject(project, null)
-
+				instance.openProject(ProjectReferenceManager.getProject(uuid), null)
 				throw new PlayPadInitializeAbortException(this)
 			}
 		}
diff --git a/PlayWallCore/src/main/java/de/tobias/playpad/PlayPad.java b/PlayWallCore/src/main/java/de/tobias/playpad/PlayPad.java
index 58f86d87..7b146c29 100644
--- a/PlayWallCore/src/main/java/de/tobias/playpad/PlayPad.java
+++ b/PlayWallCore/src/main/java/de/tobias/playpad/PlayPad.java
@@ -6,11 +6,17 @@ import de.tobias.playpad.plugin.GlobalListener;
 import de.tobias.playpad.plugin.PadListener;
 import de.tobias.playpad.plugin.SettingsListener;
 import de.tobias.playpad.plugin.WindowListener;
+import de.tobias.playpad.profile.ProfileNotFoundException;
 import de.tobias.playpad.project.Project;
+import de.tobias.playpad.project.ProjectNotFoundException;
+import de.tobias.playpad.project.ProjectReader.ProjectReaderDelegate.ProfileAbortException;
+import de.tobias.playpad.project.ref.ProjectReference;
 import de.tobias.playpad.settings.GlobalSettings;
 import de.tobias.playpad.viewcontroller.main.IMainViewController;
 import javafx.scene.image.Image;
+import org.dom4j.DocumentException;
 
+import java.io.IOException;
 import java.util.List;
 import java.util.function.Consumer;
 
@@ -117,10 +123,10 @@ public interface PlayPad {
 	/**
 	 * Open a project
 	 *
-	 * @param project  project
+	 * @param projectReference  project reference
 	 * @param onLoaded on project loaded callback
 	 */
-	void openProject(Project project, Consumer<NVC> onLoaded);
+	void openProject(ProjectReference projectReference, Consumer<NVC> onLoaded) throws ProjectNotFoundException, ProfileAbortException, ProfileNotFoundException, DocumentException, IOException;
 
 	UpdateService getUpdateService();
 
diff --git a/PlayWallCore/src/main/java/de/tobias/playpad/plugin/GlobalAdapter.java b/PlayWallCore/src/main/java/de/tobias/playpad/plugin/GlobalAdapter.java
new file mode 100644
index 00000000..fa59a432
--- /dev/null
+++ b/PlayWallCore/src/main/java/de/tobias/playpad/plugin/GlobalAdapter.java
@@ -0,0 +1,16 @@
+package de.tobias.playpad.plugin;
+
+import de.tobias.playpad.project.Project;
+
+public class GlobalAdapter implements GlobalListener {
+
+	@Override
+	public void projectOpened(Project newProject) {
+
+	}
+
+	@Override
+	public void projectClosed(Project currentProject) {
+
+	}
+}
diff --git a/PlayWallCore/src/main/java/de/tobias/playpad/plugin/GlobalListener.java b/PlayWallCore/src/main/java/de/tobias/playpad/plugin/GlobalListener.java
index 2d89b1d0..0885b0c3 100644
--- a/PlayWallCore/src/main/java/de/tobias/playpad/plugin/GlobalListener.java
+++ b/PlayWallCore/src/main/java/de/tobias/playpad/plugin/GlobalListener.java
@@ -4,5 +4,7 @@ import de.tobias.playpad.project.Project;
 
 public interface GlobalListener {
 
-	void currentProjectDidChanged(Project newProject);
+	void projectOpened(Project newProject);
+
+	void projectClosed(Project currentProject);
 }
diff --git a/PlayWallCore/src/main/java/de/tobias/playpad/viewcontroller/main/IMainViewController.java b/PlayWallCore/src/main/java/de/tobias/playpad/viewcontroller/main/IMainViewController.java
index 8d3c1177..74d3f11e 100644
--- a/PlayWallCore/src/main/java/de/tobias/playpad/viewcontroller/main/IMainViewController.java
+++ b/PlayWallCore/src/main/java/de/tobias/playpad/viewcontroller/main/IMainViewController.java
@@ -104,6 +104,8 @@ public interface IMainViewController extends NotificationHandler, Alertable {
 	 */
 	boolean showPage(Page page);
 
+	void closeProject();
+
 	/**
 	 * Opens a project
 	 *
diff --git a/PlayWallPlugins/PlayWallPluginPlayoutLog/src/main/resources/lang/playoutlog_de.properties b/PlayWallPlugins/PlayWallPluginPlayoutLog/src/main/resources/lang/playoutlog_de.properties
index 14b1772a..8ec96c7c 100644
--- a/PlayWallPlugins/PlayWallPluginPlayoutLog/src/main/resources/lang/playoutlog_de.properties
+++ b/PlayWallPlugins/PlayWallPluginPlayoutLog/src/main/resources/lang/playoutlog_de.properties
@@ -2,7 +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.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/scala/de/tobias/playpad/plugin/playout/ProjectListener.scala b/PlayWallPlugins/PlayWallPluginPlayoutLog/src/main/scala/de/tobias/playpad/plugin/playout/ProjectListener.scala
index 348472da..3748f689 100644
--- 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
@@ -5,23 +5,27 @@ 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.GlobalAdapter
 import de.tobias.playpad.plugin.playout.storage.PlayoutLogSettings
 import de.tobias.playpad.project.Project
 
-class ProjectListener extends GlobalListener {
+class ProjectListener extends GlobalAdapter {
 
 	private val dateFormatter = new SimpleDateFormat("dd.MM.yyyy HH:mm:ss")
+	private val nameFormat = "%s (%s)"
 
-	override def currentProjectDidChanged(newProject: Project): Unit = {
+	override def projectOpened(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)
+			val logName = String.format(nameFormat, dateFormatter.format(System.currentTimeMillis), newProject.getProjectReference.getName)
+			val logSeason = LogSeasons.createLogSeason(logName, settings.getColumns, settings.getRows)
 			logSeason.createProjectSnapshot(newProject)
 		}
 	}
+
+	override def projectClosed(currentProject: Project): Unit = LogSeasons.stop()
 }
diff --git a/PlayWallPlugins/PlayWallPluginWebAPI/src/main/scala/de/tobias/playpad/plugin/api/websocket/listener/ProjectListener.scala b/PlayWallPlugins/PlayWallPluginWebAPI/src/main/scala/de/tobias/playpad/plugin/api/websocket/listener/ProjectListener.scala
new file mode 100644
index 00000000..a099218e
--- /dev/null
+++ b/PlayWallPlugins/PlayWallPluginWebAPI/src/main/scala/de/tobias/playpad/plugin/api/websocket/listener/ProjectListener.scala
@@ -0,0 +1,12 @@
+package de.tobias.playpad.plugin.api.websocket.listener
+
+import de.tobias.playpad.plugin.GlobalAdapter
+import de.tobias.playpad.plugin.api.websocket.WebSocketHandler
+import de.tobias.playpad.plugin.api.websocket.serialize.ProjectSerializer
+import de.tobias.playpad.project.Project
+
+class ProjectListener extends GlobalAdapter {
+	override def projectOpened(newProject: Project): Unit = {
+		WebSocketHandler.instance.sendUpdate("project-changed", ProjectSerializer.serializeProject(newProject))
+	}
+}
diff --git a/PlayWallPlugins/PlayWallPluginWebAPI/src/main/scala/de/tobias/playpad/plugin/api/websocket/methods/ProjectOpenMethod.scala b/PlayWallPlugins/PlayWallPluginWebAPI/src/main/scala/de/tobias/playpad/plugin/api/websocket/methods/ProjectOpenMethod.scala
index 793bad02..150f1f5a 100644
--- a/PlayWallPlugins/PlayWallPluginWebAPI/src/main/scala/de/tobias/playpad/plugin/api/websocket/methods/ProjectOpenMethod.scala
+++ b/PlayWallPlugins/PlayWallPluginWebAPI/src/main/scala/de/tobias/playpad/plugin/api/websocket/methods/ProjectOpenMethod.scala
@@ -4,10 +4,8 @@ import java.util.UUID
 
 import com.google.gson.JsonObject
 import de.tobias.playpad.PlayPadPlugin
+import de.tobias.playpad.plugin.api.websocket.MethodExecutable
 import de.tobias.playpad.plugin.api.websocket.message.Message
-import de.tobias.playpad.plugin.api.websocket.serialize.ProjectSerializer
-import de.tobias.playpad.plugin.api.websocket.{MethodExecutable, WebSocketHandler}
-import de.tobias.playpad.project.loader.ProjectLoader
 import de.tobias.playpad.project.ref.ProjectReferenceManager
 import javafx.application.Platform
 import org.eclipse.jetty.websocket.api.Session
@@ -17,13 +15,7 @@ class ProjectOpenMethod extends MethodExecutable {
 		val requestedId = UUID.fromString(message.payload.get("id").getAsString)
 
 		val reference = ProjectReferenceManager.getProject(requestedId)
-		Platform.runLater(() => {
-			val project = new ProjectLoader(reference).load()
-
-			PlayPadPlugin.getInstance().openProject(project, _ => {
-				WebSocketHandler.sendResponse(session, message, ProjectSerializer.serializeProject(project))
-			})
-		})
+		Platform.runLater(() => PlayPadPlugin.getInstance().openProject(reference, null))
 		null
 	}
 }
-- 
GitLab