Plugins/WizardPlugins/PyRegExpWizard/PyRegExpWizardCharactersDialog.py

changeset 0
de9c2efb9d02
child 12
1d8dd9706f46
equal deleted inserted replaced
-1:000000000000 0:de9c2efb9d02
1 # -*- coding: utf-8 -*-
2
3 # Copyright (c) 2004 - 2009 Detlev Offenbach <detlev@die-offenbachs.de>
4 #
5
6 """
7 Module implementing a dialog for entering character classes.
8 """
9
10 from PyQt4.QtCore import *
11 from PyQt4.QtGui import *
12
13 from Ui_PyRegExpWizardCharactersDialog import Ui_PyRegExpWizardCharactersDialog
14
15
16 class PyRegExpWizardCharactersDialog(QDialog, Ui_PyRegExpWizardCharactersDialog):
17 """
18 Class implementing a dialog for entering character classes.
19 """
20 specialChars = {
21 4 : "\\a",
22 5 : "\\f",
23 6 : "\\n",
24 7 : "\\r",
25 8 : "\\t",
26 9 : "\\v"
27 }
28
29 predefinedClasses = ["\\s", "\\S", "\\w", "\\W", "\\d", "\\D"]
30
31 def __init__(self,parent = None):
32 """
33 Constructor
34
35 @param parent parent widget (QWidget)
36 """
37 QDialog.__init__(self,parent)
38 self.setupUi(self)
39
40 self.comboItems = []
41 self.comboItems.append(self.trUtf8("Normal character"))
42 self.comboItems.append(self.trUtf8("Unicode character in hexadecimal notation"))
43 self.comboItems.append(self.trUtf8("Unicode character in octal notation"))
44 self.comboItems.append(self.trUtf8("---"))
45 self.comboItems.append(self.trUtf8("Bell character (\\a)"))
46 self.comboItems.append(self.trUtf8("Page break (\\f)"))
47 self.comboItems.append(self.trUtf8("Line feed (\\n)"))
48 self.comboItems.append(self.trUtf8("Carriage return (\\r)"))
49 self.comboItems.append(self.trUtf8("Horizontal tabulator (\\t)"))
50 self.comboItems.append(self.trUtf8("Vertical tabulator (\\v)"))
51
52 self.charValidator = QRegExpValidator(QRegExp(".{0,1}"), self)
53 self.hexValidator = QRegExpValidator(QRegExp("[0-9a-fA-F]{0,4}"), self)
54 self.octValidator = QRegExpValidator(QRegExp("[0-3]?[0-7]{0,2}"), self)
55
56 # generate dialog part for single characters
57 self.singlesBoxLayout = QVBoxLayout(self.singlesBox)
58 self.singlesBoxLayout.setObjectName("singlesBoxLayout")
59 self.singlesBoxLayout.setSpacing(6)
60 self.singlesBoxLayout.setMargin(6)
61 self.singlesBox.setLayout(self.singlesBoxLayout)
62 self.singlesView = QScrollArea(self.singlesBox)
63 self.singlesView.setObjectName("singlesView")
64 self.singlesBoxLayout.addWidget(self.singlesView)
65
66 self.singlesItemsBox = QWidget(self)
67 self.singlesView.setWidget(self.singlesItemsBox)
68 self.singlesItemsBox.setObjectName("singlesItemsBox")
69 self.singlesItemsBoxLayout = QVBoxLayout(self.singlesItemsBox)
70 self.singlesItemsBoxLayout.setMargin(6)
71 self.singlesItemsBoxLayout.setSpacing(6)
72 self.singlesItemsBox.setLayout(self.singlesItemsBoxLayout)
73 self.singlesEntries = []
74 self.__addSinglesLine()
75
76 hlayout0 = QHBoxLayout()
77 hlayout0.setMargin(0)
78 hlayout0.setSpacing(6)
79 hlayout0.setObjectName("hlayout0")
80 self.moreSinglesButton = QPushButton(self.trUtf8("Additional Entries"),
81 self.singlesBox)
82 self.moreSinglesButton.setObjectName("moreSinglesButton")
83 hlayout0.addWidget(self.moreSinglesButton)
84 hspacer0 = QSpacerItem(30,20,QSizePolicy.Expanding,QSizePolicy.Minimum)
85 hlayout0.addItem(hspacer0)
86 self.singlesBoxLayout.addLayout(hlayout0)
87 self.connect(self.moreSinglesButton, SIGNAL("clicked()"), self.__addSinglesLine)
88
89 # generate dialog part for character ranges
90 self.rangesBoxLayout = QVBoxLayout(self.rangesBox)
91 self.rangesBoxLayout.setObjectName("rangesBoxLayout")
92 self.rangesBoxLayout.setSpacing(6)
93 self.rangesBoxLayout.setMargin(6)
94 self.rangesBox.setLayout(self.rangesBoxLayout)
95 self.rangesView = QScrollArea(self.rangesBox)
96 self.rangesView.setObjectName("rangesView")
97 self.rangesBoxLayout.addWidget(self.rangesView)
98
99 self.rangesItemsBox = QWidget(self)
100 self.rangesView.setWidget(self.rangesItemsBox)
101 self.rangesItemsBox.setObjectName("rangesItemsBox")
102 self.rangesItemsBoxLayout = QVBoxLayout(self.rangesItemsBox)
103 self.rangesItemsBoxLayout.setMargin(6)
104 self.rangesItemsBoxLayout.setSpacing(6)
105 self.rangesItemsBox.setLayout(self.rangesItemsBoxLayout)
106 self.rangesEntries = []
107 self.__addRangesLine()
108
109 hlayout1 = QHBoxLayout()
110 hlayout1.setMargin(0)
111 hlayout1.setSpacing(6)
112 hlayout1.setObjectName("hlayout1")
113 self.moreRangesButton = QPushButton(self.trUtf8("Additional Entries"),
114 self.rangesBox)
115 self.moreSinglesButton.setObjectName("moreRangesButton")
116 hlayout1.addWidget(self.moreRangesButton)
117 hspacer1 = QSpacerItem(30,20,QSizePolicy.Expanding,QSizePolicy.Minimum)
118 hlayout1.addItem(hspacer1)
119 self.rangesBoxLayout.addLayout(hlayout1)
120 self.connect(self.moreRangesButton, SIGNAL("clicked()"), self.__addRangesLine)
121
122 def __addSinglesLine(self):
123 """
124 Private slot to add a line of entry widgets for single characters.
125 """
126 hbox = QWidget(self.singlesItemsBox)
127 hboxLayout = QHBoxLayout(hbox)
128 hboxLayout.setMargin(0)
129 hboxLayout.setSpacing(6)
130 hbox.setLayout(hboxLayout)
131 cb1 = QComboBox(hbox)
132 cb1.setEditable(False)
133 cb1.addItems(self.comboItems)
134 hboxLayout.addWidget(cb1)
135 le1 = QLineEdit(hbox)
136 le1.setValidator(self.charValidator)
137 hboxLayout.addWidget(le1)
138 cb2 = QComboBox(hbox)
139 cb2.setEditable(False)
140 cb2.addItems(self.comboItems)
141 hboxLayout.addWidget(cb2)
142 le2 = QLineEdit(hbox)
143 le2.setValidator(self.charValidator)
144 hboxLayout.addWidget(le2)
145 self.singlesItemsBoxLayout.addWidget(hbox)
146
147 self.connect(cb1, SIGNAL('activated(int)'), self.__singlesCharTypeSelected)
148 self.connect(cb2, SIGNAL('activated(int)'), self.__singlesCharTypeSelected)
149 hbox.show()
150
151 self.singlesItemsBox.adjustSize()
152
153 self.singlesEntries.append([cb1, le1])
154 self.singlesEntries.append([cb2, le2])
155
156 def __addRangesLine(self):
157 """
158 Private slot to add a line of entry widgets for character ranges.
159 """
160 hbox = QWidget(self.rangesItemsBox)
161 hboxLayout = QHBoxLayout(hbox)
162 hboxLayout.setMargin(0)
163 hboxLayout.setSpacing(6)
164 hbox.setLayout(hboxLayout)
165 l1 = QLabel(self.trUtf8("Between:"), hbox)
166 hboxLayout.addWidget(l1)
167 cb1 = QComboBox(hbox)
168 cb1.setEditable(False)
169 cb1.addItems(self.comboItems)
170 hboxLayout.addWidget(cb1)
171 le1 = QLineEdit(hbox)
172 le1.setValidator(self.charValidator)
173 hboxLayout.addWidget(le1)
174 l2 = QLabel(self.trUtf8("And:"), hbox)
175 hboxLayout.addWidget(l2)
176 cb2 = QComboBox(hbox)
177 cb2.setEditable(False)
178 cb2.addItems(self.comboItems)
179 hboxLayout.addWidget(cb2)
180 le2 = QLineEdit(hbox)
181 le2.setValidator(self.charValidator)
182 hboxLayout.addWidget(le2)
183 self.rangesItemsBoxLayout.addWidget(hbox)
184
185 self.connect(cb1, SIGNAL('activated(int)'), self.__rangesCharTypeSelected)
186 self.connect(cb2, SIGNAL('activated(int)'), self.__rangesCharTypeSelected)
187 hbox.show()
188
189 self.rangesItemsBox.adjustSize()
190
191 self.rangesEntries.append([cb1, le1, cb2, le2])
192
193 def __performSelectedAction(self, index, lineedit):
194 """
195 Private method performing some actions depending on the input.
196
197 @param index selected list index (integer)
198 @param lineedit line edit widget to act on (QLineEdit)
199 """
200 if index < 3:
201 lineedit.setEnabled(True)
202 if index == 0:
203 lineedit.setValidator(self.charValidator)
204 elif index == 1:
205 lineedit.setValidator(self.hexValidator)
206 elif index == 2:
207 lineedit.setValidator(self.octValidator)
208 elif index > 3:
209 lineedit.setEnabled(False)
210 lineedit.clear()
211
212 def __singlesCharTypeSelected(self, index):
213 """
214 Private slot to handle the activated(int) signal of the single chars combo boxes.
215
216 @param index selected list index (integer)
217 """
218 combo = self.sender()
219 for entriesList in self.singlesEntries:
220 if combo == entriesList[0]:
221 self.__performSelectedAction(index, entriesList[1])
222 break
223
224 def __rangesCharTypeSelected(self, index):
225 """
226 Private slot to handle the activated(int) signal of the char ranges combo boxes.
227
228 @param index selected list index (integer)
229 """
230 combo = self.sender()
231 for entriesList in self.rangesEntries:
232 if combo == entriesList[0]:
233 self.__performSelectedAction(index, entriesList[1])
234 break
235 elif combo == entriesList[2]:
236 self.__performSelectedAction(index, entriesList[3])
237 break
238
239 def __formatCharacter(self, index, char):
240 """
241 Private method to format the characters entered into the dialog.
242
243 @param index selected list index (integer)
244 @param char character string enetered into the dialog (string)
245 @return formated character string (string)
246 """
247 if index == 0:
248 return char
249 elif index == 1:
250 return "\\x%s" % char.lower()
251 elif index == 2:
252 return "\\0%s" % char
253 else:
254 try:
255 return self.specialChars[index]
256 except KeyError:
257 return ""
258
259 def getCharacters(self):
260 """
261 Public method to return the character string assembled via the dialog.
262
263 @return formatted string for character classes (string)
264 """
265 regexp = ""
266
267 # negative character range
268 if self.negativeCheckBox.isChecked():
269 regexp += "^"
270
271 # predefined character ranges
272 if self.wordCharCheckBox.isChecked():
273 regexp += "\\w"
274 if self.nonWordCharCheckBox.isChecked():
275 regexp += "\\W"
276 if self.digitsCheckBox.isChecked():
277 regexp += "\\d"
278 if self.nonDigitsCheckBox.isChecked():
279 regexp += "\\D"
280 if self.whitespaceCheckBox.isChecked():
281 regexp += "\\s"
282 if self.nonWhitespaceCheckBox.isChecked():
283 regexp += "\\S"
284
285 # single characters
286 for entrieslist in self.singlesEntries:
287 index = entrieslist[0].currentIndex()
288 char = entrieslist[1].text()
289 regexp += self.__formatCharacter(index, char)
290
291 # character ranges
292 for entrieslist in self.rangesEntries:
293 if entrieslist[1].text() == "" or \
294 entrieslist[3].text() == "":
295 continue
296 index = entrieslist[0].currentIndex()
297 char = entrieslist[1].text()
298 regexp += "%s-" % self.__formatCharacter(index, char)
299 index = entrieslist[2].currentIndex()
300 char = entrieslist[3].text()
301 regexp += self.__formatCharacter(index, char)
302
303 if regexp:
304 if len(regexp) == 2 and regexp in self.predefinedClasses:
305 return regexp
306 else:
307 return "[%s]" % regexp
308 else:
309 return ""

eric ide

mercurial