RefactoringRope/Refactoring.py

changeset 4
2e2463ef1aae
parent 3
3be1b4662b48
child 5
49a4abfc1f89
equal deleted inserted replaced
3:3be1b4662b48 4:2e2463ef1aae
47 from ProgressHandle import ProgressHandle 47 from ProgressHandle import ProgressHandle
48 from HelpDialog import HelpDialog 48 from HelpDialog import HelpDialog
49 from MatchesDialog import MatchesDialog 49 from MatchesDialog import MatchesDialog
50 from RenameDialog import RenameDialog 50 from RenameDialog import RenameDialog
51 from ChangeOccurrencesDialog import ChangeOccurrencesDialog 51 from ChangeOccurrencesDialog import ChangeOccurrencesDialog
52 from HistoryDialog import HistoryDialog
52 53
53 import Utilities 54 import Utilities
54 55
55 56
56 class Refactoring(QObject): 57 class Refactoring(QObject):
164 self.__changeOccurrences) 165 self.__changeOccurrences)
165 else: 166 else:
166 self.connect(self.refactoringChangeOccurrencesAct, 167 self.connect(self.refactoringChangeOccurrencesAct,
167 SIGNAL('triggered()'), self.__changeOccurrences) 168 SIGNAL('triggered()'), self.__changeOccurrences)
168 self.actions.append(self.refactoringChangeOccurrencesAct) 169 self.actions.append(self.refactoringChangeOccurrencesAct)
170
171 #####################################################
172 ## Undo/Redo actions
173 #####################################################
174
175 self.refactoringUndoAct = E5Action(self.trUtf8('Undo'),
176 self.trUtf8('&Undo'),
177 0, 0,
178 self,'refactoring_undo')
179 self.refactoringUndoAct.setStatusTip(self.trUtf8(
180 'Undo the last refactoring'))
181 self.refactoringUndoAct.setWhatsThis(self.trUtf8(
182 """<b>Undo</b>"""
183 """<p>Undo the last refactoring.</p>"""
184 ))
185 if self.__newStyle:
186 self.refactoringUndoAct.triggered[()].connect(
187 self.__undo)
188 else:
189 self.connect(self.refactoringUndoAct,
190 SIGNAL('triggered()'), self.__undo)
191 self.actions.append(self.refactoringUndoAct)
192
193 self.refactoringRedoAct = E5Action(self.trUtf8('Redo'),
194 self.trUtf8('Re&do'),
195 0, 0,
196 self,'refactoring_redo')
197 self.refactoringRedoAct.setStatusTip(self.trUtf8(
198 'Redo the last refactoring'))
199 self.refactoringRedoAct.setWhatsThis(self.trUtf8(
200 """<b>Redo</b>"""
201 """<p>Redo the last refactoring.</p>"""
202 ))
203 if self.__newStyle:
204 self.refactoringRedoAct.triggered[()].connect(
205 self.__redo)
206 else:
207 self.connect(self.refactoringRedoAct,
208 SIGNAL('triggered()'), self.__redo)
209 self.actions.append(self.refactoringRedoAct)
210
211 self.refactoringUndoHistoryAct = \
212 E5Action(self.trUtf8('Show Project Undo History'),
213 self.trUtf8('Show Project Undo History'),
214 0, 0,
215 self,'refactoring_show_project_undo_history')
216 self.refactoringUndoHistoryAct.setStatusTip(self.trUtf8(
217 'Show the undo history of the project'))
218 self.refactoringUndoHistoryAct.setWhatsThis(self.trUtf8(
219 """<b>Show Project Undo History</b>"""
220 """<p>Opens a dialog to show the undo history list of"""
221 """ the project.</p>"""
222 ))
223 if self.__newStyle:
224 self.refactoringUndoHistoryAct.triggered[()].connect(
225 self.__showProjectUndoHistory)
226 else:
227 self.connect(self.refactoringUndoHistoryAct,
228 SIGNAL('triggered()'), self.__showProjectUndoHistory)
229 self.actions.append(self.refactoringUndoHistoryAct)
230
231 self.refactoringRedoHistoryAct = \
232 E5Action(self.trUtf8('Show Project Redo History'),
233 self.trUtf8('Show Project Redo History'),
234 0, 0,
235 self,'refactoring_show_project_redo_history')
236 self.refactoringRedoHistoryAct.setStatusTip(self.trUtf8(
237 'Show the redo history of the project'))
238 self.refactoringRedoHistoryAct.setWhatsThis(self.trUtf8(
239 """<b>Show Project Redo History</b>"""
240 """<p>Opens a dialog to show the redo history list of"""
241 """ the project.</p>"""
242 ))
243 if self.__newStyle:
244 self.refactoringRedoHistoryAct.triggered[()].connect(
245 self.__showProjectRedoHistory)
246 else:
247 self.connect(self.refactoringRedoHistoryAct,
248 SIGNAL('triggered()'), self.__showProjectRedoHistory)
249 self.actions.append(self.refactoringRedoHistoryAct)
250
251 self.refactoringUndoFileHistoryAct = \
252 E5Action(self.trUtf8('Show Current File Undo History'),
253 self.trUtf8('Show Current File Undo History'),
254 0, 0,
255 self,'refactoring_show_file_undo_history')
256 self.refactoringUndoFileHistoryAct.setStatusTip(self.trUtf8(
257 'Show the undo history of the current file'))
258 self.refactoringUndoFileHistoryAct.setWhatsThis(self.trUtf8(
259 """<b>Show Current File Undo History</b>"""
260 """<p>Opens a dialog to show the undo history list of"""
261 """ the current file.</p>"""
262 ))
263 if self.__newStyle:
264 self.refactoringUndoFileHistoryAct.triggered[()].connect(
265 self.__showFileUndoHistory)
266 else:
267 self.connect(self.refactoringUndoFileHistoryAct,
268 SIGNAL('triggered()'), self.__showFileUndoHistory)
269 self.actions.append(self.refactoringUndoFileHistoryAct)
270
271 self.refactoringRedoFileHistoryAct = \
272 E5Action(self.trUtf8('Show Current File Redo History'),
273 self.trUtf8('Show Current File Redo History'),
274 0, 0,
275 self,'refactoring_show_file_redo_history')
276 self.refactoringRedoFileHistoryAct.setStatusTip(self.trUtf8(
277 'Show the redo history of the current file'))
278 self.refactoringRedoFileHistoryAct.setWhatsThis(self.trUtf8(
279 """<b>Show Current File Redo History</b>"""
280 """<p>Opens a dialog to show the redo history list of"""
281 """ the current file.</p>"""
282 ))
283 if self.__newStyle:
284 self.refactoringRedoFileHistoryAct.triggered[()].connect(
285 self.__showFileRedoHistory)
286 else:
287 self.connect(self.refactoringRedoFileHistoryAct,
288 SIGNAL('triggered()'), self.__showFileRedoHistory)
289 self.actions.append(self.refactoringRedoFileHistoryAct)
290
291 self.refactoringClearHistoryAct = \
292 E5Action(self.trUtf8('Clear History'),
293 self.trUtf8('Clear History'),
294 0, 0,
295 self,'refactoring_clear_history')
296 self.refactoringClearHistoryAct.setStatusTip(self.trUtf8(
297 'Clear the refactoring history'))
298 self.refactoringClearHistoryAct.setWhatsThis(self.trUtf8(
299 """<b>Clear History</b>"""
300 """<p>Clears the refactoring history.</p>"""
301 ))
302 if self.__newStyle:
303 self.refactoringClearHistoryAct.triggered[()].connect(
304 self.__clearHistory)
305 else:
306 self.connect(self.refactoringClearHistoryAct,
307 SIGNAL('triggered()'), self.__clearHistory)
308 self.actions.append(self.refactoringClearHistoryAct)
169 309
170 ##################################################### 310 #####################################################
171 ## Query actions 311 ## Query actions
172 ##################################################### 312 #####################################################
173 313
302 smenu.addAction(self.refactoringChangeOccurrencesAct) 442 smenu.addAction(self.refactoringChangeOccurrencesAct)
303 smenu.addSeparator() 443 smenu.addSeparator()
304 smenu.addAction(self.refactoringRenameModuleAct) 444 smenu.addAction(self.refactoringRenameModuleAct)
305 smenu.addSeparator() 445 smenu.addSeparator()
306 446
447 smenu.addSeparator()
448 smenu.addAction(self.refactoringUndoAct)
449 smenu.addAction(self.refactoringRedoAct)
450 smenu.addSeparator()
451
452 hmenu = smenu.addMenu(self.trUtf8("History"))
453 self.connect(hmenu, SIGNAL("aboutToShow()"),
454 self.__showRefactoringHistoryMenu)
455 hmenu.addAction(self.refactoringUndoHistoryAct)
456 hmenu.addAction(self.refactoringUndoFileHistoryAct)
457 hmenu.addSeparator()
458 hmenu.addAction(self.refactoringRedoHistoryAct)
459 hmenu.addAction(self.refactoringRedoFileHistoryAct)
460 hmenu.addSeparator()
461 hmenu.addAction(self.refactoringClearHistoryAct)
462
307 menu.addSeparator() 463 menu.addSeparator()
308 menu.addAction(self.refactoringEditConfigAct) 464 menu.addAction(self.refactoringEditConfigAct)
309 menu.addAction(self.refactoringHelpAct) 465 menu.addAction(self.refactoringHelpAct)
310 466
311 self.__mainMenu = menu 467 self.__mainMenu = menu
392 548
393 def __showRefactoringMenu(self): 549 def __showRefactoringMenu(self):
394 """ 550 """
395 Private slot called before the refactoring menu is shown. 551 Private slot called before the refactoring menu is shown.
396 """ 552 """
397 # TODO: enable these once undo/redo has been implemented 553 self.refactoringUndoAct.setEnabled(self.__canUndo())
398 ## self.refactoringUndoAct.setEnabled(self.__canUndo()) 554 self.refactoringRedoAct.setEnabled(self.__canRedo())
399 ## self.refactoringRedoAct.setEnabled(self.__canRedo()) 555
556 def __showRefactoringHistoryMenu(self):
557 """
558 Private slot called before the refactoring history menu is shown.
559 """
560 aw = e5App().getObject("ViewManager").activeWindow()
561 resource = None
562 if aw is not None:
563 filename = aw.getFileName()
564 resource = rope.base.libutils.path_to_resource(
565 self.__project, filename)
566
567 self.refactoringUndoHistoryAct.setEnabled(self.__canUndo())
568 self.refactoringUndoFileHistoryAct.setEnabled(
569 resource is not None and self.__canUndoFile(resource))
570 self.refactoringRedoHistoryAct.setEnabled(self.__canRedo())
571 self.refactoringRedoFileHistoryAct.setEnabled(
572 resource is not None and self.__canRedoFile(resource))
400 573
401 def handleRopeError(self, err, title, handle=None): 574 def handleRopeError(self, err, title, handle=None):
402 """ 575 """
403 Public slot to handle a rope error. 576 Public slot to handle a rope error.
404 577
544 return 717 return
545 718
546 self.dlg = ChangeOccurrencesDialog(self, title, renamer, 719 self.dlg = ChangeOccurrencesDialog(self, title, renamer,
547 parent=self.__ui) 720 parent=self.__ui)
548 self.dlg.show() 721 self.dlg.show()
722
723 #####################################################
724 ## Undo/Redo refactorings
725 #####################################################
726
727 def __undo(self):
728 """
729 Private slot to undo the last refactoring.
730 """
731 title = self.trUtf8("Undo refactoring")
732 history = self.__project.history
733 res = E5MessageBox.question(None,
734 title,
735 self.trUtf8("""Shall the refactoring <b>{0}</b> be undone?""")\
736 .format(Utilities.html_encode(
737 history.undo_list[-1].description)),
738 QMessageBox.StandardButtons(
739 QMessageBox.No | \
740 QMessageBox.Yes),
741 QMessageBox.No)
742 if res == QMessageBox.Yes:
743 if not self.confirmAllBuffersSaved():
744 return
745
746 changes = history.undo_list[-1]
747 handle = ProgressHandle(self.trUtf8("Undo"), False, self.__ui)
748 handle.show()
749 QApplication.processEvents()
750 try:
751 history.undo(task_handle=handle)
752 except Exception as err:
753 self.handleRopeError(err, title, handle)
754 handle.reset()
755 self.refreshEditors(changes)
756 if self.__e5project.isDirty():
757 self.__e5project.saveProject()
758
759 def __redo(self):
760 """
761 Private slot to redo the last refactoring.
762 """
763 title = self.trUtf8("Redo refactoring")
764 history = self.__project.history
765 res = E5MessageBox.question(None,
766 title,
767 self.trUtf8("""Shall the refactoring <b>{0}</b> be redone?""")\
768 .format(Utilities.html_encode(
769 history.redo_list[-1].description)),
770 QMessageBox.StandardButtons(\
771 QMessageBox.No | \
772 QMessageBox.Yes),
773 QMessageBox.No)
774 if res == QMessageBox.Yes:
775 if not self.confirmAllBuffersSaved():
776 return
777
778 changes = history.redo_list[-1]
779 handle = ProgressHandle(self.trUtf8("Redo"), False, self.__ui)
780 handle.show()
781 QApplication.processEvents()
782 try:
783 history.redo(task_handle=handle)
784 except Exception as err:
785 self.handleRopeError(err, title, handle)
786 handle.reset()
787 self.refreshEditors(changes)
788 if self.__e5project.isDirty():
789 self.__e5project.saveProject()
790
791 def __showProjectUndoHistory(self):
792 """
793 Private method to show list of changes available for an undo operation.
794 """
795 undoList = list(reversed(self.__project.history.undo_list))
796 self.dlg = HistoryDialog(self, undoList, True, self.__ui)
797 self.dlg.show()
798
799 def __showProjectRedoHistory(self):
800 """
801 Private method to show list of changes available for a redo operation.
802 """
803 redoList = self.__project.history.redo_list
804 self.dlg = HistoryDialog(self, redoList, False, self.__ui)
805 self.dlg.show()
806
807 def __showFileUndoHistory(self):
808 """
809 Private method to show list of changes related to the current file
810 available for an undo operation.
811 """
812 aw = e5App().getObject("ViewManager").activeWindow()
813
814 if aw is None:
815 return
816
817 filename = aw.getFileName()
818 resource = rope.base.libutils.path_to_resource(
819 self.__project, filename)
820 undoList = list(reversed(self.__getFileUndoList(resource)))
821 self.dlg = HistoryDialog(self, undoList, True, self.__ui)
822 self.dlg.show()
823
824 def __showFileRedoHistory(self):
825 """
826 Private method to show list of changes related to the current file
827 available for a redo operation.
828 """
829 aw = e5App().getObject("ViewManager").activeWindow()
830
831 if aw is None:
832 return
833
834 filename = aw.getFileName()
835 resource = rope.base.libutils.path_to_resource(
836 self.__project, filename)
837 redoList = self.__getFileRedoList(resource)
838 self.dlg = HistoryDialog(self, redoList, False, self.__ui)
839 self.dlg.show()
840
841 def __clearHistory(self):
842 """
843 Private slot to clear the redo and undo lists.
844 """
845 res = E5MessageBox.question(None,
846 self.trUtf8("Clear History"),
847 self.trUtf8("""Do you really want to clear the undo"""
848 """ and redo history?"""),
849 QMessageBox.StandardButtons(\
850 QMessageBox.No | \
851 QMessageBox.Yes),
852 QMessageBox.No)
853 if res == QMessageBox.Yes:
854 self.__project.history.clear()
549 855
550 ##################################################### 856 #####################################################
551 ## Find actions 857 ## Find actions
552 ##################################################### 858 #####################################################
553 859

eric ide

mercurial