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