source: trunk/dll/printer.c@ 1395

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

Allow user to turn off alert and/or error beeps in settings notebook. Ticket 341 Move repeated strings to PCSZs. Ticket 6 Add *DateFormat functions to format dates based on locale Ticket 28 Eliminate Win_Error2 by moving function names to PCSZs used in Win_Error Ticket 6

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 17.6 KB
Line 
1/***********************************************************************
2
3 $Id: printer.c 1395 2009-02-08 01:48:16Z gyoung $
4
5 Print file list
6
7 Copyright (c) 1993-98 M. Kimes
8 Copyright (c) 2004, 2008 Steven H.Levine
9
10 01 Aug 04 SHL Rework lstrip/rstrip usage
11 17 Jul 06 SHL Use Runtime_Error
12 03 Nov 06 SHL Renames
13 03 Nov 06 SHL Count thread usage
14 22 Mar 07 GKY Use QWL_USER
15 20 Aug 07 GKY Move #pragma alloc_text to end for OpenWatcom compat
16 07 Feb 09 GKY Allow user to turn off alert and/or error beeps in settings notebook.
17
18***********************************************************************/
19
20#include <stdlib.h>
21#include <string.h>
22#include <ctype.h>
23#include <share.h>
24
25#define INCL_DOS
26#define INCL_WIN
27#define INCL_LONGLONG // dircnrs.h
28
29#include "fm3dll.h"
30#include "fm3dll2.h" // #define's for UM_*, control id's, etc.
31#include "notebook.h" // Data declaration(s)
32#include "mainwnd.h" // Data declaration(s)
33#include "fm3dlg.h"
34#include "fm3str.h"
35#include "makelist.h" // AddToList
36#include "errutil.h" // Dos_Error...
37#include "strutil.h" // GetPString
38#include "notify.h" // AddNote
39#include "defview.h" // QuickView
40#include "printer.h"
41#include "common.h" // DecrThreadUsage, IncrThreadUsage
42#include "chklist.h" // PosOverOkay
43#include "strips.h" // bstrip
44#include "valid.h" // IsFile
45#include "wrappers.h" // xfopen
46#include "misc.h" // PostMsg
47#include "fortify.h"
48
49// Data definitions
50#pragma data_seg(DATA1)
51
52static PSZ pszSrcFile = __FILE__;
53
54static HMTX PrintSem = 0;
55
56static BOOL PrinterReady(CHAR * printdevname);
57static BOOL SayPrinterReady(HWND hwnd);
58
59#pragma data_seg(GLOBAL2)
60CHAR StopPrinting;
61CHAR printer[CCHMAXPATH];
62BOOL prnalt;
63long prnbmargin;
64BOOL prnformat;
65BOOL prnformfeedafter;
66BOOL prnformfeedbefore;
67long prnlength;
68long prnlmargin;
69BOOL prnpagenums;
70long prnrmargin;
71long prnspacing;
72long prntabspaces;
73long prntmargin;
74long prnwidth;
75
76BOOL PrinterReady(CHAR * printdevname)
77{
78 FILE *printhandle;
79 CHAR param = 0, data = 0;
80 ULONG datalen = 1, parmlen = 1, htype, flagword;
81
82 if (!fWorkPlace) /* assume spooler is active */
83 return TRUE;
84 DosError(FERR_DISABLEHARDERR);
85 printhandle = xfopen(printdevname, "a+", pszSrcFile, __LINE__);
86 if (printhandle) {
87 if (!strnicmp(printdevname, "COM", 3) && isdigit(printdevname[3])) {
88 fclose(printhandle);
89 return TRUE;
90 }
91 if (!DosQueryHType(fileno(printhandle), &htype, &flagword) &&
92 !(htype & 7)) {
93 fclose(printhandle);
94 return TRUE;
95 }
96 if (DosDevIOCtl(fileno(printhandle), 5, 0x00000066, (PVOID) & param,
97 1, &parmlen, (PVOID) & data, 1,
98 &datalen) != 0x00000100) {
99 fclose(printhandle);
100 return FALSE;
101 }
102 fclose(printhandle);
103 if (data & 32) /* bit 5 is out of paper */
104 return FALSE;
105 return TRUE;
106 }
107 return FALSE;
108}
109
110BOOL SayPrinterReady(HWND hwnd)
111{
112 if (!hwnd)
113 hwnd = HWND_DESKTOP;
114 if (!PrinterReady(printer)) {
115 saymsg(MB_ENTER | MB_ICONEXCLAMATION,
116 hwnd,
117 GetPString(IDS_NOTETEXT), GetPString(IDS_PRINTERNOTREADYTEXT));
118 return FALSE;
119 }
120 return TRUE;
121}
122
123//=== PrintListThread - background-print a list of files ===
124
125VOID PrintListThread(VOID * arg)
126{
127 HAB hab2;
128 HMQ hmq2;
129 LISTINFO *li = (LISTINFO *) arg;
130 register INT x;
131 FILE *fpi, *fpo;
132 CHAR s[CCHMAXPATH + 80];
133 FILESTATUS3 fs3;
134 LONG cols, lines, pages, z, lmargin, rmargin;
135 BOOL endline, endpage, startpage, skipping, firstpass;
136 int c;
137 APIRET rc = MBID_YES;
138
139 if (StopPrinting)
140 goto Abort;
141 if (!PrintSem) {
142 if (DosCreateMutexSem(NULL, &PrintSem, 0, FALSE)) {
143 Dos_Error(MB_CANCEL, rc, HWND_DESKTOP, pszSrcFile, __LINE__,
144 "DosCreateMutexSem");
145 goto Abort;
146 }
147 }
148# ifdef FORTIFY
149 Fortify_EnterScope();
150# endif
151 priority_normal();
152 hab2 = WinInitialize(0);
153 if (hab2) {
154 hmq2 = WinCreateMsgQueue(hab2, 0);
155 if (hmq2) {
156 WinCancelShutdown(hmq2, TRUE);
157 IncrThreadUsage();
158 if (li && li->list && li->list[0]) {
159 AddNote(GetPString(IDS_PRINTINGLISTTEXT));
160 for (x = 0; li->list[x]; x++) {
161 if (rc == MBID_CANCEL)
162 break;
163 DosError(FERR_DISABLEHARDERR);
164 if (DosQueryPathInfo(li->list[x], FIL_STANDARD, &fs3, sizeof(fs3)) ||
165 fs3.attrFile & FILE_DIRECTORY ||
166 !fs3.cbFile)
167 continue;
168 if (StopPrinting)
169 break;
170 DosRequestMutexSem(PrintSem, 240000);
171 if (StopPrinting)
172 break;
173 if (!PrinterReady(li->targetpath))
174 Runtime_Error(pszSrcFile, __LINE__, "printer %s error",
175 li->targetpath);
176 else {
177 fpi = _fsopen(li->list[x], "r", SH_DENYWR);
178 if (!fpi)
179 Runtime_Error(pszSrcFile, __LINE__, "cannot open %s",
180 li->list[x]);
181 else {
182 fpo = _fsopen(li->targetpath, "a+", SH_DENYRW);
183 if (!fpo)
184 Runtime_Error(pszSrcFile, __LINE__, "cannot open %s",
185 li->targetpath);
186 else {
187 sprintf(s, GetPString(IDS_PRINTINGTEXT), li->list[x]);
188 AddNote(s);
189 firstpass = TRUE;
190 skipping = FALSE;
191 lmargin = prnlmargin;
192 rmargin = prnrmargin;
193 if (prnformfeedbefore) {
194 if (!skipping)
195 fputc('\x0c', fpo);
196 }
197 Again:
198 cols = lines = pages = 0;
199 endline = endpage = FALSE;
200 startpage = TRUE;
201 while ((c = fgetc(fpi)) != EOF) {
202 if (StopPrinting || ferror(fpo))
203 break;
204 if (prnformat) {
205 if (startpage) {
206 pages++;
207 if (prnpagenums) {
208 if (!skipping)
209 fprintf(fpo, "%*.*s#%lu",
210 lmargin, lmargin, " ", pages);
211 }
212 for (z = 0; z < prntmargin; z++) {
213 if (!skipping)
214 fputc('\n', fpo);
215 }
216 lines = prntmargin;
217 endline = endpage = FALSE;
218 cols = 0;
219 startpage = FALSE;
220 }
221 if (!cols) {
222 for (z = 0; z < lmargin; z++) {
223 if (!skipping)
224 fputc(' ', fpo);
225 }
226 cols = lmargin;
227 }
228 if (!skipping) {
229 if (c == '\t') {
230 for (z = 0; z < prntabspaces &&
231 cols + z < prnwidth - rmargin; z++)
232 fputc(' ', fpo);
233 }
234 else
235 fputc(c, fpo);
236 }
237 if (c == '\x0c')
238 endpage = TRUE;
239 else if (c == '\n') {
240 lines++;
241 cols = 0;
242 for (z = 1; z < prnspacing; z++) {
243 if (prnlength - lines <= prnbmargin)
244 break;
245 if (!skipping)
246 fputc('\n', fpo);
247 lines++;
248 }
249 if (prnlength - lines <= prnbmargin)
250 endpage = TRUE;
251 }
252 else {
253 cols++;
254 if (c == '\t')
255 c += prntabspaces;
256 if (prnwidth - cols <= rmargin) {
257 endline = TRUE;
258 if (!skipping)
259 fputc('\n', fpo);
260 lines++;
261 }
262 for (z = 1; z < prnspacing; z++) {
263 if (prnlength - lines <= prnbmargin)
264 break;
265 if (!skipping)
266 fputc('\n', fpo);
267 lines++;
268 }
269 }
270 if (endline) {
271 do {
272 c = fgetc(fpi);
273 if (c == '\n')
274 break;
275 } while (isspace(c) && c != EOF);
276 if (c == EOF)
277 break;
278 if (!isspace(c))
279 ungetc(c, fpi);
280 endline = FALSE;
281 cols = 0;
282 if (prnlength - lines <= prnbmargin)
283 endpage = TRUE;
284 }
285 if (endpage) {
286 if (prnbmargin) {
287 if (c != '\x0c') {
288 if (!skipping)
289 fputc('\r\x0c', fpo);
290 }
291 }
292 lines = cols = 0;
293 endpage = FALSE;
294 startpage = TRUE;
295 do {
296 c = fgetc(fpi);
297 } while (c == '\n');
298 if (c == EOF)
299 break;
300 ungetc(c, fpi);
301 if (prnformat && prnalt)
302 skipping = (skipping) ? FALSE : TRUE;
303 DosSleep(1);
304 }
305 }
306 else
307 fputc(c, fpo);
308 }
309 if (prnalt && prnformat && firstpass && pages > 1) {
310 fclose(fpo);
311 fpo = _fsopen(li->targetpath, "a+", SH_DENYRW);
312 if (fpo) {
313 rewind(fpi);
314 firstpass = FALSE;
315 skipping = TRUE;
316 rc = saymsg(MB_YESNOCANCEL | MB_ICONEXCLAMATION,
317 HWND_DESKTOP,
318 GetPString(IDS_PRINTTITLETEXT),
319 GetPString(IDS_PRINTEVENTEXT), li->list[x]);
320 if (rc == MBID_YES) {
321 lmargin = prnrmargin;
322 rmargin = prnlmargin;
323 fputc('\x0c', fpo);
324 goto Again;
325 }
326 }
327 else
328 saymsg(MB_CANCEL | MB_ICONEXCLAMATION,
329 HWND_DESKTOP,
330 GetPString(IDS_PRINTTITLETEXT),
331 GetPString(IDS_PRINTCANTREOPENTEXT),
332 li->targetpath);
333 }
334 if (prnformfeedafter)
335 fputc('\x0c', fpo);
336 if (!StopPrinting) {
337 sprintf(s, GetPString(IDS_PRINTEDTEXT), li->list[x]);
338 AddNote(s);
339 }
340 fclose(fpo);
341 }
342 fclose(fpi);
343 }
344 }
345 DosReleaseMutexSem(PrintSem);
346 DosSleep(1);
347 }
348 if (!StopPrinting)
349 AddNote(GetPString(IDS_PRINTEDLISTTEXT));
350 }
351 WinDestroyMsgQueue(hmq2);
352 }
353 DecrThreadUsage();
354 WinTerminate(hab2);
355 }
356Abort:
357 if (li)
358 FreeListInfo(li);
359# ifdef FORTIFY
360 Fortify_LeaveScope();
361# endif
362}
363
364MRESULT EXPENTRY PrintDlgProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
365{
366 LISTINFO *li;
367
368 switch (msg) {
369 case WM_INITDLG:
370 if (!mp2)
371 WinDismissDlg(hwnd, 0);
372 else {
373 WinSetWindowPtr(hwnd, QWL_USER, mp2);
374 WinSendDlgItemMsg(hwnd, PRN_WIDTH, EM_SETTEXTLIMIT,
375 MPFROM2SHORT(3, 0), MPVOID);
376 WinSendDlgItemMsg(hwnd, PRN_LENGTH, EM_SETTEXTLIMIT,
377 MPFROM2SHORT(3, 0), MPVOID);
378 WinSendDlgItemMsg(hwnd, PRN_LMARGIN, EM_SETTEXTLIMIT,
379 MPFROM2SHORT(2, 0), MPVOID);
380 WinSendDlgItemMsg(hwnd, PRN_RMARGIN, EM_SETTEXTLIMIT,
381 MPFROM2SHORT(2, 0), MPVOID);
382 WinSendDlgItemMsg(hwnd, PRN_TMARGIN, EM_SETTEXTLIMIT,
383 MPFROM2SHORT(2, 0), MPVOID);
384 WinSendDlgItemMsg(hwnd, PRN_BMARGIN, EM_SETTEXTLIMIT,
385 MPFROM2SHORT(2, 0), MPVOID);
386 WinSendDlgItemMsg(hwnd, PRN_SPACING, EM_SETTEXTLIMIT,
387 MPFROM2SHORT(1, 0), MPVOID);
388 WinSendDlgItemMsg(hwnd, PRN_TABSPACES, EM_SETTEXTLIMIT,
389 MPFROM2SHORT(2, 0), MPVOID);
390 WinSendDlgItemMsg(hwnd, PRN_PRINTER, EM_SETTEXTLIMIT,
391 MPFROM2SHORT(CCHMAXPATH, 0), MPVOID);
392 WinSendMsg(hwnd, UM_UNDO, MPVOID, MPVOID);
393 PosOverOkay(hwnd);
394 }
395 break;
396
397 case UM_UNDO:
398 WinCheckButton(hwnd, PRN_FORMAT, prnformat);
399 WinCheckButton(hwnd, PRN_ALT, prnalt);
400 WinCheckButton(hwnd, PRN_PAGENUMS, prnpagenums);
401 WinCheckButton(hwnd, PRN_FORMBEFORE, prnformfeedbefore);
402 WinCheckButton(hwnd, PRN_FORMAFTER, prnformfeedafter);
403 {
404 CHAR s[33];
405
406 sprintf(s, "%lu", prnwidth);
407 WinSetDlgItemText(hwnd, PRN_WIDTH, s);
408 sprintf(s, "%lu", prnlength);
409 WinSetDlgItemText(hwnd, PRN_LENGTH, s);
410 sprintf(s, "%lu", prnlmargin);
411 WinSetDlgItemText(hwnd, PRN_LMARGIN, s);
412 sprintf(s, "%lu", prnrmargin);
413 WinSetDlgItemText(hwnd, PRN_RMARGIN, s);
414 sprintf(s, "%lu", prntmargin);
415 WinSetDlgItemText(hwnd, PRN_TMARGIN, s);
416 sprintf(s, "%lu", prnbmargin);
417 WinSetDlgItemText(hwnd, PRN_BMARGIN, s);
418 sprintf(s, "%lu", prnspacing);
419 WinSetDlgItemText(hwnd, PRN_SPACING, s);
420 sprintf(s, "%lu", prntabspaces);
421 WinSetDlgItemText(hwnd, PRN_TABSPACES, s);
422 }
423 WinSetDlgItemText(hwnd, PRN_PRINTER, printer);
424 WinSendDlgItemMsg(hwnd, PRN_LISTBOX, LM_DELETEALL, MPVOID, MPVOID);
425 li = WinQueryWindowPtr(hwnd, QWL_USER);
426 if (!li)
427 Runtime_Error(pszSrcFile, __LINE__, "no data");
428 else {
429 INT x;
430
431 for (x = 0; li->list[x]; x++) {
432 if (IsFile(li->list[x]) == 1) {
433 WinSendDlgItemMsg(hwnd, PRN_LISTBOX, LM_INSERTITEM,
434 MPFROM2SHORT(LIT_END, 0), MPFROMP(li->list[x]));
435 WinSendDlgItemMsg(hwnd, PRN_LISTBOX, LM_SELECTITEM,
436 MPFROM2SHORT(x, 0), MPFROMSHORT(TRUE));
437 }
438 }
439 if (!(SHORT) WinSendDlgItemMsg(hwnd, PRN_LISTBOX, LM_QUERYITEMCOUNT,
440 MPVOID, MPVOID)) {
441 saymsg(MB_CANCEL | MB_ICONEXCLAMATION,
442 hwnd,
443 GetPString(IDS_TWIDDLETEXT), GetPString(IDS_NOPRINTABLETEXT));
444 WinDismissDlg(hwnd, 0);
445 }
446 }
447 return 0;
448
449 case WM_CONTROL:
450 switch (SHORT1FROMMP(mp1)) {
451 case PRN_LISTBOX:
452 if (SHORT2FROMMP(mp1) == LN_ENTER) {
453
454 SHORT x;
455 CHAR szBuffer[CCHMAXPATH];
456
457 x = (SHORT) WinSendDlgItemMsg(hwnd, PRN_LISTBOX, LM_QUERYSELECTION,
458 MPFROMSHORT(LIT_FIRST), MPVOID);
459 if (x >= 0) {
460 *szBuffer = 0;
461 WinSendDlgItemMsg(hwnd, PRN_LISTBOX, LM_QUERYITEMTEXT,
462 MPFROM2SHORT(x, CCHMAXPATH), MPFROMP(szBuffer));
463 if (*szBuffer)
464 QuickView(hwnd, szBuffer);
465 }
466 }
467 }
468 return 0;
469
470 case WM_COMMAND:
471 switch (SHORT1FROMMP(mp1)) {
472 case DID_OK:
473 li = WinQueryWindowPtr(hwnd, QWL_USER);
474 if (!li)
475 Runtime_Error(pszSrcFile, __LINE__, "no data");
476 else {
477 prnformat = WinQueryButtonCheckstate(hwnd, PRN_FORMAT);
478 PrfWriteProfileData(fmprof, FM3Str, "Prnformat",
479 (PVOID) & prnformat, sizeof(prnformat));
480 prnalt = WinQueryButtonCheckstate(hwnd, PRN_ALT);
481 PrfWriteProfileData(fmprof, FM3Str, "Prnalt",
482 (PVOID) & prnalt, sizeof(prnalt));
483 prnpagenums = WinQueryButtonCheckstate(hwnd, PRN_PAGENUMS);
484 PrfWriteProfileData(fmprof, FM3Str, "Prnpagenums",
485 (PVOID) & prnpagenums, sizeof(prnpagenums));
486 prnformfeedbefore = WinQueryButtonCheckstate(hwnd, PRN_FORMBEFORE);
487 PrfWriteProfileData(fmprof, FM3Str, "Prnformfeedbefore",
488 (PVOID) & prnformfeedbefore,
489 sizeof(prnformfeedbefore));
490 prnformfeedafter = WinQueryButtonCheckstate(hwnd, PRN_FORMAFTER);
491 PrfWriteProfileData(fmprof, FM3Str, "Prnformfeedafter",
492 (PVOID) & prnformfeedafter,
493 sizeof(prnformfeedafter));
494 {
495 CHAR s[33];
496
497 *s = 0;
498 WinQueryDlgItemText(hwnd, PRN_WIDTH, sizeof(s), s);
499 if (atol(s) < 24 || atol(s) > 4096) {
500 WinSetFocus(HWND_DESKTOP, WinWindowFromID(hwnd, PRN_WIDTH));
501 if (!fAlertBeepOff)
502 DosBeep(50, 100);
503 break;
504 }
505 prnwidth = atol(s);
506 PrfWriteProfileData(fmprof, FM3Str, "Prnwidth",
507 (PVOID) & prnwidth, sizeof(prnwidth));
508 *s = 0;
509 WinQueryDlgItemText(hwnd, PRN_LENGTH, sizeof(s), s);
510 if (atol(s) < 24 || atol(s) > 4096) {
511 WinSetFocus(HWND_DESKTOP, WinWindowFromID(hwnd, PRN_LENGTH));
512 if (!fAlertBeepOff)
513 DosBeep(50, 100);
514 break;
515 }
516 prnlength = atol(s);
517 PrfWriteProfileData(fmprof, FM3Str, "Prnlength",
518 (PVOID) & prnlength, sizeof(prnlength));
519 *s = 0;
520 WinQueryDlgItemText(hwnd, PRN_LMARGIN, sizeof(s), s);
521 if (atol(s) < 0 || atol(s) > prnwidth - 1) {
522 WinSetFocus(HWND_DESKTOP, WinWindowFromID(hwnd, PRN_LMARGIN));
523 if (!fAlertBeepOff)
524 DosBeep(50, 100);
525 break;
526 }
527 prnlmargin = atol(s);
528 PrfWriteProfileData(fmprof, FM3Str, "Prnlmargin",
529 (PVOID) & prnlmargin, sizeof(prnlmargin));
530 *s = 0;
531 WinQueryDlgItemText(hwnd, PRN_RMARGIN, sizeof(s), s);
532 if (atol(s) < 0 || atol(s) > (prnwidth - prnlmargin) - 1) {
533 WinSetFocus(HWND_DESKTOP, WinWindowFromID(hwnd, PRN_RMARGIN));
534 if (!fAlertBeepOff)
535 DosBeep(50, 100);
536 break;
537 }
538 prnrmargin = atol(s);
539 PrfWriteProfileData(fmprof, FM3Str, "Prnrmargin",
540 (PVOID) & prnrmargin, sizeof(prnrmargin));
541 *s = 0;
542 WinQueryDlgItemText(hwnd, PRN_TABSPACES, sizeof(s), s);
543 if (atol(s) < 1 ||
544 atol(s) > prnwidth - ((prnlmargin + prnrmargin) - 1)) {
545 WinSetFocus(HWND_DESKTOP, WinWindowFromID(hwnd, PRN_TABSPACES));
546 if (!fAlertBeepOff)
547 DosBeep(50, 100);
548 break;
549 }
550 prntabspaces = atol(s);
551 PrfWriteProfileData(fmprof, FM3Str, "Prntabspaces",
552 (PVOID) & prntabspaces, sizeof(prntabspaces));
553 *s = 0;
554 WinQueryDlgItemText(hwnd, PRN_TMARGIN, sizeof(s), s);
555 if (atol(s) < 0 || atol(s) > prnlength - 1) {
556 WinSetFocus(HWND_DESKTOP, WinWindowFromID(hwnd, PRN_TMARGIN));
557 if (!fAlertBeepOff)
558 DosBeep(50, 100);
559 break;
560 }
561 prntmargin = atol(s);
562 PrfWriteProfileData(fmprof, FM3Str, "Prntmargin",
563 (PVOID) & prntmargin, sizeof(prntmargin));
564 *s = 0;
565 WinQueryDlgItemText(hwnd, PRN_BMARGIN, sizeof(s), s);
566 if (atol(s) < 0 || atol(s) > (prnlength - prntmargin) - 1) {
567 WinSetFocus(HWND_DESKTOP, WinWindowFromID(hwnd, PRN_BMARGIN));
568 if (!fAlertBeepOff)
569 DosBeep(50, 100);
570 break;
571 }
572 prnbmargin = atol(s);
573 PrfWriteProfileData(fmprof, FM3Str, "Prnbmargin",
574 (PVOID) & prnbmargin, sizeof(prnbmargin));
575 *s = 0;
576 WinQueryDlgItemText(hwnd, PRN_SPACING, sizeof(s), s);
577 if (atol(s) < 1 ||
578 atol(s) > ((prnlength - prntmargin) - prnbmargin) - 1) {
579 WinSetFocus(HWND_DESKTOP, WinWindowFromID(hwnd, PRN_SPACING));
580 if (!fAlertBeepOff)
581 DosBeep(50, 100);
582 break;
583 }
584 prnspacing = atol(s);
585 PrfWriteProfileData(fmprof, FM3Str, "Prnspacing",
586 (PVOID) & prnspacing, sizeof(prnspacing));
587 WinQueryDlgItemText(hwnd, PRN_PRINTER, sizeof(printer), printer);
588 bstrip(printer);
589 if (!*printer)
590 strcpy(printer, "PRN");
591 WinSetDlgItemText(hwnd, PRN_PRINTER, printer);
592 PrfWriteProfileString(fmprof, appname, "Printer", printer);
593 SayPrinterReady(hwnd);
594 }
595 {
596 CHAR szBuffer[CCHMAXPATH + 1];
597 UINT numfiles = 0, numalloc = 0;
598 INT error;
599 SHORT x;
600
601 if (li->list)
602 FreeList(li->list);
603 li->list = NULL;
604 x = (SHORT) WinSendDlgItemMsg(hwnd, PRN_LISTBOX, LM_QUERYSELECTION,
605 MPFROMSHORT(LIT_FIRST), MPVOID);
606 if (x >= 0) {
607 do {
608 *szBuffer = 0;
609 WinSendDlgItemMsg(hwnd, PRN_LISTBOX, LM_QUERYITEMTEXT,
610 MPFROM2SHORT(x, CCHMAXPATH),
611 MPFROMP(szBuffer));
612 error = AddToList(szBuffer, &li->list, &numfiles, &numalloc);
613 if (error) {
614 Runtime_Error(pszSrcFile, __LINE__, "AddToList");
615 break;
616 }
617 x = (SHORT) WinSendDlgItemMsg(hwnd, PRN_LISTBOX,
618 LM_QUERYSELECTION,
619 MPFROMSHORT(x), MPVOID);
620 } while (x >= 0);
621 }
622 }
623 if (!li->list || !li->list[0])
624 WinDismissDlg(hwnd, 0);
625 else
626 WinDismissDlg(hwnd, 1);
627 }
628 break;
629 case DID_CANCEL:
630 WinDismissDlg(hwnd, 0);
631 break;
632 case IDM_HELP:
633 if (hwndHelp)
634 WinSendMsg(hwndHelp, HM_DISPLAY_HELP,
635 MPFROM2SHORT(HELP_PRINT, 0), MPFROMSHORT(HM_RESOURCEID));
636 break;
637 case IDM_UNDO:
638 PostMsg(hwnd, UM_UNDO, MPVOID, MPVOID);
639 break;
640 }
641 return 0;
642 }
643 return WinDefDlgProc(hwnd, msg, mp1, mp2);
644}
645
646#pragma alloc_text(PRINTER,PrinterReady,SayPrinterReady)
647#pragma alloc_text(PRINTER2,PrintListThread)
648#pragma alloc_text(PRINTER3,PrintDlgProc)
Note: See TracBrowser for help on using the repository browser.