|
|
1.1 root 1: #include "porttool.h"
2: #include "port.h"
3:
4: // forward declarations of helper functions in this module
5: HWND WINAPI StartInteractive (HANDLE, char *, int);
6: HANDLE WINAPI StartBackground (HANDLE, HWND, char *);
7: VOID WINAPI InitializeMenu (HWND, HANDLE);
8: LONG WINAPI CommandHandler (HWND, UINT, LONG);
9: int WINAPI SetWrap (HWND);
10: BOOL WINAPI GetCmdLine (char *, char *, BOOL *);
11: int WINAPI Save_YNC (HWND);
12: VOID WINAPI SetWindowTitle (HWND, char*);
13: VOID WINAPI GetEditSubString (HWND, PUINT, PUINT, char *);
14:
15: UINT uSearchMsg;
16: HWND hDlgPortStatus;
17: HWND hDlgPort;
18:
19:
20: // test case static variables for background porting
21: HANDLE hEvents[nBKPORTEVENTS];
22: BKPORTFILESTRUCT BkPort;
23:
24:
25:
26: // entry point ot this executable
27: int WINAPI WinMain (hInstance, hPrevInstance, lpCmdLine, nCmdShow)
28: HANDLE hInstance;
29: HANDLE hPrevInstance;
30: LPSTR lpCmdLine;
31: int nCmdShow;
32: {
33: MSG msg;
34: HWND hWnd;
35: HANDLE hAccel;
36: BOOL bBkgnd = 0;
37: char *lpszBuff = NULL;
38: char *lpszCmdLine = NULL;
39: char *lpCL;
40:
41:
42: // previous instances do not exist in Win32
43: if (hPrevInstance)
44: return 0;
45:
46: // parse and copy command line parameters to local memory
47: lpCL = GetCommandLine ();
48: if (lpszCmdLine = (char *)LocalAlloc (LPTR, strlen (lpCL) + 1))
49: GetCmdLine (lpCL, lpszCmdLine, &bBkgnd);
50:
51: // if /b switch, start background porting session
52: if (bBkgnd)
53: {
54: // invoke background port status dialog
55: if (!(hDlgPortStatus = StartBackground (hInstance, NULL, lpszCmdLine)))
56: return FALSE;
57: }
58:
59: // start interactive porting session
60: else
61: {
62: if (!(hWnd = StartInteractive (hInstance, lpszCmdLine, nCmdShow)))
63: return FALSE;
64: }
65:
66: // free memory allocated for pCmdLine
67: if (lpszCmdLine)
68: LocalFree ((HLOCAL)lpszCmdLine);
69:
70: // load main accelerator table
71: hAccel = LoadAccelerators (hInstance, MAKEINTRESOURCE (IDA_PORTTOOL));
72:
73: // main window message loop
74: while (GetMessage (&msg, NULL, 0, 0))
75: {
76: if ((!hDlgSearch || !IsDialogMessage (hDlgSearch, &msg)) &&
77: (!hDlgPort || !IsDialogMessage (hDlgPort, &msg)) &&
78: (!hDlgPortStatus || !IsDialogMessage (hDlgPortStatus, &msg)) &&
79: (!hAccel || !TranslateAccelerator (hWnd, hAccel, &msg)))
80: {
81: TranslateMessage (&msg);
82: DispatchMessage (&msg);
83: }
84: }
85:
86: // return success of application
87: return TRUE;
88: }
89:
90:
91:
92:
93: // start background port status dialog
94: HANDLE WINAPI StartBackground (
95: HANDLE hModule,
96: HWND hWndParent,
97: char *lpszCmdLine)
98: {
99: return (CreateDialogParam (hModule,
100: IDD_BKPORTDIALOG,
101: hWndParent,
102: BkPortDlgProc,
103: (LPARAM)lpszCmdLine));
104: }
105:
106:
107:
108:
109: // start interactive version of app
110: HWND WINAPI StartInteractive (
111: HANDLE hInstance,
112: char *lpszCmdLine,
113: int nCmdShow)
114: {
115: WNDCLASS wc;
116: char lpszClass[MAX_PATH];
117: HWND hWnd;
118:
119: // load resources strings
120: LoadString (hInstance, IDS_APPNAME, lpszClass, sizeof (lpszClass));
121:
122: /* Register the frame class */
123: wc.style = 0;
124: wc.lpfnWndProc = (WNDPROC)MainWndProc;
125: wc.cbClsExtra = 0;
126: wc.cbWndExtra = CBWNDEXTRA;
127: wc.hInstance = hInstance;
128: wc.hIcon = LoadIcon (hInstance, IDPortTool);
129: wc.hCursor = LoadCursor (NULL,IDC_ARROW);
130: wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
131: wc.lpszMenuName = IDPortTool;
132: wc.lpszClassName = lpszClass;
133:
134: if (!RegisterClass (&wc) )
135: return FALSE;
136:
137: /* Create the frame */
138: hWnd = CreateWindow (lpszClass,
139: "Win32 Port",
140: WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN | DS_LOCALEDIT,
141: CW_USEDEFAULT,
142: 0,
143: CW_USEDEFAULT,
144: 0,
145: NULL,
146: NULL,
147: hInstance,
148: (*lpszCmdLine ? lpszCmdLine : 0));
149:
150: // make sure window was created
151: if (!hWnd)
152: return FALSE;
153:
154: // register search/replace message for common dialog use
155: uSearchMsg = RegisterWindowMessage ((char *)FINDMSGSTRING);
156:
157: // show and update main window
158: ShowWindow (hWnd, nCmdShow);
159: UpdateWindow (hWnd);
160:
161: return hWnd;
162: }
163:
164:
165:
166: // main window procedure
167: LONG WINAPI MainWndProc (
168: HWND hWnd,
169: UINT uMsg,
170: UINT uParam,
171: LONG lParam)
172: {
173: LONG lRet = 1;
174: int nResult;
175: RECT rc;
176:
177: switch (uMsg)
178: {
179: case WM_CREATE:
180: {
181: HWND hWndEdit;
182: LPCREATESTRUCT lpcs = (LPCREATESTRUCT)lParam;
183: char lpszBuff[MAX_PATH];
184: LOGFONT lfEditFont;
185: HFONT hFont;
186: HCURSOR hOldCursor;
187:
188: // put hourglass cursor up
189: hOldCursor = (HCURSOR)SetClassLong (hWnd, GCL_HCURSOR, NULL);
190: SetCursor (LoadCursor (NULL, IDC_WAIT));
191:
192: /* Create an edit control */
193: GetClientRect (hWnd, &rc);
194: hWndEdit = CreateWindow ("edit",
195: " ",
196: WS_CHILD | WS_VISIBLE | DS_LOCALEDIT |
197: WS_HSCROLL | WS_VSCROLL |
198: ES_AUTOHSCROLL | ES_AUTOVSCROLL |
199: ES_MULTILINE | ES_NOHIDESEL,
200: rc.left,
201: rc.top,
202: rc.right-rc.left,
203: rc.bottom-rc.top,
204: hWnd,
205: (HMENU)IDC_EDIT,
206: (HANDLE)GetModuleHandle (NULL),
207: 0);
208:
209: // if edit control failed, abort aplication
210: if (!IsWindow (hWndEdit))
211: {
212: ErrorNotify (hWnd, IDS_EDITWNDFAILED);
213: return FALSE;
214: }
215:
216: // save edit window handle and init state variables
217: SetWindowLong (hWnd, WL_HWNDEDIT, (LONG) hWndEdit);
218: SetWindowWord (hWnd, WW_SCROLL, TRUE);
219: SetWindowWord (hWnd, WW_UNTITLED, TRUE);
220: SetWindowWord (hWnd, WW_SEARCHCASE, TRUE);
221: SetWindowWord (hWnd, WW_SEARCHDN, TRUE);
222: SetWindowLong (hWnd, WL_HPTRDEVNAMES, 0);
223:
224: // get printer configuration
225: if (!GetPrinterConfig (hWnd))
226: ErrorNotify (hWnd, IDS_PTRCONFIGFAILED);
227:
228: // if initialization file passed, load file now
229: if (lpcs->lpCreateParams)
230: {
231: // load filename passed at initialization
232: if ((nResult = LoadFile (hWnd, lpcs->lpCreateParams)) > 0)
233: {
234: // save filename and path in global string
235: strcpy (lpszFilePath, lpcs->lpCreateParams);
236:
237: // The file has a title, so reset the UNTITLED flag.
238: SetWindowWord(hWnd, WW_UNTITLED, FALSE);
239:
240: // extract filename from path
241: GetFileFromPath (lpszFilePath, lpszBuff);
242:
243: // set window text title to be "AppName - filename"
244: SetWindowTitle (hWnd, lpszBuff);
245: }
246: else
247: {
248: // notify user of error
249: ErrorNotify (hWnd, nResult);
250:
251: // set window title to "AppName - Untitled"
252: LoadString ((HANDLE)GetModuleHandle (NULL),
253: IDS_UNTITLED,
254: lpszBuff,
255: sizeof (lpszBuff));
256: SetWindowTitle (hWnd, lpszBuff);
257: }
258: }
259: else
260: {
261: // set window title to "AppName - Untitled"
262: LoadString ((HANDLE)GetModuleHandle (NULL),
263: IDS_UNTITLED,
264: lpszBuff,
265: sizeof (lpszBuff));
266: SetWindowTitle (hWnd, lpszBuff);
267:
268: // set global file and path variables to null
269: *lpszFilePath = 0;
270: }
271:
272: // create fixed pitch font as default font
273: lfEditFont.lfHeight = 16;
274: lfEditFont.lfWidth = 0;
275: lfEditFont.lfEscapement = 0;
276: lfEditFont.lfOrientation = 0;
277: lfEditFont.lfWeight = 400;
278: lfEditFont.lfItalic = FALSE;
279: lfEditFont.lfUnderline = FALSE;
280: lfEditFont.lfStrikeOut = FALSE;
281: lfEditFont.lfCharSet = ANSI_CHARSET;
282: lfEditFont.lfOutPrecision = OUT_DEFAULT_PRECIS;
283: lfEditFont.lfClipPrecision = CLIP_DEFAULT_PRECIS;
284: lfEditFont.lfQuality = DEFAULT_QUALITY;
285: lfEditFont.lfPitchAndFamily = FIXED_PITCH | FF_MODERN;
286: *lfEditFont.lfFaceName = 0;
287:
288: // make scroll bars initially visible
289: SetScrollRange (hWndEdit, SB_VERT, 0, 100, TRUE);
290: SetScrollRange (hWndEdit, SB_HORZ, 0, 100, TRUE);
291:
292: // create the logical font
293: if (hFont = CreateFontIndirect (&lfEditFont))
294: SendMessage (hWndEdit, WM_SETFONT, (UINT)hFont, 0);
295: else
296: ErrorNotify (hWnd, IDS_FONTFAILEDTOCREATE);
297:
298: // remove hourglass cursor
299: SetClassLong (hWnd, GCL_HCURSOR, (LONG)hOldCursor);
300: SetCursor (hOldCursor);
301:
302: // set focus to edit window
303: SetFocus (hWndEdit);
304: }
305: break;
306:
307: case WM_SIZE:
308: {
309: RECT rc;
310: HWND hWndEdit;
311:
312: // resize the edit control to match the client area
313: hWndEdit = (HWND)GetWindowLong (hWnd, WL_HWNDEDIT);
314: GetClientRect (hWnd, &rc);
315: MoveWindow (hWndEdit,
316: rc.left,
317: rc.top,
318: rc.right-rc.left,
319: rc.bottom-rc.top,
320: TRUE);
321: }
322: break;
323:
324: case WM_SETFOCUS:
325: SetFocus ((HWND)GetWindowLong (hWnd, WL_HWNDEDIT));
326: break;
327:
328: case WM_INITMENU:
329: // initialize menuitems
330: InitializeMenu (hWnd, (HMENU)uParam);
331: break;
332:
333: case WM_WININICHANGE:
334: case WM_DEVMODECHANGE:
335: // get printer configuration
336: GetPrinterConfig (hWnd);
337: break;
338:
339: case WM_COMMAND:
340: // handle all command messages in a localized function
341: lRet = CommandHandler (hWnd, uParam, lParam);
342: break;
343:
344: case WM_CLOSE:
345: case WM_QUERYENDSESSION:
346: {
347: HWND hWndEdit = (HWND)GetWindowLong (hWnd, WL_HWNDEDIT);
348:
349: // check if there are changes to the edit contents, and offer to save first
350: if (SendMessage (hWndEdit, EM_GETMODIFY, 0, 0))
351: {
352: switch (Save_YNC (hWnd))
353: {
354: case IDCANCEL:
355: // abort exit
356: return FALSE;
357: case IDYES:
358: // save data then continue
359: if (!SendMessage (hWnd, WM_COMMAND, (UINT)UM_SAVEFILE, 0))
360: return FALSE;
361: case IDNO:
362: // just fall through
363: break;
364: }
365: }
366:
367: // call destroy window to cleanup and go away
368: DestroyWindow (hWnd);
369: }
370: break;
371:
372: case WM_DESTROY:
373: {
374: HFONT hFont = (HFONT)SendMessage ((HWND)GetWindowLong (hWnd, WL_HWNDEDIT),
375: WM_GETFONT,
376: 0,
377: 0);
378:
379: // destroy font handle from edit control if exists
380: if (hFont)
381: DeleteObject (hFont);
382:
383: PostQuitMessage (0);
384: }
385: break;
386:
387: default:
388: // process common dialog search message here, then break
389: if (uMsg == uSearchMsg)
390: {
391: LPFINDREPLACE lpfr = (LPFINDREPLACE)lParam;
392:
393: if (lpfr->Flags & FR_DIALOGTERM)
394: {
395: // save case and direction
396: SetWindowWord (hWnd, WW_SEARCHCASE, (WORD)(lpfr->Flags & FR_MATCHCASE));
397: SetWindowWord (hWnd, WW_SEARCHDN, (WORD)(lpfr->Flags & FR_DOWN));
398: hDlgSearch = NULL;
399: }
400:
401: else if (lpfr->Flags & FR_FINDNEXT)
402: if (!LocateText (hWnd,
403: (WORD)(lpfr->Flags & FR_MATCHCASE),
404: (WORD)(lpfr->Flags & FR_DOWN),
405: lpszSearch))
406: ErrorNotify (hWnd, IDS_STRINGNOTFOUND);
407: break;
408: }
409:
410: // pass all unhandled messages to DefWindowProc
411: lRet = DefWindowProc (hWnd, uMsg, uParam, lParam);
412: break;
413: }
414:
415: // return 1 if handled message, 0 if not
416: return lRet;
417: }
418:
419:
420:
421: // about box dialog procedure
422: BOOL WINAPI AboutDlgProc (
423: HWND hwnd,
424: UINT uMsg,
425: UINT uParam,
426: LONG lParam)
427: {
428: BOOL bRet = TRUE;
429:
430: switch (uMsg)
431: {
432: case WM_COMMAND:
433: switch (LOWORD (uParam))
434: {
435: // end dialog with TRUE or FALSE for OK or CANCEL
436: case IDOK:
437: case IDCANCEL:
438: EndDialog(hwnd, (LOWORD (uParam) == IDOK));
439: break;
440:
441: default:
442: bRet = FALSE;
443: }
444: break;
445:
446: default:
447: bRet = FALSE;
448: break;
449: }
450: return bRet;
451: }
452:
453:
454:
455: // initialize menu function
456: VOID WINAPI InitializeMenu (
457: HWND hWnd,
458: HANDLE hMenu)
459: {
460: WORD mfStatus;
461: DWORD dwSel;
462: HWND hWndEdit = (HWND)GetWindowLong (hWnd, WL_HWNDEDIT);
463: WORD wScroll;
464:
465: // see if edit control can undo last command
466: if (SendMessage (hWndEdit, EM_CANUNDO, 0, 0L))
467: mfStatus = MF_ENABLED;
468: else
469: mfStatus = MF_GRAYED;
470: EnableMenuItem (hMenu, IDM_EDITUNDO, mfStatus);
471:
472: // enable menuitems CUT, COPY and CLEAR if selected text
473: dwSel = SendMessage (hWndEdit, EM_GETSEL, 0, 0);
474: mfStatus = (WORD)((LOWORD(dwSel) == HIWORD(dwSel))?MF_GRAYED:MF_ENABLED);
475: EnableMenuItem (hMenu, IDM_EDITCUT, mfStatus);
476: EnableMenuItem (hMenu, IDM_EDITCOPY, mfStatus);
477: EnableMenuItem (hMenu, IDM_EDITCLEAR, mfStatus);
478:
479: // if text allow for new file, enable menuitem
480: if (SendMessage (hWndEdit, WM_GETTEXTLENGTH, NULL, NULL))
481: EnableMenuItem (hMenu, IDM_FILENEW, MF_ENABLED);
482: else
483: EnableMenuItem (hMenu, IDM_FILENEW, MF_GRAYED);
484:
485: // if CF_TEXT format data is available in clipboard
486: if (OpenClipboard (hWnd) & IsClipboardFormatAvailable (CF_TEXT))
487: EnableMenuItem (hMenu, IDM_EDITPASTE, MF_ENABLED);
488: else
489: EnableMenuItem (hMenu, IDM_EDITPASTE, MF_GRAYED);
490: CloseClipboard ();
491:
492: // set the scroll bars menuitem
493: wScroll = GetWindowWord (hWnd, WW_SCROLL);
494: CheckMenuItem (hMenu, IDM_EDITSCROLL, (UINT)(wScroll ? MF_CHECKED : MF_UNCHECKED));
495:
496: // set the word wrap state for the window
497: dwSel = GetWindowLong (hWndEdit, GWL_STYLE);
498: CheckMenuItem (hMenu,
499: IDM_EDITWRAP,
500: (UINT)((dwSel & ES_AUTOHSCROLL) ? MF_UNCHECKED : MF_CHECKED));
501:
502: // enable search menuitems if a search string exists
503: if (*lpszSearch)
504: {
505: EnableMenuItem (hMenu, IDM_SEARCHNEXT, MF_ENABLED);
506: EnableMenuItem (hMenu, IDM_SEARCHPREV, MF_ENABLED);
507: }
508: else
509: {
510: EnableMenuItem (hMenu, IDM_SEARCHNEXT, MF_GRAYED);
511: EnableMenuItem (hMenu, IDM_SEARCHPREV, MF_GRAYED);
512: }
513:
514: // enable Print menuitems if a printer is available
515: if (GetWindowLong (hWnd, WL_HPTRDEVNAMES))
516: {
517: EnableMenuItem (hMenu, IDM_FILEPRINT, MF_ENABLED);
518: EnableMenuItem ( hMenu, IDM_FILESETUP, MF_ENABLED);
519: }
520: else
521: {
522: EnableMenuItem (hMenu, IDM_FILEPRINT, MF_GRAYED);
523: EnableMenuItem ( hMenu, IDM_FILESETUP, MF_GRAYED);
524: }
525:
526: // menuitems that are always enabled
527: EnableMenuItem(hMenu, IDM_EDITSCROLL, MF_ENABLED);
528: EnableMenuItem(hMenu, IDM_EDITSELECT, MF_ENABLED);
529: EnableMenuItem(hMenu, IDM_EDITWRAP, MF_ENABLED);
530: EnableMenuItem(hMenu, IDM_SEARCHFIND, MF_ENABLED);
531: }
532:
533:
534:
535: // handle all WM_COMMAND messages here
536: LONG WINAPI CommandHandler (
537: HWND hWnd,
538: UINT uParam,
539: LONG lParam)
540: {
541: int nResult;
542: HWND hWndEdit = (HWND)GetWindowLong (hWnd, WL_HWNDEDIT);
543:
544: switch (LOWORD(uParam))
545: {
546: case IDM_FILENEW:
547: {
548: char lpszMsg[MAX_PATH];
549:
550: // check if there are changes, and offer to save first
551: if (SendMessage (hWndEdit, EM_GETMODIFY, 0, 0))
552: {
553: switch (Save_YNC (hWnd))
554: {
555: case IDCANCEL:
556: // abort operation
557: return FALSE;
558: case IDYES:
559: // save data then continue if successful
560: if (!SendMessage (hWnd, WM_COMMAND, (UINT)UM_SAVEFILE, 0))
561: return FALSE;
562: case IDNO:
563: // just fall through
564: break;
565: }
566:
567: // reset edit changes flag
568: SendMessage (hWndEdit, EM_SETMODIFY, FALSE, 0);
569: }
570:
571: // clear edit control
572: SetWindowText (hWndEdit, "");
573:
574: // set window title to "Untitled"
575: LoadString ((HANDLE)GetModuleHandle (NULL),
576: IDS_UNTITLED,
577: lpszMsg,
578: sizeof (lpszMsg));
579: SetWindowTitle (hWnd, lpszMsg);
580: SetWindowWord (hWnd, WW_UNTITLED, TRUE);
581:
582: // reset caret position by sending WM_KILLFOCUS/WM_SETFOCUS messages
583: SetFocus (NULL);
584: SetFocus (hWndEdit);
585: }
586: break;
587:
588: case IDM_FILEOPEN:
589: {
590: char lpszFileName[MAX_PATH];
591: int nResult;
592:
593: // if changes to current file, ask to save first
594: if (SendMessage (hWndEdit, EM_GETMODIFY, 0, 0))
595: {
596: switch (Save_YNC (hWnd))
597: {
598: case IDCANCEL:
599: // abort operation
600: return FALSE;
601: case IDYES:
602: // save data then continue
603: if (!SendMessage (hWnd, WM_COMMAND, (UINT)UM_SAVEFILE, 0))
604: return FALSE;
605: case IDNO:
606: // just fall through
607: break;
608: }
609:
610: // reset edit changes flag
611: SendMessage (hWndEdit, EM_SETMODIFY, FALSE, 0);
612: }
613:
614: // get new filename and load into edit control
615: if (GetFileName (hWnd, lpszFileName, lpszFilePath))
616: {
617: if ((nResult = LoadFile (hWnd, lpszFilePath)) < 0)
618: // notify user of error
619: ErrorNotify (hWnd, nResult);
620: else
621: {
622: // update window text
623: SetWindowTitle (hWnd, lpszFileName);
624: SetWindowWord (hWnd, WW_UNTITLED, FALSE);
625: }
626: }
627: else
628: return FALSE;
629: }
630: break;
631:
632: case IDM_FILESAVEAS:
633: {
634: char lpszFileTitle[MAX_PATH];
635: int nResult;
636:
637: // get a valid filename and path
638: if (SaveAsFileName (hWnd, lpszFileTitle, lpszFilePath))
639: {
640: // if file saves okay
641: if ((nResult = SaveFile (hWnd, lpszFilePath)) > 0)
642: {
643: // reset changed flag, and window title
644: SendMessage (hWndEdit, EM_SETMODIFY, FALSE, 0);
645: SetWindowTitle (hWnd, lpszFileTitle);
646: SetWindowWord (hWnd, WW_UNTITLED, FALSE);
647: }
648: else
649: {
650: // unable to save file, return error
651: ErrorNotify (hWnd, nResult);
652: return FALSE;
653: }
654: }
655: else
656: return FALSE;
657: }
658: break;
659:
660: case IDM_FILESAVE:
661: {
662: char lpszFileTitle[MAX_PATH];
663: int nResult;
664:
665: // if called from menu, check to see if file modified
666: if (!lParam &&
667: SendMessage (hWndEdit, EM_GETMODIFY, 0, 0))
668: return FALSE;
669:
670: // user defined msg is sent from Exit, Open and New menuitems
671: case UM_SAVEFILE:
672:
673: // if untitled, get new name
674: if (GetWindowWord (hWnd, WW_UNTITLED) &&
675: !(SaveAsFileName(hWnd, lpszFileTitle, lpszFilePath)))
676: {
677: // make sure no name was saved
678: *lpszFilePath = 0;
679: return FALSE;
680: }
681:
682: // save buffer and reset flag
683: if ((nResult = SaveFile (hWnd, lpszFilePath)) > 0)
684: {
685: // if new file name, set window title
686: if (*lpszFileTitle)
687: {
688: SetWindowTitle (hWnd, lpszFileTitle);
689: SetWindowWord (hWnd, WW_UNTITLED, FALSE);
690: }
691: SendMessage (hWndEdit, EM_SETMODIFY, FALSE, 0);
692: }
693: else
694: {
695: // unable to save file, return error
696: ErrorNotify (hWnd, nResult);
697: return FALSE;
698: }
699: }
700: break;
701:
702: case IDM_FILEPRINT:
703: {
704: int nRes;
705:
706: // print the file
707: if ((nRes = PrintFile (hWnd)) < 0)
708: ErrorNotify (hWnd, nRes);
709: }
710: break;
711:
712: case IDM_FILESETUP:
713: {
714: int nRes;
715:
716: // set up the printer environment
717: if ((nRes = PrinterSetup (hWnd)) < 0)
718: ErrorNotify (hWnd, nRes);
719: }
720: break;
721:
722: case IDM_FILEEXIT:
723: // exit application
724: PostMessage (hWnd, WM_CLOSE, 0, 0L);
725: break;
726:
727: case IDM_FILEABOUT:
728: // call about dialog box
729: DialogBox ((HANDLE)GetModuleHandle (NULL),
730: (LPSTR)IDD_ABOUT,
731: hWnd,
732: AboutDlgProc);
733: break;
734:
735: #if EDIT_FIXED
736: case IDM_EDITCOPY:
737: case IDM_EDITCUT:
738: case IDM_EDITCLEAR:
739: SendMessage (hWndEdit, uParam, 0, 0);
740: break;
741: #else
742: case IDM_EDITCUT:
743: case IDM_EDITCOPY:
744: {
745: HLOCAL hEditData, hData;
746: char *lpEditData, *lpData;
747: DWORD BegSel, EndSel;
748:
749: // get current selection
750: SendMessage (hWndEdit, EM_GETSEL, (UINT)&BegSel, (UINT)&EndSel);
751: hEditData = (HLOCAL)SendMessage (hWndEdit, EM_GETHANDLE, 0, 0);
752: lpEditData = LocalLock (hEditData);
753:
754: // allocate buffer to hold cipboard data
755: hData = LocalAlloc (LHND, EndSel-BegSel+1);
756: lpData = LocalLock (hData);
757: strncpy (lpData, lpEditData+BegSel, EndSel-BegSel);
758: lpData[EndSel-BegSel] = 0;
759:
760: // copy data to clipboard
761: OpenClipboard (hWnd);
762: SetClipboardData (CF_TEXT, lpData);
763: CloseClipboard ();
764:
765: // unlock memory and free
766: LocalUnlock (hEditData);
767: LocalUnlock (hData);
768: LocalFree (hData);
769: }
770:
771: // if copying to clipboard, exit here
772: if (uParam == IDM_EDITCOPY)
773: break;
774:
775: case IDM_EDITCLEAR:
776: // replace selection with null
777: SendMessage (hWndEdit, EM_REPLACESEL, 0, (UINT)"");
778: break;
779: #endif
780:
781: case IDM_EDITPASTE:
782: SendMessage (hWndEdit, uParam, 0, 0);
783: break;
784:
785: case IDM_EDITSELECT:
786: // 0, -1 selects the entire string
787: SendMessage (hWndEdit, EM_SETSEL, 0, (LONG)(int)-1);
788: break;
789:
790: case IDM_EDITUNDO:
791: SendMessage (hWndEdit, EM_UNDO, 0, 0);
792: break;
793:
794: case IDM_EDITSCROLL:
795: {
796: WORD wScroll = !GetWindowWord (hWnd, WW_SCROLL);
797:
798: // toggle vertical scroll bar
799: SetScrollRange (hWndEdit, SB_VERT, 0, (int)(wScroll ? 100 : 0), TRUE);
800:
801: // if not word wrap, toggle horizontal scroll
802: if (ES_AUTOHSCROLL & GetWindowLong (hWndEdit, GWL_STYLE))
803: SetScrollRange (hWndEdit, SB_HORZ, 0, (int)(wScroll ? 100 : 0), TRUE);
804:
805: // set scroll flag
806: SetWindowWord (hWnd, WW_SCROLL, wScroll);
807: }
808: break;
809:
810: case IDM_EDITWRAP:
811: // change edit control
812: if ((nResult = SetWrap (hWnd)) < 0)
813: // notify user of error
814: ErrorNotify (hWnd, nResult);
815: break;
816:
817: case IDM_EDITFONT:
818: {
819: CHOOSEFONT cf;
820: LOGFONT lfEditFont;
821: HFONT hEditFont;
822: int iSize;
823:
824: // get logical font structure from current font
825: if (hEditFont = (HFONT)SendMessage (hWndEdit, WM_GETFONT, 0, 0))
826: {
827: GetObject (hEditFont, sizeof (lfEditFont), &lfEditFont);
828: cf.Flags = CF_INITTOLOGFONTSTRUCT | CF_SCREENFONTS;
829: }
830: else
831: cf.Flags = CF_SCREENFONTS;
832:
833: // call common dialog to select a font
834: cf.lStructSize = sizeof (CHOOSEFONT);
835: cf.hwndOwner = hWnd;
836: cf.hDC = NULL;
837: cf.lpLogFont = &lfEditFont;
838: cf.iPointSize = iSize;
839: cf.rgbColors = NULL;
840: cf.lCustData = NULL;
841: cf.lpfnHook = NULL;
842: cf.lpTemplateName = NULL;
843: cf.hInstance = NULL;
844: cf.lpszStyle = NULL;
845: cf.nFontType = SCREEN_FONTTYPE;
846: cf.nSizeMin = NULL;
847: cf.nSizeMax = NULL;
848:
849: if (ChooseFont (&cf))
850: {
851: // create new font and put in edit control
852: SendMessage (hWndEdit,
853: WM_SETFONT,
854: (UINT)CreateFontIndirect
855: (&lfEditFont),
856: TRUE);
857:
858: if (hEditFont)
859: DeleteObject (hEditFont);
860: }
861: }
862: break;
863:
864: case IDM_SEARCHFIND:
865: {
866: UINT uBegSel, uEndSel;
867: WORD wCase = GetWindowWord (hWnd, WW_SEARCHCASE);
868: WORD wDir = GetWindowWord (hWnd, WW_SEARCHDN);
869:
870: // if selected text, replace global search string
871: SendMessage (hWndEdit, EM_GETSEL, (UINT)&uBegSel, (UINT)&uEndSel);
872: if (uBegSel != uEndSel)
873: GetEditSubString (hWndEdit, &uBegSel, &uEndSel, lpszSearch);
874:
875: // Put up the find dialog box
876: if (!FindDialog (hWnd, wCase, wDir, lpszSearch))
877: ErrorNotify (hWnd, IDS_SEARCHDLGFAILED);
878: }
879: break;
880:
881: case IDM_SEARCHNEXT:
882: // locate next search string in edit control
883: if (!LocateText (hWnd,
884: GetWindowWord (hWnd, WW_SEARCHCASE),
885: TRUE,
886: lpszSearch))
887: ErrorNotify (hWnd, IDS_STRINGNOTFOUND);
888: break;
889:
890: case IDM_SEARCHPREV:
891: // locate previous search string in edit control
892: if (!LocateText (hWnd,
893: GetWindowWord (hWnd, WW_SEARCHCASE),
894: FALSE,
895: lpszSearch))
896: ErrorNotify (hWnd, IDS_STRINGNOTFOUND);
897: break;
898:
899: case IDM_PORTCURFILE:
900: // if untitled, save first
901: if (GetWindowWord (hWnd, WW_UNTITLED) &&
902: !SendMessage (hWnd, WM_COMMAND, IDM_FILEOPEN, 0))
903: {
904: ErrorNotify (hWnd, IDS_NOFILETOPORT);
905: break;
906: }
907:
908: // start port dialog with flags
909: hDlgPort = CreateDialog (GetModuleHandle (NULL),
910: IDD_PORTDIALOG,
911: hWnd,
912: PortDlgProc);
913: break;
914:
915: case IDM_PORTBKGND:
916: if (IsWindow (hDlgPortStatus))
917: ShowWindow (hDlgPortStatus, SW_SHOWNORMAL);
918: else if (!(hDlgPortStatus = StartBackground (GetModuleHandle (NULL),
919: hWnd,
920: NULL)))
921: ErrorNotify (hWnd, IDS_BKPORTSTARTFAILED);
922: break;
923: }
924: return TRUE;
925: }
926:
927:
928:
929: // change the word wrapping in an edit control
930: int WINAPI SetWrap (
931: HWND hWnd)
932:
933: {
934: DWORD dwStyle;
935: HANDLE hOldData, hNewData;
936: char *lpOldData, *lpNewData;
937: HWND hWndOld = (HWND)GetWindowLong (hWnd, WL_HWNDEDIT);
938: HWND hWndNew;
939: RECT rc;
940: UINT uLen;
941: UINT uBegSel, uEndSel;
942: WORD wScroll = GetWindowWord (hWnd, WW_SCROLL);
943: HFONT hEditFont = (HFONT)SendMessage (hWndOld, WM_GETFONT, 0, 0);
944:
945:
946: // turn off scroll bars if currently present
947: if (wScroll)
948: {
949: SetScrollRange (hWndOld, SB_VERT, 0, 0, FALSE);
950: SetScrollRange (hWndOld, SB_HORZ, 0, 0, FALSE);
951: }
952:
953: // new edit style = old style XOR ES_AUTOHSCROLL
954: dwStyle = ES_AUTOHSCROLL ^ (DWORD)GetWindowLong (hWndOld, GWL_STYLE);
955:
956: // save text selection
957: SendMessage (hWndOld, EM_GETSEL, (UINT)&uBegSel, (UINT)&uEndSel);
958:
959: // create a new edit control with the new style
960: GetClientRect (hWnd, &rc);
961: hWndNew = CreateWindow ("edit",
962: "",
963: dwStyle,
964: rc.left,
965: rc.top,
966: rc.right-rc.left,
967: rc.bottom-rc.top,
968: hWnd,
969: (HMENU)IDC_EDIT,
970: (HANDLE)GetModuleHandle (NULL),
971: 0);
972:
973: // check for window created
974: if (!IsWindow (hWndNew))
975: return IDS_EDITWNDFAILED;
976:
977: // reset to no format lines
978: SendMessage (hWndOld, EM_FMTLINES, !(dwStyle & ES_AUTOHSCROLL), 0);
979:
980: // get the data handle of the old control
981: if (!(hOldData = (HANDLE)SendMessage (hWndOld, EM_GETHANDLE, 0, 0)))
982: {
983: // delete new edit window and return error
984: DestroyWindow (hWndNew);
985: return IDS_GETHANDLEFAILED;
986: }
987:
988: // get data handle to new edit control and reallocate to size of old edit text
989: hNewData = (HANDLE)SendMessage (hWndNew, EM_GETHANDLE, 0, 0);
990: uLen = GetWindowTextLength (hWndOld);
991: if (LocalReAlloc(hNewData, uLen+1, LHND) == NULL)
992: {
993: // abort, clean up and return error
994: DestroyWindow (hWndNew);
995: return IDS_REALLOCFAILED;
996: }
997:
998: lpOldData = LocalLock (hOldData);
999: lpNewData = LocalLock (hNewData);
1000: lpNewData[uLen+1] = 0;
1001:
1002: // copy from one buffer to the other
1003: while (uLen-- > 0)
1004: lpNewData[uLen] = lpOldData[uLen];
1005:
1006: // unlock and release data buffers
1007: LocalUnlock (hOldData);
1008: LocalUnlock (hNewData);
1009:
1010: // swap windows
1011: SetWindowLong (hWnd, WL_HWNDEDIT, (LONG)hWndNew);
1012: DestroyWindow (hWndOld);
1013: SendMessage (hWndNew, EM_SETHANDLE, (UINT)hNewData, 0);
1014:
1015: // set line formatting
1016: SendMessage (hWndNew, EM_FMTLINES, !(dwStyle & ES_AUTOHSCROLL), 0);
1017:
1018: // replace font in new edit control
1019: if (hEditFont)
1020: SendMessage (hWndNew, WM_SETFONT, (UINT)hEditFont, 0);
1021:
1022: // set scroll bars if appropriate
1023: if (wScroll)
1024: {
1025: SetScrollRange (hWndNew, SB_VERT, 0, 100, TRUE);
1026: SetScrollRange (hWndNew, SB_HORZ, 0, (ES_AUTOHSCROLL & dwStyle ? 100 : 0), TRUE);
1027: }
1028:
1029: // restore text selection, repaint and set focus
1030: InvalidateRect (hWndNew, NULL, TRUE);
1031: UpdateWindow (hWndNew);
1032: SendMessage (hWndNew, EM_SETSEL, uBegSel, uEndSel);
1033: SetFocus (hWndNew);
1034:
1035: // return success
1036: return TRUE;
1037: }
1038:
1039:
1040:
1041: // get win32 command line parameters
1042: BOOL WINAPI GetCmdLine(
1043: char *lpStr,
1044: char *lpszCmdLine,
1045: BOOL *bBkgnd)
1046: {
1047: if (*lpStr)
1048: {
1049: // skip application name which precedes parameters
1050: while (*lpStr != ' ' && *lpStr != 0)
1051: lpStr++;
1052:
1053: // skip spaces
1054: while (*lpStr == ' ' && *lpStr != 0)
1055: lpStr++;
1056:
1057: // indeed command line parameter(s) present
1058: if (*lpStr != 0)
1059: {
1060: // if background switch, set flag and remove switch from command line
1061: if ((*lpStr == '/' || *lpStr == '-') &&
1062: (*(lpStr+1) == 'b' || *(lpStr+1) == 'B'))
1063: {
1064: *bBkgnd = TRUE;
1065: lpStr += 2;
1066:
1067: if (*lpStr == 0)
1068: *lpszCmdLine = 0;
1069: else
1070: strcpy (lpszCmdLine, lpStr);
1071: }
1072: // maybe switch is embedded in parameter(s) somewhere
1073: else
1074: {
1075: char *pStr = lpStr;
1076: char *pCmdLine = lpszCmdLine;
1077: int i, nCnt;
1078:
1079: while (*pStr != 0)
1080: {
1081: // background switch is set, so prepare parameters and set flag
1082: if ((*pStr == '/' || *pStr == '-') &&
1083: (*(pStr+1) == 'b' || *(pStr+1) == 'B'))
1084: {
1085: *bBkgnd = TRUE;
1086:
1087: // copy from beg. of lpStr to *pStr to lpszCmdLine
1088: nCnt = pStr - lpStr;
1089: for (i=0; i<nCnt; i++)
1090: lpszCmdLine[i] = lpStr[i];
1091: lpszCmdLine[i] = 0;
1092: strcat (lpszCmdLine, (pStr+2));
1093:
1094: // break from loop
1095: break;
1096: }
1097:
1098: pStr++;
1099: }
1100:
1101: // no switch found, can only edit one file, remove extra parameters
1102: if (*pStr == 0)
1103: {
1104: pStr = lpStr;
1105:
1106: while (*pStr != ' ' && *pStr != 0)
1107: pStr++;
1108:
1109: if (*pStr == ' ')
1110: *pStr = 0;
1111:
1112: strcpy (lpszCmdLine, lpStr);
1113: }
1114: }
1115: }
1116: else
1117: return FALSE;
1118: }
1119: else
1120: return FALSE;
1121:
1122: return TRUE;
1123: }
1124:
1125:
1126:
1127: // display a Save, Yes|No|Cancel message box
1128: int WINAPI Save_YNC (
1129: HWND hWnd)
1130: {
1131: char lpszMsg[MAX_PATH];
1132: char lpszAppName[MAX_PATH];
1133:
1134: // load string to prompt user
1135: LoadString ((HANDLE)GetModuleHandle (NULL),
1136: IDS_DATACHANGED,
1137: lpszMsg,
1138: sizeof (lpszMsg));
1139: LoadString ((HANDLE)GetModuleHandle (NULL),
1140: IDS_APPNAME,
1141: lpszAppName,
1142: sizeof (lpszAppName));
1143:
1144: // return user response
1145: return (MessageBox (hWnd,
1146: lpszMsg,
1147: lpszAppName,
1148: MB_YESNOCANCEL | MB_ICONQUESTION));
1149: }
1150:
1151:
1152:
1153: // error notification routine
1154: VOID WINAPI ErrorNotify (
1155: HWND hWnd,
1156: int nErrorString)
1157: {
1158: char lpszAppName[MAX_PATH];
1159: char lpszErrStr[MAX_PATH];
1160:
1161: LoadString ((HANDLE)GetModuleHandle (NULL),
1162: IDS_APPNAME,
1163: lpszAppName,
1164: sizeof (lpszAppName));
1165: LoadString ((HANDLE)GetModuleHandle (NULL),
1166: nErrorString,
1167: lpszErrStr,
1168: sizeof (lpszErrStr));
1169: MessageBox (hWnd, lpszErrStr, lpszAppName, MB_OK | MB_ICONSTOP);
1170: }
1171:
1172:
1173:
1174: VOID WINAPI SetWindowTitle (
1175: HWND hWnd,
1176: char *lpszFile)
1177: {
1178: char lpszAppName[MAX_PATH];
1179:
1180: // load AppName and Window title string into window text
1181: LoadString ((HANDLE)GetModuleHandle (NULL),
1182: IDS_PRINTJOB,
1183: lpszAppName,
1184: sizeof (lpszAppName));
1185: strcat (lpszAppName, lpszFile);
1186: SetWindowText (hWnd, lpszAppName);
1187: }
1188:
1189:
1190:
1191: // extract a substring from the edit controls data buffer
1192: VOID WINAPI GetEditSubString (
1193: HWND hWndEdit,
1194: PUINT puStart,
1195: PUINT puEnd,
1196: char *lpszString)
1197: {
1198: HANDLE hEditData;
1199: char *lpEditData;
1200: UINT i;
1201:
1202: // maximum search string length is MAXSEARCHSTRING characters
1203: if ((*puEnd - *puStart) > MAXSEARCHSTRING)
1204: *puEnd = *puStart + MAXSEARCHSTRING;
1205:
1206: // get edit data handle and lock
1207: hEditData = (HANDLE)SendMessage (hWndEdit, EM_GETHANDLE, 0, 0);
1208: lpEditData = (char *)LocalLock (hEditData);
1209:
1210: // copy characters to string and terminate
1211: for (i=*puStart; i<*puEnd; i++)
1212: lpszString[i-*puStart] = lpEditData[i];
1213: lpszString[i-*puStart] = 0;
1214:
1215: // unlock and return edit handle
1216: LocalUnlock (hEditData);
1217: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.