ViewVC Help
View File | Revision Log | Show Annotations | Download File | View Changeset | Root Listing
root/proj/trunk/VTBFileUtil2/DiscBrowse.cxx
Revision: 292
Committed: 2003-09-08T18:43:28-07:00 (21 years, 9 months ago) by douglas
File size: 20964 byte(s)
Log Message:
Should be almost done.

File Contents

# Content
1 // Vance Thrift and Biller File Utility 2
2 //
3 // Douglas Thrift
4 //
5 // $Id: DiscBrowse.cxx,v 1.10 2003/09/09 01:43:28 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 SHFILEINFO info;
283 HIMAGELIST icons =
284 HIMAGELIST(SHGetFileInfo((*clients.begin()).getFile().c_str(),
285 0, &info, sizeof(info), SHGFI_SMALLICON | SHGFI_SYSICONINDEX));
286
287 ListView_SetImageList(GetDlgItem(parent, IDC_BROWSE_DISC), icons,
288 LVSIL_SMALL);
289
290 if (debug) cerr << "clients = {\n";
291
292 for (set<IndividualClient>::iterator itor = clients.begin(); itor !=
293 clients.end(); itor++)
294 {
295 IndividualClient client = *itor;
296
297 if (debug) cerr << " {\n"
298 << " number = " << client.getNumber() << "\n"
299 << " name = " << client.getName() << "\n"
300 << " file = " << client.getFile() << "\n"
301 << " }\n";
302
303 char clientFile[MAX_PATH], clientNumber[MAX_PATH],
304 clientName[MAX_PATH], clientSize[MAX_PATH];
305 HANDLE fileSize = CreateFile(client.getFile().c_str(),
306 GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING,
307 FILE_ATTRIBUTE_NORMAL, NULL);
308 DWORD bytes = GetFileSize(fileSize, NULL);
309
310 CloseHandle(fileSize);
311 sprintf(clientFile, "%s", client.getFile().c_str());
312 sprintf(clientNumber, "%u", client.getNumber());
313 sprintf(clientName, "%s", client.getName().c_str());
314 sprintf(clientSize, "%.2f MB", FLOAT(bytes) / FLOAT(1024 * 1024));
315
316 LVITEM number, name, file, size;
317
318 file.mask = LVIF_IMAGE | LVIF_PARAM | LVIF_TEXT;
319 file.iItem = 0;
320 file.iSubItem = 0;
321 file.pszText = clientFile;
322 file.iImage = info.iIcon;
323 file.lParam = bytes;
324
325 int item = ListView_InsertItem(GetDlgItem(parent, IDC_BROWSE_DISC),
326 &file);
327
328 number.mask = LVIF_TEXT;
329 number.iItem = item;
330 number.iSubItem = 1;
331 number.pszText = clientNumber;
332 name.mask = LVIF_TEXT;
333 name.iItem = item;
334 name.iSubItem = 2;
335 name.pszText = clientName;
336 size.mask = LVIF_TEXT;
337 size.iItem = item;
338 size.iSubItem = 3;
339 size.pszText = clientSize;
340
341 ListView_SetItem(GetDlgItem(parent, IDC_BROWSE_DISC), &number);
342 ListView_SetItem(GetDlgItem(parent, IDC_BROWSE_DISC), &name);
343 ListView_SetItem(GetDlgItem(parent, IDC_BROWSE_DISC), &size);
344 }
345
346 if (debug) cerr << "}\n";
347
348 Thing thing;
349
350 sortFile = true, sortNumber = true, sortName = true, sortSize = true;
351 thing.index = 1;
352 thing.order = sortNumber;
353 thing.list = GetDlgItem(parent, IDC_BROWSE_DISC);
354 sortNumber = !sortNumber;
355
356 ListView_SortItemsEx(thing.list, sort, &thing);
357 }
358 }
359
360 DiscBrowse* DiscBrowse::which(HWND window)
361 {
362 map<HWND, DiscBrowse*>::iterator itor = windows.find(window);
363
364 return itor->second;
365 }
366
367 DiscBrowse* DiscBrowse::which(HWND window, LPARAM l)
368 {
369 LPPROPSHEETPAGE page = LPPROPSHEETPAGE(l);
370 map<unsigned, DiscBrowse*>::iterator itor = browsers.find(page->lParam);
371
372 windows.insert(pair<HWND, DiscBrowse*>(window, itor->second));
373
374 return itor->second;
375 }
376
377 int DiscBrowse::browse(HWND dialog, UINT msg, LPARAM l, LPARAM d)
378 {
379 map<unsigned, DiscBrowse*>::iterator itor = browsers.find(LOWORD(d));
380 DiscBrowse* data = itor->second;
381
382 switch (msg)
383 {
384 case BFFM_INITIALIZED:
385 center(dialog);
386 SendMessage(dialog, BFFM_SETOKTEXT, 0,
387 LPARAM(toWide("&Select").c_str()));
388 SendMessage(dialog, BFFM_SETEXPANDED, FALSE, CSIDL_DRIVES);
389
390 if (data->discDir != "")
391 {
392 IShellFolder* desktop;
393 LPWSTR path = new WCHAR[data->discDir.length() + 1];
394 LPITEMIDLIST id;
395
396 wsprintfW(path, toWide(data->discDir).c_str());
397
398 if (debug) cerr << "path = " << toAnsi(path) << "\n";
399
400 SHGetDesktopFolder(&desktop);
401 desktop->ParseDisplayName(dialog, NULL, path, NULL, &id, NULL);
402
403 if (id != NULL)
404 {
405 SendMessage(dialog, BFFM_SETSELECTION, FALSE, LPARAM(id));
406
407 LPMALLOC destruct;
408
409 SHGetMalloc(&destruct);
410 destruct->Free(id);
411 destruct->Release();
412 }
413
414 desktop->Release();
415 }
416 break;
417 case BFFM_SELCHANGED:
418 {
419 SHFILEINFO info;
420
421 SHGetFileInfo(LPCSTR(l), 0, &info, sizeof(info), SHGFI_DISPLAYNAME
422 | SHGFI_PIDL);
423 SendMessage(dialog, BFFM_SETSTATUSTEXT, 0,
424 LPARAM(info.szDisplayName));
425
426 char folder[MAX_PATH];
427
428 if (!SHGetPathFromIDList(LPCITEMIDLIST(l), folder))
429 {
430 SendMessage(dialog, BFFM_ENABLEOK, 0, 0);
431 }
432 }
433 break;
434 }
435
436 return 0;
437 }
438
439 int DiscBrowse::sort(LPARAM first, LPARAM second, LPARAM l)
440 {
441 Thing* thing = (Thing*)(l);
442
443 switch (thing->index)
444 {
445 case 0:
446 {
447 char one[MAX_PATH], two[MAX_PATH];
448
449 ListView_GetItemText(thing->list, first, 0, one, MAX_PATH);
450 ListView_GetItemText(thing->list, second, 0, two, MAX_PATH);
451
452 string first = one, second = two;
453
454 if (first < second)
455 {
456 return thing->order ? -1 : 1;
457 }
458 else if (first > second)
459 {
460 return thing->order ? 1 : -1;
461 }
462 }
463 break;
464 case 1:
465 {
466 char one[MAX_PATH], two[MAX_PATH];
467
468 ListView_GetItemText(thing->list, first, 0, one, MAX_PATH);
469 ListView_GetItemText(thing->list, second, 0, two, MAX_PATH);
470
471 IndividualClient first(one), second(two);
472
473 if (first < second)
474 {
475 return thing->order ? -1 : 1;
476 }
477 else if (first > second)
478 {
479 return thing->order ? 1 : -1;
480 }
481 }
482 break;
483 case 2:
484 {
485 char one[MAX_PATH], two[MAX_PATH];
486
487 ListView_GetItemText(thing->list, first, 2, one, MAX_PATH);
488 ListView_GetItemText(thing->list, second, 2, two, MAX_PATH);
489
490 if (mcLess(one, two))
491 {
492 return thing->order ? -1 : 1;
493 }
494 else if (mcGreater(one, two))
495 {
496 return thing->order ? 1 : -1;
497 }
498 }
499 break;
500 case 3:
501 if (first < second)
502 {
503 return thing->order ? -1 : 1;
504 }
505 else if (first > second)
506 {
507 return thing->order ? 1 : -1;
508 }
509 break;
510 }
511
512 return 0;
513 }
514
515 INT_PTR DiscBrowse::start(HWND dialog, UINT msg, WPARAM w, LPARAM l)
516 {
517 DiscBrowse* data = which(dialog);
518
519 switch (msg)
520 {
521 case WM_INITDIALOG:
522 center(GetParent(dialog));
523 SendMessage(GetParent(dialog), WM_SETICON, ICON_BIG, LPARAM(gui.icon));
524
525 data = which(dialog, l);
526 break;
527 case WM_NOTIFY:
528 {
529 LPNMHDR nm = LPNMHDR(l);
530
531 switch (nm->code)
532 {
533 case PSN_SETACTIVE:
534 PropSheet_SetWizButtons(GetParent(dialog), PSWIZB_FINISH |
535 PSWIZB_NEXT);
536
537 {
538 SHFILEINFO info;
539
540 SHGetFileInfo(data->discDir.c_str(), 0, &info,
541 sizeof(info), SHGFI_ICONLOCATION);
542
543 HICON icon = ExtractIcon(gui.instance, info.szDisplayName,
544 info.iIcon);
545
546 SendDlgItemMessage(dialog, IDC_BEGIN_ICON, STM_SETIMAGE,
547 IMAGE_ICON, LPARAM(icon));
548 }
549
550 {
551 SHFILEINFO info;
552
553 SHGetFileInfo(data->discDir.c_str(), 0, &info,
554 sizeof(info), SHGFI_DISPLAYNAME);
555
556 SetDlgItemText(dialog, IDC_BEGIN_TEXT, info.szDisplayName);
557 }
558 break;
559 case PSN_WIZNEXT:
560 SetCurrentDirectory(data->discDir.c_str());
561 break;
562 }
563 }
564 break;
565 case WM_COMMAND:
566 switch (LOWORD(w))
567 {
568 case IDC_BEGIN_BROWSE:
569 data->setDiscDir(dialog);
570
571 {
572 SHFILEINFO info;
573
574 SHGetFileInfo(data->discDir.c_str(), 0, &info, sizeof(info),
575 SHGFI_ICONLOCATION);
576
577 HICON icon = ExtractIcon(gui.instance, info.szDisplayName,
578 info.iIcon);
579
580 SendDlgItemMessage(dialog, IDC_BEGIN_ICON, STM_SETIMAGE,
581 IMAGE_ICON, LPARAM(icon));
582 }
583
584 {
585 SHFILEINFO info;
586
587 SHGetFileInfo(data->discDir.c_str(), 0, &info,
588 sizeof(info), SHGFI_DISPLAYNAME);
589
590 SetDlgItemText(dialog, IDC_BEGIN_TEXT, info.szDisplayName);
591 }
592 break;
593 }
594 }
595
596 return FALSE;
597 }
598
599 INT_PTR DiscBrowse::browse(HWND dialog, UINT msg, WPARAM w, LPARAM l)
600 {
601 DiscBrowse* data = which(dialog);
602 int previous = -1;
603
604 switch (msg)
605 {
606 case WM_INITDIALOG:
607 data = which(dialog, l);
608
609 ListView_SetExtendedListViewStyleEx(GetDlgItem(dialog,
610 IDC_BROWSE_DISC), LVS_EX_FULLROWSELECT | LVS_EX_HEADERDRAGDROP |
611 LVS_EX_LABELTIP, LVS_EX_FULLROWSELECT | LVS_EX_HEADERDRAGDROP |
612 LVS_EX_LABELTIP);
613
614 {
615 LVCOLUMN file, number, name, size;
616
617 file.mask = LVCF_FMT | LVCF_TEXT | LVCF_WIDTH;
618 file.fmt = LVCFMT_IMAGE;
619 file.cx = 224;
620 file.pszText = "File Name";
621 number.mask = LVCF_SUBITEM | LVCF_TEXT | LVCF_WIDTH;
622 number.cx = 56;
623 number.pszText = "Number";
624 number.iSubItem = 1;
625 name.mask = LVCF_SUBITEM | LVCF_TEXT | LVCF_WIDTH;
626 name.cx = 152;
627 name.pszText = "Client Name";
628 name.iSubItem = 2;
629 size.mask = LVCF_SUBITEM | LVCF_TEXT | LVCF_WIDTH;
630 size.cx = 68;
631 size.pszText = "Size";
632 size.iSubItem = 3;
633
634 ListView_InsertColumn(GetDlgItem(dialog, IDC_BROWSE_DISC), 0,
635 &file);
636 ListView_InsertColumn(GetDlgItem(dialog, IDC_BROWSE_DISC), 1,
637 &number);
638 ListView_InsertColumn(GetDlgItem(dialog, IDC_BROWSE_DISC), 2,
639 &name);
640 ListView_InsertColumn(GetDlgItem(dialog, IDC_BROWSE_DISC), 3,
641 &size);
642 }
643
644 {
645 int columns[4];
646
647 columns[0] = 1;
648 columns[1] = 2;
649 columns[2] = 0;
650 columns[3] = 3;
651
652 ListView_SetColumnOrderArray(GetDlgItem(dialog, IDC_BROWSE_DISC),
653 4, columns);
654 }
655 break;
656 case WM_NOTIFY:
657 if (w == IDC_BROWSE_DISC)
658 {
659 LPNMITEMACTIVATE ni = LPNMITEMACTIVATE(l);
660
661 switch (ni->hdr.code)
662 {
663 case LVN_COLUMNCLICK:
664 {
665 Thing thing;
666
667 thing.index = ni->iSubItem;
668
669 switch (thing.index)
670 {
671 case 0:
672 thing.order = data->sortFile;
673 data->sortFile = !data->sortFile;
674 break;
675 case 1:
676 thing.order = data->sortNumber;
677 data->sortNumber = !data->sortNumber;
678 break;
679 case 2:
680 thing.order = data->sortName;
681 data->sortName = !data->sortName;
682 break;
683 case 3:
684 thing.order = data->sortSize;
685 data->sortSize = !data->sortSize;
686 break;
687 }
688
689 thing.list = GetDlgItem(dialog, IDC_BROWSE_DISC);
690
691 if (ni->iSubItem == 3)
692 {
693 ListView_SortItems(thing.list, sort, &thing);
694 }
695 else
696 {
697 ListView_SortItemsEx(thing.list, sort, &thing);
698 }
699 }
700 break;
701 case LVN_ITEMCHANGED:
702 if (ListView_GetNextItem(GetDlgItem(dialog, IDC_BROWSE_DISC),
703 -1, LVNI_SELECTED) != -1)
704 {
705 EnableWindow(GetDlgItem(dialog, IDC_BROWSE_OPEN), TRUE);
706 EnableWindow(GetDlgItem(dialog, IDC_BROWSE_PROP), TRUE);
707 }
708 else
709 {
710 EnableWindow(GetDlgItem(dialog, IDC_BROWSE_OPEN), FALSE);
711 EnableWindow(GetDlgItem(dialog, IDC_BROWSE_PROP), FALSE);
712 }
713 break;
714 case NM_DBLCLK:
715 if (ni->iItem != -1)
716 {
717 char scan[MAX_PATH];
718
719 ListView_GetItemText(GetDlgItem(dialog, IDC_BROWSE_DISC),
720 ni->iItem, 0, scan, MAX_PATH);
721 ShellExecute(dialog, NULL, scan, NULL, NULL,
722 SW_SHOWDEFAULT);
723 }
724 break;
725 }
726 }
727 else
728 {
729 LPNMHDR nm = LPNMHDR(l);
730
731 switch (nm->code)
732 {
733 case PSN_SETACTIVE:
734 PropSheet_SetWizButtons(GetParent(dialog), PSWIZB_BACK |
735 PSWIZB_FINISH);
736 data->populate(dialog);
737
738 {
739 SHFILEINFO info;
740
741 SHGetFileInfo(data->discDir.c_str(), 0, &info,
742 sizeof(info), SHGFI_ICONLOCATION);
743
744 HICON icon = ExtractIcon(gui.instance, info.szDisplayName,
745 info.iIcon);
746
747 SendDlgItemMessage(dialog, IDC_BROWSE_ICON, STM_SETIMAGE,
748 IMAGE_ICON, LPARAM(icon));
749 }
750
751 {
752 SHFILEINFO info;
753
754 SHGetFileInfo(data->discDir.c_str(), 0, &info,
755 sizeof(info), SHGFI_DISPLAYNAME);
756
757 SetDlgItemText(dialog, IDC_BROWSE_TEXT,
758 info.szDisplayName);
759 }
760 break;
761 case PSN_WIZBACK:
762 EnableWindow(GetDlgItem(dialog, IDC_BROWSE_OPEN), FALSE);
763 EnableWindow(GetDlgItem(dialog, IDC_BROWSE_PROP), FALSE);
764 ListView_DeleteAllItems(GetDlgItem(dialog, IDC_BROWSE_DISC));
765 break;
766 }
767 }
768 break;
769 case WM_COMMAND:
770 switch (LOWORD(w))
771 {
772 case IDC_BROWSE_REFRESH:
773 EnableWindow(GetDlgItem(dialog, IDC_BROWSE_OPEN), FALSE);
774 EnableWindow(GetDlgItem(dialog, IDC_BROWSE_PROP), FALSE);
775 ListView_DeleteAllItems(GetDlgItem(dialog, IDC_BROWSE_DISC));
776 data->populate(dialog);
777 break;
778 case IDC_BROWSE_OPEN:
779 do
780 {
781 char scan[MAX_PATH];
782 int index = ListView_GetNextItem(GetDlgItem(dialog,
783 IDC_BROWSE_DISC), previous, LVNI_SELECTED);
784
785 previous = index;
786
787 if (previous == -1) continue;
788
789 ListView_GetItemText(GetDlgItem(dialog, IDC_BROWSE_DISC),
790 index, 0, scan, MAX_PATH);
791 ShellExecute(dialog, NULL, scan, NULL, NULL, SW_SHOWDEFAULT);
792 }
793 while (previous != -1);
794 break;
795 case IDC_BROWSE_PROP:
796 do
797 {
798 char scan[MAX_PATH];
799 int index = ListView_GetNextItem(GetDlgItem(dialog,
800 IDC_BROWSE_DISC), previous, LVNI_SELECTED);
801
802 previous = index;
803
804 if (previous == -1) continue;
805
806 ListView_GetItemText(GetDlgItem(dialog, IDC_BROWSE_DISC),
807 index, 0, scan, MAX_PATH);
808
809 SHELLEXECUTEINFO info;
810
811 info.cbSize = sizeof(info);
812 info.fMask = SEE_MASK_INVOKEIDLIST;
813 info.hwnd = dialog;
814 info.lpVerb = "properties";
815 info.lpFile = scan;
816 info.lpParameters = NULL;
817 info.lpDirectory = NULL;
818 info.nShow = SW_SHOWDEFAULT;
819 info.lpIDList = NULL;
820
821 ShellExecuteEx(&info);
822 }
823 while (previous != -1);
824 break;
825 }
826 break;
827 case WM_CONTEXTMENU:
828 if (ListView_GetNextItem(GetDlgItem(dialog, IDC_BROWSE_DISC), -1,
829 LVNI_SELECTED) != -1)
830 {
831 // char scan[MAX_PATH];
832 POINT spot;
833 LVHITTESTINFO test;
834
835 test.pt.x = GET_X_LPARAM(l);
836 test.pt.y = GET_Y_LPARAM(l);
837
838 ScreenToClient(GetDlgItem(dialog, IDC_BROWSE_DISC), &test.pt);
839 ListView_HitTest(GetDlgItem(dialog, IDC_BROWSE_DISC), &test);
840
841 if (test.iItem != -1)
842 {
843 // ListView_GetItemText(GetDlgItem(dialog, IDC_BROWSE_DISC),
844 // test.iItem, 0, scan, MAX_PATH);
845
846 spot.x = test.pt.x;
847 spot.y = test.pt.y;
848 }
849 else if (GET_X_LPARAM(l) == -1 && GET_Y_LPARAM(l) == -1)
850 {
851 int index = ListView_GetNextItem(GetDlgItem(dialog,
852 IDC_BROWSE_DISC), -1, LVNI_SELECTED);
853 RECT rect;
854
855 // ListView_GetItemText(GetDlgItem(dialog, IDC_BROWSE_DISC),
856 // index, 0, scan, MAX_PATH);
857 ListView_EnsureVisible(GetDlgItem(dialog, IDC_BROWSE_DISC),
858 index, FALSE);
859 ListView_GetItemRect(GetDlgItem(dialog, IDC_BROWSE_DISC),
860 index, &rect, LVIR_SELECTBOUNDS);
861
862 spot.x = rect.left;
863 spot.y = rect.top;
864 }
865
866 ClientToScreen(GetDlgItem(dialog, IDC_BROWSE_DISC), &spot);
867
868 int code = TrackPopupMenuEx(data->popup, TPM_LEFTALIGN |
869 TPM_TOPALIGN | TPM_NONOTIFY | TPM_RETURNCMD | TPM_RIGHTBUTTON,
870 spot.x, spot.y, GetDlgItem(dialog, IDC_BROWSE_DISC), NULL);
871
872 switch (code)
873 {
874 case 1:
875 do
876 {
877 char scan[MAX_PATH];
878 int index = ListView_GetNextItem(GetDlgItem(dialog,
879 IDC_BROWSE_DISC), previous, LVNI_SELECTED);
880
881 previous = index;
882
883 if (previous == -1) continue;
884
885 ListView_GetItemText(GetDlgItem(dialog, IDC_BROWSE_DISC),
886 index, 0, scan, MAX_PATH);
887 ShellExecute(dialog, NULL, scan, NULL, NULL,
888 SW_SHOWDEFAULT);
889 }
890 while (previous != -1);
891 break;
892 case 2:
893 do
894 {
895 char scan[MAX_PATH];
896 int index = ListView_GetNextItem(GetDlgItem(dialog,
897 IDC_BROWSE_DISC), previous, LVNI_SELECTED);
898
899 previous = index;
900
901 if (previous == -1) continue;
902
903 ListView_GetItemText(GetDlgItem(dialog, IDC_BROWSE_DISC),
904 index, 0, scan, MAX_PATH);
905
906 SHELLEXECUTEINFO info;
907
908 info.cbSize = sizeof(info);
909 info.fMask = SEE_MASK_INVOKEIDLIST;
910 info.hwnd = dialog;
911 info.lpVerb = "properties";
912 info.lpFile = scan;
913 info.lpParameters = NULL;
914 info.lpDirectory = NULL;
915 info.nShow = SW_SHOWDEFAULT;
916 info.lpIDList = NULL;
917
918 ShellExecuteEx(&info);
919 }
920 while (previous != -1);
921 break;
922 }
923 }
924 break;
925 }
926
927 return FALSE;
928 }