diff --git a/src/ui/MainWindow.py b/src/ui/MainWindow.py index 1592ede..6715618 100644 --- a/src/ui/MainWindow.py +++ b/src/ui/MainWindow.py @@ -912,6 +912,24 @@ class MainWindow(QMainWindow): menu.addSeparator() + # Transformations-Aktionen (nur aktiv wenn XML-Dateien vorhanden) + tree_node_obj = item.data(0, Qt.ItemDataRole.UserRole) if item else None + has_xml_files = tree_node_obj and self._has_xml_files_recursive(tree_node_obj) + + action_transform = QAction("Alle XML-Dateien transformieren", self) + action_transform.setIcon(QIcon(QIcon.fromTheme("system-run"))) + action_transform.triggered.connect(lambda: self._transform_tree_node(item)) + action_transform.setEnabled(has_xml_files) + menu.addAction(action_transform) + + action_transform_force = QAction("Alle XML-Dateien neu transformieren (force)", self) + action_transform_force.setIcon(QIcon(QIcon.fromTheme("view-refresh"))) + action_transform_force.triggered.connect(lambda: self._transform_tree_node(item, force=True)) + action_transform_force.setEnabled(has_xml_files) + menu.addAction(action_transform_force) + + menu.addSeparator() + action_edit = QAction("Bearbeiten", self) action_edit.setIcon(QIcon(QIcon.fromTheme(QIcon.ThemeIcon.DocumentProperties))) action_edit.triggered.connect(lambda: self._edit_tree_node(item)) @@ -3070,6 +3088,112 @@ class MainWindow(QMainWindow): logger.error(f"Fehler beim Transformieren der XSL-Datei: {e}") QMessageBox.critical(self, "Fehler", f"Fehler beim Transformieren: {str(e)}") + def _has_xml_files_recursive(self, node: TreeNode) -> bool: + """ + Prüft rekursiv, ob unter einem TreeNode mindestens eine XML-Datei vorhanden ist. + + Args: + node: Der TreeNode + + Returns: + bool: True wenn mindestens eine XML-Datei gefunden wurde + """ + if not hasattr(node, 'children') or not node.children: + return False + + for child in node.children: + if isinstance(child, XslFile): + if child.xmls: + return True + elif isinstance(child, TreeNode): + if self._has_xml_files_recursive(child): + return True + + return False + + def _collect_all_xsl_xml_pairs_recursive( + self, tree_node: TreeNode, tree_item: QTreeWidgetItem + ) -> list[tuple[XslFile, XmlFile, QTreeWidgetItem]]: + """ + Sammelt rekursiv alle (XslFile, XmlFile, XslFileItem) Tupel unter einem TreeNode. + + Args: + tree_node: Der TreeNode + tree_item: Das TreeWidgetItem des TreeNode + + Returns: + list: Liste von (XslFile, XmlFile, XslFileItem) Tupeln + """ + pairs = [] + + if not hasattr(tree_node, 'children') or not tree_node.children: + return pairs + + # Durchlaufe alle Kinder des TreeNode + for i in range(tree_item.childCount()): + child_item = tree_item.child(i) + child_node = child_item.data(0, Qt.ItemDataRole.UserRole) + + if isinstance(child_node, XslFile): + # XslFile gefunden - sammle alle XML-Dateien + for xml_file_obj in child_node.xmls: + pairs.append((child_node, xml_file_obj, child_item)) + + elif isinstance(child_node, TreeNode): + # Rekursiv in Unterknoten suchen + pairs.extend(self._collect_all_xsl_xml_pairs_recursive(child_node, child_item)) + + return pairs + + def _transform_tree_node(self, item: QTreeWidgetItem, force: bool = False): + """ + Transformiert alle XML-Dateien unter einem TreeNode (rekursiv). + + Args: + item: Das TreeWidgetItem des TreeNode + force: Wenn True, wird Transformation auch bei aktuellem Output durchgeführt + """ + try: + # Hole TreeNode-Objekt + tree_node_obj = item.data(0, Qt.ItemDataRole.UserRole) + if not isinstance(tree_node_obj, TreeNode): + logger.error(f"Item ist kein TreeNode: {type(tree_node_obj)}") + QMessageBox.warning(self, "Fehler", "Konnte TreeNode nicht ermitteln") + return + + # Prüfe ob XML-Dateien vorhanden sind + if not self._has_xml_files_recursive(tree_node_obj): + QMessageBox.information(self, "Info", "Keine XML-Dateien unter diesem Knoten gefunden") + return + + # Sammle alle XSL/XML-Paare rekursiv + xsl_xml_pairs = self._collect_all_xsl_xml_pairs_recursive(tree_node_obj, item) + + if not xsl_xml_pairs: + QMessageBox.information(self, "Info", "Keine XML-Dateien gefunden") + return + + # Erstelle TransformationJobs für alle XML-Dateien + jobs = [] + for xsl_file_obj, xml_file_obj, xsl_file_item in xsl_xml_pairs: + # Übergebe das XslFile-TreeWidgetItem für Parameter-Sammlung + job = self._create_transformation_job(xsl_file_obj, xml_file_obj, xsl_file_item) + if job: + jobs.append(job) + + if not jobs: + QMessageBox.warning(self, "Fehler", "Konnte keine Transformations-Jobs erstellen") + return + + logger.info(f"Starte Transformation für {len(jobs)} XML-Dateien unter TreeNode '{tree_node_obj.bez}'") + + # Starte Transformation in separatem Thread + self._start_transformation(jobs, force=force) + + except Exception as e: + logger.error(f"Fehler beim Transformieren des TreeNode: {e}") + QMessageBox.critical(self, "Fehler", f"Fehler beim Transformieren: {str(e)}") + def _create_transformation_job( self, xsl_file_obj: XslFile, xml_file_obj: XmlFile, xsl_file_item: QTreeWidgetItem | None = None ) -> TransformationJob | None: