URLs in der Spalte "Webseite" werden als anklickbare Links dargestellt,
die sich im Standardbrowser öffnen.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
vis.js rendert String-Titles als Klartext. Node-Titles werden nun vor der
DataSet-Erstellung in DOM-Elemente konvertiert, damit HTML-Tags (<b>, <br>)
korrekt dargestellt werden.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Layout-Umschaltung zwischen barnesHut, ForceAtlas2, Repulsion und hierarchischem
Layout mit konfigurierbaren Parametern pro Layout. Einstellungen werden persistent
in AppSettings gespeichert und beim Öffnen des Dialogs wiederhergestellt.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Neuer Skill prüft bei jedem Commit automatisch ob THIRD_PARTY_LICENSES.txt
mit pyproject.toml synchron ist. Fehlenden lxml-Eintrag ergänzt und
Kategorie-Spalte im AboutDialog verbreitert.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Neues Menü "Hilfe > Info" zeigt Programmversion, Python-Version und alle
Drittanbieter-Bibliotheken mit installierten Versionen und Lizenzinfos an.
Der license_parser liest THIRD_PARTY_LICENSES.txt als Datenquelle und
ergänzt tatsächlich installierte Versionen via importlib.metadata.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
installer.iss hatte noch Version 0.1.0 statt 1.0.0. Neuer Skill fragt
bei jedem Commit, ob die Programmversion aktualisiert werden soll.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Ein-/ausblendbare Sidebar mit tab-übergreifender Suche hinzugefügt
- Graph-Suchfilter blendet nicht-betroffene XSL-Dateien aus dem Netzwerkgraph aus
- Regex-basierte XSL-Abhängigkeitserkennung durch lxml-Parser ersetzt
- Suchfilter wird beim Tab-Wechsel erneut angewendet
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Gesamte Windows-Distribution-Dokumentation (ZIP, Setup.exe, MSI) in BUILD.md
zusammengeführt. docs/windows_distribution.md entfernt, da redundant.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
XslDependencyDialog mit zwei Tabs: Baumansicht (vorwärts/rückwärts-Abhängigkeiten)
und interaktiver Netzwerkgraph (vis.js in QWebEngineView mit Physics-Simulation,
Hover-Tooltips, Nachbar-Hervorhebung). Graceful Fallback wenn WebEngine fehlt.
THIRD_PARTY_LICENSES um psutil, PyInstaller, Pillow, vis-network ergänzt und
Versionen aktualisiert.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
is_up_to_date() prüft nun auch transitiv importierte/inkludierte XSL-Dateien.
Abhängigkeiten werden per Tooltip und Kontextmenü-Aktion im TreeWidget angezeigt.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Reihenfolge: Windows-Pakete → Hinweis → Quellcode → Hinweis.
PostgreSQL aus den Installationshinweisen entfernt, da optional.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Installationssektion um vorkompilierte Windows-Pakete (MSI-Installer und
portables ZIP-Archiv) erweitert, inkl. JDK-Empfehlung für Pool-Worker-Performance.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Beim Auswählen eines XML-Knotens im Baum wird jetzt die Ref-PDF direkt im
internen Viewer geladen, sofern keine Diff-PDF existiert. Der Kontextmenü-Eintrag
"Ref-PDF öffnen" und der zugehörige Handler wurden entfernt.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
_close_all_pdf_documents() führt bereits doc.close() + gc.collect() durch,
wodurch Dateihandles freigegeben werden. Das nachfolgende processEvents()
war redundant und birgt das Risiko von Re-Entrant-Events.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Placeholder-Labels werden sofort erstellt, das eigentliche Rendern
erfolgt asynchron über QTimer.singleShot(0) — ein Thumbnail pro
Event-Loop-Iteration. UI friert nicht mehr ein; RAM-Spitze wird verteilt.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
get_saxon_worker_pool() und get_fop_worker_pool() in transform.py hinzugefügt.
worker_pool.py greift nicht mehr direkt auf transform._saxon_worker_pool /
transform._fop_worker_pool zu, sondern verwendet die Getter/Setter konsistent.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Die 5 linearen Lookups (java_vm, saxon_jar, apache_fop, diff_pdf, xsl_dir)
werden jetzt nur einmalig pro Projekt aufgelöst (_get_cached_project_tools).
Bei Batch-Transformationen entfällt das wiederholte Durchsuchen der Listen.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
_is_filename_used_in_project wurde bei jedem while-Schleifen-Durchlauf
aufgerufen und traversierte den kompletten Baum neu. Ersetzt durch
_collect_project_filenames(), die einmalig ein Set aufbaut → O(1) Lookups.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
ItemType(Enum) mit TREE_NODE, XSL_FILE, XML_FILE, UNKNOWN statt
String-Konstanten in tree_manager.py. Verbessert Typsicherheit und IDE-Support.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Polars wird nicht mehr beim App-Start importiert, sondern erst wenn
eine Datenbankabfrage tatsächlich ausgeführt wird. Beschleunigt den
Kaltstart der Anwendung.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- BaseWorkerPool (worker_pool_base.py): Eliminiert ~450 Zeilen Duplikation
aus saxon_pool.py, saxon_pool_s9api.py und fop_pool.py; behebt stderr-Handle-Leak
- XsltParamsEditDialog (XsltParamsEditDialog.py): Gemeinsame Basisklasse für
TreeNodeEditDialog und XslFileEditDialog; reduziert je 162 auf 8 Zeilen
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- blake2b-Hash-Berechnung in zentrale Utility-Funktion extrahiert (src/utils.py) mit chunk-basiertem Hashing für bessere RAM-Effizienz
- _transform_all_xml_files und _transform_all_xml_files_force zu einer Methode mit force-Parameter zusammengeführt
- Project-Lookup-Methoden (getXsl, getJavaVm, etc.) über gemeinsame _lookup()-Hilfsmethode konsolidiert
- Duplizierte XML-Sammel-Methoden entfernt, Set-basierte Duplikatsprüfung eingeführt
- Ungenutzte Imports, Dead Code und wirkungslose Ausdrücke entfernt
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- connectorx via collect_all() eingebunden statt hiddenimports (Rust-PYD + __init__.py + Metadaten als Einheit)
- SQL/CSV-Ressourcen (src/res/) ins PyInstaller-Bundle aufgenommen
- Pfadauflösung in database.py auf sys._MEIPASS umgestellt für installierten Modus
- connectorx als explizite Abhängigkeit in pyproject.toml ergänzt
- Dokumentation (windows_distribution.md) um collect_all-Pattern und _MEIPASS-Hinweise erweitert
- Version auf 1.0.0 aktualisiert, Hersteller-Informationen ergänzt
DB-Abfragen laufen nun in einem Hintergrund-Thread mit QProgressDialog,
sodass die UI nicht mehr einfriert. connect_timeout wird als konfigurierbarer
Parameter (1-300s, Standard: 10) im Connection-String übergeben.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Rekursive Löschung von TreeNodes mit PDF-Bereinigung, automatischer
physischer Löschung nicht mehr verwendeter XML-Dateien und korrekter
"anderswo verwendet"-Prüfung durch vorheriges Entfernen aus dem
Datenmodell.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Ersetzt den bisherigen Stub durch eine vollständige Implementierung mit
Bestätigungsdialog, automatischer PDF-Bereinigung, optionaler physischer
XML-Löschung und Datenmodell-Aktualisierung.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Implementiert intelligente Löschlogik die zugehörige PDF-Dateien (new/ref/diff) automatisch entfernt wenn eine XML-Datei aus einem XSL-Knoten gelöscht wird. PDFs werden nur gelöscht wenn die XML+XSL-Kombination nicht mehr anderswo im Projektbaum verwendet wird.
- open_existing_project() speichert nun das vorherige Projekt vor dem Wechsel
- Expand-Status der aufgeklappten Tree-Knoten bleibt beim Projektwechsel erhalten
- Umfassendes Logging für Debugging
- Fehlerbehandlung für robuste Ausführung
- ProjectData um optionales Feld 'expanded_nodes' erweitert (abwärtskompatibel)
- _save_project_settings() speichert nun automatisch den Expand-Status
- Expand-Status wird bei allen Speicheroperationen gesichert:
* Beim Bearbeiten von TreeNodes und XslFiles
* Bei Drag&Drop-Operationen im Tree
* Bei Hash-Berechnungen für XML-Dateien
* Beim Laden von Daten aus der Datenbank
* Beim Beenden der Anwendung
- Beim Laden eines Projekts werden aufgeklappte Knoten wiederhergestellt
- Rekursive Speicherung und Wiederherstellung für TreeNode und XslFile
- Umfassendes Logging für Debugging und Fehlerbehandlung
- Thumbnails horizontal zentriert im ScrollArea-Layout
- Layout-Spacing auf 5px reduziert für kompakte Darstellung
- Seitennummer-Labels auf 18px Höhe begrenzt
- Ränder um Layout und Labels entfernt
- Expandierenden Spacer am Ende hinzugefügt, damit Thumbnails oben bleiben
- Verbesserte Übersichtlichkeit der Thumbnail-Navigation
- Neues Aktions-Menü mit Transformations- und Datenbankfunktionen
- Menü wird beim Projekt-Laden automatisch aktiviert
- Neue Aktion: Alle XML-Dateien transformieren (inkrementell)
- Neue Aktion: Alle XML-Dateien neu transformieren (force)
- Neue Aktion: Aus Datenbank laden (ersetzt Button)
- Entfernte obsolete Buttons (pushButton, pushButton_2, pB_lade_aus_fn2)
- UI-Bereinigung: Button-Frame unterhalb TreeWidget entfernt
- Batch-Transformationen sammeln rekursiv alle XML/XSL-Paare
- Bestätigungsdialoge mit Job-Anzahl und Warnungen
- Deutsche Log-Meldungen und Fehlertexte
- 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