source: trunk/dll/saveclip.c@ 838

Last change on this file since 838 was 838, checked in by Gregg Young, 18 years ago

Remainder of changes for xDosFindFirst/Next wrapper performance test

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