diff --git a/pdf-umbenenner-adapter-in-gui/src/main/java/de/gecheckt/pdf/umbenenner/adapter/in/gui/FilePickerDialog.java b/pdf-umbenenner-adapter-in-gui/src/main/java/de/gecheckt/pdf/umbenenner/adapter/in/gui/FilePickerDialog.java new file mode 100644 index 0000000..01b517e --- /dev/null +++ b/pdf-umbenenner-adapter-in-gui/src/main/java/de/gecheckt/pdf/umbenenner/adapter/in/gui/FilePickerDialog.java @@ -0,0 +1,33 @@ +package de.gecheckt.pdf.umbenenner.adapter.in.gui; + +import java.util.List; + +import javafx.stage.FileChooser; + +/** + * Funktionales Interface fuer den Datei-Auswaehldialog der GUI. + *
+ * Kapselt die Abhaengigkeit zum nativen {@link FileChooser} in einem + * injizierbaren Hook, der in Tests durch eine einfache Lambda-Implementierung + * ersetzt werden kann. Die Standardimplementierung oeffnet einen echten + * nativen Datei-Dialog; Test-Stubs koennen einen festen Pfad zurueckgeben + * oder {@code null} simulieren (Abbrechen). + *
+ * Im Gegensatz zur frueheren {@code BiFunction}-Variante nimmt dieser Hook
+ * auch die Liste der {@link FileChooser.ExtensionFilter} entgegen, damit der
+ * native Dialog die Filter tatsaechlich anwenden kann.
+ */
+@FunctionalInterface
+interface FilePickerDialog {
+
+ /**
+ * Oeffnet den Datei-Auswaehldialog und gibt den ausgewaehlten absoluten
+ * Pfad zurueck.
+ *
+ * @param title der Titel des Dialogs
+ * @param initialPath der Anfangspfad als Hinweis; darf leer oder {@code null} sein
+ * @param filters Liste der Dateitypfilter; darf leer sein, aber nicht {@code null}
+ * @return der ausgewaehlte absolute Pfad als String, oder {@code null} wenn abgebrochen
+ */
+ String pick(String title, String initialPath, List
- * The default implementation opens a native {@link FileChooser}. Tests may replace
- * this with a lambda that returns a fixed string without opening a native dialog.
- *
- * Extension filters are applied by the default implementation only; test stubs bypass them.
+ * Die Standardimplementierung oeffnet einen nativen {@link FileChooser} und wendet die
+ * uebergebenen Filter an. Test-Stubs koennen die Filter ignorieren und einen festen Pfad
+ * zurueckgeben.
*/
- java.util.function.BiFunction
- * In production the hook delegates to a native {@link FileChooser}. In tests the hook
- * can be replaced with a lambda that returns a fixed string. Windows mapped drive letters
- * are preserved unchanged.
+ * In der Produktion delegiert der Hook an einen nativen {@link FileChooser} und wendet
+ * die uebergebenen Filter an. In Tests kann der Hook durch eine Lambda-Implementierung
+ * ersetzt werden, die einen festen Pfad zurueckgibt. Windows-Laufwerksbuchstaben
+ * (z. B. {@code S:\}) werden unveraendert weitergegeben.
*
- * @param title the dialog title
- * @param initialPath the pre-selected path text; may be empty or {@code null}
- * @param filters extension filters (only applied by the native default implementation)
- * @return the selected absolute path string, or {@code null} when the dialog was cancelled
+ * @param title der Titel des Datei-Dialogs
+ * @param initialPath der Anfangspfad als Hinweis; darf leer oder {@code null} sein
+ * @param filters Dateitypfilter, die im nativen Dialog angezeigt werden
+ * @return den ausgewaehlten absoluten Pfad, oder {@code null} wenn der Dialog abgebrochen wurde
*/
private String pickFile(String title, String initialPath,
FileChooser.ExtensionFilter... filters) {
- return filePickerDialog.apply(title, initialPath);
+ return filePickerDialog.pick(title, initialPath, List.of(filters));
}
/**
@@ -2500,22 +2500,30 @@ public final class GuiConfigurationEditorWorkspace {
}
/**
- * Default native file-chooser implementation used by {@link #filePickerDialog}.
+ * Standardimplementierung des nativen Datei-Auswaehldialogs fuer {@link #filePickerDialog}.
+ *
+ * Wendet alle uebergebenen Dateitypfilter auf den {@link FileChooser} an, bevor der Dialog
+ * geoeffnet wird.
*
- * @param title the dialog title
- * @param initialPath the initial path hint; may be empty or {@code null}
- * @return the selected absolute path string, or {@code null} when cancelled or unavailable
+ * @param title der Titel des Datei-Dialogs
+ * @param initialPath der Anfangspfad als Hinweis; darf leer oder {@code null} sein
+ * @param filters anzuwendende Dateitypfilter; darf leer, aber nicht {@code null} sein
+ * @return den ausgewaehlten absoluten Pfad, oder {@code null} wenn abgebrochen oder nicht verfuegbar
*/
- private String showNativeFileChooser(String title, String initialPath) {
+ private String showNativeFileChooser(String title, String initialPath,
+ List