|
|
1.1 root 1: /*
2: FILE.C -- Open/Save As Dialog Box library routines
3: Created by Microsoft, IBM Corporation 1990
4: */
5: #define INCL_DOS
6: #define INCL_DOSQUEUES
7: #include "tool.h"
8: #include <string.h>
9:
10:
11: /****************************************************************************\
12: * This function is the Open dialog box window procedure. It handles input,
13: * allows the user to change directories, checks for legal filenames, opens
14: * specified files, appends default extensions and returns the file's name.
15: *
16: * The return values are
17: * TDF_INVALID - Library error (internal error),
18: * TDF_NOOPEN - User hits cancel
19: * TDF_NEWOPEN - Created new file (file left open)
20: * TDF_OLDOPEN - Opened existing file (file left open)
21: \****************************************************************************/
22:
23: MRESULT EXPENTRY DlgOpenWndProc(hwnd, msg, mp1, mp2)
24: HWND hwnd;
25: USHORT msg;
26: MPARAM mp1;
27: MPARAM mp2;
28: {
29: PDLF pdlf;
30: PSZ lpchFile;
31: CHAR sz[MAX_FNAME_LEN];
32:
33: switch (msg)
34: {
35: case WM_INITDLG:
36: /* initialize dialog box */
37: DlgInitOpen(hwnd, LONGFROMMP(mp2));
38:
39: /* fill static field with path name and fill list box with
40: filenames that lMatch spec */
41: if (!DlgDirList(hwnd, ((PDLF)(mp2))->pszExt+1, ID_DIRLIST,
42: ID_FILELIST, ID_PATH, ((PDLF)(mp2))->rgbFlags))
43: /* NOTE: shouldn't we post a message if something screws up? */
44: WinDismissDlg(hwnd, TDF_INVALID);
45: break;
46:
47: case WM_COMMAND:
48: pdlf = (PDLF) WinQueryWindowULong(hwnd, 0);
49: switch (SHORT1FROMMP(mp1))
50: {
51: case MBID_OK:
52: /* Open button pressed */
53: /* get name from edit box */
54: WinQueryWindowText(WinWindowFromID(hwnd, ID_EDIT),
55: CBROOTNAMEMAX, (PSZ)pdlf->szFileName);
56: Upper((PSZ)pdlf->szFileName);
57: if (strlen((PSZ)pdlf->szFileName))
58: DlgOpenName(hwnd, pdlf);
59: break;
60:
61: case MBID_CANCEL:
62: /* Cancel button pressed, dismiss dialog box */
63: WinDismissDlg(hwnd, TDF_NOOPEN);
64: break;
65:
66: case MBID_HELP:
67: /* Help button pressed */
68: WinMessageBox( HWND_DESKTOP
69: , hwnd
70: , pdlf->pszInstructions
71: , pdlf->pszTitle
72: , NULL
73: , MB_OK | MB_APPLMODAL );
74: break;
75: }
76: break;
77:
78: case WM_CONTROL:
79: pdlf = (PDLF) WinQueryWindowULong(hwnd, 0);
80: switch (SHORT1FROMMP(mp1))
81: {
82: case ID_DIRLIST:
83: /* user clicked in directory list box */
84: switch (SHORT2FROMMP(mp1))
85: {
86: case LN_SELECT:
87: /* single click case */
88: /* get current edit string */
89: WinQueryWindowText(WinWindowFromID(hwnd, ID_EDIT),
90: CBROOTNAMEMAX, (PSZ)sz);
91: Upper((PSZ)sz);
92:
93: /* get selected string */
94: if (DlgDirSelect(hwnd, (PSZ)pdlf->szFileName, ID_DIRLIST))
95: {
96: /* if edit field contains wild card, then append file
97: part to selected directory, otherwise append
98: last wildcard search spec */
99: lpchFile = FileInPath((PSZ)sz);
100: strcat( (PSZ)pdlf->szFileName
101: , DlgSearchSpec( lpchFile)
102: ? lpchFile
103: : (PSZ)pdlf->szLastWild );
104: /* set edit box to resulting name */
105: WinSetWindowText(WinWindowFromID(hwnd, ID_EDIT),
106: (PSZ)pdlf->szFileName);
107: }
108: break;
109:
110: case LN_ENTER:
111: /* get text from edit box */
112: WinQueryWindowText(WinWindowFromID(hwnd, ID_EDIT),
113: CBROOTNAMEMAX, (PSZ)pdlf->szFileName);
114: Upper((PSZ)pdlf->szFileName);
115: if( DlgSearchSpec( (PSZ)pdlf->szFileName))
116: {
117: DlgDirList( hwnd
118: , (PSZ)pdlf->szFileName
119: , ID_DIRLIST
120: , ID_FILELIST
121: , ID_PATH
122: , pdlf->rgbFlags );
123: strcpy( (PSZ)pdlf->szLastWild
124: , FileInPath( (PSZ)pdlf->szFileName));
125: WinSetWindowText( WinWindowFromID( hwnd, ID_EDIT)
126: , (PSZ)pdlf->szFileName );
127: }
128: break;
129: }
130: break;
131:
132: case ID_FILELIST:
133: /* user clicked in file list box */
134: switch (SHORT2FROMMP(mp1))
135: {
136: case LN_SELECT:
137: /* single click case */
138:
139: /* get current edit string */
140: /* if it contains a wildcard, save it before obliteration */
141: WinQueryWindowText(WinWindowFromID(hwnd, ID_EDIT),
142: CBROOTNAMEMAX, (PSZ)sz);
143: Upper((PSZ)sz);
144: if( DlgSearchSpec( (PSZ)sz))
145: strcpy( (PSZ)pdlf->szLastWild, FileInPath( (PSZ)sz));
146:
147: /* get selected file name */
148: DlgDirSelect(hwnd, (PSZ)pdlf->szFileName, ID_FILELIST);
149: /* set edit box to resulting name */
150: WinSetWindowText(WinWindowFromID(hwnd, ID_EDIT),
151: (PSZ)pdlf->szFileName);
152: break;
153:
154: case LN_ENTER:
155: /* double click case, single click already processed */
156: DlgOpenName(hwnd, pdlf);
157: break;
158: }
159: break;
160: }
161: break;
162:
163: default:
164: return (WinDefDlgProc(hwnd, msg, mp1, mp2));
165: }
166:
167: return (MRFROMLONG(0L)); /* message processed */
168: }
169:
170:
171:
172:
173: /****************************************************************************\
174: * This function stores the pdlf in the dialog window structure, sets
175: * the title and instruction texts and limits the text size.
176: \****************************************************************************/
177:
178: VOID PASCAL DlgInitOpen (hwnd, lpParm)
179: HWND hwnd;
180: ULONG lpParm;
181: {
182: PDLF pdlf;
183:
184: /* Set pdlf local to window */
185: pdlf = (PDLF) lpParm;
186: WinSetWindowULong(hwnd, 0, lpParm);
187:
188: /* set edit box text size limit */
189: WinSendDlgItemMsg(hwnd, ID_EDIT, EM_SETTEXTLIMIT, (MPARAM)CBROOTNAMEMAX, 0L);
190:
191: /* set edit window to search spec */
192: if (pdlf->pszExt != (PSZ)NULL)
193: WinSetWindowText(WinWindowFromID(hwnd, ID_EDIT), pdlf->pszExt+1);
194:
195: /* set title window */
196: if (pdlf->pszTitle != (PSZ)NULL)
197: WinSetWindowText(WinWindowFromID(hwnd, FID_TITLEBAR), pdlf->pszTitle);
198: }
199:
200:
201:
202:
203: /****************************************************************************\
204: * This function processes the currently selected name in the open dialog
205: * box. If the name represents a directory, the current directory is
206: * changed to that one and the corresponding files are displayed. If the
207: * name is a file, then it is opened.
208: \****************************************************************************/
209:
210: VOID PASCAL DlgOpenName(hwnd, pdlf)
211: HWND hwnd;
212: PDLF pdlf;
213: {
214: PSZ lpch;
215: USHORT wVal;
216: CHAR sz[MAX_FNAME_LEN];
217:
218: /* try using current name as a directory */
219: strcpy((PSZ)sz, (PSZ)pdlf->szFileName);
220: if (!DlgSearchSpec((PSZ)sz))
221: DlgAddSearchExt(pdlf, (PSZ)sz);
222: if (DlgDirList(hwnd, (PSZ)sz, ID_DIRLIST, ID_FILELIST, ID_PATH,
223: pdlf->rgbFlags))
224: {
225: /* name was a directory, extract and set file name */
226: lpch = FileInPath((PSZ)sz);
227: strcpy((PSZ)pdlf->szFileName, lpch);
228: WinSetWindowText(WinWindowFromID(hwnd, ID_EDIT),
229: (PSZ)pdlf->szFileName);
230: }
231: else
232: /* try to open name as a file */
233: if ((wVal = DlgOpenFile(pdlf, hwnd)) != TDF_NOOPEN)
234: WinDismissDlg(hwnd, wVal);
235: }
236:
237:
238:
239:
240: /****************************************************************************\
241: * This function is the SaveAs dialog box window procedure. It handles input,
242: * tests for legal filenames and uses message boxes to report any problems.
243: *
244: * Return values are:
245: * TDF_INVALID - Library error (internal error),
246: * TDF_NOOPEN - User hits cancel
247: * Specific for DLG_NOOPEN
248: * TDF_NEWSAVE - user wants to save to a new file (file not created)
249: * TDF_OLDSAVE - user wants to save over existing file (file not opened)
250: * else
251: * TDF_NEWSAVE - user wants to save to a new file (file left open)
252: * TDF_OLDSAVE - user wants to save over existing file (file left open)
253: \****************************************************************************/
254:
255: MRESULT EXPENTRY DlgSaveAsWndProc(hwnd, msg, mp1, mp2)
256: HWND hwnd;
257: USHORT msg;
258: MPARAM mp1;
259: MPARAM mp2;
260: {
261: PDLF pdlf;
262: PSZ lpchFile;
263: CHAR sz[MAX_FNAME_LEN];
264:
265: switch (msg)
266: {
267: case WM_INITDLG:
268: /* Store pdlf, set instructions, limit text size */
269: DlgInitSaveAs(hwnd, LONGFROMMP(mp2));
270:
271: /* fill static field with path name and fill list box with
272: filenames that lMatch spec */
273: if (!DlgDirList(hwnd, ((PDLF)(mp2))->pszExt+1, ID_DIRLIST,
274: ID_FILELIST, ID_PATH, ((PDLF)(mp2))->rgbFlags))
275: /* NOTE: shouldn't we post a message if something screws up? */
276: WinDismissDlg(hwnd, TDF_INVALID);
277: break;
278:
279: case WM_COMMAND:
280: pdlf = (PDLF) WinQueryWindowULong(hwnd, 0);
281: switch (SHORT1FROMMP(mp1))
282: {
283: case MBID_OK:
284: /* get text from edit box */
285: WinQueryWindowText(WinWindowFromID(hwnd, ID_EDIT),
286: CBROOTNAMEMAX, (PSZ)pdlf->szFileName);
287: Upper((PSZ)pdlf->szFileName);
288: if( DlgSearchSpec( (PSZ)pdlf->szFileName))
289: {
290: DlgDirList( hwnd
291: , (PSZ)pdlf->szFileName
292: , ID_DIRLIST
293: , ID_FILELIST
294: , ID_PATH
295: , pdlf->rgbFlags );
296: strcpy( (PSZ)pdlf->szLastWild
297: , FileInPath( (PSZ)pdlf->szFileName));
298: strcpy( (PSZ)pdlf->szFileName, (PSZ)pdlf->szLastFile);
299: WinSetWindowText( WinWindowFromID( hwnd, ID_EDIT)
300: , (PSZ)pdlf->szFileName );
301: }
302: else if( strlen( (PSZ)pdlf->szFileName))
303: DlgSaveAsName( hwnd, pdlf);
304: break;
305:
306: case MBID_CANCEL:
307: WinDismissDlg(hwnd, TDF_NOSAVE);
308: break;
309:
310: case MBID_HELP:
311: /* Help button pressed */
312: WinMessageBox( HWND_DESKTOP
313: , hwnd
314: , pdlf->pszInstructions
315: , pdlf->pszTitle
316: , NULL
317: , MB_OK | MB_APPLMODAL );
318: break;
319: }
320: break;
321:
322: case WM_CONTROL:
323: pdlf = (PDLF) WinQueryWindowULong(hwnd, 0);
324: switch (SHORT1FROMMP(mp1))
325: {
326: case ID_DIRLIST:
327: /* user clicked in directory list box */
328: switch (SHORT2FROMMP(mp1))
329: {
330: case LN_SELECT:
331: /* single click case */
332: /* get current edit string */
333: WinQueryWindowText(WinWindowFromID(hwnd, ID_EDIT),
334: CBROOTNAMEMAX, (PSZ)sz);
335: Upper((PSZ)sz);
336:
337: /* get selected string */
338: if (DlgDirSelect(hwnd, (PSZ)pdlf->szFileName, ID_DIRLIST))
339: {
340: /* if edit field contains wild card, then append file
341: part to selected directory, otherwise append
342: last wildcard search spec */
343: lpchFile = FileInPath((PSZ)sz);
344: if( DlgSearchSpec( lpchFile))
345: {
346: strcat( (PSZ)pdlf->szFileName, lpchFile );
347: strcpy( (PSZ)pdlf->szLastWild, lpchFile);
348: }
349: else
350: {
351: strcat( (PSZ)pdlf->szFileName, (PSZ)pdlf->szLastWild );
352: strcpy( (PSZ)pdlf->szLastFile, lpchFile);
353: }
354: /* set edit box to resulting name */
355: WinSetWindowText(WinWindowFromID(hwnd, ID_EDIT),
356: (PSZ)pdlf->szFileName);
357: }
358: break;
359:
360: case LN_ENTER:
361: /* get text from edit box */
362: WinQueryWindowText(WinWindowFromID(hwnd, ID_EDIT),
363: CBROOTNAMEMAX, (PSZ)pdlf->szFileName);
364: Upper((PSZ)pdlf->szFileName);
365: if( DlgSearchSpec( (PSZ)pdlf->szFileName))
366: {
367: DlgDirList( hwnd
368: , (PSZ)pdlf->szFileName
369: , ID_DIRLIST
370: , ID_FILELIST
371: , ID_PATH
372: , pdlf->rgbFlags );
373: strcpy( (PSZ)pdlf->szLastWild
374: , FileInPath( (PSZ)pdlf->szFileName));
375: strcpy( (PSZ)pdlf->szFileName, (PSZ)pdlf->szLastFile);
376: WinSetWindowText( WinWindowFromID( hwnd, ID_EDIT)
377: , (PSZ)pdlf->szFileName );
378: }
379: break;
380: }
381: break;
382:
383: case ID_FILELIST:
384: /* user clicked in file list box */
385: switch (SHORT2FROMMP(mp1))
386: {
387: case LN_SELECT:
388: /* single click case */
389:
390: /* get current edit string */
391: /* if it contains a wildcard, save it before obliteration */
392: WinQueryWindowText(WinWindowFromID(hwnd, ID_EDIT),
393: CBROOTNAMEMAX, (PSZ)sz);
394: Upper((PSZ)sz);
395: if( DlgSearchSpec( (PSZ)sz))
396: strcpy( (PSZ)pdlf->szLastWild, FileInPath( (PSZ)sz));
397:
398: /* get selected file name */
399: DlgDirSelect(hwnd, (PSZ)pdlf->szFileName, ID_FILELIST);
400: /* set edit box to resulting name */
401: WinSetWindowText(WinWindowFromID(hwnd, ID_EDIT),
402: (PSZ)pdlf->szFileName);
403: break;
404:
405: case LN_ENTER:
406: /* double click case, single click already processed */
407: DlgSaveAsName(hwnd, pdlf);
408: break;
409: }
410: break;
411: }
412: break;
413:
414: default:
415: return (WinDefDlgProc(hwnd, msg, mp1, mp2));
416: }
417:
418: return (MRFROMLONG(0L)); /* message processed */
419: }
420:
421:
422:
423: /******************************************************************************/
424: /* */
425: /* This function attempts to open a file for writing. It queries if over- */
426: /* write is OK if the file already exists. */
427: /* */
428: /******************************************************************************/
429: VOID PASCAL DlgSaveAsName( hwnd, pdlf)
430: HWND hwnd;
431: PDLF pdlf;
432: {
433: USHORT usTdf;
434:
435: /* add extension if there is not one already */
436: AddExt((PSZ)pdlf->szFileName, pdlf->pszExt);
437: /* test file name legality */
438: if (!DlgParseFile((PSZ)pdlf->szFileName,
439: (PSZ)pdlf->szOpenFile, FALSE, FALSE))
440: {
441: /* illegal filename */
442: DlgAlertBox(hwnd, IDS_IFN, pdlf,
443: MB_OK | MB_ICONEXCLAMATION);
444: return;
445: }
446: usTdf = TDF_NEWSAVE;
447: /* test if file already exists */
448: if (DlgParseFile((PSZ)pdlf->szFileName,
449: (PSZ)pdlf->szOpenFile, TRUE, FALSE))
450: {
451: /* overwrite? */
452: if (DlgAlertBox(hwnd, IDS_REF, pdlf,
453: MB_YESNO | MB_DEFBUTTON2 | MB_ICONQUESTION)
454: == MBID_NO)
455: return;
456: usTdf = TDF_OLDSAVE;
457: }
458: if (!(pdlf->rgbAction & DLG_NOOPEN) &&
459: !(OpenFile( (PSZ)pdlf->szFileName
460: , pdlf->phFile
461: , (PSZ)pdlf->szOpenFile
462: , OF_WRITE)))
463: {
464: DlgAlertBox(hwnd, IDS_EOF, pdlf,
465: MB_OK | MB_ICONEXCLAMATION);
466: return;
467: }
468: WinDismissDlg(hwnd, usTdf);
469: }
470:
471:
472:
473: /****************************************************************************\
474: * This function initializes the SaveAs dialog box. It puts the current
475: * directory string in the ID_PATH field and initializes the edit box
476: * with the proposed filename. It is the simple relative file name if current
477: * dir == pdlf->szOpenFile. Otherwise, it is the fully qualified name.
478: \****************************************************************************/
479:
480: VOID PASCAL DlgInitSaveAs (hwnd, lpParm)
481: HWND hwnd;
482: ULONG lpParm;
483: {
484: PDLF pdlf;
485: CHAR sz[MAX_FNAME_LEN];
486: PSZ lpszFile, lpszFN, lpszCD;
487:
488: /* set pdlf local to window */
489: pdlf = (PDLF) lpParm;
490: WinSetWindowULong(hwnd, 0, lpParm);
491:
492: /* set edit box text size limit */
493: WinSendDlgItemMsg(hwnd, ID_EDIT, EM_SETTEXTLIMIT, (MPARAM)CBROOTNAMEMAX, 0L);
494:
495: /* set title window */
496: if (pdlf->pszTitle != (PSZ)NULL)
497: WinSetWindowText(WinWindowFromID(hwnd, FID_TITLEBAR), pdlf->pszTitle);
498:
499: /* set szLastWild to search spec */
500: if (pdlf->pszExt != (PSZ)NULL)
501: strcpy( (PSZ)pdlf->szLastWild, (PSZ)pdlf->pszExt+1 );
502:
503: /* get current directory */
504: DosSearchPath(0, (PSZ)szDot, (PSZ)szStar, (PSZ)sz, MAX_FNAME_LEN);
505: lpszFile = FileInPath((PSZ)sz);
506: if (lpszFile > (PSZ)sz + 3)
507: lpszFile--;
508: *lpszFile = '\0';
509:
510: /* compare path part name to previously opened file name and
511: make the file name relative if they are the same */
512: lpszFN = (PSZ)pdlf->szOpenFile;
513: lpszCD = (PSZ)sz;
514: lpszFile = FileInPath((PSZ)pdlf->szOpenFile);
515: while (lpszFN < lpszFile && *lpszFN == *lpszCD)
516: {
517: lpszFN = NextChar(lpszFN);
518: lpszCD = NextChar(lpszCD);
519: }
520: if (*lpszCD)
521: lpszFN = (PSZ)pdlf->szOpenFile;
522: else if (*lpszFN == '\\')
523: lpszFN = NextChar(lpszFN);
524: Upper( lpszFN);
525: WinSetWindowText(WinWindowFromID(hwnd, ID_EDIT), lpszFN);
526: strcpy( (PSZ)pdlf->szLastFile, lpszFN);
527:
528: /* set current path field */
529: WinSetWindowText(WinWindowFromID(hwnd, ID_PATH),
530: DlgFitPathToBox(hwnd, ID_PATH, (PSZ)sz));
531: }
532:
533:
534:
535:
536: /****************************************************************************\
537: * This function returns the filename part of the given path string.
538: \****************************************************************************/
539:
540: PSZ EXPENTRY FileInPath(lpsz)
541: PSZ lpsz;
542: {
543: PSZ lpch;
544:
545: /* strip path/drive specification from name if there is one */
546: lpch = lpsz + strlen(lpsz);
547: while (lpch > lpsz)
548: {
549: lpch = PrevChar(lpsz, lpch);
550: if (*lpch == '\\' || *lpch == ':')
551: {
552: lpch = NextChar(lpch);
553: break;
554: }
555: }
556: return(lpch);
557: }
558:
559:
560:
561:
562: /****************************************************************************\
563: * This function adds the extension to a file name if it is missing.
564: \****************************************************************************/
565:
566: VOID EXPENTRY AddExt(lpsz, lpszExt)
567: PSZ lpsz;
568: PSZ lpszExt;
569: {
570: PSZ lpch;
571:
572: lpch = lpsz + strlen(lpsz);
573: while (*lpch != '.' && *lpch != '\\' && *lpch != ':' && lpch > lpsz)
574: lpch = PrevChar(lpsz, lpch);
575:
576: if (*lpch != '.')
577: strcat(lpsz, (PSZ)(lpszExt+2));
578: }
579:
580:
581:
582:
583: /****************************************************************************\
584: * This function adds the "appropriate" extension to a filename, partial
585: * filename, search spec or partial search spec.
586: \****************************************************************************/
587:
588: VOID PASCAL DlgAddSearchExt(pdlf, lpszEdit)
589: PDLF pdlf;
590: PSZ lpszEdit;
591: {
592: PSZ lpchLast;
593:
594: lpchLast = PrevChar(lpszEdit, lpszEdit + strlen(lpszEdit));
595: if (*lpchLast == '\\' || *lpchLast == ':')
596: strcat(lpszEdit, pdlf->pszExt + 1);
597: else
598: strcat(lpszEdit, pdlf->pszExt);
599: }
600:
601:
602:
603:
604: /****************************************************************************\
605: * This function returns TRUE if lpsz contains a wildcard character '*' or '?';
606: \****************************************************************************/
607:
608: BOOL PASCAL DlgSearchSpec(lpsz)
609: PSZ lpsz;
610: {
611: for (; *lpsz; lpsz = NextChar(lpsz))
612: if (*lpsz == '*' || *lpsz == '?')
613: return TRUE;
614: return FALSE;
615: }
616:
617:
618:
619:
620: /****************************************************************************\
621: * This function displays an error or warning msg.
622: \****************************************************************************/
623:
624: int PASCAL DlgAlertBox(hwnd, ids, pdlf, wStyle)
625: HWND hwnd;
626: int ids;
627: PDLF pdlf;
628: USHORT wStyle;
629: {
630: /* note: 5th param is idHelp */
631: return (AlertBox(hwnd, ids, (PSZ)pdlf->szFileName, pdlf->pszAppName,
632: NULL, wStyle | MB_APPLMODAL));
633: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.