ViewVC Help
View File | Revision Log | Show Annotations | Download File | View Changeset | Root Listing
root/proj/trunk/VTBFileUtil2/DiscBrowse.cxx
(Generate patch)

Comparing trunk/VTBFileUtil2/DiscBrowse.cxx (file contents):
Revision 283 by douglas, 2003-08-28T21:16:30-07:00 vs.
Revision 295 by douglas, 2003-09-11T21:26:54-07:00

# Line 2 | Line 2
2   //
3   // Douglas Thrift
4   //
5 < // $Id: DiscBrowse.cxx,v 1.4 2003/08/29 04:16:30 douglas Exp $
5 > // $Id: DiscBrowse.cxx,v 1.12 2003/09/12 04:26:54 douglas Exp $
6  
7   #include "DiscBrowse.h"
8  
# Line 13 | Line 13 | DiscBrowse::DiscBrowse()
13          browsers.insert(pair<unsigned, DiscBrowse*>(number, this));
14  
15          title = programName + " - Disc Browse";
16
16          popup = CreatePopupMenu();
17  
18          MENUITEMINFO open, separator, properties;
# Line 39 | Line 38 | DiscBrowse::DiscBrowse()
38          InsertMenuItem(popup, 1, TRUE, &separator);
39          InsertMenuItem(popup, 2, TRUE, &properties);
40  
42        numberWidth = 56;
43        nameWidth = 224;
44        fileWidth = 152;
45        sizeWidth = 72;
46
41          // start
42          wizard[0].dwSize = sizeof(wizard[0]);
43          wizard[0].dwFlags = PSP_DEFAULT | PSP_USETITLE | PSP_USEHEADERTITLE |
# Line 127 | Line 121 | void DiscBrowse::loadDir(void)
121  
122                                          ExpandEnvironmentStrings(data, folder, MAX_PATH);
123  
124 <                                        discDir = folder;
124 >                                        discDir = tail(folder);
125                                  }
126                                  break;
127                          case REG_SZ:
128 <                                discDir = data;
128 >                                discDir = tail(data);
129                                  break;
130                          default:
131                                  setDiscDir();
# Line 157 | Line 151 | void DiscBrowse::saveDir(void)
151   {
152          HKEY key;
153  
154 <        if (RegCreateKeyEx(HKEY_CURRENT_USER,
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)
# Line 178 | Line 172 | void DiscBrowse::saveDir(void)
172  
173                  if (discDir != data || type != REG_SZ)
174                  {
175 <                        if (RegSetValueEx(key, "DiscDir", 0, REG_SZ,
175 >                        if (code = RegSetValueEx(key, "DiscDir", 0, REG_SZ,
176                                  LPBYTE(discDir.c_str()), discDir.length() + 1) !=
177                                  ERROR_SUCCESS)
178                          {
179 <                                error();
179 >                                error(NULL, code);
180                          }
181                  }
182  
# Line 190 | Line 184 | void DiscBrowse::saveDir(void)
184          }
185          else
186          {
187 <                error();
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;
# Line 215 | Line 214 | void DiscBrowse::setDiscDir(HWND parent)
214                  {
215                          char folder[MAX_PATH];
216  
217 <                        if (SHGetPathFromIDList(id, folder)) discDir = folder;
219 <                }
217 >                        if (SHGetPathFromIDList(id, folder)) discDir = tail(folder);
218  
219 <                LPMALLOC destruct;
219 >                        LPMALLOC destruct;
220  
221 <                SHGetMalloc(&destruct);
222 <                destruct->Free(id);
223 <                destruct->Release();
221 >                        SHGetMalloc(&destruct);
222 >                        destruct->Free(id);
223 >                        destruct->Release();
224 >                }
225  
226                  if (discDir == "")
227                  {
# Line 248 | Line 247 | void DiscBrowse::setDiscDir(HWND parent)
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 +                        StringCchPrintf(clientFile, MAX_PATH, "%s",
316 +                                client.getFile().c_str());
317 +                        StringCchPrintf(clientNumber, MAX_PATH, "%u", client.getNumber());
318 +                        StringCchPrintf(clientName, MAX_PATH, "%s",
319 +                                client.getName().c_str());
320 +                        StringCchPrintf(clientSize, MAX_PATH, "%.2f MB", FLOAT(bytes) /
321 +                                FLOAT(1024 * 1024));
322 +
323 +                        LVITEM number, name, file, size;
324 +
325 +                        file.mask = LVIF_IMAGE | LVIF_PARAM | LVIF_TEXT;
326 +                        file.iItem = 0;
327 +                        file.iSubItem = 0;
328 +                        file.pszText = clientFile;
329 +                        file.iImage = info.iIcon;
330 +                        file.lParam = bytes;
331 +
332 +                        int item = ListView_InsertItem(GetDlgItem(parent, IDC_BROWSE_DISC),
333 +                                &file);
334 +                        
335 +                        number.mask = LVIF_TEXT;
336 +                        number.iItem = item;
337 +                        number.iSubItem = 1;
338 +                        number.pszText = clientNumber;
339 +                        name.mask = LVIF_TEXT;
340 +                        name.iItem = item;
341 +                        name.iSubItem = 2;
342 +                        name.pszText = clientName;
343 +                        size.mask = LVIF_TEXT;
344 +                        size.iItem = item;
345 +                        size.iSubItem = 3;
346 +                        size.pszText = clientSize;
347 +                        
348 +                        ListView_SetItem(GetDlgItem(parent, IDC_BROWSE_DISC), &number);
349 +                        ListView_SetItem(GetDlgItem(parent, IDC_BROWSE_DISC), &name);
350 +                        ListView_SetItem(GetDlgItem(parent, IDC_BROWSE_DISC), &size);
351 +                }
352 +
353 +                if (debug) cerr << "}\n";
354 +
355 +                Thing thing;
356 +
357 +                sortFile = true, sortNumber = true, sortName = true, sortSize = true;
358 +                thing.index = 1;
359 +                thing.order = sortNumber;
360 +                thing.list = GetDlgItem(parent, IDC_BROWSE_DISC);
361 +                sortNumber = !sortNumber;
362 +
363 +                ListView_SortItemsEx(thing.list, sort, &thing);
364 +        }
365 + }
366 +
367   DiscBrowse* DiscBrowse::which(HWND window)
368   {
369          map<HWND, DiscBrowse*>::iterator itor = windows.find(window);
# Line 277 | Line 393 | int DiscBrowse::browse(HWND dialog, UINT
393                  SendMessage(dialog, BFFM_SETOKTEXT, 0,
394                          LPARAM(toWide("&Select").c_str()));
395                  SendMessage(dialog, BFFM_SETEXPANDED, FALSE, CSIDL_DRIVES);
396 <                SendMessage(dialog, BFFM_SETSELECTION, TRUE,
397 <                        LPARAM(data->discDir.c_str()));
396 >
397 >                if (data->discDir != "")
398 >                {
399 >                        IShellFolder* desktop;
400 >                        LPWSTR path = new WCHAR[data->discDir.length() + 1];
401 >                        LPITEMIDLIST id;
402 >
403 >                        StringCchPrintfW(path, data->discDir.length() + 1, L"%s",
404 >                                toWide(data->discDir).c_str());
405 >
406 >                        if (debug) cerr << "path = " << toAnsi(path) << "\n";
407 >
408 >                        SHGetDesktopFolder(&desktop);
409 >                        desktop->ParseDisplayName(dialog, NULL, path, NULL, &id, NULL);
410 >
411 >                        if (id != NULL)
412 >                        {
413 >                                SendMessage(dialog, BFFM_SETSELECTION, FALSE, LPARAM(id));
414 >
415 >                                LPMALLOC destruct;
416 >
417 >                                SHGetMalloc(&destruct);
418 >                                destruct->Free(id);
419 >                                destruct->Release();
420 >                        }
421 >
422 >                        desktop->Release();
423 >                }
424                  break;
425          case BFFM_SELCHANGED:
426                  {
427 <                        IShellFolder* object;
286 <
287 <                        SHGetDesktopFolder(&object);
427 >                        SHFILEINFO info;
428  
429 <                        STRRET thing;
430 <                        char* folder;
429 >                        SHGetFileInfo(LPCSTR(l), 0, &info, sizeof(info), SHGFI_DISPLAYNAME
430 >                                | SHGFI_PIDL);
431 >                        SendMessage(dialog, BFFM_SETSTATUSTEXT, 0,
432 >                                LPARAM(info.szDisplayName));
433  
434 <                        object->GetDisplayNameOf(LPCITEMIDLIST(l), SHGDN_FORPARSING,
293 <                                &thing);
294 <                        StrRetToStr(&thing, LPCITEMIDLIST(l), &folder);
295 <                        SendMessage(dialog, BFFM_SETSTATUSTEXT, 0, LPARAM(folder));
434 >                        char folder[MAX_PATH];
435  
436 <                        if (PathIsUNCServer(folder))
436 >                        if (!SHGetPathFromIDList(LPCITEMIDLIST(l), folder))
437                          {
438                                  SendMessage(dialog, BFFM_ENABLEOK, 0, 0);
439                          }
440 +                }
441 +                break;
442 +        }
443 +
444 +        return 0;
445 + }
446 +
447 + int DiscBrowse::sort(LPARAM first, LPARAM second, LPARAM l)
448 + {
449 +        Thing* thing = (Thing*)(l);
450 +
451 +        switch (thing->index)
452 +        {
453 +        case 0:
454 +                {
455 +                        char one[MAX_PATH], two[MAX_PATH];
456 +
457 +                        ListView_GetItemText(thing->list, first, 0, one, MAX_PATH);
458 +                        ListView_GetItemText(thing->list, second, 0, two, MAX_PATH);
459  
460 <                        CoTaskMemFree(folder);
461 <                        object->Release();
460 >                        string first = one, second = two;
461 >
462 >                        if (first < second)
463 >                        {
464 >                                return thing->order ? -1 : 1;
465 >                        }
466 >                        else if (first > second)
467 >                        {
468 >                                return thing->order ? 1 : -1;
469 >                        }
470 >                }
471 >                break;
472 >        case 1:
473 >                {
474 >                        char one[MAX_PATH], two[MAX_PATH];
475 >
476 >                        ListView_GetItemText(thing->list, first, 0, one, MAX_PATH);
477 >                        ListView_GetItemText(thing->list, second, 0, two, MAX_PATH);
478 >
479 >                        IndividualClient first(one), second(two);
480 >
481 >                        if (first < second)
482 >                        {
483 >                                return thing->order ? -1 : 1;
484 >                        }
485 >                        else if (first > second)
486 >                        {
487 >                                return thing->order ? 1 : -1;
488 >                        }
489 >                }
490 >                break;
491 >        case 2:
492 >                {
493 >                        char one[MAX_PATH], two[MAX_PATH];
494 >
495 >                        ListView_GetItemText(thing->list, first, 2, one, MAX_PATH);
496 >                        ListView_GetItemText(thing->list, second, 2, two, MAX_PATH);
497 >
498 >                        if (mcLess(one, two))
499 >                        {
500 >                                return thing->order ? -1 : 1;
501 >                        }
502 >                        else if (mcGreater(one, two))
503 >                        {
504 >                                return thing->order ? 1 : -1;
505 >                        }
506 >                }
507 >                break;
508 >        case 3:
509 >                if (first < second)
510 >                {
511 >                        return thing->order ? -1 : 1;
512 >                }
513 >                else if (first > second)
514 >                {
515 >                        return thing->order ? 1 : -1;
516                  }
517                  break;
518          }
# Line 336 | Line 548 | INT_PTR DiscBrowse::start(HWND dialog, U
548                                          SHGetFileInfo(data->discDir.c_str(), 0, &info,
549                                                  sizeof(info), SHGFI_ICONLOCATION);
550  
551 <                                        HICON icon = ExtractAssociatedIcon(gui.instance,
552 <                                                info.szDisplayName, LPWORD(&info.iIcon));
551 >                                        HICON icon = ExtractIcon(gui.instance, info.szDisplayName,
552 >                                                info.iIcon);
553  
554                                          SendDlgItemMessage(dialog, IDC_BEGIN_ICON, STM_SETIMAGE,
555                                                  IMAGE_ICON, LPARAM(icon));
556                                  }
557  
558                                  {
559 <                                        char folder[72];
559 >                                        SHFILEINFO info;
560  
561 <                                        PathCompactPathEx(folder, data->discDir.c_str(), 72, 0);
562 <                                        SetDlgItemText(dialog, IDC_BEGIN_TEXT, folder);
561 >                                        SHGetFileInfo(data->discDir.c_str(), 0, &info,
562 >                                                sizeof(info), SHGFI_DISPLAYNAME);
563 >
564 >                                        SetDlgItemText(dialog, IDC_BEGIN_TEXT, info.szDisplayName);
565                                  }
566                                  break;
567 +                        case PSN_WIZNEXT:
568 +                                SetCurrentDirectory(data->discDir.c_str());
569 +                                break;
570                          }
571                  }
572                  break;
# Line 365 | Line 582 | INT_PTR DiscBrowse::start(HWND dialog, U
582                                  SHGetFileInfo(data->discDir.c_str(), 0, &info, sizeof(info),
583                                          SHGFI_ICONLOCATION);
584  
585 <                                HICON icon = ExtractAssociatedIcon(gui.instance,
586 <                                        info.szDisplayName, LPWORD(&info.iIcon));
585 >                                HICON icon = ExtractIcon(gui.instance, info.szDisplayName,
586 >                                        info.iIcon);
587  
588                                  SendDlgItemMessage(dialog, IDC_BEGIN_ICON, STM_SETIMAGE,
589                                          IMAGE_ICON, LPARAM(icon));
590                          }
591  
592                          {
593 <                                char folder[72];
593 >                                SHFILEINFO info;
594 >
595 >                                SHGetFileInfo(data->discDir.c_str(), 0, &info,
596 >                                        sizeof(info), SHGFI_DISPLAYNAME);
597  
598 <                                PathCompactPathEx(folder, data->discDir.c_str(), 72, 0);
379 <                                SetDlgItemText(dialog, IDC_BEGIN_TEXT, folder);
598 >                                SetDlgItemText(dialog, IDC_BEGIN_TEXT, info.szDisplayName);
599                          }
600                          break;
601                  }
# Line 388 | Line 607 | INT_PTR DiscBrowse::start(HWND dialog, U
607   INT_PTR DiscBrowse::browse(HWND dialog, UINT msg, WPARAM w, LPARAM l)
608   {
609          DiscBrowse* data = which(dialog);
610 +        int previous = -1;
611  
612          switch (msg)
613          {
614          case WM_INITDIALOG:
615                  data = which(dialog, l);
616  
617 +                ListView_SetExtendedListViewStyleEx(GetDlgItem(dialog,
618 +                        IDC_BROWSE_DISC), LVS_EX_FULLROWSELECT | LVS_EX_HEADERDRAGDROP |
619 +                        LVS_EX_LABELTIP, LVS_EX_FULLROWSELECT | LVS_EX_HEADERDRAGDROP |
620 +                        LVS_EX_LABELTIP);
621 +
622                  {
623 <                        LVCOLUMN number, name, file, size;
623 >                        LVCOLUMN file, number, name, size;
624  
625 +                        file.mask = LVCF_FMT | LVCF_TEXT | LVCF_WIDTH;
626 +                        file.fmt = LVCFMT_IMAGE;
627 +                        file.cx = 224;
628 +                        file.pszText = "File Name";
629                          number.mask = LVCF_SUBITEM | LVCF_TEXT | LVCF_WIDTH;
630 <                        number.cx = data->numberWidth;
630 >                        number.cx = 56;
631                          number.pszText = "Number";
632 <                        number.iSubItem = 0;
632 >                        number.iSubItem = 1;
633                          name.mask = LVCF_SUBITEM | LVCF_TEXT | LVCF_WIDTH;
634 <                        name.cx = data->nameWidth;
634 >                        name.cx = 152;
635                          name.pszText = "Client Name";
636 <                        name.iSubItem = 1;
408 <                        file.mask = LVCF_FMT | LVCF_SUBITEM | LVCF_TEXT | LVCF_WIDTH;
409 <                        file.fmt = LVCFMT_IMAGE;
410 <                        file.cx = data->fileWidth;
411 <                        file.pszText = "File Name";
412 <                        file.iSubItem = 2;
636 >                        name.iSubItem = 2;
637                          size.mask = LVCF_SUBITEM | LVCF_TEXT | LVCF_WIDTH;
638 <                        size.cx = data->sizeWidth;
638 >                        size.cx = 68;
639                          size.pszText = "Size";
640                          size.iSubItem = 3;
641  
642                          ListView_InsertColumn(GetDlgItem(dialog, IDC_BROWSE_DISC), 0,
643                                  &file);
420                        ListView_InsertColumn(GetDlgItem(dialog, IDC_BROWSE_DISC), 0,
421                                &number);
644                          ListView_InsertColumn(GetDlgItem(dialog, IDC_BROWSE_DISC), 1,
645 +                                &number);
646 +                        ListView_InsertColumn(GetDlgItem(dialog, IDC_BROWSE_DISC), 2,
647                                  &name);
648                          ListView_InsertColumn(GetDlgItem(dialog, IDC_BROWSE_DISC), 3,
649                                  &size);
650                  }
651 +
652 +                {
653 +                        int columns[4];
654 +
655 +                        columns[0] = 1;
656 +                        columns[1] = 2;
657 +                        columns[2] = 0;
658 +                        columns[3] = 3;
659 +
660 +                        ListView_SetColumnOrderArray(GetDlgItem(dialog, IDC_BROWSE_DISC),
661 +                                4, columns);
662 +                }
663                  break;
664          case WM_NOTIFY:
665                  if (w == IDC_BROWSE_DISC)
# Line 432 | Line 668 | INT_PTR DiscBrowse::browse(HWND dialog,
668  
669                          switch (ni->hdr.code)
670                          {
671 +                        case LVN_COLUMNCLICK:
672 +                                {
673 +                                        Thing thing;
674 +
675 +                                        thing.index = ni->iSubItem;
676 +
677 +                                        switch (thing.index)
678 +                                        {
679 +                                        case 0:
680 +                                                thing.order = data->sortFile;
681 +                                                data->sortFile = !data->sortFile;
682 +                                                break;
683 +                                        case 1:
684 +                                                thing.order = data->sortNumber;
685 +                                                data->sortNumber = !data->sortNumber;
686 +                                                break;
687 +                                        case 2:
688 +                                                thing.order = data->sortName;
689 +                                                data->sortName = !data->sortName;
690 +                                                break;
691 +                                        case 3:
692 +                                                thing.order = data->sortSize;
693 +                                                data->sortSize = !data->sortSize;
694 +                                                break;
695 +                                        }
696 +
697 +                                        thing.list = GetDlgItem(dialog, IDC_BROWSE_DISC);
698 +
699 +                                        if (ni->iSubItem == 3)
700 +                                        {
701 +                                                ListView_SortItems(thing.list, sort, &thing);
702 +                                        }
703 +                                        else
704 +                                        {
705 +                                                ListView_SortItemsEx(thing.list, sort, &thing);
706 +                                        }
707 +                                }
708 +                                break;
709 +                        case LVN_ITEMCHANGED:
710 +                                if (ListView_GetNextItem(GetDlgItem(dialog,     IDC_BROWSE_DISC),
711 +                                        -1, LVNI_SELECTED) != -1)
712 +                                {
713 +                                        EnableWindow(GetDlgItem(dialog, IDC_BROWSE_OPEN), TRUE);
714 +                                        EnableWindow(GetDlgItem(dialog, IDC_BROWSE_PROP), TRUE);
715 +                                }
716 +                                else
717 +                                {
718 +                                        EnableWindow(GetDlgItem(dialog, IDC_BROWSE_OPEN), FALSE);
719 +                                        EnableWindow(GetDlgItem(dialog, IDC_BROWSE_PROP), FALSE);
720 +                                }
721 +                                break;
722                          case NM_DBLCLK:
723 <                                //
723 >                                if (ni->iItem != -1)
724 >                                {
725 >                                        char scan[MAX_PATH];
726 >
727 >                                        ListView_GetItemText(GetDlgItem(dialog, IDC_BROWSE_DISC),
728 >                                                ni->iItem, 0, scan, MAX_PATH);
729 >                                        ShellExecute(dialog, NULL, scan, NULL, NULL,
730 >                                                SW_SHOWDEFAULT);
731 >                                }
732                                  break;
733                          }
734                  }
# Line 446 | Line 741 | INT_PTR DiscBrowse::browse(HWND dialog,
741                          case PSN_SETACTIVE:
742                                  PropSheet_SetWizButtons(GetParent(dialog), PSWIZB_BACK |
743                                          PSWIZB_FINISH);
744 +                                data->populate(dialog);
745 +
746 +                                {
747 +                                        SHFILEINFO info;
748 +
749 +                                        SHGetFileInfo(data->discDir.c_str(), 0, &info,
750 +                                                sizeof(info), SHGFI_ICONLOCATION);
751 +
752 +                                        HICON icon = ExtractIcon(gui.instance, info.szDisplayName,
753 +                                                info.iIcon);
754 +
755 +                                        SendDlgItemMessage(dialog, IDC_BROWSE_ICON, STM_SETIMAGE,
756 +                                                IMAGE_ICON, LPARAM(icon));
757 +                                }
758 +
759 +                                {
760 +                                        SHFILEINFO info;
761 +
762 +                                        SHGetFileInfo(data->discDir.c_str(), 0, &info,
763 +                                                sizeof(info), SHGFI_DISPLAYNAME);
764 +
765 +                                        SetDlgItemText(dialog, IDC_BROWSE_TEXT,
766 +                                                info.szDisplayName);
767 +                                }
768 +                                break;
769 +                        case PSN_WIZBACK:
770 +                                EnableWindow(GetDlgItem(dialog, IDC_BROWSE_OPEN), FALSE);
771 +                                EnableWindow(GetDlgItem(dialog, IDC_BROWSE_PROP), FALSE);
772 +                                ListView_DeleteAllItems(GetDlgItem(dialog, IDC_BROWSE_DISC));
773 +                                break;
774 +                        }
775 +                }
776 +                break;
777 +        case WM_COMMAND:
778 +                switch (LOWORD(w))
779 +                {
780 +                case IDC_BROWSE_REFRESH:
781 +                        EnableWindow(GetDlgItem(dialog, IDC_BROWSE_OPEN), FALSE);
782 +                        EnableWindow(GetDlgItem(dialog, IDC_BROWSE_PROP), FALSE);
783 +                        ListView_DeleteAllItems(GetDlgItem(dialog, IDC_BROWSE_DISC));
784 +                        data->populate(dialog);
785 +
786 +                        {
787 +                                SHFILEINFO info;
788 +
789 +                                SHGetFileInfo(data->discDir.c_str(), 0, &info, sizeof(info),
790 +                                        SHGFI_ICONLOCATION);
791 +
792 +                                HICON icon = ExtractIcon(gui.instance, info.szDisplayName,
793 +                                        info.iIcon);
794 +
795 +                                SendDlgItemMessage(dialog, IDC_BROWSE_ICON, STM_SETIMAGE,
796 +                                        IMAGE_ICON, LPARAM(icon));
797 +                        }
798 +
799 +                        {
800 +                                SHFILEINFO info;
801 +
802 +                                SHGetFileInfo(data->discDir.c_str(), 0, &info, sizeof(info),
803 +                                        SHGFI_DISPLAYNAME);
804 +
805 +                                SetDlgItemText(dialog, IDC_BROWSE_TEXT, info.szDisplayName);
806 +                        }
807 +                        break;
808 +                case IDC_BROWSE_OPEN:
809 +                        do
810 +                        {
811 +                                char scan[MAX_PATH];
812 +                                int index = ListView_GetNextItem(GetDlgItem(dialog,
813 +                                        IDC_BROWSE_DISC), previous, LVNI_SELECTED);
814 +
815 +                                previous = index;
816 +
817 +                                if (previous == -1) continue;
818 +
819 +                                ListView_GetItemText(GetDlgItem(dialog, IDC_BROWSE_DISC),
820 +                                        index, 0, scan, MAX_PATH);
821 +                                ShellExecute(dialog, NULL, scan, NULL, NULL, SW_SHOWDEFAULT);
822 +                        }
823 +                        while (previous != -1);
824 +                        break;
825 +                case IDC_BROWSE_PROP:
826 +                        do
827 +                        {
828 +                                char scan[MAX_PATH];
829 +                                int index = ListView_GetNextItem(GetDlgItem(dialog,
830 +                                        IDC_BROWSE_DISC), previous, LVNI_SELECTED);
831 +
832 +                                previous = index;
833 +
834 +                                if (previous == -1) continue;
835 +
836 +                                ListView_GetItemText(GetDlgItem(dialog, IDC_BROWSE_DISC),
837 +                                        index, 0, scan, MAX_PATH);
838 +
839 +                                SHELLEXECUTEINFO info;
840 +
841 +                                info.cbSize = sizeof(info);
842 +                                info.fMask = SEE_MASK_INVOKEIDLIST;
843 +                                info.hwnd = dialog;
844 +                                info.lpVerb = "properties";
845 +                                info.lpFile = scan;
846 +                                info.lpParameters = NULL;
847 +                                info.lpDirectory = NULL;
848 +                                info.nShow = SW_SHOWDEFAULT;
849 +                                info.lpIDList = NULL;
850 +
851 +                                ShellExecuteEx(&info);
852 +                        }
853 +                        while (previous != -1);
854 +                        break;
855 +                }
856 +                break;
857 +        case WM_CONTEXTMENU:
858 +                if (ListView_GetNextItem(GetDlgItem(dialog, IDC_BROWSE_DISC), -1,
859 +                        LVNI_SELECTED) != -1)
860 +                {
861 +                        POINT spot;
862 +                        LVHITTESTINFO test;
863 +
864 +                        test.pt.x = GET_X_LPARAM(l);
865 +                        test.pt.y = GET_Y_LPARAM(l);
866 +
867 +                        ScreenToClient(GetDlgItem(dialog, IDC_BROWSE_DISC), &test.pt);
868 +                        ListView_HitTest(GetDlgItem(dialog, IDC_BROWSE_DISC), &test);
869 +
870 +                        if (test.iItem != -1)
871 +                        {
872 +                                spot.x = test.pt.x;
873 +                                spot.y = test.pt.y;
874 +                        }
875 +                        else if (GET_X_LPARAM(l) == -1 && GET_Y_LPARAM(l) == -1)
876 +                        {
877 +                                int index = ListView_GetNextItem(GetDlgItem(dialog,
878 +                                        IDC_BROWSE_DISC), -1, LVNI_SELECTED);
879 +                                RECT rect;
880 +
881 +                                ListView_EnsureVisible(GetDlgItem(dialog, IDC_BROWSE_DISC),
882 +                                        index, FALSE);
883 +                                ListView_GetItemRect(GetDlgItem(dialog, IDC_BROWSE_DISC),
884 +                                        index, &rect, LVIR_SELECTBOUNDS);
885 +
886 +                                spot.x = rect.left;
887 +                                spot.y = rect.top;
888 +                        }
889 +
890 +                        ClientToScreen(GetDlgItem(dialog, IDC_BROWSE_DISC), &spot);
891 +
892 +                        int code = TrackPopupMenuEx(data->popup, TPM_LEFTALIGN |
893 +                                TPM_TOPALIGN | TPM_NONOTIFY | TPM_RETURNCMD | TPM_RIGHTBUTTON,
894 +                                spot.x, spot.y, GetDlgItem(dialog, IDC_BROWSE_DISC), NULL);
895 +
896 +                        switch (code)
897 +                        {
898 +                        case 1:
899 +                                do
900 +                                {
901 +                                        char scan[MAX_PATH];
902 +                                        int index = ListView_GetNextItem(GetDlgItem(dialog,
903 +                                                IDC_BROWSE_DISC), previous, LVNI_SELECTED);
904 +
905 +                                        previous = index;
906 +
907 +                                        if (previous == -1) continue;
908 +
909 +                                        ListView_GetItemText(GetDlgItem(dialog, IDC_BROWSE_DISC),
910 +                                                index, 0, scan, MAX_PATH);
911 +                                        ShellExecute(dialog, NULL, scan, NULL, NULL,
912 +                                                SW_SHOWDEFAULT);
913 +                                }
914 +                                while (previous != -1);
915 +                                break;
916 +                        case 2:
917 +                                do
918 +                                {
919 +                                        char scan[MAX_PATH];
920 +                                        int index = ListView_GetNextItem(GetDlgItem(dialog,
921 +                                                IDC_BROWSE_DISC), previous, LVNI_SELECTED);
922 +
923 +                                        previous = index;
924 +
925 +                                        if (previous == -1) continue;
926 +
927 +                                        ListView_GetItemText(GetDlgItem(dialog, IDC_BROWSE_DISC),
928 +                                                index, 0, scan, MAX_PATH);
929 +
930 +                                        SHELLEXECUTEINFO info;
931 +
932 +                                        info.cbSize = sizeof(info);
933 +                                        info.fMask = SEE_MASK_INVOKEIDLIST;
934 +                                        info.hwnd = dialog;
935 +                                        info.lpVerb = "properties";
936 +                                        info.lpFile = scan;
937 +                                        info.lpParameters = NULL;
938 +                                        info.lpDirectory = NULL;
939 +                                        info.nShow = SW_SHOWDEFAULT;
940 +                                        info.lpIDList = NULL;
941 +
942 +                                        ShellExecuteEx(&info);
943 +                                }
944 +                                while (previous != -1);
945                                  break;
946                          }
947                  }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines