|
1 # -*- coding: utf-8 -*- |
|
2 |
|
3 # Copyright (c) 2011 Detlev Offenbach <detlev@die-offenbachs.de> |
|
4 # |
|
5 |
|
6 """ |
|
7 Module implementing the Restructure dialog. |
|
8 """ |
|
9 |
|
10 from PyQt4.QtCore import pyqtSlot |
|
11 from PyQt4.QtGui import QDialogButtonBox, QAbstractButton |
|
12 |
|
13 import rope.refactor.restructure |
|
14 |
|
15 from Ui_RestructureDialog import Ui_RestructureDialog |
|
16 from RefactoringDialogBase import RefactoringDialogBase |
|
17 |
|
18 class RestructureDialog(RefactoringDialogBase, Ui_RestructureDialog): |
|
19 """ |
|
20 Class implementing the Restructure dialog. |
|
21 """ |
|
22 history = None |
|
23 |
|
24 def __init__(self, refactoring, title, parent = None): |
|
25 """ |
|
26 Constructor |
|
27 |
|
28 @param refactoring reference to the main refactoring object |
|
29 (Refactoring) |
|
30 @param title title of the dialog (string) |
|
31 @param parent reference to the parent widget (QWidget) |
|
32 """ |
|
33 RefactoringDialogBase.__init__(self, refactoring, title, parent) |
|
34 self.setupUi(self) |
|
35 |
|
36 self.__okButton = self.buttonBox.button(QDialogButtonBox.Ok) |
|
37 self.__okButton.setEnabled(False) |
|
38 self.__previewButton = self.buttonBox.addButton( |
|
39 self.trUtf8("Preview"), QDialogButtonBox.ActionRole) |
|
40 self.__previewButton.setDefault(True) |
|
41 |
|
42 self.__loadData() |
|
43 |
|
44 def __updateUI(self): |
|
45 """ |
|
46 Private slot to update the UI. |
|
47 """ |
|
48 self.__okButton.setEnabled(self.patternEdit.toPlainText() != "" and \ |
|
49 self.goalEdit.toPlainText() != "") |
|
50 |
|
51 @pyqtSlot() |
|
52 def on_patternEdit_textChanged(self): |
|
53 """ |
|
54 Private slot to react to changes of the pattern. |
|
55 """ |
|
56 self.__updateUI() |
|
57 |
|
58 @pyqtSlot() |
|
59 def on_goalEdit_textChanged(self): |
|
60 """ |
|
61 Private slot to react to changes of the goal. |
|
62 """ |
|
63 self.__updateUI() |
|
64 |
|
65 @pyqtSlot(QAbstractButton) |
|
66 def on_buttonBox_clicked(self, button): |
|
67 """ |
|
68 Private slot to act on the button pressed. |
|
69 |
|
70 @param button reference to the button pressed (QAbstractButton) |
|
71 """ |
|
72 if button == self.__previewButton: |
|
73 self.previewChanges() |
|
74 elif button == self.__okButton: |
|
75 self.applyChanges() |
|
76 |
|
77 def _calculateChanges(self, handle): |
|
78 """ |
|
79 Protected method to calculate the changes. |
|
80 |
|
81 @param handle reference to the task handle |
|
82 (rope.base.taskhandle.TaskHandle) |
|
83 @return reference to the Changes object (rope.base.change.ChangeSet) |
|
84 """ |
|
85 self.__saveData() |
|
86 pattern = self.patternEdit.toPlainText() |
|
87 goal = self.goalEdit.toPlainText() |
|
88 imports = [line for line in self.importsEdit.toPlainText().splitlines() |
|
89 if line.strip()] |
|
90 |
|
91 args = {} |
|
92 checks = self.argsEdit.toPlainText().splitlines() |
|
93 for check in checks: |
|
94 if ':' in check: |
|
95 splitted = check.split(':', 1) |
|
96 name = splitted[0].strip() |
|
97 value = splitted[1].strip() |
|
98 args[name] = value |
|
99 |
|
100 self._refactoring.getProject().validate( |
|
101 self._refactoring.getProject().root) |
|
102 try: |
|
103 restructuring = rope.refactor.restructure.Restructure( |
|
104 self._refactoring.getProject(), pattern, goal, |
|
105 args=args, imports=imports) |
|
106 changes = restructuring.get_changes(task_handle=handle) |
|
107 except Exception as err: |
|
108 self._refactoring.handleRopeError(err, self._title) |
|
109 return None |
|
110 |
|
111 return changes |
|
112 |
|
113 def __saveData(self): |
|
114 """ |
|
115 Private slot to save the data for later reuse. |
|
116 """ |
|
117 data = {'pattern' : self.patternEdit.toPlainText(), |
|
118 'goal' : self.goalEdit.toPlainText(), |
|
119 'checks' : self.argsEdit.toPlainText(), |
|
120 'imports' : self.importsEdit.toPlainText() |
|
121 } |
|
122 RestructureDialog.history = data |
|
123 |
|
124 def __loadData(self): |
|
125 """ |
|
126 Private slot to load the history data into the dialog. |
|
127 """ |
|
128 if RestructureDialog.history is not None: |
|
129 data = RestructureDialog.history |
|
130 self.patternEdit.setPlainText(data['pattern']) |
|
131 self.goalEdit.setPlainText(data['goal']) |
|
132 self.argsEdit.setPlainText(data['checks']) |
|
133 self.importsEdit.setPlainText(data['imports']) |