RefactoringRope/RestructureDialog.py

changeset 11
562f9758d2e1
child 20
83b71483e198
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/RefactoringRope/RestructureDialog.py	Sun Jan 30 17:02:15 2011 +0100
@@ -0,0 +1,133 @@
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2011 Detlev Offenbach <detlev@die-offenbachs.de>
+#
+
+"""
+Module implementing the Restructure dialog.
+"""
+
+from PyQt4.QtCore import pyqtSlot
+from PyQt4.QtGui import QDialogButtonBox, QAbstractButton
+
+import rope.refactor.restructure
+
+from Ui_RestructureDialog import Ui_RestructureDialog
+from RefactoringDialogBase import RefactoringDialogBase
+
+class RestructureDialog(RefactoringDialogBase, Ui_RestructureDialog):
+    """
+    Class implementing the Restructure dialog.
+    """
+    history = None
+    
+    def __init__(self, refactoring, title, parent = None):
+        """
+        Constructor
+        
+        @param refactoring reference to the main refactoring object
+            (Refactoring)
+        @param title title of the dialog (string)
+        @param parent reference to the parent widget (QWidget)
+        """
+        RefactoringDialogBase.__init__(self, refactoring, title, parent)
+        self.setupUi(self)
+        
+        self.__okButton = self.buttonBox.button(QDialogButtonBox.Ok)
+        self.__okButton.setEnabled(False)
+        self.__previewButton = self.buttonBox.addButton(
+            self.trUtf8("Preview"), QDialogButtonBox.ActionRole)
+        self.__previewButton.setDefault(True)
+        
+        self.__loadData()
+    
+    def __updateUI(self):
+        """
+        Private slot to update the UI.
+        """
+        self.__okButton.setEnabled(self.patternEdit.toPlainText() != "" and \
+            self.goalEdit.toPlainText() != "")
+    
+    @pyqtSlot()
+    def on_patternEdit_textChanged(self):
+        """
+        Private slot to react to changes of the pattern.
+        """
+        self.__updateUI()
+    
+    @pyqtSlot()
+    def on_goalEdit_textChanged(self):
+        """
+        Private slot to react to changes of the goal.
+        """
+        self.__updateUI()
+    
+    @pyqtSlot(QAbstractButton)
+    def on_buttonBox_clicked(self, button):
+        """
+        Private slot to act on the button pressed.
+        
+        @param button reference to the button pressed (QAbstractButton)
+        """
+        if button == self.__previewButton:
+            self.previewChanges()
+        elif button == self.__okButton:
+            self.applyChanges()
+    
+    def _calculateChanges(self, handle):
+        """
+        Protected method to calculate the changes.
+        
+        @param handle reference to the task handle
+            (rope.base.taskhandle.TaskHandle)
+        @return reference to the Changes object (rope.base.change.ChangeSet)
+        """
+        self.__saveData()
+        pattern = self.patternEdit.toPlainText()
+        goal = self.goalEdit.toPlainText()
+        imports = [line for line in self.importsEdit.toPlainText().splitlines()
+                   if line.strip()]
+        
+        args = {}
+        checks = self.argsEdit.toPlainText().splitlines()
+        for check in checks:
+            if ':' in check:
+                splitted = check.split(':', 1)
+                name = splitted[0].strip()
+                value = splitted[1].strip()
+                args[name] = value
+        
+        self._refactoring.getProject().validate(
+            self._refactoring.getProject().root)
+        try:
+            restructuring = rope.refactor.restructure.Restructure(
+                self._refactoring.getProject(), pattern, goal, 
+                args=args, imports=imports)
+            changes = restructuring.get_changes(task_handle=handle)
+        except Exception as err:
+            self._refactoring.handleRopeError(err, self._title)
+            return None
+        
+        return changes
+    
+    def __saveData(self):
+        """
+        Private slot to save the data for later reuse.
+        """
+        data = {'pattern' : self.patternEdit.toPlainText(),
+                'goal'    : self.goalEdit.toPlainText(),
+                'checks'  : self.argsEdit.toPlainText(),
+                'imports' : self.importsEdit.toPlainText()
+               }
+        RestructureDialog.history = data
+
+    def __loadData(self):
+        """
+        Private slot to load the history data into the dialog.
+        """
+        if RestructureDialog.history is not None:
+            data = RestructureDialog.history
+            self.patternEdit.setPlainText(data['pattern'])
+            self.goalEdit.setPlainText(data['goal'])
+            self.argsEdit.setPlainText(data['checks'])
+            self.importsEdit.setPlainText(data['imports'])

eric ide

mercurial