Bugfix: Scheduler-Close-Guard liest Use Case dynamisch

installSchedulerCloseGuard hat den Scheduler-Use-Case bisher nur einmalig
aus dem unveraenderlichen GuiStartupContext gelesen. Bei normalem
GUI-Start ohne --config war dieser Optional leer; der nach dem Auto-Load
verdrahtete Use Case wurde nicht erfasst und der Close-Guard griff nie.

Der Close-Handler wird jetzt unabhaengig vom Startup-Context installiert
und liest den Aktiv-Status zur Laufzeit ueber den Workspace, der den im
GuiSchedulerTab live verdrahteten Use Case kennt.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
2026-05-07 13:27:51 +02:00
parent 1ea6465584
commit 8b963adb4f
2 changed files with 38 additions and 18 deletions
@@ -1174,6 +1174,25 @@ public final class GuiConfigurationEditorWorkspace {
.ifPresent(uc -> onSchedulerStatusRefresh(uc.getStatus())); .ifPresent(uc -> onSchedulerStatusRefresh(uc.getStatus()));
} }
/**
* Prüft, ob der aktuell verdrahtete Scheduler-Use-Case in einem aktiven
* Zustand (Zustand != {@code STOPPED}) ist.
* <p>
* Liest den Use Case dynamisch aus dem {@link GuiSchedulerTab}, damit auch
* der nach erfolgreichem Datei-Öffnen erst zur Laufzeit verdrahtete Use Case
* erfasst wird. Ist kein Use Case verdrahtet, wird {@code false} zurückgegeben.
* <p>
* Muss auf dem JavaFX Application Thread aufgerufen werden.
*
* @return {@code true}, wenn ein Use Case verdrahtet ist und sein Zustand
* als aktiv gilt; sonst {@code false}
*/
public boolean isSchedulerActive() {
return schedulerTab.currentSchedulerUseCase()
.map(uc -> uc.getStatus().state().isActive())
.orElse(false);
}
/** /**
* Aktualisiert den Sperr-Zustand des Konfig-Tabs anhand des aktuellen Scheduler-Status. * Aktualisiert den Sperr-Zustand des Konfig-Tabs anhand des aktuellen Scheduler-Status.
* <p> * <p>
@@ -196,10 +196,12 @@ public class PdfUmbenennerGuiApplication extends Application {
* @param stage das primäre Fenster; darf nicht {@code null} sein * @param stage das primäre Fenster; darf nicht {@code null} sein
*/ */
private void installSchedulerCloseGuard(Stage stage) { private void installSchedulerCloseGuard(Stage stage) {
guiStartupContext.schedulerControlUseCase().ifPresent(uc -> {
EventHandler<WindowEvent> existingHandler = stage.getOnCloseRequest(); EventHandler<WindowEvent> existingHandler = stage.getOnCloseRequest();
stage.setOnCloseRequest(event -> { stage.setOnCloseRequest(event -> {
if (uc.getStatus().state().isActive()) { // Use Case dynamisch über den Workspace lesen, weil der Scheduler erst
// nach erfolgreichem Datei-Öffnen (z. B. Auto-Load) verdrahtet wird und
// damit nicht zwingend im unveränderlichen GuiStartupContext steht.
if (workspace.isSchedulerActive()) {
event.consume(); event.consume();
Alert alert = new Alert(Alert.AlertType.INFORMATION); Alert alert = new Alert(Alert.AlertType.INFORMATION);
alert.setTitle("Anwendung kann nicht beendet werden"); alert.setTitle("Anwendung kann nicht beendet werden");
@@ -214,7 +216,6 @@ public class PdfUmbenennerGuiApplication extends Application {
existingHandler.handle(event); existingHandler.handle(event);
} }
}); });
});
} }
/** /**