source: trunk/dll/saveclip.c@ 1084

Last change on this file since 1084 was 1084, checked in by Gregg Young, 17 years ago

Added ability to save/append either the full path name (already present) or just the filename to the clipboard. Changed the menu text to make these easier to find. Removed the final return/newline from the list. Ticket 137

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 25.4 KB
Line 
1
2/***********************************************************************
3
4 $Id: saveclip.c 1084 2008-07-20 18:22:12Z gyoung $
5
6 Save file list to clipboard
7
8 Copyright (c) 1993-98 M. Kimes
9 Copyright (c) 2005, 2008 Steven H. Levine
10
11 12 Feb 03 SHL SaveListDlgProc: standardize EA math
12 01 Aug 04 SHL Rework lstrip/rstrip usage
13 01 Aug 04 SHL Rework fixup usage
14 24 May 05 SHL Rework for CNRITEM.szSubject
15 17 Jul 06 SHL Use Runtime_Error
16 29 Jul 06 SHL Use xfgets
17 22 Mar 07 GKY Use QWL_USER
18 06 Aug 07 GKY Increase Subject EA to 1024
19 20 Aug 07 GKY Move #pragma alloc_text to end for OpenWatcom compat
20 27 Sep 07 SHL Correct ULONGLONG size formatting
21 16 Nov 07 SHL Ensure fixup buffer sufficiently large
22 30 Dec 07 GKY Use CommaFmtULL
23 16 Feb 08 GKY Changed _fsopen flag so a new list file can be created
24 19 Jul 08 GKY Replace save_dir2(dir) with pFM2SaveDirectory and use BldFullPathName
25 20 Jul 08 GKY Modify ListtoClipHab to provide either fullpath name or filename for save to clipboard
26
27***********************************************************************/
28
29#include <stdlib.h>
30#include <string.h>
31#include <share.h>
32
33#define INCL_WIN
34#define INCL_LONGLONG
35
36#include "fm3dlg.h"
37#include "fm3str.h"
38#include "makelist.h" // AddToList
39#include "errutil.h" // Dos_Error...
40#include "strutil.h" // GetPString
41#include "pathutil.h" // BldFullPathName
42#include "fm3dll.h"
43#include "fortify.h"
44
45static PSZ pszSrcFile = __FILE__;
46#define MAX_PATTERN_BYTES 80
47
48BOOL SaveToClip(HWND hwnd, CHAR * text, BOOL append)
49{
50 HAB hab = WinQueryAnchorBlock(hwnd);
51
52 return SaveToClipHab(hab, text, append);
53}
54
55BOOL SaveToClipHab(HAB hab, CHAR * text, BOOL append)
56{
57 CHAR *clip = NULL, *hold = NULL, *p;
58 ULONG len;
59 BOOL ret = FALSE;
60
61 if (text) {
62 len = strlen(text);
63 p = text;
64 while (*p) {
65 if (*p == '\n' && (p == text || *(p - 1) != '\r'))
66 len++;
67 p++;
68 }
69 if (len) {
70 if (WinOpenClipbrd(hab)) {
71 if (append)
72 clip = (CHAR *)WinQueryClipbrdData(hab, CF_TEXT);
73 if (clip)
74 len += strlen(clip) + 1;
75 if (!DosAllocSharedMem((PPVOID) & hold, (PSZ) NULL, len, PAG_COMMIT |
76 OBJ_GIVEABLE | PAG_READ | PAG_WRITE)) {
77 *hold = 0;
78 if (clip)
79 strcpy(hold, clip);
80 p = hold + strlen(hold);
81 strcpy(p, text);
82 while (*p) {
83 if (*p == '\n' && (p == hold || *(p - 1) != '\r')) {
84 memmove(p + 1, p, strlen(p) + 1);
85 *p = '\r';
86 }
87 p++;
88 }
89 WinEmptyClipbrd(hab);
90 if (!WinSetClipbrdData(hab, (ULONG) hold, CF_TEXT, CFI_POINTER))
91 DosFreeMem(hold);
92 else
93 ret = TRUE;
94 }
95 WinCloseClipbrd(hab);
96 }
97 }
98 }
99 return ret;
100}
101
102VOID ListToClipboard(HWND hwnd, CHAR ** list, ULONG append)
103{
104 HAB hab = WinQueryAnchorBlock(hwnd);
105
106 ListToClipboardHab(hab, list, append);
107}
108
109VOID ListToClipboardHab(HAB hab, CHAR ** list, ULONG append)
110{
111 CHAR *text = NULL, **clip = NULL, *p = NULL, temp[CCHMAXPATH];
112 INT x;
113 ULONG len = 0;
114
115 if (list && list[0]) {
116 for (x = 0; list[x]; x++) {
117 if (append == IDM_SAVETOCLIPFILENAME ||
118 append == IDM_APPENDTOCLIPFILENAME) {
119 p = strrchr(list[x], '\\');
120 if (p) {
121 p++;
122 strcpy(temp, p);
123 free(list[x]);
124 list[x] = xstrdup(temp, __FILE__, __LINE__);
125 }
126 }
127 len += strlen(list[x]) + 2;
128 }
129 if (len)
130 len++;
131 if (len) {
132 if (append == IDM_APPENDTOCLIP ||
133 append == IDM_APPENDTOCLIP2 ||
134 append == IDM_APPENDTOCLIPFILENAME)
135 clip = ListFromClipboardHab(hab);
136 if (clip && clip[0]) {
137 for (x = 0; clip[x]; x++)
138 len += strlen(clip[x]) + 2;
139 len++;
140 }
141 if (WinOpenClipbrd(hab)) {
142 if (!DosAllocSharedMem((PPVOID) & text, (PSZ) NULL, len, PAG_COMMIT |
143 OBJ_GIVEABLE | PAG_READ | PAG_WRITE)) {
144 *text = 0;
145 if (clip && clip[0]) {
146 for (x = 0; clip[x]; x++) {
147 strcat(text, clip[x]);
148 strcat(text, "\r\n");
149 }
150 }
151 for (x = 0; list[x]; x++) {
152 strcat(text, list[x]);
153 strcat(text, "\r\n");
154 }
155 text[strlen(text) - 2] = 0;
156 WinEmptyClipbrd(hab);
157 if (!WinSetClipbrdData(hab, (ULONG) text, CF_TEXT, CFI_POINTER))
158 DosFreeMem(text);
159 }
160 WinCloseClipbrd(hab);
161 }
162 if (clip)
163 FreeList(clip);
164 }
165 }
166}
167
168CHAR **ListFromClipboard(HWND hwnd)
169{
170 HAB hab = WinQueryAnchorBlock(hwnd);
171
172 return ListFromClipboardHab(hab);
173}
174
175CHAR **ListFromClipboardHab(HAB hab)
176{
177 CHAR *p, *pp, *text = NULL, **list = NULL;
178 UINT numfiles = 0, numalloced = 0;
179
180 if (WinOpenClipbrd(hab)) {
181 p = (CHAR *)WinQueryClipbrdData(hab, CF_TEXT);
182 if (p && *p)
183 text = xstrdup(p, pszSrcFile, __LINE__);
184 WinCloseClipbrd(hab);
185 if (text) {
186 bstrip(text);
187 pp = text;
188 p = strchr(pp, '\r');
189 if (!p)
190 p = strchr(pp, '\n');
191 while (p && *p) {
192 *p = 0;
193 p++;
194 while (*p == '\r' || *p == '\n' || *p == ' ' || *p == '\t')
195 p++;
196 rstrip(pp);
197 if (*pp) {
198 if (AddToList(pp, &list, &numfiles, &numalloced))
199 break;
200 }
201 pp = p;
202 p = strchr(pp, '\r');
203 if (!p)
204 p = strchr(pp, '\n');
205 }
206 free(text);
207 }
208 }
209 return list;
210}
211
212MRESULT EXPENTRY SaveListDlgProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
213{
214 HWND hwndCnr;
215 CHAR savename[CCHMAXPATH] = "", pattern[81];
216
217 switch (msg) {
218 case WM_INITDLG:
219 if (!mp2) {
220 Runtime_Error(pszSrcFile, __LINE__, "no data");
221 WinDismissDlg(hwnd, 0);
222 }
223 else {
224 WinSetWindowPtr(hwnd, QWL_USER, mp2);
225 hwndCnr = *(HWND *) mp2;
226 WinSendDlgItemMsg(hwnd,
227 SAV_FILENAME,
228 EM_SETTEXTLIMIT, MPFROM2SHORT(CCHMAXPATH, 0), MPVOID);
229 WinSendDlgItemMsg(hwnd,
230 SAV_PATTERN,
231 EM_SETTEXTLIMIT, MPFROM2SHORT(80, 0), MPVOID);
232 *savename = *pattern = 0;
233 {
234 ULONG size;
235
236 size = CCHMAXPATH;
237 PrfQueryProfileData(fmprof,
238 appname, "SaveToListName", savename, &size);
239 size = MAX_PATTERN_BYTES + 1;
240 PrfQueryProfileData(fmprof,
241 appname, "SaveToListPattern", pattern, &size);
242 }
243 WinSetDlgItemText(hwnd, SAV_FILENAME, savename);
244 if (!*pattern)
245 strcpy(pattern, "%F %s");
246 {
247 CHAR temp[MAX_PATTERN_BYTES * 4 + 1];
248
249 fixup(pattern, temp, sizeof(temp), strlen(pattern));
250 WinSetDlgItemText(hwnd, SAV_PATTERN, temp);
251 }
252 {
253 FILE *fp;
254 CHAR s[CCHMAXPATH + 14];
255
256 BldFullPathName(s, pFM2SaveDirectory, "PATTERNS.DAT");
257 /*save_dir2(s);
258 if (s[strlen(s) - 1] != '\\')
259 strcat(s, "\\");
260 strcat(s, "PATTERNS.DAT");*/
261 fp = _fsopen(s, "r", SH_DENYWR);
262 if (fp) {
263 while (xfgets(s, 81, fp, pszSrcFile, __LINE__)) {
264 stripcr(s);
265 if (*s && *s != ';')
266 WinSendMsg(WinWindowFromID(hwnd, SAV_LISTBOX), LM_INSERTITEM,
267 MPFROM2SHORT(LIT_SORTASCENDING, 0), MPFROMP(s));
268 }
269 fclose(fp);
270 }
271 if (!WinSendDlgItemMsg(hwnd, SAV_LISTBOX, LM_QUERYITEMCOUNT,
272 MPVOID, MPVOID))
273 WinEnableWindow(WinWindowFromID(hwnd, SAV_LISTBOX), FALSE);
274 }
275 }
276 break;
277
278 case UM_SETDIR:
279 {
280 SHORT sSelect, sMax;
281 CHAR szBuffer[CCHMAXPATH + 14];
282 FILE *fp;
283
284 sMax = (SHORT) WinSendDlgItemMsg(hwnd, SAV_LISTBOX,
285 LM_QUERYITEMCOUNT, MPVOID, MPVOID);
286 if (sMax > 0) {
287 BldFullPathName(szBuffer, pFM2SaveDirectory, "PATTERNS.DAT");
288 /*save_dir2(szBuffer);
289 if (szBuffer[strlen(szBuffer) - 1] != '\\')
290 strcat(szBuffer, "\\");
291 strcat(szBuffer, "PATTERNS.DAT");*/
292 fp = xfopen(szBuffer, "w", pszSrcFile, __LINE__);
293 if (fp) {
294 fputs(GetPString(IDS_LISTPATTERNTEXT), fp);
295 for (sSelect = 0; sSelect < sMax; sSelect++) {
296 *szBuffer = 0;
297 WinSendDlgItemMsg(hwnd,
298 SAV_LISTBOX,
299 LM_QUERYITEMTEXT,
300 MPFROM2SHORT(sSelect, 81), MPFROMP(szBuffer));
301 if (*szBuffer)
302 fprintf(fp, "%s\n", szBuffer);
303 }
304 fclose(fp);
305 }
306 }
307 else if (!sMax) {
308 BldFullPathName(szBuffer, pFM2SaveDirectory, "PATTERNS.DAT");
309 /*save_dir2(szBuffer);
310 if (szBuffer[strlen(szBuffer) - 1] != '\\')
311 strcat(szBuffer, "\\");
312 strcat(szBuffer, "PATTERNS.DAT");*/
313 unlinkf("%s", szBuffer);
314 }
315 }
316 return 0;
317
318 case WM_CONTROL:
319 if (SHORT1FROMMP(mp1) == SAV_LISTBOX) {
320
321 SHORT sSelect;
322 CHAR szBuffer[81];
323
324 switch (SHORT2FROMMP(mp1)) {
325 case LN_SELECT:
326 sSelect = (SHORT) WinSendDlgItemMsg(hwnd, SAV_LISTBOX,
327 LM_QUERYSELECTION,
328 MPFROMSHORT(LIT_FIRST), MPVOID);
329 if (sSelect >= 0) {
330 *szBuffer = 0;
331 WinSendDlgItemMsg(hwnd, SAV_LISTBOX, LM_QUERYITEMTEXT,
332 MPFROM2SHORT(sSelect, 81), MPFROMP(szBuffer));
333 if (*szBuffer)
334 WinSetDlgItemText(hwnd, SAV_PATTERN, szBuffer);
335 }
336 break;
337
338 case LN_ENTER:
339 PostMsg(hwnd, WM_COMMAND, MPFROM2SHORT(DID_OK, 0), MPVOID);
340 break;
341 }
342 }
343 return 0;
344
345 case WM_COMMAND:
346 hwndCnr = *(HWND *) INSTDATA(hwnd);
347 switch (SHORT1FROMMP(mp1)) {
348 case DID_CANCEL:
349 WinDismissDlg(hwnd, 0);
350 break;
351
352 case IDM_HELP:
353 if (hwndHelp)
354 WinSendMsg(hwndHelp, HM_DISPLAY_HELP,
355 MPFROM2SHORT(HELP_SAVETOLIST, 0),
356 MPFROMSHORT(HM_RESOURCEID));
357 break;
358
359 case SAV_FIND:
360 {
361 *savename = 0;
362 WinQueryDlgItemText(hwnd, SAV_FILENAME, CCHMAXPATH, savename);
363 if (!*savename)
364 strcpy(savename, "*.LST");
365 if (export_filename(hwnd, savename, 1) && *savename) {
366 if (!strchr(savename, '.'))
367 strcat(savename, ".LST");
368 WinSetDlgItemText(hwnd, SAV_FILENAME, savename);
369 }
370 }
371 break;
372
373 case SAV_ADD:
374 case SAV_DEL:
375 case DID_OK:
376 WinEnableWindow(hwnd, FALSE);
377 {
378 PCNRITEM pci;
379 FILE *fp;
380 CHAR *p, *pp, temp;
381 CHAR szCmmaFmtFileSize[81];
382 INT attribute = CRA_CURSORED;
383 SHORT sSelect;
384
385 *pattern = 0;
386 WinQueryDlgItemText(hwnd, SAV_PATTERN, 80, pattern);
387 if (!*pattern) {
388 WinEnableWindow(hwnd, TRUE);
389 DosBeep(150, 100);
390 break;
391 }
392 {
393 switch (SHORT1FROMMP(mp1)) {
394 case SAV_ADD:
395 sSelect = (SHORT) WinSendDlgItemMsg(hwnd, SAV_LISTBOX,
396 LM_SEARCHSTRING,
397 MPFROM2SHORT(0, LIT_FIRST),
398 MPFROMP(pattern));
399 if (sSelect < 0) {
400 WinSendDlgItemMsg(hwnd, SAV_LISTBOX, LM_INSERTITEM,
401 MPFROM2SHORT(LIT_SORTASCENDING, 0),
402 MPFROMP(pattern));
403 WinSendMsg(hwnd, UM_SETDIR, MPVOID, MPVOID);
404 }
405 WinEnableWindow(hwnd, TRUE);
406 return 0;
407
408 case SAV_DEL:
409 sSelect = (SHORT) WinSendDlgItemMsg(hwnd, SAV_LISTBOX,
410 LM_QUERYSELECTION,
411 MPFROM2SHORT(LIT_FIRST, 0),
412 MPVOID);
413 if (sSelect >= 0) {
414 WinSendDlgItemMsg(hwnd, SAV_LISTBOX, LM_DELETEITEM,
415 MPFROM2SHORT(sSelect, 0), MPVOID);
416 WinSendMsg(hwnd, UM_SETDIR, MPVOID, MPVOID);
417 }
418 WinEnableWindow(hwnd, TRUE);
419 return 0;
420 }
421 }
422 literal(pattern);
423 if (!*pattern) {
424 WinEnableWindow(hwnd, TRUE);
425 DosBeep(250, 100);
426 break;
427 }
428 PrfWriteProfileString(fmprof, appname, "SaveToListPattern", pattern);
429 *savename = 0;
430 WinQueryDlgItemText(hwnd, SAV_FILENAME, CCHMAXPATH, savename);
431 bstrip(savename);
432 if (!*savename) {
433 WinEnableWindow(hwnd, TRUE);
434 DosBeep(100, 100);
435 break;
436 }
437 if (stricmp(savename, "PRN") &&
438 strnicmp(savename, "\\DEV\\LPT", 8) && !strchr(savename, '.'))
439 strcat(savename, ".LST");
440 PrfWriteProfileString(fmprof, appname, "SaveToListName", savename);
441 pci = (PCNRITEM) WinSendMsg(hwndCnr,
442 CM_QUERYRECORDEMPHASIS,
443 MPFROMLONG(CMA_FIRST),
444 MPFROMSHORT(attribute));
445 if (pci && (INT) pci != -1) {
446 if (pci->rc.flRecordAttr & CRA_SELECTED) {
447 attribute = CRA_SELECTED;
448 pci = WinSendMsg(hwndCnr, CM_QUERYRECORDEMPHASIS,
449 MPFROMLONG(CMA_FIRST), MPFROMSHORT(attribute));
450 }
451 }
452 if (!pci || (INT) pci == -1)
453 Runtime_Error(pszSrcFile, __LINE__, "no data");
454 else {
455 fp = _fsopen(savename, "w+", SH_DENYWR);
456 if (!fp)
457 Runtime_Error(pszSrcFile, __LINE__, "_fsopen");
458 else {
459 fseek(fp, 0, SEEK_SET);
460 if (WinQueryButtonCheckstate(hwnd, SAV_APPEND) == 0)
461 DosSetFileSize((HFILE) fileno(fp), 0);
462 else
463 fseek(fp, 0, SEEK_END);
464 while (pci && (INT) pci != -1) {
465 if (!(pci->rc.flRecordAttr & CRA_FILTERED)) {
466 p = pattern;
467 while (*p) {
468 if (*p == '%') {
469 p++;
470 switch (*p) {
471 case 's':
472 fputs(pci->pszSubject, fp);
473 break;
474 case 'S':
475 fprintf(fp, "%-40s", pci->pszSubject);
476 break;
477 case 'Z':
478 CommaFmtULL(szCmmaFmtFileSize,
479 sizeof(szCmmaFmtFileSize), pci->cbFile, ' ');
480 fprintf(fp, "%-13s", szCmmaFmtFileSize);
481 break;
482 case 'z':
483 CommaFmtULL(szCmmaFmtFileSize,
484 sizeof(szCmmaFmtFileSize), pci->cbFile, ' ');
485 fprintf(fp, "%s", szCmmaFmtFileSize);
486 break;
487 case 'E':
488 fprintf(fp, "%-5u", pci->easize);
489 break;
490 case 'e':
491 fprintf(fp, "%u", pci->easize);
492 break;
493 case 'd':
494 case 'D':
495 fprintf(fp,
496 "%04u/%02u/%02u",
497 pci->date.year, pci->date.month, pci->date.day);
498 break;
499 case 't':
500 case 'T':
501 fprintf(fp,
502 "%02u:%02u:%02u",
503 pci->time.hours,
504 pci->time.minutes, pci->time.seconds);
505 break;
506 case 'l':
507 fputs(pci->pszLongName, fp);
508 break;
509 case 'L':
510 fprintf(fp, "%-40s", pci->pszLongName);
511 break;
512 case 'F':
513 case 'f':
514 if (IsRoot(pci->pszFileName))
515 pp = pci->pszFileName;
516 else {
517 pp = strrchr(pci->pszFileName, '\\');
518 if (pp)
519 pp++;
520 else
521 pp = pci->pszFileName;
522 }
523 if (*p == 'F')
524 fprintf(fp, "%-13s", pp);
525 else
526 fputs(pp, fp);
527 break;
528 case 'p':
529 fputs(pci->pszFileName, fp);
530 break;
531 case 'P':
532 temp = 0;
533 if (!IsRoot(pci->pszFileName)) {
534 pp = strrchr(pci->pszFileName, '\\');
535 if (pp) {
536 temp = *pp;
537 *pp = 0;
538 }
539 }
540 fputs(pci->pszFileName, fp);
541 if (temp)
542 *pp = temp;
543 break;
544 case '$':
545 fputc(*pci->pszFileName, fp);
546 break;
547 case '%':
548 fputc('%', fp);
549 break;
550 }
551 }
552 else
553 fputc(*p, fp);
554 p++;
555 }
556 fputs("\n", fp);
557 }
558 pci = WinSendMsg(hwndCnr, CM_QUERYRECORDEMPHASIS, MPFROMP(pci),
559 MPFROMSHORT(attribute));
560 }
561 fclose(fp);
562 }
563 }
564 }
565 WinEnableWindow(hwnd, TRUE);
566 WinDismissDlg(hwnd, 1);
567 break;
568 }
569 return 0;
570 }
571 return WinDefDlgProc(hwnd, msg, mp1, mp2);
572}
573
574MRESULT EXPENTRY SaveAllListDlgProc(HWND hwnd, ULONG msg, MPARAM mp1,
575 MPARAM mp2)
576{
577
578 CHAR **list;
579 CHAR savename[CCHMAXPATH] = "", pattern[81];
580
581 switch (msg) {
582 case WM_INITDLG:
583 if (!mp2) {
584 Runtime_Error(pszSrcFile, __LINE__, "no data");
585 WinDismissDlg(hwnd, 0);
586 }
587 else {
588 WinSetWindowPtr(hwnd, QWL_USER, mp2);
589 list = (CHAR **) mp2;
590 WinSendDlgItemMsg(hwnd,
591 SAV_FILENAME,
592 EM_SETTEXTLIMIT, MPFROM2SHORT(CCHMAXPATH, 0), MPVOID);
593 WinSendDlgItemMsg(hwnd,
594 SAV_PATTERN,
595 EM_SETTEXTLIMIT, MPFROM2SHORT(80, 0), MPVOID);
596 *savename = *pattern = 0;
597 {
598 ULONG size;
599
600 size = CCHMAXPATH;
601 PrfQueryProfileData(fmprof,
602 appname, "SaveToListName", savename, &size);
603 size = MAX_PATTERN_BYTES + 1;
604 PrfQueryProfileData(fmprof,
605 appname, "SaveToListPattern", pattern, &size);
606 }
607 WinSetDlgItemText(hwnd, SAV_FILENAME, savename);
608 if (!*pattern)
609 strcpy(pattern, "%F %s");
610 {
611 CHAR temp[MAX_PATTERN_BYTES * 4 + 1];
612
613 fixup(pattern, temp, sizeof(temp), strlen(pattern));
614 WinSetDlgItemText(hwnd, SAV_PATTERN, temp);
615 }
616 {
617 FILE *fp;
618 CHAR s[CCHMAXPATH + 14];
619
620 BldFullPathName(s, pFM2SaveDirectory, "PATTERNS.DAT");
621 /*save_dir2(s);
622 if (s[strlen(s) - 1] != '\\')
623 strcat(s, "\\");
624 strcat(s, "PATTERNS.DAT");*/
625 fp = _fsopen(s, "r", SH_DENYWR);
626 if (fp) {
627 while (xfgets(s, 81, fp, pszSrcFile, __LINE__)) {
628 stripcr(s);
629 if (*s && *s != ';')
630 WinSendMsg(WinWindowFromID(hwnd, SAV_LISTBOX), LM_INSERTITEM,
631 MPFROM2SHORT(LIT_SORTASCENDING, 0), MPFROMP(s));
632 }
633 fclose(fp);
634 }
635 if (!WinSendDlgItemMsg(hwnd, SAV_LISTBOX, LM_QUERYITEMCOUNT,
636 MPVOID, MPVOID))
637 WinEnableWindow(WinWindowFromID(hwnd, SAV_LISTBOX), FALSE);
638 }
639 }
640 break;
641
642 case UM_SETDIR:
643 {
644 SHORT sSelect, sMax;
645 CHAR szBuffer[CCHMAXPATH + 14];
646 FILE *fp;
647
648 sMax = (SHORT) WinSendDlgItemMsg(hwnd,
649 SAV_LISTBOX,
650 LM_QUERYITEMCOUNT, MPVOID, MPVOID);
651 if (sMax > 0) {
652 BldFullPathName(szBuffer, pFM2SaveDirectory, "PATTERNS.DAT");
653 /*save_dir2(szBuffer);
654 if (szBuffer[strlen(szBuffer) - 1] != '\\')
655 strcat(szBuffer, "\\");
656 strcat(szBuffer, "PATTERNS.DAT");*/
657 fp = xfopen(szBuffer, "w", pszSrcFile, __LINE__);
658 if (fp) {
659 fputs(GetPString(IDS_LISTPATTERNTEXT), fp);
660 for (sSelect = 0; sSelect < sMax; sSelect++) {
661 *szBuffer = 0;
662 WinSendDlgItemMsg(hwnd,
663 SAV_LISTBOX,
664 LM_QUERYITEMTEXT,
665 MPFROM2SHORT(sSelect, 81), MPFROMP(szBuffer));
666 if (*szBuffer)
667 fprintf(fp, "%s\n", szBuffer);
668 }
669 fclose(fp);
670 }
671 }
672 else if (!sMax) {
673 BldFullPathName(szBuffer, pFM2SaveDirectory, "PATTERNS.DAT");
674 /*save_dir2(szBuffer);
675 if (szBuffer[strlen(szBuffer) - 1] != '\\')
676 strcat(szBuffer, "\\");
677 strcat(szBuffer, "PATTERNS.DAT");*/
678 unlinkf("%s", szBuffer);
679 }
680 }
681 return 0;
682
683 case WM_CONTROL:
684 if (SHORT1FROMMP(mp1) == SAV_LISTBOX) {
685
686 SHORT sSelect;
687 CHAR szBuffer[81];
688
689 switch (SHORT2FROMMP(mp1)) {
690 case LN_SELECT:
691 sSelect = (SHORT) WinSendDlgItemMsg(hwnd, SAV_LISTBOX,
692 LM_QUERYSELECTION,
693 MPFROMSHORT(LIT_FIRST), MPVOID);
694 if (sSelect >= 0) {
695 *szBuffer = 0;
696 WinSendDlgItemMsg(hwnd, SAV_LISTBOX, LM_QUERYITEMTEXT,
697 MPFROM2SHORT(sSelect, 81), MPFROMP(szBuffer));
698 if (*szBuffer)
699 WinSetDlgItemText(hwnd, SAV_PATTERN, szBuffer);
700 }
701 break;
702
703 case LN_ENTER:
704 PostMsg(hwnd, WM_COMMAND, MPFROM2SHORT(DID_OK, 0), MPVOID);
705 break;
706 }
707 }
708 return 0;
709
710 case WM_COMMAND:
711 list = (CHAR **) INSTDATA(hwnd);
712 switch (SHORT1FROMMP(mp1)) {
713 case DID_CANCEL:
714 WinDismissDlg(hwnd, 0);
715 break;
716
717 case IDM_HELP:
718 if (hwndHelp)
719 WinSendMsg(hwndHelp, HM_DISPLAY_HELP,
720 MPFROM2SHORT(HELP_SAVETOLIST, 0),
721 MPFROMSHORT(HM_RESOURCEID));
722 break;
723
724 case SAV_FIND:
725 {
726 *savename = 0;
727 WinQueryDlgItemText(hwnd, SAV_FILENAME, CCHMAXPATH, savename);
728 if (!*savename)
729 strcpy(savename, "*.LST");
730 if (export_filename(hwnd, savename, 1) && *savename) {
731 if (!strchr(savename, '.'))
732 strcat(savename, ".LST");
733 WinSetDlgItemText(hwnd, SAV_FILENAME, savename);
734 }
735 }
736 break;
737
738 case SAV_ADD:
739 case SAV_DEL:
740 case DID_OK:
741 WinEnableWindow(hwnd, FALSE);
742 {
743 FILE *fp;
744 CHAR *p, *pp, temp;
745 INT x = 0;
746 SHORT sSelect;
747 FILEFINDBUF4L ffb4;
748 ULONG nm;
749 HDIR hdir;
750 CHAR longname[CCHMAXPATH], subject[1024];
751
752 *pattern = 0;
753 WinQueryDlgItemText(hwnd, SAV_PATTERN, 80, pattern);
754 if (!*pattern) {
755 WinEnableWindow(hwnd, TRUE);
756 DosBeep(150, 100);
757 break;
758 }
759 {
760 switch (SHORT1FROMMP(mp1)) {
761 case SAV_ADD:
762 sSelect = (SHORT) WinSendDlgItemMsg(hwnd, SAV_LISTBOX,
763 LM_SEARCHSTRING,
764 MPFROM2SHORT(0, LIT_FIRST),
765 MPFROMP(pattern));
766 if (sSelect < 0) {
767 WinSendDlgItemMsg(hwnd, SAV_LISTBOX, LM_INSERTITEM,
768 MPFROM2SHORT(LIT_SORTASCENDING, 0),
769 MPFROMP(pattern));
770 WinSendMsg(hwnd, UM_SETDIR, MPVOID, MPVOID);
771 }
772 WinEnableWindow(hwnd, TRUE);
773 return 0;
774
775 case SAV_DEL:
776 sSelect = (SHORT) WinSendDlgItemMsg(hwnd, SAV_LISTBOX,
777 LM_QUERYSELECTION,
778 MPFROM2SHORT(LIT_FIRST, 0),
779 MPVOID);
780 if (sSelect >= 0) {
781 WinSendDlgItemMsg(hwnd, SAV_LISTBOX, LM_DELETEITEM,
782 MPFROM2SHORT(sSelect, 0), MPVOID);
783 WinSendMsg(hwnd, UM_SETDIR, MPVOID, MPVOID);
784 }
785 WinEnableWindow(hwnd, TRUE);
786 return 0;
787 }
788 }
789 literal(pattern);
790 if (!*pattern) {
791 WinEnableWindow(hwnd, TRUE);
792 DosBeep(250, 100);
793 break;
794 }
795 PrfWriteProfileString(fmprof, appname, "SaveToListPattern", pattern);
796 *savename = 0;
797 WinQueryDlgItemText(hwnd, SAV_FILENAME, CCHMAXPATH, savename);
798 bstrip(savename);
799 if (!*savename) {
800 WinEnableWindow(hwnd, TRUE);
801 DosBeep(100, 100);
802 break;
803 }
804 if (stricmp(savename, "PRN") &&
805 strnicmp(savename, "\\DEV\\LPT", 8) && !strchr(savename, '.'))
806 strcat(savename, ".LST");
807 PrfWriteProfileString(fmprof, appname, "SaveToListName", savename);
808 if (!list || !list[0])
809 Runtime_Error(pszSrcFile, __LINE__, "no data");
810 else {
811 fp = _fsopen(savename, "r+", SH_DENYWR);
812 if (!fp)
813 Runtime_Error(pszSrcFile, __LINE__, "_fsopen");
814 else {
815 fseek(fp, 0, SEEK_SET);
816 if (WinQueryButtonCheckstate(hwnd, SAV_APPEND) == 0)
817 DosSetFileSize((HFILE) fileno(fp), 0);
818 else
819 fseek(fp, 0, SEEK_END);
820 while (list[x]) {
821 hdir = HDIR_CREATE;
822 nm = 1;
823 *subject = *longname = 0;
824 if (!xDosFindFirst(list[x], &hdir,
825 FILE_NORMAL | FILE_DIRECTORY |
826 FILE_READONLY | FILE_ARCHIVED |
827 FILE_HIDDEN | FILE_SYSTEM,
828 &ffb4, sizeof(ffb4), &nm, FIL_QUERYEASIZEL)) {
829 /* load the object's Subject, if required */
830 if (ffb4.cbList > 4) {
831 APIRET rc;
832 EAOP2 eaop;
833 PGEA2LIST pgealist;
834 PFEA2LIST pfealist;
835 PGEA2 pgea;
836 PFEA2 pfea;
837 CHAR *value;
838
839 pgealist =
840 xmallocz(sizeof(GEA2LIST) + 64, pszSrcFile, __LINE__);
841 if (pgealist) {
842 pgea = &pgealist->list[0];
843 strcpy(pgea->szName, SUBJECT);
844 pgea->cbName = strlen(pgea->szName);
845 pgea->oNextEntryOffset = 0;
846 pgealist->cbList = sizeof(GEA2LIST) + pgea->cbName;
847 pfealist = xmallocz(1024, pszSrcFile, __LINE__);
848 if (pfealist) {
849 pfealist->cbList = 1024;
850 eaop.fpGEA2List = pgealist;
851 eaop.fpFEA2List = pfealist;
852 eaop.oError = 0;
853 rc = DosQueryPathInfo(list[x],
854 FIL_QUERYEASFROMLIST,
855 (PVOID) & eaop,
856 (ULONG) sizeof(EAOP2));
857 if (!rc) {
858 pfea = &eaop.fpFEA2List->list[0];
859 value = pfea->szName + pfea->cbName + 1;
860 value[pfea->cbValue] = 0;
861 if (*(USHORT *) value == EAT_ASCII)
862 strncpy(subject, value + (sizeof(USHORT) * 2), 1023);
863 subject[1023] = 0;
864 }
865 free(pfealist);
866 }
867 free(pgealist);
868 }
869 }
870 /* load the object's longname */
871 if (ffb4.cbList > 4) {
872 APIRET rc;
873 EAOP2 eaop;
874 PGEA2LIST pgealist;
875 PFEA2LIST pfealist;
876 PGEA2 pgea;
877 PFEA2 pfea;
878 CHAR *value;
879
880
881 pgealist =
882 xmallocz(sizeof(GEA2LIST) + 64, pszSrcFile, __LINE__);
883 if (pgealist) {
884 pgea = &pgealist->list[0];
885 strcpy(pgea->szName, LONGNAME);
886 pgea->cbName = strlen(pgea->szName);
887 pgea->oNextEntryOffset = 0;
888 pgealist->cbList = sizeof(GEA2LIST) + pgea->cbName;
889 pfealist = xmallocz(1024, pszSrcFile, __LINE__);
890 if (pfealist) {
891 pfealist->cbList = 1024;
892 eaop.fpGEA2List = pgealist;
893 eaop.fpFEA2List = pfealist;
894 eaop.oError = 0L;
895 rc = DosQueryPathInfo(list[x],
896 FIL_QUERYEASFROMLIST,
897 (PVOID) & eaop,
898 (ULONG) sizeof(EAOP2));
899 if (!rc) {
900 pfea = &eaop.fpFEA2List->list[0];
901 value = pfea->szName + pfea->cbName + 1;
902 value[pfea->cbValue] = 0;
903 if (*(USHORT *) value == EAT_ASCII)
904 strncpy(longname, value +
905 (sizeof(USHORT) * 2), CCHMAXPATHCOMP);
906 longname[CCHMAXPATHCOMP - 1] = 0;
907 }
908 free(pfealist);
909 }
910 free(pgealist);
911 }
912 }
913
914 p = pattern;
915 while (*p) {
916 if (*p == '%') {
917 p++;
918 switch (*p) {
919 CHAR szCmmaFmtFileSize[81];
920 case 's':
921 fputs(subject, fp);
922 break;
923 case 'S':
924 fprintf(fp, "%-40s", subject);
925 break;
926 case 'Z':
927 CommaFmtULL(szCmmaFmtFileSize,
928 sizeof(szCmmaFmtFileSize), ffb4.cbFile, ' ');
929 fprintf(fp, "%-13s", szCmmaFmtFileSize);
930 break;
931 case 'z':
932 CommaFmtULL(szCmmaFmtFileSize,
933 sizeof(szCmmaFmtFileSize), ffb4.cbFile, ' ');
934 fprintf(fp, "%s", szCmmaFmtFileSize);
935 break;
936 case 'E':
937 fprintf(fp, "%-5u", CBLIST_TO_EASIZE(ffb4.cbList));
938 break;
939 case 'e':
940 fprintf(fp, "%u", CBLIST_TO_EASIZE(ffb4.cbList));
941 break;
942 case 'd':
943 case 'D':
944 fprintf(fp,
945 "%04u/%02u/%02u",
946 ffb4.fdateLastWrite.year + 1980,
947 ffb4.fdateLastWrite.month,
948 ffb4.fdateLastWrite.day);
949 break;
950 case 't':
951 case 'T':
952 fprintf(fp,
953 "%02u:%02u:%02u",
954 ffb4.ftimeLastWrite.hours,
955 ffb4.ftimeLastWrite.minutes,
956 ffb4.ftimeLastWrite.twosecs * 2);
957 break;
958 case 'l':
959 fputs(longname, fp);
960 break;
961 case 'L':
962 fprintf(fp, "%-40s", longname);
963 break;
964 case 'F':
965 case 'f':
966 if (IsRoot(list[x]))
967 pp = list[x];
968 else {
969 pp = strrchr(list[x], '\\');
970 if (pp)
971 pp++;
972 else
973 pp = list[x];
974 }
975 if (*p == 'F')
976 fprintf(fp, "%-13s", pp);
977 else
978 fputs(pp, fp);
979 break;
980 case 'p':
981 fputs(list[x], fp);
982 break;
983 case 'P':
984 temp = 0;
985 if (!IsRoot(list[x])) {
986 pp = strrchr(list[x], '\\');
987 if (pp) {
988 temp = *pp;
989 *pp = 0;
990 }
991 }
992 fputs(list[x], fp);
993 if (temp)
994 *pp = temp;
995 break;
996 case '$':
997 fputc(*list[x], fp);
998 break;
999 case '%':
1000 fputc('%', fp);
1001 break;
1002 }
1003 }
1004 else
1005 fputc(*p, fp);
1006 p++;
1007 }
1008 fputs("\n", fp);
1009 DosFindClose(hdir);
1010 }
1011 x++;
1012 }
1013 fclose(fp);
1014 }
1015 }
1016 }
1017 WinEnableWindow(hwnd, TRUE);
1018 WinDismissDlg(hwnd, 1);
1019 break;
1020 }
1021 return 0;
1022 }
1023 return WinDefDlgProc(hwnd, msg, mp1, mp2);
1024}
1025
1026#pragma alloc_text(FMCLIPBOARDIN,SaveToClip,SaveToClipHab)
1027#pragma alloc_text(FMCLIPBOARDOUT,ListToClipboard,ListToClipboardHab)
1028#pragma alloc_text(FMCLIPBOARDOUT,ListFromClipboard,ListFromClipboardHab)
1029#pragma alloc_text(SAVELIST,SaveListDlgProc,SaveAllListDlgProc)
Note: See TracBrowser for help on using the repository browser.