|
1 # -*- coding: utf-8 -*- |
|
2 |
|
3 # Copyright (c) 2011 Detlev Offenbach <detlev@die-offenbachs.de> |
|
4 # |
|
5 |
|
6 """ |
|
7 Module implementing the Change Signature dialog. |
|
8 """ |
|
9 |
|
10 import copy |
|
11 |
|
12 from PyQt4.QtCore import pyqtSlot, Qt |
|
13 from PyQt4.QtGui import QDialog, QDialogButtonBox, QListWidgetItem, \ |
|
14 QAbstractButton |
|
15 |
|
16 import rope.refactor.change_signature |
|
17 |
|
18 from Ui_ChangeSignatureDialog import Ui_ChangeSignatureDialog |
|
19 from RefactoringDialogBase import RefactoringDialogBase |
|
20 from AddParameterDialog import AddParameterDialog |
|
21 |
|
22 class ChangeSignatureDialog(RefactoringDialogBase, Ui_ChangeSignatureDialog): |
|
23 """ |
|
24 Class implementing the Change Signature dialog. |
|
25 """ |
|
26 NameRole = Qt.UserRole |
|
27 IsAddedRole = Qt.UserRole + 1 |
|
28 DefaultRole = Qt.UserRole + 2 |
|
29 ValueRole = Qt.UserRole + 3 |
|
30 |
|
31 def __init__(self, refactoring, title, changer, parent=None): |
|
32 """ |
|
33 Constructor |
|
34 |
|
35 @param refactoring reference to the main refactoring object |
|
36 (Refactoring) |
|
37 @param title title of the dialog (string) |
|
38 @param changer reference to the signature changer object |
|
39 (rope.refactor.change_signature.ChangeSignature) |
|
40 @param parent reference to the parent widget (QWidget) |
|
41 """ |
|
42 RefactoringDialogBase.__init__(self, refactoring, title, parent) |
|
43 self.setupUi(self) |
|
44 |
|
45 self.__signature = changer |
|
46 self.__definition_info = self.__signature.get_args() |
|
47 self.__to_be_removed = [] |
|
48 |
|
49 self.__okButton = self.buttonBox.button(QDialogButtonBox.Ok) |
|
50 self.__previewButton = self.buttonBox.addButton( |
|
51 self.trUtf8("Preview"), QDialogButtonBox.ActionRole) |
|
52 self.__previewButton.setDefault(True) |
|
53 |
|
54 # populate the parameters list |
|
55 for arg, default in self.__definition_info: |
|
56 if default is None: |
|
57 itm = QListWidgetItem(arg, self.parameterList) |
|
58 else: |
|
59 itm = QListWidgetItem("{0} = {1}".format(arg, default), |
|
60 self.parameterList) |
|
61 itm.setData(ChangeSignatureDialog.NameRole, arg) |
|
62 itm.setData(ChangeSignatureDialog.IsAddedRole, False) |
|
63 itm.setData(ChangeSignatureDialog.DefaultRole, None) |
|
64 itm.setData(ChangeSignatureDialog.ValueRole, None) |
|
65 |
|
66 if self.parameterList.count(): |
|
67 self.parameterList.setCurrentRow(0) |
|
68 else: |
|
69 self.on_parameterList_currentRowChanged(-1) |
|
70 |
|
71 @pyqtSlot(int) |
|
72 def on_parameterList_currentRowChanged(self, currentRow): |
|
73 """ |
|
74 Private slot called, when the current row is changed. |
|
75 |
|
76 @param currentRow index of the current row (integer) |
|
77 """ |
|
78 if currentRow == -1: |
|
79 self.upButton.setEnabled(False) |
|
80 self.downButton.setEnabled(False) |
|
81 self.removeButton.setEnabled(False) |
|
82 else: |
|
83 maxIndex = self.parameterList.count() - 1 |
|
84 self.upButton.setEnabled(currentRow != 0) |
|
85 self.downButton.setEnabled(currentRow != maxIndex) |
|
86 |
|
87 @pyqtSlot() |
|
88 def on_upButton_clicked(self): |
|
89 """ |
|
90 Private slot called to move the selected item up in the list. |
|
91 """ |
|
92 row = self.parameterList.currentRow() |
|
93 if row == 0: |
|
94 # we're already at the top |
|
95 return |
|
96 |
|
97 itm = self.parameterList.takeItem(row) |
|
98 self.parameterList.insertItem(row - 1, itm) |
|
99 self.parameterList.setCurrentItem(itm) |
|
100 if row == 1: |
|
101 self.upButton.setEnabled(False) |
|
102 else: |
|
103 self.upButton.setEnabled(True) |
|
104 self.downButton.setEnabled(True) |
|
105 |
|
106 @pyqtSlot() |
|
107 def on_downButton_clicked(self): |
|
108 """ |
|
109 Private slot called to move the selected item down in the list. |
|
110 """ |
|
111 rows = self.parameterList.count() |
|
112 row = self.parameterList.currentRow() |
|
113 if row == rows - 1: |
|
114 # we're already at the end |
|
115 return |
|
116 |
|
117 itm = self.parameterList.takeItem(row) |
|
118 self.parameterList.insertItem(row + 1, itm) |
|
119 self.parameterList.setCurrentItem(itm) |
|
120 self.upButton.setEnabled(True) |
|
121 if row == rows - 2: |
|
122 self.downButton.setEnabled(False) |
|
123 else: |
|
124 self.downButton.setEnabled(True) |
|
125 |
|
126 @pyqtSlot() |
|
127 def on_removeButton_clicked(self): |
|
128 """ |
|
129 Private slot to remove a parameter. |
|
130 """ |
|
131 itm = self.parameterList.takeItem(self.parameterList.currentRow()) |
|
132 self.__to_be_removed.append(itm) |
|
133 |
|
134 @pyqtSlot() |
|
135 def on_addButton_clicked(self): |
|
136 """ |
|
137 Private slot to add a new parameter. |
|
138 """ |
|
139 dlg = AddParameterDialog(self) |
|
140 if dlg.exec_() == QDialog.Accepted: |
|
141 name, default, value = dlg.getData() |
|
142 if default: |
|
143 s = "%s = %s" % (name, default) |
|
144 else: |
|
145 s = name |
|
146 itm = QListWidgetItem(s) |
|
147 itm.setData(ChangeSignatureDialog.NameRole, name) |
|
148 itm.setData(ChangeSignatureDialog.IsAddedRole, True) |
|
149 if default: |
|
150 itm.setData(ChangeSignatureDialog.DefaultRole, default) |
|
151 else: |
|
152 itm.setData(ChangeSignatureDialog.DefaultRole, None) |
|
153 if value: |
|
154 itm.setData(ChangeSignatureDialog.ValueRole, value) |
|
155 else: |
|
156 itm.setData(ChangeSignatureDialog.ValueRole, None) |
|
157 if self.parameterList.count(): |
|
158 self.parameterList.insertItem( |
|
159 self.parameterList.currentRow() + 1, itm) |
|
160 else: |
|
161 self.parameterList.addItem(itm) |
|
162 self.parameterList.setCurrentItem(itm) |
|
163 |
|
164 @pyqtSlot(QAbstractButton) |
|
165 def on_buttonBox_clicked(self, button): |
|
166 """ |
|
167 Private slot to act on the button pressed. |
|
168 |
|
169 @param button reference to the button pressed (QAbstractButton) |
|
170 """ |
|
171 if button == self.__previewButton: |
|
172 self.previewChanges() |
|
173 elif button == self.__okButton: |
|
174 self.applyChanges() |
|
175 |
|
176 def __getParameterIndex(self, definition_info, name): |
|
177 """ |
|
178 Private method to calculate the index of the given paramter. |
|
179 |
|
180 @param definition_info object containing the method definition |
|
181 @param name parameter name (string) |
|
182 @return index of the parameter (integer) |
|
183 """ |
|
184 for index, pair in enumerate(definition_info): |
|
185 if pair[0] == name: |
|
186 return index |
|
187 |
|
188 def _calculateChanges(self, handle): |
|
189 """ |
|
190 Protected method to calculate the changes. |
|
191 |
|
192 @param handle reference to the task handle |
|
193 (rope.base.taskhandle.TaskHandle) |
|
194 @return reference to the Changes object (rope.base.change.ChangeSet) |
|
195 """ |
|
196 changers = [] |
|
197 definition_info = copy.deepcopy(self.__definition_info) |
|
198 for itm in self.__to_be_removed: |
|
199 if itm.data(ChangeSignatureDialog.IsAddedRole): |
|
200 continue |
|
201 index = self.__getParameterIndex(definition_info, |
|
202 itm.data(ChangeSignatureDialog.NameRole)) |
|
203 remover = rope.refactor.change_signature.ArgumentRemover(index) |
|
204 changers.append(remover) |
|
205 del definition_info[index] |
|
206 |
|
207 for index in range(self.parameterList.count()): |
|
208 itm = self.parameterList.item(index) |
|
209 if itm.data(ChangeSignatureDialog.IsAddedRole): |
|
210 name = itm.data(ChangeSignatureDialog.NameRole) |
|
211 default = itm.data(ChangeSignatureDialog.DefaultRole) |
|
212 value = itm.data(ChangeSignatureDialog.ValueRole) |
|
213 adder = rope.refactor.change_signature.ArgumentAdder( |
|
214 index, name, default, value) |
|
215 changers.append(adder) |
|
216 try: |
|
217 definition_info.insert(index, (name, default)) |
|
218 except Exception as err: |
|
219 self._refactoring.handleRopeError(err, self._title) |
|
220 |
|
221 new_ordering = [] |
|
222 for row in range(self.parameterList.count()): |
|
223 itm = self.parameterList.item(row) |
|
224 name = itm.data(ChangeSignatureDialog.NameRole) |
|
225 new_ordering.append( |
|
226 self.__getParameterIndex(definition_info, name)) |
|
227 autodef = self.autodefEdit.text() |
|
228 if not autodef: |
|
229 autodef = None |
|
230 changers.append(rope.refactor.change_signature.ArgumentReorderer( |
|
231 new_ordering, autodef=autodef)) |
|
232 |
|
233 try: |
|
234 changes = self.__signature.get_changes( |
|
235 changers, in_hierarchy=self.hierarchyCheckBox.isChecked(), |
|
236 task_handle=handle) |
|
237 return changes |
|
238 except Exception as err: |
|
239 self._refactoring.handleRopeError(err, self._title, handle) |
|
240 return None |