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 265 by douglas, 2003-08-16T20:55:39-07:00 vs.
Revision 291 by douglas, 2003-09-05T01:57:00-07:00

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

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines