Commit Graph

142 Commits

Author SHA1 Message Date
info 84bbf201d0 EInige Symbole zu den Buttons hinzugefügt 2026-03-14 17:16:27 +01:00
info 4f2d136d17 Feat: Ref-PDF automatisch im internen Viewer anzeigen wenn keine Diff-PDF vorhanden
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>
2026-03-14 17:01:19 +01:00
info 93f9bb90dd Fix: QApplication.processEvents() Anti-Pattern entfernt
_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>
2026-03-09 20:20:36 +01:00
info 29574ce0dc Perf: PDF-Thumbnails progressiv rendern statt alle auf einmal
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>
2026-03-09 20:19:42 +01:00
info 87b2d9273f Refactor: Worker-Pool-Zugriff über öffentliche Getter statt private Modul-Globals
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>
2026-03-09 20:18:01 +01:00
info cfbdb8b7fa Perf: Tool-Konfigurationsauflösung in _create_transformation_job gecacht
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>
2026-03-09 20:11:58 +01:00
info edfe424a6a Perf: O(n²) Baumtraversierung bei Dateinamen-Konfliktprüfung behoben
_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>
2026-03-09 20:09:10 +01:00
info b954106a0d Refactor: Stringly-typed Knotentypen durch ItemType-Enum ersetzt
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>
2026-03-09 20:08:23 +01:00
info 22bc693d4d Perf: Polars-Import lazy gemacht (nur bei DB-Nutzung laden)
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>
2026-03-09 20:05:48 +01:00
info 9be6ac24e9 Refactor: AppSettings CRUD-Methoden durch generische Helfer vereinfacht
4 generische Helfer (_add_item, _remove_item, _edit_item, _update_remove_button)
ersetzen 26 nahezu identische CRUD-Methoden für 7 Tool-Typen.
_make_centered_item eliminiert QTableWidgetItem-Duplikation in populate-Methoden.
Ergebnis: 805 → 508 Zeilen (-37%).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-09 19:53:34 +01:00
info 37ebdff349 Refactor: Gemeinsame Basisklassen für Worker-Pools und Parameter-Dialoge
- 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>
2026-03-09 19:49:57 +01:00
info cb90f9e483 Refactor: Code-Duplikation reduziert und Dead Code entfernt
- 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>
2026-03-08 20:21:02 +01:00
info affba2a9ca Fix: PyInstaller-Bundle für installierte Version repariert (connectorx, SQL-Ressourcen)
- 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
2026-02-15 19:51:58 +01:00
info ec33a5b586 Feature: Timeout-Einstellung und asynchrone DB-Abfrage mit Abbrechen-Dialog
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>
2026-02-12 21:31:40 +01:00
info 66496c26d8 Fix: Projektname wird beim Bearbeiten im PdfProject-Dialog gespeichert
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-12 20:53:00 +01:00
info a0bc55fa7b Refactor: TreeWidget-Styling in Qt Designer UI-Dateien verlagert
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-09 21:17:21 +01:00
info b985e1eeee Feature: Löschen-Funktion für TreeNode-Knoten im Baum implementiert
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>
2026-02-08 21:08:23 +01:00
info 52180e38ce Feature: Löschen-Funktion für XSL-Knoten im Baum implementiert
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>
2026-02-08 20:12:24 +01:00
info 29f34c4d85 Refactor: projectPath-Widget in Qt Designer verlagert
- projectPath-Label jetzt vollständig in MainWinddow.ui definiert
- StyleSheet (padding, font-weight) in UI-Datei integriert
- Dynamische Widget-Erstellung aus MainWindow.py entfernt (9 Zeilen Code)
- MainWinddow_ui.py automatisch neu generiert mit Styling
2026-02-07 20:35:17 +01:00
info 747c6dbfec Feature: Projektpfad-Anzeige über TreeWidget hinzugefügt 2026-02-07 20:25:21 +01:00
info 9180fc342e Feature: Häkchen im Menü 'Vorhandene Projekte' für geladenes Projekt 2026-02-07 20:00:50 +01:00
info 9e58b3a9a1 Feature: Automatische PDF-Bereinigung beim Entfernen von XML-Dateien
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.
2026-02-07 19:47:02 +01:00
info 0fd0703dbb Feature: Expand-Status beim Projektwechsel automatisch speichern
- 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
2026-02-01 15:51:50 +01:00
info e6b2743677 Feature: Expand-Status von Tree-Knoten bei jedem Speichern persistent sichern
- 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
2026-02-01 15:44:55 +01:00
info 0f14418749 UI: PDF-Thumbnails kompakt und zentriert anzeigen
- 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
2026-02-01 15:06:22 +01:00
info 3bdc0a0daa Feature: Aktions-Menü mit Batch-Transformationen und UI-Bereinigung
- 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
2026-01-25 15:23:32 +01:00
info 2858d46ef1 Refactor: Worker-Log-Verzeichnis von 'temp' zu 'tmp' umbenennen 2026-01-23 19:38:57 +01:00
info afff427f67 Feature: Prüfung auf Existenz von XML- und XSL-Dateien vor Transformation
- 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
2026-01-22 19:37:53 +01:00
info d74dfd20e5 Fix: QIcon.ThemeIcon.TextXGeneric durch korrekten String-Namen ersetzen 2026-01-22 19:33:15 +01:00
info bad4d55ebd Feature: Automatische Aktualisierung des Projekte-Menüs und Validierung der Projekt-Verzeichnisse
- 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
2026-01-20 20:29:34 +01:00
info 5ab8674833 Feature: Icons für TreeNodes, XSL-Nodes und XML-Nodes hinzufügen
Fügt visuelle Icons für bessere Übersichtlichkeit im TreeWidget hinzu:
- TreeNode: Ordner-Icon (folder-open mit Fallback)
- XslFile: Script/Code-Icon (text-x-script)
- XmlFile: XML-Dokument-Icon (text-xml)

Icons verwenden QIcon.ThemeIcon für bessere Kompatibilität und
System-Theme-Integration mit automatischen Fallbacks.
2026-01-18 13:48:20 +01:00
info 8a37992bea Feature: XSL-Knoten bei fehlenden Dateien deaktivieren
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>
2026-01-17 20:29:29 +01:00
info 91fe597301 Feature: XML-Knoten bei fehlenden Dateien deaktivieren
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>
2026-01-17 20:22:42 +01:00
info f91ffd83a2 Fix: Accept-Changes-Button beim PDF-Reset deaktivieren
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>
2026-01-17 20:08:54 +01:00
info 3acdfbb5c8 Refactor: MainWindow in 7 Mixins aufgeteilt (80% Code-Reduktion)
MainWindow.py von 5025 auf 983 Zeilen reduziert durch Extraktion in:
- TreeManagerMixin: Baumstruktur-Verwaltung (~1136 Zeilen)
- PdfViewerMixin: PDF-Anzeige und Rendering
- WorkerPoolMixin: Saxon/FOP Worker-Pool-Verwaltung
- DatabaseMixin: PostgreSQL-Operationen
- DragDropMixin: Drag-and-Drop für XML-Dateien
- HashCalculationMixin: blake2b Hash-Berechnung
- TransformationMixin: XSL-Transformationen

Zusätzlich Thread-Klassen in threads.py ausgelagert.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-15 18:23:55 +01:00
info 5a2da7f264 Feature: Ref-PDF direkt aus Kontextmenü öffnen
- 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>
2026-01-11 16:30:09 +01:00
info 1558c376d1 Fix: Worker-Pool-Metriken cachen für Anzeige nach Shutdown
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>
2026-01-07 19:00:35 +01:00
info f59e51c081 Performance: Lazy Worker-Pool Init + XSL-Stylesheet-Caching
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>
2026-01-07 18:44:32 +01:00
info d3dc07cbf3 Feature: Detaillierte Worker-Pool Performance-Metriken mit psutil
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>
2026-01-06 20:58:37 +01:00
info cbcae3222f Feature: s9api-basierte SaxonWorkerPool-Variante für XSLT 2.0/3.0
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>
2026-01-05 20:20:00 +01:00
info 6976d21768 UX: Performance-Einstellungen in Programmeinstellungen integriert
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>
2026-01-04 19:01:46 +01:00
info a7a69d27d7 Performance: FOP Worker Pool für 5-10x schnellere PDF-Generierung
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>
2026-01-04 17:24:19 +01:00
info 8d38c58d6f Feature: Zoom per STRG+Mausrad im PDF-Viewer
Neue Zoom-Funktion für bessere Bedienung:
- STRG+Mausrad rauf: Zoom vergrößern (+10% pro Schritt)
- STRG+Mausrad runter: Zoom verkleinern (-10% pro Schritt)
- Respektiert Slider-Grenzen (25% bis 300%)
- Funktioniert nur wenn PDF geladen ist (Slider aktiviert)

Implementierung:
- Event-Filter für scrollArea_2 (PDF-Viewer)
- eventFilter() Methode fängt Wheel-Events ab
- Prüft auf ControlModifier (STRG-Taste)
- Aktualisiert Zoom-Slider (triggert automatisch apply_zoom)

Technische Details:
- _setup_scroll_area_zoom() in __init__
- installEventFilter(self) für scrollArea_2
- QEvent.Type.Wheel mit Qt.KeyboardModifier.ControlModifier
- Zoom-Schrittweite: 10%

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-01-02 21:06:37 +01:00
info c55a628728 UX-Verbesserung: Slider-Aktivierung und aussagekräftige Tooltips
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>
2026-01-02 20:22:29 +01:00
info d914e9b06a Feature: Buttons zum Öffnen von Ref- und New-PDFs im System-Viewer
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>
2026-01-02 20:11:56 +01:00
info d7fbb178a7 Feature: Konfigurierbare SaxonWorkerPool-Aktivierung
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>
2025-12-28 17:33:00 +01:00
info d0cdcd6432 Performance: 4x schnellere XSLT-Transformationen durch Worker-Pool
Problem: 82 XML-Dateien brauchten 160 Sekunden (JVM-Startup-Overhead)

Lösung: Persistente JVM-Worker-Prozesse mit JAXP Transformer API
- Saxon Worker Pool mit N persistenten JVM-Prozessen
- Eliminiert JVM-Startup und Classpath-Scanning bei jedem Job
- Parallele Verarbeitung mit ThreadPoolExecutor
- JAXP Transformer API (javax.xml.transform) - stabil, kein System.exit()
- Konfigurierbare Worker-Anzahl über Performance-Menü

Ergebnis: 82 Dateien in 40 Sekunden (4x Speedup, ~0.49s pro Datei)

Zusätzliche Verbesserungen:
- Dual-Logging (Datei + Konsole) mit Timestamps
- Worker-stderr-Logs in Projektverzeichnis/temp/
- Umfangreiche Debug-Ausgaben für Fehlerdiagnose
- Robuste Fehlerbehandlung mit ErrorListener

Technische Details:
- SaxonWorkerPool: Verwaltet N Worker-Prozesse
- JAXP statt Transform.main() (kein System.exit!)
- Worker-Locks für thread-sichere Job-Verteilung
- Graceful Shutdown mit EXIT-Befehl
- Fallback auf subprocess bei Pool-Fehlern

Dateien:
- src/saxon_pool.py (NEU): Worker-Pool-Implementation
- src/transform.py: Integration mit Worker-Pool
- src/ui/MainWindow.py: Pool-Initialisierung, Performance-Menü
- src/conf.py: max_workers Einstellung
- src/main.py: Dual-Logging

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2025-12-28 16:46:39 +01:00
info 055428e8cf Code-Qualität: Robustere Prüfung für project_dir in Batch-Verarbeitung
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>
2025-12-28 13:06:12 +01:00
info 9f48a0d62a UX-Verbesserung: Gesamtdauer in Transformations-Zusammenfassung
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>
2025-12-28 12:58:39 +01:00
info e7408eac7c Performance-Verbesserung: Asynchrone Batch-Verarbeitung und Progressbars
Ä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>
2025-12-27 20:31:54 +01:00