source: trunk/dll/getnames.c@ 1331

Last change on this file since 1331 was 1223, checked in by John Small, 17 years ago

Ticket 187: Moved typedef's and some #define's from fm3dll.h

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 9.8 KB
Line 
1
2/***********************************************************************
3
4 $Id: getnames.c 1223 2008-09-13 23:11:11Z jbs $
5
6 Directory containers
7
8 Copyright (c) 1993-98 M. Kimes
9 Copyright (c) 2006 Steven H. Levine
10
11 23 Aug 06 SHL Comments
12 20 Aug 07 GKY Move #pragma alloc_text to end for OpenWatcom compat
13
14***********************************************************************/
15
16#include <string.h>
17#include <ctype.h>
18
19#define INCL_DOS
20#define INCL_WIN
21#define INCL_LONGLONG
22
23#include "fm3dll.h"
24#include "fm3dll2.h" // #define's for UM_*, control id's, etc.
25#include "notebook.h" // Data declaration(s)
26#include "info.h" // Data declaration(s)
27#include "mainwnd.h" // Data declaration(s)
28#include "fm3dlg.h"
29#include "fm3str.h"
30#include "errutil.h" // Dos_Error...
31#include "strutil.h" // GetPString
32#include "getnames.h"
33#include "walkem.h" // load_udirs, remove_udir
34#include "valid.h" // MakeFullName
35#include "copyf.h" // unlinkf
36#include "misc.h" // PaintRecessedWindow
37#include "wrappers.h" // xDosFindFirst
38
39#pragma data_seg(DATA1)
40
41MRESULT EXPENTRY CustomFileDlg(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
42{
43 switch (msg) {
44 case WM_INITDLG:
45 if (!loadedudirs)
46 load_udirs();
47 { /* fill user list box */
48 ULONG ulDriveNum, ulDriveMap;
49 ULONG ulSearchCount;
50 FILEFINDBUF3L findbuf;
51 HDIR hDir;
52 APIRET rc;
53 LINKDIRS *info, *temp;
54
55 DosError(FERR_DISABLEHARDERR);
56 DosQCurDisk(&ulDriveNum, &ulDriveMap);
57 info = udirhead;
58 while (info) {
59 if (IsFullName(info->path) &&
60 !(driveflags[toupper(*info->path) - 'A'] &
61 (DRIVE_IGNORE | DRIVE_INVALID))) {
62 DosError(FERR_DISABLEHARDERR);
63 hDir = HDIR_CREATE;
64 ulSearchCount = 1L;
65 if (!IsRoot(info->path))
66 rc = xDosFindFirst(info->path, &hDir, FILE_DIRECTORY |
67 MUST_HAVE_DIRECTORY | FILE_READONLY |
68 FILE_ARCHIVED | FILE_SYSTEM | FILE_HIDDEN,
69 &findbuf, sizeof(FILEFINDBUF3L),
70 &ulSearchCount, FIL_STANDARDL);
71 else {
72 rc = 0;
73 findbuf.attrFile = FILE_DIRECTORY;
74 }
75 if (!rc) {
76 if (!IsRoot(info->path))
77 DosFindClose(hDir);
78 if (findbuf.attrFile & FILE_DIRECTORY)
79 WinSendDlgItemMsg(hwnd, FDLG_USERDIRS, LM_INSERTITEM,
80 MPFROM2SHORT(LIT_SORTASCENDING, 0),
81 MPFROMP(info->path));
82 else {
83 temp = info->next;
84 remove_udir(info->path);
85 info = temp;
86 continue;
87 }
88 }
89 else if (!(ulDriveMap & (1L << (toupper(*info->path) - 'A')))) {
90 temp = info->next;
91 remove_udir(info->path);
92 info = temp;
93 continue;
94 }
95 }
96 info = info->next;
97 }
98 }
99 break;
100
101 case WM_ADJUSTWINDOWPOS:
102 PostMsg(hwnd, UM_SETDIR, MPVOID, MPVOID);
103 break;
104
105 case UM_SETDIR:
106 PaintRecessedWindow(WinWindowFromID(hwnd, FDLG_HELP),
107 (HPS) 0, FALSE, TRUE);
108 return 0;
109
110 case WM_CONTROL:
111 switch (SHORT1FROMMP(mp1)) {
112 case 260: /* drives dropdown list */
113 switch (SHORT2FROMMP(mp1)) {
114 case CBN_SHOWLIST:
115 WinSetDlgItemText(hwnd,
116 FDLG_HELP, GetPString(IDS_CLICKDRIVEHELPTEXT));
117 break;
118 }
119 break;
120
121 case 258: /* name entry field */
122 switch (SHORT2FROMMP(mp1)) {
123 case EN_SETFOCUS:
124 WinSetDlgItemText(hwnd,
125 FDLG_HELP, GetPString(IDS_ENTERFILEORMASKHELPTEXT));
126 break;
127 case EN_KILLFOCUS:
128 WinSetDlgItemText(hwnd, FDLG_HELP, GetPString(IDS_NAMEDEFHELPTEXT));
129 break;
130 }
131 break;
132
133 case 264: /* dirs listbox */
134 switch (SHORT2FROMMP(mp1)) {
135 case LN_SETFOCUS:
136 WinSetDlgItemText(hwnd,
137 FDLG_HELP, GetPString(IDS_DBLCLKDIRSWITCHHELPTEXT));
138 break;
139 case LN_KILLFOCUS:
140 WinSetDlgItemText(hwnd, FDLG_HELP, GetPString(IDS_NAMEDEFHELPTEXT));
141 break;
142 }
143 break;
144
145 case 266: /* files listbox */
146 switch (SHORT2FROMMP(mp1)) {
147 case LN_SETFOCUS:
148 WinSetDlgItemText(hwnd, FDLG_HELP,
149 GetPString(IDS_DBLCLKFILEUSEHELPTEXT));
150 break;
151 case LN_KILLFOCUS:
152 WinSetDlgItemText(hwnd, FDLG_HELP, GetPString(IDS_NAMEDEFHELPTEXT));
153 break;
154 }
155 break;
156
157 case FDLG_USERDIRS:
158 switch (SHORT2FROMMP(mp1)) {
159 case CBN_SHOWLIST:
160 WinSetDlgItemText(hwnd,
161 FDLG_HELP, GetPString(IDS_DBLCLKDIRSWITCHHELPTEXT));
162 break;
163 case CBN_ENTER:
164 {
165 SHORT sSelect;
166 CHAR szBuffer[CCHMAXPATH], szTemp[CCHMAXPATH], *p;
167
168 sSelect = (USHORT) WinSendDlgItemMsg(hwnd,
169 FDLG_USERDIRS,
170 LM_QUERYSELECTION,
171 MPVOID, MPVOID);
172 *szBuffer = 0;
173 if (sSelect >= 0) {
174 WinSendDlgItemMsg(hwnd,
175 FDLG_USERDIRS,
176 LM_QUERYITEMTEXT,
177 MPFROM2SHORT(sSelect,
178 CCHMAXPATH), MPFROMP(szBuffer));
179 if (*szBuffer) {
180 if (szBuffer[strlen(szBuffer) - 1] != '\\')
181 strcat(szBuffer, "\\");
182 *szTemp = 0;
183 WinQueryDlgItemText(hwnd, 258, CCHMAXPATH, szTemp);
184 p = strrchr(szTemp, '\\');
185 if (!p)
186 p = szTemp;
187 else
188 p++;
189 if (*p)
190 strcat(szBuffer, p);
191 if (!strchr(szBuffer, '?') && !strchr(szBuffer, '*'))
192 strcat(szBuffer, "*");
193 WinSetDlgItemText(hwnd, 258, szBuffer);
194 PostMsg(hwnd, WM_COMMAND, MPFROM2SHORT(DID_OK, 0), MPVOID);
195 }
196 }
197 }
198 break;
199 default:
200 break;
201 }
202 break;
203 }
204 break;
205
206 case WM_HELP:
207 if (hwndHelp) {
208 WinSendMsg(hwndHelp, HM_DISPLAY_HELP,
209 MPFROM2SHORT(HELP_FILEDLG, 0), MPFROMSHORT(HM_RESOURCEID));
210 return 0;
211 }
212 break;
213 }
214 return WinDefFileDlgProc(hwnd, msg, mp1, mp2);
215}
216
217BOOL insert_filename(HWND hwnd, CHAR * filename, INT loadit, BOOL newok)
218{
219 FILEDLG fdlg;
220 FILESTATUS3 fsa;
221 CHAR drive[3], *pdrive = drive, *p;
222 APIRET rc;
223 static CHAR lastfilename[CCHMAXPATH] = "";
224
225 if (!filename)
226 return FALSE;
227 memset(&fdlg, 0, sizeof(FILEDLG));
228 fdlg.cbSize = (ULONG) sizeof(FILEDLG);
229 fdlg.fl = FDS_CENTER | FDS_OPEN_DIALOG;
230 if (!loadit) {
231 fdlg.pszTitle = GetPString(IDS_ENTERFILEINSERTTEXT);
232 fdlg.pszOKButton = GetPString(IDS_INSERTTEXT);
233 }
234 else if (loadit == TRUE) {
235 fdlg.pszTitle = GetPString(IDS_ENTERFILELOADTEXT);
236 fdlg.pszOKButton = GetPString(IDS_LOADTEXT);
237 }
238 else {
239 fdlg.pszTitle = GetPString(IDS_ENTERFILETEXT);
240 fdlg.pszOKButton = GetPString(IDS_OKAYTEXT);
241 }
242 if (IsFullName(filename)) {
243 *drive = *filename;
244 drive[1] = ':';
245 drive[2] = 0;
246 fdlg.pszIDrive = pdrive;
247 }
248 else if (*lastfilename) {
249 *drive = *lastfilename;
250 drive[1] = ':';
251 drive[2] = 0;
252 fdlg.pszIDrive = pdrive;
253 }
254
255 if (!*filename) {
256 if (*lastfilename) {
257 strcpy(fdlg.szFullFile, lastfilename);
258 p = strrchr(fdlg.szFullFile, '\\');
259 if (p) {
260 p++;
261 *p = 0;
262 }
263 }
264 if (!loadit || loadit == TRUE)
265 strcat(fdlg.szFullFile, "*.TXT");
266 else
267 strcat(fdlg.szFullFile, "*");
268 }
269 else
270 strcpy(fdlg.szFullFile, filename);
271
272 if (fCustomFileDlg) {
273 fdlg.fl |= FDS_HELPBUTTON | FDS_CUSTOM;
274 fdlg.pfnDlgProc = (PFNWP) CustomFileDlg;
275 fdlg.hMod = FM3ModHandle;
276 fdlg.usDlgId = FDLG_FRAME;
277 }
278
279 if (WinFileDlg(HWND_DESKTOP, hwnd, &fdlg)) {
280 if (fdlg.lReturn != DID_CANCEL && !fdlg.lSRC)
281 strcpy(filename, fdlg.szFullFile);
282 else
283 return FALSE;
284 }
285 else
286 return FALSE;
287 MakeFullName(filename);
288 if (!DosQueryPathInfo(filename, FIL_STANDARD, &fsa, sizeof(fsa))) {
289 if (fsa.attrFile & FILE_DIRECTORY) {
290 /* device or directory */
291 saymsg(MB_CANCEL | MB_ICONEXCLAMATION,
292 hwnd, filename, GetPString(IDS_EXISTSBUTNOTFILETEXT), filename);
293 return FALSE;
294 }
295 else if (fsa.cbFile == 0) {
296 saymsg(MB_CANCEL,
297 hwnd, filename, GetPString(IDS_ISZEROLENGTHTEXT), filename);
298 return FALSE;
299 }
300 }
301 else if (!newok) {
302 saymsg(MB_CANCEL,
303 hwnd, filename, GetPString(IDS_DOESNTEXISTTEXT), filename);
304 return FALSE;
305 }
306 else {
307 rc = saymsg(MB_YESNOCANCEL,
308 hwnd, filename, GetPString(IDS_CREATENEWTEXT));
309 if (rc != MBID_YES)
310 return FALSE;
311 }
312 p = filename;
313 while (*p) {
314 if (*p == '/')
315 *p = '\\';
316 p++;
317 }
318 if (*filename)
319 strcpy(lastfilename, filename);
320 return TRUE;
321}
322
323BOOL export_filename(HWND hwnd, CHAR * filename, INT overwrite)
324{
325 FILEDLG fdlg;
326 FILESTATUS3 fsa;
327 CHAR drive[3], *pdrive = drive, *p;
328 static CHAR lastfilename[CCHMAXPATH] = "";
329
330 if (!filename)
331 return FALSE;
332 memset(&fdlg, 0, sizeof(FILEDLG));
333 fdlg.cbSize = sizeof(FILEDLG);
334 fdlg.fl = FDS_CENTER | FDS_OPEN_DIALOG;
335 fdlg.pszTitle = GetPString(IDS_EXPORTNAMETITLETEXT);
336 fdlg.pszOKButton = GetPString(IDS_OKAYTEXT);
337 if (IsFullName(filename)) {
338 *drive = *filename;
339 drive[1] = ':';
340 drive[2] = 0;
341 fdlg.pszIDrive = pdrive;
342 }
343 else if (*lastfilename) {
344 *drive = *lastfilename;
345 drive[1] = ':';
346 drive[2] = 0;
347 fdlg.pszIDrive = pdrive;
348 }
349 if (!*filename) {
350 if (*lastfilename) {
351 strcpy(fdlg.szFullFile, lastfilename);
352 p = strrchr(fdlg.szFullFile, '\\');
353 if (p) {
354 p++;
355 *p = 0;
356 }
357 }
358 strcat(fdlg.szFullFile, "*.TXT");
359 }
360 else
361 strcpy(fdlg.szFullFile, filename);
362
363 if (fCustomFileDlg) {
364 fdlg.fl |= FDS_HELPBUTTON | FDS_CUSTOM;
365 fdlg.pfnDlgProc = (PFNWP) CustomFileDlg;
366 fdlg.hMod = FM3ModHandle;
367 fdlg.usDlgId = FDLG_FRAME;
368 }
369
370 if (WinFileDlg(HWND_DESKTOP, hwnd, &fdlg)) {
371 if (fdlg.lReturn != DID_CANCEL && !fdlg.lSRC)
372 strcpy(filename, fdlg.szFullFile);
373 else
374 return FALSE;
375 }
376 else
377 return FALSE;
378 MakeFullName(filename);
379 if (!DosQueryPathInfo(filename, FIL_STANDARD, &fsa, sizeof(fsa))) {
380 if (fsa.attrFile & FILE_DIRECTORY) { /* device or directory */
381 saymsg(MB_CANCEL | MB_ICONEXCLAMATION,
382 hwnd, filename, GetPString(IDS_EXISTSBUTNOTFILETEXT), filename);
383 return FALSE;
384 }
385 else if (overwrite && fsa.cbFile != 0) {
386 if (saymsg(MB_YESNO,
387 hwnd,
388 filename,
389 GetPString(IDS_EXISTSERASETEXT), filename) == MBID_YES)
390 unlinkf("%s", filename);
391 }
392 }
393 p = filename;
394 while (*p) {
395 if (*p == '/')
396 *p = '\\';
397 p++;
398 }
399 if (*filename)
400 strcpy(lastfilename, filename);
401 return TRUE;
402}
403
404#pragma alloc_text(GETNAMES,insert_filename,export_filename,CustomFileDlg)
Note: See TracBrowser for help on using the repository browser.