static void on_shell_folder_selection_changed(HWND hDlg, LPNMLISTVIEW lpnm) { if (lpnm->uNewState & LVIS_SELECTED) { psfiSelected = (struct ShellFolderInfo *)lpnm->lParam; EnableWindow(GetDlgItem(hDlg, IDC_LINK_SFPATH), 1); if (strlen(psfiSelected->szLinkTarget)) { WCHAR *link; CheckDlgButton(hDlg, IDC_LINK_SFPATH, BST_CHECKED); EnableWindow(GetDlgItem(hDlg, IDC_EDIT_SFPATH), 1); EnableWindow(GetDlgItem(hDlg, IDC_BROWSE_SFPATH), 1); link = strdupU2W(psfiSelected->szLinkTarget); set_textW(hDlg, IDC_EDIT_SFPATH, link); HeapFree(GetProcessHeap(), 0, link); } else { CheckDlgButton(hDlg, IDC_LINK_SFPATH, BST_UNCHECKED); EnableWindow(GetDlgItem(hDlg, IDC_EDIT_SFPATH), 0); EnableWindow(GetDlgItem(hDlg, IDC_BROWSE_SFPATH), 0); set_text(hDlg, IDC_EDIT_SFPATH, ""); } } else { psfiSelected = NULL; CheckDlgButton(hDlg, IDC_LINK_SFPATH, BST_UNCHECKED); set_text(hDlg, IDC_EDIT_SFPATH, ""); EnableWindow(GetDlgItem(hDlg, IDC_LINK_SFPATH), 0); EnableWindow(GetDlgItem(hDlg, IDC_EDIT_SFPATH), 0); EnableWindow(GetDlgItem(hDlg, IDC_BROWSE_SFPATH), 0); } }
static void update_shell_folder_listview(HWND dialog) { int i; LVITEMW item; LONG lSelected = SendDlgItemMessageW(dialog, IDC_LIST_SFPATHS, LVM_GETNEXTITEM, -1, MAKELPARAM(LVNI_SELECTED,0)); SendDlgItemMessageW(dialog, IDC_LIST_SFPATHS, LVM_DELETEALLITEMS, 0, 0); for (i=0; i<NUM_ELEMS(asfiInfo); i++) { WCHAR buffer[MAX_PATH]; HRESULT hr; LPITEMIDLIST pidlCurrent; /* Some acrobatic to get the localized name of the shell folder */ hr = SHGetFolderLocation(dialog, asfiInfo[i].nFolder, NULL, 0, &pidlCurrent); if (SUCCEEDED(hr)) { LPSHELLFOLDER psfParent; LPCITEMIDLIST pidlLast; hr = SHBindToParent(pidlCurrent, &IID_IShellFolder, (LPVOID*)&psfParent, &pidlLast); if (SUCCEEDED(hr)) { STRRET strRet; hr = IShellFolder_GetDisplayNameOf(psfParent, pidlLast, SHGDN_FORADDRESSBAR, &strRet); if (SUCCEEDED(hr)) { hr = StrRetToBufW(&strRet, pidlLast, buffer, MAX_PATH); } IShellFolder_Release(psfParent); } ILFree(pidlCurrent); } /* If there's a dangling symlink for the current shell folder, SHGetFolderLocation * will fail above. We fall back to the (non-verified) path of the shell folder. */ if (FAILED(hr)) { hr = SHGetFolderPathW(dialog, asfiInfo[i].nFolder|CSIDL_FLAG_DONT_VERIFY, NULL, SHGFP_TYPE_CURRENT, buffer); } item.mask = LVIF_TEXT | LVIF_PARAM; item.iItem = i; item.iSubItem = 0; item.pszText = buffer; item.lParam = (LPARAM)&asfiInfo[i]; SendDlgItemMessageW(dialog, IDC_LIST_SFPATHS, LVM_INSERTITEMW, 0, (LPARAM)&item); item.mask = LVIF_TEXT; item.iItem = i; item.iSubItem = 1; item.pszText = strdupU2W(asfiInfo[i].szLinkTarget); SendDlgItemMessageW(dialog, IDC_LIST_SFPATHS, LVM_SETITEMW, 0, (LPARAM)&item); HeapFree(GetProcessHeap(), 0, item.pszText); } /* Ensure that the previously selected item is selected again. */ if (lSelected >= 0) { item.mask = LVIF_STATE; item.state = LVIS_SELECTED; item.stateMask = LVIS_SELECTED; SendDlgItemMessageW(dialog, IDC_LIST_SFPATHS, LVM_SETITEMSTATE, lSelected, (LPARAM)&item); } }
static int fill_drives_list(HWND dialog) { int count = 0; BOOL drivec_present = FALSE; int i; int prevsel = -1; WINE_TRACE("\n"); updating_ui = TRUE; prevsel = lv_get_curr_select(dialog); /* Clear the listbox */ SendDlgItemMessageW(dialog, IDC_LIST_DRIVES, LVM_DELETEALLITEMS, 0, 0); for(i = 0; i < 26; i++) { LVITEMW item; WCHAR *path; char letter[4]; /* skip over any unused drives */ if (!drives[i].in_use) continue; if (drives[i].letter == 'C') drivec_present = TRUE; letter[0] = 'A' + i; letter[1] = ':'; letter[2] = 0; item.mask = LVIF_TEXT | LVIF_PARAM; item.iItem = count; item.iSubItem = 0; item.pszText = strdupU2W(letter); item.cchTextMax = lstrlenW(item.pszText); item.lParam = (LPARAM) &drives[i]; lv_insert_item(dialog, &item); HeapFree(GetProcessHeap(), 0, item.pszText); path = strdupU2W(drives[i].unixpath ? drives[i].unixpath : ""); lv_set_item_text(dialog, count, 1, path); HeapFree(GetProcessHeap(), 0, path); count++; } WINE_TRACE("loaded %d drives\n", count); /* show the warning if there is no Drive C */ if (!drivec_present) ShowWindow(GetDlgItem(dialog, IDS_DRIVE_NO_C), SW_NORMAL); else ShowWindow(GetDlgItem(dialog, IDS_DRIVE_NO_C), SW_HIDE); lv_set_curr_select(dialog, prevsel == -1 ? 0 : prevsel); updating_ui = FALSE; return count; }