- 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>
Fenstergeometrie, Splitter-Positionen und TreeWidget-Spaltenbreiten werden jetzt in der Konfiguration gespeichert und beim nächsten Start automatisch wiederhergestellt.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Fix für zwei Probleme:
1. Icons fehlten beim ersten Transformationsdurchlauf via TreeNode
2. Icons fehlten direkt nach Projektladen
Lösung:
- _update_diff_icons_for_existing_pdfs() in _load_nodes_to_tree() hinzugefügt
- _update_diff_icons_for_existing_pdfs() in _on_all_transformations_finished() hinzugefügt
- Doppelten Aufruf in open_existing_project() entfernt
Icons werden jetzt zuverlässig aktualisiert nach:
- Projektladen
- Jeder Transformation (einzeln oder via TreeNode)
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Zeigt die Anzahl der untergeordneten Diff-PDF-Dateien in der dritten Spalte
des TreeWidgets für TreeNode und XslFile Knoten (nicht für XML-Dateien).
Neue Funktionen:
- _count_diff_pdfs_under_node(): Zählt rekursiv existierende Diff-PDFs
- _update_diff_pdf_counts_recursive(): Aktualisiert Anzahl in Spalte 2
- _update_all_diff_pdf_counts(): Aktualisiert alle Knoten im TreeWidget
Automatische Aktualisierung:
- Nach jeder Transformation (_on_all_transformations_finished)
- Beim Laden eines Projekts (_load_nodes_to_tree)
- Initial beim Erstellen der Tree-Items
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Die beiden Transformations-Menüpunkte im XslFile-Kontextmenü werden jetzt nur
aktiviert, wenn mindestens eine XML-Datei zugeordnet ist.
Änderungen:
- Prüfung auf vorhandene XML-Dateien (bool(xsl_file_obj.xmls))
- setEnabled(has_xml_files) für beide Transformations-Aktionen
- Analog zur TreeNode-Implementierung
Fix: Explizite bool()-Konvertierung, da xmls eine Liste ist
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Neue Funktionalität:
- TreeNode-Kontextmenü hat jetzt "Alle XML-Dateien transformieren" Aktionen
- Beide Aktionen (normal und force) transformieren rekursiv alle untergeordneten XML-Dateien
- Menüpunkte sind nur aktiv, wenn mindestens eine XML-Datei vorhanden ist
Implementierung:
- _has_xml_files_recursive(): Prüft rekursiv auf vorhandene XML-Dateien
- _collect_all_xsl_xml_pairs_recursive(): Sammelt alle XSL/XML-Paare im Teilbaum
- _transform_tree_node(): Transformiert alle gefundenen XML-Dateien
- Kontextmenü erweitert mit intelligenter Aktivierung/Deaktivierung
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Ändert die Ausrichtung von zentriert zu linksbündig in der dritten Spalte
des TreeWidgets für bessere Übersichtlichkeit.
Änderungen:
- _create_centered_progress_bar(): AlignCenter → AlignLeft
- _create_centered_diff_icon(): AlignCenter → AlignLeft
- Docstrings aktualisiert
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Fixes:
- fullsize_label wird nach _clear_layout korrekt auf None gesetzt
- Verhindert, dass beim zweiten PDF-Laden kein Widget erstellt wird
- RuntimeError-Handling für gelöschte C++-Widgets in update_current_display()
- Verbessertes Error-Logging mit logger.error() statt print()
Problem: Nach dem ersten PDF-Laden wurden weitere PDFs nicht mehr angezeigt,
da fullsize_label auf ein gelöschtes Widget zeigte und kein neues erstellt wurde.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
XML-Transformationen berücksichtigen jetzt alle XSLT-Parameter der übergeordneten
TreeNodes, nicht nur die des direkten XslFile-Knotens. Tiefere Ebenen überschreiben
höhere Ebenen (XslFile hat höchste Priorität).
Änderungen:
- _collect_parent_params(): Bug-Fix für korrekte Prioritätsreihenfolge
- _create_transformation_job(): Hierarchische Parameter-Sammlung mit TreeWidgetItem-Kontext
- _transform_xml_file() und _transform_xsl_file(): Weitergabe des TreeWidgetItem-Kontexts
- Verbessertes Logging mit logger statt print()
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Der PDF-Vergleich im integrierten Viewer wird jetzt durch einen einfachen
Klick auf das Diff-Icon geladen, nicht mehr durch Doppelklick.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Zusätzliche Sicherheitsprüfungen für path_to_binary_file, path_to_jar_file,
path_to_dir und path_to_root_dir Attribute, um NoneType-Fehler zu vermeiden.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Das Diff-PDF-Icon lädt nun alle drei PDFs (diff, ref, new) direkt in den eingebauten Vergleichs-Viewer, statt ein externes Programm zu öffnen. Zusätzlich wurde die Alpha-Blending-Logik für sanftere Übergänge zwischen den Ansichten korrigiert.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Neue Features:
- Progress Bar in Spalte 2 während XML-Transformationen
- Diff-PDF-Icon erscheint nach Transformation bei vorhandener Diff-PDF
- Doppelklick auf Icon öffnet Diff-PDF mit System-Viewer
- Initial-Laden von Icons für existierende Diff-PDFs beim Projektstart
Technische Implementierung:
- XML-Item-Mapping mit eindeutigem Key-Format: "xml_path|xsl_id"
- Unterstützt mehrfache Verwendung derselben XML bei verschiedenen XSL-Dateien
- TransformationThread-Signale erweitert um XSL-ID-Parameter
- Widget-Factory-Methoden für zentrierte Progress Bar und klickbare Icons
- Result-Dictionary in transform.py enthält jetzt xsl_id
UI-Anpassungen:
- TreeWidget Spaltenanzahl von 2 auf 3 erhöht
- setItemWidget() für dynamische Widget-Verwaltung in Spalte 2
Dateien:
- src/ui/MainWindow.py: Hauptimplementierung mit Signal-Handlern
- src/transform.py: xsl_id im Result-Dictionary
- src/ui/MainWinddow.ui: Spalte 3 hinzugefügt
- src/ui/MainWinddow_ui.py: Auto-generiert aus UI-Datei
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
- 'any' zu 'Any' korrigiert (korrekter Import von typing)
- 'tuple' zu 'tuple | None' für optionale Parameter
- Import von typing.Any hinzugefügt
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Die PDF-Generierung verwendet nun die Ordner 'new', 'ref' und 'diff'
anstelle von 'output', 'valide' und 'diff'. Dies ermöglicht die
Integration mit MainWindow._load_images(), die PDFs in den Ordnern
'new', 'ref' und 'diff' sucht.
Änderungen:
- output_dir → new_dir (für neu generierte PDFs)
- valide_dir → ref_dir (für Referenz-PDFs)
- Alle Variablen und Log-Meldungen entsprechend angepasst
- Unused import entfernt (typing.Optional)
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Wenn eine XML-Datei mehreren XSL-Dateien zugeordnet ist, wurden die
generierten PDFs bisher überschrieben. Jetzt wird die XSL-ID in den
Dateinamen integriert (z.B. rechnung_xsl_1.pdf, rechnung_xsl_2.pdf),
sodass jede Transformation ihre eigene PDF-Datei erhält.
Änderungen:
- TransformationJob: xsl_id Parameter hinzugefügt
- Dateinamen-Generierung berücksichtigt XSL-ID (Tuple → String)
- MainWindow: XSL-ID wird an TransformationJob übergeben
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Ergänzt umfassende Existenzprüfungen für pdf_project, project und nodes-Attribute
vor dem Zugriff, um NoneType-Fehler zu vermeiden. Verbessert die Robustheit der
Anwendung bei nicht initialisierten Projekten.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Implementiert automatische Erkennung von XML-Datei-Duplikaten basierend auf blake2b-Hashes. Bei Hash-Match wird die vorhandene Datei automatisch zugeordnet statt sie zu kopieren. Bei Dateinamen-Konflikten werden alternative Namen (datei_1.xml, datei_2.xml, etc.) mit Auswahl-Dialog angeboten.
Neue Features:
- Projekt-weite Hash-Duplikatserkennung
- Automatische Zuordnung vorhandener Dateien bei Hash-Match
- Alternative Dateinamen-Generierung mit Benutzer-Dialog
- Performance-Optimierung durch Set-basierte Dateinamen-Prüfung
- Umfassende Dokumentation und Test-Suite
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
- CLAUDE.md: Deutsche Sprachanweisung am Anfang hinzugefügt
- src/main.py: Auskommentierten qdarktheme Code entfernt (Import und Setup)
- Verbessert Code-Qualität durch Entfernen von totem Code
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
- CLAUDE.md mit umfassender Projektdokumentation für Claude Code hinzugefügt
- Beschreibt Architektur, Datenmodelle, UI-Muster und Entwicklungsworkflows
- Konfigurationspfad-Verarbeitung in src/conf.py robuster gemacht:
- os.path durch pathlib.Path ersetzt
- Validierung für Schreibrechte und Verzeichnisexistenz hinzugefügt
- Besseres Error-Handling mit sys.exit(1) bei fehlenden Berechtigungen
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>