RefactoringRope/HistoryDialog.py

Wed, 01 Jan 2014 14:47:56 +0100

author
Detlev Offenbach <detlev@die-offenbachs.de>
date
Wed, 01 Jan 2014 14:47:56 +0100
changeset 62
1077db8d0589
parent 55
d501156be247
child 76
936b2a98fe4e
permissions
-rw-r--r--

Updated copyright for 2014.

# -*- coding: utf-8 -*-

# Copyright (c) 2010 - 2014 Detlev Offenbach <detlev@die-offenbachs.de>
#

"""
Module implementing the History dialog.
"""

from PyQt4.QtCore import Qt, pyqtSlot
from PyQt4.QtGui import QDialogButtonBox, QListWidgetItem, QApplication

from E5Gui.E5Application import e5App
from E5Gui import E5MessageBox

from PreviewDialogBase import PreviewDialogBase

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.yesNo(
                None,
                self.trUtf8("Undo refactorings"),
                self.trUtf8("""Shall all refactorings up to <b>{0}</b>"""
                            """ be undone?""")
                .format(Utilities.html_encode(str(change))))
        else:
            res = E5MessageBox.yesNo(
                None,
                self.trUtf8("Redo refactorings"),
                self.trUtf8("""Shall all refactorings up to <b>{0}</b>"""
                            """ be redone?""")
                .format(Utilities.html_encode(str(change))))
        if res:
            if not self.__refactoring.confirmAllBuffersSaved():
                return
            
            from ProgressHandle import ProgressHandle
            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