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 889ce1f..af9523b 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 @@ -84,14 +84,11 @@ import javafx.scene.layout.VBox; * │ Ergebnisliste (60%) │ Detailbereich (40%) │ * │ (TableView + Checkboxen) │ KI-Begründung (kompakt) │ * │ │ Dateiname-Editor │ - * │ │ PDF-Vorschau (Restplatz) │ - * ├───────────────────────────┴──────────────────────────────┤ - * │ [Erneut verarbeiten] [Status zurücksetzen] │ - * ├──────────────────────────────────────────────────────────┤ - * │ Meldungs- und Zusammenfassungsbereich │ - * ├──────────────────────────────────────────────────────────┤ - * │ [Starten] [Abbrechen] │ - * └──────────────────────────────────────────────────────────┘ + * ├───────────────────────────┤ PDF-Vorschau (Restplatz) │ + * │ [Erneut ver.] [Zurückset.]│ │ + * │ Meldungsbereich │ │ + * └───────────────────────────┴──────────────────────────────┘ + * [Starten] [Abbrechen] * * *

Threading

@@ -490,11 +487,31 @@ public final class GuiBatchRunTab { tableScroll.setId("batch-run-result-scroll"); resultTable.setMinHeight(LIST_MIN_HEIGHT); - // Detailbereich: KI-Begründung oben (kompakt), darunter Dateiname-Editor, - // darunter PDF-Vorschau (nimmt verbleibenden Platz) + // Selektions-Aktions-Buttons unterhalb der Tabelle (linke Spalte) + reprocessButton.setId("batch-run-reprocess"); + reprocessButton.setOnAction(event -> handleReprocessSelected()); + + resetStatusButton.setId("batch-run-reset-status"); + resetStatusButton.setOnAction(event -> handleResetSelected()); + + HBox selectionButtonBar = new HBox(SECONDARY_SPACING, reprocessButton, resetStatusButton); + selectionButtonBar.setAlignment(Pos.CENTER_LEFT); + selectionButtonBar.setPadding(new Insets(SECONDARY_SPACING / 2, 0, 0, 0)); + + // Meldungsbereich unterhalb der Selektions-Buttons (linke Spalte) + messageArea.setId("batch-run-message-area"); + messageArea.setEditable(false); + messageArea.setWrapText(true); + messageArea.setPrefRowCount(3); + + // Linke Spalte: Tabelle wächst, Buttons und Meldungsbereich darunter + VBox leftColumn = new VBox(0, tableScroll, selectionButtonBar, messageArea); + VBox.setVgrow(tableScroll, Priority.ALWAYS); + + // Detailbereich rechts erstreckt sich vollständig von oben bis unten VBox detailBox = buildDetailPane(); - SplitPane splitPane = new SplitPane(tableScroll, detailBox); + SplitPane splitPane = new SplitPane(leftColumn, detailBox); splitPane.setId("batch-run-split-pane"); splitPane.setDividerPositions(SPLIT_DIVIDER_POSITION); SplitPane.setResizableWithParent(detailBox, true); @@ -920,22 +937,6 @@ public final class GuiBatchRunTab { // ------------------------------------------------------------------------- private Region buildFooter() { - messageArea.setId("batch-run-message-area"); - messageArea.setEditable(false); - messageArea.setWrapText(true); - messageArea.setPrefRowCount(3); - - // Selektions-Aktions-Buttons - reprocessButton.setId("batch-run-reprocess"); - reprocessButton.setOnAction(event -> handleReprocessSelected()); - - resetStatusButton.setId("batch-run-reset-status"); - resetStatusButton.setOnAction(event -> handleResetSelected()); - - HBox selectionButtonBar = new HBox(SECONDARY_SPACING, reprocessButton, resetStatusButton); - selectionButtonBar.setAlignment(Pos.CENTER_LEFT); - selectionButtonBar.setPadding(new Insets(SECONDARY_SPACING, 0, 0, 0)); - // Lauf-Steuerungs-Buttons startButton.setId("batch-run-start"); startButton.setOnAction(event -> handleStart()); @@ -948,8 +949,7 @@ public final class GuiBatchRunTab { runButtonBar.setAlignment(Pos.CENTER_LEFT); runButtonBar.setPadding(new Insets(SECONDARY_SPACING / 2, 0, 0, 0)); - VBox footer = new VBox(SECONDARY_SPACING / 2, selectionButtonBar, messageArea, runButtonBar); - return footer; + return runButtonBar; } // ------------------------------------------------------------------------- diff --git a/pdf-umbenenner-adapter-in-gui/src/main/java/de/gecheckt/pdf/umbenenner/adapter/in/gui/batchrun/PdfPreviewPane.java b/pdf-umbenenner-adapter-in-gui/src/main/java/de/gecheckt/pdf/umbenenner/adapter/in/gui/batchrun/PdfPreviewPane.java index 7e0fde0..7d9c670 100644 --- a/pdf-umbenenner-adapter-in-gui/src/main/java/de/gecheckt/pdf/umbenenner/adapter/in/gui/batchrun/PdfPreviewPane.java +++ b/pdf-umbenenner-adapter-in-gui/src/main/java/de/gecheckt/pdf/umbenenner/adapter/in/gui/batchrun/PdfPreviewPane.java @@ -11,8 +11,6 @@ import org.apache.logging.log4j.Logger; import com.dlsc.pdfviewfx.PDFView; import javafx.application.Platform; -import javafx.beans.value.ChangeListener; -import javafx.beans.value.ObservableValue; import javafx.geometry.Insets; import javafx.geometry.Pos; import javafx.scene.Node; @@ -20,7 +18,6 @@ import javafx.scene.control.Button; import javafx.scene.control.Label; import javafx.scene.control.ProgressIndicator; import javafx.scene.control.ScrollPane; -import javafx.scene.input.ScrollEvent; import javafx.scene.layout.HBox; import javafx.scene.layout.Priority; import javafx.scene.layout.Region; @@ -30,16 +27,15 @@ import javafx.scene.layout.VBox; /** * Detailbereich-Komponente zur asynchronen Anzeige von Seiten einer Quelldatei. * - *

Die Komponente zeigt die Seiten einer PDF-Datei mit Seitennavigation an. - * Das Laden erfolgt auf einem Hintergrund-Worker-Thread; UI-Updates laufen - * ausschließlich über den JavaFX Application Thread. + *

Die Komponente zeigt eine einzelne Seite der PDF-Datei vollständig eingepasst + * (fit-to-view) an. Das Laden erfolgt auf einem Hintergrund-Worker-Thread; UI-Updates + * laufen ausschließlich über den JavaFX Application Thread. Nach dem Laden wird das + * Seitenverhältnis asynchron ermittelt und der Zoom so gesetzt, dass die Seite ohne + * Scrollbalken vollständig sichtbar ist. Bei Größenänderungen der Anzeigefläche wird + * der Zoom automatisch neu berechnet. * - *

PDFView übernimmt intern das Rendern und die Darstellung. Diese Komponente - * steuert Laden, Fehlerbehandlung und den Ladeindikator. - * - *

Beim Selektionswechsel wird eine neue Lade-Anforderung ausgelöst. Es gilt das - * Prinzip „Latest Preview Request Wins": Veraltete Lade-Ergebnisse werden - * verworfen, sobald eine neue Anforderung eingeht. + *

Es gilt das Prinzip „Latest Preview Request Wins": Veraltete Lade-Ergebnisse + * werden verworfen, sobald eine neue Anforderung eingeht. * *

Fehlerfälle

*