15 |
15 |
16 import Globals |
16 import Globals |
17 import Utilities |
17 import Utilities |
18 |
18 |
19 |
19 |
20 __msgHandlerDialog = None |
20 _msgHandlerDialog = None |
21 __origMsgHandler = None |
21 _origMsgHandler = None |
|
22 |
|
23 _filterSettings = QSettings( |
|
24 QSettings.IniFormat, |
|
25 QSettings.UserScope, |
|
26 Globals.settingsNameOrganization, |
|
27 "eric6messagefilters") |
|
28 _defaultFilters = [ |
|
29 "QFont::", |
|
30 "QCocoaMenu::removeMenuItem", |
|
31 "QCocoaMenu::insertNative", |
|
32 ",type id:", |
|
33 "Remote debugging server started successfully", |
|
34 "Uncaught SecurityError:", |
|
35 "Content Security Policy", |
|
36 "QXcbClipboard:", |
|
37 "QXcbConnection: XCB error", |
|
38 "libpng warning: iCCP:", |
|
39 ] |
|
40 |
|
41 |
|
42 def filterMessage(message): |
|
43 """ |
|
44 Module function to filter messages. |
|
45 |
|
46 @param message message to be checked |
|
47 @type str |
|
48 @return flag indicating that the message should be filtered out |
|
49 @rtype bool |
|
50 """ |
|
51 for filterStr in Globals.toList(_filterSettings.value( |
|
52 "MessageFilters", _defaultFilters)): |
|
53 if filterStr in message: |
|
54 return True |
|
55 |
|
56 return False |
22 |
57 |
23 |
58 |
24 class E5ErrorMessage(QErrorMessage): |
59 class E5ErrorMessage(QErrorMessage): |
25 """ |
60 """ |
26 Class implementing a specialized error message dialog. |
61 Class implementing a specialized error message dialog. |
27 """ |
62 """ |
28 def __init__(self, parent=None): |
63 def __init__(self, parent=None): |
29 """ |
64 """ |
30 Constructor |
65 Constructor |
31 |
66 |
32 @param parent reference to the parent widget (QWidget) |
67 @param parent reference to the parent widget |
|
68 @type QWidget |
33 """ |
69 """ |
34 super(E5ErrorMessage, self).__init__(parent) |
70 super(E5ErrorMessage, self).__init__(parent) |
35 |
|
36 self.settings = QSettings( |
|
37 QSettings.IniFormat, |
|
38 QSettings.UserScope, |
|
39 Globals.settingsNameOrganization, |
|
40 "eric6messagefilters") |
|
41 |
|
42 self.__defaultFilters = [ |
|
43 "QFont::", |
|
44 "QCocoaMenu::removeMenuItem", |
|
45 "QCocoaMenu::insertNative", |
|
46 ",type id:", |
|
47 "Remote debugging server started successfully", |
|
48 "Uncaught SecurityError:", |
|
49 "Content Security Policy", |
|
50 "QXcbClipboard:", |
|
51 "QXcbConnection: XCB error", |
|
52 "libpng warning: iCCP:", |
|
53 ] |
|
54 |
|
55 def __filterMessage(self, message): |
|
56 """ |
|
57 Private method to filter messages. |
|
58 |
|
59 @param message message to be checked (string) |
|
60 @return flag indicating that the message should be filtered out |
|
61 (boolean) |
|
62 """ |
|
63 for filterStr in Globals.toList(self.settings.value( |
|
64 "MessageFilters", self.__defaultFilters)): |
|
65 if filterStr in message: |
|
66 return True |
|
67 |
|
68 return False |
|
69 |
71 |
70 def showMessage(self, message, msgType=""): |
72 def showMessage(self, message, msgType=""): |
71 """ |
73 """ |
72 Public method to show a message. |
74 Public method to show a message. |
73 |
75 |
74 @param message error message to be shown (string) |
76 @param message error message to be shown |
75 @param msgType type of the error message (string) |
77 @type str |
76 """ |
78 @param msgType type of the error message |
77 if not self.__filterMessage(message): |
79 @type str |
|
80 """ |
|
81 if not filterMessage(message): |
78 if msgType: |
82 if msgType: |
79 super(E5ErrorMessage, self).showMessage(message, msgType) |
83 super(E5ErrorMessage, self).showMessage(message, msgType) |
80 else: |
84 else: |
81 super(E5ErrorMessage, self).showMessage(message) |
85 super(E5ErrorMessage, self).showMessage(message) |
82 |
86 |
84 """ |
88 """ |
85 Public method to edit the list of message filters. |
89 Public method to edit the list of message filters. |
86 """ |
90 """ |
87 from .E5ErrorMessageFilterDialog import E5ErrorMessageFilterDialog |
91 from .E5ErrorMessageFilterDialog import E5ErrorMessageFilterDialog |
88 dlg = E5ErrorMessageFilterDialog( |
92 dlg = E5ErrorMessageFilterDialog( |
89 Globals.toList(self.settings.value( |
93 Globals.toList(_filterSettings.value( |
90 "MessageFilters", self.__defaultFilters)), |
94 "MessageFilters", _defaultFilters)), |
91 self.__defaultFilters) |
95 _defaultFilters) |
92 if dlg.exec_() == QDialog.Accepted: |
96 if dlg.exec_() == QDialog.Accepted: |
93 filters = dlg.getFilters() |
97 filters = dlg.getFilters() |
94 self.settings.setValue("MessageFilters", filters) |
98 _filterSettings.setValue("MessageFilters", filters) |
95 |
99 |
96 |
100 |
97 def messageHandler(msgType, *args): |
101 def messageHandler(msgType, *args): |
98 """ |
102 """ |
99 Module function handling messages. |
103 Module function handling messages. |
100 |
104 |
101 @param msgType type of the message (integer, QtMsgType) |
105 @param msgType type of the message |
102 @param args message handler arguments, for PyQt4 message to be shown |
106 @type int, QtMsgType |
103 (bytes), for PyQt5 context information (QMessageLogContext) and |
107 @param args message handler arguments, for PyQt4 message to be shown, for |
104 message to be shown (bytes) |
108 PyQt5 context information and message to be shown |
|
109 @type PyQt4: bytes; PyQt5: tuple of (QMessageLogContext, bytes) |
105 """ |
110 """ |
106 if len(args) == 2: |
111 if len(args) == 2: |
107 context = args[0] |
112 context = args[0] |
108 message = args[1] |
113 message = args[1] |
109 else: |
114 else: |
110 message = args[0] |
115 message = args[0] |
111 if __msgHandlerDialog: |
116 if _msgHandlerDialog: |
112 try: |
117 try: |
113 if msgType == QtDebugMsg: |
118 if msgType == QtDebugMsg: |
114 messageType = "Debug Message:" |
119 messageType = "Debug Message:" |
115 elif msgType == QtWarningMsg: |
120 elif msgType == QtWarningMsg: |
116 messageType = "Warning:" |
121 messageType = "Warning:" |
118 messageType = "Critical:" |
123 messageType = "Critical:" |
119 elif msgType == QtFatalMsg: |
124 elif msgType == QtFatalMsg: |
120 messageType = "Fatal Error:" |
125 messageType = "Fatal Error:" |
121 if isinstance(message, bytes): |
126 if isinstance(message, bytes): |
122 message = Utilities.decodeBytes(message) |
127 message = Utilities.decodeBytes(message) |
|
128 if filterMessage(message): |
|
129 return |
123 message = message.replace("\r\n", "<br/>")\ |
130 message = message.replace("\r\n", "<br/>")\ |
124 .replace("\n", "<br/>")\ |
131 .replace("\n", "<br/>")\ |
125 .replace("\r", "<br/>") |
132 .replace("\r", "<br/>") |
126 if len(args) == 2: |
133 if len(args) == 2: |
127 msg = "<p><b>{0}</b></p><p>{1}</p><p>File: {2}</p>" \ |
134 msg = "<p><b>{0}</b></p><p>{1}</p><p>File: {2}</p>" \ |
130 context.file, context.line, context.function) |
137 context.file, context.line, context.function) |
131 else: |
138 else: |
132 msg = "<p><b>{0}</b></p><p>{1}</p>".format( |
139 msg = "<p><b>{0}</b></p><p>{1}</p>".format( |
133 messageType, Utilities.html_uencode(message)) |
140 messageType, Utilities.html_uencode(message)) |
134 if QThread.currentThread() == qApp.thread(): |
141 if QThread.currentThread() == qApp.thread(): |
135 __msgHandlerDialog.showMessage(msg) |
142 _msgHandlerDialog.showMessage(msg) |
136 else: |
143 else: |
137 QMetaObject.invokeMethod( |
144 QMetaObject.invokeMethod( |
138 __msgHandlerDialog, |
145 _msgHandlerDialog, |
139 "showMessage", |
146 "showMessage", |
140 Qt.QueuedConnection, |
147 Qt.QueuedConnection, |
141 Q_ARG(str, msg)) |
148 Q_ARG(str, msg)) |
142 return |
149 return |
143 except RuntimeError: |
150 except RuntimeError: |
144 pass |
151 pass |
145 elif __origMsgHandler: |
152 elif _origMsgHandler: |
146 __origMsgHandler(msgType, message) |
153 _origMsgHandler(msgType, message) |
147 return |
154 return |
148 |
155 |
149 if msgType == QtDebugMsg: |
156 if msgType == QtDebugMsg: |
150 messageType = "Debug Message" |
157 messageType = "Debug Message" |
151 elif msgType == QtWarningMsg: |
158 elif msgType == QtWarningMsg: |
167 def qtHandler(): |
174 def qtHandler(): |
168 """ |
175 """ |
169 Module function to install an E5ErrorMessage dialog as the global |
176 Module function to install an E5ErrorMessage dialog as the global |
170 message handler. |
177 message handler. |
171 |
178 |
172 @return reference to the message handler dialog (E5ErrorMessage) |
179 @return reference to the message handler dialog |
173 """ |
180 @rtype E5ErrorMessage |
174 global __msgHandlerDialog, __origMsgHandler |
181 """ |
175 |
182 global _msgHandlerDialog, _origMsgHandler |
176 if __msgHandlerDialog is None: |
183 |
|
184 if _msgHandlerDialog is None: |
177 # Install an E5ErrorMessage dialog as the global message handler. |
185 # Install an E5ErrorMessage dialog as the global message handler. |
178 __msgHandlerDialog = E5ErrorMessage() |
186 _msgHandlerDialog = E5ErrorMessage() |
179 __origMsgHandler = qInstallMessageHandler(messageHandler) |
187 _origMsgHandler = qInstallMessageHandler(messageHandler) |
180 |
188 |
181 return __msgHandlerDialog |
189 return _msgHandlerDialog |
182 |
190 |
183 |
191 |
184 def editMessageFilters(): |
192 def editMessageFilters(): |
185 """ |
193 """ |
186 Module function to edit the list of message filters. |
194 Module function to edit the list of message filters. |
187 """ |
195 """ |
188 if __msgHandlerDialog: |
196 if _msgHandlerDialog: |
189 __msgHandlerDialog.editMessageFilters() |
197 _msgHandlerDialog.editMessageFilters() |
190 else: |
198 else: |
191 print("No message handler installed.") |
199 print("No message handler installed.") |
192 |
200 |
193 |
201 |
194 def messageHandlerInstalled(): |
202 def messageHandlerInstalled(): |
195 """ |
203 """ |
196 Module function to check, if a message handler was installed. |
204 Module function to check, if a message handler was installed. |
197 |
205 |
198 @return flag indicating an installed message handler (boolean) |
206 @return flag indicating an installed message handler |
199 """ |
207 @rtype bool |
200 return __msgHandlerDialog is not None |
208 """ |
|
209 return _msgHandlerDialog is not None |
201 |
210 |
202 # |
211 # |
203 # eflag: noqa = M801 |
212 # eflag: noqa = M801 |