diff --git a/pdf-umbenenner-adapter-in-gui/src/main/java/de/gecheckt/pdf/umbenenner/adapter/in/gui/batchrun/GuiBatchRunCoordinator.java b/pdf-umbenenner-adapter-in-gui/src/main/java/de/gecheckt/pdf/umbenenner/adapter/in/gui/batchrun/GuiBatchRunCoordinator.java index e2d8a65..6793b90 100644 --- a/pdf-umbenenner-adapter-in-gui/src/main/java/de/gecheckt/pdf/umbenenner/adapter/in/gui/batchrun/GuiBatchRunCoordinator.java +++ b/pdf-umbenenner-adapter-in-gui/src/main/java/de/gecheckt/pdf/umbenenner/adapter/in/gui/batchrun/GuiBatchRunCoordinator.java @@ -193,6 +193,7 @@ public final class GuiBatchRunCoordinator { private void executeRun(Path configFilePath) { LOG.info("GUI-Verarbeitungslauf: Worker-Thread gestartet für Konfiguration {}.", configFilePath); + observerSummary.set(null); BatchRunProgressObserver observer = buildDispatchingObserver(); BatchRunCancellationToken token = cancellationRequested::get; GuiBatchRunLaunchOutcome outcome; diff --git a/pdf-umbenenner-adapter-in-gui/src/main/java/de/gecheckt/pdf/umbenenner/adapter/in/gui/batchrun/GuiBatchRunResultRow.java b/pdf-umbenenner-adapter-in-gui/src/main/java/de/gecheckt/pdf/umbenenner/adapter/in/gui/batchrun/GuiBatchRunResultRow.java index 6845116..d6dd5aa 100644 --- a/pdf-umbenenner-adapter-in-gui/src/main/java/de/gecheckt/pdf/umbenenner/adapter/in/gui/batchrun/GuiBatchRunResultRow.java +++ b/pdf-umbenenner-adapter-in-gui/src/main/java/de/gecheckt/pdf/umbenenner/adapter/in/gui/batchrun/GuiBatchRunResultRow.java @@ -59,16 +59,17 @@ public record GuiBatchRunResultRow( } /** - * Returns the status icon for this row, mirroring the specification. + * Returns the status icon for this row as a Basic Multilingual Plane character + * that renders reliably in JavaFX on Windows. * - * @return the corresponding emoji icon + * @return the corresponding status character */ public String statusIcon() { return switch (status) { - case SUCCESS -> "\u2705"; // ✅ - case FAILED_RETRYABLE -> "\u26A0\uFE0F"; // ⚠️ - case FAILED_PERMANENT -> "\u274C"; // ❌ - case SKIPPED -> "\u23ED\uFE0F"; // ⏭️ + case SUCCESS -> "\u2714"; // ✔ HEAVY CHECK MARK + case FAILED_RETRYABLE -> "\u26A0"; // ⚠ WARNING SIGN (no variation selector) + case FAILED_PERMANENT -> "\u2718"; // ✘ HEAVY BALLOT X + case SKIPPED -> "\u25BA"; // ► BLACK RIGHT-POINTING POINTER }; } } diff --git a/pdf-umbenenner-adapter-in-gui/src/main/java/de/gecheckt/pdf/umbenenner/adapter/in/gui/batchrun/GuiBatchRunTab.java b/pdf-umbenenner-adapter-in-gui/src/main/java/de/gecheckt/pdf/umbenenner/adapter/in/gui/batchrun/GuiBatchRunTab.java index 31e95f9..e98b1c0 100644 --- a/pdf-umbenenner-adapter-in-gui/src/main/java/de/gecheckt/pdf/umbenenner/adapter/in/gui/batchrun/GuiBatchRunTab.java +++ b/pdf-umbenenner-adapter-in-gui/src/main/java/de/gecheckt/pdf/umbenenner/adapter/in/gui/batchrun/GuiBatchRunTab.java @@ -28,6 +28,7 @@ import javafx.scene.control.ScrollPane; import javafx.scene.control.Tab; import javafx.scene.control.TableCell; import javafx.scene.control.TableColumn; +import javafx.scene.control.TableRow; import javafx.scene.control.TableView; import javafx.scene.control.TextArea; import javafx.scene.layout.BorderPane; @@ -295,6 +296,22 @@ public final class GuiBatchRunTab { TableColumn iconCol = new TableColumn<>("Status"); iconCol.setCellValueFactory(data -> new SimpleStringProperty(data.getValue().statusIcon())); iconCol.setPrefWidth(64); + iconCol.setCellFactory(col -> new TableCell() { + @Override + protected void updateItem(String icon, boolean empty) { + super.updateItem(icon, empty); + if (empty || icon == null) { + setText(null); + setStyle(null); + return; + } + setText(icon); + TableRow tableRow = getTableRow(); + GuiBatchRunResultRow data = tableRow != null ? tableRow.getItem() : null; + String color = data != null ? statusColor(data.status()) : "#000000"; + setStyle("-fx-text-fill: " + color + "; -fx-alignment: CENTER; -fx-font-size: 14;"); + } + }); TableColumn nameCol = new TableColumn<>("Originaldateiname"); nameCol.setCellValueFactory(data -> new SimpleStringProperty(data.getValue().originalFileName())); @@ -338,6 +355,15 @@ public final class GuiBatchRunTab { }); } + private static String statusColor(DocumentCompletionStatus status) { + return switch (status) { + case SUCCESS -> "#2e7d32"; + case FAILED_RETRYABLE -> "#e65100"; + case FAILED_PERMANENT -> "#c62828"; + case SKIPPED -> "#757575"; + }; + } + private static String formatDuration(Duration duration) { double seconds = duration.toMillis() / 1000.0; if (seconds < 10) { diff --git a/pdf-umbenenner-adapter-in-gui/src/test/java/de/gecheckt/pdf/umbenenner/adapter/in/gui/batchrun/GuiBatchRunCoordinatorTest.java b/pdf-umbenenner-adapter-in-gui/src/test/java/de/gecheckt/pdf/umbenenner/adapter/in/gui/batchrun/GuiBatchRunCoordinatorTest.java index 2f8b94c..ad66274 100644 --- a/pdf-umbenenner-adapter-in-gui/src/test/java/de/gecheckt/pdf/umbenenner/adapter/in/gui/batchrun/GuiBatchRunCoordinatorTest.java +++ b/pdf-umbenenner-adapter-in-gui/src/test/java/de/gecheckt/pdf/umbenenner/adapter/in/gui/batchrun/GuiBatchRunCoordinatorTest.java @@ -247,10 +247,10 @@ class GuiBatchRunCoordinatorTest { @Test void resultRowIcons_matchSpecification() { - assertEquals("\u2705", row(DocumentCompletionStatus.SUCCESS).statusIcon()); - assertEquals("\u26A0\uFE0F", row(DocumentCompletionStatus.FAILED_RETRYABLE).statusIcon()); - assertEquals("\u274C", row(DocumentCompletionStatus.FAILED_PERMANENT).statusIcon()); - assertEquals("\u23ED\uFE0F", row(DocumentCompletionStatus.SKIPPED).statusIcon()); + assertEquals("\u2714", row(DocumentCompletionStatus.SUCCESS).statusIcon()); + assertEquals("\u26A0", row(DocumentCompletionStatus.FAILED_RETRYABLE).statusIcon()); + assertEquals("\u2718", row(DocumentCompletionStatus.FAILED_PERMANENT).statusIcon()); + assertEquals("\u25BA", row(DocumentCompletionStatus.SKIPPED).statusIcon()); } @Test