#include <shellapi.h>
#include <htiframe.h>
#include <strsafe.h>
+#include <undocshell.h>
extern HRESULT IUnknown_ShowDW(IUnknown * punk, BOOL fShow);
CComPtr<ITravelLog> fTravelLog;
HMENU fCurrentMenuBar;
CABINETSTATE fCabinetState;
+ GUID fCurrentVertBar; //The guid of the built in vertical bar that is being shown
// The next three fields support persisted history for shell views.
// They do not need to be reference counted.
IOleObject *fHistoryObject;
CShellBrowser();
~CShellBrowser();
- HRESULT Initialize(LPITEMIDLIST pidl, DWORD dwFlags);
+ HRESULT Initialize();
public:
HRESULT BrowseToPIDL(LPCITEMIDLIST pidl, long flags);
HRESULT BrowseToPath(IShellFolder *newShellFolder, LPCITEMIDLIST absolutePIDL,
LRESULT OnInitMenuPopup(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled);
LRESULT OnSetFocus(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled);
LRESULT RelayMsgToShellView(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled);
- LRESULT PropagateMessage(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled);
+ LRESULT OnSettingChange(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled);
LRESULT OnClose(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled);
LRESULT OnFolderOptions(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled);
LRESULT OnMapNetworkDrive(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled);
MESSAGE_HANDLER(WM_MEASUREITEM, RelayMsgToShellView)
MESSAGE_HANDLER(WM_DRAWITEM, RelayMsgToShellView)
MESSAGE_HANDLER(WM_MENUSELECT, RelayMsgToShellView)
- MESSAGE_HANDLER(WM_WININICHANGE, PropagateMessage)
+ MESSAGE_HANDLER(WM_SETTINGCHANGE, OnSettingChange)
COMMAND_ID_HANDLER(IDM_FILE_CLOSE, OnClose)
COMMAND_ID_HANDLER(IDM_TOOLS_FOLDEROPTIONS, OnFolderOptions)
COMMAND_ID_HANDLER(IDM_TOOLS_MAPNETWORKDRIVE, OnMapNetworkDrive)
DSA_Destroy(menuDsa);
}
-HRESULT CShellBrowser::Initialize(LPITEMIDLIST pidl, DWORD dwFlags)
+HRESULT CShellBrowser::Initialize()
{
CComPtr<IPersistStreamInit> persistStreamInit;
HRESULT hResult;
fStatusBarVisible = true;
- // browse
- hResult = BrowseToPIDL(pidl, BTP_UPDATE_NEXT_HISTORY);
- if (FAILED_UNEXPECTEDLY(hResult))
- return hResult;
-
- if ((dwFlags & SBSP_EXPLOREMODE) != NULL)
- ShowBand(CLSID_ExplorerBand, true);
-
ShowWindow(SW_SHOWNORMAL);
+ UpdateWindow();
return S_OK;
}
saveCurrentShellView->DestroyViewWindow();
fCurrentShellViewWindow = newShellViewWindow;
+ if (previousView == NULL)
+ {
+ RepositionBars();
+ }
+
// no use
saveCurrentShellView.Release();
saveCurrentShellFolder.Release();
if (FAILED_UNEXPECTEDLY(hResult))
return hResult;
+ if (vertical)
+ {
+ fCurrentVertBar = classID;
+ FireCommandStateChangeAll();
+ }
+
return S_OK;
}
#endif
// show sheet
+ CStringW strFolderOptions(MAKEINTRESOURCEW(IDS_FOLDER_OPTIONS));
m_PropSheet.dwSize = sizeof(PROPSHEETHEADER);
m_PropSheet.dwFlags = 0;
m_PropSheet.hwndParent = m_hWnd;
m_PropSheet.hInstance = _AtlBaseModule.GetResourceInstance();
- m_PropSheet.pszCaption = _T("Folder Options");
+ m_PropSheet.pszCaption = strFolderOptions;
m_PropSheet.nStartPage = 0;
PropertySheet(&m_PropSheet);
return S_OK;
{
if (uMsg == WM_NCDESTROY)
{
- saveWindowProc = reinterpret_cast<WNDPROC>(::GetWindowLongPtr(hWnd, GWL_WNDPROC));
+ saveWindowProc = reinterpret_cast<WNDPROC>(::GetWindowLongPtr(hWnd, GWLP_WNDPROC));
lResult = pThis->DefWindowProc(uMsg, wParam, lParam);
- if (saveWindowProc == reinterpret_cast<WNDPROC>(::GetWindowLongPtr(hWnd, GWL_WNDPROC)))
- ::SetWindowLongPtr(hWnd, GWL_WNDPROC, (LONG_PTR)pThis->m_pfnSuperWindowProc);
+ if (saveWindowProc == reinterpret_cast<WNDPROC>(::GetWindowLongPtr(hWnd, GWLP_WNDPROC)))
+ ::SetWindowLongPtr(hWnd, GWLP_WNDPROC, (LONG_PTR)pThis->m_pfnSuperWindowProc);
pThis->m_dwState |= WINSTATE_DESTROYED;
}
else
{
case 0x1c: // search
prgCmds->cmdf = OLECMDF_SUPPORTED | OLECMDF_ENABLED;
+ if (IsEqualCLSID(CLSID_SH_SearchBand, fCurrentVertBar) ||
+ IsEqualCLSID(CLSID_SearchBand, fCurrentVertBar) ||
+ IsEqualCLSID(CLSID_IE_SearchBand, fCurrentVertBar) ||
+ IsEqualCLSID(CLSID_FileSearchBand, fCurrentVertBar))
+ {
+ prgCmds->cmdf |= OLECMDF_LATCHED;
+ }
break;
case 0x1d: // history
prgCmds->cmdf = OLECMDF_SUPPORTED | OLECMDF_ENABLED;
+ if (IsEqualCLSID(CLSID_SH_HistBand, fCurrentVertBar))
+ prgCmds->cmdf |= OLECMDF_LATCHED;
break;
case 0x1e: // favorites
prgCmds->cmdf = OLECMDF_SUPPORTED | OLECMDF_ENABLED;
+ if (IsEqualCLSID(CLSID_SH_FavBand, fCurrentVertBar))
+ prgCmds->cmdf |= OLECMDF_LATCHED;
break;
case 0x23: // folders
- prgCmds->cmdf = OLECMDF_SUPPORTED | OLECMDF_ENABLED | OLECMDF_LATCHED;
+ prgCmds->cmdf = OLECMDF_SUPPORTED | OLECMDF_ENABLED;
+ if (IsEqualCLSID(CLSID_ExplorerBand, fCurrentVertBar))
+ prgCmds->cmdf |= OLECMDF_LATCHED;
break;
default:
prgCmds->cmdf = 0;
{
switch (nCmdID)
{
- case 0x23:
- hResult = ShowBand(CLSID_ExplorerBand, true);
+ case 0x1c: //Toggle Search
+ if (IsEqualCLSID(CLSID_SH_SearchBand, fCurrentVertBar) ||
+ IsEqualCLSID(CLSID_SearchBand, fCurrentVertBar) ||
+ IsEqualCLSID(CLSID_IE_SearchBand, fCurrentVertBar) ||
+ IsEqualCLSID(CLSID_FileSearchBand, fCurrentVertBar))
+ {
+ hResult = IUnknown_ShowDW(fClientBars[BIVerticalBaseBar].clientBar.p, FALSE);
+ memset(&fCurrentVertBar, 0, sizeof(fCurrentVertBar));
+ FireCommandStateChangeAll();
+ }
+ else
+ {
+ OnSearch();
+ }
+ return S_OK;
+ case 0x1d: //Toggle History
+ case 0x1e: //Toggle Favorites
+ case 0x23: //Toggle Folders
+ const GUID* pclsid;
+ if (nCmdID == 0x1d) pclsid = &CLSID_SH_HistBand;
+ else if (nCmdID == 0x1e) pclsid = &CLSID_SH_FavBand;
+ else pclsid = &CLSID_ExplorerBand;
+
+ if (IsEqualCLSID(*pclsid, fCurrentVertBar))
+ {
+ hResult = IUnknown_ShowDW(fClientBars[BIVerticalBaseBar].clientBar.p, FALSE);
+ memset(&fCurrentVertBar, 0, sizeof(fCurrentVertBar));
+ FireCommandStateChangeAll();
+ }
+ else
+ {
+ hResult = ShowBand(*pclsid, true);
+ }
+ return S_OK;
+ case 0x22:
+ //Sent when a band closes
+ if (V_VT(pvaIn) != VT_UNKNOWN)
+ return E_INVALIDARG;
+
+ if (IUnknownIsEqual(V_UNKNOWN(pvaIn), fClientBars[BIVerticalBaseBar].clientBar.p))
+ {
+ memset(&fCurrentVertBar, 0, sizeof(fCurrentVertBar));
+ FireCommandStateChangeAll();
+ }
return S_OK;
case 0x27:
if (nCmdexecopt == 1)
break;
}
}
- else if (IsEqualIID(*pguidCmdGroup, CLSID_CommonButtons))
- {
- // Windows seems to use this as proxy for toolbar buttons.
- // We use it for search band for now to remove code duplication,
- // let's see if it could be useful in the future.
- switch (nCmdID)
- {
- case 0x123:
- // Show search band from toolbar
- OnSearch();
- return S_OK;
- }
- return E_NOTIMPL;
- }
else
{
return E_NOTIMPL;
if ((wFlags & SBSP_EXPLOREMODE) != NULL)
ShowBand(CLSID_ExplorerBand, true);
- return BrowseToPIDL(pidl, BTP_UPDATE_CUR_HISTORY | BTP_UPDATE_NEXT_HISTORY);
+ long flags = BTP_UPDATE_NEXT_HISTORY;
+ if (fTravelLog)
+ flags |= BTP_UPDATE_CUR_HISTORY;
+ return BrowseToPIDL(pidl, flags);
}
HRESULT STDMETHODCALLTYPE CShellBrowser::GetViewStateStream(DWORD grfMode, IStream **ppStrm)
SHEnableMenuItem(theMenu, IDM_TOOLS_MAPNETWORKDRIVE, FALSE);
SHEnableMenuItem(theMenu, IDM_TOOLS_DISCONNECTNETWORKDRIVE, FALSE);
SHEnableMenuItem(theMenu, IDM_TOOLS_SYNCHRONIZE, FALSE);
- FIXME("Folder options dialog is stubbed: CORE-11141\n");
- SHEnableMenuItem(theMenu, IDM_TOOLS_FOLDEROPTIONS, FALSE); // Remove when CORE-11141 is fixed.
menuIndex = 4;
}
else if (theMenu == SHGetMenuFromID(fCurrentMenuBar, FCIDM_MENU_HELP))
return 0;
}
-LRESULT CShellBrowser::PropagateMessage(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
+LRESULT CShellBrowser::OnSettingChange(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
{
+ LPVOID lpEnvironment;
+ RegenerateUserEnvironment(&lpEnvironment, TRUE);
+
SHPropagateMessage(m_hWnd, uMsg, wParam, lParam, TRUE);
return 0;
}
return 0;
}
-HRESULT CShellBrowser_CreateInstance(LPITEMIDLIST pidl, DWORD dwFlags, REFIID riid, void **ppv)
+HRESULT CShellBrowser_CreateInstance(REFIID riid, void **ppv)
{
- return ShellObjectCreatorInit<CShellBrowser>(pidl, dwFlags, riid, ppv);
+ return ShellObjectCreatorInit<CShellBrowser>(riid, ppv);
}