source: trunk/dll/getnames.c@ 1498

Last change on this file since 1498 was 1498, checked in by Gregg Young, 16 years ago

Changes to get FM2 to compile with the latest watcom 1.9 beta (mostly type casts of CHAR CONSTANT * to CHAR *). Changes to get the environment settings working everywhere again (broken by the change that moved commands to the INI); Added an environment size variable (set to 2048 which was the largest I found hard coded). Still need to find everywhere the environment size is set and use this variable.

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