ViewVC Help
View File | Revision Log | Show Annotations | Download File | View Changeset | Root Listing
root/proj/trunk/VTBFileUtil2/DiscBrowse.cxx
Revision: 293
Committed: 2003-09-10T19:15:05-07:00 (21 years, 9 months ago) by douglas
File size: 21289 byte(s)
Log Message:
Added Unicode test, changed DiscBrowse::populate() to go back on cancel,
changed debug pause so the program actually exits.

File Contents

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