New version. Update home page link in About box.
[dorian] / trace.cpp
1 #include <QEvent>
2 #include <QFile>
3
4 #include "trace.h"
5
6 int Trace::indent;
7 QtMsgType Trace::level = QtDebugMsg;
8 QFile Trace::file;
9
10 Trace::EventName Trace::eventTab[] = {
11     {QEvent::None, "QEvent::None"},
12     {QEvent::Timer, "QEvent::Timer"},
13     {QEvent::MouseButtonPress, "QEvent::MouseButtonPress"},
14     {QEvent::MouseButtonRelease, "QEvent::MouseButtonRelease"},
15     {QEvent::MouseButtonDblClick, "QEvent::MouseButtonDblClick"},
16     {QEvent::MouseMove, "QEvent::MouseMove"},
17     {QEvent::KeyPress, "QEvent::KeyPress"},
18     {QEvent::KeyRelease, "QEvent::KeyRelease"},
19     {QEvent::FocusIn, "QEvent::FocusIn"},
20     {QEvent::FocusOut, "QEvent::FocusOut"},
21     {QEvent::Enter, "QEvent::Enter"},
22     {QEvent::Leave, "QEvent::Leave"},
23     {QEvent::Paint, "QEvent::Paint"},
24     {QEvent::Move, "QEvent::Move"},
25     {QEvent::Resize, "QEvent::Resize"},
26     {QEvent::Create, "QEvent::Create"},
27     {QEvent::Destroy, "QEvent::Destroy"},
28     {QEvent::Show, "QEvent::Show"},
29     {QEvent::Hide, "QEvent::Hide"},
30     {QEvent::Close, "QEvent::Close"},
31     {QEvent::Quit, "QEvent::Quit"},
32     {QEvent::ParentChange, "QEvent::ParentChange"},
33     {QEvent::ParentAboutToChange, "QEvent::ParentAboutToChange"},
34 #ifdef QT3_SUPPORT
35     {QEvent::Reparent, "QEvent::Reparent"},
36 #endif
37     {QEvent::ThreadChange, "QEvent::ThreadChange"},
38     {QEvent::WindowActivate, "QEvent::WindowActivate"},
39     {QEvent::WindowDeactivate, "QEvent::WindowDeactivate"},
40     {QEvent::ShowToParent, "QEvent::ShowToParent"},
41     {QEvent::HideToParent, "QEvent::HideToParent"},
42     {QEvent::Wheel, "QEvent::Wheel"},
43     {QEvent::WindowTitleChange, "QEvent::WindowTitleChange"},
44     {QEvent::WindowIconChange, "QEvent::WindowIconChange"},
45     {QEvent::ApplicationWindowIconChange, "QEvent::ApplicationWindowIconChange"},
46     {QEvent::ApplicationFontChange, "QEvent::ApplicationFontChange"},
47     {QEvent::ApplicationLayoutDirectionChange, "QEvent::ApplicationLayoutDirectionChange"},
48     {QEvent::ApplicationPaletteChange, "QEvent::ApplicationPaletteChange"},
49     {QEvent::PaletteChange, "QEvent::PaletteChange"},
50     {QEvent::Clipboard, "QEvent::Clipboard"},
51     {QEvent::Speech, "QEvent::Speech"},
52     {QEvent::MetaCall, "QEvent::MetaCall"},
53     {QEvent::SockAct, "QEvent::SockAct"},
54     {QEvent::WinEventAct, "QEvent::WinEventAct"},
55     {QEvent::DeferredDelete, "QEvent::DeferredDelete"},
56     {QEvent::DragEnter, "QEvent::DragEnter"},
57     {QEvent::DragMove, "QEvent::DragMove"},
58     {QEvent::DragLeave, "QEvent::DragLeave"},
59     {QEvent::Drop, "QEvent::Drop"},
60     {QEvent::DragResponse, "QEvent::DragResponse"},
61     {QEvent::ChildAdded, "QEvent::ChildAdded"},
62     {QEvent::ChildPolished, "QEvent::ChildPolished"},
63 #ifdef QT3_SUPPORT
64     {QEvent::ChildInsertedRequest, "QEvent::ChildInsertedRequest"},
65     {QEvent::ChildInserted, "QEvent::ChildInserted"},
66     {QEvent::LayoutHint, "QEvent::LayoutHint"},
67 #endif
68     {QEvent::ChildRemoved, "QEvent::ChildRemoved"},
69     {QEvent::ShowWindowRequest, "QEvent::ShowWindowRequest"},
70     {QEvent::PolishRequest, "QEvent::PolishRequest"},
71     {QEvent::Polish, "QEvent::Polish"},
72     {QEvent::LayoutRequest, "QEvent::LayoutRequest"},
73     {QEvent::UpdateRequest, "QEvent::UpdateRequest"},
74     {QEvent::UpdateLater, "QEvent::UpdateLater"},
75
76     {QEvent::EmbeddingControl, "QEvent::EmbeddingControl"},
77     {QEvent::ActivateControl, "QEvent::ActivateControl"},
78     {QEvent::DeactivateControl, "QEvent::DeactivateControl"},
79     {QEvent::ContextMenu, "QEvent::ContextMenu"},
80     {QEvent::InputMethod, "QEvent::InputMethod"},
81     {QEvent::AccessibilityPrepare, "QEvent::AccessibilityPrepare"},
82     {QEvent::TabletMove, "QEvent::TabletMove"},
83     {QEvent::LocaleChange, "QEvent::LocaleChange"},
84     {QEvent::LanguageChange, "QEvent::LanguageChange"},
85     {QEvent::LayoutDirectionChange, "QEvent::LayoutDirectionChange"},
86     {QEvent::Style, "QEvent::Style"},
87     {QEvent::TabletPress, "QEvent::TabletPress"},
88     {QEvent::TabletRelease, "QEvent::TabletRelease"},
89     {QEvent::OkRequest, "QEvent::OkRequest"},
90     {QEvent::HelpRequest, "QEvent::HelpRequest"},
91
92     {QEvent::IconDrag, "QEvent::IconDrag"},
93
94     {QEvent::FontChange, "QEvent::FontChange"},
95     {QEvent::EnabledChange, "QEvent::EnabledChange"},
96     {QEvent::ActivationChange, "QEvent::ActivationChange"},
97     {QEvent::StyleChange, "QEvent::StyleChange"},
98     {QEvent::IconTextChange, "QEvent::IconTextChange"},
99     {QEvent::ModifiedChange, "QEvent::ModifiedChange"},
100     {QEvent::MouseTrackingChange, "QEvent::MouseTrackingChange"},
101
102     {QEvent::WindowBlocked, "QEvent::WindowBlocked"},
103     {QEvent::WindowUnblocked, "QEvent::WindowUnblocked"},
104     {QEvent::WindowStateChange, "QEvent::WindowStateChange"},
105
106     {QEvent::ToolTip, "QEvent::ToolTip"},
107     {QEvent::WhatsThis, "QEvent::WhatsThis"},
108     {QEvent::StatusTip, "QEvent::StatusTip"},
109
110     {QEvent::ActionChanged, "QEvent::ActionChanged"},
111     {QEvent::ActionAdded, "QEvent::ActionAdded"},
112     {QEvent::ActionRemoved, "QEvent::ActionRemoved"},
113
114     {QEvent::FileOpen, "QEvent::FileOpen"},
115
116     {QEvent::Shortcut, "QEvent::Shortcut"},
117     {QEvent::ShortcutOverride, "QEvent::ShortcutOverride"},
118
119 #ifdef QT3_SUPPORT
120     {QEvent::Accel, "QEvent::Accel"},
121     {QEvent::AccelAvailable, "QEvent::AccelAvailable"},
122     {QEvent::AccelOverride, "QEvent::AccelOverride"},
123 #endif
124
125     {QEvent::WhatsThisClicked, "QEvent::WhatsThisClicked"},
126
127 #ifdef QT3_SUPPORT
128     {QEvent::CaptionChange, "QEvent::CaptionChange"},
129     {QEvent::IconChange, "QEvent::IconChange"},
130 #endif
131     {QEvent::ToolBarChange, "QEvent::ToolBarChange"},
132
133     {QEvent::ApplicationActivate, "QEvent::ApplicationActivate"},
134     {QEvent::ApplicationActivated, "QEvent::ApplicationActivated"},
135     {QEvent::ApplicationDeactivate, "QEvent::ApplicationDeactivate"},
136     {QEvent::ApplicationDeactivated, "QEvent::ApplicationDeactivated"},
137
138     {QEvent::QueryWhatsThis, "QEvent::QueryWhatsThis"},
139     {QEvent::EnterWhatsThisMode, "QEvent::EnterWhatsThisMode"},
140     {QEvent::LeaveWhatsThisMode, "QEvent::LeaveWhatsThisMode"},
141
142     {QEvent::ZOrderChange, "QEvent::ZOrderChange"},
143
144     {QEvent::HoverEnter, "QEvent::HoverEnter"},
145     {QEvent::HoverLeave, "QEvent::HoverLeave"},
146     {QEvent::HoverMove, "QEvent::HoverMove"},
147
148     {QEvent::AccessibilityHelp, "QEvent::AccessibilityHelp"},
149     {QEvent::AccessibilityDescription, "QEvent::AccessibilityDescription"},
150
151 #ifdef QT_KEYPAD_NAVIGATION
152     {QEvent::EnterEditFocus, "QEvent::EnterEditFocus"},
153     {QEvent::LeaveEditFocus, "QEvent::LeaveEditFocus"},
154 #endif
155     {QEvent::AcceptDropsChange, "QEvent::AcceptDropsChange"},
156
157     {QEvent::MenubarUpdated, "QEvent::MenubarUpdated"},
158     {QEvent::ZeroTimerEvent, "QEvent::ZeroTimerEvent"},
159
160     {QEvent::GraphicsSceneMouseMove, "QEvent::GraphicsSceneMouseMove"},
161     {QEvent::GraphicsSceneMousePress, "QEvent::GraphicsSceneMousePress"},
162     {QEvent::GraphicsSceneMouseRelease, "QEvent::GraphicsSceneMouseRelease"},
163     {QEvent::GraphicsSceneMouseDoubleClick, "QEvent::GraphicsSceneMouseDoubleClick"},
164     {QEvent::GraphicsSceneContextMenu, "QEvent::GraphicsSceneContextMenu"},
165     {QEvent::GraphicsSceneHoverEnter, "QEvent::GraphicsSceneHoverEnter"},
166     {QEvent::GraphicsSceneHoverMove, "QEvent::GraphicsSceneHoverMove"},
167     {QEvent::GraphicsSceneHoverLeave, "QEvent::GraphicsSceneHoverLeave"},
168     {QEvent::GraphicsSceneHelp, "QEvent::GraphicsSceneHelp"},
169     {QEvent::GraphicsSceneDragEnter, "QEvent::GraphicsSceneDragEnter"},
170     {QEvent::GraphicsSceneDragMove, "QEvent::GraphicsSceneDragMove"},
171     {QEvent::GraphicsSceneDragLeave, "QEvent::GraphicsSceneDragLeave"},
172     {QEvent::GraphicsSceneDrop, "QEvent::GraphicsSceneDrop"},
173     {QEvent::GraphicsSceneWheel, "QEvent::GraphicsSceneWheel"},
174
175     {QEvent::KeyboardLayoutChange, "QEvent::KeyboardLayoutChange"},
176
177     {QEvent::DynamicPropertyChange, "QEvent::DynamicPropertyChange"},
178
179     {QEvent::TabletEnterProximity, "QEvent::TabletEnterProximity"},
180     {QEvent::TabletLeaveProximity, "QEvent::TabletLeaveProximity"},
181
182     {QEvent::NonClientAreaMouseMove, "QEvent::NonClientAreaMouseMove"},
183     {QEvent::NonClientAreaMouseButtonPress, "QEvent::NonClientAreaMouseButtonPress"},
184     {QEvent::NonClientAreaMouseButtonRelease, "QEvent::NonClientAreaMouseButtonRelease"},
185     {QEvent::NonClientAreaMouseButtonDblClick, "QEvent::NonClientAreaMouseButtonDblClick"},
186
187     {QEvent::MacSizeChange, "QEvent::MacSizeChange"},
188
189     {QEvent::ContentsRectChange, "QEvent::ContentsRectChange"},
190
191     {QEvent::MacGLWindowChange, "QEvent::MacGLWindowChange"},
192
193     {QEvent::FutureCallOut, "QEvent::FutureCallOut"},
194
195     {QEvent::GraphicsSceneResize, "QEvent::GraphicsSceneResize"},
196     {QEvent::GraphicsSceneMove, "QEvent::GraphicsSceneMove"},
197
198     {QEvent::CursorChange, "QEvent::CursorChange"},
199     {QEvent::ToolTipChange, "QEvent::ToolTipChange"},
200
201     {QEvent::NetworkReplyUpdated, "QEvent::NetworkReplyUpdated"},
202
203     {QEvent::GrabMouse, "QEvent::GrabMouse"},
204     {QEvent::UngrabMouse, "QEvent::UngrabMouse"},
205     {QEvent::GrabKeyboard, "QEvent::GrabKeyboard"},
206     {QEvent::UngrabKeyboard, "QEvent::UngrabKeyboard"},
207     {QEvent::MacGLClearDrawable, "QEvent::MacGLClearDrawable"},
208
209     {QEvent::StateMachineSignal, "QEvent::StateMachineSignal"},
210     {QEvent::StateMachineWrapped, "QEvent::StateMachineWrapped"},
211
212     {QEvent::TouchBegin, "QEvent::TouchBegin"},
213     {QEvent::TouchUpdate, "QEvent::TouchUpdate"},
214     {QEvent::TouchEnd, "QEvent::TouchEnd"},
215
216     {QEvent::NativeGesture, "QEvent::NativeGesture"},
217
218     {QEvent::RequestSoftwareInputPanel, "QEvent::RequestSoftwareInputPanel"},
219     {QEvent::CloseSoftwareInputPanel, "QEvent::CloseSoftwareInputPanel"},
220
221     {QEvent::UpdateSoftKeys, "QEvent::UpdateSoftKeys"},
222
223     {QEvent::WinIdChange, "QEvent::WinIdChange"},
224     {QEvent::Gesture, "QEvent::Gesture"},
225     {QEvent::GestureOverride, "QEvent::GestureOverride"},
226
227     {0, 0}
228 };
229
230 Trace::Trace(const QString &s): name(s)
231 {
232     messageHandler(QtDebugMsg, QString(">%1").arg(name).toAscii().constData());
233     indent++;
234 }
235
236 Trace::~Trace()
237 {
238     if (--indent < 0) {
239         indent = 0;
240     }
241     messageHandler(QtDebugMsg, QString("<%1").arg(name).toAscii().constData());
242 }
243
244 QString Trace::event(QEvent::Type t)
245 {
246     for (int i = 0; eventTab[i].name; i++) {
247         if (eventTab[i].type == t) {
248             return eventTab[i].name;
249         }
250     }
251     if (t >= QEvent::User) {
252         return QString("QEvent::User+%1").arg(t - QEvent::User);
253     } else {
254         return QString("Unknown event %1").arg(t);
255     }
256 }
257
258 QString Trace::prefix()
259 {
260     return QTime::currentTime().toString("hh:mm:ss.zzz ") +
261             QString(" ").repeated(indent);
262 }
263
264 void Trace::messageHandler(QtMsgType type, const char *msg)
265 {
266     if (type >= Trace::level) {
267         QtMsgHandler oldHandler = qInstallMsgHandler(0);
268         switch (type) {
269         case QtDebugMsg:
270             qt_message_output(QtDebugMsg, (prefix()+msg).toUtf8().constData());
271             break;
272         default:
273             qt_message_output(type, msg);
274         }
275         qInstallMsgHandler(oldHandler);
276         if (Trace::file.isOpen()) {
277             Trace::file.write((prefix() + msg + "\n").toUtf8());
278             Trace::file.flush();
279         }
280     }
281 }
282
283 void Trace::setFileName(const QString &fileName)
284 {
285     Trace::file.close();
286     Trace::file.setFileName(fileName);
287     if (!fileName.isEmpty()) {
288         (void)Trace::file.open(QIODevice::WriteOnly);
289     }
290 }
291
292 QString Trace::fileName()
293 {
294     return Trace::file.fileName();
295 }