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,24 +196,25 @@ 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 -> { // Use Case dynamisch über den Workspace lesen, weil der Scheduler erst
if (uc.getStatus().state().isActive()) { // nach erfolgreichem Datei-Öffnen (z. B. Auto-Load) verdrahtet wird und
event.consume(); // damit nicht zwingend im unveränderlichen GuiStartupContext steht.
Alert alert = new Alert(Alert.AlertType.INFORMATION); if (workspace.isSchedulerActive()) {
alert.setTitle("Anwendung kann nicht beendet werden"); event.consume();
alert.setHeaderText(null); Alert alert = new Alert(Alert.AlertType.INFORMATION);
alert.setContentText( alert.setTitle("Anwendung kann nicht beendet werden");
"Ein Lauf ist aktiv oder der Scheduler läuft.\n" alert.setHeaderText(null);
+ "Bitte beende den Scheduler bzw. warte auf das Ende des Laufs."); alert.setContentText(
alert.showAndWait(); "Ein Lauf ist aktiv oder der Scheduler läuft.\n"
return; + "Bitte beende den Scheduler bzw. warte auf das Ende des Laufs.");
} alert.showAndWait();
if (existingHandler != null) { return;
existingHandler.handle(event); }
} if (existingHandler != null) {
}); existingHandler.handle(event);
}
}); });
} }