From dcc7bb6c0da1327a945e9e64d622d22018039493 Mon Sep 17 00:00:00 2001 From: David Quintana Date: Fri, 2 May 2014 11:58:07 +0000 Subject: [PATCH] [RSHELL] * I forgot a cast and a couple IID_PPV_ARG uncommited. [BROWSEUI] * Fixed rebar flags to match windows. Adds the missing border around the toolbars. * Fix some calculations of the rebar size. * Fetch the icon of the current folder and assign it to the browse window. CORE-7330 svn path=/branches/shell-experiments/; revision=63103 --- base/shell/rshell/CMenuToolbars.cpp | 2 +- base/shell/rshell/CStartMenu.cpp | 4 +- dll/win32/browseui/internettoolbar.cpp | 12 ++-- dll/win32/browseui/shellbrowser.cpp | 92 ++++++++++++++++++-------- 4 files changed, 77 insertions(+), 33 deletions(-) diff --git a/base/shell/rshell/CMenuToolbars.cpp b/base/shell/rshell/CMenuToolbars.cpp index 710b807fef2..f4c282acf4c 100644 --- a/base/shell/rshell/CMenuToolbars.cpp +++ b/base/shell/rshell/CMenuToolbars.cpp @@ -1341,7 +1341,7 @@ HRESULT CMenuSFToolbar::GetShellFolder(DWORD *pdwFlags, LPITEMIDLIST *ppidl, REF pidl = ILClone(m_idList); if (!pidl) { - (*(IUnknown**) ppv)->Release(); + (*reinterpret_cast(ppv))->Release(); return E_FAIL; } } diff --git a/base/shell/rshell/CStartMenu.cpp b/base/shell/rshell/CStartMenu.cpp index 0ee7a7b7709..4edb5ee7182 100644 --- a/base/shell/rshell/CStartMenu.cpp +++ b/base/shell/rshell/CStartMenu.cpp @@ -313,11 +313,11 @@ CStartMenu_Constructor(REFIID riid, void **ppv) /* CLSID_MergedFolder 26fdc864-be88-46e7-9235-032d8ea5162e */ /* IID_IAugmentedShellFolder2 8db3b3f4-6cfe-11d1-8ae9-00c04fd918d0 */ hr = SHGetFolderLocation(NULL, CSIDL_STARTMENU, 0, 0, &pidlStartMenuUser); - hr = shellFolder->BindToObject(pidlStartMenuUser, NULL, IID_IShellFolder, (void**) &psfStartMenuUser); + hr = shellFolder->BindToObject(pidlStartMenuUser, NULL, IID_PPV_ARG(IShellFolder, &psfStartMenuUser)); #if MERGE_FOLDERS hr = SHGetFolderLocation(NULL, CSIDL_COMMON_STARTMENU, 0, 0, &pidlStartMenuAll); - hr = shellFolder->BindToObject(pidlStartMenuAll, NULL, IID_IShellFolder, (void**) &psfStartMenuAll); + hr = shellFolder->BindToObject(pidlStartMenuAll, NULL, IID_PPV_ARG(IShellFolder, &psfStartMenuAll)); IShellFolder * psfMerged; hr = CMergedFolder_Constructor(psfStartMenuUser, psfStartMenuAll, IID_PPV_ARG(IShellFolder, &psfMerged)); diff --git a/dll/win32/browseui/internettoolbar.cpp b/dll/win32/browseui/internettoolbar.cpp index 8a0401dec3d..e80b899409d 100644 --- a/dll/win32/browseui/internettoolbar.cpp +++ b/dll/win32/browseui/internettoolbar.cpp @@ -528,6 +528,9 @@ HRESULT CInternetToolbar::ReserveBorderSpace() if (FAILED(hResult)) return hResult; SendMessage(fMainReBar, RB_SIZETORECT, RBSTR_CHANGERECT, reinterpret_cast(&availableBorderSpace)); + // RBSTR_CHANGERECT does not seem to set the proper size in the rect. + // Let's make sure we fetch the actual size properly. + GetWindowRect(fMainReBar, &availableBorderSpace); neededBorderSpace.left = 0; neededBorderSpace.top = availableBorderSpace.bottom - availableBorderSpace.top; if (!fLocked) @@ -1095,7 +1098,6 @@ HRESULT STDMETHODCALLTYPE CInternetToolbar::SetSite(IUnknown *pUnkSite) HWND ownerWindow; HWND dockContainer; HRESULT hResult; - DWORD style; if (pUnkSite == NULL) { @@ -1125,9 +1127,11 @@ HRESULT STDMETHODCALLTYPE CInternetToolbar::SetSite(IUnknown *pUnkSite) SubclassWindow(dockContainer); // create rebar in dock container - style = WS_VISIBLE | WS_CHILD | WS_CLIPSIBLINGS | WS_CLIPCHILDREN | RBS_VARHEIGHT | - RBS_BANDBORDERS | RBS_REGISTERDROP | RBS_AUTOSIZE | CCS_NODIVIDER | CCS_NOPARENTALIGN | CCS_TOP; - fMainReBar = CreateWindow(REBARCLASSNAMEW, NULL, style, + DWORD style = WS_VISIBLE | WS_BORDER | WS_CHILD | WS_CLIPSIBLINGS | WS_CLIPCHILDREN | + RBS_VARHEIGHT | RBS_BANDBORDERS | RBS_REGISTERDROP | RBS_AUTOSIZE | RBS_DBLCLKTOGGLE | + CCS_NODIVIDER | CCS_NOPARENTALIGN | CCS_TOP; + DWORD exStyle = WS_EX_LEFT | WS_EX_LTRREADING | WS_EX_RIGHTSCROLLBAR | WS_EX_TOOLWINDOW; + fMainReBar = CreateWindowEx(exStyle, REBARCLASSNAMEW, NULL, style, 0, 0, 700, 60, dockContainer, NULL, _AtlBaseModule.GetModuleInstance(), NULL); if (fMainReBar == NULL) return E_FAIL; diff --git a/dll/win32/browseui/shellbrowser.cpp b/dll/win32/browseui/shellbrowser.cpp index c6072b83034..5ce9f793af4 100644 --- a/dll/win32/browseui/shellbrowser.cpp +++ b/dll/win32/browseui/shellbrowser.cpp @@ -23,6 +23,12 @@ #include #include +extern "C" +BOOL WINAPI Shell_GetImageLists( + _In_ HIMAGELIST *phiml, + _In_ HIMAGELIST *phimlSmall + ); + #include "newatlinterfaces.h" /* @@ -708,8 +714,7 @@ CShellBrowser::CShellBrowser() fCurrentDirectoryPIDL = NULL; fStatusBar = NULL; fStatusBarVisible = true; - for (INT x = 0; x < 3; x++) - fClientBars[x].hwnd = NULL; + memset(fClientBars, 0, sizeof(fClientBars)); fCurrentMenuBar = NULL; fHistoryObject = NULL; fHistoryStream = NULL; @@ -920,7 +925,6 @@ long IEGetNameAndFlags(LPITEMIDLIST pidl, SHGDNF uFlags, LPWSTR pszBuf, UINT cch HRESULT CShellBrowser::BrowseToPath(IShellFolder *newShellFolder, LPCITEMIDLIST absolutePIDL, FOLDERSETTINGS *folderSettings, long flags) { - CComPtr oleCommandTarget; CComPtr objectWithSite; CComPtr saveCurrentShellFolder; CComPtr saveCurrentShellView; @@ -1006,10 +1010,6 @@ HRESULT CShellBrowser::BrowseToPath(IShellFolder *newShellFolder, saveCurrentShellView->DestroyViewWindow(); fCurrentShellViewWindow = newShellViewWindow; - // get command target - oleCommandTarget.Release(); - hResult = newShellView->QueryInterface(IID_PPV_ARG(IOleCommandTarget, &oleCommandTarget)); - // no use saveCurrentShellView.Release(); saveCurrentShellFolder.Release(); @@ -1029,7 +1029,18 @@ HRESULT CShellBrowser::BrowseToPath(IShellFolder *newShellFolder, } // completed - FireNavigateComplete(L"c:\\temp"); // TODO: use real path here + nameFlags = SHGDN_FORADDRESSBAR | SHGDN_FORPARSING; + hResult = IEGetNameAndFlags(fCurrentDirectoryPIDL, nameFlags, newTitle, + sizeof(newTitle) / sizeof(wchar_t), NULL); + if (SUCCEEDED(hResult)) + { + FireNavigateComplete(newTitle); + } + else + { + FireNavigateComplete(L"ERROR"); + } + if (fCabinetState.fFullPathTitle) nameFlags = SHGDN_FORADDRESSBAR | SHGDN_FORPARSING; else @@ -1037,8 +1048,27 @@ HRESULT CShellBrowser::BrowseToPath(IShellFolder *newShellFolder, hResult = IEGetNameAndFlags(fCurrentDirectoryPIDL, nameFlags, newTitle, sizeof(newTitle) / sizeof(wchar_t), NULL); if (SUCCEEDED(hResult)) + { SetWindowText(newTitle); + LPCITEMIDLIST pidlChild; + INT index, indexOpen; + HIMAGELIST himlSmall, himlLarge; + + CComPtr sf; + SHBindToParent(absolutePIDL, IID_PPV_ARG(IShellFolder, &sf), &pidlChild); + + index = SHMapPIDLToSystemImageListIndex(sf, pidlChild, &indexOpen); + + Shell_GetImageLists(&himlSmall, &himlLarge); + + HICON icSmall = ImageList_GetIcon(himlSmall, indexOpen, 0); + HICON icLarge = ImageList_GetIcon(himlLarge, indexOpen, 0); + + SendMessage(WM_SETICON, ICON_SMALL, reinterpret_cast(icSmall)); + SendMessage(WM_SETICON, ICON_BIG, reinterpret_cast(icLarge)); + } + // TODO: Update the window icon FireCommandStateChangeAll(); @@ -1303,7 +1333,6 @@ void CShellBrowser::RepositionBars() { RECT clientRect; RECT statusRect; - RECT toolbarRect; int x; GetClientRect(&clientRect); @@ -1319,28 +1348,39 @@ void CShellBrowser::RepositionBars() for (x = 0; x < 3; x++) { - if (fClientBars[x].hwnd == NULL && fClientBars[x].clientBar != NULL) + HWND hwnd = fClientBars[x].hwnd; + RECT borderSpace = fClientBars[x].borderSpace; + if (hwnd == NULL && fClientBars[x].clientBar != NULL) { - IUnknown_GetWindow(fClientBars[x].clientBar, &fClientBars[x].hwnd); + IUnknown_GetWindow(fClientBars[x].clientBar, &hwnd); + fClientBars[x].hwnd = hwnd; } - if (fClientBars[x].hwnd != NULL) + if (hwnd != NULL) { - toolbarRect = clientRect; - if (fClientBars[x].borderSpace.top != 0) - toolbarRect.bottom = toolbarRect.top + fClientBars[x].borderSpace.top; - else if (fClientBars[x].borderSpace.bottom != 0) - toolbarRect.top = toolbarRect.bottom - fClientBars[x].borderSpace.bottom; - if (fClientBars[x].borderSpace.left != 0) - toolbarRect.right = toolbarRect.left + fClientBars[x].borderSpace.left; - else if (fClientBars[x].borderSpace.right != 0) - toolbarRect.left = toolbarRect.right - fClientBars[x].borderSpace.right; - ::SetWindowPos(fClientBars[x].hwnd, NULL, toolbarRect.left, toolbarRect.top, + RECT toolbarRect = clientRect; + if (borderSpace.top != 0) + { + toolbarRect.bottom = toolbarRect.top + borderSpace.top; + clientRect.top += borderSpace.top; + } + else if (borderSpace.bottom != 0) + { + toolbarRect.top = toolbarRect.bottom - borderSpace.bottom; + clientRect.bottom -= borderSpace.bottom; + } + if (borderSpace.left != 0) + { + toolbarRect.right = toolbarRect.left + borderSpace.left; + clientRect.left += borderSpace.left; + } + else if (borderSpace.right != 0) + { + toolbarRect.left = toolbarRect.right - borderSpace.right; + clientRect.right -= borderSpace.right; + } + ::SetWindowPos(hwnd, NULL, toolbarRect.left, toolbarRect.top, toolbarRect.right - toolbarRect.left, toolbarRect.bottom - toolbarRect.top, SWP_NOOWNERZORDER | SWP_NOZORDER); - clientRect.top += fClientBars[x].borderSpace.top; - clientRect.left += fClientBars[x].borderSpace.left; - clientRect.bottom += fClientBars[x].borderSpace.bottom; - clientRect.right += fClientBars[x].borderSpace.right; } } ::SetWindowPos(fCurrentShellViewWindow, NULL, clientRect.left, clientRect.top,