- Prüfe ob XML- und XSL-Dateien existieren bevor TransformationJobs erstellt werden
- Zeige detaillierte Fehlermeldungen wenn Dateien fehlen
- Zähle und melde übersprungene Jobs bei Batch-Verarbeitung
- Verhindere mehrfache Fehlerdialoge durch zentrale Fehlerbehandlung
- Logge fehlende Dateien mit vollständigen Pfaden für einfaches Debugging
- AppSettings: Menü-Update nach jedem app_settings.save() Aufruf
- MainWindow: Prüfung der Projekt-Verzeichnis-Existenz beim Start
- Nur gültige Projekte werden im Menü angezeigt
- Ungültige Projekte werden ausgeblendet mit Logging-Warnung
- Memory-Leak-Prävention durch korrektes Aufräumen alter Menüs
- Erstelle generate_wix_files.py zum Ersetzen von 'wix heat'
- Migriere DocuMentor.wxs auf WiX v4/v6-Syntax
- Füge build_msi.py für automatisierten Build hinzu
- Aktualisiere Dokumentation für WiX v6
- Erweitere .gitignore für WiX-Artefakte
WiX v6 hat das 'heat' Tool entfernt, daher wurde ein Python-Skript
erstellt, das automatisch alle Dateien aus dist/DocuMentor harvested
und eine WiX-konforme ProductFiles.wxs generiert.
Der neue Build-Prozess:
1. uv run python build_windows.py
2. uv run python generate_wix_files.py
3. wix build DocuMentor.wxs ProductFiles.wxs -o DocuMentor.msi
Oder vereinfacht: uv run python build_msi.py
Beim Laden des Projekts werden nun auch XSL-Knoten automatisch deaktiviert (ausgegraut), wenn die entsprechende XSL-Datei nicht im XSL-Verzeichnis vorhanden ist.
Zusätzlich werden alle untergeordneten XML-Knoten ebenfalls deaktiviert, wenn die übergeordnete XSL-Datei fehlt. Dies verhindert, dass Transformationen mit fehlenden XSL-Dateien gestartet werden und gibt sofortige visuelle Rückmeldung.
- XSL-Knoten werden mit setDisabled(True) deaktiviert
- Tooltip zeigt den vollständigen Pfad der fehlenden XSL-Datei
- Alle untergeordneten XML-Knoten werden ebenfalls deaktiviert
- Warnung wird ins Log geschrieben
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Beim Laden des Projekts in den TreeWidget werden nun XML-Knoten automatisch deaktiviert (ausgegraut), wenn die entsprechende XML-Datei nicht im Projekt vorhanden ist. Dies verbessert die Benutzerfreundlichkeit durch sofortige visuelle Rückmeldung über fehlende Dateien.
- XML-Knoten werden mit setDisabled(True) deaktiviert
- Tooltip zeigt den vollständigen Pfad der fehlenden Datei
- Warnung wird ins Log geschrieben
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Beim Zurücksetzen der PDF-Ansicht wird nun auch der "Änderungen akzeptieren" Button deaktiviert, um einen konsistenten UI-Zustand zu gewährleisten.
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Beim Anwendungsstart werden nun automatisch Log-Dateien gelöscht, die älter als 24 Stunden sind. Dies hilft, Speicherplatz zu sparen und das Log-Verzeichnis übersichtlich zu halten.
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
- Neue Kontextmenü-Aktion "Ref-PDF öffnen" für XML-Dateien
- Aktion nur aktiv wenn Ref-PDF existiert und keine Diff-PDF vorhanden
- Öffnet Ref-PDF im System-PDF-Viewer via QDesktopServices
- Handler-Methode _open_ref_pdf_for_xml_file() mit Fehlerbehandlung
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Problem:
- Worker-Pools werden nach Transformation beendet (Lazy Loading)
- Metriken waren danach nicht mehr verfügbar
- Metriken-Dialog zeigte "Nicht aktiviert"
Lösung:
- Metriken werden vor Pool-Shutdown mit deepcopy() gespeichert
- MainWindow speichert last_saxon_metrics und last_fop_metrics
- WorkerPoolMetricsDialog zeigt gecachte Metriken an
- Neue Methode: _update_metrics_tab_from_metrics()
Verhalten:
- Metriken bleiben bis zur nächsten Transformation verfügbar
- Dialog zeigt "Letzte Transformation" statt "Aktiviert"
- Ohne Metriken: Hinweis "bitte erst eine Transformation durchführen"
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
RAM-Optimierung (Lazy Loading):
- Worker-Pools werden erst bei Transformation gestartet (nicht beim Projekt-Öffnen)
- Worker-Pools werden nach Transformation automatisch beendet
- RAM im Ruhezustand: 0 MB (vorher: ~1.2 GB)
- Temporäre Verzeichnisse werden sauber aufgeräumt
XSL-Stylesheet-Caching (Massive Performance-Steigerung):
- Saxon s9api: HashMap<String, XsltExecutable> Cache
- Saxon JAXP: HashMap<String, Templates> Cache
- Kompilierte Stylesheets werden pro Worker wiederverwendet
- Bei 82 Transformationen mit 8 XSL-Dateien:
* 1. Durchlauf: 8× Kompilierung
* Weitere 74×: Cache-Treffer (sehr schnell!)
Technische Details:
- Worker-Pool-Init verschoben von _on_project_opened zu _start_transformation
- Worker-Pool-Shutdown in _on_all_transformations_finished
- Java-seitiger HashMap-Cache für beide Saxon-Varianten
- Cache-Logging für Debugging
Perfekt für Dauerbetrieb im Hintergrund!
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Neue Metrik-Erfassung für Saxon- und FOP-Worker-Pools:
- Kompilierungszeit der Java-Worker-Klassen
- Worker-Startzeiten (Summe + Durchschnitt pro Worker)
- RAM-Verbrauch vor/nach Transformation (Summe + Durchschnitt)
- Automatische Berechnung der RAM-Zunahme in MB und Prozent
Technische Details:
- Neue WorkerPoolMetrics-Datenklasse in worker_metrics.py
- RAM-Messung via psutil (v7.2.1, neu hinzugefügt)
- Metriken für beide Saxon-Varianten (JAXP + s9api)
- WorkerPoolMetricsDialog mit Tab-basierter UI
- Menüeintrag "Projekt → Worker-Pool-Metriken"
Metriken werden automatisch erfasst:
- Bei Worker-Pool-Initialisierung (Kompilierung + Start)
- Vor erster Transformation (RAM-Baseline)
- Nach allen Transformationen (RAM-Endwert)
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Neuer Abschnitt "Anvisiertes Nutzungsszenario" erklärt:
- Einsatz in Flexnow für PDF-Dokumente (Urkunden, Zeugnisse, Bescheide)
- Struktur der ~100 verknüpften XSL-Dateien
- Typischer Entwicklungs-Workflow mit PDF-Diff-Prüfung
- Wichtigkeit von RAM-sparsamem Design
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Die JAXP-basierte SaxonWorkerPool-Implementierung ist nur für XSLT 1.0
vollständig spezifiziert und kann bei XSLT 2.0/3.0 zu fehlerhaften
Ausgaben führen.
Änderungen:
- Neue SaxonWorkerPoolS9Api-Klasse mit Saxon s9api für XSLT 2.0/3.0
- XsltVersion-Enum in conf.py (XSLT_1_0, XSLT_2_0_3_0)
- ComboBox in Performance-Einstellungen zur XSLT-Version-Auswahl
- MainWindow wählt automatisch richtige Worker-Pool-Variante
- Verbesserte Classpath-Behandlung und Fehlerbehandlung
Standard-Einstellung: XSLT 2.0/3.0 (s9api) - empfohlen für moderne Stylesheets
Fallback: XSLT 1.0 (JAXP) - verfügbar für Legacy-Stylesheets
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Performance-Einstellungen wurden vom separaten Menüeintrag in den
Programmeinstellungen-Dialog als eigener Tab verschoben:
- Neuer "Performance"-Tab in AppSettings.ui mit drei Konfigurationsbereichen:
• ThreadPoolExecutor: Worker-Anzahl (1-32, Standard: 8)
• SaxonWorkerPool: Toggle für persistente JVM-Prozesse
• FopWorkerPool: Toggle für persistente JVM-Prozesse
- AppSettings.py erweitert:
• _populate_performance_tab(): Lädt aktuelle Performance-Einstellungen
• accept(): Speichert Performance-Einstellungen in app_settings
- MainWindow.py bereinigt:
• _setup_performance_menu() entfernt
• _open_performance_settings() entfernt
• Separater Menüeintrag im Projekt-Menü entfernt
- AppSettings_ui.py mit pyside6-uic neu generiert
Vorteile: Alle Programmeinstellungen sind nun zentral an einem Ort
verfügbar, bessere Benutzererfahrung durch konsistente UI-Struktur.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Implementiert persistente JVM-Prozesse für Apache FOP analog zum bestehenden
SaxonWorkerPool-System. Eliminiert JVM-Startup-Overhead durch Wiederverwendung
von Worker-Prozessen.
Änderungen:
- Neues Modul fop_pool.py mit FopWorkerPool und Java Worker-Klasse
- Integration in transform.py mit automatischem Fallback auf subprocess
- GUI-Einstellungen für FOP Worker Pool (aktivieren/deaktivieren)
- Automatische Neuinitialisierung bei Einstellungsänderungen
- Konfiguration: use_fop_worker_pool in AppSettings (Standard: aktiviert)
Performance: 5-10x schnellere PDF-Generierung bei vielen kleinen PDFs durch
Wiederverwendung von FopFactory und Font-Caches.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Slider (Alpha und Zoom) werden erst aktiviert, wenn PDF geladen:
- Initial deaktiviert (disabled=false in UI)
- Automatische Aktivierung beim Laden von Diff-PDFs
- Automatische Deaktivierung beim Leeren des Viewers
Verbesserte Tooltips für bessere Benutzerführung:
- Alpha-Slider: "Blendet zwischen Referenz-PDF (links) und neuer PDF (rechts) um. Doppelklick setzt auf Mitte zurück."
- Zoom-Slider: "Vergrößert oder verkleinert die PDF-Ansicht (25% bis 300%). Doppelklick setzt auf 100% zurück."
Implementierung:
- MainWinddow.ui: enabled=false für beide Slider
- MainWindow.py: Aktivierung in _load_pdf_for_comparison()
- MainWindow.py: Deaktivierung in _clear_pdf_viewer()
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Neue Buttons im PDF-Vergleichs-Viewer:
- "Vorher (Referenz)" Button öffnet Referenz-PDF im System-PDF-Viewer
- "Nachher (Neu)" Button öffnet neue PDF im System-PDF-Viewer
- Beide Buttons sind initial deaktiviert
- Automatische Aktivierung beim Laden von Diff-PDFs
- Automatische Deaktivierung beim Leeren des Viewers
Implementierung:
- Neue Instanzvariablen: current_ref_pdf_path, current_new_pdf_path
- Handler-Methoden: _on_view_ref_pdf_clicked(), _on_view_new_pdf_clicked()
- QDesktopServices.openUrl() für plattformunabhängiges Öffnen
- Fehlerbehandlung und Logging
UI-Änderungen:
- Buttons in MainWinddow.ui hinzugefügt (view_ref_pdf, view_new_pdf)
- MainWinddow_ui.py automatisch generiert
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Projekt unter MIT License veröffentlicht:
- LICENSE-Datei mit MIT-Lizenztext
- LICENSES.md mit detaillierter Lizenzanalyse aller Dependencies
- THIRD_PARTY_LICENSES.txt mit allen verwendeten Bibliotheken
- README.md mit vollständiger Projektdokumentation
- pyproject.toml mit Lizenz-Metadaten aktualisiert
Lizenz-Übersicht:
- PySide6: LGPL-3.0/GPL-2.0/GPL-3.0 (kompatibel mit MIT)
- Pydantic, Polars, pyqtdarktheme: MIT
- PyArrow: Apache 2.0
- Saxon-HE: MPL-2.0 (externes Tool)
- Apache FOP: Apache 2.0 (externes Tool)
Keine Einschränkungen durch Dependencies - MIT License möglich.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Performance-Dialog erweitert um Checkbox zur Aktivierung/Deaktivierung des SaxonWorkerPool.
Benutzer können jetzt zwischen Worker-Pool (schnell, benötigt JDK) und Fallback-Modus (robust, nur JRE) wählen.
Änderungen:
- Neue Einstellung 'use_saxon_worker_pool' in AppSettings (Standard: aktiviert)
- Erweiterter Performance-Dialog mit zwei Sektionen (ThreadPoolExecutor + SaxonWorkerPool)
- Pool-Initialisierung prüft nun Einstellung vor Worker-Start
- Aktualisiertes Menü-Tooltip zeigt beide Einstellungen
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Fügt zusätzliche Sicherheitsprüfung hinzu, bevor project_dir verwendet wird:
- Verhindert AttributeError wenn self.project None ist
- Konsistent mit anderen Stellen im Code (Zeilen 2578, 3040, 3162)
- Behebt Pylance Type-Checking-Warnung
- Zeigt benutzerfreundliche Fehlermeldung statt Absturz
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Erweitert die Zusammenfassung nach Abschluss aller Transformationen um die Gesamtdauer:
- TransformationThread misst jetzt die Gesamtdauer aller Jobs
- Signal all_jobs_finished erweitert um total_duration Parameter
- Statusbar und MessageBox zeigen Gesamtdauer an (Format: "12.34s")
- Dauer wird sowohl bei Erfolg als auch bei Fehlern angezeigt
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Änderungen:
- XML-Batch-Processing in separaten Thread verlagert (XmlBatchProcessingThread)
• Verhindert UI-Freezing bei vielen XML-Dateien
• Hash-Berechnung, Duplikatserkennung und Dateikopieren asynchron
• Live Progress-Updates an Hauptthread
- Progressbar für XML-Batch-Verarbeitung in Statusbar
• Zeigt "X/Y Dateien" während Verarbeitung
• Aktueller Dateiname in Statusbar-Text
• Automatisches Verstecken nach Abschluss
- Progressbar für Transformationen in Statusbar hinzugefügt
• Zeigt "X/Y Jobs" während Transformation
• Live-Update nach jedem abgeschlossenen Job
• Funktioniert bei Erfolg und Fehlern
- Zusammenfassungsdialog am Ende statt einzelner Erfolgsdialoge
Technische Details:
- Neue Thread-Klasse mit Signalen für Progress-Updates
- Progressbar-Management-Methoden für beide Operationen
- Signal-Handler angepasst für Live-Updates
- Statistik-Sammlung für detaillierten Zusammenfassungsdialog
UX-Verbesserungen:
- UI bleibt während Verarbeitung reaktionsfähig
- Benutzer sieht Gesamtfortschritt in Echtzeit
- Kein wiederholtes Klicken auf OK-Dialoge mehr
- Transparente Anzeige laufender Operationen
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
- Checkbox 'Alle XML-Dateien zuordnen' im XmlToXslAssignDialog hinzugefügt
- Bei aktivierter Checkbox wird Dialog nur einmal angezeigt und Auswahl auf alle weiteren Dateien angewendet
- Einzelne Erfolgsdialoge durch einen zusammenfassenden Dialog ersetzt
- Zusammenfassungsdialog zeigt detaillierte Statistiken:
• Anzahl neu hinzugefügter Dateien
• Anzahl bereits vorhandener Dateien (Hash-Duplikate)
• Anzahl bereits zugeordneter Dateien
• Liste umbenannter Dateien
• Fehlerberichte falls aufgetreten
- Deutliche Verbesserung der UX: Bei 30 Dateien nur 1 Dialog statt 30
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Beim Durchführen von Transformationen werden jetzt die betroffenen XML-Knoten im Baum automatisch geöffnet und sichtbar gemacht, damit der Benutzer den Fortschritt besser verfolgen kann.
Änderungen:
- Neue Hilfsmethode _expand_tree_item_parents() zum rekursiven Öffnen aller Eltern-Knoten
- _on_transformation_job_started() erweitert um Auto-Expand und Scroll-to-Item
- Verbesserte Log-Meldung für besseres Debugging
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Verbessert die Fehlerbehandlung und Code-Robustheit durch:
- Explizite bool()-Konvertierung für has_xml_files (Zeile 894)
- Frühere Initialisierung von pdf_basename für Exception-Handler (Zeile 3717)
- Null-Checks für self.project/project_dir mit Fallback-Logik (Zeile 3741)
Verhindert potenzielle AttributeError und UnboundLocalError.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Änderungen:
- Diff-PDFs werden automatisch im Viewer geladen wenn XML-Knoten ausgewählt wird
- Viewer wird geleert wenn Knoten ohne Diff-PDF ausgewählt wird
- Diff-Icon ist nicht mehr klickbar, dient nur noch als visueller Indikator
- Tree-Selection-Handler (_on_tree_selection_changed) implementiert
- XSL-ID wird nun auch in XML-Items gespeichert für direkten Zugriff
- Debug-Logging hinzugefügt für bessere Fehlersuche
Verhalten:
- Nutzer kann durch den Baum navigieren
- Bei Auswahl eines XML-Knotens mit Diff-PDF: automatisches Laden
- Bei Auswahl eines Knotens ohne Diff-PDF: Viewer leeren
- Tooltip angepasst: "Diff-PDF vorhanden (wird automatisch geladen bei Selektion)"
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Problem:
Unter Windows trat Fehler [WinError 32] auf beim Versuch, ref-PDFs zu
löschen/verschieben, da Dateien von QPdfDocument-Instanzen gesperrt waren.
Lösung:
- Neue Methode _close_all_pdf_documents() zum expliziten Schließen aller PDFs
- Schließt QPdfDocument-Instanzen und löscht alle Referenzen
- Erzwingt Garbage Collection zur Freigabe von Dateihandles
- Leert UI-Layouts und verarbeitet Qt-Events vor Dateioperationen
- QApplication.processEvents() stellt sicher, dass Widgets/Ressourcen
wirklich freigegeben werden
Unter Linux war das Problem nicht aufgetreten, da dort geöffnete Dateien
gelöscht werden können.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
- Project-Modell um optionales fop_config_dir Feld erweitert
- TransformationJob verwendet nun projektspezifischen FOP-Config-Pfad
- Saxon und FOP stdout/stderr werden nun im Debug-Level geloggt
- UI-Elemente für FOP-Config-Ordner-Auswahl hinzugefügt
- AppSettings und MainWindow unterstützen neues Feld beim Laden/Speichern
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Erweitert den Classpath-Mechanismus, sodass JAR-Dateien aus dem lib-Unterverzeichnis des Saxon-Ordners automatisch eingebunden werden. Dies behebt den NoClassDefFoundError für org.xmlresolver.Resolver.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Die Funktion _load_images() war Legacy-Code aus der Entwicklungsphase und versuchte PDFs aus einem nicht existierenden Verzeichnis (ui/res/pdf/) zu laden. Die tatsächliche PDF-Anzeige erfolgt über _load_pdf_for_comparison(), die PDFs aus dem Projekt-Verzeichnis lädt.
Entfernt:
- _load_images() Funktion (144 Zeilen)
- Aufruf in __init__()
- Ungenutzte Imports: glob, os
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Alle print()-Statements in MainWindow.py (~88) und XmlToXslAssignDialog.py (5) wurden durch passende Logger-Aufrufe ersetzt. Die Log-Level (debug, info, warning, error) wurden entsprechend der Nachrichtenart gewählt. XmlToXslAssignDialog.py erhielt zudem einen Logger-Import.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Das Icon zum Laden von Diff-PDFs verwendet jetzt semantisch korrekte Icons:
- Primär: view-split-left-right (zeigt Split-View-Konzept)
- Fallback: vcs-diff (universelles Diff-Symbol)
- Letzter Fallback: system-search
Dies verbessert die visuelle Semantik und Plattform-Kompatibilität.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Neue Kontextmenü-Funktionalität zum Batch-Akzeptieren von Diff-PDFs:
- Neue Aktion "Alle Änderungen übernehmen" für TreeNode und XslFile
- Wird nur aktiviert, wenn mindestens eine Diff-PDF unter dem Knoten existiert
- Akzeptiert alle Diff-PDFs unter dem ausgewählten Knoten mit einem Klick
Verhalten:
- Verschiebt alle new-PDFs nach ref (alte ref-PDFs werden gelöscht)
- Löscht alle diff-PDFs
- Entfernt Diff-Icons bei allen betroffenen XML-Knoten
- Aktualisiert Diff-PDF-Zähler auf allen übergeordneten Ebenen
- Zeigt Bestätigungsdialog mit Anzahl der zu akzeptierenden Änderungen
- Zeigt Erfolgsmeldung nach Abschluss
Viewer-Behandlung:
- KEINE Diff-PDF wird in den Viewer geladen
- Falls eine akzeptierte Diff-PDF gerade im Viewer angezeigt wird, wird der Viewer geleert
- Kein XML-Knoten wird im TreeWidget ausgewählt
Bugfixes:
- XSL-ID wird korrekt als "2002_1_128" statt "(2002, 1, 128)" formatiert
- Relative Pfade werden für xml_item_map verwendet (statt absolute Pfade)
- Diff-Icons werden jetzt korrekt entfernt
Implementierungsdetails:
- _collect_all_diff_pdfs_under_node(): Sammelt alle Diff-PDFs unter TreeNode oder XslFile
- _accept_single_diff_pdf(): Akzeptiert eine einzelne Diff-PDF ohne Viewer-Update
- _accept_all_changes_under_node(): Handler für Batch-Accept-Operation
- Kontextmenü-Integration in _create_context_menu_for_type()
- Logging-Konfiguration in main.py hinzugefügt (DEBUG-Level)
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
UI-Redesign für TreeNodeEditDialog und XslFileEditDialog:
- XSLT-Parameter-Tabellen werden jetzt nebeneinander angezeigt
- Eigene Parameter (editierbar) links, geerbte Parameter (read-only) rechts
- Bessere Übersicht durch direkten visuellen Vergleich
- Fensterbreite auf ~870px erhöht für optimale Darstellung
- Icons für Hinzufügen/Entfernen-Buttons hinzugefügt
- Kompakteres Layout durch reduzierte Margins
Neue Funktionalität: Force-Transformation nach Bearbeitung
- Neue CheckBox "Alle XML-Dateien neu transformieren (force)" in beiden Dialogen
- Beim Schließen mit OK werden alle untergeordneten XML-Dateien transformiert
- TreeNodeEditDialog: Transformiert rekursiv alle XML-Dateien unter dem Knoten
- XslFileEditDialog: Transformiert alle XML-Dateien der XSL-Datei
- Transformation erfolgt auch bei bereits aktuellem Output (force=True)
Implementierungsdetails:
- TreeNodeEditDialog.get_data() gibt jetzt force_transform zurück
- XslFileEditDialog.get_data() gibt jetzt force_transform zurück
- MainWindow._find_item_by_node() findet Item nach TreeWidget-Neuladen
- MainWindow._edit_tree_node() startet Force-Transformation bei Bedarf
- MainWindow._edit_xsl_file() startet Force-Transformation bei Bedarf
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Neuer Button zum Akzeptieren von PDF-Änderungen mit automatischem Workflow:
- Verschiebt new-PDF nach ref (alte ref-PDF wird gelöscht)
- Löscht diff-PDF
- Entfernt Diff-Icon beim aktuellen XML-Knoten
- Aktualisiert Diff-PDF-Anzahl auf übergeordneten Ebenen
- Lädt automatisch nächste Diff-PDF oder leert Viewer falls keine mehr vorhanden
- Wählt den entsprechenden XML-Knoten im Baum aus für visuelle Rückmeldung
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>