Fixed obvious typos.
[reactos.git] / rosapps / dflat32 / fileopen.c
1 /* ----------- fileopen.c ------------- */
2
3 #include "dflat.h"
4
5 static BOOL DlgFileOpen(char *, char *, DBOX *);
6 static int DlgFnOpen(DFWINDOW, DFMESSAGE, PARAM, PARAM);
7 static void InitDlgBox(DFWINDOW);
8 static void StripPath(char *);
9 static BOOL IncompleteFilename(char *);
10
11 static char *OrigSpec;
12 static char *FileSpec;
13 static char *FileName;
14 static char *NewFileName;
15
16 static BOOL Saving;
17 extern DBOX FileOpen;
18 extern DBOX SaveAs;
19
20 /*
21 * Dialog Box to select a file to open
22 */
23 BOOL OpenFileDialogBox(char *Fpath, char *Fname)
24 {
25 return DlgFileOpen(Fpath, Fname, &FileOpen);
26 }
27
28 /*
29 * Dialog Box to select a file to save as
30 */
31 BOOL SaveAsDialogBox(char *Fname)
32 {
33 return DlgFileOpen(NULL, Fname, &SaveAs);
34 }
35
36 /* --------- generic file open ---------- */
37 static BOOL DlgFileOpen(char *Fpath, char *Fname, DBOX *db)
38 {
39 BOOL rtn;
40 char savedir[MAX_PATH];
41 char OSpec[80];
42 char FSpec[80];
43 char FName[80];
44 char NewFName[80];
45
46 OrigSpec = OSpec;
47 FileSpec = FSpec;
48 FileName = FName;
49 NewFileName = NewFName;
50
51 GetCurrentDirectory (MAX_PATH, savedir);
52
53 if (Fpath != NULL) {
54 strncpy(FileSpec, Fpath, 80);
55 Saving = FALSE;
56 }
57 else {
58 *FileSpec = '\0';
59 Saving = TRUE;
60 }
61 strcpy(FileName, FileSpec);
62 strcpy(OrigSpec, FileSpec);
63
64 if ((rtn = DfDialogBox(NULL, db, TRUE, DlgFnOpen)) != FALSE)
65 strcpy(Fname, NewFileName);
66 else
67 *Fname = '\0';
68
69 SetCurrentDirectory (savedir);
70
71 return rtn;
72 }
73
74 /*
75 * Process dialog box messages
76 */
77 static int DlgFnOpen(DFWINDOW wnd,DFMESSAGE msg,PARAM p1,PARAM p2)
78 {
79 int rtn;
80 DBOX *db;
81 DFWINDOW cwnd;
82
83 switch (msg)
84 {
85 case CREATE_WINDOW:
86 rtn = DefaultWndProc(wnd, msg, p1, p2);
87 db = wnd->extension;
88 cwnd = ControlWindow(db, ID_FILENAME);
89 DfSendMessage(cwnd, SETTEXTLENGTH, 64, 0);
90 return rtn;
91
92 case INITIATE_DIALOG:
93 InitDlgBox(wnd);
94 break;
95
96 case DFM_COMMAND:
97 switch ((int) p1)
98 {
99 case ID_FILENAME:
100 if (p2 != ENTERFOCUS)
101 {
102 /* allow user to modify the file spec */
103 GetItemText(wnd, ID_FILENAME,
104 FileName, 65);
105 if (IncompleteFilename(FileName) || Saving)
106 {
107 strcpy(OrigSpec, FileName);
108 StripPath(OrigSpec);
109 }
110 if (p2 != LEAVEFOCUS)
111 DfSendMessage(wnd, DFM_COMMAND, ID_OK, 0);
112 }
113 return TRUE;
114
115 case ID_OK:
116 if (p2 != 0)
117 break;
118 GetItemText(wnd, ID_FILENAME,
119 FileName, 65);
120 strcpy(FileSpec, FileName);
121 if (IncompleteFilename(FileName))
122 {
123 /* no file name yet */
124 InitDlgBox(wnd);
125 strcpy(OrigSpec, FileSpec);
126 return TRUE;
127 }
128 else {
129 GetItemText(wnd, ID_PATH, FileName, 65);
130 strcat(FileName, FileSpec);
131 strcpy(NewFileName, FileName);
132 }
133 break;
134
135 case ID_FILES:
136 switch ((int) p2)
137 {
138 case ENTERFOCUS:
139 case LB_SELECTION:
140 /* selected a different filename */
141 GetDlgListText(wnd, FileName,
142 ID_FILES);
143 PutItemText(wnd, ID_FILENAME,
144 FileName);
145 break;
146 case LB_CHOOSE:
147 /* chose a file name */
148 GetDlgListText(wnd, FileName,
149 ID_FILES);
150 DfSendMessage(wnd, DFM_COMMAND, ID_OK, 0);
151 break;
152 default:
153 break;
154 }
155 return TRUE;
156
157 case ID_DRIVE:
158 switch ((int) p2) {
159 case ENTERFOCUS:
160 if (Saving)
161 *FileSpec = '\0';
162 break;
163 case LEAVEFOCUS:
164 if (Saving)
165 strcpy(FileSpec, FileName);
166 break;
167
168 case LB_SELECTION:
169 {
170 char dd[25];
171 /* selected different drive/dir */
172 GetDlgListText(wnd, dd, ID_DRIVE);
173 if (*(dd+2) == ':')
174 *(dd+3) = '\0';
175 else
176 *(dd+strlen(dd)-1) = '\0';
177 strcpy(FileName, dd+1);
178 if (*(dd+2) != ':' && *OrigSpec != '\\')
179 strcat(FileName, "\\");
180 strcat(FileName, OrigSpec);
181 if (*(FileName+1) != ':' && *FileName != '.')
182 {
183 GetItemText(wnd, ID_PATH, FileSpec, 65);
184 strcat(FileSpec, FileName);
185 }
186 else
187 strcpy(FileSpec, FileName);
188 }
189 break;
190
191 case LB_CHOOSE:
192 /* chose drive/dir */
193 if (Saving)
194 PutItemText(wnd, ID_FILENAME, "");
195 InitDlgBox(wnd);
196 return TRUE;
197 default:
198 break;
199 }
200 PutItemText(wnd, ID_FILENAME, FileSpec);
201 return TRUE;
202
203
204 default:
205 break;
206 }
207 default:
208 break;
209 }
210 return DefaultWndProc(wnd, msg, p1, p2);
211 }
212
213 /*
214 * Initialize the dialog box
215 */
216 static void InitDlgBox(DFWINDOW wnd)
217 {
218 if (*FileSpec && !Saving)
219 PutItemText(wnd, ID_FILENAME, FileSpec);
220 if (DfDlgDirList(wnd, FileSpec, ID_FILES, ID_PATH, 0))
221 {
222 StripPath(FileSpec);
223 DfDlgDirList(wnd, "*.*", ID_DRIVE, 0, 0xc010);
224 }
225 }
226
227 /*
228 * Strip the drive and path information from a file spec
229 */
230 static void StripPath(char *filespec)
231 {
232 char *cp, *cp1;
233
234 cp = strchr(filespec, ':');
235 if (cp != NULL)
236 cp++;
237 else
238 cp = filespec;
239 while (TRUE) {
240 cp1 = strchr(cp, '\\');
241 if (cp1 == NULL)
242 break;
243 cp = cp1+1;
244 }
245 strcpy(filespec, cp);
246 }
247
248
249 static BOOL IncompleteFilename(char *s)
250 {
251 int lc = strlen(s)-1;
252 if (strchr(s, '?') || strchr(s, '*') || !*s)
253 return TRUE;
254 if (*(s+lc) == ':' || *(s+lc) == '\\')
255 return TRUE;
256 return FALSE;
257 }
258
259 /* EOF */