|
1 # -*- coding: utf-8 -*- |
|
2 |
|
3 # Copyright (c) 2006 - 2019 Detlev Offenbach <detlev@die-offenbachs.de> |
|
4 # |
|
5 |
|
6 """ |
|
7 Module implementing the Editor File Handling configuration page. |
|
8 """ |
|
9 |
|
10 from __future__ import unicode_literals |
|
11 |
|
12 from PyQt5.QtCore import pyqtSlot |
|
13 from PyQt5.QtWidgets import QListWidgetItem, QInputDialog, QLineEdit |
|
14 from PyQt5.Qsci import QsciScintilla |
|
15 |
|
16 from E5Gui import E5MessageBox |
|
17 |
|
18 from .ConfigurationPageBase import ConfigurationPageBase |
|
19 from .Ui_EditorFilePage import Ui_EditorFilePage |
|
20 |
|
21 from Utilities import supportedCodecs |
|
22 import Preferences |
|
23 |
|
24 |
|
25 class EditorFilePage(ConfigurationPageBase, Ui_EditorFilePage): |
|
26 """ |
|
27 Class implementing the Editor File Handling configuration page. |
|
28 """ |
|
29 def __init__(self): |
|
30 """ |
|
31 Constructor |
|
32 """ |
|
33 super(EditorFilePage, self).__init__() |
|
34 self.setupUi(self) |
|
35 self.setObjectName("EditorFilePage") |
|
36 |
|
37 self.__showsOpenFilters = True |
|
38 self.openFileFilters = \ |
|
39 Preferences.getEditor("AdditionalOpenFilters")[:] |
|
40 self.saveFileFilters = \ |
|
41 Preferences.getEditor("AdditionalSaveFilters")[:] |
|
42 self.fileFiltersList.addItems(self.openFileFilters) |
|
43 |
|
44 self.__setDefaultFiltersLists() |
|
45 |
|
46 self.defaultEncodingComboBox.addItems(sorted(supportedCodecs)) |
|
47 |
|
48 self.previewMarkdownHTMLFormatComboBox.addItems( |
|
49 ["XHTML1", "HTML4", "HTML5"]) |
|
50 self.previewRestDocutilsHTMLFormatComboBox.addItems( |
|
51 ["HTML4", "HTML5"]) |
|
52 |
|
53 # set initial values |
|
54 self.autosaveSlider.setValue( |
|
55 Preferences.getEditor("AutosaveInterval")) |
|
56 self.createBackupFileCheckBox.setChecked( |
|
57 Preferences.getEditor("CreateBackupFile")) |
|
58 self.defaultEncodingComboBox.setCurrentIndex( |
|
59 self.defaultEncodingComboBox.findText( |
|
60 Preferences.getEditor("DefaultEncoding"))) |
|
61 self.advEncodingCheckBox.setChecked( |
|
62 Preferences.getEditor("AdvancedEncodingDetection")) |
|
63 self.warnFilesizeSpinBox.setValue( |
|
64 Preferences.getEditor("WarnFilesize")) |
|
65 self.clearBreakpointsCheckBox.setChecked( |
|
66 Preferences.getEditor("ClearBreaksOnClose")) |
|
67 self.automaticReopenCheckBox.setChecked( |
|
68 Preferences.getEditor("AutoReopen")) |
|
69 self.stripWhitespaceCheckBox.setChecked( |
|
70 Preferences.getEditor("StripTrailingWhitespace")) |
|
71 self.openFilesFilterComboBox.setCurrentIndex( |
|
72 self.openFilesFilterComboBox.findText( |
|
73 Preferences.getEditor("DefaultOpenFilter"))) |
|
74 self.saveFilesFilterComboBox.setCurrentIndex( |
|
75 self.saveFilesFilterComboBox.findText( |
|
76 Preferences.getEditor("DefaultSaveFilter"))) |
|
77 self.automaticEolConversionCheckBox.setChecked( |
|
78 Preferences.getEditor("AutomaticEOLConversion")) |
|
79 self.insertFinalNewlineCheckBox.setChecked( |
|
80 Preferences.getEditor("InsertFinalNewline")) |
|
81 |
|
82 eolMode = Preferences.getEditor("EOLMode") |
|
83 if eolMode == QsciScintilla.EolWindows: |
|
84 self.crlfRadioButton.setChecked(True) |
|
85 elif eolMode == QsciScintilla.EolMac: |
|
86 self.crRadioButton.setChecked(True) |
|
87 elif eolMode == QsciScintilla.EolUnix: |
|
88 self.lfRadioButton.setChecked(True) |
|
89 |
|
90 self.previewHtmlExtensionsEdit.setText( |
|
91 " ".join(Preferences.getEditor("PreviewHtmlFileNameExtensions"))) |
|
92 self.previewMarkdownExtensionsEdit.setText( |
|
93 " ".join( |
|
94 Preferences.getEditor("PreviewMarkdownFileNameExtensions"))) |
|
95 self.previewRestExtensionsEdit.setText( |
|
96 " ".join(Preferences.getEditor("PreviewRestFileNameExtensions"))) |
|
97 self.previewQssExtensionsEdit.setText( |
|
98 " ".join(Preferences.getEditor("PreviewQssFileNameExtensions"))) |
|
99 self.previewRestSphinxCheckBox.setChecked( |
|
100 Preferences.getEditor("PreviewRestUseSphinx")) |
|
101 self.previewMarkdownNLtoBreakCheckBox.setChecked( |
|
102 Preferences.getEditor("PreviewMarkdownNLtoBR")) |
|
103 index = self.previewMarkdownHTMLFormatComboBox.findText( |
|
104 Preferences.getEditor("PreviewMarkdownHTMLFormat")) |
|
105 self.previewMarkdownHTMLFormatComboBox.setCurrentIndex(index) |
|
106 index = self.previewRestDocutilsHTMLFormatComboBox.findText( |
|
107 Preferences.getEditor("PreviewRestDocutilsHTMLFormat")) |
|
108 self.previewRestDocutilsHTMLFormatComboBox.setCurrentIndex(index) |
|
109 |
|
110 def save(self): |
|
111 """ |
|
112 Public slot to save the Editor File Handling configuration. |
|
113 """ |
|
114 Preferences.setEditor( |
|
115 "AutosaveInterval", |
|
116 self.autosaveSlider.value()) |
|
117 Preferences.setEditor( |
|
118 "CreateBackupFile", |
|
119 self.createBackupFileCheckBox.isChecked()) |
|
120 enc = self.defaultEncodingComboBox.currentText() |
|
121 if not enc: |
|
122 enc = "utf-8" |
|
123 Preferences.setEditor("DefaultEncoding", enc) |
|
124 Preferences.setEditor( |
|
125 "AdvancedEncodingDetection", |
|
126 self.advEncodingCheckBox.isChecked()) |
|
127 Preferences.setEditor( |
|
128 "WarnFilesize", |
|
129 self.warnFilesizeSpinBox.value()) |
|
130 Preferences.setEditor( |
|
131 "ClearBreaksOnClose", |
|
132 self.clearBreakpointsCheckBox.isChecked()) |
|
133 Preferences.setEditor( |
|
134 "AutoReopen", |
|
135 self.automaticReopenCheckBox.isChecked()) |
|
136 Preferences.setEditor( |
|
137 "StripTrailingWhitespace", |
|
138 self.stripWhitespaceCheckBox.isChecked()) |
|
139 Preferences.setEditor( |
|
140 "DefaultOpenFilter", |
|
141 self.openFilesFilterComboBox.currentText()) |
|
142 Preferences.setEditor( |
|
143 "DefaultSaveFilter", |
|
144 self.saveFilesFilterComboBox.currentText()) |
|
145 Preferences.setEditor( |
|
146 "AutomaticEOLConversion", |
|
147 self.automaticEolConversionCheckBox.isChecked()) |
|
148 Preferences.setEditor( |
|
149 "InsertFinalNewline", |
|
150 self.insertFinalNewlineCheckBox.isChecked()) |
|
151 |
|
152 if self.crlfRadioButton.isChecked(): |
|
153 Preferences.setEditor("EOLMode", QsciScintilla.EolWindows) |
|
154 elif self.crRadioButton.isChecked(): |
|
155 Preferences.setEditor("EOLMode", QsciScintilla.EolMac) |
|
156 elif self.lfRadioButton.isChecked(): |
|
157 Preferences.setEditor("EOLMode", QsciScintilla.EolUnix) |
|
158 |
|
159 self.__extractFileFilters() |
|
160 Preferences.setEditor("AdditionalOpenFilters", self.openFileFilters) |
|
161 Preferences.setEditor("AdditionalSaveFilters", self.saveFileFilters) |
|
162 |
|
163 Preferences.setEditor( |
|
164 "PreviewHtmlFileNameExtensions", |
|
165 [ext.strip() for ext in |
|
166 self.previewHtmlExtensionsEdit.text().split()]) |
|
167 Preferences.setEditor( |
|
168 "PreviewMarkdownFileNameExtensions", |
|
169 [ext.strip() for ext in |
|
170 self.previewMarkdownExtensionsEdit.text().split()]) |
|
171 Preferences.setEditor( |
|
172 "PreviewRestFileNameExtensions", |
|
173 [ext.strip() for ext in |
|
174 self.previewRestExtensionsEdit.text().split()]) |
|
175 Preferences.setEditor( |
|
176 "PreviewQssFileNameExtensions", |
|
177 [ext.strip() for ext in |
|
178 self.previewQssExtensionsEdit.text().split()]) |
|
179 Preferences.setEditor( |
|
180 "PreviewRestUseSphinx", |
|
181 self.previewRestSphinxCheckBox.isChecked()) |
|
182 Preferences.setEditor( |
|
183 "PreviewMarkdownNLtoBR", |
|
184 self.previewMarkdownNLtoBreakCheckBox.isChecked()) |
|
185 Preferences.setEditor( |
|
186 "PreviewMarkdownHTMLFormat", |
|
187 self.previewMarkdownHTMLFormatComboBox.currentText()) |
|
188 Preferences.setEditor( |
|
189 "PreviewRestDocutilsHTMLFormat", |
|
190 self.previewRestDocutilsHTMLFormatComboBox.currentText()) |
|
191 |
|
192 def __setDefaultFiltersLists(self, keepSelection=False): |
|
193 """ |
|
194 Private slot to set the default file filter combo boxes. |
|
195 |
|
196 @param keepSelection flag indicating to keep the current selection |
|
197 if possible (boolean) |
|
198 """ |
|
199 if keepSelection: |
|
200 selectedOpenFilter = self.openFilesFilterComboBox.currentText() |
|
201 selectedSaveFilter = self.saveFilesFilterComboBox.currentText() |
|
202 |
|
203 import QScintilla.Lexers |
|
204 openFileFiltersList = QScintilla.Lexers.getOpenFileFiltersList( |
|
205 False, withAdditional=False) + self.openFileFilters |
|
206 openFileFiltersList.sort() |
|
207 self.openFilesFilterComboBox.clear() |
|
208 self.openFilesFilterComboBox.addItems(openFileFiltersList) |
|
209 saveFileFiltersList = QScintilla.Lexers.getSaveFileFiltersList( |
|
210 False, withAdditional=False) + self.saveFileFilters |
|
211 saveFileFiltersList.sort() |
|
212 self.saveFilesFilterComboBox.clear() |
|
213 self.saveFilesFilterComboBox.addItems(saveFileFiltersList) |
|
214 |
|
215 if keepSelection: |
|
216 self.openFilesFilterComboBox.setCurrentIndex( |
|
217 self.openFilesFilterComboBox.findText(selectedOpenFilter)) |
|
218 self.saveFilesFilterComboBox.setCurrentIndex( |
|
219 self.saveFilesFilterComboBox.findText(selectedSaveFilter)) |
|
220 |
|
221 def __extractFileFilters(self): |
|
222 """ |
|
223 Private method to extract the file filters. |
|
224 """ |
|
225 filters = [] |
|
226 for row in range(self.fileFiltersList.count()): |
|
227 filters.append(self.fileFiltersList.item(row).text()) |
|
228 if self.__showsOpenFilters: |
|
229 self.openFileFilters = filters |
|
230 else: |
|
231 self.saveFileFilters = filters |
|
232 |
|
233 def __checkFileFilter(self, fileFilter): |
|
234 """ |
|
235 Private method to check a file filter for validity. |
|
236 |
|
237 @param fileFilter file filter pattern to check (string) |
|
238 @return flag indicating validity (boolean) |
|
239 """ |
|
240 if not self.__showsOpenFilters and \ |
|
241 fileFilter.count("*") != 1: |
|
242 E5MessageBox.critical( |
|
243 self, |
|
244 self.tr("Add File Filter"), |
|
245 self.tr("""A Save File Filter must contain exactly one""" |
|
246 """ wildcard pattern. Yours contains {0}.""") |
|
247 .format(fileFilter.count("*"))) |
|
248 return False |
|
249 |
|
250 if fileFilter.count("*") == 0: |
|
251 E5MessageBox.critical( |
|
252 self, |
|
253 self.tr("Add File Filter"), |
|
254 self.tr("""A File Filter must contain at least one""" |
|
255 """ wildcard pattern.""")) |
|
256 return False |
|
257 |
|
258 return True |
|
259 |
|
260 @pyqtSlot() |
|
261 def on_addFileFilterButton_clicked(self): |
|
262 """ |
|
263 Private slot to add a file filter to the list. |
|
264 """ |
|
265 fileFilter, ok = QInputDialog.getText( |
|
266 self, |
|
267 self.tr("Add File Filter"), |
|
268 self.tr("Enter the file filter entry:"), |
|
269 QLineEdit.Normal) |
|
270 if ok and fileFilter: |
|
271 if self.__checkFileFilter(fileFilter): |
|
272 self.fileFiltersList.addItem(fileFilter) |
|
273 self.__extractFileFilters() |
|
274 self.__setDefaultFiltersLists(keepSelection=True) |
|
275 |
|
276 @pyqtSlot() |
|
277 def on_editFileFilterButton_clicked(self): |
|
278 """ |
|
279 Private slot called to edit a file filter entry. |
|
280 """ |
|
281 fileFilter = self.fileFiltersList.currentItem().text() |
|
282 fileFilter, ok = QInputDialog.getText( |
|
283 self, |
|
284 self.tr("Add File Filter"), |
|
285 self.tr("Enter the file filter entry:"), |
|
286 QLineEdit.Normal, |
|
287 fileFilter) |
|
288 if ok and fileFilter: |
|
289 if self.__checkFileFilter(fileFilter): |
|
290 self.fileFiltersList.currentItem().setText(fileFilter) |
|
291 self.__extractFileFilters() |
|
292 self.__setDefaultFiltersLists(keepSelection=True) |
|
293 |
|
294 @pyqtSlot() |
|
295 def on_deleteFileFilterButton_clicked(self): |
|
296 """ |
|
297 Private slot called to delete a file filter entry. |
|
298 """ |
|
299 self.fileFiltersList.takeItem(self.fileFiltersList.currentRow()) |
|
300 self.__extractFileFilters() |
|
301 self.__setDefaultFiltersLists(keepSelection=True) |
|
302 |
|
303 @pyqtSlot(bool) |
|
304 def on_openFiltersButton_toggled(self, checked): |
|
305 """ |
|
306 Private slot to switch the list of file filters. |
|
307 |
|
308 @param checked flag indicating the check state of the button (boolean) |
|
309 """ |
|
310 self.__extractFileFilters() |
|
311 self.__showsOpenFilters = checked |
|
312 self.fileFiltersList.clear() |
|
313 if checked: |
|
314 self.fileFiltersList.addItems(self.openFileFilters) |
|
315 else: |
|
316 self.fileFiltersList.addItems(self.saveFileFilters) |
|
317 |
|
318 @pyqtSlot(QListWidgetItem, QListWidgetItem) |
|
319 def on_fileFiltersList_currentItemChanged(self, current, previous): |
|
320 """ |
|
321 Private slot to set the state of the edit and delete buttons. |
|
322 |
|
323 @param current new current item (QListWidgetItem) |
|
324 @param previous previous current item (QListWidgetItem) |
|
325 """ |
|
326 self.editFileFilterButton.setEnabled(current is not None) |
|
327 self.deleteFileFilterButton.setEnabled(current is not None) |
|
328 |
|
329 |
|
330 def create(dlg): |
|
331 """ |
|
332 Module function to create the configuration page. |
|
333 |
|
334 @param dlg reference to the configuration dialog |
|
335 @return reference to the instantiated page (ConfigurationPageBase) |
|
336 """ |
|
337 page = EditorFilePage() |
|
338 return page |