RefactoringRope/HistoryDialog.py

Tue, 13 Aug 2013 21:13:02 +0200

author
T.Rzepka <Tobias.Rzepka@gmail.com>
date
Tue, 13 Aug 2013 21:13:02 +0200
branch
Py2 comp.
changeset 50
a29c3d2e6dc0
parent 48
de33dc93a3ac
child 63
c02061242598
permissions
-rw-r--r--

rope for Python2 projects enabled, if running on Python2

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

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

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

from __future__ import unicode_literals    # __IGNORE_WARNING__

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