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