ViewVC Help
View File | Revision Log | Show Annotations | Download File | View Changeset | Root Listing
root/proj/trunk/VTBFileUtil2/ScanUtility.cxx
Revision: 282
Committed: 2003-08-25T23:41:12-07:00 (21 years, 10 months ago) by douglas
File size: 21574 byte(s)
Log Message:
Inheritance and such, ack evil window looping makes my head hurt.

File Contents

# Content
1 // Vance Thrift and Biller File Utility 2
2 //
3 // Douglas Thrift
4 //
5 // $Id: ScanUtility.cxx,v 1.11 2003/08/26 06:41:12 douglas Exp $
6
7 #include "ScanUtility.h"
8
9 ScanUtility::ScanUtility() : DiscBrowse()
10 {
11 number = count++;
12
13 utilities.insert(pair<unsigned, ScanUtility*>(number, this));
14
15 title = programName + " - Scan Utility";
16
17 // start
18 wizard[0].dwSize = sizeof(wizard[0]);
19 wizard[0].dwFlags = PSP_DEFAULT | PSP_USETITLE | PSP_USEHEADERTITLE |
20 PSP_USEHEADERSUBTITLE;
21 wizard[0].hInstance = gui.instance;
22 wizard[0].pszTemplate = MAKEINTRESOURCE(IDD_START);
23 wizard[0].pszTitle = title.c_str();
24 wizard[0].pfnDlgProc = start;
25 wizard[0].lParam = number;
26 wizard[0].pszHeaderTitle = "Start";
27 wizard[0].pszHeaderSubTitle = "Change any settings before scanning.";
28
29 // select
30 wizard[1].dwSize = sizeof(wizard[1]);
31 wizard[1].dwFlags = PSP_DEFAULT | PSP_USETITLE | PSP_USEHEADERTITLE |
32 PSP_USEHEADERSUBTITLE;
33 wizard[1].hInstance = gui.instance;
34 wizard[1].pszTemplate = MAKEINTRESOURCE(IDD_SELECT);
35 wizard[1].pszTitle = title.c_str();
36 wizard[1].pfnDlgProc = select;
37 wizard[1].lParam = number;
38 wizard[1].pszHeaderTitle = "Select";
39 wizard[1].pszHeaderSubTitle = "Choose the scanned document to save.";
40
41 // enter
42 wizard[2].dwSize = sizeof(wizard[2]);
43 wizard[2].dwFlags = PSP_DEFAULT | PSP_USETITLE | PSP_USEHEADERTITLE |
44 PSP_USEHEADERSUBTITLE;
45 wizard[2].hInstance = gui.instance;
46 wizard[2].pszTemplate = MAKEINTRESOURCE(IDD_ENTER);
47 wizard[2].pszTitle = title.c_str();
48 wizard[2].pfnDlgProc = enter;
49 wizard[2].lParam = number;
50 wizard[2].pszHeaderTitle = "Enter";
51 wizard[2].pszHeaderSubTitle = "Input the client information.";
52
53 // confirm
54 wizard[3].dwSize = sizeof(wizard[3]);
55 wizard[3].dwFlags = PSP_DEFAULT | PSP_USETITLE | PSP_USEHEADERTITLE |
56 PSP_USEHEADERSUBTITLE;
57 wizard[3].hInstance = gui.instance;
58 wizard[3].pszTemplate = MAKEINTRESOURCE(IDD_CONFIRM);
59 wizard[3].pszTitle = title.c_str();
60 wizard[3].pfnDlgProc = confirm;
61 wizard[3].lParam = number;
62 wizard[3].pszHeaderTitle = "Confirm";
63 wizard[3].pszHeaderSubTitle = "Make sure the file information is correct.";
64
65 // complete
66 wizard[4].dwSize = sizeof(wizard[3]);
67 wizard[4].dwFlags = PSP_DEFAULT | PSP_USETITLE | PSP_USEHEADERTITLE |
68 PSP_USEHEADERSUBTITLE;
69 wizard[4].hInstance = gui.instance;
70 wizard[4].pszTemplate = MAKEINTRESOURCE(IDD_DONE);
71 wizard[4].pszTitle = title.c_str();
72 wizard[4].pfnDlgProc = done;
73 wizard[4].lParam = number;
74 wizard[4].pszHeaderTitle = "Done";
75 wizard[4].pszHeaderSubTitle = "Exit or start over for another scan.";
76 }
77
78 ScanUtility::~ScanUtility()
79 {
80 utilities.erase(number);
81 }
82
83 void ScanUtility::run(void)
84 {
85 loadDirs();
86
87 PROPSHEETHEADER header;
88
89 // header
90 header.dwSize = sizeof(header);
91 header.dwFlags = PSH_DEFAULT | PSH_HEADER | PSH_PROPSHEETPAGE |
92 PSH_USEICONID | PSH_WIZARD97 | PSH_WIZARDHASFINISH;
93 header.hwndParent = NULL;
94 header.hInstance = gui.instance;
95 header.pszIcon = MAKEINTRESOURCE(IDI_VTB_ICON);
96 header.nPages = 5;
97 header.nStartPage = 0;
98 header.ppsp = wizard;
99 header.pszbmHeader = MAKEINTRESOURCE(IDB_VTB_BMP);
100
101 PropertySheet(&header);
102 saveDirs();
103 }
104
105 map<unsigned, ScanUtility*> ScanUtility::utilities;
106 map<HWND, ScanUtility*> ScanUtility::windows;
107
108 void ScanUtility::loadDirs(void)
109 {
110 HKEY key;
111
112 if (RegOpenKeyEx(HKEY_CURRENT_USER,
113 "Software\\DouglasThrift\\VTBFileUtil2", 0, KEY_QUERY_VALUE, &key) ==
114 ERROR_SUCCESS)
115 {
116 DWORD type;
117 char data[MAX_PATH];
118 DWORD size = MAX_PATH;
119
120 if (RegQueryValueEx(key, "ScanDir", NULL, &type, LPBYTE(data), &size)
121 == ERROR_SUCCESS)
122 {
123 data[size - 1] = '\0';
124
125 switch (type)
126 {
127 case REG_EXPAND_SZ:
128 {
129 char folder[MAX_PATH];
130
131 ExpandEnvironmentStrings(data, folder, MAX_PATH);
132
133 scanDir = folder;
134 }
135 break;
136 case REG_SZ:
137 scanDir = data;
138 break;
139 default:
140 setScanDir();
141 break;
142 }
143 }
144 else
145 {
146 setScanDir();
147 }
148
149 size = MAX_PATH;
150
151 if (RegQueryValueEx(key, "SaveDir", NULL, &type, LPBYTE(data), &size)
152 == ERROR_SUCCESS)
153 {
154 data[size - 1] = '\0';
155
156 switch (type)
157 {
158 case REG_EXPAND_SZ:
159 {
160 char folder[MAX_PATH];
161
162 ExpandEnvironmentStrings(data, folder, MAX_PATH);
163
164 saveDir = folder;
165 }
166 break;
167 case REG_SZ:
168 saveDir = data;
169 break;
170 default:
171 setSaveDir();
172 break;
173 }
174 }
175 else
176 {
177 setSaveDir();
178 }
179
180 RegCloseKey(key);
181 }
182 else
183 {
184 setScanDir();
185 setSaveDir();
186 }
187
188 if (debug) cerr << "scanDir = " << scanDir << "\n"
189 << "saveDir = " << saveDir << "\n";
190 }
191
192 void ScanUtility::saveDirs(void)
193 {
194 HKEY key;
195
196 if (RegCreateKeyEx(HKEY_CURRENT_USER,
197 "Software\\DouglasThrift\\VTBFileUtil2", 0, NULL,
198 REG_OPTION_NON_VOLATILE, KEY_QUERY_VALUE | KEY_SET_VALUE, NULL, &key,
199 NULL) == ERROR_SUCCESS)
200 {
201 DWORD type;
202 char data[MAX_PATH];
203 DWORD size = MAX_PATH;
204
205 if (RegQueryValueEx(key, "ScanDir", NULL, &type, LPBYTE(data), &size)
206 == ERROR_SUCCESS)
207 {
208 data[size - 1] = '\0';
209 }
210 else
211 {
212 data[0] = '\0';
213 }
214
215 if (scanDir != data || type != REG_SZ)
216 {
217 if (RegSetValueEx(key, "ScanDir", 0, REG_SZ,
218 LPBYTE(scanDir.c_str()), scanDir.length() + 1) !=
219 ERROR_SUCCESS)
220 {
221 error();
222 }
223 }
224
225 size = MAX_PATH;
226
227 if (RegQueryValueEx(key, "SaveDir", NULL, &type, LPBYTE(data), &size)
228 == ERROR_SUCCESS)
229 {
230 data[size - 1] = '\0';
231 }
232 else
233 {
234 data[0] = '\0';
235 }
236
237 if (saveDir != data || type != REG_SZ)
238 {
239 if (RegSetValueEx(key, "SaveDir", 0, REG_SZ,
240 LPBYTE(saveDir.c_str()), saveDir.length() + 1) !=
241 ERROR_SUCCESS)
242 {
243 error();
244 }
245 }
246
247 RegCloseKey(key);
248 }
249 else
250 {
251 error();
252 }
253 }
254
255 void ScanUtility::setScanDir(HWND parent)
256 {
257 BROWSEINFO info;
258
259 info.hwndOwner = parent;
260 info.pidlRoot = NULL;
261 info.pszDisplayName = NULL;
262 info.lpszTitle = "Select the Scan Directory";
263 info.ulFlags = BIF_RETURNONLYFSDIRS | BIF_STATUSTEXT;
264 info.lpfn = browse;
265 info.lParam = MAKELPARAM(number, true);
266 info.iImage = 0;
267
268 do
269 {
270 LPITEMIDLIST id = SHBrowseForFolder(&info);
271
272 if (id != NULL)
273 {
274 char folder[MAX_PATH];
275
276 if (SHGetPathFromIDList(id, folder))
277 {
278 scanDir = folder;
279 }
280 }
281
282 LPMALLOC destruct;
283
284 SHGetMalloc(&destruct);
285 destruct->Free(id);
286 destruct->Release();
287
288 if (scanDir == "")
289 {
290 switch (MessageBox(parent, "Scan Directory needs to be selected.",
291 title.c_str(), MB_ABORTRETRYIGNORE | MB_ICONERROR))
292 {
293 case IDABORT:
294 exit(1);
295 break;
296 case IDRETRY:
297 break;
298 case IDIGNORE:
299 Beep(2200, 250);
300 Beep(1100, 500);
301 Beep(3300, 250);
302 exit(2);
303 break;
304 }
305 }
306 }
307 while (scanDir == "");
308
309 if (debug) cerr << "scanDir = " << scanDir << "\n";
310 }
311
312 void ScanUtility::setSaveDir(HWND parent)
313 {
314 BROWSEINFO info;
315
316 info.hwndOwner = parent;
317 info.pidlRoot = NULL;
318 info.pszDisplayName = NULL;
319 info.lpszTitle = "Select the Save Directory";
320 info.ulFlags = BIF_RETURNONLYFSDIRS | BIF_STATUSTEXT;
321 info.lpfn = browse;
322 info.lParam = MAKELPARAM(number, false);
323 info.iImage = 0;
324
325 do
326 {
327 LPITEMIDLIST id = SHBrowseForFolder(&info);
328
329 if (id != NULL)
330 {
331 char folder[MAX_PATH];
332
333 if (SHGetPathFromIDList(id, folder))
334 {
335 saveDir = folder;
336 }
337 }
338
339 LPMALLOC destruct;
340
341 SHGetMalloc(&destruct);
342 destruct->Free(id);
343 destruct->Release();
344
345 if (saveDir == "")
346 {
347 switch (MessageBox(parent, "Scan Directory needs to be selected.",
348 title.c_str(), MB_ABORTRETRYIGNORE | MB_ICONERROR))
349 {
350 case IDABORT:
351 exit(1);
352 break;
353 case IDRETRY:
354 break;
355 case IDIGNORE:
356 Beep(2200, 250);
357 Beep(1100, 500);
358 Beep(3300, 250);
359 exit(2);
360 break;
361 }
362 }
363 }
364 while (saveDir == "");
365
366 if (debug) cerr << "saveDir = " << saveDir << "\n";
367 }
368
369 void ScanUtility::populate(HWND parent)
370 {
371 set<string> scans;
372
373 do
374 {
375 string scan = scanDir + "\\SCAN????_000." +
376 IndividualClient::getExtension();
377 WIN32_FIND_DATA found;
378 HANDLE finder = FindFirstFile(scan.c_str(), &found);
379
380 if (finder != INVALID_HANDLE_VALUE)
381 {
382 do
383 {
384 scans.insert(found.cFileName);
385 }
386 while (FindNextFile(finder, &found));
387
388 FindClose(finder);
389 }
390
391 if (scans.empty())
392 {
393 if (MessageBox(parent, "No scanned documents found.",
394 title.c_str(), MB_RETRYCANCEL | MB_ICONQUESTION) == IDCANCEL)
395 break;
396 }
397 }
398 while (scans.empty());
399
400 if (scans.empty())
401 {
402 PropSheet_PressButton(GetParent(parent), PSBTN_BACK);
403 }
404 else
405 {
406 SHFILEINFO info;
407 HIMAGELIST icons = HIMAGELIST(SHGetFileInfo((*scans.begin()).c_str(),
408 0, &info, sizeof(info), SHGFI_SMALLICON | SHGFI_SYSICONINDEX));
409
410 ListView_SetImageList(GetDlgItem(parent, IDC_SELECT_SCANS), icons,
411 LVSIL_SMALL);
412
413 if (debug) cerr << "scans = {\n";
414
415 for (set<string>::iterator itor = scans.begin(); itor != scans.end();
416 itor++)
417 {
418 if (debug) cerr << " " << *itor << "\n";
419
420 char scan[MAX_PATH];
421
422 sprintf(scan, "%s", (*itor).c_str());
423
424 LVITEM item;
425
426 item.mask = LVIF_IMAGE | LVIF_TEXT;
427 item.iItem = 0;
428 item.iSubItem = 0;
429 item.pszText = scan;
430 item.iImage = info.iIcon;
431
432 ListView_InsertItem(GetDlgItem(parent, IDC_SELECT_SCANS), &item);
433 }
434
435 if (debug) cerr << "}\n";
436
437 ListView_SetItemState(GetDlgItem(parent, IDC_SELECT_SCANS), 0,
438 LVIS_SELECTED, LVIS_SELECTED);
439 }
440 }
441
442 ScanUtility* ScanUtility::which(HWND window)
443 {
444 map<HWND, ScanUtility*>::iterator itor = windows.find(window);
445
446 return itor->second;
447 }
448
449 ScanUtility* ScanUtility::which(HWND window, LPARAM l)
450 {
451 LPPROPSHEETPAGE page = LPPROPSHEETPAGE(l);
452 map<unsigned, ScanUtility*>::iterator itor = utilities.find(page->lParam);
453
454 windows.insert(pair<HWND, ScanUtility*>(window, itor->second));
455
456 return itor->second;
457 }
458
459 int ScanUtility::browse(HWND dialog, UINT msg, LPARAM l, LPARAM d)
460 {
461 map<unsigned, ScanUtility*>::iterator itor = utilities.find(LOWORD(d));
462 ScanUtility* data = itor->second;
463
464 switch (msg)
465 {
466 case BFFM_INITIALIZED:
467 center(dialog);
468 SendMessage(dialog, BFFM_SETOKTEXT, 0,
469 LPARAM(toWide("&Select").c_str()));
470 SendMessage(dialog, BFFM_SETEXPANDED, FALSE, CSIDL_DRIVES);
471 SendMessage(dialog, BFFM_SETSELECTION, TRUE, LPARAM(HIWORD(d) ?
472 data->scanDir.c_str() : data->saveDir.c_str()));
473 break;
474 case BFFM_SELCHANGED:
475 {
476 IShellFolder* object;
477
478 SHGetDesktopFolder(&object);
479
480 STRRET thing;
481 char* folder;
482
483 object->GetDisplayNameOf(LPCITEMIDLIST(l), SHGDN_FORPARSING,
484 &thing);
485 StrRetToStr(&thing, LPCITEMIDLIST(l), &folder);
486 SendMessage(dialog, BFFM_SETSTATUSTEXT, 0, LPARAM(folder));
487
488 if (PathIsUNCServer(folder))
489 {
490 SendMessage(dialog, BFFM_ENABLEOK, 0, 0);
491 }
492
493 CoTaskMemFree(folder);
494 object->Release();
495 }
496 break;
497 }
498
499 return 0;
500 }
501
502 INT_PTR ScanUtility::start(HWND dialog, UINT msg, WPARAM w, LPARAM l)
503 {
504 ScanUtility* data = which(dialog);
505
506 switch (msg)
507 {
508 case WM_INITDIALOG:
509 center(GetParent(dialog));
510 SendMessage(GetParent(dialog), WM_SETICON, ICON_BIG, LPARAM(gui.icon));
511
512 data = which(dialog, l);
513
514 {
515 ostringstream instructions;
516
517 instructions << "1. If you need instructions, you should not be ru"
518 << "nning this program in Scan Utility mode.\n"
519 << "2. Otherwise, go forth and scan.\n"
520 << "3. Then come back and click Next.\n";
521
522 SetDlgItemText(dialog, IDC_START_INSTRUCTIONS,
523 instructions.str().c_str());
524 }
525 break;
526 case WM_NOTIFY:
527 {
528 LPNMHDR nm = LPNMHDR(l);
529
530 switch (nm->code)
531 {
532 case PSN_SETACTIVE:
533 PropSheet_SetWizButtons(GetParent(dialog), PSWIZB_FINISH |
534 PSWIZB_NEXT);
535
536 {
537 char folder[44];
538
539 PathCompactPathEx(folder, data->scanDir.c_str(), 44, 0);
540 SetDlgItemText(dialog, IDC_START_SCAN_TEXT, folder);
541 PathCompactPathEx(folder, data->saveDir.c_str(), 44, 0);
542 SetDlgItemText(dialog, IDC_START_SAVE_TEXT, folder);
543 }
544 break;
545 case PSN_WIZNEXT:
546 SetCurrentDirectory(data->scanDir.c_str());
547 break;
548 }
549 }
550 break;
551 case WM_COMMAND:
552 switch (LOWORD(w))
553 {
554 case IDC_START_SCAN_BROWSE:
555 data->setScanDir(dialog);
556 {
557 char folder[44];
558
559 PathCompactPathEx(folder, data->scanDir.c_str(), 44, 0);
560 SetDlgItemText(dialog, IDC_START_SCAN_TEXT, folder);
561 }
562 break;
563 case IDC_START_SAVE_BROWSE:
564 data->setSaveDir(dialog);
565 {
566 char folder[44];
567
568 PathCompactPathEx(folder, data->saveDir.c_str(), 44, 0);
569 SetDlgItemText(dialog, IDC_START_SAVE_TEXT, folder);
570 }
571 break;
572 }
573 break;
574 }
575
576 return FALSE;
577 }
578
579 INT_PTR ScanUtility::select(HWND dialog, UINT msg, WPARAM w, LPARAM l)
580 {
581 ScanUtility* data = which(dialog);
582
583 switch (msg)
584 {
585 case WM_INITDIALOG:
586 data = which(dialog, l);
587
588 {
589 ostringstream select;
590
591 select << "Select the scanned document that you need to save.";
592
593 SetDlgItemText(dialog, IDC_SELECT_TEXT, select.str().c_str());
594 }
595
596 {
597 LVCOLUMN column;
598
599 column.mask = LVCF_FMT | LVCF_TEXT | LVCF_WIDTH;
600 column.fmt = LVCFMT_IMAGE;
601 column.cx = 120;
602 column.pszText = "Scanned Documents";
603
604 ListView_InsertColumn(GetDlgItem(dialog, IDC_SELECT_SCANS), 0,
605 &column);
606 }
607 break;
608 case WM_NOTIFY:
609 if (w == IDC_SELECT_SCANS)
610 {
611 LPNMITEMACTIVATE ni = LPNMITEMACTIVATE(l);
612
613 switch (ni->hdr.code)
614 {
615 case NM_DBLCLK:
616 {
617 char scan[MAX_PATH];
618
619 ListView_GetItemText(GetDlgItem(dialog, IDC_SELECT_SCANS),
620 ni->iItem, 0, scan, MAX_PATH);
621 ShellExecute(dialog, NULL, scan, NULL, NULL,
622 SW_SHOWDEFAULT);
623 }
624 break;
625 }
626 }
627 else
628 {
629 LPNMHDR nm = LPNMHDR(l);
630
631 switch (nm->code)
632 {
633 case PSN_SETACTIVE:
634 PropSheet_SetWizButtons(GetParent(dialog), PSWIZB_BACK |
635 PSWIZB_DISABLEDFINISH | PSWIZB_NEXT);
636 data->populate(dialog);
637 break;
638 case PSN_WIZBACK:
639 ListView_DeleteAllItems(GetDlgItem(dialog, IDC_SELECT_SCANS));
640 data->client.setFile("");
641 break;
642 case PSN_WIZNEXT:
643 {
644 int index = ListView_GetNextItem(GetDlgItem(dialog,
645 IDC_SELECT_SCANS), -1, LVNI_SELECTED);
646 char scan[MAX_PATH];
647
648 ListView_GetItemText(GetDlgItem(dialog, IDC_SELECT_SCANS),
649 index, 0, scan, MAX_PATH);
650
651 data->scan = scan;
652 }
653
654 ListView_DeleteAllItems(GetDlgItem(dialog, IDC_SELECT_SCANS));
655
656 if (debug) cerr << "scan = " << data->scan << "\n";
657 break;
658 }
659 }
660 break;
661 case WM_CONTEXTMENU:
662 {
663 char scan[MAX_PATH];
664 POINT spot;
665 LVHITTESTINFO test;
666
667 test.pt.x = GET_X_LPARAM(l);
668 test.pt.y = GET_Y_LPARAM(l);
669
670 ScreenToClient(GetDlgItem(dialog, IDC_SELECT_SCANS), &test.pt);
671 ListView_HitTest(GetDlgItem(dialog, IDC_SELECT_SCANS), &test);
672
673 if (test.iItem != -1)
674 {
675 ListView_GetItemText(GetDlgItem(dialog, IDC_SELECT_SCANS),
676 test.iItem, 0, scan, MAX_PATH);
677
678 spot.x = test.pt.x;
679 spot.y = test.pt.y;
680 }
681 else if (GET_X_LPARAM(l) == -1 && GET_Y_LPARAM(l) == -1)
682 {
683 int index = ListView_GetNextItem(GetDlgItem(dialog,
684 IDC_SELECT_SCANS), -1, LVNI_SELECTED);
685 RECT rect;
686
687 ListView_GetItemText(GetDlgItem(dialog, IDC_SELECT_SCANS),
688 index, 0, scan, MAX_PATH);
689 ListView_EnsureVisible(GetDlgItem(dialog, IDC_SELECT_SCANS),
690 index, FALSE);
691 ListView_GetItemRect(GetDlgItem(dialog, IDC_SELECT_SCANS),
692 index, &rect, LVIR_SELECTBOUNDS);
693
694 spot.x = rect.left;
695 spot.y = rect.top;
696 }
697 else
698 {
699 break;
700 }
701
702 ClientToScreen(GetDlgItem(dialog, IDC_SELECT_SCANS), &spot);
703
704 int code = TrackPopupMenuEx(data->popup, TPM_LEFTALIGN |
705 TPM_TOPALIGN | TPM_NONOTIFY | TPM_RETURNCMD | TPM_RIGHTBUTTON,
706 spot.x, spot.y, GetDlgItem(dialog, IDC_SELECT_SCANS), NULL);
707
708 switch (code)
709 {
710 case 1:
711 ShellExecute(dialog, NULL, scan, NULL, NULL, SW_SHOWDEFAULT);
712 break;
713 case 2:
714 {
715 SHELLEXECUTEINFO info;
716
717 info.cbSize = sizeof(info);
718 info.fMask = SEE_MASK_INVOKEIDLIST;
719 info.hwnd = dialog;
720 info.lpVerb = "properties";
721 info.lpFile = scan;
722 info.lpParameters = NULL;
723 info.lpDirectory = NULL;
724 info.nShow = SW_SHOWDEFAULT;
725 info.lpIDList = NULL;
726
727 ShellExecuteEx(&info);
728 }
729 break;
730 }
731 }
732 break;
733 }
734
735 return FALSE;
736 }
737
738 INT_PTR ScanUtility::enter(HWND dialog, UINT msg, WPARAM w, LPARAM l)
739 {
740 ScanUtility* data = which(dialog);
741
742 switch (msg)
743 {
744 case WM_INITDIALOG:
745 data = which(dialog, l);
746
747 {
748 ostringstream enter;
749
750 enter << "Enter the client name and number.";
751
752 SetDlgItemText(dialog, IDC_ENTER_TEXT, enter.str().c_str());
753 }
754 break;
755 case WM_NOTIFY:
756 {
757 LPNMHDR nm = LPNMHDR(l);
758
759 switch (nm->code)
760 {
761 case PSN_SETACTIVE:
762 if (data->client.getName() != "" && data->client.getNumber() !=
763 0)
764 {
765 PropSheet_SetWizButtons(GetParent(dialog), PSWIZB_BACK |
766 PSWIZB_DISABLEDFINISH | PSWIZB_NEXT);
767 }
768 else
769 {
770 PropSheet_SetWizButtons(GetParent(dialog), PSWIZB_BACK |
771 PSWIZB_DISABLEDFINISH);
772 }
773
774 SetDlgItemText(dialog, IDC_ENTER_NAME,
775 data->client.getName().c_str());
776
777 if (data->client.getNumber() != 0)
778 {
779 SetDlgItemInt(dialog, IDC_ENTER_NUM,
780 data->client.getNumber(), FALSE);
781 }
782 else
783 {
784 SetDlgItemText(dialog, IDC_ENTER_NUM, "");
785 }
786 break;
787 case PSN_WIZBACK:
788 break;
789 case PSN_WIZNEXT:
790 if (debug)
791 {
792 cerr << "client = {\n"
793 << " name = " << data->client.getName() << "\n"
794 << " number = " << data->client.getNumber() << "\n"
795 << " file = " << data->client.getFile() << "\n"
796 << "}\n";
797 }
798
799 data->save = data->saveDir + '\\' + data->client.getFile();
800
801 if (debug) cerr << "save = " << data->save << "\n";
802
803 break;
804 }
805 }
806 break;
807 case WM_COMMAND:
808 switch (LOWORD(w))
809 {
810 case IDC_ENTER_NAME:
811 {
812 char name[BUFSIZ];
813
814 GetDlgItemText(dialog, IDC_ENTER_NAME, name, BUFSIZ);
815
816 if (name != data->client.getName())
817 {
818 data->client.setName(name);
819 }
820 }
821
822 if (data->client.getName() != "" && data->client.getNumber() != 0)
823 {
824 PropSheet_SetWizButtons(GetParent(dialog), PSWIZB_BACK |
825 PSWIZB_DISABLEDFINISH | PSWIZB_NEXT);
826 }
827 else
828 {
829 PropSheet_SetWizButtons(GetParent(dialog), PSWIZB_BACK |
830 PSWIZB_DISABLEDFINISH);
831 }
832 break;
833 case IDC_ENTER_NUM:
834 {
835 unsigned number = GetDlgItemInt(dialog, IDC_ENTER_NUM, NULL,
836 FALSE);
837
838 if (number != data->client.getNumber())
839 {
840 data->client.setNumber(number);
841 }
842 }
843
844 if (data->client.getName() != "" && data->client.getNumber() != 0)
845 {
846 PropSheet_SetWizButtons(GetParent(dialog), PSWIZB_BACK |
847 PSWIZB_DISABLEDFINISH | PSWIZB_NEXT);
848 }
849 else
850 {
851 PropSheet_SetWizButtons(GetParent(dialog), PSWIZB_BACK |
852 PSWIZB_DISABLEDFINISH);
853 }
854 break;
855 }
856 break;
857 }
858
859 return FALSE;
860 }
861
862 INT_PTR ScanUtility::confirm(HWND dialog, UINT msg, WPARAM w, LPARAM l)
863 {
864 ScanUtility* data = which(dialog);
865
866 switch (msg)
867 {
868 case WM_INITDIALOG:
869 data = which(dialog, l);
870
871 {
872 ostringstream confirm;
873
874 confirm << "Confirm the client file\'s name and size.";
875
876 SetDlgItemText(dialog, IDC_CONFIRM_TEXT, confirm.str().c_str());
877 }
878 break;
879 case WM_NOTIFY:
880 {
881 LPNMHDR nm = LPNMHDR(l);
882
883 switch (nm->code)
884 {
885 case PSN_SETACTIVE:
886 CheckDlgButton(dialog, IDC_CONFIRM_GOOD, BST_UNCHECKED);
887 PropSheet_SetWizButtons(GetParent(dialog), PSWIZB_BACK |
888 PSWIZB_DISABLEDFINISH);
889 SetDlgItemText(dialog, IDC_CONFIRM_FILE,
890 data->client.getFile().c_str());
891
892 {
893 HANDLE scan = CreateFile(data->scan.c_str(), GENERIC_READ,
894 FILE_SHARE_READ, NULL, OPEN_EXISTING,
895 FILE_ATTRIBUTE_NORMAL, NULL);
896 DWORD bytes = GetFileSize(scan, NULL);
897
898 CloseHandle(scan);
899
900 ostringstream size;
901
902 size << format(bytes);
903
904 size.setf(ios_base::fixed, ios_base::floatfield);
905 size.precision(2);
906
907 FLOAT megabytes = FLOAT(bytes) / FLOAT(1024 * 1024);
908
909 size << " bytes (" << megabytes << " MB)";
910
911 SetDlgItemText(dialog, IDC_CONFIRM_SIZE,
912 size.str().c_str());
913 }
914 break;
915 case PSN_WIZBACK:
916 break;
917 case PSN_WIZNEXT:
918 if (MoveFile(data->scan.c_str(), data->save.c_str()) == 0)
919 {
920 do
921 {
922 LPVOID message;
923
924 FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER |
925 FORMAT_MESSAGE_FROM_SYSTEM, NULL, GetLastError(),
926 0, LPTSTR(&message), 0, NULL);
927
928 int code = MessageBox(dialog, LPCTSTR(message),
929 data->title.c_str(), MB_RETRYCANCEL |
930 MB_ICONEXCLAMATION);
931
932 LocalFree(message);
933
934 if (code == IDCANCEL)
935 {
936 PropSheet_PressButton(GetParent(dialog),
937 PSBTN_BACK);
938 break;
939 }
940 }
941 while (MoveFileEx(data->scan.c_str(), data->save.c_str(),
942 MOVEFILE_REPLACE_EXISTING) == 0);
943 }
944 break;
945 }
946 }
947 break;
948 case WM_COMMAND:
949 switch (LOWORD(w))
950 {
951 case IDC_CONFIRM_GOOD:
952 if (IsDlgButtonChecked(dialog, IDC_CONFIRM_GOOD) == BST_CHECKED)
953 {
954 PropSheet_SetWizButtons(GetParent(dialog), PSWIZB_BACK |
955 PSWIZB_DISABLEDFINISH | PSWIZB_NEXT);
956 }
957 else
958 {
959 PropSheet_SetWizButtons(GetParent(dialog), PSWIZB_BACK |
960 PSWIZB_DISABLEDFINISH);
961 }
962 break;
963 }
964 break;
965 }
966
967 return FALSE;
968 }
969
970 INT_PTR ScanUtility::done(HWND dialog, UINT msg, WPARAM w, LPARAM l)
971 {
972 ScanUtility* data = which(dialog);
973
974 switch (msg)
975 {
976 case WM_INITDIALOG:
977 data = which(dialog, l);
978
979 {
980 ostringstream done;
981
982 done << "You are done saving the scanned document. Click Finish to"
983 << " exit or click Back to return to the beginning.";
984
985 SetDlgItemText(dialog, IDC_DONE_TEXT, done.str().c_str());
986 }
987 break;
988 case WM_NOTIFY:
989 {
990 LPNMHDR nm = LPNMHDR(l);
991
992 switch (nm->code)
993 {
994 case PSN_SETACTIVE:
995 PropSheet_SetWizButtons(GetParent(dialog), PSWIZB_BACK |
996 PSWIZB_FINISH);
997 break;
998 case PSN_WIZBACK:
999 data->client.setFile("");
1000 PropSheet_SetCurSelByID(GetParent(dialog), IDD_START);
1001 break;
1002 case PSN_WIZFINISH:
1003 break;
1004 }
1005 }
1006 break;
1007 }
1008
1009 return FALSE;
1010 }