RefactoringRope/RefactoringDialogBase.py

changeset 3
3be1b4662b48
child 9
8cee612bcc28
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/RefactoringRope/RefactoringDialogBase.py	Sat Jan 29 15:10:40 2011 +0100
@@ -0,0 +1,109 @@
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2011 Detlev Offenbach <detlev@die-offenbachs.de>
+#
+
+"""
+Module implementing the Refactoring dialog base class.
+"""
+
+from PyQt4.QtCore import Qt
+from PyQt4.QtGui import QDialog, QApplication
+
+from E5Gui.E5Application import e5App
+
+from ChangesPreviewDialog import ChangesPreviewDialog
+from ProgressHandle import ProgressHandle
+
+
+class RefactoringDialogBase(QDialog):
+    """
+    Class implementing the Refactoring dialog base class.
+    """
+    def __init__(self, refactoring, title, parent=None):
+        """
+        Constructor
+        
+        @param refactoring reference to the main refactoring object
+            (Refactoring)
+        @param title title of the dialog (string or QString)
+        @param parent reference to the parent widget (QWidget)
+        """
+        QDialog.__init__(self, parent)
+        self.setAttribute(Qt.WA_DeleteOnClose)
+        self.setWindowTitle(title)
+        
+        self._refactoring = refactoring
+        self._title = title
+        self.__handle = None
+    
+    def __createProgressHandle(self, interruptable=True):
+        """
+        Private method to create a TaskHandle to update a progress dialog.
+        
+        @param interruptable flag indicating, that the task may be 
+            interrupted (boolean)
+        """
+        self.__handle = ProgressHandle(self._title, interruptable, self)
+        self.__handle.show()
+        QApplication.processEvents()
+    
+    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)
+        """
+        raise NotImplementedError("_calculateChanges must be overridden.")
+    
+    def __getChanges(self):
+        """
+        Private method to build the Changes object.
+        
+        @return reference to the Changes object (rope.base.change.ChangeSet)
+        """
+        self.__createProgressHandle()
+        changes = self._calculateChanges(self.__handle)
+        self.__handle.reset()
+        self.__handle = None
+        
+        return changes
+    
+    def previewChanges(self):
+        """
+        Public method to preview the changes.
+        """
+        changes = self.__getChanges()
+        
+        if changes is not None:
+            dlg = ChangesPreviewDialog(changes, self)
+            if dlg.exec_() == QDialog.Accepted:
+                self.applyChanges(changes)
+    
+    def applyChanges(self, changes = None):
+        """
+        Public method to apply the changes.
+        
+        @param reference to the Changes object (rope.base.change.ChangeSet)
+        """
+        if changes is None:
+            changes = self.__getChanges()
+        
+        if changes is not None:
+            self.__createProgressHandle(False)
+            try:
+                self._refactoring.getProject().do(changes, self.__handle)
+            except Exception as err:
+                self._refactoring.handleRopeError(
+                    err, self._title, self.__handle)
+            self.__handle.reset()
+            self.__handle = None
+            
+            self._refactoring.refreshEditors(changes)
+            p = e5App().getObject("Project")
+            if p.isDirty():
+                p.saveProject()
+        
+        self.accept()

eric ide

mercurial