annotate dbg/ui/CrashWindow.d @ 0:10317f0c89a5

Initial commit
author korDen
date Sat, 24 Oct 2009 08:42:06 +0400
parents
children 2cc604139636
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1 /**
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2 A window used to display the data from a CrashInfo struct generated by the
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3 runtime's crash handler.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5 TODO:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6 * Send report - need SMTP implementation
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
7 * Save report
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
8
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
9 Authors:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
10 Jeremie Pelletier
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
11
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
12 License:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
13 Public Domain
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
14 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
15 module dbg.ui.CrashWindow;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
16
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
17 import std.c.string;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
18 import dlib.CrashHandler;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
19 import dbg.Debug : SystemException;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
20
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
21 import std.stdio;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
22
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
23 private enum {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
24 ReportWindowWidth = 640,
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
25 ReportWindowHeight = 480,
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
26 ReportWindowMinWidth = 320,
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
27 ReportWindowMinHeight = 240,
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
28 ReportWindowTitle = "Unhandled exception!"
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
29 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
30
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
31 // ----------------------------------------------------------------------------
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
32 // W i n 3 2
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
33 // ----------------------------------------------------------------------------
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
34
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
35 version(Windows) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
36
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
37 import win32.windows;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
38
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
39 private enum {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
40 ID_LABEL = 100,
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
41 ID_SAVE_BTN = 101,
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
42 ID_SEND_BTN = 102,
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
43 ID_CLOSE_BTN = 103,
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
44 ID_REPORT = 104
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
45 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
46
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
47 enum CLEARTYPE_QUALITY = 5;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
48 enum LOAD_LIBRARY_AS_IMAGE_RESOURCE = 0x20;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
49
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
50 /**
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
51 Create the crash window for the given crash information, the routine will
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
52 return when the window is closed.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
53 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
54 void ShowCrashWindow(CrashInfo* crashInfo)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
55 in {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
56 assert(crashInfo);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
57 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
58 body {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
59 try {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
60
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
61 HINSTANCE inst = GetModuleHandle(null);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
62
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
63 WNDCLASSEXA wc;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
64 wc.cbSize = WNDCLASSEX.sizeof;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
65 wc.lpfnWndProc = &ReportWndProc;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
66 wc.hInstance = inst;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
67 wc.hIcon = cast(HICON)LoadImage(HINSTANCE.init, MAKEINTRESOURCE(OIC_ERROR), IMAGE_ICON, 0, 0, LR_DEFAULTSIZE);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
68 wc.hCursor = cast(HCURSOR)LoadImage(HINSTANCE.init, MAKEINTRESOURCE(OCR_NORMAL), IMAGE_CURSOR, 0, 0, LR_DEFAULTSIZE);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
69 wc.hbrBackground = CreateSolidBrush(GetSysColor(COLOR_BTNFACE));
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
70 wc.lpszClassName = "CrashWindowClass";
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
71
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
72 if(!RegisterClassExA(&wc)) SystemException();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
73 scope(exit) if(!UnregisterClassA("CrashWindowClass", inst)) SystemException();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
74
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
75 RECT rc = void;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
76 GetClientRect(GetDesktopWindow(), &rc);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
77
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
78 writeln(crashInfo.toString);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
79
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
80 HWND wnd = CreateWindowExA(
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
81 WS_EX_WINDOWEDGE,
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
82 "CrashWindowClass", ReportWindowTitle,
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
83 WS_OVERLAPPEDWINDOW | WS_VISIBLE,
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
84 (rc.right >> 1) - (ReportWindowWidth >> 1), (rc.bottom >> 1) - (ReportWindowHeight >> 1),
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
85 ReportWindowWidth, ReportWindowHeight,
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
86 HWND.init, HMENU.init, inst, cast(void*)crashInfo.toString.ptr
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
87 );
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
88 if(!wnd) SystemException();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
89
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
90 MSG msg = void;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
91 while(GetMessage(&msg, HWND.init, 0, 0)) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
92 TranslateMessage(&msg);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
93 DispatchMessage(&msg);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
94 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
95
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
96 } // try
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
97 catch(Throwable e) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
98 MessageBoxA(HWND.init, (e.toString ~ '\0').ptr, "Crash Window Error!", MB_ICONERROR | MB_OK);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
99 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
100 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
101
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
102 private:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
103
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
104 __gshared HWND saveButton, sendButton, closeButton, reportField;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
105
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
106 extern(Windows)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
107 LRESULT ReportWndProc(HWND wnd, uint msg, WPARAM w, LPARAM l) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
108 try {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
109
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
110 switch(msg) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
111 case WM_CREATE:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
112 HINSTANCE inst = cast(HINSTANCE).GetModuleHandle(null);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
113 CREATESTRUCT* cs = cast(CREATESTRUCT*)l;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
114
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
115 LOGFONTA lf;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
116 lf.lfHeight = 15;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
117 lf.lfWeight = FW_REGULAR;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
118 lf.lfCharSet = DEFAULT_CHARSET;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
119 lf.lfOutPrecision = OUT_DEFAULT_PRECIS;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
120 lf.lfClipPrecision = CLIP_DEFAULT_PRECIS;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
121 lf.lfQuality = CLEARTYPE_QUALITY;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
122 lf.lfPitchAndFamily = DEFAULT_PITCH | FF_DONTCARE;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
123
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
124 HFONT font = .CreateFontIndirectA(&lf);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
125 if(!font) SystemException();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
126
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
127 HINSTANCE iconMod = LoadLibraryExA("shell32.dll", null,
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
128 DONT_RESOLVE_DLL_REFERENCES | LOAD_LIBRARY_AS_DATAFILE | LOAD_LIBRARY_AS_IMAGE_RESOURCE);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
129
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
130 HWND CreateButton(string caption, uint id, ushort iconId) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
131 HWND ret = CreateWindowExA(
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
132 0, "BUTTON", caption.ptr, WS_CHILD | WS_VISIBLE,
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
133 0, 0, 0, 0, wnd, cast(HMENU)id, inst, null
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
134 );
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
135 if(!ret) SystemException();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
136
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
137 SendMessageA(ret, WM_SETFONT, cast(WPARAM)font, 0);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
138
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
139 if(iconMod) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
140 HANDLE icon = LoadImage(iconMod, MAKEINTRESOURCE(iconId), IMAGE_ICON, 24, 24, 0);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
141 if(icon) SendMessageA(ret, BM_SETIMAGE, IMAGE_ICON, cast(uint)icon);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
142 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
143
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
144 return ret;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
145 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
146
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
147 saveButton = CreateButton("Save Report", ID_SAVE_BTN, 7);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
148 sendButton = CreateButton("Send Report", ID_SEND_BTN, 27);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
149 closeButton = CreateButton("Close", ID_CLOSE_BTN, 28);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
150
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
151 if(iconMod) FreeLibrary(cast(HMODULE)iconMod);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
152
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
153 enum ReportFont = "Courier New\0";
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
154 lf.lfHeight = 14;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
155 lf.lfFaceName[0 .. ReportFont.length] = ReportFont;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
156
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
157 font = CreateFontIndirectA(&lf);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
158 if(!font) SystemException();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
159
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
160 reportField = CreateWindowExA(
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
161 WS_EX_CLIENTEDGE, "EDIT", null,
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
162 WS_CHILD | WS_VSCROLL | WS_HSCROLL | WS_VISIBLE |
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
163 ES_READONLY | ES_MULTILINE | ES_AUTOVSCROLL,
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
164 0, 0, 0, 0, wnd, cast(HMENU)ID_REPORT, inst, null
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
165 );
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
166 if(!reportField) SystemException();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
167
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
168 SendMessageA(reportField, EM_SETMARGINS, EC_LEFTMARGIN | EC_RIGHTMARGIN, MAKELONG(5, 5));
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
169 SendMessageA(reportField, WM_SETFONT, cast(WPARAM)font, 0);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
170 SendMessageA(reportField, WM_SETTEXT, 0, cast(LPARAM)cs.lpCreateParams);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
171
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
172 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
173
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
174 case WM_DESTROY:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
175 PostQuitMessage(0);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
176 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
177
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
178 case WM_GETMINMAXINFO:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
179 MINMAXINFO* mm = cast(MINMAXINFO*)l;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
180 mm.ptMinTrackSize.x = ReportWindowMinWidth;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
181 mm.ptMinTrackSize.y = ReportWindowMinHeight;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
182 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
183
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
184 case WM_SIZE:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
185 int width = LOWORD(l), halfWidth = width >> 1;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
186 int height = HIWORD(l);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
187
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
188 enum {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
189 BtnWidth = 125,
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
190 BtnHeight = 35,
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
191 NumBtns = 3,
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
192 Pad = 10,
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
193 ReportHPad = Pad * 2,
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
194 ReportVPad = BtnHeight + Pad * 3,
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
195 BtnVPad = BtnHeight + Pad,
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
196 BtnHalfWidth = (BtnWidth * NumBtns + (Pad * (NumBtns - 1))) >> 1
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
197 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
198
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
199 if(!MoveWindow(reportField, Pad, Pad, width - ReportHPad, height - ReportVPad, true))
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
200 SystemException();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
201
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
202 void Move(HWND wnd, int i) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
203 if(!MoveWindow(wnd, halfWidth - BtnHalfWidth + BtnWidth * i + Pad * i,
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
204 height - BtnVPad, BtnWidth, BtnHeight, true))
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
205 SystemException();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
206 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
207
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
208 Move(saveButton, 0);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
209 Move(sendButton, 1);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
210 Move(closeButton, 2);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
211
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
212 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
213
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
214 case WM_COMMAND:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
215 if(HIWORD(w) != BN_CLICKED) break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
216
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
217 int id = LOWORD(w);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
218
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
219 // GetSaveFileName fails on win7.. no idea why
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
220 if(id == ID_SAVE_BTN) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
221 /*char[256] path = void;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
222 path[0 .. 11] = "Report.txt\0";
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
223
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
224 OPENFILENAMEA ofn;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
225 ofn.lStructSize = OPENFILENAME.sizeof;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
226 ofn.hwndOwner = wnd;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
227 ofn.lpstrFilter = "Text File\0*.txt\0\0";
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
228 ofn.lpstrFile = path.ptr;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
229 ofn.nMaxFile = path.length;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
230 ofn.Flags = OFN_OVERWRITEPROMPT;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
231
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
232 try {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
233 if(!GetSaveFileNameA(&ofn)) SystemException();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
234
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
235 uint len = strlen(path.ptr);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
236 if(path[len-4 .. len] != ".txt") path[len .. len + 5] = ".txt\0";
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
237
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
238 HANDLE file = CreateFileA(path.ptr, GENERIC_WRITE, 0,
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
239 null, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, null);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
240
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
241 if(file == INVALID_HANDLE_VALUE) SystemException();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
242 scope(exit) if(!CloseHandle(file)) SystemException();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
243
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
244 char* text;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
245 SendMessageA(reportField, WM_GETTEXT, 0, cast(LPARAM)text);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
246 len = strlen(text);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
247
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
248 uint written = void;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
249 if(!WriteFile(file, text, len, &written, null))
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
250 SystemException();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
251
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
252 if(written != len) throw new SystemException("Couldn't write entire data.");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
253
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
254 id = ID_CLOSE_BTN;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
255 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
256 catch(SystemException e) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
257 MessageBoxA(wnd, (e.toString ~ '\0').ptr, "Error!", MB_OK | MB_ICONERROR);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
258 }*/
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
259
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
260 MessageBoxA(wnd, "TODO", "Error!", MB_OK | MB_ICONERROR);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
261 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
262
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
263 if(id == ID_SEND_BTN)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
264 MessageBoxA(wnd, "TODO", "Error!", MB_OK | MB_ICONERROR);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
265
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
266 if(id == ID_CLOSE_BTN)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
267 SendMessageA(wnd, WM_CLOSE, 0, 0);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
268
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
269 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
270
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
271 default:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
272 return DefWindowProcA(wnd, msg, w, l);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
273 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
274
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
275 } // try
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
276 catch(Exception e) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
277 MessageBoxA(HWND.init, (e.toString ~ '\0').ptr, "Crash Window Handler Error!", MB_ICONERROR | MB_OK);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
278 PostQuitMessage(0);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
279 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
280
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
281 return 0;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
282 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
283
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
284 } // version(Windows)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
285
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
286 else version(Gnome) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
287
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
288 import std.c.stdio;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
289
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
290 import ext.Gnome.gtk;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
291 import ext.Gnome.gobject;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
292
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
293 void ErrorGUI(in ErrorReport* report) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
294 int argc;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
295 if(!gtk_init_check(&argc, null)) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
296 printf("gtk failed!\n");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
297 Pause;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
298 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
299
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
300 void SetSignal(A, B)(A* widget, string signal, B callback) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
301 g_signal_connect(cast(void*)widget, signal.ptr, cast(GCallback)callback, null);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
302 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
303
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
304 // Create the report window
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
305 GtkWidget* window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
306 gtk_window_set_title(cast(GtkWindow*)window, ReportWindowTitle);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
307 gtk_window_set_default_size(cast(GtkWindow*)window, ReportWindowWidth, ReportWindowHeight);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
308 gtk_window_set_icon_name(cast(GtkWindow*)window, GTK_STOCK_DIALOG_ERROR);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
309
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
310 SetSignal(window, "destroy", &gtk_main_quit);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
311
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
312 // Create the root box
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
313 GtkWidget* vbox = gtk_vbox_new(false, 0);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
314 gtk_container_add(cast(GtkContainer*)window, vbox);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
315
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
316 // Create the report edit
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
317 GtkWidget* view = gtk_text_view_new();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
318 gtk_text_view_set_editable(cast(GtkTextView*)view, false);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
319 gtk_text_view_set_cursor_visible(cast(GtkTextView*)view, false);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
320
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
321 GtkTextBuffer* buffer = gtk_text_view_get_buffer(cast(GtkTextView*)view);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
322 gtk_text_buffer_set_text(buffer, report.dumpText.ptr, -1);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
323
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
324 gtk_box_pack_start(cast(GtkBox*)vbox, view, true, true, 0);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
325
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
326 // Create the buttons box
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
327 GtkWidget* hbox = gtk_hbutton_box_new();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
328 gtk_box_set_spacing(cast(GtkBox*)hbox, 10);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
329 gtk_button_box_set_layout(cast(GtkButtonBox*)hbox, GTK_BUTTONBOX_CENTER);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
330 gtk_box_pack_start(cast(GtkBox*)vbox, hbox, false, true, 10);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
331
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
332 // Create the buttons
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
333 GtkWidget* CreateButton(B)(string label, string stockId, B callback) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
334 GtkWidget* button = gtk_button_new_with_label(label.ptr);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
335
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
336 GtkWidget* image = gtk_image_new_from_stock(stockId.ptr, GTK_ICON_SIZE_BUTTON);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
337 gtk_button_set_image(cast(GtkButton*)button, image);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
338
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
339 gtk_container_add(cast(GtkContainer*)hbox, button);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
340
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
341 if(callback) SetSignal(button, "clicked", callback);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
342
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
343 return button;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
344 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
345
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
346 CreateButton("Save Report", GTK_STOCK_SAVE_AS, &OnClickSave);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
347 CreateButton("Send Report", GTK_STOCK_CONNECT, &OnClickSend);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
348 GtkWidget* close = CreateButton("Close", GTK_STOCK_CLOSE, null);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
349
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
350 g_signal_connect_swapped(cast(void*)close, "clicked",
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
351 cast(GCallback)(&gtk_widget_destroy), cast(void*)(window));
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
352
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
353 // Display the window and run the main loop
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
354 gtk_widget_show_all(window);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
355 gtk_main();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
356 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
357
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
358 extern(C):
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
359
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
360 void OnClickSave(GtkButton* button, gpointer user_data) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
361 // TODO
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
362 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
363
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
364 void OnClickSend(GtkButton* button, gpointer user_data) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
365 // TODO
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
366 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
367
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
368 } // version(Gnome)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
369 else static assert(0);