|
1 # -*- coding: utf-8 -*- |
|
2 |
|
3 # Copyright (c) 2011 Detlev Offenbach <detlev@die-offenbachs.de> |
|
4 # |
|
5 |
|
6 """ |
|
7 Module implementing the Inline Argument Default dialog. |
|
8 """ |
|
9 |
|
10 from PyQt4.QtCore import pyqtSlot, Qt |
|
11 from PyQt4.QtGui import QDialogButtonBox, QListWidgetItem, QAbstractButton |
|
12 |
|
13 import rope.refactor.change_signature |
|
14 |
|
15 from Ui_InlineArgumentDefaultDialog import Ui_InlineArgumentDefaultDialog |
|
16 from RefactoringDialogBase import RefactoringDialogBase |
|
17 |
|
18 class InlineArgumentDefaultDialog(RefactoringDialogBase, |
|
19 Ui_InlineArgumentDefaultDialog): |
|
20 """ |
|
21 Class implementing the Inline Argument Default dialog. |
|
22 """ |
|
23 NameRole = Qt.UserRole |
|
24 |
|
25 def __init__(self, refactoring, title, changer, parent=None): |
|
26 """ |
|
27 Constructor |
|
28 |
|
29 @param refactoring reference to the main refactoring object |
|
30 (Refactoring) |
|
31 @param title title of the dialog (string) |
|
32 @param changer reference to the signature changer object |
|
33 (rope.refactor.change_signature.ChangeSignature) |
|
34 @param parent reference to the parent widget (QWidget) |
|
35 """ |
|
36 RefactoringDialogBase.__init__(self, refactoring, title, parent) |
|
37 self.setupUi(self) |
|
38 |
|
39 self.__signature = changer |
|
40 self.__definition_info = self.__signature.get_args() |
|
41 |
|
42 self.__okButton = self.buttonBox.button(QDialogButtonBox.Ok) |
|
43 self.__okButton.setEnabled(False) |
|
44 self.__previewButton = self.buttonBox.addButton( |
|
45 self.trUtf8("Preview"), QDialogButtonBox.ActionRole) |
|
46 self.__previewButton.setDefault(True) |
|
47 self.__previewButton.setEnabled(False) |
|
48 |
|
49 # populate the parameters list |
|
50 for arg, default in self.__definition_info: |
|
51 if default is not None: |
|
52 itm = QListWidgetItem("{0} = {1}".format(arg, default), |
|
53 self.parameterList) |
|
54 itm.setData(InlineArgumentDefaultDialog.NameRole, arg) |
|
55 |
|
56 @pyqtSlot() |
|
57 def on_parameterList_itemSelectionChanged(self): |
|
58 """ |
|
59 Private slot called, when the selection changes. |
|
60 """ |
|
61 self.__okButton.setEnabled( |
|
62 len(self.parameterList.selectedItems()) > 0) |
|
63 self.__previewButton.setEnabled( |
|
64 len(self.parameterList.selectedItems()) > 0) |
|
65 |
|
66 @pyqtSlot(QAbstractButton) |
|
67 def on_buttonBox_clicked(self, button): |
|
68 """ |
|
69 Private slot to act on the button pressed. |
|
70 |
|
71 @param button reference to the button pressed (QAbstractButton) |
|
72 """ |
|
73 if button == self.__previewButton: |
|
74 self.previewChanges() |
|
75 elif button == self.__okButton: |
|
76 self.applyChanges() |
|
77 |
|
78 def __getParameterIndex(self, definition_info, name): |
|
79 """ |
|
80 Private method to calculate the index of the given paramter. |
|
81 |
|
82 @param definition_info object containing the method definition |
|
83 @param name parameter name (string) |
|
84 @return index of the parameter (integer) |
|
85 """ |
|
86 for index, pair in enumerate(definition_info): |
|
87 if pair[0] == name: |
|
88 return index |
|
89 |
|
90 def _calculateChanges(self, handle): |
|
91 """ |
|
92 Protected method to calculate the changes. |
|
93 |
|
94 @param handle reference to the task handle |
|
95 (rope.base.taskhandle.TaskHandle) |
|
96 @return reference to the Changes object (rope.base.change.ChangeSet) |
|
97 """ |
|
98 items = self.parameterList.selectedItems() |
|
99 if len(items) > 0: |
|
100 itm = items[0] |
|
101 name = itm.data(InlineArgumentDefaultDialog.NameRole) |
|
102 index = self.__getParameterIndex(self.__definition_info, name) |
|
103 try: |
|
104 inliner = \ |
|
105 rope.refactor.change_signature.ArgumentDefaultInliner( |
|
106 index) |
|
107 changes = self.__signature.get_changes([inliner], |
|
108 task_handle=handle) |
|
109 return changes |
|
110 except Exception as err: |
|
111 self._refactoring.handleRopeError(err, self._title, handle) |
|
112 return None |