|
|
1.1 root 1: /*==============================================================*\
2: * File.c - routines for handling the standard file menu
3: * commands
4: * Created 1990, Microsoft, IBM Corp.
5: *--------------------------------------------------------------
6: *
7: * This module contains the code for the WM_COMMAND messages
8: * posted by the standard File menu.
9: *
10: *--------------------------------------------------------------
11: *
12: * This source file contains the following functions:
13: *
14: * FileNew(mp2);
15: * FileOpen(mp2);
16: * FileSave(mp2);
17: * FileSaveAs(mp2);
18: * FilePrint(mp2);
19: * FilePageSetup(mp2);
20: * FilePrintSetup(mp2);
21: * FileExit(mp2);
22: * WriteFileToDisk(hf);
23: * GetFileName();
24: * UpdateTitleText(hwnd);
25: *
26: \*==============================================================*/
27:
28: /*--------------------------------------------------------------*\
29: * Include files, macros, defined constants, and externs
30: \*--------------------------------------------------------------*/
31:
32: #define INCL_WINFRAMEMGR
33: #define INCL_WINSWITCHLIST
34: #define INCL_WINMLE
35: #define INCL_WINSTDFILE
36:
37:
38: /* The comments around this line should be removed when the import/export
39: bug in MLEs is fixed */
40: /* #define MLE_BUGS_FIXED */
41:
42: #include <os2.h>
43: #include <string.h>
44: #include "sty_main.h"
45: #include "sty_xtrn.h"
46: #include "sty_dlg.h"
47:
48: /*--------------------------------------------------------------*\
49: * Global variables
50: \*--------------------------------------------------------------*/
51:
52: CHAR szFullPath[CCHMAXPATH] = "";
53:
54: /*--------------------------------------------------------------*\
55: * Entry point declarations
56: \*--------------------------------------------------------------*/
57:
58:
59: /****************************************************************\
60: * New file routine
61: *--------------------------------------------------------------
62: *
63: * Name: FileNew(mp2)
64: *
65: * Purpose: Processes the File menu's New item
66: *
67: * Usage: called whenever New from the File menu is selected
68: *
69: * Method:
70: *
71: *
72: * Returns:
73: *
74: \****************************************************************/
75: VOID FileNew(mp2)
76: MPARAM mp2; /* second parameter of WM_COMMAND message */
77: {
78: SHORT sT;
79:
80: /*--------------------------------------------------------------*\
81: * Enter routines for creating a new file and window
82: \*--------------------------------------------------------------*/
83:
84: /* save file if changed */
85: if(WinSendMsg(hwndMLE, MLM_QUERYCHANGED, NULL, NULL)) {
86: sT = MessageBox(hwndMLE,
87: IDMSG_OVERWRITEFILE,
88: MB_QUERY | MB_YESNOCANCEL,
89: FALSE);
90:
91:
92: if(sT == MBID_CANCEL) /* if user cancels the New, then return */
93: return;
94: #ifdef MLE_BUGS_FIXED
95: else
96: if(sT == MBID_YES)
97: FileSave(NULL);
98: #endif
99: /* if sT == MBID_NO, continue with New File processing */
100:
101:
102: }
103:
104: /* disable redrawing of the MLE so the text doesn't "flash" when
105: the MLE is cleared */
106: WinSendMsg(hwndMLE, MLM_DISABLEREFRESH, NULL, NULL);
107:
108: /* clear the MLE by selecting all of the text and clearing it */
109: WinSendMsg(hwndMLE,
110: MLM_SETSEL,
111: MPFROMSHORT(NULL),
112: (MPARAM)WinSendMsg(hwndMLE, MLM_QUERYTEXTLENGTH, NULL, NULL));
113:
114: WinSendMsg(hwndMLE, MLM_CLEAR, NULL, NULL);
115:
116: /* reset the changed flag */
117: WinSendMsg(hwndMLE, MLM_SETCHANGED, MPFROMSHORT((BOOL)FALSE), NULL);
118:
119: /* enable redrawing of the MLE */
120: WinSendMsg(hwndMLE, MLM_ENABLEREFRESH, NULL, NULL);
121:
122: /* reset file name to NULL and update the main title bar*/
123: szFullPath[0] = 0;
124: UpdateTitleText(hwndMainFrame);
125:
126:
127: /* This routine currently doesn't use the mp2 parameter but *\
128: * it is referenced here to prevent an 'Unreferenced Parameter'
129: \* warning at compile time. */
130: mp2;
131:
132: } /* FileNew() */
133:
134:
135: #ifdef MLE_BUGS_FIXED
136:
137:
138: /****************************************************************\
139: * Open file routine
140: *--------------------------------------------------------------
141: *
142: * Name: FileOpen(mp2)
143: *
144: * Purpose: Processes the File menu's Open item.
145: *
146: * Usage: called whenever New from the File menu is selected
147: *
148: * Method: calls the standard file open dialog to get the
149: * file name. The file name is passed onto DosOpen
150: * which returns the handle to the file. The file
151: * input procedure is called and then the file handle
152: * is closed.
153: *
154: * Returns:
155: *
156: \****************************************************************/
157: VOID FileOpen(mp2)
158: MPARAM mp2; /* second parameter of WM_COMMAND message */
159: {
160: FILEDLG fdg;
161: HFILE hfIn;
162: ULONG ulAction;
163: FILESTATUS fstsInfo;
164: PVOID pvBuf;
165: CHAR szTitle[MESSAGELEN], szButton[MESSAGELEN];
166:
167: fdg.cbsize = sizeof(FILEDLG);
168:
169: if(!WinLoadString(hab, NULL, IDS_OPENDLGTITLE, MESSAGELEN, szTitle)) {
170: MessageBox(hwndMain, IDMSG_CANNOTLOADSTRING, MB_OK | MB_ERROR, TRUE);
171: return;
172: }
173:
174: if(!WinLoadString(hab, NULL, IDS_OPENDLGBUTTON, MESSAGELEN, szButton)) {
175: MessageBox(hwndMain, IDMSG_CANNOTLOADSTRING, MB_OK | MB_ERROR, TRUE);
176: return;
177: }
178:
179: fdg.usDialogType = OPEN_DIALOG;
180: fdg.pszTitle = szTitle;
181: fdg.pszOKButton = szButton;
182: fdg.lUser = 0L;
183: fdg.fl = FDS_HELPBUTTON | FDS_CENTER;
184: fdg.pfnDlgProc = NULL;
185: fdg.lReturn = 0L;
186: fdg.lSRC = 0L;
187: fdg.hmod = NULL;
188: fdg.idDlg = IDD_FILEOPEN;
189: fdg.x = 0;
190: fdg.y = 0;
191:
192: if(!WinLoadString(hab,
193: NULL,
194: IDS_FILEOPENEXT,
195: CCHMAXPATH,
196: fdg.szFullFile)) {
197:
198: MessageBox(hwndMain, IDMSG_CANNOTLOADSTRING, MB_OK | MB_ERROR, TRUE);
199: return;
200: }
201:
202: fdg.pszIType = 0L;
203: fdg.ppszITypeList = 0L;
204: fdg.pszIDrive = 0L;
205: fdg.ppszIDriveList = 0L;
206: fdg.sEAType = 0;
207:
208: /* get the file */
209: if(!KitFileDlg(hwndMain, (PFILEDLG)&fdg))
210: return;
211:
212:
213: /*--------------------------------------------------------------*\
214: * Upon sucessful return of a file, open it for reading
215: \*--------------------------------------------------------------*/
216:
217: if(fdg.lReturn == ID_OK) {
218: if( DosOpen(fdg.szFullFile,
219: &hfIn,
220: &ulAction,
221: 0L,
222: FILE_NORMAL,
223: FILE_OPEN,
224: OPEN_ACCESS_READONLY | OPEN_SHARE_DENYNONE,
225: 0L)) {
226:
227: MessageBox(hwndMain,
228: IDMSG_CANNOTOPENINPUTFILE,
229: MB_OK | MB_ERROR,
230: FALSE);
231: return;
232: }
233:
234: /* copy file name into file name buffer */
235: strcpy(szFullPath, fdg.szFullFile);
236:
237: /*--------------------------------------------------------------*\
238: * Place routine for reading the file here
239: \*--------------------------------------------------------------*/
240:
241: /* get the length of the file */
242: if(DosQueryFileInfo(hfIn,
243: 1,
244: (PVOID)&fstsInfo,
245: sizeof(FILESTATUS))) {
246: MessageBox(hwndMain,
247: IDMSG_CANNOTGETFILEINFO,
248: MB_OK | MB_ERROR,
249: FALSE);
250:
251: DosClose(hfIn);
252: return;
253: }
254:
255:
256: /* allocate a buffer for the file */
257: if(DosAllocMem((PPVOID)&pvBuf,
258: (ULONG)fstsInfo.cbFileAlloc,
259: fALLOC)) {
260: MessageBox(hwndMain,
261: IDMSG_CANNOTALLOCATEMEMORY,
262: MB_OK | MB_ERROR,
263: FALSE);
264:
265: DosClose(hfIn);
266: return;
267: }
268:
269: /* read in the file */
270: if(DosRead(hfIn, pvBuf, fstsInfo.cbFileAlloc, &ulAction)) {
271: MessageBox(hwndMain,
272: IDMSG_CANNOTREADFILE,
273: MB_OK | MB_ERROR,
274: FALSE);
275:
276: DosClose(hfIn);
277: return;
278: }
279:
280: /* set the file into the MLE */
281: WinSendMsg(hwndMLE,
282: MLM_SETIMPORTEXPORT,
283: MPFROMP((PBYTE)pvBuf),
284: MPFROMSHORT(fstsInfo.cbFileAlloc));
285:
286: WinSendMsg(hwndMLE,
287: MLM_IMPORT,
288: MPFROMP(NULL),
289: MPFROMSHORT(fstsInfo.cbFileAlloc));
290:
291: /* reset the changed flag */
292: WinSendMsg(hwndMLE, MLM_SETCHANGED, MPFROMSHORT((BOOL)FALSE), NULL);
293:
294: DosFreeMem(pvBuf);
295:
296: DosClose(hfIn);
297:
298: UpdateTitleText(hwndMainFrame);
299: }
300:
301:
302:
303: /* This routine currently doesn't use the mp2 parameter but *\
304: * it is referenced here to prevent an 'Unreferenced Parameter'
305: \* warning at compile time. */
306: mp2;
307:
308: } /* FileOpen() */
309:
310:
311: /****************************************************************\
312: * Save file routine
313: *--------------------------------------------------------------
314: *
315: * Name: FileSave(mp2)
316: *
317: * Purpose: Processes the File menu's Save item.
318: *
319: * Usage: called whenever Save from the File menu is
320: * selected
321: *
322: * Method: Routine calls the application's save routine
323: *
324: * Returns:
325: *
326: \****************************************************************/
327: VOID FileSave(mp2)
328: MPARAM mp2; /* second parameter of WM_COMMAND message */
329: {
330: HFILE hf;
331: ULONG ulAction;
332:
333: /*
334: * If the file currently is untitled, we will need to get a file
335: * name from the user before we can open the file. Getting a
336: * file name is normally done during the FileSaveAs operation
337: * so we will treat this save as a SaveAs and call FileSaveAs().
338: * If the file is titled, then we save the file.
339: *
340: * NOTE: This routine will be called by FileSaveAs(), but only
341: * after a valid file name has been obtained. So, FileSaveAs()
342: * will not be called again from this routine.
343: */
344: if(szFullPath[0] == 0) {
345: FileSaveAs(mp2);
346: return;
347: }
348:
349: /* open the file */
350: if( DosOpen(szFullPath,
351: &hf,
352: &ulAction,
353: 0L,
354: FILE_NORMAL,
355: FILE_OPEN | FILE_CREATE,
356: OPEN_ACCESS_WRITEONLY | OPEN_SHARE_DENYNONE,
357: 0L)) {
358:
359: MessageBox(hwndMain,
360: IDMSG_CANNOTOPENOUTPUTFILE,
361: MB_OK | MB_ERROR,
362: FALSE);
363: return;
364: }
365:
366: WriteFileToDisk(hf);
367:
368: DosClose(hf);
369:
370:
371: /* This routine currently doesn't use the mp2 parameter but *\
372: * it is referenced here to prevent an 'Unreferenced Parameter'
373: \* warning at compile time. */
374: mp2;
375:
376: } /* FileSave() */
377:
378: /****************************************************************\
379: * Save As file routine
380: *--------------------------------------------------------------
381: *
382: * Name: FileSaveAs(mp2)
383: *
384: * Purpose: Processes the File menu's Save As item.
385: *
386: * Usage: called whenever Save As from the File menu is
387: * selected
388: *
389: * Method: Routine calls the application's Save As routine
390: *
391: * Returns:
392: *
393: \****************************************************************/
394: VOID FileSaveAs(mp2)
395: MPARAM mp2; /* second parameter of WM_COMMAND message */
396: {
397: HFILE hf;
398: ULONG ulAction;
399: SHORT sT;
400:
401: while(TRUE) { /* infinite loop until we break out of it */
402:
403: /* if no file name, then get a file name */
404: if(!GetFileName())
405: return;
406:
407: /* See if the file exists. If it does, then confirm that the
408: * user wants to overwrite it. If he doesn't, then get a new
409: * file name
410: */
411: if( DosOpen(szFullPath, /* file name from, GetFileName() */
412: &hf, /* handle of opened file */
413: &ulAction,
414: 0L,
415: FILE_NORMAL,
416: FILE_CREATE,
417: OPEN_ACCESS_WRITEONLY | OPEN_SHARE_DENYNONE,
418: 0L)) {
419:
420: MessageBox(hwndMain,
421: IDMSG_CANNOTOPENOUTPUTFILE,
422: MB_OK | MB_ERROR,
423: FALSE);
424: return;
425: } else
426: DosClose(hf);
427:
428: /* if file exists, ask if we want to overwrite it */
429: if(ulAction == FILE_EXISTED) {
430: sT = MessageBox(hwndMLE,
431: IDMSG_OVERWRITEFILE,
432: MB_QUERY | MB_YESNOCANCEL,
433: FALSE);
434:
435:
436: if(sT == MBID_CANCEL)
437: return;
438:
439: if(sT == MBID_YES)
440: break;
441:
442: /* if user selected no, repeat the sequence */
443: }
444:
445: } /* while(TRUE) */
446:
447: UpdateTitleText(hwndMainFrame);
448:
449: /*
450: * Now that we have a valid file name, save the file. This is
451: * normally done under the File Save function so we can just
452: * call the FileSave() function here. Note that FileSave() will
453: * not call FileSaveAs() back since there is a valid file name
454: */
455: FileSave(mp2);
456:
457:
458:
459: /* This routine currently doesn't use the mp2 parameter but *\
460: * it is referenced here to prevent an 'Unreferenced Parameter'
461: \* warning at compile time. */
462: mp2;
463:
464: } /* FileSaveAs() */
465:
466: #endif
467:
468: #ifdef PRINT_DLGS_ENABLED
469:
470: /****************************************************************\
471: * Print file routine
472: *--------------------------------------------------------------
473: *
474: * Name: FilePrint(mp2)
475: *
476: * Purpose: Processes the File menu's Print item.
477: *
478: * Usage: called whenever Print from the File menu is
479: * selected
480: *
481: * Method: Routine calls the application's print routine
482: *
483: * Returns:
484: *
485: \****************************************************************/
486: VOID FilePrint(mp2)
487: MPARAM mp2; /* second parameter of WM_COMMAND message */
488: {
489:
490: Print(hwndMain);
491:
492:
493: /* This routine currently doesn't use the mp2 parameter but *\
494: * it is referenced here to prevent an 'Unreferenced Parameter'
495: \* warning at compile time. */
496: mp2;
497:
498: } /* FilePrint() */
499:
500: /****************************************************************\
501: * Page setup routine
502: *--------------------------------------------------------------
503: *
504: * Name: FilePageSetup(mp2)
505: *
506: * Purpose: Processes the File menu's Page Setup item.
507: *
508: * Usage: called whenever Page Setup from the File menu is
509: * selected
510: *
511: * Method: Routine calls the application's page setup routine
512: *
513: * Returns:
514: *
515: \****************************************************************/
516: VOID FilePageSetup(mp2)
517: MPARAM mp2; /* second parameter of WM_COMMAND message */
518: {
519:
520: PageSetup(hwndMain);
521:
522: /* This routine currently doesn't use the mp2 parameter but *\
523: * it is referenced here to prevent an 'Unreferenced Parameter'
524: \* warning at compile time. */
525: mp2;
526:
527: } /* FilePageSetup() */
528:
529: /****************************************************************\
530: * Print Setup routine
531: *--------------------------------------------------------------
532: *
533: * Name: FilePageSetup(mp2)
534: *
535: * Purpose: Processes the File menu's Print Setup item.
536: *
537: * Usage: called whenever Print Setup from the File menu is
538: * selected
539: *
540: * Method: Routine calls the application's Print Setup routine
541: *
542: * Returns:
543: *
544: \****************************************************************/
545: VOID FilePrintSetup(mp2)
546: MPARAM mp2; /* second parameter of WM_COMMAND message */
547: {
548:
549: PrintSetup(hwndMain);
550:
551: /* This routine currently doesn't use the mp2 parameter but *\
552: * it is referenced here to prevent an 'Unreferenced Parameter'
553: \* warning at compile time. */
554: mp2;
555:
556: } /* FilePrintSetup() */
557:
558: #endif /* PRINT_DLGS_ENABLED */
559:
560: /****************************************************************\
561: * Exit routine
562: *--------------------------------------------------------------
563: *
564: * Name: FileExit(mp2)
565: *
566: * Purpose: Processes the File menu's Exit item.
567: *
568: * Usage: called whenever Exit from the file menu is
569: * selected
570: *
571: * Method: Routine posts a WM_CLOSE message to the main
572: * application window.
573: *
574: * Returns:
575: *
576: \****************************************************************/
577: VOID FileExit(mp2)
578: MPARAM mp2; /* second parameter of WM_COMMAND message */
579: {
580:
581: WinPostMsg(hwndMain, WM_CLOSE, (MPARAM)NULL, (MPARAM)NULL);
582:
583:
584: /* This routine currently doesn't use the mp2 parameter but *\
585: * it is referenced here to prevent an 'Unreferenced Parameter'
586: \* warning at compile time. */
587: mp2;
588:
589: } /* FileExit() */
590:
591: #ifdef MLE_BUGS_FIXED
592:
593: /****************************************************************\
594: * Write file routine
595: *--------------------------------------------------------------
596: *
597: * Name: WriteFileToDisk(hf)
598: *
599: * Purpose: Writes the current file to the file in szFileName
600: *
601: * Usage: called from FileSave and FileSaveAs when a file
602: * is to be saved to disk
603: *
604: * Method: Routine uses the file handle specified and gets
605: * the text from the MLE and writes the text to the
606: * file.
607: *
608: * Returns:
609: *
610: \****************************************************************/
611: VOID WriteFileToDisk(hf)
612: HFILE hf; /* handle to the input file */
613: {
614: ULONG ulWrite;
615: PVOID pvBuf;
616: ULONG ulFileLen;
617:
618: /* get the length of the file */
619: ulFileLen = (ULONG)WinSendMsg(hwndMLE, MLM_QUERYTEXTLENGTH, NULL, NULL);
620: if(!ulFileLen)
621: return;
622:
623: /* allocate a buffer for the file */
624: if(DosAllocMem((PPVOID) &pvBuf, ulFileLen, fALLOC)) {
625: MessageBox(hwndMLE,
626: IDMSG_CANNOTALLOCATEMEMORY,
627: MB_OK | MB_ERROR,
628: FALSE);
629: return;
630: }
631:
632:
633: /* get the file from the MLE */
634: WinSendMsg(hwndMLE,
635: MLM_SETIMPORTEXPORT,
636: MPFROMP((PBYTE)pvBuf),
637: MPFROMLONG(ulFileLen));
638:
639: WinSendMsg(hwndMLE,
640: MLM_EXPORT,
641: MPFROMP(NULL),
642: MPFROMLONG(&ulFileLen));
643:
644: /* Write the file */
645: if(DosWrite(hf, pvBuf, ulFileLen, &ulWrite)) {
646: MessageBox(hwndMLE,
647: IDMSG_CANNOTWRITETOFILE,
648: MB_OK | MB_ERROR,
649: FALSE);
650: return;
651: }
652:
653: /* reset the changed flag */
654: WinSendMsg(hwndMLE, MLM_SETCHANGED, MPFROMSHORT((BOOL)FALSE), NULL);
655:
656: DosFreeMem(pvBuf);
657:
658:
659: } /* WriteFileToDisk() */
660:
661: /****************************************************************\
662: * Get file name routine
663: *--------------------------------------------------------------
664: *
665: * Name: GetFileName()
666: *
667: * Purpose: Gets the name of the save file.
668: *
669: * Usage: called when the user is needs to supply a name for
670: * the file to be saved
671: *
672: * Method: calls the standard file open dialog to get the
673: * file name.
674: *
675: * Returns: TRUE if successfull in getting a file name, FALSE
676: * if not
677: *
678: \****************************************************************/
679: BOOL GetFileName(VOID)
680: {
681: FILEDLG fdg;
682: CHAR szTitle[MESSAGELEN], szButton[MESSAGELEN];
683:
684: fdg.cbsize = sizeof(FILEDLG);
685: fdg.usDialogType = SAVEAS_DIALOG;
686:
687: if(!WinLoadString(hab, NULL, IDS_SAVEDLGTITLE, MESSAGELEN, szTitle)) {
688: MessageBox(hwndMain, IDMSG_CANNOTLOADSTRING, MB_OK | MB_ERROR, TRUE);
689: return FALSE;
690: }
691:
692: if(!WinLoadString(hab, NULL, IDS_SAVEDLGBUTTON, MESSAGELEN, szButton)) {
693: MessageBox(hwndMain, IDMSG_CANNOTLOADSTRING, MB_OK | MB_ERROR, TRUE);
694: return FALSE;
695: }
696:
697: fdg.pszTitle = szTitle;
698: fdg.pszOKButton = szButton;
699:
700: fdg.lUser = 0L;
701: fdg.fl = FDS_HELPBUTTON | FDS_CENTER;
702: fdg.pfnDlgProc = NULL;
703: fdg.lReturn = 0L;
704: fdg.lSRC = 0L;
705: fdg.hmod = NULL;
706: fdg.idDlg = IDD_FILESAVE;
707: fdg.x = 0;
708: fdg.y = 0;
709: fdg.pszIType = 0L;
710: fdg.ppszITypeList = 0L;
711: fdg.pszIDrive = 0L;
712: fdg.ppszIDriveList = 0L;
713: fdg.sEAType = 0;
714: strcpy(fdg.szFullFile, szFullPath);
715:
716: /* get the file */
717: if(!KitFileDlg(hwndMLE, (PFILEDLG)&fdg))
718: return FALSE;
719:
720: if(fdg.lReturn != ID_OK)
721: return FALSE;
722:
723: /* copy file name and path returned into buffers */
724: strcpy(szFullPath, fdg.szFullFile);
725:
726: return TRUE;
727:
728: } /* GetFileName() */
729:
730: #endif /* MLE_BUGS_FIXED */
731:
732:
733: /****************************************************************\
734: * Appends the app name to the title bar text
735: *--------------------------------------------------------------
736: *
737: * Name: UpdateTitleText(hwnd)
738: *
739: * Purpose: Updates the text in the main window's title bar to
740: * display the app name, followed by the separator,
741: * followed by the file name
742: *
743: * Usage: called at init time and when the text file is changed
744: *
745: * Method: gets the program name, appends the separator, and
746: * appends the file name.
747: *
748: * Returns:
749: *
750: \****************************************************************/
751: VOID UpdateTitleText(hwnd)
752: HWND hwnd; /* handle to frame window */
753: {
754: CHAR szBuf[MAXNAMEL];
755: CHAR szSeparator[TITLESEPARATORLEN+1];
756: PSZ pszT;
757:
758: WinQueryTaskTitle(NULL, szBuf, MAXNAMEL);
759:
760: WinLoadString(hab,
761: NULL,
762: IDS_TITLEBARSEPARATOR,
763: TITLESEPARATORLEN,
764: szSeparator);
765:
766: strcat(szBuf, szSeparator);
767:
768: if(szFullPath[0] == '\0')
769: pszT = szUntitled;
770: else
771: pszT = szFullPath;
772:
773: strcat(szBuf, pszT);
774:
775: WinSetWindowText(WinWindowFromID(hwnd, FID_TITLEBAR), szBuf);
776:
777: } /* UpdateTitleText() */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.