1 /*
2
3 IMASM Macro Precompiler
4
5 Copyright (C) 2003 Joe Fisher, Shiny Technologies, LLC
6 http://www.shinytechnologies.com
7 Portions Copyright (C) 2003 Joseph Zbiciak.
8
9 This program is free software; you can redistribute it and/or
10 modify it under the terms of the GNU General Public License
11 as published by the Free Software Foundation; either version 2
12 of the License, or (at your option) any later version.
13
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
18
19 You should have received a copy of the GNU General Public License
20 along with this program; if not, write to the Free Software
21 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
22
23 */
24
25 #include "includes.h"
26
27 extern char g_szChildClass[];
28 extern HINSTANCE g_hInst;
29 extern char g_szLocalDir[MAX_PATH];
30 extern HWND g_hCurChild;
31 extern HWND g_hMDIClient;
32 extern RegHelp g_reg;
33
34 //-----------------------------------------------------------------------------
35 // Name: HandleIDC_NEW()
36 // Desc:
37 //-----------------------------------------------------------------------------
HandleIDC_NEW(HWND hMDIWnd)38 void HandleIDC_NEW(HWND hMDIWnd)
39 {
40 HWND hChild = CreateMDIWindow( g_szChildClass,
41 (LPSTR)"untitled",
42 WS_CHILD | WS_CLIPCHILDREN | WS_CLIPSIBLINGS,
43 CW_USEDEFAULT,
44 CW_USEDEFAULT,
45 CW_USEDEFAULT,
46 CW_USEDEFAULT,
47 hMDIWnd,
48 g_hInst,
49 0);
50 ShowWindow(hChild, SW_SHOW);
51 }
52
53 //-----------------------------------------------------------------------------
54 // Name: HandleIDC_SAVEAS()
55 // Desc:
56 //-----------------------------------------------------------------------------
HandleIDC_SAVEAS(HWND hWnd)57 int HandleIDC_SAVEAS(HWND hWnd)
58 {
59 OPENFILENAME of;
60 int iRet = 0;
61
62 WndInfo *pWI = (WndInfo *)GetWindowLong(hWnd, WL_INFOPTR);
63
64 if (pWI)
65 {
66 ZeroMemory(&of, sizeof (OPENFILENAME));
67
68 of.lStructSize = sizeof (OPENFILENAME);
69 of.hwndOwner = hWnd;
70 of.hInstance = g_hInst;
71 of.lpstrFilter = "ASM files (*.asm)\0*.asm\0"
72 "ALL files (*.*)\0*.*\0\0";
73 of.lpstrFile = pWI->szFileName;
74 of.nMaxFile = MAX_PATH;
75 of.Flags = OFN_HIDEREADONLY;
76
77 iRet = GetSaveFileName(&of);
78 }
79
80 return iRet;
81 }
82
83 //-----------------------------------------------------------------------------
84 // Name: HandleIDC_SAVE()
85 // Desc:
86 //-----------------------------------------------------------------------------
HandleIDC_SAVE(HWND hWnd)87 void HandleIDC_SAVE(HWND hWnd)
88 {
89 WndInfo *pWI = (WndInfo *)GetWindowLong(hWnd, WL_INFOPTR);
90
91 if (pWI)
92 {
93 if (*pWI->szFileName == NUL)
94 {
95 if (HandleIDC_SAVEAS(hWnd) == 0)
96 {
97 return;
98 }
99 }
100
101 if (SaveFile(pWI->hRichEd, pWI->szFileName))
102 {
103 pWI->bIsDirty = false;
104 SetCaptionPrintf(hWnd, "%s", pWI->szFileName);
105 }
106 }
107 }
108
109 //-----------------------------------------------------------------------------
110 // Name: HandleIDC_OPEN()
111 // Desc:
112 //-----------------------------------------------------------------------------
HandleIDC_OPEN(HWND hMDIWnd)113 void HandleIDC_OPEN(HWND hMDIWnd)
114 {
115 OPENFILENAME of;
116 char szFileName[MAX_PATH] = "";
117
118 ZeroMemory(&of, sizeof (OPENFILENAME));
119
120 of.lStructSize = sizeof (OPENFILENAME);
121 of.hwndOwner = hMDIWnd;
122 of.hInstance = g_hInst;
123 of.lpstrFilter = "ASM files (*.asm)\0*.asm\0"
124 "ALL files (*.*)\0*.*\0\0";
125 of.lpstrFile = szFileName;
126 of.nMaxFile = MAX_PATH;
127 of.Flags = OFN_FILEMUSTEXIST | OFN_HIDEREADONLY;
128
129 int iRet = GetOpenFileName(&of);
130
131 if (iRet)
132 {
133 LoadFileIntoNewWindow(szFileName);
134 }
135 }
136
137 //-----------------------------------------------------------------------------
138 // Name: HandleIDC_OPENPROJECT()
139 // Desc:
140 //-----------------------------------------------------------------------------
HandleIDC_OPENPROJECT(HWND hMDIWnd,FilePane * pFP)141 void HandleIDC_OPENPROJECT(HWND hMDIWnd, FilePane *pFP)
142 {
143 OPENFILENAME of;
144 char szFileName[MAX_PATH] = "";
145
146 ZeroMemory(&of, sizeof (OPENFILENAME));
147
148 of.lStructSize = sizeof (OPENFILENAME);
149 of.hwndOwner = hMDIWnd;
150 of.hInstance = g_hInst;
151 of.lpstrFilter = "IMASM Project files (*.imp)\0*.imp\0"
152 "ALL files (*.*)\0*.*\0\0";
153 of.lpstrFile = szFileName;
154 of.nMaxFile = MAX_PATH;
155 of.Flags = OFN_FILEMUSTEXIST | OFN_HIDEREADONLY;
156
157 int iRet = GetOpenFileName(&of);
158
159 if (iRet)
160 {
161 if (!pFP->LoadProject(szFileName))
162 {
163 MessageBox(hMDIWnd, "Unable to open project", szFileName, MB_ICONSTOP);
164 }
165 }
166 }
167
168 //-----------------------------------------------------------------------------
169 // Name: HandleEN_UPDATE()
170 // Desc:
171 //-----------------------------------------------------------------------------
HandleEN_UPDATE(HWND hWnd)172 void HandleEN_UPDATE(HWND hWnd)
173 {
174 DWORD dwStart, dwEnd;
175 TEXTRANGE tr;
176 char szBuff[MAX_PATH];
177 int iNum;
178
179 static char szLastWord[MAX_PATH] = "";
180 static int iPos = 0;
181
182 // Save the selection
183 SendMessage(hWnd, EM_GETSEL, (WPARAM)&dwStart, (LPARAM)&dwEnd);
184
185 // Get the character at the cursor
186 tr.chrg.cpMin = dwEnd-1;
187 tr.chrg.cpMax = dwEnd;
188 tr.lpstrText = szBuff;
189 iNum = SendMessage(hWnd, EM_GETTEXTRANGE, (WPARAM)0, (LPARAM)&tr);
190
191 if (iNum > 0)
192 {
193 // Test to see if the last char of our selection is a delimiter
194 int iLen = lstrlen(szBuff);
195 char c = szBuff[iLen - 1];
196
197 if (isalnum(c))
198 {
199 szLastWord[iPos++] = c;
200 if (iPos == MAX_PATH)
201 {
202 // Buffer overflow
203 iPos--;
204 }
205
206 szLastWord[iPos] = NUL;
207 }
208 else
209 {
210 iPos = 0;
211
212 DWORD dwCol = GetWordColor(szLastWord);
213
214 if (dwCol != RGB(0, 0, 0))
215 {
216 // Colorize the text
217 Highlight(hWnd, dwCol, dwEnd - (strlen(szLastWord)+1), dwEnd-1);
218
219 // Reset the selection
220 SendMessage(hWnd, EM_SETSEL, (WPARAM)dwStart, (LPARAM)dwEnd);
221 Highlight(hWnd, RGB(0, 0, 0), dwStart, dwEnd);
222 }
223
224 *szLastWord = NUL;
225 }
226 }
227
228 UpdateStatusBar(GetParent(hWnd));
229 }
230
231 //-----------------------------------------------------------------------------
232 // Name: HandleIDC_PRECOMPILE()
233 // Desc:
234 //-----------------------------------------------------------------------------
HandleIDC_PRECOMPILE(HWND hWnd)235 void HandleIDC_PRECOMPILE(HWND hWnd)
236 {
237 bool bSuccess = true;
238 char szSrc[MAX_PATH], szDst[MAX_PATH], szErr[MAX_PATH];
239
240 WndInfo *pWI = (WndInfo *)GetWindowLong(hWnd, WL_INFOPTR);
241
242 if (pWI)
243 {
244 // First, write to a temporary file
245 GetTempFileName(g_szLocalDir, "src", 0, szSrc);
246 GetTempFileName(g_szLocalDir, "dst", 0, szDst);
247
248 SaveFile(pWI->hRichEd, szSrc);
249
250 if (ParseFiles(szSrc, szDst, szErr))
251 {
252 LoadFileIntoNewWindow(szDst);
253 }
254 else
255 {
256 MessageBox(hWnd, szErr, "Error", MB_ICONSTOP);
257 }
258
259 DeleteFile(szSrc);
260 DeleteFile(szDst);
261 }
262 }
263
264 //-----------------------------------------------------------------------------
265 // Name: HandleIDC_FONT()
266 // Desc:
267 //-----------------------------------------------------------------------------
HandleIDC_FONT(HWND hClient)268 void HandleIDC_FONT(HWND hClient)
269 {
270 CHOOSEFONT cf;
271 LOGFONT lf;
272 CHARFORMAT cfmt;
273 HWND hWnd = g_hCurChild;
274 HWND hSaveChild = g_hCurChild;
275
276 int iRet;
277
278 ZeroMemory(&cf, sizeof (CHOOSEFONT));
279 ZeroMemory(&lf, sizeof (LOGFONT));
280 ZeroMemory(&cfmt, sizeof (CHARFORMAT));
281
282 cfmt.cbSize = sizeof (CHARFORMAT);
283 cfmt.dwMask = CFM_FACE;// | CFM_SIZE;
284
285 WndInfo *pWI = (WndInfo *)GetWindowLong(hWnd, WL_INFOPTR);
286
287 if (pWI)
288 {
289 SendMessage(pWI->hRichEd, EM_GETCHARFORMAT, (WPARAM)SCF_DEFAULT, (LPARAM)&cfmt);
290
291 cf.lStructSize = sizeof (CHOOSEFONT);
292 cf.hwndOwner = hWnd;
293 cf.lpLogFont = &lf;
294 cf.Flags = CF_FORCEFONTEXIST | CF_SCREENFONTS | CF_INITTOLOGFONTSTRUCT;
295
296 strcpy(lf.lfFaceName, cfmt.szFaceName);
297
298 iRet = ChooseFont(&cf);
299
300 if (iRet != 0)
301 {
302 ZeroMemory(&cfmt, sizeof (CHARFORMAT));
303
304 cfmt.cbSize = sizeof (CHARFORMAT);
305 cfmt.dwMask = CFM_FACE;// | CFM_SIZE;
306 //cfmt.yHeight = lf.lfHeight;
307 strcpy(cfmt.szFaceName, lf.lfFaceName);
308
309 // Save the user's choice in the registry
310 g_reg.AddString("FontName", lf.lfFaceName);
311
312 // Set all the windows to this font
313 do
314 {
315 WndInfo *pWI = (WndInfo *)GetWindowLong(hWnd, WL_INFOPTR);
316
317 if (pWI)
318 {
319 // Turn off EN_UPDATE and EN_CHANGE messages
320 DWORD dwOldMask = SendMessage(pWI->hRichEd, EM_SETEVENTMASK, (WPARAM)0, 0);
321
322 // Set the new font
323 SendMessage(pWI->hRichEd, EM_SETCHARFORMAT, (WPARAM)SCF_ALL, (LPARAM)&cfmt);
324
325 // Turn messages back on
326 SendMessage(pWI->hRichEd, EM_SETEVENTMASK, (WPARAM)0, (LPARAM)dwOldMask);
327 }
328
329 SendMessage(hClient, WM_MDINEXT, (WPARAM)hWnd, (LPARAM)0);
330 hWnd = (HWND)SendMessage(hClient, WM_MDIGETACTIVE, 0, 0);
331 } while ((hWnd != NULL) && (hWnd != hSaveChild));
332 }
333 }
334
335 SendMessage(hClient, WM_MDIACTIVATE, (WPARAM)hSaveChild, 0);
336 }
337
338 //-----------------------------------------------------------------------------
339 // Name: HandleIDC_PROJECTNEW()
340 // Desc:
341 //-----------------------------------------------------------------------------
HandleIDC_PROJECTNEW(HWND hWnd,FilePane * pFP)342 void HandleIDC_PROJECTNEW(HWND hWnd, FilePane *pFP)
343 {
344 ItemParam ip;
345
346 int iRet = DialogBoxParam( g_hInst,
347 MAKEINTRESOURCE(IDD_NEWPROJECT),
348 hWnd,
349 (DLGPROC)NewProjectProc,
350 (LPARAM)&ip);
351
352 if (iRet)
353 {
354 if (!pFP->NewProject(ip.sName.c_str(), ip.sPath.c_str()))
355 {
356 MessageBox(hWnd, "Unable to create new project", ip.sName.c_str(), MB_ICONSTOP);
357 }
358 }
359 }
360
361 //-----------------------------------------------------------------------------
362 // Name: HandleIDC_PROJECTADDSOURCE()
363 // Desc:
364 //-----------------------------------------------------------------------------
HandleIDC_PROJECTADDSOURCE(HWND hWnd,FilePane * pFP)365 void HandleIDC_PROJECTADDSOURCE(HWND hWnd, FilePane *pFP)
366 {
367 char szFileName[MAX_PATH] = "";
368 char szFileTitle[MAX_PATH] = "";
369
370 if (pFP->IsOpen())
371 {
372 if (GetAsmFileName(hWnd, szFileTitle, szFileName))
373 {
374 pFP->AddSourceFile(szFileTitle, szFileName);
375 }
376 }
377 }
378
379 //-----------------------------------------------------------------------------
380 // Name: HandleIDC_PROJECTADDINCLUDE()
381 // Desc:
382 //-----------------------------------------------------------------------------
HandleIDC_PROJECTADDINCLUDE(HWND hWnd,FilePane * pFP)383 void HandleIDC_PROJECTADDINCLUDE(HWND hWnd, FilePane *pFP)
384 {
385 char szFileName[MAX_PATH] = "";
386 char szFileTitle[MAX_PATH] = "";
387
388 if (pFP->IsOpen())
389 {
390 if (GetAsmFileName(hWnd, szFileTitle, szFileName))
391 {
392 pFP->AddIncludeFile(szFileTitle, szFileName);
393 }
394 }
395 }
396
397 //-----------------------------------------------------------------------------
398 // Name: HandleIDC_PROJECTADDOTHER()
399 // Desc:
400 //-----------------------------------------------------------------------------
HandleIDC_PROJECTADDOTHER(HWND hWnd,FilePane * pFP)401 void HandleIDC_PROJECTADDOTHER(HWND hWnd, FilePane *pFP)
402 {
403 char szFileName[MAX_PATH] = "";
404 char szFileTitle[MAX_PATH] = "";
405
406 if (pFP->IsOpen())
407 {
408 if (GetAsmFileName(hWnd, szFileTitle, szFileName))
409 {
410 pFP->AddOtherFile(szFileTitle, szFileName);
411 }
412 }
413 }
414
415 //-----------------------------------------------------------------------------
416 // Name: HandleIDC_PROJECTREMOVE()
417 // Desc:
418 //-----------------------------------------------------------------------------
HandleIDC_PROJECTREMOVE(HWND hWnd,FilePane * pFP)419 void HandleIDC_PROJECTREMOVE(HWND hWnd, FilePane *pFP)
420 {
421 pFP->RemoveSelected();
422 }
423
424
425 //-----------------------------------------------------------------------------
426 // Name: ()
427 // Desc:
428 //-----------------------------------------------------------------------------
429
430