RefactoringRope/HistoryDialog.py

changeset 4
2e2463ef1aae
child 19
32dd7dbf3e8e
diff -r 3be1b4662b48 -r 2e2463ef1aae RefactoringRope/HistoryDialog.py
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/RefactoringRope/HistoryDialog.py	Sat Jan 29 19:16:29 2011 +0100
@@ -0,0 +1,139 @@
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2011 Detlev Offenbach <detlev@die-offenbachs.de>
+#
+
+"""
+Module implementing the History dialog.
+"""
+
+from PyQt4.QtCore import Qt, pyqtSlot
+from PyQt4.QtGui import QDialogButtonBox, QListWidgetItem, QMessageBox, \
+    QApplication
+
+from E5Gui import E5MessageBox
+from E5Gui.E5Application import e5App
+
+from PreviewDialogBase import PreviewDialogBase
+from ProgressHandle import ProgressHandle
+
+import Utilities
+
+class HistoryDialog(PreviewDialogBase):
+    """
+    Class implementing the History dialog.
+    """
+    ChangeIDRole = Qt.UserRole
+    
+    def __init__(self, refactoring, changes, isUndo, parent = None):
+        """
+        Constructor
+        
+        @param refactoring reference to the main refactoring object
+            (Refactoring)
+        @param changes list of ChangeSet objects
+            (list of rope.base.change.ChangeSet)
+        @param isUndo flag indicating an undo history dialog (boolean)
+        @param parent reference to the parent widget (QWidget)
+        """
+        PreviewDialogBase.__init__(self, parent)
+        
+        self.__refactoring = refactoring
+        self.__isUndo = isUndo
+        
+        if self.__isUndo:
+            self.__actionButton = self.buttonBox.addButton(
+                self.trUtf8("&Undo"),
+                QDialogButtonBox.AcceptRole)
+            self.description.setText(self.trUtf8("Undoable Changes"))
+            title = self.trUtf8("Undo History")
+        else:
+            self.__actionButton = self.buttonBox.addButton(
+                self.trUtf8("&Redo"),
+                QDialogButtonBox.AcceptRole)
+            self.description.setText(self.trUtf8("Redoable Changes"))
+            title = self.trUtf8("Redo History")
+        self.buttonBox.addButton(QDialogButtonBox.Close)
+        self.setWindowTitle(title)
+        
+        # populate the list
+        self.__changes = {}
+        for change in changes:
+            self.__changes[id(change)] = change
+            itm = QListWidgetItem(str(change), self.changesList)
+            itm.setData(HistoryDialog.ChangeIDRole, id(change))
+        if self.changesList.count() > 0:
+            self.changesList.item(0).setSelected(True)
+    
+    @pyqtSlot(QListWidgetItem, QListWidgetItem)
+    def on_changesList_currentItemChanged(self, current, previous):
+        """
+        Private slot called when a change is selected.
+        
+        @param current reference to the new current item (QListWidgetItem)
+        @param previous reference to the old current item (QListWidgetItem)
+        """
+        if current is None:
+            return
+        
+        self.previewEdit.clear()
+        id = current.data(HistoryDialog.ChangeIDRole)
+        change = self.__changes[id]
+        for line in change.get_description().splitlines(True):
+            try:
+                format = self.formats[line[0]]
+            except (IndexError, KeyError):
+                format = self.formats[' ']
+            self._appendText(line, format)
+    
+    def accept(self):
+        """
+        Public slot to undo the selected set of changes.
+        """
+        id = self.changesList.currentItem()\
+                 .data(HistoryDialog.ChangeIDRole)
+        change = self.__changes[id]
+        
+        if self.__isUndo:
+            res = E5MessageBox.question(None,
+                self.trUtf8("Undo refactorings"),
+                self.trUtf8("""Shall all refactorings up to <b>{0}</b>"""
+                            """ be undone?""")\
+                    .format(Utilities.html_encode(str(change))),
+                QMessageBox.StandardButtons(\
+                    QMessageBox.No | \
+                    QMessageBox.Yes),
+                QMessageBox.No)
+        else:
+            res = E5MessageBox.question(None,
+                self.trUtf8("Redo refactorings"),
+                self.trUtf8("""Shall all refactorings up to <b>{0}</b>"""
+                    """ be redone?""")\
+                    .format(Utilities.html_encode(str(change))),
+                QMessageBox.StandardButtons(\
+                    QMessageBox.No | \
+                    QMessageBox.Yes),
+                QMessageBox.No)
+        if res == QMessageBox.Yes:
+            if not self.__refactoring.confirmAllBuffersSaved():
+                return
+            
+            handle = ProgressHandle(change.description, False, self)
+            handle.show()
+            QApplication.processEvents()
+            if self.__isUndo:
+                self.__refactoring.getProject().history.undo(
+                    change, task_handle=handle)
+            else:
+                self.__refactoring.getProject().history.redo(
+                    change, task_handle=handle)
+            handle.reset()
+            
+            self.__refactoring.refreshEditors(change)
+            p = e5App().getObject("Project")
+            if p.isDirty():
+                p.saveProject()
+            
+            PreviewDialogBase.accept(self)
+        else:
+            self.reject()

eric ide

mercurial