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()