eric6/Preferences/ConfigurationPages/EditorKeywordsPage.py

changeset 6942
2602857055c5
parent 6880
51f8a56f0b42
child 7229
53054eb5b15a
equal deleted inserted replaced
6941:f99d60d6b59b 6942:2602857055c5
1 # -*- coding: utf-8 -*-
2
3 # Copyright (c) 2010 - 2019 Detlev Offenbach <detlev@die-offenbachs.de>
4 #
5
6 """
7 Module implementing the editor highlighter keywords configuration page.
8 """
9
10 from __future__ import unicode_literals
11
12 from PyQt5.QtCore import pyqtSlot
13
14 from E5Gui import E5MessageBox
15
16 from .ConfigurationPageBase import ConfigurationPageBase
17 from .Ui_EditorKeywordsPage import Ui_EditorKeywordsPage
18
19 import Preferences
20
21
22 class EditorKeywordsPage(ConfigurationPageBase, Ui_EditorKeywordsPage):
23 """
24 Class implementing the editor highlighter keywords configuration page.
25 """
26 MaxKeywordSets = 8 # max. 8 sets are allowed
27
28 def __init__(self):
29 """
30 Constructor
31 """
32 super(EditorKeywordsPage, self).__init__()
33 self.setupUi(self)
34 self.setObjectName("EditorKeywordsPage")
35
36 # set initial values
37 import QScintilla.Lexers
38 from QScintilla.Lexers.LexerContainer import LexerContainer
39
40 self.__keywords = {
41 "": {
42 "Sets": [""] * (self.MaxKeywordSets + 1),
43 "Descriptions": [""] * (self.MaxKeywordSets + 1),
44 "MaxSets": 0,
45 }
46 }
47
48 languages = sorted(
49 [''] + list(QScintilla.Lexers.getSupportedLanguages().keys()))
50 for lang in languages:
51 if lang:
52 lex = QScintilla.Lexers.getLexer(lang)
53 if isinstance(lex, LexerContainer):
54 continue
55 keywords = Preferences.getEditorKeywords(lang)[:]
56 if keywords:
57 # set empty entries to default values
58 for kwSet in range(1, self.MaxKeywordSets + 1):
59 if not keywords[kwSet]:
60 kw = lex.defaultKeywords(kwSet)
61 if kw is None:
62 kw = ""
63 keywords[kwSet] = kw
64 else:
65 keywords = [""]
66 descriptions = [""]
67 for kwSet in range(1, self.MaxKeywordSets + 1):
68 kw = lex.keywords(kwSet)
69 if kw is None:
70 kw = ""
71 keywords.append(kw)
72 descriptions = [""]
73 for kwSet in range(1, self.MaxKeywordSets + 1):
74 desc = lex.keywordsDescription(kwSet)
75 descriptions.append(desc)
76 defaults = [""]
77 for kwSet in range(1, self.MaxKeywordSets + 1):
78 dkw = lex.defaultKeywords(kwSet)
79 if dkw is None:
80 dkw = ""
81 defaults.append(dkw)
82 self.__keywords[lang] = {
83 "Sets": keywords,
84 "Descriptions": descriptions,
85 "DefaultSets": defaults,
86 "MaxSets": lex.maximumKeywordSet(),
87 }
88 self.languageCombo.addItem(
89 QScintilla.Lexers.getLanguageIcon(lang, False),
90 lang)
91
92 self.currentLanguage = ''
93 self.currentSet = 1
94 self.on_languageCombo_activated(self.currentLanguage)
95
96 def save(self):
97 """
98 Public slot to save the editor highlighter keywords configuration.
99 """
100 lang = self.languageCombo.currentText()
101 kwSet = self.setSpinBox.value()
102 self.__keywords[lang]["Sets"][kwSet] = self.keywordsEdit.toPlainText()
103
104 for lang, keywords in self.__keywords.items():
105 Preferences.setEditorKeywords(lang, keywords["Sets"])
106
107 @pyqtSlot(str)
108 def on_languageCombo_activated(self, language):
109 """
110 Private slot to fill the keywords edit.
111
112 @param language selected language
113 @type str
114 """
115 self.defaultButton.setEnabled(bool(language))
116 self.allDefaultButton.setEnabled(bool(language))
117
118 if self.currentLanguage == language:
119 return
120
121 if self.setSpinBox.value() == 1:
122 self.on_setSpinBox_valueChanged(1)
123 if self.__keywords[language]["MaxSets"]:
124 first = 1
125 last = self.__keywords[language]["MaxSets"]
126 else:
127 first, last = self.MaxKeywordSets + 1, 0
128 for kwSet in range(1, self.MaxKeywordSets + 1):
129 if self.__keywords[language]["Descriptions"][kwSet] != "":
130 first = min(first, kwSet)
131 last = max(last, kwSet)
132 self.setSpinBox.setEnabled(language != "" and
133 first <= self.MaxKeywordSets)
134 self.keywordsEdit.setEnabled(language != "" and
135 first <= self.MaxKeywordSets)
136 if first <= self.MaxKeywordSets:
137 self.setSpinBox.setMinimum(first)
138 self.setSpinBox.setMaximum(last)
139 self.setSpinBox.setValue(first)
140 else:
141 self.setSpinBox.setMinimum(0)
142 self.setSpinBox.setMaximum(0)
143 self.setSpinBox.setValue(0)
144
145 @pyqtSlot(int)
146 def on_setSpinBox_valueChanged(self, kwSet):
147 """
148 Private slot to fill the keywords edit.
149
150 @param kwSet number of the selected keyword set
151 @type int
152 """
153 language = self.languageCombo.currentText()
154 if self.currentLanguage == language and self.currentSet == kwSet:
155 return
156
157 self.__keywords[self.currentLanguage]["Sets"][self.currentSet] = \
158 self.keywordsEdit.toPlainText()
159
160 self.currentLanguage = language
161 self.currentSet = kwSet
162 self.setDescriptionLabel.setText("<b>{0}</b>".format(
163 self.__keywords[language]["Descriptions"][kwSet]))
164 self.keywordsEdit.setPlainText(
165 self.__keywords[language]["Sets"][kwSet])
166
167 @pyqtSlot()
168 def on_defaultButton_clicked(self):
169 """
170 Private slot to set the current keyword set to default values.
171 """
172 if bool(self.keywordsEdit.toPlainText()):
173 ok = E5MessageBox.yesNo(
174 self,
175 self.tr("Reset to Default"),
176 self.tr("Shall the current keyword set really be reset to"
177 " default values?"))
178 else:
179 ok = True
180 if ok:
181 language = self.languageCombo.currentText()
182 kwSet = self.setSpinBox.value()
183 self.__keywords[language]["Sets"][kwSet] = \
184 self.__keywords[language]["DefaultSets"][kwSet]
185 self.keywordsEdit.setPlainText(
186 self.__keywords[language]["Sets"][kwSet])
187
188 @pyqtSlot()
189 def on_allDefaultButton_clicked(self):
190 """
191 Private slot to set all keyword sets of the current language to default
192 values.
193 """
194 ok = E5MessageBox.yesNo(
195 self,
196 self.tr("Reset All to Default"),
197 self.tr("Shall all keyword sets of the current language really be"
198 " reset to default values?"))
199 if ok:
200 language = self.languageCombo.currentText()
201 kwSet = self.setSpinBox.value()
202 self.__keywords[language]["Sets"] = \
203 self.__keywords[language]["DefaultSets"][:]
204 self.keywordsEdit.setPlainText(
205 self.__keywords[language]["Sets"][kwSet])
206
207
208 def create(dlg):
209 """
210 Module function to create the configuration page.
211
212 @param dlg reference to the configuration dialog
213 @type ConfigurationWidget
214 @return reference to the instantiated page
215 @rtype ConfigurationPageBase
216 """
217 page = EditorKeywordsPage()
218 return page

eric ide

mercurial