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:
+19
@@ -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>
|
||||||
|
|||||||
+19
-18
@@ -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);
|
||||||
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user