From 8266299b0e0837754408ca9aebfe20aa5cc1045a Mon Sep 17 00:00:00 2001 From: Andrew Hill Date: Sat, 31 Oct 2009 14:25:45 +0000 Subject: [PATCH] [browseui, shell32, explorer_new, include] - Convert browseui to C++/ATL. As part of this, classes in browseui and now registered with .rgs files. - Add AddressBand, AddressEditBox, BandProxy, BaseBar, BaseBarSite, BrandBand, InternetToolbar, ShellBrowser, ToolsBand, and TravelLog. - Add stub implementations of commonbrowser, globalfoldersettings, and regtreeoptions. - Clean up some msvc compile problems in a few files. - Reorganize some headers to make them better match the Platform SDK. - Move InlineIsEqualGUID to guiddef.h. - Create new header files shlguid_undoc.h, shlobj_undoc.h, and shlwapi_undoc.h to hold undocumented types, functions, and GUIDs. - Move some undocumented definitions declared in explorer_new/todo.h and undoc.h to new headers. - Rename a few interfaces in explorer_new to the correct name - Add definition of RBSTR_CHANGERECT to commctrl.h - IDeskBarClient inherits from IOleWindow, not IUnknown - HMONITOR was declared in both dxsdk/axextend.idl and wine/wined3d.idl, but not in wtypes.idl where it belongs - Added Init and Term to CComModule - Thanks to encoded for solving the browseui linking problem! svn path=/trunk/; revision=43872 --- reactos/base/shell/explorer-new/precomp.h | 2 + reactos/base/shell/explorer-new/startmnu.c | 52 +- reactos/base/shell/explorer-new/taskband.c | 40 +- reactos/base/shell/explorer-new/tbsite.c | 20 +- reactos/base/shell/explorer-new/todo.h | 25 - reactos/base/shell/explorer-new/undoc.h | 241 -- reactos/dll/win32/browseui/aclmulti.c | 331 -- reactos/dll/win32/browseui/aclmulti.cpp | 159 + reactos/dll/win32/browseui/aclmulti.h | 77 + reactos/dll/win32/browseui/addressband.cpp | 509 +++ reactos/dll/win32/browseui/addressband.h | 135 + reactos/dll/win32/browseui/addresseditbox.cpp | 191 + reactos/dll/win32/browseui/addresseditbox.h | 112 + reactos/dll/win32/browseui/bandproxy.cpp | 161 + reactos/dll/win32/browseui/bandproxy.h | 54 + reactos/dll/win32/browseui/bandsite.c | 1122 ------ reactos/dll/win32/browseui/bandsite.cpp | 844 +++++ reactos/dll/win32/browseui/bandsite.h | 154 + reactos/dll/win32/browseui/bandsitemenu.c | 132 - reactos/dll/win32/browseui/bandsitemenu.cpp | 73 + reactos/dll/win32/browseui/bandsitemenu.h | 60 + reactos/dll/win32/browseui/basebar.cpp | 549 +++ reactos/dll/win32/browseui/basebarsite.cpp | 485 +++ reactos/dll/win32/browseui/brandband.cpp | 483 +++ reactos/dll/win32/browseui/brandband.h | 132 + reactos/dll/win32/browseui/browseui.cpp | 128 + reactos/dll/win32/browseui/browseui.h | 30 - reactos/dll/win32/browseui/browseui.rbuild | 38 +- reactos/dll/win32/browseui/browseui.rc | 78 + reactos/dll/win32/browseui/browseui.spec | 37 +- reactos/dll/win32/browseui/browseui_main.c | 218 -- reactos/dll/win32/browseui/browseuiord.cpp | 302 ++ reactos/dll/win32/browseui/commonbrowser.cpp | 661 ++++ reactos/dll/win32/browseui/commonbrowser.h | 210 ++ .../win32/browseui/globalfoldersettings.cpp | 51 + .../dll/win32/browseui/globalfoldersettings.h | 48 + .../dll/win32/browseui/internettoolbar.cpp | 1553 ++++++++ reactos/dll/win32/browseui/internettoolbar.h | 243 ++ reactos/dll/win32/browseui/lang/en-US.rc | 273 ++ reactos/dll/win32/browseui/newatlinterfaces.h | 90 + reactos/dll/win32/browseui/regsvr.c | 505 --- reactos/dll/win32/browseui/regtreeoptions.cpp | 71 + reactos/dll/win32/browseui/regtreeoptions.h | 56 + .../dll/win32/browseui/res/addressband.rgs | 18 + .../dll/win32/browseui/res/addresseditbox.rgs | 13 + .../browseui/res/autocompletecontainer.rgs | 13 + reactos/dll/win32/browseui/res/bandproxy.rgs | 13 + .../dll/win32/browseui/res/bandsitemenu.rgs | 13 + reactos/dll/win32/browseui/res/brandband.rgs | 13 + .../dll/win32/browseui/res/commonbrowser.rgs | 13 + .../browseui/res/globalfoldersettings.rgs | 13 + .../win32/browseui/res/internettoolbar.rgs | 13 + .../dll/win32/browseui/res/rebarbandsite.rgs | 13 + .../dll/win32/browseui/res/regtreeoptions.rgs | 13 + reactos/dll/win32/browseui/resource.h | 100 + reactos/dll/win32/browseui/shellbrowser.cpp | 3224 +++++++++++++++++ reactos/dll/win32/browseui/toolsband.cpp | 428 +++ reactos/dll/win32/browseui/travellog.cpp | 592 +++ reactos/dll/win32/browseui/utility.cpp | 14 + reactos/dll/win32/browseui/utility.h | 8 + reactos/dll/win32/shell32/desktop.c | 14 +- reactos/dll/win32/shell32/precomp.h | 2 + reactos/dll/win32/shell32/she_ocmenu.c | 20 +- reactos/dll/win32/shell32/shellitem.c | 2 +- reactos/dll/win32/shell32/shelllink.c | 16 +- reactos/dll/win32/shell32/shellord.c | 2 +- reactos/dll/win32/shell32/shfldr_desktop.c | 4 +- .../dll/win32/shell32/shfldr_mydocuments.c | 2 +- reactos/dll/win32/shell32/shfldr_netplaces.c | 2 +- reactos/dll/win32/shell32/shfldr_recyclebin.c | 8 +- reactos/dll/win32/shell32/shv_item_new.c | 4 +- reactos/dll/win32/shell32/startmenu.c | 6 +- reactos/dll/win32/shell32/stubs.c | 37 +- reactos/dll/win32/shell32/undocshell.h | 25 - reactos/include/dxsdk/axextend.idl | 4 - reactos/include/psdk/commctrl.h | 2 + reactos/include/psdk/guiddef.h | 10 + reactos/include/psdk/shlguid.h | 19 +- reactos/include/psdk/shlguid_undoc.h | 77 + reactos/include/psdk/shlobj.h | 80 +- reactos/include/psdk/shlobj_undoc.h | 828 +++++ reactos/include/psdk/shlwapi_undoc.h | 78 + reactos/include/psdk/shobjidl.idl | 855 +++++ reactos/include/psdk/wtypes.idl | 34 + reactos/include/reactos/wine/wined3d.idl | 1 - reactos/lib/atl/atlbase.h | 54 +- reactos/lib/sdk/uuid/uuid.c | 1 + 87 files changed, 14631 insertions(+), 2805 deletions(-) delete mode 100644 reactos/dll/win32/browseui/aclmulti.c create mode 100644 reactos/dll/win32/browseui/aclmulti.cpp create mode 100644 reactos/dll/win32/browseui/aclmulti.h create mode 100644 reactos/dll/win32/browseui/addressband.cpp create mode 100644 reactos/dll/win32/browseui/addressband.h create mode 100644 reactos/dll/win32/browseui/addresseditbox.cpp create mode 100644 reactos/dll/win32/browseui/addresseditbox.h create mode 100644 reactos/dll/win32/browseui/bandproxy.cpp create mode 100644 reactos/dll/win32/browseui/bandproxy.h delete mode 100644 reactos/dll/win32/browseui/bandsite.c create mode 100644 reactos/dll/win32/browseui/bandsite.cpp create mode 100644 reactos/dll/win32/browseui/bandsite.h delete mode 100644 reactos/dll/win32/browseui/bandsitemenu.c create mode 100644 reactos/dll/win32/browseui/bandsitemenu.cpp create mode 100644 reactos/dll/win32/browseui/bandsitemenu.h create mode 100644 reactos/dll/win32/browseui/basebar.cpp create mode 100644 reactos/dll/win32/browseui/basebarsite.cpp create mode 100644 reactos/dll/win32/browseui/brandband.cpp create mode 100644 reactos/dll/win32/browseui/brandband.h create mode 100644 reactos/dll/win32/browseui/browseui.cpp delete mode 100644 reactos/dll/win32/browseui/browseui.h create mode 100644 reactos/dll/win32/browseui/browseui.rc delete mode 100644 reactos/dll/win32/browseui/browseui_main.c create mode 100644 reactos/dll/win32/browseui/browseuiord.cpp create mode 100644 reactos/dll/win32/browseui/commonbrowser.cpp create mode 100644 reactos/dll/win32/browseui/commonbrowser.h create mode 100644 reactos/dll/win32/browseui/globalfoldersettings.cpp create mode 100644 reactos/dll/win32/browseui/globalfoldersettings.h create mode 100644 reactos/dll/win32/browseui/internettoolbar.cpp create mode 100644 reactos/dll/win32/browseui/internettoolbar.h create mode 100644 reactos/dll/win32/browseui/lang/en-US.rc create mode 100644 reactos/dll/win32/browseui/newatlinterfaces.h delete mode 100644 reactos/dll/win32/browseui/regsvr.c create mode 100644 reactos/dll/win32/browseui/regtreeoptions.cpp create mode 100644 reactos/dll/win32/browseui/regtreeoptions.h create mode 100644 reactos/dll/win32/browseui/res/addressband.rgs create mode 100644 reactos/dll/win32/browseui/res/addresseditbox.rgs create mode 100644 reactos/dll/win32/browseui/res/autocompletecontainer.rgs create mode 100644 reactos/dll/win32/browseui/res/bandproxy.rgs create mode 100644 reactos/dll/win32/browseui/res/bandsitemenu.rgs create mode 100644 reactos/dll/win32/browseui/res/brandband.rgs create mode 100644 reactos/dll/win32/browseui/res/commonbrowser.rgs create mode 100644 reactos/dll/win32/browseui/res/globalfoldersettings.rgs create mode 100644 reactos/dll/win32/browseui/res/internettoolbar.rgs create mode 100644 reactos/dll/win32/browseui/res/rebarbandsite.rgs create mode 100644 reactos/dll/win32/browseui/res/regtreeoptions.rgs create mode 100644 reactos/dll/win32/browseui/resource.h create mode 100644 reactos/dll/win32/browseui/shellbrowser.cpp create mode 100644 reactos/dll/win32/browseui/toolsband.cpp create mode 100644 reactos/dll/win32/browseui/travellog.cpp create mode 100644 reactos/dll/win32/browseui/utility.cpp create mode 100644 reactos/dll/win32/browseui/utility.h create mode 100644 reactos/include/psdk/shlguid_undoc.h create mode 100644 reactos/include/psdk/shlobj_undoc.h create mode 100644 reactos/include/psdk/shlwapi_undoc.h diff --git a/reactos/base/shell/explorer-new/precomp.h b/reactos/base/shell/explorer-new/precomp.h index 4e06cb6c5b8..64f3ce706ed 100644 --- a/reactos/base/shell/explorer-new/precomp.h +++ b/reactos/base/shell/explorer-new/precomp.h @@ -6,9 +6,11 @@ #include #include #include +#include #include #include #include +#include #include #include #include diff --git a/reactos/base/shell/explorer-new/startmnu.c b/reactos/base/shell/explorer-new/startmnu.c index ae199a23a6f..f03a6774c03 100644 --- a/reactos/base/shell/explorer-new/startmnu.c +++ b/reactos/base/shell/explorer-new/startmnu.c @@ -288,14 +288,14 @@ CreateStartContextMenu(IN HWND hWndOwner, static const IStartMenuSiteVtbl IStartMenuSiteImpl_Vtbl; static const IServiceProviderVtbl IServiceProviderImpl_Vtbl; -static const IStartMenuCallbackVtbl IStartMenuCallbackImpl_Vtbl; +static const ITrayPrivVtbl ITrayPrivImpl_Vtbl; static const IOleCommandTargetVtbl IOleCommandTargetImpl_Vtbl; typedef struct { const IStartMenuSiteVtbl *lpVtbl; const IServiceProviderVtbl *lpServiceProviderVtbl; - const IStartMenuCallbackVtbl *lpStartMenuCallbackVtbl; + const ITrayPrivVtbl *lpStartMenuCallbackVtbl; const IOleCommandTargetVtbl *lpOleCommandTargetVtbl; LONG Ref; @@ -310,7 +310,7 @@ IUnknown_from_IStartMenuSiteImpl(IStartMenuSiteImpl *This) IMPL_CASTS(IStartMenuSite, IStartMenuSite, lpVtbl) IMPL_CASTS(IServiceProvider, IStartMenuSite, lpServiceProviderVtbl) -IMPL_CASTS(IStartMenuCallback, IStartMenuSite, lpStartMenuCallbackVtbl) +IMPL_CASTS(ITrayPriv, IStartMenuSite, lpStartMenuCallbackVtbl) IMPL_CASTS(IOleCommandTarget, IStartMenuSite, lpOleCommandTargetVtbl) /*******************************************************************/ @@ -368,11 +368,11 @@ IStartMenuSiteImpl_QueryInterface(IN OUT IStartMenuSite *iface, *ppvObj = IServiceProvider_from_IStartMenuSiteImpl(This); } else if (IsEqualIID(riid, - &IID_IStartMenuCallback) || + &IID_ITrayPriv) || IsEqualIID(riid, &IID_IOleWindow)) { - *ppvObj = IStartMenuCallback_from_IStartMenuSiteImpl(This); + *ppvObj = ITrayPriv_from_IStartMenuSiteImpl(This); } else if (IsEqualIID(riid, &IID_IOleCommandTarget)) @@ -440,16 +440,16 @@ static const IServiceProviderVtbl IServiceProviderImpl_Vtbl = /*******************************************************************/ -METHOD_IUNKNOWN_INHERITED_ADDREF(IStartMenuCallback, IStartMenuSite) -METHOD_IUNKNOWN_INHERITED_RELEASE(IStartMenuCallback, IStartMenuSite) -METHOD_IUNKNOWN_INHERITED_QUERYINTERFACE(IStartMenuCallback, IStartMenuSite) +METHOD_IUNKNOWN_INHERITED_ADDREF(ITrayPriv, IStartMenuSite) +METHOD_IUNKNOWN_INHERITED_RELEASE(ITrayPriv, IStartMenuSite) +METHOD_IUNKNOWN_INHERITED_QUERYINTERFACE(ITrayPriv, IStartMenuSite) static HRESULT STDMETHODCALLTYPE -IStartMenuSiteImpl_GetWindow(IN OUT IStartMenuCallback *iface, +IStartMenuSiteImpl_GetWindow(IN OUT ITrayPriv *iface, OUT HWND *phwnd) { - IStartMenuSiteImpl *This = IStartMenuSiteImpl_from_IStartMenuCallback(iface); - DbgPrint("IStartMenuCallback::GetWindow\n"); + IStartMenuSiteImpl *This = IStartMenuSiteImpl_from_ITrayPriv(iface); + DbgPrint("ITrayPriv::GetWindow\n"); *phwnd = ITrayWindow_GetHWND(This->Tray); if (*phwnd != NULL) @@ -459,24 +459,24 @@ IStartMenuSiteImpl_GetWindow(IN OUT IStartMenuCallback *iface, } static HRESULT STDMETHODCALLTYPE -IStartMenuSiteImpl_ContextSensitiveHelp(IN OUT IStartMenuCallback *iface, +IStartMenuSiteImpl_ContextSensitiveHelp(IN OUT ITrayPriv *iface, IN BOOL fEnterMode) { - DbgPrint("IStartMenuCallback::ContextSensitiveHelp\n"); + DbgPrint("ITrayPriv::ContextSensitiveHelp\n"); return E_NOTIMPL; } static HRESULT STDMETHODCALLTYPE -IStartMenuSiteImpl_Execute(IN OUT IStartMenuCallback *iface, +IStartMenuSiteImpl_Execute(IN OUT ITrayPriv *iface, IN IShellFolder *pShellFolder, IN LPCITEMIDLIST pidl) { HMODULE hShlwapi; HRESULT ret = S_FALSE; - IStartMenuSiteImpl *This = IStartMenuSiteImpl_from_IStartMenuCallback(iface); + IStartMenuSiteImpl *This = IStartMenuSiteImpl_from_ITrayPriv(iface); - DbgPrint("IStartMenuCallback::Execute\n"); + DbgPrint("ITrayPriv::Execute\n"); hShlwapi = GetModuleHandle(TEXT("SHLWAPI.DLL")); if (hShlwapi != NULL) @@ -498,13 +498,13 @@ IStartMenuSiteImpl_Execute(IN OUT IStartMenuCallback *iface, } static HRESULT STDMETHODCALLTYPE -IStartMenuSiteImpl_Unknown(IN OUT IStartMenuCallback *iface, +IStartMenuSiteImpl_Unknown(IN OUT ITrayPriv *iface, IN PVOID Unknown1, IN PVOID Unknown2, IN PVOID Unknown3, IN PVOID Unknown4) { - DbgPrint("IStartMenuCallback::Unknown(0x%p,0x%p,0x%p,0x%p)\n", Unknown1, Unknown2, Unknown3, Unknown4); + DbgPrint("ITrayPriv::Unknown(0x%p,0x%p,0x%p,0x%p)\n", Unknown1, Unknown2, Unknown3, Unknown4); return E_NOTIMPL; } @@ -525,7 +525,7 @@ ShowSynchronizeMenuItem(VOID) } static HRESULT STDMETHODCALLTYPE -IStartMenuSiteImpl_AppendMenu(IN OUT IStartMenuCallback *iface, +IStartMenuSiteImpl_AppendMenu(IN OUT ITrayPriv *iface, OUT HMENU* phMenu) { HMENU hMenu, hSettingsMenu; @@ -534,7 +534,7 @@ IStartMenuSiteImpl_AppendMenu(IN OUT IStartMenuCallback *iface, UINT uLastItemsCount = 5; /* 5 menu items below the last separator */ TCHAR szUser[128]; - DbgPrint("IStartMenuCallback::AppendMenu\n"); + DbgPrint("ITrayPriv::AppendMenu\n"); hMenu = LoadPopupMenu(hExplorerInstance, MAKEINTRESOURCE(IDM_STARTMENU)); @@ -711,16 +711,16 @@ IStartMenuSiteImpl_AppendMenu(IN OUT IStartMenuCallback *iface, return S_OK; } -static const IStartMenuCallbackVtbl IStartMenuCallbackImpl_Vtbl = +static const ITrayPrivVtbl ITrayPrivImpl_Vtbl = { /*** IUnknown methods ***/ - METHOD_IUNKNOWN_INHERITED_QUERYINTERFACE_NAME(IStartMenuCallback, IStartMenuSite), - METHOD_IUNKNOWN_INHERITED_ADDREF_NAME(IStartMenuCallback, IStartMenuSite), - METHOD_IUNKNOWN_INHERITED_RELEASE_NAME(IStartMenuCallback, IStartMenuSite), + METHOD_IUNKNOWN_INHERITED_QUERYINTERFACE_NAME(ITrayPriv, IStartMenuSite), + METHOD_IUNKNOWN_INHERITED_ADDREF_NAME(ITrayPriv, IStartMenuSite), + METHOD_IUNKNOWN_INHERITED_RELEASE_NAME(ITrayPriv, IStartMenuSite), /*** IOleWindow methods ***/ IStartMenuSiteImpl_GetWindow, IStartMenuSiteImpl_ContextSensitiveHelp, - /*** IStartMenuCallback methods ***/ + /*** ITrayPriv methods ***/ IStartMenuSiteImpl_Execute, IStartMenuSiteImpl_Unknown, IStartMenuSiteImpl_AppendMenu @@ -782,7 +782,7 @@ IStartMenuSiteImpl_Construct(IN ITrayWindow *Tray) This->lpVtbl = &IStartMenuSiteImpl_Vtbl; This->lpServiceProviderVtbl = &IServiceProviderImpl_Vtbl; - This->lpStartMenuCallbackVtbl = &IStartMenuCallbackImpl_Vtbl; + This->lpStartMenuCallbackVtbl = &ITrayPrivImpl_Vtbl; This->lpOleCommandTargetVtbl = &IOleCommandTargetImpl_Vtbl; This->Ref = 1; diff --git a/reactos/base/shell/explorer-new/taskband.c b/reactos/base/shell/explorer-new/taskband.c index d54408bde4b..541e214f289 100644 --- a/reactos/base/shell/explorer-new/taskband.c +++ b/reactos/base/shell/explorer-new/taskband.c @@ -31,7 +31,7 @@ static const IDeskBandVtbl IDeskBandImpl_Vtbl; static const IObjectWithSiteVtbl IObjectWithSiteImpl_Vtbl; static const IDeskBarVtbl IDeskBarImpl_Vtbl; static const IPersistStreamVtbl IPersistStreamImpl_Vtbl; -static const IWindowEventHandlerVtbl IWindowEventHandlerImpl_Vtbl; +static const IWinEventHandlerVtbl IWinEventHandlerImpl_Vtbl; typedef struct { @@ -40,7 +40,7 @@ typedef struct const IObjectWithSiteVtbl *lpObjectWithSiteVtbl; const IDeskBarVtbl *lpDeskBarVtbl; const IPersistStreamVtbl *lpPersistStreamVtbl; - const IWindowEventHandlerVtbl *lpWindowEventHandlerVtbl; + const IWinEventHandlerVtbl *lpWindowEventHandlerVtbl; /* FIXME: Implement IOleCommandTarget */ LONG Ref; @@ -62,7 +62,7 @@ IMPL_CASTS(IDeskBand, ITaskBand, lpDeskBandVtbl) IMPL_CASTS(IObjectWithSite, ITaskBand, lpObjectWithSiteVtbl) IMPL_CASTS(IDeskBar, ITaskBand, lpDeskBarVtbl) IMPL_CASTS(IPersistStream, ITaskBand, lpPersistStreamVtbl) -IMPL_CASTS(IWindowEventHandler, ITaskBand, lpWindowEventHandlerVtbl) +IMPL_CASTS(IWinEventHandler, ITaskBand, lpWindowEventHandlerVtbl) static ULONG STDMETHODCALLTYPE ITaskBandImpl_AddRef(IN OUT ITaskBand *iface) @@ -137,7 +137,7 @@ ITaskBandImpl_QueryInterface(IN OUT ITaskBand *iface, *ppvObj = IDeskBar_from_ITaskBandImpl(This); } else if (IsEqualIID(riid, - &IID_IWindowEventHandler)) + &IID_IWinEventHandler)) { /* When run on Windows the system queries this interface, which is completely undocumented :( It's queried during initialization of the tray band site. @@ -149,7 +149,7 @@ ITaskBandImpl_QueryInterface(IN OUT ITaskBand *iface, interface in the ITaskBand implementation is only actually used if we use the same interface to forward messages to the IBandSite implementation of the shell! */ - *ppvObj = IWindowEventHandler_from_ITaskBandImpl(This); + *ppvObj = IWinEventHandler_from_ITaskBandImpl(This); } #if 0 else if (IsEqualIID(riid, @@ -575,27 +575,27 @@ static const IObjectWithSiteVtbl IObjectWithSiteImpl_Vtbl = /*****************************************************************************/ -METHOD_IUNKNOWN_INHERITED_ADDREF(IWindowEventHandler, ITaskBand) -METHOD_IUNKNOWN_INHERITED_RELEASE(IWindowEventHandler, ITaskBand) -METHOD_IUNKNOWN_INHERITED_QUERYINTERFACE(IWindowEventHandler, ITaskBand) +METHOD_IUNKNOWN_INHERITED_ADDREF(IWinEventHandler, ITaskBand) +METHOD_IUNKNOWN_INHERITED_RELEASE(IWinEventHandler, ITaskBand) +METHOD_IUNKNOWN_INHERITED_QUERYINTERFACE(IWinEventHandler, ITaskBand) static HRESULT STDMETHODCALLTYPE -IWindowEventHandlerImpl_ProcessMessage(IN OUT IWindowEventHandler *iface, +IWinEventHandlerImpl_ProcessMessage(IN OUT IWinEventHandler *iface, IN HWND hWnd, IN UINT uMsg, IN WPARAM wParam, IN LPARAM lParam, OUT LRESULT *plrResult) { - DbgPrint("ITaskBand: IWindowEventHandler::ProcessMessage(0x%p, 0x%x, 0x%p, 0x%p, 0x%p)\n", hWnd, uMsg, wParam, lParam, plrResult); + DbgPrint("ITaskBand: IWinEventHandler::ProcessMessage(0x%p, 0x%x, 0x%p, 0x%p, 0x%p)\n", hWnd, uMsg, wParam, lParam, plrResult); return E_NOTIMPL; } static HRESULT STDMETHODCALLTYPE -IWindowEventHandlerImpl_ContainsWindow(IN OUT IWindowEventHandler *iface, +IWinEventHandlerImpl_ContainsWindow(IN OUT IWinEventHandler *iface, IN HWND hWnd) { - ITaskBandImpl *This = ITaskBandImpl_from_IWindowEventHandler(iface); + ITaskBandImpl *This = ITaskBandImpl_from_IWinEventHandler(iface); HRESULT hRet = S_OK; if (This->hWnd != hWnd || @@ -610,15 +610,15 @@ IWindowEventHandlerImpl_ContainsWindow(IN OUT IWindowEventHandler *iface, return hRet; } -static const IWindowEventHandlerVtbl IWindowEventHandlerImpl_Vtbl = +static const IWinEventHandlerVtbl IWinEventHandlerImpl_Vtbl = { /*** IUnknown methods ***/ - METHOD_IUNKNOWN_INHERITED_QUERYINTERFACE_NAME(IWindowEventHandler, ITaskBand), - METHOD_IUNKNOWN_INHERITED_ADDREF_NAME(IWindowEventHandler, ITaskBand), - METHOD_IUNKNOWN_INHERITED_RELEASE_NAME(IWindowEventHandler, ITaskBand), - /*** IWindowEventHandler methods ***/ - IWindowEventHandlerImpl_ProcessMessage, - IWindowEventHandlerImpl_ContainsWindow + METHOD_IUNKNOWN_INHERITED_QUERYINTERFACE_NAME(IWinEventHandler, ITaskBand), + METHOD_IUNKNOWN_INHERITED_ADDREF_NAME(IWinEventHandler, ITaskBand), + METHOD_IUNKNOWN_INHERITED_RELEASE_NAME(IWinEventHandler, ITaskBand), + /*** IWinEventHandler methods ***/ + IWinEventHandlerImpl_ProcessMessage, + IWinEventHandlerImpl_ContainsWindow }; /*****************************************************************************/ @@ -641,7 +641,7 @@ ITaskBandImpl_Construct(IN OUT ITrayWindow *Tray) This->lpObjectWithSiteVtbl = &IObjectWithSiteImpl_Vtbl; This->lpDeskBarVtbl = &IDeskBarImpl_Vtbl; This->lpPersistStreamVtbl = &IPersistStreamImpl_Vtbl; - This->lpWindowEventHandlerVtbl = &IWindowEventHandlerImpl_Vtbl; + This->lpWindowEventHandlerVtbl = &IWinEventHandlerImpl_Vtbl; This->Ref = 1; This->Tray = Tray; diff --git a/reactos/base/shell/explorer-new/tbsite.c b/reactos/base/shell/explorer-new/tbsite.c index 8bca75bed31..7a7e4e066fd 100644 --- a/reactos/base/shell/explorer-new/tbsite.c +++ b/reactos/base/shell/explorer-new/tbsite.c @@ -38,7 +38,7 @@ typedef struct IUnknown *punkInner; IBandSite *BandSite; ITaskBand *TaskBand; - IWindowEventHandler *WindowEventHandler; + IWinEventHandler *WindowEventHandler; IContextMenu *ContextMenu; HWND hWndRebar; @@ -84,7 +84,7 @@ ITrayBandSiteImpl_Free(IN OUT ITrayBandSiteImpl *This) if (This->WindowEventHandler != NULL) { - IWindowEventHandler_Release(This->WindowEventHandler); + IWinEventHandler_Release(This->WindowEventHandler); This->WindowEventHandler = NULL; } @@ -146,9 +146,9 @@ ITrayBandSiteImpl_QueryInterface(IN OUT ITrayBandSite *iface, *ppvObj = IBandSite_from_ITrayBandSiteImpl(This); } else if (IsEqualIID(riid, - &IID_IWindowEventHandler)) + &IID_IWinEventHandler)) { - DbgPrint("ITaskBandSite: IWindowEventHandler queried!\n"); + DbgPrint("ITaskBandSite: IWinEventHandler queried!\n"); *ppvObj = NULL; return E_NOINTERFACE; } @@ -354,12 +354,12 @@ ITrayBandSiteImpl_ProcessMessage(IN OUT ITrayBandSite *iface, } }; - /* Forward to the shell's IWindowEventHandler interface to get the default + /* Forward to the shell's IWinEventHandler interface to get the default shell behavior! */ if (This->WindowEventHandler != NULL) { - /*DbgPrint("Calling IWindowEventHandler::ProcessMessage(0x%p, 0x%x, 0x%p, 0x%p, 0x%p) This->hWndRebar=0x%p\n", hWnd, uMsg, wParam, lParam, plResult, This->hWndRebar);*/ - hRet = IWindowEventHandler_ProcessMessage(This->WindowEventHandler, + /*DbgPrint("Calling IWinEventHandler::ProcessMessage(0x%p, 0x%x, 0x%p, 0x%p, 0x%p) This->hWndRebar=0x%p\n", hWnd, uMsg, wParam, lParam, plResult, This->hWndRebar);*/ + hRet = IWinEventHandler_OnWinEvent(This->WindowEventHandler, hWnd, uMsg, wParam, @@ -370,11 +370,11 @@ ITrayBandSiteImpl_ProcessMessage(IN OUT ITrayBandSite *iface, if (uMsg == WM_NOTIFY) { const NMHDR *nmh = (const NMHDR *)lParam; - DbgPrint("ITrayBandSite->IWindowEventHandler::ProcessMessage: WM_NOTIFY for 0x%p, From: 0x%p, Code: NM_FIRST-%u returned 0x%x\n", hWnd, nmh->hwndFrom, NM_FIRST - nmh->code, hRet); + DbgPrint("ITrayBandSite->IWinEventHandler::ProcessMessage: WM_NOTIFY for 0x%p, From: 0x%p, Code: NM_FIRST-%u returned 0x%x\n", hWnd, nmh->hwndFrom, NM_FIRST - nmh->code, hRet); } else { - DbgPrint("ITrayBandSite->IWindowEventHandler::ProcessMessage(0x%p,0x%x,0x%p,0x%p,0x%p->0x%p) returned: 0x%x\n", hWnd, uMsg, wParam, lParam, plResult, *plResult, hRet); + DbgPrint("ITrayBandSite->IWinEventHandler::ProcessMessage(0x%p,0x%x,0x%p,0x%p,0x%p->0x%p) returned: 0x%x\n", hWnd, uMsg, wParam, lParam, plResult, *plResult, hRet); } } } @@ -944,7 +944,7 @@ ITrayBandSiteImpl_Construct(IN OUT ITrayWindow *Tray, } hRet = IUnknown_QueryInterface(This->punkInner, - &IID_IWindowEventHandler, + &IID_IWinEventHandler, (PVOID*)&This->WindowEventHandler); if (!SUCCEEDED(hRet)) { diff --git a/reactos/base/shell/explorer-new/todo.h b/reactos/base/shell/explorer-new/todo.h index 7c561ffa120..f0597e60a8b 100644 --- a/reactos/base/shell/explorer-new/todo.h +++ b/reactos/base/shell/explorer-new/todo.h @@ -29,9 +29,6 @@ static const GUID IID_HACK_IInitializeObject = {0x4622AD16,0xFF23,0x11D0,{0x8D,0 static const GUID SID_HACK_SMenuPopup = {0xD1E7AFEB,0x6A2E,0x11D0,{0x8C,0x78,0x00,0xC0,0x4F,0xD9,0x18,0xB4}}; #define SID_SMenuPopup SID_HACK_SMenuPopup - - - #ifdef COBJMACROS #define IDeskBarClient_QueryInterface(T,a,b) (T)->lpVtbl->QueryInterface(T,a,b) #define IDeskBarClient_AddRef(T) (T)->lpVtbl->AddRef(T) @@ -44,26 +41,4 @@ static const GUID SID_HACK_SMenuPopup = {0xD1E7AFEB,0x6A2E,0x11D0,{0x8C,0x78,0x0 #define IDeskBarClient_GetSize(T,a,b) (T)->lpVtbl->GetSize(T,a,b) #endif -static const GUID IID_HACK_IShellService = {0x5836FB00,0x8187,0x11CF,{0xA1,0x2B,0x00,0xAA,0x00,0x4A,0xE8,0x37}}; -#define IID_IShellService IID_HACK_IShellService - -#define INTERFACE IShellService -DECLARE_INTERFACE_(IShellService,IUnknown) -{ - /*** IUnknown methods ***/ - STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; - STDMETHOD_(ULONG,AddRef)(THIS) PURE; - STDMETHOD_(ULONG,Release)(THIS) PURE; - /*** IShellService methods ***/ - STDMETHOD_(HRESULT,SetOwner)(THIS_ IUnknown*) PURE; -}; -#undef INTERFACE - -#ifdef COBJMACROS -#define IShellService_QueryInterface(T,a,b) (T)->lpVtbl->QueryInterface(T,a,b) -#define IShellService_AddRef(T) (T)->lpVtbl->AddRef(T) -#define IShellService_Release(T) (T)->lpVtbl->Release(T) -#define IShellService_SetOwner(T,a) (T)->lpVtbl->SetOwner(T,a) -#endif - #endif /* __TODO_H */ diff --git a/reactos/base/shell/explorer-new/undoc.h b/reactos/base/shell/explorer-new/undoc.h index 8f4722f1e59..46d829eae8c 100644 --- a/reactos/base/shell/explorer-new/undoc.h +++ b/reactos/base/shell/explorer-new/undoc.h @@ -20,162 +20,6 @@ static const GUID CLSID_HACK_PersonalStartMenu = {0x3F6953F0,0x5359,0x47FC,{0xBD static const GUID IID_HACK_IMenuBand = {0x568804CD,0xCBD7,0x11D0,{0x98,0x16,0x00,0xC0,0x4F,0xD9,0x19,0x72}}; #define IID_IMenuBand IID_HACK_IMenuBand -static const GUID IID_HACK_IStartMenuCallback = {0x4622AD10,0xFF23,0x11D0,{0x8D,0x34,0x00,0xA0,0xC9,0x0F,0x27,0x19}}; -#define IID_IStartMenuCallback IID_HACK_IStartMenuCallback - -#define INTERFACE IStartMenuCallback -DECLARE_INTERFACE_(IStartMenuCallback,IUnknown) -{ - /*** IUnknown ***/ - STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; - STDMETHOD_(ULONG,AddRef)(THIS) PURE; - STDMETHOD_(ULONG,Release)(THIS) PURE; - /*** IOleWindow methods ***/ - STDMETHOD_(HRESULT,GetWindow)(THIS_ HWND*) PURE; - STDMETHOD_(HRESULT,ContextSensitiveHelp)(THIS_ BOOL) PURE; - /*** IStartMenuCallback ***/ - STDMETHOD_(HRESULT,Execute)(THIS_ IShellFolder*,LPCITEMIDLIST) PURE; - STDMETHOD_(HRESULT,Unknown)(THIS_ PVOID,PVOID,PVOID,PVOID) PURE; - STDMETHOD_(HRESULT,AppendMenu)(THIS_ HMENU*) PURE; -}; -#undef INTERFACE - -#ifdef COBJMACROS -#define IStartMenuCallback_QueryInterface(T,a,b) (T)->lpVtbl->QueryInterface(T,a,b) -#define IStartMenuCallback_AddRef(T) (T)->lpVtbl->AddRef(T) -#define IStartMenuCallback_Release(T) (T)->lpVtbl->Release(T) -#define IStartMenuCallback_GetWindow(T,a) (T)->lpVtbl->GetWindow(T,a) -#define IStartMenuCallback_ContextSensitiveHelp(T,a) (T)->lpVtbl->ContextSensitiveHelp(T,a) -#define IStartMenuCallback_Execute(T,a,b) (T)->lpVtbl->Execute(T,a,b) -#define IStartMenuCallback_Unknown(T,a,b,c,d) (T)->lpVtbl->Unknown(T,a,b,c,d) -#define IStartMenuCallback_AppendMenu(T,a) (T)->lpVtbl->AppendMenu(T,a) -#endif - -#define INTERFACE IBandSiteStreamCallback -DECLARE_INTERFACE_(IBandSiteStreamCallback,IUnknown) -{ - /*** IUnknown ***/ - STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; - STDMETHOD_(ULONG,AddRef)(THIS) PURE; - STDMETHOD_(ULONG,Release)(THIS) PURE; - /*** IBandSiteStreamCallback ***/ - STDMETHOD_(HRESULT,OnLoad)(THIS_ IStream *pStm, REFIID riid, PVOID *pvObj) PURE; - STDMETHOD_(HRESULT,OnSave)(THIS_ IUnknown *pUnk, IStream *pStm) PURE; -}; -#undef INTERFACE - -#ifdef COBJMACROS -#define IBandSiteStreamCallback_QueryInterface(T,a,b) (T)->lpVtbl->QueryInterface(T,a,b) -#define IBandSiteStreamCallback_AddRef(T) (T)->lpVtbl->AddRef(T) -#define IBandSiteStreamCallback_Release(T) (T)->lpVtbl->Release(T) -#define IBandSiteStreamCallback_OnLoad(T,a,b,c) (T)->lpVtbl->OnLoad(T,a,b,c) -#define IBandSiteStreamCallback_OnSave(T,a,b) (T)->lpVtbl->OnSave(T,a,b) -#endif - -static const GUID IID_HACK_IWindowEventHandler = {0xEA5F2D61,0xE008,0x11CF,{0x99,0xCB,0x00,0xC0,0x4F,0xD6,0x44,0x97}}; -#define IID_IWindowEventHandler IID_HACK_IWindowEventHandler - -#define INTERFACE IWindowEventHandler -DECLARE_INTERFACE_(IWindowEventHandler,IUnknown) -{ - /*** IUnknown ***/ - STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; - STDMETHOD_(ULONG,AddRef)(THIS) PURE; - STDMETHOD_(ULONG,Release)(THIS) PURE; - /*** IWindowEventHandler ***/ - STDMETHOD(ProcessMessage)(THIS_ HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT *plrResult) PURE; - STDMETHOD(ContainsWindow)(THIS_ HWND hWnd) PURE; -}; -#undef INTERFACE - -#ifdef COBJMACROS -#define IWindowEventHandler_QueryInterface(T,a,b) (T)->lpVtbl->QueryInterface(T,a,b) -#define IWindowEventHandler_AddRef(T) (T)->lpVtbl->AddRef(T) -#define IWindowEventHandler_Release(T) (T)->lpVtbl->Release(T) -#define IWindowEventHandler_ProcessMessage(T,a,b,c,d,e) (T)->lpVtbl->ProcessMessage(T,a,b,c,d,e) -#define IWindowEventHandler_ContainsWindow(T,a) (T)->lpVtbl->ContainsWindow(T,a) -#endif - -#define INTERFACE IShellDesktopTray -DECLARE_INTERFACE_(IShellDesktopTray,IUnknown) -{ - /*** IUnknown ***/ - STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; - STDMETHOD_(ULONG,AddRef)(THIS) PURE; - STDMETHOD_(ULONG,Release)(THIS) PURE; - /*** IShellDesktopTray ***/ - STDMETHOD_(ULONG,GetState)(THIS) PURE; - STDMETHOD(GetTrayWindow)(THIS_ HWND*) PURE; - STDMETHOD(RegisterDesktopWindow)(THIS_ HWND) PURE; - STDMETHOD(Unknown)(THIS_ DWORD,DWORD) PURE; -}; -#undef INTERFACE - -#ifdef COBJMACROS -#define IShellDesktopTray_QueryInterface(T,a,b) (T)->lpVtbl->QueryInterface(T,a,b) -#define IShellDesktopTray_AddRef(T) (T)->lpVtbl->AddRef(T) -#define IShellDesktopTray_Release(T) (T)->lpVtbl->Release(T) -#define IShellDesktopTray_GetState(T) (T)->lpVtbl->GetState(T) -#define IShellDesktopTray_GetTrayWindow(T,a) (T)->lpVtbl->GetTrayWindow(T,a) -#define IShellDesktopTray_RegisterDesktopWindow(T,a) (T)->lpVtbl->RegisterDesktopWindow(T,a) -#define IShellDesktopTray_Unknown(T,a,b) (T)->lpVtbl->Unknown(T,a,b) -#endif - -#if 0 -HANDLE WINAPI SHCreateDesktop(IShellDesktopTray*); -BOOL WINAPI SHDesktopMessageLoop(HANDLE); -#else -typedef HANDLE (WINAPI *PSHCreateDesktop)(IShellDesktopTray*); -static __inline HANDLE -SHCreateDesktop(IShellDesktopTray* sdt) -{ - static PSHCreateDesktop Func = NULL; - - if (Func == NULL) - { - HMODULE hShlwapi; - hShlwapi = LoadLibrary(TEXT("SHELL32.DLL")); - if (hShlwapi != NULL) - { - Func = (PSHCreateDesktop)GetProcAddress(hShlwapi, (LPCSTR)200); - } - } - - if (Func != NULL) - { - return Func(sdt); - } - - MessageBox(NULL, TEXT("SHCreateDesktop not available"), NULL, 0); - return NULL; -} - -typedef BOOL (WINAPI *PSHDesktopMessageLoop)(HANDLE); -static __inline BOOL -SHDesktopMessageLoop(IN HANDLE hDesktop) -{ - static PSHDesktopMessageLoop Func = NULL; - - if (Func == NULL) - { - HMODULE hShlwapi; - hShlwapi = LoadLibrary(TEXT("SHELL32.DLL")); - if (hShlwapi != NULL) - { - Func = (PSHDesktopMessageLoop)GetProcAddress(hShlwapi, (LPCSTR)201); - } - } - - if (Func != NULL) - { - return Func(hDesktop); - } - - MessageBox(NULL, TEXT("SHDesktopMessageLoop not available"), NULL, 0); - return FALSE; -} -#endif - #define WM_GETISHELLBROWSER (WM_USER+7) BOOL WINAPI SetShellWindow(HWND); BOOL WINAPI SetShellWindowEx(HWND, HWND); @@ -183,25 +27,6 @@ BOOL WINAPI RegisterShellHook(HWND, DWORD); IStream* WINAPI SHGetViewStream(LPCITEMIDLIST, DWORD, LPCTSTR, LPCTSTR, LPCTSTR); BOOL WINAPI SHIsEmptyStream(IStream*); -typedef struct tagCREATEMRULISTA -{ - DWORD cbSize; - DWORD nMaxItems; - DWORD dwFlags; - HKEY hKey; - LPCSTR lpszSubKey; - PROC lpfnCompare; -} CREATEMRULISTA, *LPCREATEMRULISTA; -typedef struct tagCREATEMRULISTW -{ - DWORD cbSize; - DWORD nMaxItems; - DWORD dwFlags; - HKEY hKey; - LPCWSTR lpszSubKey; - PROC lpfnCompare; -} CREATEMRULISTW, *LPCREATEMRULISTW; - #define MRU_BINARY 0x1 #define MRU_CACHEWRITE 0x2 @@ -216,11 +41,9 @@ BOOL WINAPI DrawCaptionTempA(HWND,HDC,const RECT*,HFONT,HICON,LPCSTR,UINT); BOOL WINAPI DrawCaptionTempW(HWND,HDC,const RECT*,HFONT,HICON,LPCWSTR,UINT); #ifdef UNICODE -typedef CREATEMRULISTW CREATEMRULIST, *PCREATEMRULIST; #define CreateMRUList CreateMRUListW #define DrawCaptionTemp DrawCaptionTempW #else -typedef CREATEMRULISTA CREATEMRULIST, *PCREATEMRULIST; #define CreateMRUList CreateMRUListA #define DrawCaptionTemp DrawCaptionTempA #endif @@ -231,68 +54,4 @@ HRESULT WINAPI SHInvokeDefaultCommand(HWND,IShellFolder*,LPCITEMIDLIST); HRESULT WINAPI SHPropertyBag_ReadPOINTL(IPropertyBag*,LPCWSTR,POINTL*); -#if 0 -HRESULT WINAPI SHGetPerScreenResName(OUT LPWSTR lpResName, - IN INT cchResName, - IN DWORD dwReserved); -#else -typedef HRESULT (WINAPI *PSHGetPerScreenResName)(LPWSTR,INT,DWORD); -static __inline HRESULT -SHGetPerScreenResName(OUT LPWSTR lpResName, - IN INT cchResName, - IN DWORD dwReserved OPTIONAL) -{ - static PSHGetPerScreenResName Func = NULL; - - if (Func == NULL) - { - HMODULE hShlwapi; - hShlwapi = LoadLibrary(TEXT("SHLWAPI.DLL")); - if (hShlwapi != NULL) - { - Func = (PSHGetPerScreenResName)GetProcAddress(hShlwapi, (LPCSTR)533); - } - } - - if (Func != NULL) - { - return Func(lpResName, cchResName, dwReserved); - } - - MessageBox(NULL, TEXT("SHGetPerScreenResName not available"), NULL, 0); - return E_NOTIMPL; -} -#endif - -#if 0 -HRESULT WINAPI SHPropertyBag_ReadStream(IPropertyBag*,LPCWSTR,IStream**); -#else -typedef HRESULT (WINAPI *PSHPropertyBag_ReadStream)(IPropertyBag*,LPCWSTR,IStream**); -static __inline HRESULT -SHPropertyBag_ReadStream(IN IPropertyBag *ppb, - IN LPCWSTR pszPropName, - OUT IStream **ppStream) -{ - static PSHPropertyBag_ReadStream Func = NULL; - - if (Func == NULL) - { - HMODULE hShlwapi; - hShlwapi = LoadLibrary(TEXT("SHLWAPI.DLL")); - if (hShlwapi != NULL) - { - Func = (PSHPropertyBag_ReadStream)GetProcAddress(hShlwapi, (LPCSTR)531); - } - } - - if (Func != NULL) - { - return Func(ppb, pszPropName, ppStream); - } - - MessageBox(NULL, TEXT("SHPropertyBag_ReadStream not available"), NULL, 0); - return E_NOTIMPL; -} -#endif - #endif /* _EXPLORER_UNDOC__H */ diff --git a/reactos/dll/win32/browseui/aclmulti.c b/reactos/dll/win32/browseui/aclmulti.c deleted file mode 100644 index 3fb49b83ffb..00000000000 --- a/reactos/dll/win32/browseui/aclmulti.c +++ /dev/null @@ -1,331 +0,0 @@ -/* - * Multisource AutoComplete list - * - * Copyright 2007 Mikolaj Zalewski - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA - */ - -#include "config.h" - -#include - -#define COBJMACROS - -#include "wine/debug.h" -#include "windef.h" -#include "winbase.h" -#include "winreg.h" -#include "winuser.h" -#include "shlwapi.h" -#include "winerror.h" -#include "objbase.h" - -#include "shlguid.h" -#include "shlobj.h" - -#include "wine/unicode.h" - -#include "browseui.h" - -WINE_DEFAULT_DEBUG_CHANNEL(browseui); - -struct ACLMultiSublist { - IUnknown *punk; - IEnumString *pEnum; - IACList *pACL; -}; - -typedef struct tagACLMulti { - const IEnumStringVtbl *vtbl; - const IACListVtbl *aclVtbl; - const IObjMgrVtbl *objmgrVtbl; - LONG refCount; - INT nObjs; - INT currObj; - struct ACLMultiSublist *objs; -} ACLMulti; - -static const IEnumStringVtbl ACLMultiVtbl; -static const IACListVtbl ACLMulti_ACListVtbl; -static const IObjMgrVtbl ACLMulti_ObjMgrVtbl; - -static inline ACLMulti *impl_from_IACList(IACList *iface) -{ - return (ACLMulti *)((char *)iface - FIELD_OFFSET(ACLMulti, aclVtbl)); -} - -static inline ACLMulti *impl_from_IObjMgr(IObjMgr *iface) -{ - return (ACLMulti *)((char *)iface - FIELD_OFFSET(ACLMulti, objmgrVtbl)); -} - -static void release_obj(struct ACLMultiSublist *obj) -{ - IUnknown_Release(obj->punk); - if (obj->pEnum) - IEnumString_Release(obj->pEnum); - if (obj->pACL) - IACList_Release(obj->pACL); -} - -HRESULT WINAPI ACLMulti_Constructor(IUnknown *pUnkOuter, IUnknown **ppOut) -{ - ACLMulti *This; - if (pUnkOuter) - return CLASS_E_NOAGGREGATION; - - This = CoTaskMemAlloc(sizeof(ACLMulti)); - if (This == NULL) - return E_OUTOFMEMORY; - ZeroMemory(This, sizeof(*This)); - This->vtbl = &ACLMultiVtbl; - This->aclVtbl = &ACLMulti_ACListVtbl; - This->objmgrVtbl = &ACLMulti_ObjMgrVtbl; - This->refCount = 1; - - TRACE("returning %p\n", This); - *ppOut = (IUnknown *)This; - BROWSEUI_refCount++; - return S_OK; -} - -static void WINAPI ACLMulti_Destructor(ACLMulti *This) -{ - int i; - TRACE("destroying %p\n", This); - for (i = 0; i < This->nObjs; i++) - release_obj(&This->objs[i]); - CoTaskMemFree(This->objs); - CoTaskMemFree(This); - BROWSEUI_refCount--; -} - -static HRESULT WINAPI ACLMulti_QueryInterface(IEnumString *iface, REFIID iid, LPVOID *ppvOut) -{ - ACLMulti *This = (ACLMulti *)iface; - *ppvOut = NULL; - - if (IsEqualIID(iid, &IID_IUnknown) || IsEqualIID(iid, &IID_IEnumString)) - { - *ppvOut = This; - } - else if (IsEqualIID(iid, &IID_IACList)) - { - *ppvOut = &This->aclVtbl; - } - else if (IsEqualIID(iid, &IID_IObjMgr)) - { - *ppvOut = &This->objmgrVtbl; - } - - if (*ppvOut) - { - IUnknown_AddRef(iface); - return S_OK; - } - - WARN("unsupported interface: %s\n", debugstr_guid(iid)); - return E_NOINTERFACE; -} - -static ULONG WINAPI ACLMulti_AddRef(IEnumString *iface) -{ - ACLMulti *This = (ACLMulti *)iface; - return InterlockedIncrement(&This->refCount); -} - -static ULONG WINAPI ACLMulti_Release(IEnumString *iface) -{ - ACLMulti *This = (ACLMulti *)iface; - ULONG ret; - - ret = InterlockedDecrement(&This->refCount); - if (ret == 0) - ACLMulti_Destructor(This); - return ret; -} - -static HRESULT WINAPI ACLMulti_Append(IObjMgr *iface, IUnknown *obj) -{ - ACLMulti *This = impl_from_IObjMgr(iface); - - TRACE("(%p, %p)\n", This, obj); - if (obj == NULL) - return E_FAIL; - - This->objs = CoTaskMemRealloc(This->objs, sizeof(This->objs[0]) * (This->nObjs+1)); - This->objs[This->nObjs].punk = obj; - IUnknown_AddRef(obj); - if (FAILED(IUnknown_QueryInterface(obj, &IID_IEnumString, (LPVOID *)&This->objs[This->nObjs].pEnum))) - This->objs[This->nObjs].pEnum = NULL; - if (FAILED(IUnknown_QueryInterface(obj, &IID_IACList, (LPVOID *)&This->objs[This->nObjs].pACL))) - This->objs[This->nObjs].pACL = NULL; - This->nObjs++; - return S_OK; -} - -static HRESULT WINAPI ACLMulti_Remove(IObjMgr *iface, IUnknown *obj) -{ - ACLMulti *This = impl_from_IObjMgr(iface); - int i; - - TRACE("(%p, %p)\n", This, obj); - for (i = 0; i < This->nObjs; i++) - if (This->objs[i].punk == obj) - { - release_obj(&This->objs[i]); - memmove(&This->objs[i], &This->objs[i+1], (This->nObjs-i-1)*sizeof(struct ACLMultiSublist)); - This->nObjs--; - This->objs = CoTaskMemRealloc(This->objs, sizeof(This->objs[0]) * This->nObjs); - return S_OK; - } - - return E_FAIL; -} - -static HRESULT WINAPI ACLMulti_Next(IEnumString *iface, ULONG celt, LPOLESTR *rgelt, ULONG *pceltFetched) -{ - ACLMulti *This = (ACLMulti *)iface; - - TRACE("(%p, %d, %p, %p)\n", iface, celt, rgelt, pceltFetched); - while (This->currObj < This->nObjs) - { - if (This->objs[This->currObj].pEnum) - { - /* native browseui 6.0 also returns only one element */ - HRESULT ret = IEnumString_Next(This->objs[This->currObj].pEnum, 1, rgelt, pceltFetched); - if (ret != S_FALSE) - return ret; - } - This->currObj++; - } - - if (pceltFetched) - *pceltFetched = 0; - *rgelt = NULL; - return S_FALSE; -} - -static HRESULT WINAPI ACLMulti_Reset(IEnumString *iface) -{ - ACLMulti *This = (ACLMulti *)iface; - int i; - - This->currObj = 0; - for (i = 0; i < This->nObjs; i++) - { - if (This->objs[i].pEnum) - IEnumString_Reset(This->objs[i].pEnum); - } - return S_OK; -} - -static HRESULT WINAPI ACLMulti_Skip(IEnumString *iface, ULONG celt) -{ - /* native browseui 6.0 returns this: */ - return E_NOTIMPL; -} - -static HRESULT WINAPI ACLMulti_Clone(IEnumString *iface, IEnumString **ppOut) -{ - *ppOut = NULL; - /* native browseui 6.0 returns this: */ - return E_OUTOFMEMORY; -} - -static HRESULT WINAPI ACLMulti_Expand(IACList *iface, LPCWSTR wstr) -{ - ACLMulti *This = impl_from_IACList(iface); - HRESULT res = S_OK; - int i; - - for (i = 0; i < This->nObjs; i++) - { - if (!This->objs[i].pACL) - continue; - res = IACList_Expand(This->objs[i].pACL, wstr); - if (res == S_OK) - break; - } - return res; -} - -static const IEnumStringVtbl ACLMultiVtbl = -{ - ACLMulti_QueryInterface, - ACLMulti_AddRef, - ACLMulti_Release, - - ACLMulti_Next, - ACLMulti_Skip, - ACLMulti_Reset, - ACLMulti_Clone -}; - -static HRESULT WINAPI ACLMulti_IObjMgr_QueryInterface(IObjMgr *iface, REFIID iid, LPVOID *ppvOut) -{ - ACLMulti *This = impl_from_IObjMgr(iface); - return ACLMulti_QueryInterface((IEnumString *)This, iid, ppvOut); -} - -static ULONG WINAPI ACLMulti_IObjMgr_AddRef(IObjMgr *iface) -{ - ACLMulti *This = impl_from_IObjMgr(iface); - return ACLMulti_AddRef((IEnumString *)This); -} - -static ULONG WINAPI ACLMulti_IObjMgr_Release(IObjMgr *iface) -{ - ACLMulti *This = impl_from_IObjMgr(iface); - return ACLMulti_Release((IEnumString *)This); -} - -static const IObjMgrVtbl ACLMulti_ObjMgrVtbl = -{ - ACLMulti_IObjMgr_QueryInterface, - ACLMulti_IObjMgr_AddRef, - ACLMulti_IObjMgr_Release, - - ACLMulti_Append, - ACLMulti_Remove -}; - -static HRESULT WINAPI ACLMulti_IACList_QueryInterface(IACList *iface, REFIID iid, LPVOID *ppvOut) -{ - ACLMulti *This = impl_from_IACList(iface); - return ACLMulti_QueryInterface((IEnumString *)This, iid, ppvOut); -} - -static ULONG WINAPI ACLMulti_IACList_AddRef(IACList *iface) -{ - ACLMulti *This = impl_from_IACList(iface); - return ACLMulti_AddRef((IEnumString *)This); -} - -static ULONG WINAPI ACLMulti_IACList_Release(IACList *iface) -{ - ACLMulti *This = impl_from_IACList(iface); - return ACLMulti_Release((IEnumString *)This); -} - -static const IACListVtbl ACLMulti_ACListVtbl = -{ - ACLMulti_IACList_QueryInterface, - ACLMulti_IACList_AddRef, - ACLMulti_IACList_Release, - - ACLMulti_Expand -}; diff --git a/reactos/dll/win32/browseui/aclmulti.cpp b/reactos/dll/win32/browseui/aclmulti.cpp new file mode 100644 index 00000000000..c34fe5bf4fc --- /dev/null +++ b/reactos/dll/win32/browseui/aclmulti.cpp @@ -0,0 +1,159 @@ +/* + * Multisource AutoComplete list + * + * Copyright 2007 Mikolaj Zalewski + * Copyright 2009 Andrew Hill + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "resource.h" +#include "wine/debug.h" +#include "aclmulti.h" + +WINE_DEFAULT_DEBUG_CHANNEL(browseui); + +void CACLMulti::release_obj(struct ACLMultiSublist *obj) +{ + obj->punk->Release(); + if (obj->pEnum) + obj->pEnum->Release(); + if (obj->pACL) + obj->pACL->Release(); +} + +CACLMulti::CACLMulti() +{ + fObjectCount = 0; + fCurrentObject = 0; + fObjects = NULL; +} + +CACLMulti::~CACLMulti() +{ + int i; + + TRACE("destroying %p\n", this); + for (i = 0; i < fObjectCount; i++) + release_obj(&fObjects[i]); + CoTaskMemFree(fObjects); +} + +HRESULT STDMETHODCALLTYPE CACLMulti::Append(IUnknown *punk) +{ + TRACE("(%p, %p)\n", this, punk); + if (punk == NULL) + return E_FAIL; + + fObjects = reinterpret_cast(CoTaskMemRealloc(fObjects, sizeof(fObjects[0]) * (fObjectCount + 1))); + fObjects[fObjectCount].punk = punk; + punk->AddRef(); + if (FAILED(punk->QueryInterface(IID_IEnumString, (void **)&fObjects[fObjectCount].pEnum))) + fObjects[fObjectCount].pEnum = NULL; + if (FAILED(punk->QueryInterface(IID_IACList, (void **)&fObjects[fObjectCount].pACL))) + fObjects[fObjectCount].pACL = NULL; + fObjectCount++; + return S_OK; +} + +HRESULT STDMETHODCALLTYPE CACLMulti::Remove(IUnknown *punk) +{ + int i; + + TRACE("(%p, %p)\n", this, punk); + for (i = 0; i < fObjectCount; i++) + if (fObjects[i].punk == punk) + { + release_obj(&fObjects[i]); + memmove(&fObjects[i], &fObjects[i + 1], (fObjectCount - i - 1) * sizeof(struct ACLMultiSublist)); + fObjectCount--; + fObjects = reinterpret_cast(CoTaskMemRealloc(fObjects, sizeof(fObjects[0]) * fObjectCount)); + return S_OK; + } + + return E_FAIL; +} + +HRESULT STDMETHODCALLTYPE CACLMulti::Next(ULONG celt, LPOLESTR *rgelt, ULONG *pceltFetched) +{ + TRACE("(%p, %d, %p, %p)\n", this, celt, rgelt, pceltFetched); + while (fCurrentObject < fObjectCount) + { + if (fObjects[fCurrentObject].pEnum) + { + /* native browseui 6.0 also returns only one element */ + HRESULT ret = fObjects[fCurrentObject].pEnum->Next(1, rgelt, pceltFetched); + if (ret != S_FALSE) + return ret; + } + fCurrentObject++; + } + + if (pceltFetched) + *pceltFetched = 0; + *rgelt = NULL; + return S_FALSE; +} + +HRESULT STDMETHODCALLTYPE CACLMulti::Reset() +{ + int i; + + fCurrentObject = 0; + for (i = 0; i < fObjectCount; i++) + { + if (fObjects[i].pEnum) + fObjects[i].pEnum->Reset(); + } + return S_OK; +} + +HRESULT STDMETHODCALLTYPE CACLMulti::Skip(ULONG celt) +{ + /* native browseui 6.0 returns this: */ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CACLMulti::Clone(IEnumString **ppOut) +{ + *ppOut = NULL; + /* native browseui 6.0 returns this: */ + return E_OUTOFMEMORY; +} + +HRESULT STDMETHODCALLTYPE CACLMulti::Expand(LPCWSTR wstr) +{ + HRESULT res = S_OK; + int i; + + for (i = 0; i < fObjectCount; i++) + { + if (!fObjects[i].pACL) + continue; + res = fObjects[i].pACL->Expand(wstr); + if (res == S_OK) + break; + } + return res; +} diff --git a/reactos/dll/win32/browseui/aclmulti.h b/reactos/dll/win32/browseui/aclmulti.h new file mode 100644 index 00000000000..b29896bc542 --- /dev/null +++ b/reactos/dll/win32/browseui/aclmulti.h @@ -0,0 +1,77 @@ +/* + * Multisource AutoComplete list + * + * Copyright 2007 Mikolaj Zalewski + * Copyright 2009 Andrew Hill + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#ifndef _aclmulti_h +#define _aclmulti_h + +class CACLMulti : + public CComCoClass, + public CComObjectRootEx, + public IEnumString, + public IACList, + public IObjMgr +{ +private: + struct ACLMultiSublist + { + IUnknown *punk; + IEnumString *pEnum; + IACList *pACL; + }; + + INT fObjectCount; + INT fCurrentObject; + struct ACLMultiSublist *fObjects; +public: + CACLMulti(); + ~CACLMulti(); + + // *** IEnumString methods *** + virtual HRESULT STDMETHODCALLTYPE Next(ULONG celt, LPOLESTR *rgelt, ULONG *pceltFetched); + virtual HRESULT STDMETHODCALLTYPE Skip(ULONG celt); + virtual HRESULT STDMETHODCALLTYPE Reset(); + virtual HRESULT STDMETHODCALLTYPE Clone(IEnumString **ppenum); + + // *** IACList methods *** + virtual HRESULT STDMETHODCALLTYPE Expand(LPCOLESTR pszExpand); + + // *** IObjMgr methods *** + virtual HRESULT STDMETHODCALLTYPE Append(IUnknown *punk); + virtual HRESULT STDMETHODCALLTYPE Remove(IUnknown *punk); + +private: + void release_obj(struct ACLMultiSublist *obj); + +public: + +DECLARE_REGISTRY_RESOURCEID(IDR_ACLMULTI) +DECLARE_NOT_AGGREGATABLE(CACLMulti) + +DECLARE_PROTECT_FINAL_CONSTRUCT() + +BEGIN_COM_MAP(CACLMulti) + COM_INTERFACE_ENTRY_IID(IID_IEnumString, IEnumString) + COM_INTERFACE_ENTRY_IID(IID_IACList, IACList) + COM_INTERFACE_ENTRY_IID(IID_IObjMgr, IObjMgr) +END_COM_MAP() +}; + +#endif // _aclmulti_h diff --git a/reactos/dll/win32/browseui/addressband.cpp b/reactos/dll/win32/browseui/addressband.cpp new file mode 100644 index 00000000000..0010f5f2daf --- /dev/null +++ b/reactos/dll/win32/browseui/addressband.cpp @@ -0,0 +1,509 @@ +/* + * ReactOS Explorer + * + * Copyright 2009 Andrew Hill + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +/* +Implements the navigation band of the cabinet window +*/ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "resource.h" +#include "addressband.h" + +/* +TODO: +****Add command handler for show/hide Go button to OnWinEvent +****Add tooltip notify handler + **Properly implement GetBandInfo + **Add support for showing/hiding Go button + **Fix so Go button will be shown/hidden properly on load + **Add correct text to Go button + **Implement TranslateAcceleratorIO + Implement Exec + Implement QueryService + Implement Load + Implement Save +*/ + +CAddressBand::CAddressBand() +{ + fEditControl = NULL; + fGoButton = NULL; + fComboBox = NULL; + fGoButtonShown = false; +} + +CAddressBand::~CAddressBand() +{ +} + +void CAddressBand::FocusChange(BOOL bFocus) +{ +// m_bFocus = bFocus; + + //Inform the input object site that the focus has changed. + if (fSite) + { +#if 0 + fSite->OnFocusChangeIS((IDockingWindow *)this, bFocus); +#endif + } +} + +HRESULT STDMETHODCALLTYPE CAddressBand::GetBandInfo(DWORD dwBandID, DWORD dwViewMode, DESKBANDINFO *pdbi) +{ + if (pdbi->dwMask & DBIM_MINSIZE) + { + pdbi->ptMinSize.x = 400; + pdbi->ptMinSize.y = 22; + } + if (pdbi->dwMask & DBIM_MAXSIZE) + { + pdbi->ptMaxSize.x = 0; + pdbi->ptMaxSize.y = 0; + } + if (pdbi->dwMask & DBIM_INTEGRAL) + { + pdbi->ptIntegral.x = 0; + pdbi->ptIntegral.y = 0; + } + if (pdbi->dwMask & DBIM_ACTUAL) + { + pdbi->ptActual.x = 400; + pdbi->ptActual.y = 22; + } + if (pdbi->dwMask & DBIM_TITLE) + wcscpy(pdbi->wszTitle, L"Address"); + if (pdbi->dwMask & DBIM_MODEFLAGS) + pdbi->dwModeFlags = DBIMF_UNDELETEABLE; + if (pdbi->dwMask & DBIM_BKCOLOR) + pdbi->crBkgnd = 0; + return S_OK; +} + +HRESULT STDMETHODCALLTYPE CAddressBand::SetSite(IUnknown *pUnkSite) +{ + CComPtr shellService; + CComPtr offset34; + HWND parentWindow; + IOleWindow *oleWindow; + HWND toolbar; + static const TBBUTTON buttonInfo[] = { {0, 1, TBSTATE_ENABLED, 0} }; + HIMAGELIST normalImagelist; + HIMAGELIST hotImageList; + HINSTANCE shellInstance; + HRESULT hResult; + + fSite.Release(); + if (pUnkSite == NULL) + return S_OK; + hResult = pUnkSite->QueryInterface(IID_IDockingWindowSite, (void **)&fSite); + if (FAILED(hResult)) + return hResult; + parentWindow = NULL; + hResult = pUnkSite->QueryInterface(IID_IOleWindow, (void **)&oleWindow); + if (SUCCEEDED(hResult)) + { + oleWindow->GetWindow(&parentWindow); + oleWindow->Release(); + } + if (!::IsWindow(parentWindow)) + return E_FAIL; + + toolbar = CreateWindowEx(WS_EX_TOOLWINDOW, WC_COMBOBOXEXW, NULL, WS_CHILD | WS_VISIBLE | + WS_CLIPCHILDREN | WS_TABSTOP | CCS_NODIVIDER | CCS_NOMOVEY, + 0, 0, 500, 250, parentWindow, (HMENU)0xa205, _AtlBaseModule.GetModuleInstance(), 0); + if (toolbar == NULL) + return E_FAIL; + SubclassWindow(toolbar); + SendMessage(CBEM_SETEXTENDEDSTYLE, CBES_EX_CASESENSITIVE | CBES_EX_NOSIZELIMIT, CBES_EX_CASESENSITIVE | CBES_EX_NOSIZELIMIT); + fEditControl = (HWND)SendMessage(CBEM_GETEDITCONTROL, 0, 0); + fComboBox = (HWND)SendMessage(CBEM_GETCOMBOCONTROL, 0, 0); +#if 1 + hResult = CoCreateInstance(CLSID_AddressEditBox, NULL, CLSCTX_INPROC_SERVER, IID_IAddressEditBox, (void **)&fAddressEditBox); + if (FAILED(hResult)) + return hResult; +#else + // instantiate new version +#endif + hResult = fAddressEditBox->QueryInterface(IID_IShellService, (void **)&shellService); + if (FAILED(hResult)) + return hResult; + hResult = fAddressEditBox->Init(toolbar, fEditControl, 8, pUnkSite /*(IAddressBand *)this*/ ); + if (FAILED(hResult)) + return hResult; + hResult = shellService->SetOwner(pUnkSite); + if (FAILED(hResult)) + return hResult; + + // TODO: properly initialize this from registry + fGoButtonShown = true; + + shellInstance = GetModuleHandle(_T("shell32.dll")); + normalImagelist = ImageList_LoadImageW(shellInstance, MAKEINTRESOURCE(IDB_GOBUTTON_NORMAL), 20, 0, RGB(255, 0, 255), IMAGE_BITMAP, LR_CREATEDIBSECTION); + hotImageList = ImageList_LoadImageW(shellInstance, MAKEINTRESOURCE(IDB_GOBUTTON_HOT), 20, 0, RGB(255, 0, 255), IMAGE_BITMAP, LR_CREATEDIBSECTION); + + fGoButton = CreateWindowEx(WS_EX_TOOLWINDOW, TOOLBARCLASSNAMEW, 0, WS_CHILD | WS_CLIPSIBLINGS | WS_CLIPCHILDREN | TBSTYLE_LIST | + TBSTYLE_FLAT | TBSTYLE_TOOLTIPS | CCS_NODIVIDER | CCS_NOPARENTALIGN | CCS_NORESIZE, + 0, 0, 0, 0, m_hWnd, NULL, _AtlBaseModule.GetModuleInstance(), NULL); + SendMessage(fGoButton, TB_BUTTONSTRUCTSIZE, sizeof(TBBUTTON), 0); + SendMessage(fGoButton, TB_SETMAXTEXTROWS, 1, 0); + SendMessage(fGoButton, TB_SETIMAGELIST, 0, (LPARAM)normalImagelist); + SendMessage(fGoButton, TB_SETHOTIMAGELIST, 0, (LPARAM)hotImageList); + SendMessage(fGoButton, TB_ADDSTRINGW, (WPARAM)_AtlBaseModule.GetResourceInstance(), IDS_GOBUTTONLABEL); + SendMessage(fGoButton, TB_ADDBUTTONSW, 1, (LPARAM)&buttonInfo); + + return hResult; +} + +HRESULT STDMETHODCALLTYPE CAddressBand::GetSite(REFIID riid, void **ppvSite) +{ + if (fSite == NULL) + return E_FAIL; + return fSite->QueryInterface(riid, ppvSite); +} + +HRESULT STDMETHODCALLTYPE CAddressBand::GetWindow(HWND *lphwnd) +{ + if (lphwnd == NULL) + return E_POINTER; + *lphwnd = m_hWnd; + return S_OK; +} + +HRESULT STDMETHODCALLTYPE CAddressBand::ContextSensitiveHelp(BOOL fEnterMode) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CAddressBand::CloseDW(DWORD dwReserved) +{ + ShowDW(FALSE); + + if (IsWindow()) + DestroyWindow(); + + m_hWnd = NULL; + + return S_OK; +} + +HRESULT STDMETHODCALLTYPE CAddressBand::ResizeBorderDW(const RECT *prcBorder, IUnknown *punkToolbarSite, BOOL fReserved) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CAddressBand::ShowDW(BOOL fShow) +{ + if (m_hWnd) + { + if (fShow) + ShowWindow(SW_SHOW); + else + ShowWindow(SW_HIDE); + } + return S_OK; +} + +HRESULT STDMETHODCALLTYPE CAddressBand::QueryStatus(const GUID *pguidCmdGroup, ULONG cCmds, OLECMD prgCmds[ ], OLECMDTEXT *pCmdText) +{ + CComPtr oleCommandTarget; + HRESULT hResult; + + hResult = fAddressEditBox->QueryInterface(IID_IOleCommandTarget, (void **)&oleCommandTarget); + if (FAILED(hResult)) + return hResult; + return oleCommandTarget->QueryStatus(pguidCmdGroup, cCmds, prgCmds, pCmdText); +} + +HRESULT STDMETHODCALLTYPE CAddressBand::Exec(const GUID *pguidCmdGroup, DWORD nCmdID, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut) +{ + // incomplete + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CAddressBand::HasFocusIO() +{ + if (GetFocus() == fEditControl || SendMessage(CB_GETDROPPEDSTATE, 0, 0)) + return S_OK; + return S_FALSE; +} + +HRESULT STDMETHODCALLTYPE CAddressBand::TranslateAcceleratorIO(LPMSG lpMsg) +{ + // incomplete + return S_FALSE; +} + +HRESULT STDMETHODCALLTYPE CAddressBand::UIActivateIO(BOOL fActivate, LPMSG lpMsg) +{ + CComPtr inputObjectSite; + HRESULT hResult; + + if (fActivate) + { + hResult = fSite->QueryInterface(IID_IInputObjectSite, (void **)&inputObjectSite); + if (FAILED(hResult)) + return hResult; + hResult = inputObjectSite->OnFocusChangeIS((IDeskBand *)this, fActivate); + SetFocus(); + } + return S_OK; +} + +HRESULT STDMETHODCALLTYPE CAddressBand::OnWinEvent(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT *theResult) +{ + CComPtr winEventHandler; + HRESULT hResult; + + switch (uMsg) + { + case WM_WININICHANGE: + break; + case WM_COMMAND: + if (wParam == IDM_TOOLBARS_GOBUTTON) + { + // toggle whether the Go button is displayed + // setting is Yes or No, stored in key "Software\Microsoft\Internet Explorer\Main" in value ShowGoButton + // broadcast change notification to all explorer windows + } + break; + } + hResult = fAddressEditBox->QueryInterface(IID_IWinEventHandler, (void **)&winEventHandler); + if (FAILED(hResult)) + return hResult; + return winEventHandler->OnWinEvent(hWnd, uMsg, wParam, lParam, theResult); +} + +HRESULT STDMETHODCALLTYPE CAddressBand::IsWindowOwner(HWND hWnd) +{ + CComPtr winEventHandler; + HRESULT hResult; + + hResult = fAddressEditBox->QueryInterface(IID_IWinEventHandler, (void **)&winEventHandler); + if (FAILED(hResult)) + return hResult; + return winEventHandler->IsWindowOwner(hWnd); +} + +HRESULT STDMETHODCALLTYPE CAddressBand::FileSysChange(long param8, long paramC) +{ + CComPtr addressBand; + HRESULT hResult; + + hResult = fAddressEditBox->QueryInterface(IID_IAddressBand, (void **)&addressBand); + if (FAILED(hResult)) + return hResult; + return addressBand->FileSysChange(param8, paramC); +} + +HRESULT STDMETHODCALLTYPE CAddressBand::Refresh(long param8) +{ + CComPtr addressBand; + HRESULT hResult; + + hResult = fAddressEditBox->QueryInterface(IID_IAddressBand, (void **)&addressBand); + if (FAILED(hResult)) + return hResult; + return addressBand->Refresh(param8); +} + +HRESULT STDMETHODCALLTYPE CAddressBand::QueryService(REFGUID guidService, REFIID riid, void **ppvObject) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CAddressBand::OnFocusChangeIS(IUnknown *punkObj, BOOL fSetFocus) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CAddressBand::GetClassID(CLSID *pClassID) +{ + if (pClassID == NULL) + return E_POINTER; + *pClassID = CLSID_SH_AddressBand; + return S_OK; +} + +HRESULT STDMETHODCALLTYPE CAddressBand::IsDirty() +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CAddressBand::Load(IStream *pStm) +{ + // incomplete + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CAddressBand::Save(IStream *pStm, BOOL fClearDirty) +{ + // incomplete + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CAddressBand::GetSizeMax(ULARGE_INTEGER *pcbSize) +{ + // incomplete + return E_NOTIMPL; +} + +LRESULT CAddressBand::OnNotifyClick(WPARAM wParam, NMHDR *notifyHeader, BOOL &bHandled) +{ + if (notifyHeader->hwndFrom == fGoButton) + { + SendMessage(fEditControl, WM_KEYDOWN, 13, 0); + SendMessage(fEditControl, WM_KEYUP, 13, 0); + } + return 0; +} + +LRESULT CAddressBand::OnTipText(UINT idControl, NMHDR *notifyHeader, BOOL &bHandled) +{ + if (notifyHeader->hwndFrom == fGoButton) + { + // TODO + // Go to "destination path" + } + return 0; +} + +LRESULT CAddressBand::OnEraseBackground(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled) +{ + POINT pt; + POINT ptOrig; + HWND parentWindow; + LRESULT result; + + if (fGoButtonShown == false) + { + bHandled = FALSE; + return 0; + } + pt.x = 0; + pt.y = 0; + parentWindow = GetParent(); + ::MapWindowPoints(m_hWnd, parentWindow, &pt, 1); + OffsetWindowOrgEx((HDC)wParam, pt.x, pt.y, &ptOrig); + result = SendMessage(parentWindow, WM_ERASEBKGND, wParam, 0); + SetWindowOrgEx((HDC)wParam, ptOrig.x, ptOrig.y, NULL); + if (result == 0) + { + bHandled = FALSE; + return 0; + } + return result; +} + +LRESULT CAddressBand::OnSize(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled) +{ + RECT goButtonBounds; + RECT buttonBounds; + long buttonWidth; + long buttonHeight; + RECT comboBoxBounds; + long newHeight; + long newWidth; + + if (fGoButtonShown == false) + { + bHandled = FALSE; + return 0; + } + newHeight = HIWORD(lParam); + newWidth = LOWORD(lParam); + SendMessage(fGoButton, TB_GETITEMRECT, 0, (LPARAM)&buttonBounds); + buttonWidth = buttonBounds.right - buttonBounds.left; + buttonHeight = buttonBounds.bottom - buttonBounds.top; + DefWindowProc(WM_SIZE, wParam, MAKELONG(newWidth - buttonWidth - 2, newHeight)); + ::GetWindowRect(fComboBox, &comboBoxBounds); + ::SetWindowPos(fGoButton, NULL, newWidth - buttonWidth, (comboBoxBounds.bottom - comboBoxBounds.top - buttonHeight) / 2, + buttonWidth, buttonHeight, SWP_NOOWNERZORDER | SWP_SHOWWINDOW | SWP_NOACTIVATE | SWP_NOZORDER); + goButtonBounds.left = newWidth - buttonWidth; + goButtonBounds.top = 0; + goButtonBounds.right = newWidth - buttonWidth; + goButtonBounds.bottom = newHeight; + InvalidateRect(&goButtonBounds, TRUE); + SendMessage(fComboBox, CB_SETDROPPEDWIDTH, 200, 0); + return 0; +} + +LRESULT CAddressBand::OnWindowPosChanging(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled) +{ + RECT goButtonBounds; + RECT buttonBounds; + long buttonWidth; + long buttonHeight; + RECT comboBoxBounds; + WINDOWPOS positionInfoCopy; + long newHeight; + long newWidth; + + if (fGoButtonShown == false) + { + bHandled = FALSE; + return 0; + } + positionInfoCopy = *(WINDOWPOS *)lParam; + newHeight = positionInfoCopy.cy; + newWidth = positionInfoCopy.cx; + SendMessage(fGoButton, TB_GETITEMRECT, 0, (LPARAM)&buttonBounds); + buttonWidth = buttonBounds.right - buttonBounds.left; + buttonHeight = buttonBounds.bottom - buttonBounds.top; + positionInfoCopy.cx = newWidth - 2 - buttonWidth; + DefWindowProc(WM_WINDOWPOSCHANGING, wParam, (LPARAM)&positionInfoCopy); + ::GetWindowRect(fComboBox, &comboBoxBounds); + ::SetWindowPos(fGoButton, NULL, newWidth - buttonWidth, (comboBoxBounds.bottom - comboBoxBounds.top - buttonHeight) / 2, + buttonWidth, buttonHeight, SWP_NOOWNERZORDER | SWP_SHOWWINDOW | SWP_NOACTIVATE | SWP_NOZORDER); + goButtonBounds.left = newWidth - buttonWidth; + goButtonBounds.top = 0; + goButtonBounds.right = newWidth - buttonWidth; + goButtonBounds.bottom = newHeight; + InvalidateRect(&goButtonBounds, TRUE); + SendMessage(fComboBox, CB_SETDROPPEDWIDTH, 200, 0); + return 0; +} + +HRESULT CreateAddressBand(REFIID riid, void **ppv) +{ + CComObject *theMenuBar; + HRESULT hResult; + + if (ppv == NULL) + return E_POINTER; + *ppv = NULL; + ATLTRY (theMenuBar = new CComObject); + if (theMenuBar == NULL) + return E_OUTOFMEMORY; + hResult = theMenuBar->QueryInterface (riid, (void **)ppv); + if (FAILED (hResult)) + { + delete theMenuBar; + return hResult; + } + return S_OK; +} diff --git a/reactos/dll/win32/browseui/addressband.h b/reactos/dll/win32/browseui/addressband.h new file mode 100644 index 00000000000..e83ca945e79 --- /dev/null +++ b/reactos/dll/win32/browseui/addressband.h @@ -0,0 +1,135 @@ +/* + * ReactOS Explorer + * + * Copyright 2009 Andrew Hill + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#ifndef _addressband_h +#define _addressband_h + +class CAddressBand : + public CWindowImpl, + public CComCoClass, + public CComObjectRootEx, + public IDeskBand, + public IOleCommandTarget, + public IObjectWithSite, + public IInputObject, + public IWinEventHandler, + public IAddressBand, + public IServiceProvider, + public IInputObjectSite, + public IPersistStream +{ +private: + CComPtr fSite; + CComPtr fAddressEditBox; + HWND fEditControl; + HWND fGoButton; + HWND fComboBox; + bool fGoButtonShown; +public: + CAddressBand(); + ~CAddressBand(); +private: + void FocusChange(BOOL bFocus); +public: + // *** IDeskBand methods *** + virtual HRESULT STDMETHODCALLTYPE GetBandInfo(DWORD dwBandID, DWORD dwViewMode, DESKBANDINFO *pdbi); + + // *** IObjectWithSite methods *** + virtual HRESULT STDMETHODCALLTYPE SetSite(IUnknown *pUnkSite); + virtual HRESULT STDMETHODCALLTYPE GetSite(REFIID riid, void **ppvSite); + + // *** IOleWindow methods *** + virtual HRESULT STDMETHODCALLTYPE GetWindow(HWND *lphwnd); + virtual HRESULT STDMETHODCALLTYPE ContextSensitiveHelp(BOOL fEnterMode); + + // *** IDockingWindow methods *** + virtual HRESULT STDMETHODCALLTYPE CloseDW(DWORD dwReserved); + virtual HRESULT STDMETHODCALLTYPE ResizeBorderDW(const RECT *prcBorder, IUnknown *punkToolbarSite, BOOL fReserved); + virtual HRESULT STDMETHODCALLTYPE ShowDW(BOOL fShow); + + // *** IOleCommandTarget methods *** + virtual HRESULT STDMETHODCALLTYPE QueryStatus(const GUID *pguidCmdGroup, ULONG cCmds, OLECMD prgCmds[ ], OLECMDTEXT *pCmdText); + virtual HRESULT STDMETHODCALLTYPE Exec(const GUID *pguidCmdGroup, DWORD nCmdID, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut); + + // *** IInputObject methods *** + virtual HRESULT STDMETHODCALLTYPE UIActivateIO(BOOL fActivate, LPMSG lpMsg); + virtual HRESULT STDMETHODCALLTYPE HasFocusIO(); + virtual HRESULT STDMETHODCALLTYPE TranslateAcceleratorIO(LPMSG lpMsg); + + // *** IWinEventHandler methods *** + virtual HRESULT STDMETHODCALLTYPE OnWinEvent(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT *theResult); + virtual HRESULT STDMETHODCALLTYPE IsWindowOwner(HWND hWnd); + + // *** IAddressBand methods *** + virtual HRESULT STDMETHODCALLTYPE FileSysChange(long param8, long paramC); + virtual HRESULT STDMETHODCALLTYPE Refresh(long param8); + + // *** IServiceProvider methods *** + virtual HRESULT STDMETHODCALLTYPE QueryService(REFGUID guidService, REFIID riid, void **ppvObject); + + // *** IInputObjectSite methods *** + virtual HRESULT STDMETHODCALLTYPE OnFocusChangeIS(IUnknown *punkObj, BOOL fSetFocus); + + // *** IPersist methods *** + virtual HRESULT STDMETHODCALLTYPE GetClassID(CLSID *pClassID); + + // *** IPersistStream methods *** + virtual HRESULT STDMETHODCALLTYPE IsDirty(); + virtual HRESULT STDMETHODCALLTYPE Load(IStream *pStm); + virtual HRESULT STDMETHODCALLTYPE Save(IStream *pStm, BOOL fClearDirty); + virtual HRESULT STDMETHODCALLTYPE GetSizeMax(ULARGE_INTEGER *pcbSize); + + // message handlers + LRESULT OnNotifyClick(WPARAM wParam, NMHDR *notifyHeader, BOOL &bHandled); + LRESULT OnTipText(UINT idControl, NMHDR *notifyHeader, BOOL &bHandled); + LRESULT OnEraseBackground(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled); + LRESULT OnSize(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled); + LRESULT OnWindowPosChanging(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled); + +BEGIN_MSG_MAP(CAddressBand) + NOTIFY_CODE_HANDLER(NM_CLICK, OnNotifyClick) + NOTIFY_CODE_HANDLER(TTN_NEEDTEXTW, OnTipText) + MESSAGE_HANDLER(WM_ERASEBKGND, OnEraseBackground) + MESSAGE_HANDLER(WM_SIZE, OnSize) + MESSAGE_HANDLER(WM_WINDOWPOSCHANGING, OnWindowPosChanging) +END_MSG_MAP() + +DECLARE_REGISTRY_RESOURCEID(IDR_ADDRESSBAND) +DECLARE_NOT_AGGREGATABLE(CAddressBand) + +DECLARE_PROTECT_FINAL_CONSTRUCT() + +BEGIN_COM_MAP(CAddressBand) + COM_INTERFACE_ENTRY_IID(IID_IDeskBand, IDeskBand) + COM_INTERFACE_ENTRY_IID(IID_IObjectWithSite, IObjectWithSite) + COM_INTERFACE_ENTRY_IID(IID_IOleWindow, IOleWindow) + COM_INTERFACE_ENTRY_IID(IID_IDockingWindow, IDockingWindow) + COM_INTERFACE_ENTRY_IID(IID_IOleCommandTarget, IOleCommandTarget) + COM_INTERFACE_ENTRY_IID(IID_IInputObject, IInputObject) + COM_INTERFACE_ENTRY_IID(IID_IWinEventHandler, IWinEventHandler) + COM_INTERFACE_ENTRY_IID(IID_IAddressBand, IAddressBand) + COM_INTERFACE_ENTRY_IID(IID_IServiceProvider, IServiceProvider) + COM_INTERFACE_ENTRY_IID(IID_IInputObjectSite, IInputObjectSite) + COM_INTERFACE_ENTRY_IID(IID_IPersist, IPersist) + COM_INTERFACE_ENTRY_IID(IID_IPersistStream, IPersistStream) +END_COM_MAP() +}; + +#endif // _addressband_h diff --git a/reactos/dll/win32/browseui/addresseditbox.cpp b/reactos/dll/win32/browseui/addresseditbox.cpp new file mode 100644 index 00000000000..7d36ff3dfd7 --- /dev/null +++ b/reactos/dll/win32/browseui/addresseditbox.cpp @@ -0,0 +1,191 @@ +/* + * ReactOS Explorer + * + * Copyright 2009 Andrew Hill + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +/* +This class handles the combo box of the address band. +*/ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "resource.h" +#include "addresseditbox.h" +/* +TODO: + Add auto completion support + Subclass windows in Init method + Connect to browser connection point + Handle navigation complete messages to set edit box text + Handle listbox dropdown message and fill contents + Add drag and drop of icon in edit box + Handle enter in edit box to browse to typed path + Handle change notifies to update appropriately + Add handling of enter in edit box + Fix so selection in combo listbox navigates + Fix so editing text and typing enter navigates +*/ + +CAddressEditBox::CAddressEditBox() : + fEditWindow(NULL, this, 1), + fComboBoxExWindow(NULL, this, 2) +{ +} + +CAddressEditBox::~CAddressEditBox() +{ +} + +HRESULT STDMETHODCALLTYPE CAddressEditBox::SetOwner(IUnknown *) +{ + // connect to browser connection point + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CAddressEditBox::FileSysChange(long param8, long paramC) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CAddressEditBox::Refresh(long param8) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CAddressEditBox::Init(HWND comboboxEx, HWND editControl, long param14, IUnknown *param18) +{ + fComboBoxExWindow.SubclassWindow(comboboxEx); + fEditWindow.SubclassWindow(editControl); + return S_OK; +} + +HRESULT STDMETHODCALLTYPE CAddressEditBox::SetCurrentDir(long paramC) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CAddressEditBox::ParseNow(long paramC) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CAddressEditBox::Execute(long paramC) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CAddressEditBox::Save(long paramC) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CAddressEditBox::OnWinEvent(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT *theResult) +{ + // handle fill of listbox here + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CAddressEditBox::IsWindowOwner(HWND hWnd) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CAddressEditBox::QueryStatus(const GUID *pguidCmdGroup, ULONG cCmds, OLECMD prgCmds[ ], OLECMDTEXT *pCmdText) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CAddressEditBox::Exec(const GUID *pguidCmdGroup, DWORD nCmdID, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CAddressEditBox::GetTypeInfoCount(UINT *pctinfo) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CAddressEditBox::GetTypeInfo(UINT iTInfo, LCID lcid, ITypeInfo **ppTInfo) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CAddressEditBox::GetIDsOfNames(REFIID riid, LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CAddressEditBox::Invoke(DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr) +{ + // on navigate complete, change edit section of combobox + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CAddressEditBox::GetClassID(CLSID *pClassID) +{ + if (pClassID == NULL) + return E_POINTER; + *pClassID = CLSID_AddressEditBox; + return S_OK; +} + +HRESULT STDMETHODCALLTYPE CAddressEditBox::IsDirty() +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CAddressEditBox::Load(IStream *pStm) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CAddressEditBox::Save(IStream *pStm, BOOL fClearDirty) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CAddressEditBox::GetSizeMax(ULARGE_INTEGER *pcbSize) +{ + return E_NOTIMPL; +} + +HRESULT CreateAddressEditBox(REFIID riid, void **ppv) +{ + CComObject *theMenuBar; + HRESULT hResult; + + if (ppv == NULL) + return E_POINTER; + *ppv = NULL; + ATLTRY (theMenuBar = new CComObject); + if (theMenuBar == NULL) + return E_OUTOFMEMORY; + hResult = theMenuBar->QueryInterface (riid, (void **)ppv); + if (FAILED (hResult)) + { + delete theMenuBar; + return hResult; + } + return S_OK; +} diff --git a/reactos/dll/win32/browseui/addresseditbox.h b/reactos/dll/win32/browseui/addresseditbox.h new file mode 100644 index 00000000000..fdb2057a455 --- /dev/null +++ b/reactos/dll/win32/browseui/addresseditbox.h @@ -0,0 +1,112 @@ +/* + * ReactOS Explorer + * + * Copyright 2009 Andrew Hill + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#ifndef _addresseditbox_h +#define _addresseditbox_h + +class CAddressEditBox : + public CWindowImpl, + public CComCoClass, + public CComObjectRootEx, + public IShellService, + public IAddressBand, + public IAddressEditBox, + public IWinEventHandler, + public IOleCommandTarget, + public IDispatch, + public IPersistStream +{ +private: + CContainedWindow fEditWindow; + CContainedWindow fComboBoxExWindow; +public: + CAddressEditBox(); + ~CAddressEditBox(); +private: +public: + // *** IShellService methods *** + virtual HRESULT STDMETHODCALLTYPE SetOwner(IUnknown *); + + // *** IAddressBand methods *** + virtual HRESULT STDMETHODCALLTYPE FileSysChange(long param8, long paramC); + virtual HRESULT STDMETHODCALLTYPE Refresh(long param8); + + // *** IAddressEditBox methods *** + virtual HRESULT STDMETHODCALLTYPE Init(HWND comboboxEx, HWND editControl, long param14, IUnknown *param18); + virtual HRESULT STDMETHODCALLTYPE SetCurrentDir(long paramC); + virtual HRESULT STDMETHODCALLTYPE ParseNow(long paramC); + virtual HRESULT STDMETHODCALLTYPE Execute(long paramC); + virtual HRESULT STDMETHODCALLTYPE Save(long paramC); + + // *** IWinEventHandler methods *** + virtual HRESULT STDMETHODCALLTYPE OnWinEvent(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT *theResult); + virtual HRESULT STDMETHODCALLTYPE IsWindowOwner(HWND hWnd); + + // *** IOleCommandTarget methods *** + virtual HRESULT STDMETHODCALLTYPE QueryStatus(const GUID *pguidCmdGroup, ULONG cCmds, OLECMD prgCmds[ ], OLECMDTEXT *pCmdText); + virtual HRESULT STDMETHODCALLTYPE Exec(const GUID *pguidCmdGroup, DWORD nCmdID, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut); + + // *** IDispatch methods *** + virtual HRESULT STDMETHODCALLTYPE GetTypeInfoCount(UINT *pctinfo); + virtual HRESULT STDMETHODCALLTYPE GetTypeInfo(UINT iTInfo, LCID lcid, ITypeInfo **ppTInfo); + virtual HRESULT STDMETHODCALLTYPE GetIDsOfNames(REFIID riid, LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId); + virtual HRESULT STDMETHODCALLTYPE Invoke(DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr); + + // *** IPersist methods *** + virtual HRESULT STDMETHODCALLTYPE GetClassID(CLSID *pClassID); + + // *** IPersistStream methods *** + virtual HRESULT STDMETHODCALLTYPE IsDirty(); + virtual HRESULT STDMETHODCALLTYPE Load(IStream *pStm); + virtual HRESULT STDMETHODCALLTYPE Save(IStream *pStm, BOOL fClearDirty); + virtual HRESULT STDMETHODCALLTYPE GetSizeMax(ULARGE_INTEGER *pcbSize); + + // message handlers +// LRESULT OnSetFocus(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled); +// LRESULT OnKillFocus(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled); + +DECLARE_REGISTRY_RESOURCEID(IDR_ADDRESSEDITBOX) +DECLARE_NOT_AGGREGATABLE(CAddressEditBox) + +DECLARE_PROTECT_FINAL_CONSTRUCT() + +BEGIN_MSG_MAP(CAddressEditBox) +// MESSAGE_HANDLER(WM_NOTIFY, OnNotify) +// MESSAGE_HANDLER(WM_SETFOCUS, OnSetFocus) +// MESSAGE_HANDLER(WM_KILLFOCUS, OnKillFocus) +// ALT_MSG_MAP(1) +// MESSAGE_HANDLER(WM_SETFOCUS, OnSetFocusSaveButton) +// ALT_MSG_MAP(2) +// MESSAGE_HANDLER(WM_SETFOCUS, OnSetFocusSelectButton) +END_MSG_MAP() + +BEGIN_COM_MAP(CAddressEditBox) + COM_INTERFACE_ENTRY_IID(IID_IShellService, IShellService) + COM_INTERFACE_ENTRY_IID(IID_IAddressBand, IAddressBand) + COM_INTERFACE_ENTRY_IID(IID_IAddressEditBox, IAddressEditBox) + COM_INTERFACE_ENTRY_IID(IID_IWinEventHandler, IWinEventHandler) + COM_INTERFACE_ENTRY_IID(IID_IOleCommandTarget, IOleCommandTarget) + COM_INTERFACE_ENTRY_IID(IID_IDispatch, IDispatch) + COM_INTERFACE_ENTRY_IID(IID_IPersist, IPersist) + COM_INTERFACE_ENTRY_IID(IID_IPersistStream, IPersistStream) +END_COM_MAP() +}; + +#endif // _addresseditbox_h diff --git a/reactos/dll/win32/browseui/bandproxy.cpp b/reactos/dll/win32/browseui/bandproxy.cpp new file mode 100644 index 00000000000..1d75e436af4 --- /dev/null +++ b/reactos/dll/win32/browseui/bandproxy.cpp @@ -0,0 +1,161 @@ +/* + * ReactOS Explorer + * + * Copyright 2009 Andrew Hill + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +/* +Used by the address band to dispatch navigation changes to the main browser object. + +TODO: + +*/ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "resource.h" +#include "bandproxy.h" + +CBandProxy::CBandProxy() +{ +} + +CBandProxy::~CBandProxy() +{ +} + +HRESULT CBandProxy::FindBrowserWindow(IUnknown **browser) +{ + CComPtr serviceProvider; + CComPtr webBrowser; + HRESULT hResult; + + if (browser == NULL) + return E_POINTER; + hResult = fSite->QueryInterface(IID_IServiceProvider, (void **)&serviceProvider); + if (FAILED (hResult)) + return hResult; + hResult = serviceProvider->QueryService(SID_IWebBrowserApp, IID_IWebBrowser2, (void **)&webBrowser); + if (FAILED (hResult)) + return hResult; + *browser = webBrowser.Detach(); + return S_OK; +} + +HRESULT STDMETHODCALLTYPE CBandProxy::SetSite(IUnknown *paramC) +{ + fSite = paramC; + return S_OK; +} + +HRESULT STDMETHODCALLTYPE CBandProxy::CreateNewWindow(long paramC) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CBandProxy::GetBrowserWindow(IUnknown **paramC) +{ + if (paramC == NULL) + return E_POINTER; + return FindBrowserWindow(paramC); +} + +HRESULT STDMETHODCALLTYPE CBandProxy::IsConnected() +{ + CComPtr webBrowser; + HRESULT hResult; + + hResult = FindBrowserWindow(&webBrowser); + if (FAILED (hResult) || webBrowser.p == NULL) + return S_FALSE; + return S_OK; +} + +HRESULT STDMETHODCALLTYPE CBandProxy::NavigateToPIDL(LPCITEMIDLIST pidl) +{ + CComPtr oleWindow; + CComPtr serviceProvider; + CComPtr webBrowserUnknown; + CComPtr webBrowser; + HWND browserWindow; + CComVariant args; + CComVariant emptyVariant; + unsigned int arraySize; + HRESULT hResult; + + hResult = FindBrowserWindow(&webBrowserUnknown); + if (FAILED (hResult)) + return hResult; + hResult = webBrowserUnknown->QueryInterface(IID_IWebBrowserApp, (void **)&webBrowser); + if (FAILED (hResult)) + return hResult; + hResult = webBrowser->put_Visible(TRUE); + hResult = webBrowser->QueryInterface(IID_IServiceProvider, (void **)&serviceProvider); + if (SUCCEEDED (hResult)) + { + hResult = serviceProvider->QueryService(SID_STopLevelBrowser, IID_IOleWindow, (void **)&oleWindow); + if (SUCCEEDED (hResult)) + { + hResult = oleWindow->GetWindow(&browserWindow); + if (IsIconic(browserWindow)) + ShowWindow(browserWindow, SW_RESTORE); + } + } + arraySize = ILGetSize(pidl); + V_VT(&args) = VT_ARRAY | VT_UI1; + V_ARRAY(&args) = SafeArrayCreateVector(VT_UI1, 0, arraySize); + if (V_ARRAY(&args) == NULL) + return E_OUTOFMEMORY; + memcpy(V_ARRAY(&args)->pvData, pidl, arraySize); + hResult = webBrowser->Navigate2(&args, &emptyVariant, &emptyVariant, &emptyVariant, &emptyVariant); + if (FAILED (hResult)) + return hResult; + return S_OK; +} + +HRESULT STDMETHODCALLTYPE CBandProxy::NavigateToURL(long paramC, long param10) +{ + return E_NOTIMPL; +} + +HRESULT CreateBandProxy(REFIID riid, void **ppv) +{ + CComObject *theBandProxy; + HRESULT hResult; + + if (ppv == NULL) + return E_POINTER; + *ppv = NULL; + ATLTRY (theBandProxy = new CComObject); + if (theBandProxy == NULL) + return E_OUTOFMEMORY; + hResult = theBandProxy->QueryInterface (riid, (void **)ppv); + if (FAILED (hResult)) + { + delete theBandProxy; + return hResult; + } + return S_OK; +} diff --git a/reactos/dll/win32/browseui/bandproxy.h b/reactos/dll/win32/browseui/bandproxy.h new file mode 100644 index 00000000000..946e10380a7 --- /dev/null +++ b/reactos/dll/win32/browseui/bandproxy.h @@ -0,0 +1,54 @@ +/* + * ReactOS Explorer + * + * Copyright 2009 Andrew Hill + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#ifndef _bandproxy_h +#define _bandproxy_h + +class CBandProxy : + public CComCoClass, + public CComObjectRootEx, + public IBandProxy +{ +private: + CComPtr fSite; +public: + CBandProxy(); + ~CBandProxy(); + HRESULT FindBrowserWindow(IUnknown **browser); + + // *** IBandProxy methods *** + virtual HRESULT STDMETHODCALLTYPE SetSite(IUnknown *paramC); + virtual HRESULT STDMETHODCALLTYPE CreateNewWindow(long paramC); + virtual HRESULT STDMETHODCALLTYPE GetBrowserWindow(IUnknown **paramC); + virtual HRESULT STDMETHODCALLTYPE IsConnected(); + virtual HRESULT STDMETHODCALLTYPE NavigateToPIDL(LPCITEMIDLIST pidl); + virtual HRESULT STDMETHODCALLTYPE NavigateToURL(long paramC, long param10); + +DECLARE_REGISTRY_RESOURCEID(IDR_BANDPROXY) +DECLARE_NOT_AGGREGATABLE(CBandProxy) + +DECLARE_PROTECT_FINAL_CONSTRUCT() + +BEGIN_COM_MAP(CBandProxy) + COM_INTERFACE_ENTRY_IID(IID_IBandProxy, IBandProxy) +END_COM_MAP() +}; + +#endif // _bandproxy_h diff --git a/reactos/dll/win32/browseui/bandsite.c b/reactos/dll/win32/browseui/bandsite.c deleted file mode 100644 index 5144f9989c5..00000000000 --- a/reactos/dll/win32/browseui/bandsite.c +++ /dev/null @@ -1,1122 +0,0 @@ -/* - * Rebar band site - * - * Copyright 2007 Hervé Poussineau - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA - */ - -#include "config.h" - -#include - -#define COBJMACROS - -#include "wine/debug.h" -#include "windef.h" -#include "winbase.h" -#include "winreg.h" -#include "winuser.h" -#include "shlwapi.h" -#include "winerror.h" -#include "objbase.h" -#include "commctrl.h" - -#include "docobj.h" -#include "shlguid.h" -#include "shlobj.h" -#include "shobjidl.h" -#include "todo.h" -#include "undoc.h" - -#include "wine/unicode.h" - -#include "browseui.h" - -WINE_DEFAULT_DEBUG_CHANNEL(browseui); - -#ifndef ASSERT -#define ASSERT(cond) \ - if (!(cond)) \ - ERR ("ASSERTION %s AT %s:%d FAILED!\n", #cond, __FILE__, __LINE__) -#endif - -extern HINSTANCE browseui_hinstance; - -struct BandObject { - IDeskBand *DeskBand; - IOleWindow *OleWindow; - IWindowEventHandler *WndEvtHandler; - DESKBANDINFO dbi; -}; - -typedef struct tagBandSite { - const IBandSiteVtbl *vtbl; - const IWindowEventHandlerVtbl *eventhandlerVtbl; - const IDeskBarClientVtbl *deskbarVtbl; - const IOleCommandTargetVtbl *oletargetVtbl; - LONG refCount; - LONG BandsCount; - LONG BandsAllocated; - struct BandObject *Bands; - IUnknown *pUnkOuter; - HWND hWndRebar; - IOleWindow *OleWindow; -} BandSite; - -static const IBandSiteVtbl BandSiteVtbl; -static const IWindowEventHandlerVtbl BandSite_EventHandlerVtbl; -static const IDeskBarClientVtbl BandSite_DeskBarVtbl; -static const IOleCommandTargetVtbl BandSite_OleTargetVtbl; - -static inline BandSite *impl_from_IWindowEventHandler(IWindowEventHandler *iface) -{ - return (BandSite *)((char *)iface - FIELD_OFFSET(BandSite, eventhandlerVtbl)); -} - -static inline BandSite *impl_from_IDeskBarClient(IDeskBarClient *iface) -{ - return (BandSite *)((char *)iface - FIELD_OFFSET(BandSite, deskbarVtbl)); -} - -static inline BandSite *impl_from_IOleCommandTarget(IOleCommandTarget *iface) -{ - return (BandSite *)((char *)iface - FIELD_OFFSET(BandSite, oletargetVtbl)); -} - -static UINT GetBandID(BandSite *This, struct BandObject *Band) -{ - return (UINT)(Band - This->Bands); -} - -static struct BandObject* GetBandByID(BandSite *This, DWORD dwBandID) -{ - if (dwBandID >= This->BandsAllocated) - return NULL; - - if (This->Bands[dwBandID].DeskBand == NULL) - return NULL; - - return &This->Bands[dwBandID]; -} - -static void FreeBand(BandSite *This, struct BandObject *Band) -{ - ASSERT(Band->DeskBand != NULL); - ASSERT(Band->OleWindow != NULL); - ASSERT(Band->WndEvtHandler != NULL); - IDeskBand_Release(Band->DeskBand); - IOleWindow_Release(Band->OleWindow); - IWindowEventHandler_Release(Band->WndEvtHandler); - ZeroMemory(Band, sizeof(*Band)); - This->BandsCount--; -} - -static DWORD GetBandSiteViewMode(BandSite *This) -{ - DWORD dwStyle; - - /* FIXME: What about DBIF_VIEWMODE_FLOATING and DBIF_VIEWMODE_TRANSPARENT? */ - dwStyle = GetWindowLongPtr(This->hWndRebar, - GWL_STYLE); - - if (dwStyle & CCS_VERT) - return DBIF_VIEWMODE_VERTICAL; - else - return DBIF_VIEWMODE_NORMAL; -} - -static VOID BuildRebarBandInfo(BandSite *This, struct BandObject *Band, REBARBANDINFOW *prbi) -{ - ZeroMemory(prbi, sizeof(*prbi)); - prbi->cbSize = sizeof(*prbi); - - prbi->fMask = RBBIM_ID; - prbi->wID = GetBandID(This, - Band); - - if (Band->dbi.dwMask & DBIM_MINSIZE) - { - prbi->fMask |= RBBIM_CHILDSIZE; - prbi->cxMinChild = Band->dbi.ptMinSize.x; - prbi->cyMinChild = Band->dbi.ptMinSize.y; - } - - if (Band->dbi.dwMask & DBIM_MAXSIZE) - { - prbi->fMask |= RBBIM_CHILDSIZE; - prbi->cyMaxChild = Band->dbi.ptMaxSize.y; - } - - if ((Band->dbi.dwMask & (DBIM_INTEGRAL | DBIM_MODEFLAGS)) == (DBIM_INTEGRAL | DBIM_MODEFLAGS) && - (Band->dbi.dwModeFlags & DBIMF_VARIABLEHEIGHT)) - { - prbi->fMask |= RBBIM_CHILDSIZE; - prbi->cyIntegral = Band->dbi.ptIntegral.y; - } - - if (Band->dbi.dwMask & DBIM_ACTUAL) - { - prbi->fMask |= RBBIM_IDEALSIZE | RBBIM_SIZE | RBBIM_CHILDSIZE; - prbi->cxIdeal = Band->dbi.ptActual.x; - prbi->cx = Band->dbi.ptActual.x; - prbi->cyChild = Band->dbi.ptActual.y; - } - - if (Band->dbi.dwMask & DBIM_TITLE) - { - prbi->fMask |= RBBIM_TEXT; - prbi->lpText = Band->dbi.wszTitle; - prbi->cch = wcslen(Band->dbi.wszTitle); - } - - if (Band->dbi.dwMask & DBIM_MODEFLAGS) - { - prbi->fMask |= RBBIM_STYLE; - - if (Band->dbi.dwModeFlags & DBIMF_FIXED) - prbi->fStyle |= RBBS_FIXEDSIZE | RBBS_NOGRIPPER; - if (Band->dbi.dwModeFlags & DBIMF_FIXEDBMP) - prbi->fStyle |= RBBS_FIXEDBMP; - if (Band->dbi.dwModeFlags & DBIMF_VARIABLEHEIGHT) - prbi->fStyle |= RBBS_VARIABLEHEIGHT; - if (Band->dbi.dwModeFlags & DBIMF_DEBOSSED) - prbi->fStyle |= RBBS_CHILDEDGE; - if (Band->dbi.dwModeFlags & DBIMF_USECHEVRON) - prbi->fStyle |= RBBS_USECHEVRON; - if (Band->dbi.dwModeFlags & DBIMF_BREAK) - prbi->fStyle |= RBBS_BREAK; - if (Band->dbi.dwModeFlags & DBIMF_TOPALIGN) - prbi->fStyle |= RBBS_TOPALIGN; - if (Band->dbi.dwModeFlags & DBIMF_NOGRIPPER) - prbi->fStyle |= RBBS_NOGRIPPER; - if (Band->dbi.dwModeFlags & DBIMF_ALWAYSGRIPPER) - prbi->fStyle |= RBBS_GRIPPERALWAYS; - } - - if ((Band->dbi.dwMask & (DBIM_BKCOLOR | DBIM_MODEFLAGS)) == (DBIM_BKCOLOR | DBIM_MODEFLAGS) && - (Band->dbi.dwModeFlags & DBIMF_BKCOLOR)) - { - prbi->fMask |= RBBIM_COLORS; - prbi->clrFore = (COLORREF)(COLOR_WINDOWTEXT + 1); - prbi->clrBack = Band->dbi.crBkgnd; - } -} - -static HRESULT UpdateSingleBand(BandSite *This, struct BandObject *Band) -{ - REBARBANDINFOW rbi; - DWORD dwViewMode; - UINT uBand; - HRESULT hRet; - - ZeroMemory (&Band->dbi, sizeof(Band->dbi)); - Band->dbi.dwMask = DBIM_MINSIZE | DBIM_MAXSIZE | DBIM_INTEGRAL | - DBIM_ACTUAL | DBIM_TITLE | DBIM_MODEFLAGS | DBIM_BKCOLOR; - - dwViewMode = GetBandSiteViewMode(This); - - hRet = IDeskBand_GetBandInfo(Band->DeskBand, - (DWORD)GetBandID(This, - Band), - dwViewMode, - &Band->dbi); - if (SUCCEEDED(hRet)) - { - BuildRebarBandInfo(This, - Band, - &rbi); - if (SUCCEEDED(IOleWindow_GetWindow(Band->OleWindow, - &rbi.hwndChild)) && - rbi.hwndChild != NULL) - { - rbi.fMask |= RBBIM_CHILD; - WARN ("ReBar band uses child window 0x%p\n", rbi.hwndChild); - } - - uBand = (UINT)SendMessageW(This->hWndRebar, - RB_IDTOINDEX, - (WPARAM)rbi.wID, - 0); - if (uBand != (UINT)-1) - { - if (!SendMessageW(This->hWndRebar, - RB_SETBANDINFOW, - (WPARAM)uBand, - (LPARAM)&rbi)) - { - WARN("Failed to update the rebar band!\n"); - } - } - else - WARN("Failed to map rebar band id to index!\n"); - - } - - return hRet; -} - -static HRESULT UpdateAllBands(BandSite *This) -{ - LONG i; - HRESULT hRet; - - for (i = 0; i < This->BandsAllocated; i++) - { - if (This->Bands[i].DeskBand != NULL) - { - hRet = UpdateSingleBand(This, - &This->Bands[i]); - if (!SUCCEEDED(hRet)) - return hRet; - } - } - - return S_OK; -} - -static HRESULT UpdateBand(BandSite *This, DWORD dwBandID) -{ - struct BandObject *Band; - - Band = GetBandByID(This, - dwBandID); - if (Band == NULL) - return E_FAIL; - - return UpdateSingleBand(This, - Band); -} - -static struct BandObject* GetBandFromHwnd(BandSite *This, HWND hwnd) -{ - HRESULT hRet; - HWND hWndBand; - LONG i; - - for (i = 0; i < This->BandsAllocated; i++) - { - if (This->Bands[i].DeskBand != NULL) - { - ASSERT(This->Bands[i].OleWindow); - - hWndBand = NULL; - hRet = IOleWindow_GetWindow(This->Bands[i].OleWindow, - &hWndBand); - if (SUCCEEDED(hRet) && hWndBand == hwnd) - return &This->Bands[i]; - } - } - - return NULL; -} - -HRESULT WINAPI BandSite_Constructor(IUnknown *pUnkOuter, IUnknown **ppOut) -{ - BandSite *This; - - if (!pUnkOuter) - return E_POINTER; - - This = CoTaskMemAlloc(sizeof(BandSite)); - if (This == NULL) - return E_OUTOFMEMORY; - ZeroMemory(This, sizeof(*This)); - This->pUnkOuter = pUnkOuter; - IUnknown_AddRef(pUnkOuter); - This->vtbl = &BandSiteVtbl; - This->eventhandlerVtbl = &BandSite_EventHandlerVtbl; - This->deskbarVtbl = &BandSite_DeskBarVtbl; - This->oletargetVtbl = &BandSite_OleTargetVtbl; - This->refCount = 1; - - TRACE("returning %p\n", This); - *ppOut = (IUnknown *)This; - BROWSEUI_refCount++; - return S_OK; -} - -static void WINAPI BandSite_Destructor(BandSite *This) -{ - int i; - TRACE("destroying %p\n", This); - - if (This->hWndRebar != NULL) - { - DestroyWindow(This->hWndRebar); - This->hWndRebar = NULL; - } - - if (This->pUnkOuter != NULL) - { - IUnknown_Release(This->pUnkOuter); - This->pUnkOuter = NULL; - } - - if (This->Bands != NULL) - { - for (i = 0; i < This->BandsAllocated; i++) - { - if (This->Bands[i].DeskBand != NULL) - FreeBand(This, &This->Bands[i]); - } - CoTaskMemFree(This->Bands); - This->Bands = NULL; - } - - if (This->OleWindow != NULL) - { - This->OleWindow->lpVtbl->Release(This->OleWindow); - This->OleWindow = NULL; - } - - CoTaskMemFree(This); - BROWSEUI_refCount--; -} - -static HRESULT WINAPI BandSite_QueryInterface(IBandSite *iface, REFIID iid, LPVOID *ppvOut) -{ - BandSite *This = (BandSite *)iface; - *ppvOut = NULL; - - TRACE("(%p, %s, %p)\n", iface, debugstr_guid(iid), ppvOut); - - if (IsEqualIID(iid, &IID_IUnknown) || IsEqualIID(iid, &IID_IBandSite)) - { - *ppvOut = &This->vtbl; - } - else if (IsEqualIID(iid, &IID_IWindowEventHandler)) - { - *ppvOut = &This->eventhandlerVtbl; - } - else if (IsEqualIID(iid, &IID_IOleWindow) || IsEqualIID(iid, &IID_IDeskBarClient)) - { - *ppvOut = &This->deskbarVtbl; - } - else if (IsEqualIID(iid, &IID_IOleCommandTarget)) - { - *ppvOut = &This->oletargetVtbl; - } - - if (*ppvOut) - { - IUnknown_AddRef(iface); - return S_OK; - } - - WARN("unsupported interface: %s\n", debugstr_guid(iid)); - return E_NOINTERFACE; -} - -static ULONG WINAPI BandSite_AddRef(IBandSite *iface) -{ - BandSite *This = (BandSite *)iface; - TRACE("(%p)\n", iface); - return InterlockedIncrement(&This->refCount); -} - -static ULONG WINAPI BandSite_Release(IBandSite *iface) -{ - BandSite *This = (BandSite *)iface; - ULONG ret; - - TRACE("(%p)\n", iface); - - ret = InterlockedDecrement(&This->refCount); - if (ret == 0) - BandSite_Destructor(This); - return ret; -} - -static HRESULT WINAPI BandSite_AddBand(IBandSite *iface, IUnknown *punk) -{ - BandSite *This = (BandSite *)iface; - INT i; - LONG NewAllocated; - struct BandObject *NewBand = NULL; - IDeskBand *DeskBand = NULL; - IObjectWithSite *ObjWithSite = NULL; - IOleWindow *OleWindow = NULL; - IWindowEventHandler *WndEvtHandler = NULL; - REBARBANDINFOW rbi; - HRESULT hRet; - UINT uBand; - - TRACE("(%p, %p)\n", iface, punk); - - if (punk == NULL || This->hWndRebar == NULL) - return E_FAIL; - - hRet = IUnknown_QueryInterface(punk, - &IID_IDeskBand, - (PVOID*)&DeskBand); - if (!SUCCEEDED(hRet) || DeskBand == NULL) - goto Cleanup; - hRet = IUnknown_QueryInterface(punk, - &IID_IObjectWithSite, - (PVOID*)&ObjWithSite); - if (!SUCCEEDED(hRet) || ObjWithSite == NULL) - goto Cleanup; - hRet = IUnknown_QueryInterface(punk, - &IID_IOleWindow, - (PVOID*)&OleWindow); - if (!SUCCEEDED(hRet) || OleWindow == NULL) - goto Cleanup; - hRet = IUnknown_QueryInterface(punk, - &IID_IWindowEventHandler, - (PVOID*)&WndEvtHandler); - if (!SUCCEEDED(hRet) || WndEvtHandler == NULL) - goto Cleanup; - - hRet = S_OK; - if (This->BandsAllocated > This->BandsCount) - { - /* Search for a free band object */ - for (i = 0; i < This->BandsAllocated; i++) - { - if (This->Bands[i].DeskBand == NULL) - { - NewBand = &This->Bands[i]; - break; - } - } - } - else if (This->BandsAllocated > 0) - { - ASSERT (This->Bands != NULL); - - /* Reallocate the band object array */ - NewAllocated = This->BandsAllocated + 8; - if (NewAllocated > 0xFFFF) - NewAllocated = 0xFFFF; - if (NewAllocated == This->BandsAllocated) - { - hRet = E_OUTOFMEMORY; - goto Cleanup; - } - - - NewBand = CoTaskMemAlloc(NewAllocated * sizeof(struct BandObject)); - if (NewBand == NULL) - { - hRet = E_OUTOFMEMORY; - goto Cleanup; - } - - /* Copy the old array */ - CopyMemory(NewBand, This->Bands, This->BandsAllocated * sizeof(struct BandObject)); - - /* Initialize the added bands */ - ZeroMemory(&NewBand[This->BandsAllocated], (NewAllocated - This->BandsAllocated) * sizeof(struct BandObject)); - - NewBand = &This->Bands[This->BandsAllocated]; - This->BandsAllocated = NewAllocated; - CoTaskMemFree(This->Bands); - This->Bands = NewBand; - } - else - { - ASSERT(This->Bands == NULL); - ASSERT(This->BandsAllocated == 0); - ASSERT(This->BandsCount == 0); - - /* Allocate new array */ - This->Bands = CoTaskMemAlloc(8 * sizeof(struct BandObject)); - if (This->Bands == NULL) - { - hRet = E_OUTOFMEMORY; - goto Cleanup; - } - - /* Initialize the added bands */ - ZeroMemory(This->Bands, 8 * sizeof(struct BandObject)); - - This->BandsAllocated += 8; - NewBand = &This->Bands[0]; - } - - if (SUCCEEDED(hRet)) - { - ASSERT(NewBand != NULL); - - This->BandsCount++; - NewBand->DeskBand = DeskBand; - NewBand->OleWindow = OleWindow; - NewBand->WndEvtHandler = WndEvtHandler; - - DeskBand = NULL; - OleWindow = NULL; - WndEvtHandler = NULL; - - /* Create the ReBar band */ - hRet = IObjectWithSite_SetSite(ObjWithSite, - (IUnknown*)iface); - if (SUCCEEDED(hRet)) - { - uBand = (UINT)-1; - if (SUCCEEDED(UpdateSingleBand(This, - NewBand))) - { - if (NewBand->dbi.dwMask & DBIM_MODEFLAGS) - { - if (NewBand->dbi.dwModeFlags & DBIMF_ADDTOFRONT) - uBand = 0; - } - } - - BuildRebarBandInfo(This, - NewBand, - &rbi); - - if (SUCCEEDED(IOleWindow_GetWindow(NewBand->OleWindow, - &rbi.hwndChild)) && - rbi.hwndChild != NULL) - { - rbi.fMask |= RBBIM_CHILD; - WARN ("ReBar band uses child window 0x%p\n", rbi.hwndChild); - } - - if (!SendMessageW(This->hWndRebar, - RB_INSERTBANDW, - (WPARAM)uBand, - (LPARAM)&rbi)) - { - hRet = E_FAIL; - goto Cleanup; - } - - hRet = (HRESULT)((USHORT)GetBandID(This, - NewBand)); - } - else - { - WARN("IBandSite::AddBand(): Call to IDeskBand::SetSite() failed: %x\n", hRet); - - /* Remove the band from the ReBar control */ - uBand = (UINT)SendMessageW(This->hWndRebar, - RB_IDTOINDEX, - (WPARAM)rbi.wID, - 0); - if (uBand != (UINT)-1) - { - if (!SendMessageW(This->hWndRebar, - RB_DELETEBAND, - (WPARAM)uBand, - 0)) - { - ERR("Failed to delete band!\n"); - } - } - else - ERR("Failed to map band id to index!\n"); - - FreeBand(This, - NewBand); - - hRet = E_FAIL; - /* goto Cleanup; */ - } - } -Cleanup: - if (DeskBand != NULL) - IDeskBand_Release(DeskBand); - if (ObjWithSite != NULL) - IObjectWithSite_Release(ObjWithSite); - if (OleWindow != NULL) - IOleWindow_Release(OleWindow); - if (WndEvtHandler != NULL) - IWindowEventHandler_Release(WndEvtHandler); - return hRet; -} - -static HRESULT WINAPI BandSite_EnumBands(IBandSite *iface, UINT uBand, DWORD *pdwBandID) -{ - BandSite *This = (BandSite *)iface; - DWORD i; - - TRACE("(%p, %u, %p)\n", iface, uBand, pdwBandID); - - if (uBand == (UINT)-1) - return (UINT)This->BandsCount; - - if (uBand >= This->BandsCount) - return E_FAIL; - - for (i = 0; i < This->BandsAllocated; i++) - { - if (This->Bands[i].DeskBand != NULL) - { - if (uBand == 0) - { - *pdwBandID = i; - return S_OK; - } - - uBand--; - } - } - - return E_FAIL; -} - -static HRESULT WINAPI BandSite_QueryBand(IBandSite *iface, DWORD dwBandID, IDeskBand **ppstb, DWORD *pdwState, LPWSTR pszName, int cchName) -{ - BandSite *This = (BandSite *)iface; - struct BandObject *Band; - - TRACE("(%p, %u, %p, %p, %p, %d)\n", iface, dwBandID, ppstb, pdwState, pszName, cchName); - - Band = GetBandByID(This, dwBandID); - if (Band == NULL) - return E_FAIL; - - if (ppstb != NULL) - { - Band->DeskBand->lpVtbl->AddRef(Band->DeskBand); - *ppstb = Band->DeskBand; - } - - if (pdwState != NULL) - { - FIXME("IBandSite::QueryBand() requests band state!\n"); - *pdwState = 0; - } - - if (pszName != NULL && cchName > 0) - { - FIXME("IBandSite::QueryBand() requests band name!\n"); - pszName[0] = 0; - } - return S_OK; -} - -static HRESULT WINAPI BandSite_SetBandState(IBandSite *iface, DWORD dwBandID, DWORD dwMask, DWORD dwState) -{ - BandSite *This = (BandSite *)iface; - struct BandObject *Band; - - TRACE("(%p, %u, %x, %x)\n", iface, dwBandID, dwMask, dwState); - - Band = GetBandByID(This, dwBandID); - if (Band == NULL) - return E_FAIL; - - FIXME("Stub\n"); - return E_NOTIMPL; -} - -static HRESULT WINAPI BandSite_RemoveBand(IBandSite *iface, DWORD dwBandID) -{ - BandSite *This = (BandSite *)iface; - struct BandObject *Band; - UINT uBand; - - TRACE("(%p, %u)\n", iface, dwBandID); - - if (This->hWndRebar == NULL) - return E_FAIL; - - Band = GetBandByID(This, dwBandID); - if (Band == NULL) - return E_FAIL; - - uBand = (UINT)SendMessageW(This->hWndRebar, - RB_IDTOINDEX, - (WPARAM)GetBandID(This, - Band), - 0); - if (uBand != (UINT)-1) - { - if (!SendMessageW(This->hWndRebar, - RB_DELETEBAND, - (WPARAM)uBand, - 0)) - { - ERR("Could not delete band!\n"); - } - } - else - ERR("Could not map band id to index!\n"); - - FreeBand(This, Band); - return S_OK; -} - -static HRESULT WINAPI BandSite_GetBandObject(IBandSite *iface, DWORD dwBandID, REFIID riid, VOID **ppv) -{ - BandSite *This = (BandSite *)iface; - struct BandObject *Band; - - TRACE("(%p, %u, %s, %p)\n", iface, dwBandID, debugstr_guid(riid), ppv); - - Band = GetBandByID(This, dwBandID); - if (Band == NULL) - { - *ppv = NULL; - return E_FAIL; - } - - return IDeskBand_QueryInterface(Band->DeskBand, riid, ppv); -} - -static HRESULT WINAPI BandSite_SetBandSiteInfo(IBandSite *iface, const BANDSITEINFO *pbsinfo) -{ - FIXME("(%p, %p)\n", iface, pbsinfo); - return E_NOTIMPL; -} - -static HRESULT WINAPI BandSite_GetBandSiteInfo(IBandSite *iface, BANDSITEINFO *pbsinfo) -{ - FIXME("(%p, %p)\n", iface, pbsinfo); - return E_NOTIMPL; -} - -static const IBandSiteVtbl BandSiteVtbl = -{ - BandSite_QueryInterface, - BandSite_AddRef, - BandSite_Release, - - BandSite_AddBand, - BandSite_EnumBands, - BandSite_QueryBand, - BandSite_SetBandState, - BandSite_RemoveBand, - BandSite_GetBandObject, - BandSite_SetBandSiteInfo, - BandSite_GetBandSiteInfo, -}; - -static HRESULT WINAPI BandSite_IWindowEventHandler_QueryInterface(IWindowEventHandler *iface, REFIID iid, LPVOID *ppvOut) -{ - BandSite *This = impl_from_IWindowEventHandler(iface); - TRACE("(%p, %s, %p)\n", iface, debugstr_guid(iid), ppvOut); - return BandSite_QueryInterface((IBandSite *)This, iid, ppvOut); -} - -static ULONG WINAPI BandSite_IWindowEventHandler_AddRef(IWindowEventHandler *iface) -{ - BandSite *This = impl_from_IWindowEventHandler(iface); - TRACE("(%p)\n", iface); - return BandSite_AddRef((IBandSite *)This); -} - -static ULONG WINAPI BandSite_IWindowEventHandler_Release(IWindowEventHandler *iface) -{ - BandSite *This = impl_from_IWindowEventHandler(iface); - TRACE("(%p)\n", iface); - return BandSite_Release((IBandSite *)This); -} - -static HRESULT WINAPI BandSite_ProcessMessage(IWindowEventHandler *iface, HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT *plrResult) -{ - BandSite *This = impl_from_IWindowEventHandler(iface); - struct BandObject *Band; - - TRACE("(%p, %p, %u, %p, %p, %p)\n", iface, hWnd, uMsg, wParam, lParam, plrResult); - - *plrResult = 0; - if (This->hWndRebar == NULL) - return E_FAIL; - - if (hWnd == This->hWndRebar) - { - /* FIXME: Just send the message? */ - *plrResult = SendMessageW(hWnd, - uMsg, - wParam, - lParam); - return S_OK; - } - - Band = GetBandFromHwnd(This, - hWnd); - if (Band != NULL) - { - return IWindowEventHandler_ProcessMessage(Band->WndEvtHandler, - hWnd, - uMsg, - wParam, - lParam, - plrResult); - } - - return E_FAIL; -} - -static HRESULT WINAPI BandSite_ContainsWindow(IWindowEventHandler *iface, HWND hWnd) -{ - BandSite *This = impl_from_IWindowEventHandler(iface); - struct BandObject *Band; - - TRACE("(%p, %p)\n", iface, hWnd); - - if (This->hWndRebar == NULL) - return E_FAIL; - - Band = GetBandFromHwnd(This, - hWnd); - if (Band != NULL) - return S_OK; - - return S_FALSE; -} - -static const IWindowEventHandlerVtbl BandSite_EventHandlerVtbl = -{ - BandSite_IWindowEventHandler_QueryInterface, - BandSite_IWindowEventHandler_AddRef, - BandSite_IWindowEventHandler_Release, - - BandSite_ProcessMessage, - BandSite_ContainsWindow, -}; - -static HRESULT WINAPI BandSite_IDeskBarClient_QueryInterface(IDeskBarClient *iface, REFIID iid, LPVOID *ppvOut) -{ - BandSite *This = impl_from_IDeskBarClient(iface); - TRACE("(%p, %s, %p)\n", iface, debugstr_guid(iid), ppvOut); - return BandSite_QueryInterface((IBandSite *)This, iid, ppvOut); -} - -static ULONG WINAPI BandSite_IDeskBarClient_AddRef(IDeskBarClient *iface) -{ - BandSite *This = impl_from_IDeskBarClient(iface); - TRACE("(%p)\n", iface); - return BandSite_AddRef((IBandSite *)This); -} - -static ULONG WINAPI BandSite_IDeskBarClient_Release(IDeskBarClient *iface) -{ - BandSite *This = impl_from_IDeskBarClient(iface); - TRACE("(%p)\n", iface); - return BandSite_Release((IBandSite *)This); -} - -static HRESULT WINAPI BandSite_IDeskBarClient_GetWindow(IDeskBarClient *iface, HWND *phWnd) -{ - BandSite *This = impl_from_IDeskBarClient(iface); - - TRACE("(%p, %p)\n", iface, phWnd); - - *phWnd = This->hWndRebar; - if (This->hWndRebar != NULL) - return S_OK; - - return E_FAIL; -} - -static HRESULT WINAPI BandSite_IDeskBarClient_ContextSensitiveHelp(IDeskBarClient *iface, BOOL fEnterMode) -{ - FIXME("(%p, %d)\n", iface, fEnterMode); - return E_NOTIMPL; -} - -static HRESULT WINAPI BandSite_IDeskBarClient_SetDeskBarSite(IDeskBarClient *iface, IUnknown *pUnk) -{ - BandSite *This = impl_from_IDeskBarClient(iface); - HWND hWndParent; - HRESULT hRet; - - TRACE("(%p, %p)\n", iface, pUnk); - - if (This->OleWindow != NULL) - { - This->OleWindow->lpVtbl->Release(This->OleWindow); - This->OleWindow = NULL; - } - - hRet = IUnknown_QueryInterface(pUnk, - &IID_IOleWindow, - (PVOID*)&This->OleWindow); - if (!SUCCEEDED(hRet)) - { - This->OleWindow = NULL; - return E_FAIL; - } - - hRet = IOleWindow_GetWindow(This->OleWindow, - &hWndParent); - if (!SUCCEEDED(hRet)) - return E_FAIL; - - This->hWndRebar = CreateWindowExW(WS_EX_TOOLWINDOW, - REBARCLASSNAMEW, - NULL, - WS_CHILD | WS_CLIPSIBLINGS | - WS_CLIPCHILDREN | RBS_VARHEIGHT | - RBS_BANDBORDERS | CCS_NODIVIDER | - CCS_NORESIZE | CCS_NOPARENTALIGN, - 0, - 0, - 0, - 0, - hWndParent, - NULL, - browseui_hinstance, - NULL); - if (This->hWndRebar == NULL) - { - IOleWindow_Release(This->OleWindow); - This->OleWindow = NULL; - WARN("IDeskbarClient::SetDeskBarSite() failed to create ReBar control!\n"); - return E_FAIL; - } - - return S_OK; -} - -static HRESULT WINAPI BandSite_IDeskBarClient_SetModeDBC(IDeskBarClient *iface, DWORD dwMode) -{ - BandSite *This = impl_from_IDeskBarClient(iface); - LONG dwStyle, dwPrevStyle; - - TRACE("(%p, %x)\n", iface, dwMode); - - if (This->hWndRebar == NULL) - return E_FAIL; - - dwStyle = dwPrevStyle = GetWindowLongPtr(This->hWndRebar, - GWL_STYLE); - if (dwMode & DBIF_VIEWMODE_VERTICAL) - dwStyle |= CCS_VERT; - - if (dwMode & ~DBIF_VIEWMODE_VERTICAL) - FIXME("IDeskBarClient::SetModeDBC() unhandled modes: %x\n", dwStyle & ~DBIF_VIEWMODE_VERTICAL); - - if (dwStyle != dwPrevStyle) - { - SetWindowLongPtr(This->hWndRebar, - GWL_STYLE, - dwPrevStyle); - } - - return S_OK; -} - -static HRESULT WINAPI BandSite_IDeskBarClient_UIActivateDBC(IDeskBarClient *iface, DWORD dwState) -{ - BandSite *This = impl_from_IDeskBarClient(iface); - - TRACE("(%p, %x)\n", iface, dwState); - - if (This->hWndRebar == NULL) - return E_FAIL; - - ShowWindow(This->hWndRebar, (dwState & DBC_SHOW) ? SW_SHOW : SW_HIDE); - FIXME("IDeskBarClient::UIActivateDBC() Properly notify bands?\n"); - return S_OK; -} - -static HRESULT WINAPI BandSite_IDeskBarClient_GetSize(IDeskBarClient *iface, DWORD unknown1, LPRECT unknown2) -{ - FIXME("(%p, %x, %p)\n", iface, unknown1, unknown2); - return E_NOTIMPL; -} - -static const IDeskBarClientVtbl BandSite_DeskBarVtbl = -{ - BandSite_IDeskBarClient_QueryInterface, - BandSite_IDeskBarClient_AddRef, - BandSite_IDeskBarClient_Release, - - BandSite_IDeskBarClient_GetWindow, - BandSite_IDeskBarClient_ContextSensitiveHelp, - - BandSite_IDeskBarClient_SetDeskBarSite, - BandSite_IDeskBarClient_SetModeDBC, - BandSite_IDeskBarClient_UIActivateDBC, - BandSite_IDeskBarClient_GetSize, -}; - -static HRESULT WINAPI BandSite_IOleCommandTarget_QueryInterface(IOleCommandTarget *iface, REFIID iid, LPVOID *ppvOut) -{ - BandSite *This = impl_from_IOleCommandTarget(iface); - TRACE("(%p, %s, %p)\n", iface, debugstr_guid(iid), ppvOut); - return BandSite_QueryInterface((IBandSite *)This, iid, ppvOut); -} - -static ULONG WINAPI BandSite_IOleCommandTarget_AddRef(IOleCommandTarget *iface) -{ - BandSite *This = impl_from_IOleCommandTarget(iface); - TRACE("(%p)\n", iface); - return BandSite_AddRef((IBandSite *)This); -} - -static ULONG WINAPI BandSite_IOleCommandTarget_Release(IOleCommandTarget *iface) -{ - BandSite *This = impl_from_IOleCommandTarget(iface); - TRACE("(%p)\n", iface); - return BandSite_Release((IBandSite *)This); -} - -static HRESULT WINAPI BandSite_IOleCommandTarget_QueryStatus(IOleCommandTarget *iface, const GUID *pguidCmdGroup, DWORD cCmds, OLECMD *prgCmds, OLECMDTEXT *pCmdText) -{ - FIXME("(%p, %p, %u, %p, %p)\n", iface, pguidCmdGroup, cCmds, prgCmds, pCmdText); - return E_NOTIMPL; -} - -static HRESULT WINAPI BandSite_IOleCommandTarget_Exec(IOleCommandTarget *iface, const GUID *pguidCmdGroup, DWORD nCmdID, DWORD nCmdExecOpt, VARIANTARG *pvaIn, VARIANTARG *pvaOut) -{ - BandSite *This = impl_from_IOleCommandTarget(iface); - HRESULT hRet = S_OK; - - TRACE("(%p, %p, %u, %u, %p, %p)\n", iface, pguidCmdGroup, nCmdID, nCmdExecOpt, pvaIn, pvaOut); - - if (This->hWndRebar == NULL) - return E_FAIL; - - if (IsEqualIID(pguidCmdGroup, &IID_IDeskBand)) - { - switch (nCmdID) - { - case DBID_BANDINFOCHANGED: - if (pvaIn == NULL) - hRet = UpdateAllBands(This); - else - { - /* Update a single band */ - if (pvaIn->n1.n2.vt == VT_I4) - hRet = UpdateBand(This, pvaIn->n1.n2.n3.lVal); - else - hRet = E_FAIL; - } - break; - - case DBID_SHOWONLY: - case DBID_MAXIMIZEBAND: - case DBID_PUSHCHEVRON: - FIXME("IOleCommandTarget::Exec(): Unsupported command ID %d\n", nCmdID); - return E_NOTIMPL; - default: - return E_FAIL; - } - return S_OK; - } - else - WARN("IOleCommandTarget::Exec(): Unsupported command group GUID\n"); - - return E_NOTIMPL; -} - -static const IOleCommandTargetVtbl BandSite_OleTargetVtbl = -{ - BandSite_IOleCommandTarget_QueryInterface, - BandSite_IOleCommandTarget_AddRef, - BandSite_IOleCommandTarget_Release, - - BandSite_IOleCommandTarget_QueryStatus, - BandSite_IOleCommandTarget_Exec, -}; diff --git a/reactos/dll/win32/browseui/bandsite.cpp b/reactos/dll/win32/browseui/bandsite.cpp new file mode 100644 index 00000000000..c3e2e6ad1a0 --- /dev/null +++ b/reactos/dll/win32/browseui/bandsite.cpp @@ -0,0 +1,844 @@ +/* + * Rebar band site + * + * Copyright 2007 Hervé Poussineau + * Copyright 2009 Andrew Hill + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "resource.h" +#include "wine/debug.h" +#include "bandsite.h" + +WINE_DEFAULT_DEBUG_CHANNEL(browseui); + +#ifndef ASSERT +#define ASSERT(cond) \ + if (!(cond)) \ + ERR ("ASSERTION %s AT %s:%d FAILED!\n", #cond, __FILE__, __LINE__) +#endif + +CBandSiteBase::CBandSiteBase() +{ + fBandsCount = 0; + fBandsAllocated = 0; + fBands = NULL; + fRebarWindow = NULL; +} + +UINT CBandSiteBase::GetBandID(struct BandObject *Band) +{ + return (UINT)(Band - fBands); +} + +struct CBandSiteBase::BandObject *CBandSiteBase::GetBandByID(DWORD dwBandID) +{ + if ((LONG)dwBandID >= fBandsAllocated) + return NULL; + + if (fBands[dwBandID].DeskBand == NULL) + return NULL; + + return &fBands[dwBandID]; +} + +void CBandSiteBase::FreeBand(struct BandObject *Band) +{ + ATLASSERT(Band->DeskBand != NULL); + ATLASSERT(Band->OleWindow != NULL); + ATLASSERT(Band->WndEvtHandler != NULL); + Band->DeskBand->Release(); + Band->OleWindow->Release(); + Band->WndEvtHandler->Release(); + memset(Band, 0, sizeof(*Band)); + fBandsCount--; +} + +DWORD CBandSiteBase::GetBandSiteViewMode() +{ + DWORD dwStyle; + + /* FIXME: What about DBIF_VIEWMODE_FLOATING and DBIF_VIEWMODE_TRANSPARENT? */ + dwStyle = GetWindowLongPtr(fRebarWindow, GWL_STYLE); + + if (dwStyle & CCS_VERT) + return DBIF_VIEWMODE_VERTICAL; + else + return DBIF_VIEWMODE_NORMAL; +} + +VOID CBandSiteBase::BuildRebarBandInfo(struct BandObject *Band, REBARBANDINFOW *prbi) +{ + memset(prbi, 0, sizeof(*prbi)); + prbi->cbSize = sizeof(*prbi); + + prbi->fMask = RBBIM_ID; + prbi->wID = GetBandID(Band); + + if (Band->dbi.dwMask & DBIM_MINSIZE) + { + prbi->fMask |= RBBIM_CHILDSIZE; + prbi->cxMinChild = Band->dbi.ptMinSize.x; + prbi->cyMinChild = Band->dbi.ptMinSize.y; + } + + if (Band->dbi.dwMask & DBIM_MAXSIZE) + { + prbi->fMask |= RBBIM_CHILDSIZE; + prbi->cyMaxChild = Band->dbi.ptMaxSize.y; + } + + if ((Band->dbi.dwMask & (DBIM_INTEGRAL | DBIM_MODEFLAGS)) == (DBIM_INTEGRAL | DBIM_MODEFLAGS) && + (Band->dbi.dwModeFlags & DBIMF_VARIABLEHEIGHT)) + { + prbi->fMask |= RBBIM_CHILDSIZE; + prbi->cyIntegral = Band->dbi.ptIntegral.y; + } + + if (Band->dbi.dwMask & DBIM_ACTUAL) + { + prbi->fMask |= RBBIM_IDEALSIZE | RBBIM_SIZE | RBBIM_CHILDSIZE; + prbi->cxIdeal = Band->dbi.ptActual.x; + prbi->cx = Band->dbi.ptActual.x; + prbi->cyChild = Band->dbi.ptActual.y; + } + + if (Band->dbi.dwMask & DBIM_TITLE) + { + prbi->fMask |= RBBIM_TEXT; + prbi->lpText = Band->dbi.wszTitle; + prbi->cch = wcslen(Band->dbi.wszTitle); + } + + if (Band->dbi.dwMask & DBIM_MODEFLAGS) + { + prbi->fMask |= RBBIM_STYLE; + + if (Band->dbi.dwModeFlags & DBIMF_FIXED) + prbi->fStyle |= RBBS_FIXEDSIZE | RBBS_NOGRIPPER; + if (Band->dbi.dwModeFlags & DBIMF_FIXEDBMP) + prbi->fStyle |= RBBS_FIXEDBMP; + if (Band->dbi.dwModeFlags & DBIMF_VARIABLEHEIGHT) + prbi->fStyle |= RBBS_VARIABLEHEIGHT; + if (Band->dbi.dwModeFlags & DBIMF_DEBOSSED) + prbi->fStyle |= RBBS_CHILDEDGE; + if (Band->dbi.dwModeFlags & DBIMF_USECHEVRON) + prbi->fStyle |= RBBS_USECHEVRON; + if (Band->dbi.dwModeFlags & DBIMF_BREAK) + prbi->fStyle |= RBBS_BREAK; + if (Band->dbi.dwModeFlags & DBIMF_TOPALIGN) + prbi->fStyle |= RBBS_TOPALIGN; + if (Band->dbi.dwModeFlags & DBIMF_NOGRIPPER) + prbi->fStyle |= RBBS_NOGRIPPER; + if (Band->dbi.dwModeFlags & DBIMF_ALWAYSGRIPPER) + prbi->fStyle |= RBBS_GRIPPERALWAYS; + } + + if ((Band->dbi.dwMask & (DBIM_BKCOLOR | DBIM_MODEFLAGS)) == (DBIM_BKCOLOR | DBIM_MODEFLAGS) && + (Band->dbi.dwModeFlags & DBIMF_BKCOLOR)) + { + prbi->fMask |= RBBIM_COLORS; + prbi->clrFore = (COLORREF)(COLOR_WINDOWTEXT + 1); + prbi->clrBack = Band->dbi.crBkgnd; + } +} + +HRESULT CBandSiteBase::UpdateSingleBand(struct BandObject *Band) +{ + REBARBANDINFOW rbi; + DWORD dwViewMode; + UINT uBand; + HRESULT hRet; + + memset(&Band->dbi, 0, sizeof(Band->dbi)); + Band->dbi.dwMask = DBIM_MINSIZE | DBIM_MAXSIZE | DBIM_INTEGRAL | + DBIM_ACTUAL | DBIM_TITLE | DBIM_MODEFLAGS | DBIM_BKCOLOR; + + dwViewMode = GetBandSiteViewMode(); + + hRet = Band->DeskBand->GetBandInfo((DWORD)GetBandID(Band), dwViewMode, &Band->dbi); + if (SUCCEEDED(hRet)) + { + BuildRebarBandInfo(Band, &rbi); + if (SUCCEEDED(Band->OleWindow->GetWindow(&rbi.hwndChild)) && + rbi.hwndChild != NULL) + { + rbi.fMask |= RBBIM_CHILD; + WARN ("ReBar band uses child window 0x%p\n", rbi.hwndChild); + } + + uBand = (UINT)SendMessageW(fRebarWindow, RB_IDTOINDEX, (WPARAM)rbi.wID, 0); + if (uBand != (UINT)-1) + { + if (!SendMessageW(fRebarWindow, RB_SETBANDINFOW, (WPARAM)uBand, (LPARAM)&rbi)) + { + WARN("Failed to update the rebar band!\n"); + } + } + else + WARN("Failed to map rebar band id to index!\n"); + + } + + return hRet; +} + +HRESULT CBandSiteBase::UpdateAllBands() +{ + LONG i; + HRESULT hRet; + + for (i = 0; i < fBandsAllocated; i++) + { + if (fBands[i].DeskBand != NULL) + { + hRet = UpdateSingleBand(&fBands[i]); + if (!SUCCEEDED(hRet)) + return hRet; + } + } + + return S_OK; +} + +HRESULT CBandSiteBase::UpdateBand(DWORD dwBandID) +{ + struct BandObject *Band; + + Band = GetBandByID(dwBandID); + if (Band == NULL) + return E_FAIL; + + return UpdateSingleBand(Band); +} + +struct CBandSiteBase::BandObject *CBandSiteBase::GetBandFromHwnd(HWND hwnd) +{ + HRESULT hRet; + HWND hWndBand; + LONG i; + + for (i = 0; i < fBandsAllocated; i++) + { + if (fBands[i].DeskBand != NULL) + { + ASSERT(fBands[i].OleWindow); + + hWndBand = NULL; + hRet = fBands[i].OleWindow->GetWindow(&hWndBand); + if (SUCCEEDED(hRet) && hWndBand == hwnd) + return &fBands[i]; + } + } + + return NULL; +} + +CBandSiteBase::~CBandSiteBase() +{ + int i; + + TRACE("destroying %p\n", this); + + if (fRebarWindow != NULL) + { + DestroyWindow(fRebarWindow); + fRebarWindow = NULL; + } + + if (fBands != NULL) + { + for (i = 0; i < fBandsAllocated; i++) + { + if (fBands[i].DeskBand != NULL) + FreeBand(&fBands[i]); + } + CoTaskMemFree(fBands); + fBands = NULL; + } +} + +HRESULT STDMETHODCALLTYPE CBandSiteBase::AddBand(IUnknown *punk) +{ + INT i; + LONG NewAllocated; + struct BandObject *NewBand = NULL; + CComPtr DeskBand; + CComPtr ObjWithSite; + CComPtr OleWindow; + CComPtr WndEvtHandler; + REBARBANDINFOW rbi; + HRESULT hRet; + UINT uBand; + + TRACE("(%p, %p)\n", this, punk); + + if (punk == NULL || fRebarWindow == NULL) + return E_FAIL; + + hRet = punk->QueryInterface(IID_IDeskBand, (PVOID *)&DeskBand); + if (!SUCCEEDED(hRet) || DeskBand == NULL) + goto Cleanup; + hRet = punk->QueryInterface(IID_IObjectWithSite, (PVOID *)&ObjWithSite); + if (!SUCCEEDED(hRet) || ObjWithSite == NULL) + goto Cleanup; + hRet = punk->QueryInterface(IID_IOleWindow, (PVOID *)&OleWindow); + if (!SUCCEEDED(hRet) || OleWindow == NULL) + goto Cleanup; + hRet = punk->QueryInterface(IID_IWinEventHandler, (PVOID *)&WndEvtHandler); + if (!SUCCEEDED(hRet) || WndEvtHandler == NULL) + goto Cleanup; + + hRet = S_OK; + if (fBandsAllocated > fBandsCount) + { + /* Search for a free band object */ + for (i = 0; i < fBandsAllocated; i++) + { + if (fBands[i].DeskBand == NULL) + { + NewBand = &fBands[i]; + break; + } + } + } + else if (fBandsAllocated > 0) + { + ASSERT (fBands != NULL); + + /* Reallocate the band object array */ + NewAllocated = fBandsAllocated + 8; + if (NewAllocated > 0xFFFF) + NewAllocated = 0xFFFF; + if (NewAllocated == fBandsAllocated) + { + hRet = E_OUTOFMEMORY; + goto Cleanup; + } + + + NewBand = reinterpret_cast(CoTaskMemAlloc(NewAllocated * sizeof(struct BandObject))); + if (NewBand == NULL) + { + hRet = E_OUTOFMEMORY; + goto Cleanup; + } + + /* Copy the old array */ + memcpy(NewBand, fBands, fBandsAllocated * sizeof(struct BandObject)); + + /* Initialize the added bands */ + memset(&NewBand[fBandsAllocated], 0, (NewAllocated - fBandsAllocated) * sizeof(struct BandObject)); + + NewBand = &fBands[fBandsAllocated]; + fBandsAllocated = NewAllocated; + CoTaskMemFree(fBands); + fBands = NewBand; + } + else + { + ASSERT(fBands == NULL); + ASSERT(fBandsAllocated == 0); + ASSERT(fBandsCount == 0); + + /* Allocate new array */ + fBands = reinterpret_cast(CoTaskMemAlloc(8 * sizeof(struct BandObject))); + if (fBands == NULL) + { + hRet = E_OUTOFMEMORY; + goto Cleanup; + } + + /* Initialize the added bands */ + memset(fBands, 0, 8 * sizeof(struct BandObject)); + + fBandsAllocated += 8; + NewBand = &fBands[0]; + } + + if (SUCCEEDED(hRet)) + { + ASSERT(NewBand != NULL); + + fBandsCount++; + NewBand->DeskBand = DeskBand.Detach(); + NewBand->OleWindow = OleWindow.Detach(); + NewBand->WndEvtHandler = WndEvtHandler.Detach(); + + /* Create the ReBar band */ + hRet = ObjWithSite->SetSite((IOleWindow *)this); + if (SUCCEEDED(hRet)) + { + uBand = 0xffffffff; + if (SUCCEEDED(UpdateSingleBand(NewBand))) + { + if (NewBand->dbi.dwMask & DBIM_MODEFLAGS) + { + if (NewBand->dbi.dwModeFlags & DBIMF_ADDTOFRONT) + uBand = 0; + } + } + + BuildRebarBandInfo(NewBand, &rbi); + + if (SUCCEEDED(NewBand->OleWindow->GetWindow(&rbi.hwndChild)) && + rbi.hwndChild != NULL) + { + rbi.fMask |= RBBIM_CHILD; + WARN ("ReBar band uses child window 0x%p\n", rbi.hwndChild); + } + + if (!SendMessageW(fRebarWindow, RB_INSERTBANDW, (WPARAM)uBand, (LPARAM)&rbi)) + return E_FAIL; + + hRet = (HRESULT)((USHORT)GetBandID(NewBand)); + } + else + { + WARN("IBandSite::AddBand(): Call to IDeskBand::SetSite() failed: %x\n", hRet); + + /* Remove the band from the ReBar control */ + uBand = (UINT)SendMessageW(fRebarWindow, RB_IDTOINDEX, (WPARAM)rbi.wID, 0); + if (uBand != (UINT)-1) + { + if (!SendMessageW(fRebarWindow, RB_DELETEBAND, (WPARAM)uBand, 0)) + { + ERR("Failed to delete band!\n"); + } + } + else + ERR("Failed to map band id to index!\n"); + + FreeBand(NewBand); + + hRet = E_FAIL; + /* goto Cleanup; */ + } + } +Cleanup: + return hRet; +} + +HRESULT STDMETHODCALLTYPE CBandSiteBase::EnumBands(UINT uBand, DWORD *pdwBandID) +{ + DWORD i; + + TRACE("(%p, %u, %p)\n", this, uBand, pdwBandID); + + if (uBand == 0xffffffff) + return (UINT)fBandsCount; + + if (uBand >= (UINT)fBandsCount) + return E_FAIL; + + for (i = 0; i < (DWORD)fBandsAllocated; i++) + { + if (fBands[i].DeskBand != NULL) + { + if (uBand == 0) + { + *pdwBandID = i; + return S_OK; + } + + uBand--; + } + } + + return E_FAIL; +} + +HRESULT STDMETHODCALLTYPE CBandSiteBase::QueryBand(DWORD dwBandID, IDeskBand **ppstb, DWORD *pdwState, LPWSTR pszName, int cchName) +{ + struct BandObject *Band; + + TRACE("(%p, %u, %p, %p, %p, %d)\n", this, dwBandID, ppstb, pdwState, pszName, cchName); + + Band = GetBandByID(dwBandID); + if (Band == NULL) + return E_FAIL; + + if (ppstb != NULL) + { + Band->DeskBand->AddRef(); + *ppstb = Band->DeskBand; + } + + if (pdwState != NULL) + { + FIXME("IBandSite::QueryBand() requests band state!\n"); + *pdwState = 0; + } + + if (pszName != NULL && cchName > 0) + { + FIXME("IBandSite::QueryBand() requests band name!\n"); + pszName[0] = 0; + } + return S_OK; +} + +HRESULT STDMETHODCALLTYPE CBandSiteBase::SetBandState(DWORD dwBandID, DWORD dwMask, DWORD dwState) +{ + struct BandObject *Band; + + TRACE("(%p, %u, %x, %x)\n", this, dwBandID, dwMask, dwState); + + Band = GetBandByID(dwBandID); + if (Band == NULL) + return E_FAIL; + + FIXME("Stub\n"); + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CBandSiteBase::RemoveBand(DWORD dwBandID) +{ + struct BandObject *Band; + UINT uBand; + + TRACE("(%p, %u)\n", this, dwBandID); + + if (fRebarWindow == NULL) + return E_FAIL; + + Band = GetBandByID(dwBandID); + if (Band == NULL) + return E_FAIL; + + uBand = (UINT)SendMessageW(fRebarWindow, RB_IDTOINDEX, (WPARAM)GetBandID(Band), 0); + if (uBand != (UINT)-1) + { + if (!SendMessageW(fRebarWindow, RB_DELETEBAND, (WPARAM)uBand, 0)) + { + ERR("Could not delete band!\n"); + } + } + else + ERR("Could not map band id to index!\n"); + + FreeBand(Band); + return S_OK; +} + +HRESULT STDMETHODCALLTYPE CBandSiteBase::GetBandObject(DWORD dwBandID, REFIID riid, VOID **ppv) +{ + struct BandObject *Band; + + TRACE("(%p, %u, %s, %p)\n", this, dwBandID, debugstr_guid(&riid), ppv); + + Band = GetBandByID(dwBandID); + if (Band == NULL) + { + *ppv = NULL; + return E_FAIL; + } + + return Band->DeskBand->QueryInterface(riid, ppv); +} + +HRESULT STDMETHODCALLTYPE CBandSiteBase::SetBandSiteInfo(const BANDSITEINFO *pbsinfo) +{ + FIXME("(%p, %p)\n", this, pbsinfo); + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CBandSiteBase::GetBandSiteInfo(BANDSITEINFO *pbsinfo) +{ + FIXME("(%p, %p)\n", this, pbsinfo); + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CBandSiteBase::OnWinEvent(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT *plrResult) +{ + struct BandObject *Band; + + TRACE("(%p, %p, %u, %p, %p, %p)\n", this, hWnd, uMsg, wParam, lParam, plrResult); + + *plrResult = 0; + if (fRebarWindow == NULL) + return E_FAIL; + + if (hWnd == fRebarWindow) + { + /* FIXME: Just send the message? */ + *plrResult = SendMessageW(hWnd, uMsg, wParam, lParam); + return S_OK; + } + + Band = GetBandFromHwnd(hWnd); + if (Band != NULL) + { + return Band->WndEvtHandler->OnWinEvent(hWnd, uMsg, wParam, lParam, plrResult); + } + + return E_FAIL; +} + +HRESULT STDMETHODCALLTYPE CBandSiteBase::IsWindowOwner(HWND hWnd) +{ + struct BandObject *Band; + + TRACE("(%p, %p)\n", this, hWnd); + + if (fRebarWindow == NULL) + return E_FAIL; + + Band = GetBandFromHwnd(hWnd); + if (Band != NULL) + return S_OK; + + return S_FALSE; +} + +HRESULT STDMETHODCALLTYPE CBandSiteBase::GetWindow(HWND *phWnd) +{ + TRACE("(%p, %p)\n", this, phWnd); + + *phWnd = fRebarWindow; + if (fRebarWindow != NULL) + return S_OK; + + return E_FAIL; +} + +HRESULT STDMETHODCALLTYPE CBandSiteBase::ContextSensitiveHelp(BOOL fEnterMode) +{ + FIXME("(%p, %d)\n", this, fEnterMode); + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CBandSiteBase::SetDeskBarSite(IUnknown *pUnk) +{ + HWND hWndParent; + HRESULT hRet; + + TRACE("(%p, %p)\n", this, pUnk); + + fOleWindow.Release(); + + hRet = pUnk->QueryInterface(IID_IOleWindow, (PVOID *)&fOleWindow); + if (!SUCCEEDED(hRet)) + return E_FAIL; + + hRet = fOleWindow->GetWindow(&hWndParent); + if (!SUCCEEDED(hRet)) + return E_FAIL; + + fRebarWindow = CreateWindowExW(WS_EX_TOOLWINDOW, + REBARCLASSNAMEW, + NULL, + WS_CHILD | WS_CLIPSIBLINGS | + WS_CLIPCHILDREN | RBS_VARHEIGHT | + RBS_BANDBORDERS | CCS_NODIVIDER | + CCS_NORESIZE | CCS_NOPARENTALIGN, + 0, + 0, + 0, + 0, + hWndParent, + NULL, + _AtlBaseModule.GetModuleInstance(), + NULL); + if (fRebarWindow == NULL) + { + fOleWindow.Release(); + WARN("IDeskbarClient::SetDeskBarSite() failed to create ReBar control!\n"); + return E_FAIL; + } + + return S_OK; +} + +HRESULT STDMETHODCALLTYPE CBandSiteBase::SetModeDBC(DWORD dwMode) +{ + LONG dwStyle; + LONG dwPrevStyle; + + TRACE("(%p, %x)\n", this, dwMode); + + if (fRebarWindow == NULL) + return E_FAIL; + + dwStyle = dwPrevStyle = GetWindowLongPtr(fRebarWindow, GWL_STYLE); + if (dwMode & DBIF_VIEWMODE_VERTICAL) + dwStyle |= CCS_VERT; + + if (dwMode & ~DBIF_VIEWMODE_VERTICAL) + FIXME("IDeskBarClient::SetModeDBC() unhandled modes: %x\n", dwStyle & ~DBIF_VIEWMODE_VERTICAL); + + if (dwStyle != dwPrevStyle) + { + SetWindowLongPtr(fRebarWindow, GWL_STYLE, dwPrevStyle); + } + + return S_OK; +} + +HRESULT STDMETHODCALLTYPE CBandSiteBase::UIActivateDBC(DWORD dwState) +{ + TRACE("(%p, %x)\n", this, dwState); + + if (fRebarWindow == NULL) + return E_FAIL; + + ShowWindow(fRebarWindow, (dwState & DBC_SHOW) ? SW_SHOW : SW_HIDE); + FIXME("IDeskBarClient::UIActivateDBC() Properly notify bands?\n"); + return S_OK; +} + +HRESULT STDMETHODCALLTYPE CBandSiteBase::GetSize(DWORD unknown1, LPRECT unknown2) +{ + FIXME("(%p, %x, %p)\n", this, unknown1, unknown2); + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CBandSiteBase::QueryStatus(const GUID *pguidCmdGroup, DWORD cCmds, OLECMD *prgCmds, OLECMDTEXT *pCmdText) +{ + FIXME("(%p, %p, %u, %p, %p)\n", this, pguidCmdGroup, cCmds, prgCmds, pCmdText); + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CBandSiteBase::Exec(const GUID *pguidCmdGroup, DWORD nCmdID, DWORD nCmdExecOpt, VARIANTARG *pvaIn, VARIANTARG *pvaOut) +{ + HRESULT hRet = S_OK; + + TRACE("(%p, %p, %u, %u, %p, %p)\n", this, pguidCmdGroup, nCmdID, nCmdExecOpt, pvaIn, pvaOut); + + if (fRebarWindow == NULL) + return E_FAIL; + + if (IsEqualIID(pguidCmdGroup, IID_IDeskBand)) + { + switch (nCmdID) + { + case DBID_BANDINFOCHANGED: + if (pvaIn == NULL) + hRet = UpdateAllBands(); + else + { + /* Update a single band */ + if (pvaIn->n1.n2.vt == VT_I4) + hRet = UpdateBand(pvaIn->n1.n2.n3.lVal); + else + hRet = E_FAIL; + } + break; + + case DBID_SHOWONLY: + case DBID_MAXIMIZEBAND: + case DBID_PUSHCHEVRON: + FIXME("IOleCommandTarget::Exec(): Unsupported command ID %d\n", nCmdID); + return E_NOTIMPL; + default: + return E_FAIL; + } + return S_OK; + } + else + WARN("IOleCommandTarget::Exec(): Unsupported command group GUID\n"); + + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CBandSiteBase::UIActivateIO(BOOL fActivate, LPMSG lpMsg) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CBandSiteBase::HasFocusIO() +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CBandSiteBase::TranslateAcceleratorIO(LPMSG lpMsg) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CBandSiteBase::OnFocusChangeIS(struct IUnknown *paramC, int param10) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CBandSiteBase::QueryService(REFGUID guidService, REFIID riid, void **ppvObject) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CBandSiteBase::GetClassID(CLSID *pClassID) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CBandSiteBase::IsDirty() +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CBandSiteBase::Load(IStream *pStm) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CBandSiteBase::Save(IStream *pStm, BOOL fClearDirty) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CBandSiteBase::GetSizeMax(ULARGE_INTEGER *pcbSize) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CBandSiteBase::DragEnter(IDataObject *pDataObj, DWORD grfKeyState, POINTL pt, DWORD *pdwEffect) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CBandSiteBase::DragOver(DWORD grfKeyState, POINTL pt, DWORD *pdwEffect) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CBandSiteBase::DragLeave() +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CBandSiteBase::Drop(IDataObject *pDataObj, DWORD grfKeyState, POINTL pt, DWORD *pdwEffect) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CBandSiteBase::LoadFromStreamBS(IStream *, const GUID &, void **) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CBandSiteBase::SaveToStreamBS(IUnknown *, IStream *) +{ + return E_NOTIMPL; +} diff --git a/reactos/dll/win32/browseui/bandsite.h b/reactos/dll/win32/browseui/bandsite.h new file mode 100644 index 00000000000..5ea7ae72dff --- /dev/null +++ b/reactos/dll/win32/browseui/bandsite.h @@ -0,0 +1,154 @@ +/* + * Rebar band site + * + * Copyright 2007 Hervé Poussineau + * Copyright 2009 Andrew Hill + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#ifndef _bandsite_h +#define _bandsite_h + +class CBandSiteBase : + public CComObjectRootEx, + public IBandSite, + public IWinEventHandler, + public IDeskBarClient, + public IOleCommandTarget, + public IInputObject, + public IInputObjectSite, + public IServiceProvider, + public IPersistStream, + public IDropTarget, + public IBandSiteHelper +{ +private: + struct BandObject + { + IDeskBand *DeskBand; + IOleWindow *OleWindow; + IWinEventHandler *WndEvtHandler; + DESKBANDINFO dbi; + }; + + LONG fBandsCount; + LONG fBandsAllocated; + struct BandObject *fBands; + HWND fRebarWindow; + CComPtr fOleWindow; +public: + CBandSiteBase(); + ~CBandSiteBase(); + + // *** IBandSite methods *** + virtual HRESULT STDMETHODCALLTYPE AddBand(IUnknown *punk); + virtual HRESULT STDMETHODCALLTYPE EnumBands(UINT uBand, DWORD *pdwBandID); + virtual HRESULT STDMETHODCALLTYPE QueryBand(DWORD dwBandID, IDeskBand **ppstb, DWORD *pdwState, LPWSTR pszName, int cchName); + virtual HRESULT STDMETHODCALLTYPE SetBandState(DWORD dwBandID, DWORD dwMask, DWORD dwState); + virtual HRESULT STDMETHODCALLTYPE RemoveBand(DWORD dwBandID); + virtual HRESULT STDMETHODCALLTYPE GetBandObject(DWORD dwBandID, REFIID riid, void **ppv); + virtual HRESULT STDMETHODCALLTYPE SetBandSiteInfo(const BANDSITEINFO *pbsinfo); + virtual HRESULT STDMETHODCALLTYPE GetBandSiteInfo(BANDSITEINFO *pbsinfo); + + // *** IWinEventHandler methods *** + virtual HRESULT STDMETHODCALLTYPE OnWinEvent(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT *theResult); + virtual HRESULT STDMETHODCALLTYPE IsWindowOwner(HWND hWnd); + + // *** IOleWindow methods *** + virtual HRESULT STDMETHODCALLTYPE GetWindow(HWND *lphwnd); + virtual HRESULT STDMETHODCALLTYPE ContextSensitiveHelp(BOOL fEnterMode); + + // *** IDeskBarClient methods *** + virtual HRESULT STDMETHODCALLTYPE SetDeskBarSite(IUnknown *punkSite); + virtual HRESULT STDMETHODCALLTYPE SetModeDBC(DWORD dwMode); + virtual HRESULT STDMETHODCALLTYPE UIActivateDBC(DWORD dwState); + virtual HRESULT STDMETHODCALLTYPE GetSize(DWORD dwWhich, LPRECT prc); + + // *** IOleCommandTarget methods *** + virtual HRESULT STDMETHODCALLTYPE QueryStatus(const GUID *pguidCmdGroup, ULONG cCmds, OLECMD prgCmds[ ], OLECMDTEXT *pCmdText); + virtual HRESULT STDMETHODCALLTYPE Exec(const GUID *pguidCmdGroup, DWORD nCmdID, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut); + + // *** IInputObject methods *** + virtual HRESULT STDMETHODCALLTYPE UIActivateIO(BOOL fActivate, LPMSG lpMsg); + virtual HRESULT STDMETHODCALLTYPE HasFocusIO(); + virtual HRESULT STDMETHODCALLTYPE TranslateAcceleratorIO(LPMSG lpMsg); + + // *** IInputObjectSite methods *** + virtual HRESULT STDMETHODCALLTYPE OnFocusChangeIS(struct IUnknown *paramC, int param10); + + // *** IServiceProvider methods *** + virtual HRESULT STDMETHODCALLTYPE QueryService(REFGUID guidService, REFIID riid, void **ppvObject); + + // *** IPersist methods *** + virtual HRESULT STDMETHODCALLTYPE GetClassID(CLSID *pClassID); + + // *** IPersistStream methods *** + virtual HRESULT STDMETHODCALLTYPE IsDirty(); + virtual HRESULT STDMETHODCALLTYPE Load(IStream *pStm); + virtual HRESULT STDMETHODCALLTYPE Save(IStream *pStm, BOOL fClearDirty); + virtual HRESULT STDMETHODCALLTYPE GetSizeMax(ULARGE_INTEGER *pcbSize); + + // *** IDropTarget methods *** + virtual HRESULT STDMETHODCALLTYPE DragEnter(IDataObject *pDataObj, DWORD grfKeyState, POINTL pt, DWORD *pdwEffect); + virtual HRESULT STDMETHODCALLTYPE DragOver(DWORD grfKeyState, POINTL pt, DWORD *pdwEffect); + virtual HRESULT STDMETHODCALLTYPE DragLeave(); + virtual HRESULT STDMETHODCALLTYPE Drop(IDataObject *pDataObj, DWORD grfKeyState, POINTL pt, DWORD *pdwEffect); + + // *** IBandSiteHelper methods *** + virtual HRESULT STDMETHODCALLTYPE LoadFromStreamBS(IStream *, const GUID &, void **); + virtual HRESULT STDMETHODCALLTYPE SaveToStreamBS(IUnknown *, IStream *); + +private: + UINT GetBandID(struct BandObject *Band); + struct BandObject *GetBandByID(DWORD dwBandID); + void FreeBand(struct BandObject *Band); + DWORD GetBandSiteViewMode(); + VOID BuildRebarBandInfo(struct BandObject *Band, REBARBANDINFOW *prbi); + HRESULT UpdateSingleBand(struct BandObject *Band); + HRESULT UpdateAllBands(); + HRESULT UpdateBand(DWORD dwBandID); + struct BandObject *GetBandFromHwnd(HWND hwnd); + +BEGIN_COM_MAP(CBandSiteBase) + COM_INTERFACE_ENTRY_IID(IID_IBandSite, IBandSite) + COM_INTERFACE_ENTRY_IID(IID_IWinEventHandler, IWinEventHandler) + COM_INTERFACE_ENTRY_IID(IID_IOleWindow, IOleWindow) + COM_INTERFACE_ENTRY_IID(IID_IDeskBarClient, IDeskBarClient) + COM_INTERFACE_ENTRY_IID(IID_IOleCommandTarget, IOleCommandTarget) + COM_INTERFACE_ENTRY_IID(IID_IInputObject, IInputObject) + COM_INTERFACE_ENTRY_IID(IID_IInputObjectSite, IInputObjectSite) + COM_INTERFACE_ENTRY_IID(IID_IServiceProvider, IServiceProvider) + COM_INTERFACE_ENTRY_IID(IID_IPersist, IPersist) + COM_INTERFACE_ENTRY_IID(IID_IPersistStream, IPersistStream) + COM_INTERFACE_ENTRY_IID(IID_IDropTarget, IDropTarget) + COM_INTERFACE_ENTRY_IID(IID_IBandSiteHelper, IBandSiteHelper) +END_COM_MAP() +}; + +class CBandSite : + public CComCoClass, + public CBandSiteBase +{ +public: + +DECLARE_REGISTRY_RESOURCEID(IDR_BANDSITE) +DECLARE_NOT_AGGREGATABLE(CBandSite) + +DECLARE_PROTECT_FINAL_CONSTRUCT() + +}; + +#endif // _bandsite_h diff --git a/reactos/dll/win32/browseui/bandsitemenu.c b/reactos/dll/win32/browseui/bandsitemenu.c deleted file mode 100644 index 7596c3cdd72..00000000000 --- a/reactos/dll/win32/browseui/bandsitemenu.c +++ /dev/null @@ -1,132 +0,0 @@ -/* - * Band site menu - * - * Copyright 2007 Hervé Poussineua - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA - */ - -#include "config.h" - -#define COBJMACROS - -#include "wine/debug.h" -#include "windef.h" -#include "winbase.h" -#include "objbase.h" - -#include "shlobj.h" -#include "shobjidl.h" -#include "todo.h" - -#include "browseui.h" - -WINE_DEFAULT_DEBUG_CHANNEL(browseui); - -typedef struct _tagBandSiteMenu { - const IShellServiceVtbl *vtbl; - LONG refCount; -} BandSiteMenu; - -static const IShellServiceVtbl BandSiteMenuVtbl; - -static inline BandSiteMenu *impl_from_IShellService(IShellService *iface) -{ - return (BandSiteMenu *)((char *)iface - FIELD_OFFSET(BandSiteMenu, vtbl)); -} - -HRESULT WINAPI BandSiteMenu_Constructor(IUnknown *pUnkOuter, IUnknown **ppOut) -{ - BandSiteMenu *This; - - if (pUnkOuter) - return CLASS_E_NOAGGREGATION; - - This = CoTaskMemAlloc(sizeof(BandSiteMenu)); - if (This == NULL) - return E_OUTOFMEMORY; - ZeroMemory(This, sizeof(*This)); - This->vtbl = &BandSiteMenuVtbl; - This->refCount = 1; - - TRACE("returning %p\n", This); - *ppOut = (IUnknown *)This; - BROWSEUI_refCount++; - return S_OK; -} - -static void WINAPI BandSiteMenu_Destructor(BandSiteMenu *This) -{ - TRACE("destroying %p\n", This); - CoTaskMemFree(This); - BROWSEUI_refCount--; -} - -static HRESULT WINAPI BandSiteMenu_QueryInterface(IShellService *iface, REFIID iid, LPVOID *ppvOut) -{ - BandSiteMenu *This = impl_from_IShellService(iface); - *ppvOut = NULL; - - TRACE("(%p, %s, %p)\n", iface, debugstr_guid(iid), ppvOut); - - if (IsEqualIID(iid, &IID_IUnknown) || IsEqualIID(iid, &IID_IShellService)) - { - *ppvOut = &This->vtbl; - } - - if (*ppvOut) - { - IUnknown_AddRef(iface); - return S_OK; - } - - WARN("unsupported interface: %s\n", debugstr_guid(iid)); - return E_NOINTERFACE; -} - -static ULONG WINAPI BandSiteMenu_AddRef(IShellService *iface) -{ - BandSiteMenu *This = impl_from_IShellService(iface); - TRACE("(%p)\n", iface); - return InterlockedIncrement(&This->refCount); -} - -static ULONG WINAPI BandSiteMenu_Release(IShellService *iface) -{ - BandSiteMenu *This = impl_from_IShellService(iface); - ULONG ret; - - TRACE("(%p)\n", iface); - - ret = InterlockedDecrement(&This->refCount); - if (ret == 0) - BandSiteMenu_Destructor(This); - return ret; -} - -static HRESULT WINAPI BandSiteMenu_SetOwner(IShellService *iface, IUnknown *pOwner) -{ - FIXME("(%p, %p)\n", iface, pOwner); - return E_NOTIMPL; -} - -static const IShellServiceVtbl BandSiteMenuVtbl = -{ - BandSiteMenu_QueryInterface, - BandSiteMenu_AddRef, - BandSiteMenu_Release, - - BandSiteMenu_SetOwner, -}; diff --git a/reactos/dll/win32/browseui/bandsitemenu.cpp b/reactos/dll/win32/browseui/bandsitemenu.cpp new file mode 100644 index 00000000000..fee02afb225 --- /dev/null +++ b/reactos/dll/win32/browseui/bandsitemenu.cpp @@ -0,0 +1,73 @@ +/* + * Band site menu + * + * Copyright 2007 Hervé Poussineua + * Copyright 2009 Andrew Hill + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "resource.h" +#include "bandsitemenu.h" +#include "wine/debug.h" + +WINE_DEFAULT_DEBUG_CHANNEL(browseui); + +CBandSiteMenu::CBandSiteMenu() +{ +} + +CBandSiteMenu::~CBandSiteMenu() +{ +} + +HRESULT STDMETHODCALLTYPE CBandSiteMenu::SetOwner(IUnknown *pOwner) +{ + FIXME("(%p, %p)\n", this, pOwner); + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CBandSiteMenu::QueryContextMenu(HMENU hmenu, UINT indexMenu, UINT idCmdFirst, UINT idCmdLast, UINT uFlags) +{ + FIXME("(%p, %p, %p, %p, %p, %p)\n", this, hmenu, indexMenu, idCmdFirst, idCmdLast, uFlags); + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CBandSiteMenu::InvokeCommand(LPCMINVOKECOMMANDINFO lpici) +{ + FIXME("(%p, %p)\n", this, lpici); + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CBandSiteMenu::GetCommandString(UINT_PTR idCmd, UINT uType, UINT *pwReserved, LPSTR pszName, UINT cchMax) +{ + FIXME("(%p, %p, %p, %p, %p, %p)\n", this, idCmd, uType, pwReserved, pszName, cchMax); + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CBandSiteMenu::HandleMenuMsg(UINT uMsg, WPARAM wParam, LPARAM lParam) +{ + FIXME("(%p, %p)\n", this, uMsg, wParam, lParam); + return E_NOTIMPL; +} diff --git a/reactos/dll/win32/browseui/bandsitemenu.h b/reactos/dll/win32/browseui/bandsitemenu.h new file mode 100644 index 00000000000..01335f5da69 --- /dev/null +++ b/reactos/dll/win32/browseui/bandsitemenu.h @@ -0,0 +1,60 @@ +/* + * Band site menu + * + * Copyright 2007 Hervé Poussineua + * Copyright 2009 Andrew Hill + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#ifndef _bandsitemenu_h +#define _bandsitemenu_h + +// oddly, this class also responds to QueryInterface for CLSID_BandSiteMenu by returning the vtable at offset 0 +class CBandSiteMenu : + public CComCoClass, + public CComObjectRootEx, + public IShellService, + public IContextMenu2 +{ +public: + CBandSiteMenu(); + ~CBandSiteMenu(); + + // *** IShellService methods *** + virtual HRESULT STDMETHODCALLTYPE SetOwner(IUnknown *); + + // *** IContextMenu methods *** + virtual HRESULT STDMETHODCALLTYPE QueryContextMenu(HMENU hmenu, UINT indexMenu, UINT idCmdFirst, UINT idCmdLast, UINT uFlags); + virtual HRESULT STDMETHODCALLTYPE InvokeCommand(LPCMINVOKECOMMANDINFO lpici); + virtual HRESULT STDMETHODCALLTYPE GetCommandString(UINT_PTR idCmd, UINT uType, UINT *pwReserved, LPSTR pszName, UINT cchMax); + + // *** IContextMenu2 methods *** + virtual HRESULT STDMETHODCALLTYPE HandleMenuMsg(UINT uMsg, WPARAM wParam, LPARAM lParam); + +DECLARE_REGISTRY_RESOURCEID(IDR_BANDSITEMENU) +DECLARE_NOT_AGGREGATABLE(CBandSiteMenu) + +DECLARE_PROTECT_FINAL_CONSTRUCT() + +BEGIN_COM_MAP(CBandSiteMenu) + COM_INTERFACE_ENTRY_IID(IID_IShellService, IShellService) + COM_INTERFACE_ENTRY_IID(IID_IContextMenu2, IContextMenu2) + COM_INTERFACE_ENTRY_IID(IID_IContextMenu, IContextMenu) +END_COM_MAP() + +}; + +#endif // _bandsitemenu_h diff --git a/reactos/dll/win32/browseui/basebar.cpp b/reactos/dll/win32/browseui/basebar.cpp new file mode 100644 index 00000000000..1e4caaaa594 --- /dev/null +++ b/reactos/dll/win32/browseui/basebar.cpp @@ -0,0 +1,549 @@ +/* + * ReactOS Explorer + * + * Copyright 2009 Andrew Hill + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +/* +This class knows how to contain base bar site in a cabinet window. +*/ +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/* +Base bar that contains a vertical or horizontal explorer band. It also +provides resizing abilities. +*/ +/* +TODO: + **Make base bar support resizing + Add context menu for base bar + Fix base bar to correctly initialize fVertical field + Fix base bar to correctly reposition its base bar site when resized + +*/ + +class CBaseBar : + public CWindowImpl, + public CComObjectRootEx, + public IInputObjectSite, + public IOleCommandTarget, + public IServiceProvider, + public IInputObject, + public IDeskBar, + public IDockingWindow, + public IPersistStream, + public IPersistStreamInit, + public IPersistPropertyBag, + public IObjectWithSite +{ +public: + CComPtr fSite; + CComPtr fClient; + HWND fClientWindow; + bool fVertical; + bool fVisible; + int fNeededSize; // width or height + + // used by resize tracking loop + bool fTracking; + POINT fLastLocation; +public: + CBaseBar(); + ~CBaseBar(); +public: + HRESULT ReserveBorderSpace(); + + // *** IOleWindow methods *** + virtual HRESULT STDMETHODCALLTYPE GetWindow(HWND *lphwnd); + virtual HRESULT STDMETHODCALLTYPE ContextSensitiveHelp(BOOL fEnterMode); + + // *** IInputObjectSite specific methods *** + virtual HRESULT STDMETHODCALLTYPE OnFocusChangeIS (IUnknown *punkObj, BOOL fSetFocus); + + // *** IOleCommandTarget specific methods *** + virtual HRESULT STDMETHODCALLTYPE QueryStatus(const GUID *pguidCmdGroup, ULONG cCmds, OLECMD prgCmds[ ], OLECMDTEXT *pCmdText); + virtual HRESULT STDMETHODCALLTYPE Exec(const GUID *pguidCmdGroup, DWORD nCmdID, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut); + + // *** IServiceProvider methods *** + virtual HRESULT STDMETHODCALLTYPE QueryService(REFGUID guidService, REFIID riid, void **ppvObject); + + // *** IInputObject methods *** + // forward the methods to the contained active bar + virtual HRESULT STDMETHODCALLTYPE UIActivateIO(BOOL fActivate, LPMSG lpMsg); + virtual HRESULT STDMETHODCALLTYPE HasFocusIO(); + virtual HRESULT STDMETHODCALLTYPE TranslateAcceleratorIO(LPMSG lpMsg); + + // *** IDeskBar methods *** + virtual HRESULT STDMETHODCALLTYPE SetClient(IUnknown *punkClient); + virtual HRESULT STDMETHODCALLTYPE GetClient(IUnknown **ppunkClient); + virtual HRESULT STDMETHODCALLTYPE OnPosRectChangeDB(LPRECT prc); + + // *** IDockingWindow methods *** + virtual HRESULT STDMETHODCALLTYPE ShowDW(BOOL fShow); + virtual HRESULT STDMETHODCALLTYPE CloseDW(DWORD dwReserved); + virtual HRESULT STDMETHODCALLTYPE ResizeBorderDW(LPCRECT prcBorder, IUnknown *punkToolbarSite, BOOL fReserved); + + // *** IObjectWithSite methods *** + virtual HRESULT STDMETHODCALLTYPE SetSite(IUnknown *pUnkSite); + virtual HRESULT STDMETHODCALLTYPE GetSite(REFIID riid, void **ppvSite); + + // *** IPersist methods *** + virtual HRESULT STDMETHODCALLTYPE GetClassID(CLSID *pClassID); + + // *** IPersistStream methods *** + virtual HRESULT STDMETHODCALLTYPE IsDirty(); + virtual HRESULT STDMETHODCALLTYPE Load(IStream *pStm); + virtual HRESULT STDMETHODCALLTYPE Save(IStream *pStm, BOOL fClearDirty); + virtual HRESULT STDMETHODCALLTYPE GetSizeMax(ULARGE_INTEGER *pcbSize); + + // *** IPersistStreamInit methods *** + virtual HRESULT STDMETHODCALLTYPE InitNew(); + + // *** IPersistPropertyBag methods *** + virtual HRESULT STDMETHODCALLTYPE Load(IPropertyBag *pPropBag, IErrorLog *pErrorLog); + virtual HRESULT STDMETHODCALLTYPE Save(IPropertyBag *pPropBag, BOOL fClearDirty, BOOL fSaveAllProperties); + + // message handlers + LRESULT OnSize(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled); + LRESULT OnSetCursor(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled); + LRESULT OnNotify(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled); + LRESULT OnLButtonDown(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled); + LRESULT OnLButtonUp(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled); + LRESULT OnMouseMove(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled); + LRESULT OnCancelMode(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled); + LRESULT OnCaptureChanged(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled); + +DECLARE_WND_CLASS_EX(_T("BaseBar"), 0, COLOR_3DFACE) + +BEGIN_MSG_MAP(CBaseBar) + MESSAGE_HANDLER(WM_SIZE, OnSize) + MESSAGE_HANDLER(WM_SETCURSOR, OnSetCursor) + MESSAGE_HANDLER(WM_NOTIFY, OnNotify) + MESSAGE_HANDLER(WM_LBUTTONDOWN, OnLButtonDown) + MESSAGE_HANDLER(WM_LBUTTONUP, OnLButtonUp) + MESSAGE_HANDLER(WM_MOUSEMOVE, OnMouseMove) + MESSAGE_HANDLER(WM_CANCELMODE, OnCancelMode) + MESSAGE_HANDLER(WM_CAPTURECHANGED, OnCaptureChanged) +END_MSG_MAP() + +BEGIN_COM_MAP(CBaseBar) + COM_INTERFACE_ENTRY2_IID(IID_IOleWindow, IOleWindow, IDockingWindow) + COM_INTERFACE_ENTRY_IID(IID_IInputObjectSite, IInputObjectSite) + COM_INTERFACE_ENTRY_IID(IID_IOleCommandTarget, IOleCommandTarget) + COM_INTERFACE_ENTRY_IID(IID_IServiceProvider, IServiceProvider) + COM_INTERFACE_ENTRY_IID(IID_IInputObject, IInputObject) + COM_INTERFACE_ENTRY_IID(IID_IDeskBar, IDeskBar) + COM_INTERFACE_ENTRY_IID(IID_IDockingWindow, IDockingWindow) + COM_INTERFACE_ENTRY_IID(IID_IObjectWithSite, IObjectWithSite) + COM_INTERFACE_ENTRY2_IID(IID_IPersist, IPersist, IPersistStream) + COM_INTERFACE_ENTRY_IID(IID_IPersistStream, IPersistStream) + COM_INTERFACE_ENTRY_IID(IID_IPersistStreamInit, IPersistStreamInit) + COM_INTERFACE_ENTRY_IID(IID_IPersistPropertyBag, IPersistPropertyBag) +END_COM_MAP() +}; + +CBaseBar::CBaseBar() +{ + fClientWindow = NULL; + fVertical = true; + fVisible = false; + fNeededSize = 200; + fTracking = false; +} + +CBaseBar::~CBaseBar() +{ +} + +HRESULT CBaseBar::ReserveBorderSpace() +{ + CComPtr dockingWindowSite; + RECT availableBorderSpace; + RECT neededBorderSpace; + HRESULT hResult; + + hResult = fSite->QueryInterface(IID_IDockingWindowSite, (void **)&dockingWindowSite); + if (FAILED(hResult)) + return hResult; + hResult = dockingWindowSite->GetBorderDW((IDeskBar *)this, &availableBorderSpace); + if (FAILED(hResult)) + return hResult; + memset(&neededBorderSpace, 0, sizeof(neededBorderSpace)); + if (fVisible) + { + if (fVertical) + neededBorderSpace.left = fNeededSize + GetSystemMetrics(SM_CXFRAME); + else + neededBorderSpace.bottom = fNeededSize + GetSystemMetrics(SM_CXFRAME); + } + hResult = dockingWindowSite->SetBorderSpaceDW((IDeskBar *)this, &neededBorderSpace); + if (FAILED(hResult)) + return hResult; + return S_OK; +} + +// current bar size is stored in the registry under +// key=HKCU\Software\Microsoft\Internet Explorer\Explorer Bars +// value=current bar GUID +// result is 8 bytes of binary data, 2 longs. First is the size, second is reserved and will always be 0 +/*HRESULT CBaseBar::StopCurrentBar() +{ + CComPtr commandTarget; + HRESULT hResult; + + if (fCurrentBar.p != NULL) + { + hResult = fCurrentBar->QueryInterface(IID_IOleCommandTarget, (void **)&commandTarget); + hResult = commandTarget->Exec(NULL, 0x17, 0, NULL, NULL); + } + // hide the current bar + memcpy(&fCurrentActiveClass, &GUID_NULL, sizeof(fCurrentActiveClass)); + return S_OK; +}*/ + +HRESULT STDMETHODCALLTYPE CBaseBar::GetWindow(HWND *lphwnd) +{ + if (lphwnd == NULL) + return E_POINTER; + *lphwnd = m_hWnd; + return S_OK; +} + +HRESULT STDMETHODCALLTYPE CBaseBar::ContextSensitiveHelp(BOOL fEnterMode) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CBaseBar::OnFocusChangeIS (IUnknown *punkObj, BOOL fSetFocus) +{ + // forward to owner + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CBaseBar::QueryStatus(const GUID *pguidCmdGroup, ULONG cCmds, OLECMD prgCmds[ ], OLECMDTEXT *pCmdText) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CBaseBar::Exec(const GUID *pguidCmdGroup, DWORD nCmdID, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut) +{ + if (IsEqualIID(*pguidCmdGroup, CGID_Explorer)) + { + } + else if (IsEqualIID(*pguidCmdGroup, IID_IDeskBarClient)) + { + switch (nCmdID) + { + case 0: + // hide current band + break; + case 2: + break; + case 3: + break; + } + } + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CBaseBar::QueryService(REFGUID guidService, REFIID riid, void **ppvObject) +{ + CComPtr serviceProvider; + HRESULT hResult; + + if (fSite == NULL) + return E_FAIL; + hResult = fSite->QueryInterface(IID_IServiceProvider, (void **)&serviceProvider); + if (FAILED(hResult)) + return hResult; + // called for SID_STopLevelBrowser, IID_IBrowserService to find top level browser + // called for SID_IWebBrowserApp, IID_IConnectionPointContainer + // connection point called for DIID_DWebBrowserEvents2 to establish connection + return serviceProvider->QueryService(guidService, riid, ppvObject); +} + +HRESULT STDMETHODCALLTYPE CBaseBar::UIActivateIO(BOOL fActivate, LPMSG lpMsg) +{ + // forward to contained bar + return S_OK; +} + +HRESULT STDMETHODCALLTYPE CBaseBar::HasFocusIO() +{ + // forward to contained bar + return S_OK; +} + +HRESULT STDMETHODCALLTYPE CBaseBar::TranslateAcceleratorIO(LPMSG lpMsg) +{ + // forward to contained bar + return S_OK; +} + +HRESULT STDMETHODCALLTYPE CBaseBar::SetClient(IUnknown *punkClient) +{ + CComPtr oleWindow; + HWND ownerWindow; + HRESULT hResult; + + if (punkClient == NULL) + fClient.Release(); + else + { + hResult = punkClient->QueryInterface(IID_IUnknown, (void **)&fClient); + if (FAILED(hResult)) + return hResult; + hResult = fSite->QueryInterface(IID_IOleWindow, (void **)&oleWindow); + if (FAILED(hResult)) + return hResult; + hResult = oleWindow->GetWindow(&ownerWindow); + if (FAILED(hResult)) + return hResult; + Create(ownerWindow, 0, NULL, WS_VISIBLE | WS_CHILDWINDOW | WS_CLIPSIBLINGS | WS_CLIPCHILDREN, WS_EX_TOOLWINDOW); + ReserveBorderSpace(); + } + return S_OK; +} + +HRESULT STDMETHODCALLTYPE CBaseBar::GetClient(IUnknown **ppunkClient) +{ + if (ppunkClient == NULL) + return E_POINTER; + *ppunkClient = fClient; + if (fClient.p != NULL) + fClient.p->AddRef(); + return S_OK; +} + +HRESULT STDMETHODCALLTYPE CBaseBar::OnPosRectChangeDB(LPRECT prc) +{ + if (prc == NULL) + return E_POINTER; + if (fVertical) + fNeededSize = prc->right - prc->left; + else + fNeededSize = prc->bottom - prc->top; + ReserveBorderSpace(); + return S_OK; +} + +HRESULT STDMETHODCALLTYPE CBaseBar::ShowDW(BOOL fShow) +{ + fVisible = fShow ? true : false; + ReserveBorderSpace(); + return S_OK; +} + +HRESULT STDMETHODCALLTYPE CBaseBar::CloseDW(DWORD dwReserved) +{ + fVisible = false; + ReserveBorderSpace(); + return S_OK; +} + +HRESULT STDMETHODCALLTYPE CBaseBar::ResizeBorderDW(LPCRECT prcBorder, IUnknown *punkToolbarSite, BOOL fReserved) +{ + ReserveBorderSpace(); + return S_OK; +} + +HRESULT STDMETHODCALLTYPE CBaseBar::SetSite(IUnknown *pUnkSite) +{ + fSite = pUnkSite; + return S_OK; +} + +HRESULT STDMETHODCALLTYPE CBaseBar::GetSite(REFIID riid, void **ppvSite) +{ + if (ppvSite == NULL) + return E_POINTER; + *ppvSite = fSite; + if (fSite.p != NULL) + fSite.p->AddRef(); + return S_OK; +} + +HRESULT STDMETHODCALLTYPE CBaseBar::GetClassID(CLSID *pClassID) +{ + if (pClassID == NULL) + return E_POINTER; + // TODO: what class to return here? + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CBaseBar::IsDirty() +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CBaseBar::Load(IStream *pStm) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CBaseBar::Save(IStream *pStm, BOOL fClearDirty) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CBaseBar::GetSizeMax(ULARGE_INTEGER *pcbSize) +{ + if (pcbSize == NULL) + return E_POINTER; + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CBaseBar::InitNew() +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CBaseBar::Load(IPropertyBag *pPropBag, IErrorLog *pErrorLog) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CBaseBar::Save(IPropertyBag *pPropBag, BOOL fClearDirty, BOOL fSaveAllProperties) +{ + return E_NOTIMPL; +} + +LRESULT CBaseBar::OnSize(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled) +{ +/* CComPtr oleWindow; + RECT clientRect; + HRESULT hResult; + + if (fClientWindow == NULL && fClient.p != NULL) + { + hResult = fClient->QueryInterface(IID_IOleWindow, (void **)&oleWindow); + hResult = oleWindow->GetWindow(&fClientWindow); + } + if (fClientWindow != NULL) + { + GetClientRect(&clientRect); + ::SetWindowPos(fClientWindow, NULL, clientRect.left, clientRect.top, clientRect.right - clientRect.left - GetSystemMetrics(SM_CXFRAME), + clientRect.bottom - clientRect.top, SWP_NOOWNERZORDER | SWP_NOZORDER); + }*/ + return 0; +} + +LRESULT CBaseBar::OnSetCursor(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled) +{ + if ((short)lParam != HTCLIENT || (HWND)wParam != m_hWnd) + { + bHandled = FALSE; + return 0; + } + if (fVertical) + SetCursor(LoadCursor(NULL, IDC_SIZEWE)); + else + SetCursor(LoadCursor(NULL, IDC_SIZENS)); + return 1; +} + +LRESULT CBaseBar::OnNotify(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled) +{ + CComPtr winEventHandler; + LRESULT result; + HRESULT hResult; + + result = 0; + if (fClient.p != NULL) + { + hResult = fClient->QueryInterface(IID_IWinEventHandler, (void **)&winEventHandler); + if (SUCCEEDED(hResult) && winEventHandler.p != NULL) + hResult = winEventHandler->OnWinEvent(NULL, uMsg, wParam, lParam, &result); + } + return result; +} + +LRESULT CBaseBar::OnLButtonDown(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled) +{ + SetCapture(); + fTracking = true; + fLastLocation.x = (short)LOWORD(lParam); + fLastLocation.y = (short)HIWORD(lParam); + return 0; +} + +LRESULT CBaseBar::OnLButtonUp(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled) +{ + ReleaseCapture(); + fTracking = false; + return 0; +} + +LRESULT CBaseBar::OnMouseMove(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled) +{ + POINT newLocation; + int delta; + + if (fTracking) + { + newLocation.x = (short)LOWORD(lParam); + newLocation.y = (short)HIWORD(lParam); + if (fVertical) + delta = newLocation.x - fLastLocation.x; + else + delta = newLocation.y - fLastLocation.y; + + + fLastLocation = newLocation; + } + return 0; +} + +LRESULT CBaseBar::OnCancelMode(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled) +{ + fTracking = false; + return 0; +} + +LRESULT CBaseBar::OnCaptureChanged(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled) +{ + fTracking = false; + return 0; +} + +HRESULT CreateBaseBar(REFIID riid, void **ppv) +{ + CComObject *theBaseBar; + HRESULT hResult; + + if (ppv == NULL) + return E_POINTER; + *ppv = NULL; + ATLTRY (theBaseBar = new CComObject); + if (theBaseBar == NULL) + return E_OUTOFMEMORY; + hResult = theBaseBar->QueryInterface (riid, (void **)ppv); + if (FAILED (hResult)) + { + delete theBaseBar; + return hResult; + } + return S_OK; +} diff --git a/reactos/dll/win32/browseui/basebarsite.cpp b/reactos/dll/win32/browseui/basebarsite.cpp new file mode 100644 index 00000000000..730c26dbd3e --- /dev/null +++ b/reactos/dll/win32/browseui/basebarsite.cpp @@ -0,0 +1,485 @@ +/* + * ReactOS Explorer + * + * Copyright 2009 Andrew Hill + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +/* +Base bar that contains a vertical or horizontal explorer band. It also +provides resizing abilities. +*/ +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/* +TODO: +****Fix so an already created bar will be detected and just shown instead of added again +****When a new bar is added, initiate a resize + **Add owner draw for base bar + **Make label text in base bar always draw in black + **Make base bar show close box + **Create close toolbar button + **Fix to delete all CBarInfo on deletion + +*/ + +class CBaseBarSite : + public CWindowImpl, + public CComObjectRootEx, +// public IDockingWindowSite, + public IInputObject, + public IServiceProvider, + public IWinEventHandler, + public IInputObjectSite, + public IDeskBarClient, + public IOleCommandTarget, + public IBandSite, +// public IBandSiteHelper, +// public IExplorerToolbar, + public IPersistStream +{ +private: + class CBarInfo + { + public: + CComPtr fTheBar; + CLSID fBarClass; // class of active bar + DWORD fBandID; + + }; + CBarInfo *fCurrentActiveBar; // +// HWND fRebarWindow; // rebar for top of window + CComPtr fDeskBarSite; + DWORD fNextBandID; +public: + CBaseBarSite(); + ~CBaseBarSite(); +private: + HRESULT InsertBar(IUnknown *newBar); + + // *** IOleWindow methods *** + virtual HRESULT STDMETHODCALLTYPE GetWindow(HWND *lphwnd); + virtual HRESULT STDMETHODCALLTYPE ContextSensitiveHelp(BOOL fEnterMode); + + // *** IInputObject methods *** + virtual HRESULT STDMETHODCALLTYPE UIActivateIO(BOOL fActivate, LPMSG lpMsg); + virtual HRESULT STDMETHODCALLTYPE HasFocusIO(); + virtual HRESULT STDMETHODCALLTYPE TranslateAcceleratorIO(LPMSG lpMsg); + + // *** IServiceProvider methods *** + virtual HRESULT STDMETHODCALLTYPE QueryService(REFGUID guidService, REFIID riid, void **ppvObject); + + // *** IWinEventHandler methods *** + virtual HRESULT STDMETHODCALLTYPE OnWinEvent(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT *theResult); + virtual HRESULT STDMETHODCALLTYPE IsWindowOwner(HWND hWnd); + + // *** IInputObjectSite specific methods *** + virtual HRESULT STDMETHODCALLTYPE OnFocusChangeIS (IUnknown *punkObj, BOOL fSetFocus); + + // *** IDeskBarClient methods *** + virtual HRESULT STDMETHODCALLTYPE SetDeskBarSite(IUnknown *punkSite); + virtual HRESULT STDMETHODCALLTYPE SetModeDBC(DWORD dwMode); + virtual HRESULT STDMETHODCALLTYPE UIActivateDBC(DWORD dwState); + virtual HRESULT STDMETHODCALLTYPE GetSize(DWORD dwWhich, LPRECT prc); + + // *** IOleCommandTarget methods *** + virtual HRESULT STDMETHODCALLTYPE QueryStatus(const GUID *pguidCmdGroup, ULONG cCmds, OLECMD prgCmds[ ], OLECMDTEXT *pCmdText); + virtual HRESULT STDMETHODCALLTYPE Exec(const GUID *pguidCmdGroup, DWORD nCmdID, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut); + + // *** IBandSite specific methods *** + virtual HRESULT STDMETHODCALLTYPE AddBand(IUnknown *punk); + virtual HRESULT STDMETHODCALLTYPE EnumBands(UINT uBand, DWORD *pdwBandID); + virtual HRESULT STDMETHODCALLTYPE QueryBand(DWORD dwBandID, IDeskBand **ppstb, DWORD *pdwState, LPWSTR pszName, int cchName); + virtual HRESULT STDMETHODCALLTYPE SetBandState(DWORD dwBandID, DWORD dwMask, DWORD dwState); + virtual HRESULT STDMETHODCALLTYPE RemoveBand(DWORD dwBandID); + virtual HRESULT STDMETHODCALLTYPE GetBandObject(DWORD dwBandID, REFIID riid, void **ppv); + virtual HRESULT STDMETHODCALLTYPE SetBandSiteInfo(const BANDSITEINFO *pbsinfo); + virtual HRESULT STDMETHODCALLTYPE GetBandSiteInfo(BANDSITEINFO *pbsinfo); + + // *** IPersist methods *** + virtual HRESULT STDMETHODCALLTYPE GetClassID(CLSID *pClassID); + + // *** IPersistStream methods *** + virtual HRESULT STDMETHODCALLTYPE IsDirty(); + virtual HRESULT STDMETHODCALLTYPE Load(IStream *pStm); + virtual HRESULT STDMETHODCALLTYPE Save(IStream *pStm, BOOL fClearDirty); + virtual HRESULT STDMETHODCALLTYPE GetSizeMax(ULARGE_INTEGER *pcbSize); + + // message handlers + LRESULT OnNotify(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled); + +BEGIN_MSG_MAP(CBaseBarSite) + MESSAGE_HANDLER(WM_NOTIFY, OnNotify) +END_MSG_MAP() + +BEGIN_COM_MAP(CBaseBarSite) + COM_INTERFACE_ENTRY_IID(IID_IOleWindow, IOleWindow) +// COM_INTERFACE_ENTRY_IID(IID_IDockingWindowSite, IDockingWindowSite) + COM_INTERFACE_ENTRY_IID(IID_IInputObject, IInputObject) + COM_INTERFACE_ENTRY_IID(IID_IServiceProvider, IServiceProvider) + COM_INTERFACE_ENTRY_IID(IID_IWinEventHandler, IWinEventHandler) + COM_INTERFACE_ENTRY_IID(IID_IInputObjectSite, IInputObjectSite) + COM_INTERFACE_ENTRY_IID(IID_IDeskBarClient, IDeskBarClient) + COM_INTERFACE_ENTRY_IID(IID_IOleCommandTarget, IOleCommandTarget) + COM_INTERFACE_ENTRY_IID(IID_IBandSite, IBandSite) +// COM_INTERFACE_ENTRY_IID(IID_IBandSiteHelper, IBandSiteHelper) +// COM_INTERFACE_ENTRY_IID(IID_IExplorerToolbar, IExplorerToolbar) + COM_INTERFACE_ENTRY_IID(IID_IPersist, IPersist) + COM_INTERFACE_ENTRY_IID(IID_IPersistStream, IPersistStream) +END_COM_MAP() +}; + +CBaseBarSite::CBaseBarSite() +{ + fCurrentActiveBar = NULL; + fNextBandID = 1; +} + +CBaseBarSite::~CBaseBarSite() +{ +} + +HRESULT CBaseBarSite::InsertBar(IUnknown *newBar) +{ + CComPtr persist; + CComPtr site; + CComPtr oleWindow; + CComPtr deskBand; + CComPtr dockingWindow; + CBarInfo *newInfo; + REBARBANDINFOW bandInfo; + DESKBANDINFO deskBandInfo; + DWORD thisBandID; + HRESULT hResult; + + hResult = newBar->QueryInterface(IID_IPersist, (void **)&persist); + if (FAILED(hResult)) + return hResult; + hResult = newBar->QueryInterface(IID_IObjectWithSite, (void **)&site); + if (FAILED(hResult)) + return hResult; + hResult = newBar->QueryInterface(IID_IOleWindow, (void **)&oleWindow); + if (FAILED(hResult)) + return hResult; + hResult = newBar->QueryInterface(IID_IDeskBand, (void **)&deskBand); + if (FAILED(hResult)) + return hResult; + hResult = newBar->QueryInterface(IID_IDockingWindow, (void **)&dockingWindow); + if (FAILED(hResult)) + return hResult; + hResult = site->SetSite((IOleWindow *)this); + if (FAILED(hResult)) + return hResult; + newInfo = new CBarInfo; + if (newInfo == NULL) + return E_OUTOFMEMORY; + thisBandID = fNextBandID++; + newInfo->fTheBar = newBar; + newInfo->fBandID = thisBandID; + hResult = persist->GetClassID(&newInfo->fBarClass); + deskBandInfo.dwMask = DBIM_MINSIZE | DBIM_ACTUAL | DBIM_TITLE; + deskBandInfo.wszTitle[0] = 0; + hResult = deskBand->GetBandInfo(0, 0, &deskBandInfo); + memset(&bandInfo, 0, sizeof(bandInfo)); + bandInfo.cbSize = sizeof(bandInfo); + bandInfo.fMask = RBBIM_STYLE | RBBIM_CHILD | RBBIM_CHILDSIZE | RBBIM_IDEALSIZE | RBBIM_TEXT | RBBIM_LPARAM | RBBIM_ID; + bandInfo.fStyle = RBBS_NOGRIPPER | RBBS_VARIABLEHEIGHT; + bandInfo.lpText = deskBandInfo.wszTitle; + hResult = oleWindow->GetWindow(&bandInfo.hwndChild); + bandInfo.cxMinChild = 200; //deskBandInfo.ptMinSize.x; + bandInfo.cyMinChild = 200; //deskBandInfo.ptMinSize.y; + bandInfo.cx = 0; + bandInfo.wID = thisBandID; + bandInfo.cyChild = -1; //deskBandInfo.ptActual.y; + bandInfo.cyMaxChild = 32000; + bandInfo.cyIntegral = 1; + bandInfo.cxIdeal = 0; //deskBandInfo.ptActual.x; + bandInfo.lParam = (LPARAM)newInfo; + SendMessage(RB_INSERTBANDW, -1, (LPARAM)&bandInfo); + hResult = dockingWindow->ShowDW(TRUE); // this call is what makes the tree fill with contents + if (FAILED(hResult)) + return hResult; + // for now + fCurrentActiveBar = newInfo; + return S_OK; +} + +HRESULT STDMETHODCALLTYPE CBaseBarSite::GetWindow(HWND *lphwnd) +{ + if (lphwnd == NULL) + return E_POINTER; + *lphwnd = m_hWnd; + return S_OK; +} + +HRESULT STDMETHODCALLTYPE CBaseBarSite::ContextSensitiveHelp(BOOL fEnterMode) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CBaseBarSite::UIActivateIO(BOOL fActivate, LPMSG lpMsg) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CBaseBarSite::HasFocusIO() +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CBaseBarSite::TranslateAcceleratorIO(LPMSG lpMsg) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CBaseBarSite::QueryService(REFGUID guidService, REFIID riid, void **ppvObject) +{ + CComPtr serviceProvider; + HRESULT hResult; + + if (fDeskBarSite == NULL) + return E_FAIL; + hResult = fDeskBarSite->QueryInterface(IID_IServiceProvider, (void **)&serviceProvider); + if (FAILED(hResult)) + return hResult; + // called for SID_STopLevelBrowser, IID_IBrowserService to find top level browser + // called for SID_IWebBrowserApp, IID_IConnectionPointContainer + // connection point called for DIID_DWebBrowserEvents2 to establish connection + return serviceProvider->QueryService(guidService, riid, ppvObject); +} + +HRESULT STDMETHODCALLTYPE CBaseBarSite::OnWinEvent(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT *theResult) +{ + CComPtr deskBar; + CComPtr winEventHandler; + NMHDR *notifyHeader; + RECT newBounds; + HRESULT hResult; + + hResult = S_OK; + if (uMsg == WM_NOTIFY) + { + notifyHeader = (NMHDR *)lParam; + if (notifyHeader->hwndFrom == m_hWnd && notifyHeader->code == RBN_AUTOSIZE) + { + hResult = fDeskBarSite->QueryInterface(IID_IDeskBar, (void **)&deskBar); + GetClientRect(&newBounds); + hResult = deskBar->OnPosRectChangeDB(&newBounds); + } + } + if (fCurrentActiveBar != NULL) + { + hResult = fCurrentActiveBar->fTheBar->QueryInterface(IID_IWinEventHandler, (void **)&winEventHandler); + if (SUCCEEDED(hResult) && winEventHandler.p != NULL) + hResult = winEventHandler->OnWinEvent(hWnd, uMsg, wParam, lParam, theResult); + } + return hResult; +} + +HRESULT STDMETHODCALLTYPE CBaseBarSite::IsWindowOwner(HWND hWnd) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CBaseBarSite::OnFocusChangeIS (IUnknown *punkObj, BOOL fSetFocus) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CBaseBarSite::SetDeskBarSite(IUnknown *punkSite) +{ + CComPtr oleWindow; + HWND ownerWindow; + HRESULT hResult; + + if (punkSite == NULL) + fDeskBarSite.Release(); + else + { + hResult = punkSite->QueryInterface(IID_IOleWindow, (void **)&oleWindow); + if (FAILED(hResult)) + return hResult; + hResult = punkSite->QueryInterface(IID_IUnknown, (void **)&fDeskBarSite); + if (FAILED(hResult)) + return hResult; + hResult = oleWindow->GetWindow(&ownerWindow); + if (FAILED(hResult)) + return hResult; + m_hWnd = CreateWindow(REBARCLASSNAMEW, _T(""), WS_VISIBLE | WS_CHILDWINDOW | WS_CLIPSIBLINGS | + WS_CLIPCHILDREN | + RBS_VARHEIGHT | RBS_REGISTERDROP | RBS_AUTOSIZE | RBS_VERTICALGRIPPER | RBS_DBLCLKTOGGLE | + CCS_LEFT | CCS_NODIVIDER | CCS_NOPARENTALIGN | CCS_NORESIZE, 0, 0, 0, 0, ownerWindow, NULL, + _AtlBaseModule.GetModuleInstance(), NULL); + SendMessage(RB_SETTEXTCOLOR, 0, CLR_DEFAULT); + SendMessage(RB_SETBKCOLOR, 0, CLR_DEFAULT); + } + return S_OK; +} + +HRESULT STDMETHODCALLTYPE CBaseBarSite::SetModeDBC(DWORD dwMode) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CBaseBarSite::UIActivateDBC(DWORD dwState) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CBaseBarSite::GetSize(DWORD dwWhich, LPRECT prc) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CBaseBarSite::QueryStatus(const GUID *pguidCmdGroup, ULONG cCmds, OLECMD prgCmds[ ], OLECMDTEXT *pCmdText) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CBaseBarSite::Exec(const GUID *pguidCmdGroup, DWORD nCmdID, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut) +{ + if (IsEqualIID(*pguidCmdGroup, IID_IDeskBand)) + { + switch (nCmdID) + { + case 1: // insert a new band + if (V_VT(pvaIn) != VT_UNKNOWN) + return E_INVALIDARG; + return InsertBar(V_UNKNOWN(pvaIn)); + } + } + return E_FAIL; +} + +HRESULT STDMETHODCALLTYPE CBaseBarSite::AddBand(IUnknown *punk) +{ + return InsertBar(punk); +} + +HRESULT STDMETHODCALLTYPE CBaseBarSite::EnumBands(UINT uBand, DWORD *pdwBandID) +{ + if (uBand == 0xffffffff) + { + *pdwBandID = (DWORD)SendMessage(RB_GETBANDCOUNT, 0, 0); + return S_OK; + } + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CBaseBarSite::QueryBand(DWORD dwBandID, IDeskBand **ppstb, DWORD *pdwState, LPWSTR pszName, int cchName) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CBaseBarSite::SetBandState(DWORD dwBandID, DWORD dwMask, DWORD dwState) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CBaseBarSite::RemoveBand(DWORD dwBandID) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CBaseBarSite::GetBandObject(DWORD dwBandID, REFIID riid, void **ppv) +{ + if (ppv == NULL) + return E_POINTER; + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CBaseBarSite::SetBandSiteInfo(const BANDSITEINFO *pbsinfo) +{ + if (pbsinfo == NULL) + return E_POINTER; + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CBaseBarSite::GetBandSiteInfo(BANDSITEINFO *pbsinfo) +{ + if (pbsinfo == NULL) + return E_POINTER; + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CBaseBarSite::GetClassID(CLSID *pClassID) +{ + if (pClassID == NULL) + return E_POINTER; + // TODO: what class to return here? + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CBaseBarSite::IsDirty() +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CBaseBarSite::Load(IStream *pStm) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CBaseBarSite::Save(IStream *pStm, BOOL fClearDirty) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CBaseBarSite::GetSizeMax(ULARGE_INTEGER *pcbSize) +{ + if (pcbSize == NULL) + return E_POINTER; + return E_NOTIMPL; +} + +LRESULT CBaseBarSite::OnNotify(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled) +{ + NMHDR *notifyHeader; + + notifyHeader = (NMHDR *)lParam; + if (notifyHeader->hwndFrom == m_hWnd) + { + } + return 0; +} + +HRESULT CreateBaseBarSite(REFIID riid, void **ppv) +{ + CComObject *theBaseBarSite; + HRESULT hResult; + + if (ppv == NULL) + return E_POINTER; + *ppv = NULL; + ATLTRY (theBaseBarSite = new CComObject); + if (theBaseBarSite == NULL) + return E_OUTOFMEMORY; + hResult = theBaseBarSite->QueryInterface (riid, (void **)ppv); + if (FAILED (hResult)) + { + delete theBaseBarSite; + return hResult; + } + return S_OK; +} diff --git a/reactos/dll/win32/browseui/brandband.cpp b/reactos/dll/win32/browseui/brandband.cpp new file mode 100644 index 00000000000..a33eb7ca563 --- /dev/null +++ b/reactos/dll/win32/browseui/brandband.cpp @@ -0,0 +1,483 @@ +/* + * ReactOS Explorer + * + * Copyright 2009 Andrew Hill + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +/* +Implements the logo band of a cabinet window. Most remarkable feature is the +animation. +*/ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "resource.h" +#include "brandband.h" + +/* +TODO: + Add Exec command handlers + Properly implement GetBandInfo + Fix SetSite to revoke brand band service when site is cleared +*/ + +inline void FillSolidRect(HDC dc, const RECT *bounds) +{ + ::ExtTextOut(dc, 0, 0, ETO_OPAQUE, bounds, NULL, 0, NULL); +} + +inline void FillSolidRect(HDC dc, const RECT *bounds, COLORREF clr) +{ + ::SetBkColor(dc, clr); + ::ExtTextOut(dc, 0, 0, ETO_OPAQUE, bounds, NULL, 0, NULL); +} + +long GetScreenDepth() +{ + HDC tempDC; + long depth; + + tempDC = GetDC(NULL); + depth = GetDeviceCaps(tempDC, BITSPIXEL) * GetDeviceCaps(tempDC, PLANES); + ReleaseDC(NULL, tempDC); + return depth; +} + +static const int gSmallImageSize = 22; +static const int gMediumImageSize = 26; +static const int gLargeImageSize = 38; + +static const int gTrueColorResourceBase = 240; +static const int g256ColorResourceBase = 245; + +CBrandBand::CBrandBand() +{ + fProfferCookie = 0; + fCurrentFrame = 0; + fMaxFrameCount = 0; + fImageBitmap = NULL; + fAdviseCookie = 0; +} + +CBrandBand::~CBrandBand() +{ + DeleteObject(fImageBitmap); +} + +void CBrandBand::StartAnimation() +{ + fCurrentFrame = 0; + SetTimer(5678, 30, NULL); +} + +void CBrandBand::StopAnimation() +{ + KillTimer(5678); + fCurrentFrame = 0; + Invalidate(FALSE); +} + +void CBrandBand::SelectImage() +{ + int screenDepth; + RECT clientRect; + int clientWidth; + int clientHeight; + int clientSize; + HINSTANCE shell32Instance; + BITMAP bitmapInfo; + int resourceID; + + screenDepth = GetScreenDepth(); + GetClientRect(&clientRect); + clientWidth = clientRect.right - clientRect.left; + clientHeight = clientRect.bottom - clientRect.top; + clientSize = min(clientWidth, clientHeight); + if (screenDepth > 8) + resourceID = gTrueColorResourceBase; + else + resourceID = g256ColorResourceBase; + if (clientSize >= gLargeImageSize) + resourceID += 2; + else if (clientSize >= gMediumImageSize) + resourceID += 1; + shell32Instance = GetModuleHandle(L"shell32.dll"); + fImageBitmap = LoadBitmap(shell32Instance, MAKEINTRESOURCE(resourceID)); + GetObjectW(fImageBitmap, sizeof(bitmapInfo), &bitmapInfo); + fBitmapSize = bitmapInfo.bmWidth; + fMaxFrameCount = bitmapInfo.bmHeight / fBitmapSize; +} + +HRESULT STDMETHODCALLTYPE CBrandBand::GetBandInfo(DWORD dwBandID, DWORD dwViewMode, DESKBANDINFO* pdbi) +{ + if (pdbi->dwMask & DBIM_MINSIZE) + { + pdbi->ptMinSize.x = 38; + pdbi->ptMinSize.y = 22; + } + if (pdbi->dwMask & DBIM_MAXSIZE) + { + pdbi->ptMaxSize.x = 38; + pdbi->ptMaxSize.y = 38; + } + if (pdbi->dwMask & DBIM_INTEGRAL) + { + pdbi->ptIntegral.x = 38; + pdbi->ptIntegral.y = 38; + } + if (pdbi->dwMask & DBIM_ACTUAL) + { + pdbi->ptActual.x = 38; + pdbi->ptActual.y = 38; + } + if (pdbi->dwMask & DBIM_TITLE) + wcscpy(pdbi->wszTitle, L""); + if (pdbi->dwMask & DBIM_MODEFLAGS) + pdbi->dwModeFlags = DBIMF_UNDELETEABLE; + if (pdbi->dwMask & DBIM_BKCOLOR) + pdbi->crBkgnd = 0; + return S_OK; +} + +HRESULT STDMETHODCALLTYPE CBrandBand::SetSite(IUnknown* pUnkSite) +{ + CComPtr browserService; + CComPtr oleWindow; + CComPtr serviceProvider; + CComPtr profferService; + HWND parentWindow; + HWND hwnd; + HRESULT hResult; + + fSite.Release(); + if (pUnkSite == NULL) + { + hResult = AtlUnadvise(fSite, DIID_DWebBrowserEvents, fAdviseCookie); + // TODO: revoke brand band service + return S_OK; + } + hResult = pUnkSite->QueryInterface(IID_IDockingWindowSite, (void **)&fSite); + if (FAILED(hResult)) + return hResult; + parentWindow = NULL; + hResult = pUnkSite->QueryInterface(IID_IOleWindow, (void **)&oleWindow); + if (SUCCEEDED(hResult)) + hResult = oleWindow->GetWindow(&parentWindow); + if (!::IsWindow(parentWindow)) + return E_FAIL; + + hwnd = SHCreateWorkerWindowW(0, parentWindow, 0, WS_VISIBLE | WS_CHILD | WS_CLIPSIBLINGS | WS_CLIPCHILDREN, NULL, 0); + if (hwnd == NULL) + return E_FAIL; + SubclassWindow(hwnd); + hResult = pUnkSite->QueryInterface(IID_IServiceProvider, (void **)&serviceProvider); + if (SUCCEEDED(hResult)) + { + hResult = serviceProvider->QueryService(SID_SBrandBand, IID_IProfferService, (void **)&profferService); + if (SUCCEEDED(hResult)) + hResult = profferService->ProfferService(SID_SBrandBand, (IServiceProvider *)this, &fProfferCookie); + hResult = serviceProvider->QueryService(SID_SShellBrowser, IID_IBrowserService, (void **)&browserService); + if (SUCCEEDED(hResult)) + hResult = AtlAdvise(browserService, (IDispatch *)this, DIID_DWebBrowserEvents, &fAdviseCookie); + } + // ignore any hResult errors up to here - they are nonfatal + hResult = S_OK; + SelectImage(); + return hResult; +} + +HRESULT STDMETHODCALLTYPE CBrandBand::GetSite(REFIID riid, void **ppvSite) +{ + if (ppvSite == NULL) + return E_POINTER; + if (fSite.p == NULL) + { + *ppvSite = NULL; + return E_FAIL; + } + return fSite.p->QueryInterface(riid, ppvSite); +} + +HRESULT STDMETHODCALLTYPE CBrandBand::GetWindow(HWND *lphwnd) +{ + if (lphwnd == NULL) + return E_POINTER; + *lphwnd = m_hWnd; + return S_OK; +} + +HRESULT STDMETHODCALLTYPE CBrandBand::ContextSensitiveHelp(BOOL fEnterMode) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CBrandBand::CloseDW(DWORD dwReserved) +{ + ShowDW(FALSE); + + if (IsWindow()) + DestroyWindow(); + + m_hWnd = NULL; + + return S_OK; +} + +HRESULT STDMETHODCALLTYPE CBrandBand::ResizeBorderDW(const RECT* prcBorder, IUnknown* punkToolbarSite, BOOL fReserved) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CBrandBand::ShowDW(BOOL fShow) +{ + if (m_hWnd) + { + if (fShow) + ShowWindow(SW_SHOW); + else + ShowWindow(SW_HIDE); + } + return S_OK; +} + +HRESULT STDMETHODCALLTYPE CBrandBand::HasFocusIO() +{ + if (GetFocus() == m_hWnd) + return S_OK; + return S_FALSE; +} + +HRESULT STDMETHODCALLTYPE CBrandBand::TranslateAcceleratorIO(LPMSG lpMsg) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CBrandBand::UIActivateIO(BOOL fActivate, LPMSG lpMsg) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CBrandBand::GetClassID(CLSID *pClassID) +{ + if (pClassID == NULL) + return E_POINTER; + *pClassID = CLSID_BrandBand; + return S_OK; +} + +HRESULT STDMETHODCALLTYPE CBrandBand::IsDirty() +{ + return S_FALSE; +} + +HRESULT STDMETHODCALLTYPE CBrandBand::Load(IStream *pStm) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CBrandBand::Save(IStream *pStm, BOOL fClearDirty) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CBrandBand::GetSizeMax(ULARGE_INTEGER *pcbSize) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CBrandBand::OnWinEvent(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT *theResult) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CBrandBand::IsWindowOwner(HWND hWnd) +{ + if (hWnd == m_hWnd) + return S_OK; + return S_FALSE; +} + +HRESULT STDMETHODCALLTYPE CBrandBand::QueryStatus(const GUID *pguidCmdGroup, ULONG cCmds, OLECMD prgCmds[ ], OLECMDTEXT *pCmdText) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CBrandBand::Exec(const GUID *pguidCmdGroup, DWORD nCmdID, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut) +{ + if (IsEqualIID(*pguidCmdGroup, CGID_PrivCITCommands)) + { + } + else if (IsEqualIID(*pguidCmdGroup, CGID_BrandCmdGroup)) + { + switch (nCmdID) + { + case BBID_STARTANIMATION: + StartAnimation(); + return S_OK; + case BBID_STOPANIMATION: + StopAnimation(); + return S_OK; + } + } + return E_FAIL; +} + +HRESULT STDMETHODCALLTYPE CBrandBand::QueryService(REFGUID guidService, REFIID riid, void **ppvObject) +{ + CComPtr serviceProvider; + HRESULT hResult; + + if (IsEqualIID(guidService, SID_SBrandBand)) + return this->QueryInterface(riid, ppvObject); + hResult = fSite->QueryInterface(IID_IServiceProvider, (void **)&serviceProvider); + if (FAILED (hResult)) + return hResult; + return serviceProvider->QueryService(guidService, riid, ppvObject); +} + +HRESULT STDMETHODCALLTYPE CBrandBand::GetTypeInfoCount(UINT *pctinfo) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CBrandBand::GetTypeInfo(UINT iTInfo, LCID lcid, ITypeInfo **ppTInfo) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CBrandBand::GetIDsOfNames(REFIID riid, LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CBrandBand::Invoke(DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr) +{ + if (pDispParams == NULL) + return E_INVALIDARG; + switch (dispIdMember) + { + case DISPID_DOWNLOADCOMPLETE: + StopAnimation(); + break; + case DISPID_DOWNLOADBEGIN: + StartAnimation(); + break; + } + return E_INVALIDARG; +} + +LRESULT CBrandBand::OnSize(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled) +{ + Invalidate(FALSE); + return 0; +} + +LRESULT CBrandBand::OnEraseBkgnd (UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled) +{ + return 1; +} + +LRESULT CBrandBand::OnPaint(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled) +{ + PAINTSTRUCT paintInfo; + HDC dc; + POINT destinationPoint; + HDC sourceDC; + HBITMAP oldBitmap; + RECT clientRect; + RECT tempRect; + + dc = BeginPaint(&paintInfo); + GetClientRect(&clientRect); + + destinationPoint.x = (clientRect.right - clientRect.left - fBitmapSize) / 2; + destinationPoint.y = (clientRect.bottom - clientRect.top - fBitmapSize) / 2; + + ::SetBkColor(dc, RGB(255, 255, 255)); + + tempRect.left = 0; + tempRect.top = 0; + tempRect.right = clientRect.right; + tempRect.bottom = destinationPoint.y; + FillSolidRect(dc, &tempRect, RGB(255, 255, 255)); + + tempRect.left = 0; + tempRect.top = destinationPoint.y + fBitmapSize; + tempRect.right = clientRect.right; + tempRect.bottom = clientRect.bottom; + FillSolidRect(dc, &paintInfo.rcPaint, RGB(255, 255, 255)); + + tempRect.left = 0; + tempRect.top = destinationPoint.y; + tempRect.right = destinationPoint.x; + tempRect.bottom = destinationPoint.y + fBitmapSize; + FillSolidRect(dc, &paintInfo.rcPaint, RGB(255, 255, 255)); + + tempRect.left = destinationPoint.x + fBitmapSize; + tempRect.top = destinationPoint.y; + tempRect.right = clientRect.right; + tempRect.bottom = destinationPoint.y + fBitmapSize; + FillSolidRect(dc, &paintInfo.rcPaint, RGB(255, 255, 255)); + + sourceDC = CreateCompatibleDC(dc); + oldBitmap = (HBITMAP)SelectObject(sourceDC, fImageBitmap); + + BitBlt(dc, destinationPoint.x, destinationPoint.y, fBitmapSize, fBitmapSize, sourceDC, 0, fCurrentFrame * fBitmapSize, SRCCOPY); + + SelectObject(sourceDC, oldBitmap); + DeleteDC(sourceDC); + + EndPaint(&paintInfo); + return 0; +} + +LRESULT CBrandBand::OnTimer(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled) +{ + fCurrentFrame++; + if (fCurrentFrame >= fMaxFrameCount) + fCurrentFrame = 0; + Invalidate(FALSE); + return 0; +} + +HRESULT CreateBrandBand(REFIID riid, void **ppv) +{ + CComObject *theMenuBar; + HRESULT hResult; + + if (ppv == NULL) + return E_POINTER; + *ppv = NULL; + ATLTRY (theMenuBar = new CComObject); + if (theMenuBar == NULL) + return E_OUTOFMEMORY; + hResult = theMenuBar->QueryInterface (riid, (void **)ppv); + if (FAILED (hResult)) + { + delete theMenuBar; + return hResult; + } + return S_OK; +} diff --git a/reactos/dll/win32/browseui/brandband.h b/reactos/dll/win32/browseui/brandband.h new file mode 100644 index 00000000000..50ad1d6f231 --- /dev/null +++ b/reactos/dll/win32/browseui/brandband.h @@ -0,0 +1,132 @@ +/* + * ReactOS Explorer + * + * Copyright 2009 Andrew Hill + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#ifndef _brandband_h +#define _brandband_h + +class CBrandBand : + public CWindowImpl, + public CComCoClass, + public CComObjectRootEx, + public IDeskBand, + public IObjectWithSite, + public IInputObject, + public IPersistStream, + public IWinEventHandler, + public IOleCommandTarget, + public IServiceProvider, + public IDispatch +{ +private: + CComPtr fSite; + DWORD fProfferCookie; + int fCurrentFrame; + int fMaxFrameCount; + HBITMAP fImageBitmap; + int fBitmapSize; + DWORD fAdviseCookie; +public: + CBrandBand(); + ~CBrandBand(); + void StartAnimation(); + void StopAnimation(); + void SelectImage(); +public: + // *** IDeskBand methods *** + virtual HRESULT STDMETHODCALLTYPE GetBandInfo(DWORD dwBandID, DWORD dwViewMode, DESKBANDINFO* pdbi); + + // *** IObjectWithSite methods *** + virtual HRESULT STDMETHODCALLTYPE SetSite(IUnknown* pUnkSite); + virtual HRESULT STDMETHODCALLTYPE GetSite(REFIID riid, void **ppvSite); + + // *** IOleWindow methods *** + virtual HRESULT STDMETHODCALLTYPE GetWindow(HWND *lphwnd); + virtual HRESULT STDMETHODCALLTYPE ContextSensitiveHelp(BOOL fEnterMode); + + // *** IDockingWindow methods *** + virtual HRESULT STDMETHODCALLTYPE CloseDW(DWORD dwReserved); + virtual HRESULT STDMETHODCALLTYPE ResizeBorderDW(const RECT* prcBorder, IUnknown* punkToolbarSite, BOOL fReserved); + virtual HRESULT STDMETHODCALLTYPE ShowDW(BOOL fShow); + + // *** IInputObject methods *** + virtual HRESULT STDMETHODCALLTYPE HasFocusIO(); + virtual HRESULT STDMETHODCALLTYPE TranslateAcceleratorIO(LPMSG lpMsg); + virtual HRESULT STDMETHODCALLTYPE UIActivateIO(BOOL fActivate, LPMSG lpMsg); + + // *** IPersist methods *** + virtual HRESULT STDMETHODCALLTYPE GetClassID(CLSID *pClassID); + + // *** IPersistStream methods *** + virtual HRESULT STDMETHODCALLTYPE IsDirty(); + virtual HRESULT STDMETHODCALLTYPE Load(IStream *pStm); + virtual HRESULT STDMETHODCALLTYPE Save(IStream *pStm, BOOL fClearDirty); + virtual HRESULT STDMETHODCALLTYPE GetSizeMax(ULARGE_INTEGER *pcbSize); + + // *** IWinEventHandler methods *** + virtual HRESULT STDMETHODCALLTYPE OnWinEvent(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT *theResult); + virtual HRESULT STDMETHODCALLTYPE IsWindowOwner(HWND hWnd); + + // *** IOleCommandTarget methods *** + virtual HRESULT STDMETHODCALLTYPE QueryStatus(const GUID *pguidCmdGroup, ULONG cCmds, OLECMD prgCmds[ ], OLECMDTEXT *pCmdText); + virtual HRESULT STDMETHODCALLTYPE Exec(const GUID *pguidCmdGroup, DWORD nCmdID, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut); + + // *** IServiceProvider methods *** + virtual HRESULT STDMETHODCALLTYPE QueryService(REFGUID guidService, REFIID riid, void **ppvObject); + + // *** IDispatch methods *** + virtual HRESULT STDMETHODCALLTYPE GetTypeInfoCount(UINT *pctinfo); + virtual HRESULT STDMETHODCALLTYPE GetTypeInfo(UINT iTInfo, LCID lcid, ITypeInfo **ppTInfo); + virtual HRESULT STDMETHODCALLTYPE GetIDsOfNames(REFIID riid, LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId); + virtual HRESULT STDMETHODCALLTYPE Invoke(DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr); + + // message handlers + LRESULT OnSize(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled); + LRESULT OnEraseBkgnd(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled); + LRESULT OnPaint(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled); + LRESULT OnTimer(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled); + +BEGIN_MSG_MAP(CBrandBand) +// MESSAGE_HANDLER(WM_SIZE, OnSize) + MESSAGE_HANDLER(WM_ERASEBKGND, OnEraseBkgnd) + MESSAGE_HANDLER(WM_PAINT, OnPaint) + MESSAGE_HANDLER(WM_TIMER, OnTimer) +END_MSG_MAP() + +DECLARE_REGISTRY_RESOURCEID(IDR_BRANDBAND) +DECLARE_NOT_AGGREGATABLE(CBrandBand) + +DECLARE_PROTECT_FINAL_CONSTRUCT() + +BEGIN_COM_MAP(CBrandBand) + COM_INTERFACE_ENTRY_IID(IID_IDeskBand, IDeskBand) + COM_INTERFACE_ENTRY_IID(IID_IObjectWithSite, IObjectWithSite) + COM_INTERFACE_ENTRY_IID(IID_IOleWindow, IOleWindow) + COM_INTERFACE_ENTRY_IID(IID_IDockingWindow, IDockingWindow) + COM_INTERFACE_ENTRY_IID(IID_IInputObject, IInputObject) + COM_INTERFACE_ENTRY_IID(IID_IPersist, IPersist) + COM_INTERFACE_ENTRY_IID(IID_IPersistStream, IPersistStream) + COM_INTERFACE_ENTRY_IID(IID_IWinEventHandler, IWinEventHandler) + COM_INTERFACE_ENTRY_IID(IID_IOleCommandTarget, IOleCommandTarget) + COM_INTERFACE_ENTRY_IID(IID_IServiceProvider, IServiceProvider) + COM_INTERFACE_ENTRY_IID(IID_IDispatch, IDispatch) +END_COM_MAP() +}; + +#endif // _brandband_h diff --git a/reactos/dll/win32/browseui/browseui.cpp b/reactos/dll/win32/browseui/browseui.cpp new file mode 100644 index 00000000000..fc92d8ebe7a --- /dev/null +++ b/reactos/dll/win32/browseui/browseui.cpp @@ -0,0 +1,128 @@ +/* + * ReactOS Explorer + * + * Copyright 2009 Andrew Hill + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "resource.h" +#include "aclmulti.h" +#include "addressband.h" +#include "addresseditbox.h" +#include "bandproxy.h" +#include "bandsite.h" +#include "bandsitemenu.h" +#include "brandband.h" +#include "internettoolbar.h" + +WINE_DEFAULT_DEBUG_CHANNEL(browseui); + +class CBrowseUIModule : public CComModule +{ +public: +}; + + +BEGIN_OBJECT_MAP(ObjectMap) +OBJECT_ENTRY(CLSID_ACLMulti, CACLMulti) +OBJECT_ENTRY(CLSID_SH_AddressBand, CAddressBand) +OBJECT_ENTRY(CLSID_AddressEditBox, CAddressEditBox) +OBJECT_ENTRY(CLSID_BandProxy, CBandProxy) +OBJECT_ENTRY(CLSID_RebarBandSite, CBandSite) +OBJECT_ENTRY(CLSID_BandSiteMenu, CBandSiteMenu) +OBJECT_ENTRY(CLSID_BrandBand, CBrandBand) +OBJECT_ENTRY(CLSID_InternetToolbar, CInternetToolbar) +END_OBJECT_MAP() + +CBrowseUIModule gModule; +CAtlWinModule gWinModule; + +/************************************************************************* + * BROWSEUI DllMain + */ +BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID fImpLoad) +{ + TRACE("%p 0x%x %p\n", hInstance, dwReason, fImpLoad); + if (dwReason == DLL_PROCESS_ATTACH) + { + gModule.Init(ObjectMap, hInstance, NULL); + DisableThreadLibraryCalls (hInstance); + } + else if (dwReason == DLL_PROCESS_DETACH) + { + gModule.Term(); + } + return TRUE; +} + +/*********************************************************************** + * DllCanUnloadNow (BROWSEUI.@) + */ +STDAPI DllCanUnloadNow() +{ + return gModule.DllCanUnloadNow(); +} + +/*********************************************************************** + * DllGetClassObject (BROWSEUI.@) + */ +STDAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID *ppv) +{ + return gModule.DllGetClassObject(rclsid, riid, ppv); +} + +/*********************************************************************** + * DllRegisterServer (BROWSEUI.@) + */ +STDAPI DllRegisterServer() +{ + return gModule.DllRegisterServer(FALSE); +} + +/*********************************************************************** + * DllUnregisterServer (BROWSEUI.@) + */ +STDAPI DllUnregisterServer() +{ + return gModule.DllUnregisterServer(FALSE); +} + +/*********************************************************************** + * DllGetVersion (BROWSEUI.@) + */ +HRESULT WINAPI DllGetVersion(DLLVERSIONINFO *info) +{ + if (info->cbSize != sizeof(DLLVERSIONINFO)) FIXME("support DLLVERSIONINFO2\n"); + + /* this is what IE6 on Windows 98 reports */ + info->dwMajorVersion = 6; + info->dwMinorVersion = 0; + info->dwBuildNumber = 2600; + info->dwPlatformID = DLLVER_PLATFORM_WINDOWS; + + return NOERROR; +} diff --git a/reactos/dll/win32/browseui/browseui.h b/reactos/dll/win32/browseui/browseui.h deleted file mode 100644 index 424d3bd7ff7..00000000000 --- a/reactos/dll/win32/browseui/browseui.h +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Internal header for browseui.dll - * - * Copyright 2007 Mikolaj Zalewski - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA - */ - -#ifndef __WINE_BROWSEUI_H -#define __WINE_BROWSEUI_H - -extern LONG BROWSEUI_refCount; - -HRESULT WINAPI ACLMulti_Constructor(IUnknown *punkOuter, IUnknown **ppOut); -HRESULT WINAPI BandSite_Constructor(IUnknown *punkOuter, IUnknown **ppOut); -HRESULT WINAPI BandSiteMenu_Constructor(IUnknown *punkOuter, IUnknown **ppOut); - -#endif /* __WINE_SHDOCVW_H */ diff --git a/reactos/dll/win32/browseui/browseui.rbuild b/reactos/dll/win32/browseui/browseui.rbuild index 8a3a2890a08..89e3d65a3b6 100644 --- a/reactos/dll/win32/browseui/browseui.rbuild +++ b/reactos/dll/win32/browseui/browseui.rbuild @@ -5,20 +5,44 @@ . include/reactos/wine - . + . + + + 0x600 wine + shlwapi + shell32 + comctl32 + gdi32 ole32 + oleaut32 user32 advapi32 kernel32 uuid ntdll - aclmulti.c - bandsite.c - bandsitemenu.c - browseui_main.c - regsvr.c - version.rc + atlnew + msvcrt + aclmulti.cpp + addressband.cpp + addresseditbox.cpp + bandproxy.cpp + bandsite.cpp + bandsitemenu.cpp + basebar.cpp + basebarsite.cpp + brandband.cpp + browseui.cpp + browseuiord.cpp + commonbrowser.cpp + globalfoldersettings.cpp + internettoolbar.cpp + regtreeoptions.cpp + shellbrowser.cpp + toolsband.cpp + travellog.cpp + utility.cpp + browseui.rc diff --git a/reactos/dll/win32/browseui/browseui.rc b/reactos/dll/win32/browseui/browseui.rc new file mode 100644 index 00000000000..8c6bd657d8c --- /dev/null +++ b/reactos/dll/win32/browseui/browseui.rc @@ -0,0 +1,78 @@ +/* + * Top level resource file for browseui stuff + * + * Copyright 2009 Andrew Hill + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include +#include "shlobj.h" +#include "resource.h" + +#include "version.rc" + +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL + +///////////////////////////////////////////////////////////////////////////// +// +// REGISTRY +// +IDR_ADDRESSBAND REGISTRY "res\\addressband.rgs" +IDR_ADDRESSEDITBOX REGISTRY "res\\addresseditbox.rgs" +IDR_ACLMULTI REGISTRY "res\\autocompletecontainer.rgs" +IDR_BANDPROXY REGISTRY "res\\bandproxy.rgs" +IDR_BANDSITE REGISTRY "res\\rebarbandsite.rgs" +IDR_BANDSITEMENU REGISTRY "res\\bandsitemenu.rgs" +IDR_BRANDBAND REGISTRY "res\\brandband.rgs" +IDR_COMMONBROWSER REGISTRY "res\\commonbrowser.rgs" +IDR_GLOBALFOLDERSETTINGS REGISTRY "res\\globalfoldersettings.rgs" +IDR_INTERNETTOOLBAR REGISTRY "res\\internettoolbar.rgs" +IDR_REGTREEOPTIONS REGISTRY "res\\regtreeoptions.rgs" + + +/* + * Everything specific to any language goes + * in one of the specific files. + */ +//#include "lang/bg-BG.rc" +//#include "lang/ca-ES.rc" +//#include "lang/cs-CZ.rc" +//#include "lang/da-DK.rc" +//#include "lang/de-DE.rc" +//#include "lang/el-GR.rc" +//#include "lang/en-GB.rc" +#include "lang/en-US.rc" +//#include "lang/es-ES.rc" +//#include "lang/fi-FI.rc" +//#include "lang/fr-FR.rc" +//#include "lang/hu-HU.rc" +//#include "lang/it-IT.rc" +//#include "lang/ja-JP.rc" +//#include "lang/ko-KR.rc" +//#include "lang/nl-NL.rc" +//#include "lang/no-NO.rc" +//#include "lang/pl-PL.rc" +//#include "lang/pt-BR.rc" +//#include "lang/pt-PT.rc" +//#include "lang/ro-RO.rc" +//#include "lang/ru-RU.rc" +//#include "lang/sl-SI.rc" +//#include "lang/sk-SK.rc" +//#include "lang/sv-SE.rc" +//#include "lang/tr-TR.rc" +//#include "lang/uk-UA.rc" +//#include "lang/zh-CN.rc" +//#include "lang/zh-TW.rc" diff --git a/reactos/dll/win32/browseui/browseui.spec b/reactos/dll/win32/browseui/browseui.spec index 5d1d2d33c12..74c5e332f2b 100644 --- a/reactos/dll/win32/browseui/browseui.spec +++ b/reactos/dll/win32/browseui/browseui.spec @@ -1,6 +1,31 @@ -@ stdcall -private DllCanUnloadNow() -@ stdcall -private DllGetClassObject(ptr ptr ptr) -@ stdcall -private DllGetVersion(ptr) -@ stub DllInstall -@ stdcall -private DllRegisterServer() -@ stdcall -private DllUnregisterServer() +@ stdcall -private DllCanUnloadNow() +@ stdcall -private DllGetClassObject(ptr ptr ptr) +@ stdcall -private DllGetVersion(ptr) +@ stub DllInstall +@ stdcall -private DllRegisterServer() +@ stdcall -private DllUnregisterServer() +101 stdcall -noname InitOCHostClass(long) +102 stdcall -noname SHOpenFolderWindow(ptr) +103 stdcall -noname SHOpenNewFrame(ptr ptr long long) +105 stdcall -noname SHCreateSavedWindows() +106 stdcall -noname SHCreateFromDesktop(long) +107 stdcall -noname SHExplorerParseCmdLine(wstr) +118 stdcall -noname UEMRegisterNotify(long long) +120 stdcall -noname SHCreateBandForPidl(ptr ptr long) +121 stdcall -noname SHPidlFromDataObject(ptr ptr long ptr) +122 stdcall -noname IDataObject_GetDeskBandState(long) +123 stdcall -noname SHCreateIETHREADPARAM(long long ptr ptr) +124 stdcall -noname SHCloneIETHREADPARAM(ptr) +125 stdcall -noname SHParseIECommandLine(long long) +126 stdcall -noname SHDestroyIETHREADPARAM(ptr) +127 stdcall -noname SHOnCWMCommandLine(long) +128 stdcall -noname Channel_GetFolderPidl() +129 stdcall -noname ChannelBand_Create(ptr) +130 stdcall -noname Channels_SetBandInfoSFB(ptr) +131 stdcall -noname IUnknown_SetBandInfoSFB(ptr long) +133 stdcall -noname Channel_QuickLaunch() +134 stdcall -noname SHGetNavigateTarget(long long long long) +135 stdcall -noname GetInfoTip(ptr long wstr long) +136 stdcall -noname SHEnumClassesOfCategories(long long long long long) +137 stdcall -noname SHWriteClassesOfCategories(long long long long long long long) +138 stdcall -noname SHIsExplorerBrowser() diff --git a/reactos/dll/win32/browseui/browseui_main.c b/reactos/dll/win32/browseui/browseui_main.c deleted file mode 100644 index 21db6bf15ae..00000000000 --- a/reactos/dll/win32/browseui/browseui_main.c +++ /dev/null @@ -1,218 +0,0 @@ -/* - * browseui - Internet Explorer / Windows Explorer standard UI - * - * Copyright 2001 John R. Sheets (for CodeWeavers) - * Copyright 2004 Mike McCormack (for CodeWeavers) - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA - */ - -#include "config.h" - -#include -#include - -#define COBJMACROS - -#include "wine/debug.h" -#include "windef.h" -#include "winbase.h" -#include "winreg.h" -#include "shlwapi.h" -#include "shlguid.h" - -#include "browseui.h" -#include "shobjidl.h" /* for IShellFolder used in undoc.h */ -#include "initguid.h" -#include "undoc.h" /* for CLSID_RebarBandSite */ - -WINE_DEFAULT_DEBUG_CHANNEL(browseui); - -LONG BROWSEUI_refCount = 0; - -HINSTANCE browseui_hinstance = 0; - -typedef HRESULT (WINAPI *LPFNCONSTRUCTOR)(IUnknown *pUnkOuter, IUnknown **ppvOut); - -/* undoc GUID */ -DEFINE_GUID(CLSID_RebarBandSite, 0xECD4FC4D, 0x521C, 0x11D0, 0xB7, 0x92, 0x00, 0xA0, 0xC9, 0x03, 0x12, 0xE1); - - -static const struct { - REFCLSID clsid; - LPFNCONSTRUCTOR ctor; -} ClassesTable[] = { - {&CLSID_ACLMulti, ACLMulti_Constructor}, - {&CLSID_RebarBandSite, BandSite_Constructor}, - {&CLSID_IShellBandSiteMenu, BandSiteMenu_Constructor}, - {NULL, NULL} -}; - -typedef struct tagClassFactory -{ - const IClassFactoryVtbl *vtbl; - LONG ref; - LPFNCONSTRUCTOR ctor; -} ClassFactory; -static const IClassFactoryVtbl ClassFactoryVtbl; - -static HRESULT ClassFactory_Constructor(LPFNCONSTRUCTOR ctor, LPVOID *ppvOut) -{ - ClassFactory *This = CoTaskMemAlloc(sizeof(ClassFactory)); - This->vtbl = &ClassFactoryVtbl; - This->ref = 1; - This->ctor = ctor; - *ppvOut = (LPVOID)This; - TRACE("Created class factory %p\n", This); - BROWSEUI_refCount++; - return S_OK; -} - -static void ClassFactory_Destructor(ClassFactory *This) -{ - TRACE("Destroying class factory %p\n", This); - CoTaskMemFree(This); - BROWSEUI_refCount--; -} - -static HRESULT WINAPI ClassFactory_QueryInterface(IClassFactory *iface, REFIID riid, LPVOID *ppvOut) -{ - *ppvOut = NULL; - if (IsEqualIID(riid, &IID_IClassFactory) || IsEqualIID(riid, &IID_IUnknown)) { - IClassFactory_AddRef(iface); - *ppvOut = iface; - return S_OK; - } - - WARN("Unknown interface %s\n", debugstr_guid(riid)); - return E_NOINTERFACE; -} - -static ULONG WINAPI ClassFactory_AddRef(IClassFactory *iface) -{ - ClassFactory *This = (ClassFactory *)iface; - return InterlockedIncrement(&This->ref); -} - -static ULONG WINAPI ClassFactory_Release(IClassFactory *iface) -{ - ClassFactory *This = (ClassFactory *)iface; - ULONG ret = InterlockedDecrement(&This->ref); - - if (ret == 0) - ClassFactory_Destructor(This); - return ret; -} - -static HRESULT WINAPI ClassFactory_CreateInstance(IClassFactory *iface, IUnknown *punkOuter, REFIID iid, LPVOID *ppvOut) -{ - ClassFactory *This = (ClassFactory *)iface; - HRESULT ret; - IUnknown *obj; - - TRACE("(%p, %p, %s, %p)\n", iface, punkOuter, debugstr_guid(iid), ppvOut); - ret = This->ctor(punkOuter, &obj); - if (FAILED(ret)) - return ret; - ret = IUnknown_QueryInterface(obj, iid, ppvOut); - IUnknown_Release(obj); - return ret; -} - -static HRESULT WINAPI ClassFactory_LockServer(IClassFactory *iface, BOOL fLock) -{ - ClassFactory *This = (ClassFactory *)iface; - - TRACE("(%p)->(%x)\n", This, fLock); - - if(fLock) - InterlockedIncrement(&BROWSEUI_refCount); - else - InterlockedDecrement(&BROWSEUI_refCount); - - return S_OK; -} - -static const IClassFactoryVtbl ClassFactoryVtbl = { - /* IUnknown */ - ClassFactory_QueryInterface, - ClassFactory_AddRef, - ClassFactory_Release, - - /* IClassFactory*/ - ClassFactory_CreateInstance, - ClassFactory_LockServer -}; - -/************************************************************************* - * BROWSEUI DllMain - */ -BOOL WINAPI DllMain(HINSTANCE hinst, DWORD fdwReason, LPVOID fImpLoad) -{ - TRACE("%p 0x%x %p\n", hinst, fdwReason, fImpLoad); - switch (fdwReason) - { - case DLL_WINE_PREATTACH: - return FALSE; /* prefer native version */ - case DLL_PROCESS_ATTACH: - DisableThreadLibraryCalls(hinst); - browseui_hinstance = hinst; - break; - } - return TRUE; -} - -/************************************************************************* - * DllCanUnloadNow (BROWSEUI.@) - */ -HRESULT WINAPI DllCanUnloadNow(void) -{ - return BROWSEUI_refCount ? S_FALSE : S_OK; -} - -/*********************************************************************** - * DllGetVersion (BROWSEUI.@) - */ -HRESULT WINAPI DllGetVersion(DLLVERSIONINFO *info) -{ - if (info->cbSize != sizeof(DLLVERSIONINFO)) FIXME("support DLLVERSIONINFO2\n"); - - /* this is what IE6 on Windows 98 reports */ - info->dwMajorVersion = 6; - info->dwMinorVersion = 0; - info->dwBuildNumber = 2600; - info->dwPlatformID = DLLVER_PLATFORM_WINDOWS; - - return NOERROR; -} - -/*********************************************************************** - * DllGetClassObject (BROWSEUI.@) - */ -HRESULT WINAPI DllGetClassObject(REFCLSID clsid, REFIID iid, LPVOID *ppvOut) -{ - int i; - - *ppvOut = NULL; - if (!IsEqualIID(iid, &IID_IUnknown) && !IsEqualIID(iid, &IID_IClassFactory)) - return E_NOINTERFACE; - - for (i = 0; ClassesTable[i].clsid != NULL; i++) - if (IsEqualCLSID(ClassesTable[i].clsid, clsid)) { - return ClassFactory_Constructor(ClassesTable[i].ctor, ppvOut); - } - FIXME("CLSID %s not supported\n", debugstr_guid(clsid)); - return CLASS_E_CLASSNOTAVAILABLE; -} diff --git a/reactos/dll/win32/browseui/browseuiord.cpp b/reactos/dll/win32/browseui/browseuiord.cpp new file mode 100644 index 00000000000..7f3ac3b3c79 --- /dev/null +++ b/reactos/dll/win32/browseui/browseuiord.cpp @@ -0,0 +1,302 @@ +/* + * ReactOS browseui + * + * Copyright 2009 Andrew Hill + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include +#include +#include +#include +#include +#include + +extern DWORD WINAPI BrowserThreadProc(LPVOID lpThreadParameter); + +/************************************************************************* + * InitOCHostClass [BROWSEUI.101] + */ +extern "C" void WINAPI InitOCHostClass(long param8) +{ + // forwards to shdocvw +} + +/************************************************************************* + * SHOpenFolderWindow [BROWSEUI.102] + */ +extern "C" long WINAPI SHOpenFolderWindow(IEThreadParamBlock *param8) +{ + return 0; +} + +/************************************************************************* + * SHCreateSavedWindows [BROWSEUI.105] + * Called to recreate explorer windows from previous session + */ +extern "C" void WINAPI SHCreateSavedWindows() +{ +} + +/************************************************************************* + * SHCreateFromDesktop [BROWSEUI.106] + * parameter is a FolderInfo + */ +extern "C" long WINAPI SHCreateFromDesktop(long param8) +{ + return -1; +} + +/************************************************************************* + * SHExplorerParseCmdLine [BROWSEUI.107] + */ +extern "C" long WINAPI SHExplorerParseCmdLine(LPCTSTR commandLine) +{ + return -1; +} + +/************************************************************************* + * UEMRegisterNotify [BROWSEUI.118] + */ +extern "C" void WINAPI UEMRegisterNotify(long param8, long paramC) +{ +} + +/************************************************************************* + * SHCreateBandForPidl [BROWSEUI.120] + */ +extern "C" HRESULT WINAPI SHCreateBandForPidl(LPCITEMIDLIST param8, IUnknown *paramC, BOOL param10) +{ + return E_NOTIMPL; +} + +/************************************************************************* + * SHPidlFromDataObject [BROWSEUI.121] + */ +extern "C" HRESULT WINAPI SHPidlFromDataObject(IDataObject *param8, long *paramC, long param10, FILEDESCRIPTORW *param14) +{ + return E_NOTIMPL; +} + +/************************************************************************* + * IDataObject_GetDeskBandState [BROWSEUI.122] + */ +extern "C" long WINAPI IDataObject_GetDeskBandState(long param8) +{ + return -1; +} + +/************************************************************************* + * SHCreateIETHREADPARAM [BROWSEUI.123] + */ +extern "C" IEThreadParamBlock *WINAPI SHCreateIETHREADPARAM(long param8, long paramC, IUnknown *param10, IUnknown *param14) +{ + IEThreadParamBlock *result; + + result = (IEThreadParamBlock *)LocalAlloc(LMEM_ZEROINIT, 256); + if (result == NULL) + return NULL; + result->offset0 = param8; + result->offset8 = paramC; + result->offsetC = param10; + if (param10 != NULL) + param10->AddRef(); + result->offset14 = param14; + if (param14 != NULL) + param14->AddRef(); + return result; +} + +/************************************************************************* + * SHCloneIETHREADPARAM [BROWSEUI.124] + */ +extern "C" IEThreadParamBlock *WINAPI SHCloneIETHREADPARAM(IEThreadParamBlock *param) +{ + IEThreadParamBlock *result; + + result = (IEThreadParamBlock *)LocalAlloc(LMEM_FIXED, 256); + if (result == NULL) + return NULL; + memcpy(result, param, 0x40 * 4); + if (result->directoryPIDL != NULL) + result->directoryPIDL = ILClone(result->directoryPIDL); + if (result->offset7C != NULL) + result->offset7C = ILClone(result->offset7C); + if (result->offset80 != NULL) + result->offset80 = ILClone(result->offset80); + if (result->offset70 != NULL) + result->offset70->AddRef(); +#if 0 + if (result->offsetC != NULL) + result->offsetC->Method2C(); +#endif + return result; +} + +/************************************************************************* + * SHParseIECommandLine [BROWSEUI.125] + */ +extern "C" long WINAPI SHParseIECommandLine(long param8, long paramC) +{ + return -1; +} + +/************************************************************************* + * SHDestroyIETHREADPARAM [BROWSEUI.126] + */ +extern "C" void WINAPI SHDestroyIETHREADPARAM(IEThreadParamBlock *param) +{ + if (param == NULL) + return; + if (param->directoryPIDL != NULL) + ILFree(param->directoryPIDL); + if (param->offset7C != NULL) + ILFree(param->offset7C); + if ((param->offset4 & 0x80000) == 0 && param->offset80 != NULL) + ILFree(param->offset80); + if (param->offset14 != NULL) + param->offset14->Release(); + if (param->offset70 != NULL) + param->offset70->Release(); + if (param->offset78 != NULL) + param->offset78->Release(); + if (param->offsetC != NULL) + param->offsetC->Release(); + if (param->offsetF8 != NULL) + param->offsetF8->Release(); + LocalFree(param); +} + +/************************************************************************* + * SHOnCWMCommandLine [BROWSEUI.127] + */ +extern "C" HRESULT WINAPI SHOnCWMCommandLine(long param8) +{ + return E_NOTIMPL; +} + +/************************************************************************* + * Channel_GetFolderPidl [BROWSEUI.128] + */ +extern "C" LPITEMIDLIST WINAPI Channel_GetFolderPidl() +{ + return NULL; +} + +/************************************************************************* + * ChannelBand_Create [BROWSEUI.129] + */ +extern "C" IUnknown *WINAPI ChannelBand_Create(LPITEMIDLIST pidl) +{ + return NULL; +} + +/************************************************************************* + * Channels_SetBandInfoSFB [BROWSEUI.130] + */ +extern "C" HRESULT WINAPI Channels_SetBandInfoSFB(IUnknown *param8) +{ + return E_NOTIMPL; +} + +/************************************************************************* + * IUnknown_SetBandInfoSFB [BROWSEUI.131] + */ +extern "C" HRESULT WINAPI IUnknown_SetBandInfoSFB(IUnknown *param8, long paramC) +{ + return E_NOTIMPL; +} + +/************************************************************************* + * Channel_QuickLaunch [BROWSEUI.133] + */ +extern "C" HRESULT WINAPI Channel_QuickLaunch() +{ + return E_NOTIMPL; +} + +/************************************************************************* + * SHGetNavigateTarget [BROWSEUI.134] + */ +extern "C" HRESULT WINAPI SHGetNavigateTarget(long param8, long paramC, long param10, long param14) +{ + return E_NOTIMPL; +} + +/************************************************************************* + * GetInfoTip [BROWSEUI.135] + */ +extern "C" HRESULT WINAPI GetInfoTip(IUnknown *param8, long paramC, LPTSTR *param10, long cchMax) +{ + return E_NOTIMPL; +} + +/************************************************************************* + * SHEnumClassesOfCategories [BROWSEUI.136] + */ +extern "C" HRESULT WINAPI SHEnumClassesOfCategories(long param8, long paramC, long param10, long param14, long param18) +{ + return E_NOTIMPL; +} + +/************************************************************************* + * SHWriteClassesOfCategories [BROWSEUI.137] + */ +extern "C" HRESULT WINAPI SHWriteClassesOfCategories(long param8, long paramC, long param10, long param14, long param18, long param1C, long param20) +{ + return E_NOTIMPL; +} + +/************************************************************************* + * SHIsExplorerBrowser [BROWSEUI.138] + */ +extern "C" BOOL WINAPI SHIsExplorerBrowser() +{ + return TRUE; +} + +// 75FA56C1h +// (pidl, 0, -1, 1) +// this function should handle creating a new process if needed, but I'm leaving that out for now +// this function always opens a new window - it does NOT check for duplicates +/************************************************************************* + * SHOpenNewFrame [BROWSEUI.103] + */ +extern "C" HRESULT WINAPI SHOpenNewFrame(LPITEMIDLIST pidl, IUnknown *paramC, long param10, long param14) +{ + IEThreadParamBlock *parameters; + HANDLE threadHandle; + DWORD threadID; + + parameters = SHCreateIETHREADPARAM(0, 1, paramC, NULL); + if (parameters == NULL) + { + ILFree(pidl); + return E_OUTOFMEMORY; + } + if (paramC != NULL) + parameters->offset10 = param10; + parameters->directoryPIDL = pidl; + parameters->offset4 = param14; + threadHandle = CreateThread(NULL, 0x10000, BrowserThreadProc, parameters, 0, &threadID); + if (threadHandle != NULL) + { + CloseHandle(threadHandle); + return S_OK; + } + SHDestroyIETHREADPARAM(parameters); + return E_FAIL; +} diff --git a/reactos/dll/win32/browseui/commonbrowser.cpp b/reactos/dll/win32/browseui/commonbrowser.cpp new file mode 100644 index 00000000000..87e4b7b8a04 --- /dev/null +++ b/reactos/dll/win32/browseui/commonbrowser.cpp @@ -0,0 +1,661 @@ +/* + * ReactOS Explorer + * + * Copyright 2009 Andrew Hill + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "resource.h" +#include "commonbrowser.h" + +CCommonBrowser::CCommonBrowser() +{ +} + +CCommonBrowser::~CCommonBrowser() +{ +} + +HRESULT STDMETHODCALLTYPE CCommonBrowser::QueryService(REFGUID guidService, REFIID riid, void **ppvObject) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CCommonBrowser::QueryStatus(const GUID *pguidCmdGroup, ULONG cCmds, OLECMD prgCmds[ ], OLECMDTEXT *pCmdText) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CCommonBrowser::Exec(const GUID *pguidCmdGroup, DWORD nCmdID, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CCommonBrowser::GetParentSite(IOleInPlaceSite **ppipsite) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CCommonBrowser::SetTitle(IShellView *psv, LPCWSTR pszName) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CCommonBrowser::GetTitle(IShellView *psv, LPWSTR pszName, DWORD cchName) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CCommonBrowser::GetOleObject(IOleObject **ppobjv) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CCommonBrowser::GetTravelLog(ITravelLog **pptl) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CCommonBrowser::ShowControlWindow(UINT id, BOOL fShow) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CCommonBrowser::IsControlWindowShown(UINT id, BOOL *pfShown) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CCommonBrowser::IEGetDisplayName(LPCITEMIDLIST pidl, LPWSTR pwszName, UINT uFlags) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CCommonBrowser::IEParseDisplayName(UINT uiCP, LPCWSTR pwszPath, LPCITEMIDLIST *ppidlOut) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CCommonBrowser::DisplayParseError(HRESULT hres, LPCWSTR pwszPath) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CCommonBrowser::NavigateToPidl(LPCITEMIDLIST pidl, DWORD grfHLNF) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CCommonBrowser::SetNavigateState(BNSTATE bnstate) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CCommonBrowser::GetNavigateState(BNSTATE *pbnstate) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CCommonBrowser::NotifyRedirect(IShellView *psv, LPCITEMIDLIST pidl, BOOL *pfDidBrowse) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CCommonBrowser::UpdateWindowList() +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CCommonBrowser::UpdateBackForwardState() +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CCommonBrowser::SetFlags(DWORD dwFlags, DWORD dwFlagMask) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CCommonBrowser::GetFlags(DWORD *pdwFlags) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CCommonBrowser::CanNavigateNow( void) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CCommonBrowser::GetPidl(LPCITEMIDLIST *ppidl) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CCommonBrowser::SetReferrer(LPCITEMIDLIST pidl) +{ + return E_NOTIMPL; +} + +DWORD STDMETHODCALLTYPE CCommonBrowser::GetBrowserIndex() +{ + return 0; +} + +HRESULT STDMETHODCALLTYPE CCommonBrowser::GetBrowserByIndex(DWORD dwID, IUnknown **ppunk) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CCommonBrowser::GetHistoryObject(IOleObject **ppole, IStream **pstm, IBindCtx **ppbc) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CCommonBrowser::SetHistoryObject(IOleObject *pole, BOOL fIsLocalAnchor) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CCommonBrowser::CacheOLEServer(IOleObject *pole) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CCommonBrowser::GetSetCodePage(VARIANT *pvarIn, VARIANT *pvarOut) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CCommonBrowser::OnHttpEquiv(IShellView *psv, BOOL fDone, VARIANT *pvarargIn, VARIANT *pvarargOut) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CCommonBrowser::GetPalette(HPALETTE *hpal) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CCommonBrowser::RegisterWindow(BOOL fForceRegister, int swc) +{ + return E_NOTIMPL; +} + +LRESULT STDMETHODCALLTYPE CCommonBrowser::WndProcBS(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) +{ + return 0; +} + +HRESULT STDMETHODCALLTYPE CCommonBrowser::SetAsDefFolderSettings() +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CCommonBrowser::GetViewRect(RECT *prc) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CCommonBrowser::OnSize(WPARAM wParam) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CCommonBrowser::OnCreate(struct tagCREATESTRUCTW *pcs) +{ + return E_NOTIMPL; +} + +LRESULT STDMETHODCALLTYPE CCommonBrowser::OnCommand(WPARAM wParam, LPARAM lParam) +{ + return 0; +} + +HRESULT STDMETHODCALLTYPE CCommonBrowser::OnDestroy() +{ + return E_NOTIMPL; +} + +LRESULT STDMETHODCALLTYPE CCommonBrowser::OnNotify(struct tagNMHDR *pnm) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CCommonBrowser::OnSetFocus() +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CCommonBrowser::OnFrameWindowActivateBS(BOOL fActive) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CCommonBrowser::ReleaseShellView() +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CCommonBrowser::ActivatePendingView() +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CCommonBrowser::CreateViewWindow(IShellView *psvNew, IShellView *psvOld, LPRECT prcView, HWND *phwnd) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CCommonBrowser::CreateBrowserPropSheetExt(REFIID riid, void **ppv) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CCommonBrowser::GetViewWindow(HWND *phwndView) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CCommonBrowser::GetBaseBrowserData(LPCBASEBROWSERDATA *pbbd) +{ + return E_NOTIMPL; +} + +LPBASEBROWSERDATA CCommonBrowser::PutBaseBrowserData() +{ + return NULL; +} + +HRESULT STDMETHODCALLTYPE CCommonBrowser::InitializeTravelLog(ITravelLog *ptl, DWORD dw) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CCommonBrowser::SetTopBrowser() +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CCommonBrowser::Offline(int iCmd) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CCommonBrowser::AllowViewResize(BOOL f) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CCommonBrowser::SetActivateState(UINT u) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CCommonBrowser::UpdateSecureLockIcon(int eSecureLock) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CCommonBrowser::InitializeDownloadManager() +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CCommonBrowser::InitializeTransitionSite() +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CCommonBrowser::_Initialize(HWND hwnd, IUnknown *pauto) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CCommonBrowser::_CancelPendingNavigationAsync( void) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CCommonBrowser::_CancelPendingView() +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CCommonBrowser::_MaySaveChanges() +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CCommonBrowser::_PauseOrResumeView(BOOL fPaused) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CCommonBrowser::_DisableModeless() +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CCommonBrowser::_NavigateToPidl(LPCITEMIDLIST pidl, DWORD grfHLNF, DWORD dwFlags) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CCommonBrowser::_TryShell2Rename(IShellView *psv, LPCITEMIDLIST pidlNew) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CCommonBrowser::_SwitchActivationNow() +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CCommonBrowser::_ExecChildren(IUnknown *punkBar, BOOL fBroadcast, const GUID *pguidCmdGroup, DWORD nCmdID, DWORD nCmdexecopt, VARIANTARG *pvarargIn, VARIANTARG *pvarargOut) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CCommonBrowser::_SendChildren(HWND hwndBar, BOOL fBroadcast, UINT uMsg, WPARAM wParam, LPARAM lParam) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CCommonBrowser::GetFolderSetData(struct tagFolderSetData *pfsd) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CCommonBrowser::_OnFocusChange(UINT itb) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CCommonBrowser::v_ShowHideChildWindows(BOOL fChildOnly) +{ + return E_NOTIMPL; +} + +UINT STDMETHODCALLTYPE CCommonBrowser::_get_itbLastFocus() +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CCommonBrowser::_put_itbLastFocus(UINT itbLastFocus) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CCommonBrowser::_UIActivateView(UINT uState) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CCommonBrowser::_GetViewBorderRect(RECT *prc) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CCommonBrowser::_UpdateViewRectSize() +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CCommonBrowser::_ResizeNextBorder(UINT itb) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CCommonBrowser::_ResizeView() +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CCommonBrowser::_GetEffectiveClientArea(LPRECT lprectBorder, HMONITOR hmon) +{ + return E_NOTIMPL; +} + +IStream *STDMETHODCALLTYPE CCommonBrowser::v_GetViewStream(LPCITEMIDLIST pidl, DWORD grfMode, LPCWSTR pwszName) +{ + return NULL; +} + +LRESULT STDMETHODCALLTYPE CCommonBrowser::ForwardViewMsg(UINT uMsg, WPARAM wParam, LPARAM lParam) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CCommonBrowser::SetAcceleratorMenu(HACCEL hacc) +{ + return E_NOTIMPL; +} + +int STDMETHODCALLTYPE CCommonBrowser::_GetToolbarCount() +{ + return 0; +} + +LPTOOLBARITEM STDMETHODCALLTYPE CCommonBrowser::_GetToolbarItem(int itb) +{ + return NULL; +} + +HRESULT STDMETHODCALLTYPE CCommonBrowser::_SaveToolbars(IStream *pstm) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CCommonBrowser::_LoadToolbars(IStream *pstm) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CCommonBrowser::_CloseAndReleaseToolbars(BOOL fClose) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CCommonBrowser::v_MayGetNextToolbarFocus(LPMSG lpMsg, UINT itbNext, int citb, LPTOOLBARITEM *pptbi, HWND *phwnd) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CCommonBrowser::_ResizeNextBorderHelper(UINT itb, BOOL bUseHmonitor) +{ + return E_NOTIMPL; +} + +UINT STDMETHODCALLTYPE CCommonBrowser::_FindTBar(IUnknown *punkSrc) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CCommonBrowser::_SetFocus(LPTOOLBARITEM ptbi, HWND hwnd, LPMSG lpMsg) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CCommonBrowser::v_MayTranslateAccelerator(MSG *pmsg) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CCommonBrowser::_GetBorderDWHelper(IUnknown *punkSrc, LPRECT lprectBorder, BOOL bUseHmonitor) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CCommonBrowser::v_CheckZoneCrossing(LPCITEMIDLIST pidl) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CCommonBrowser::_PositionViewWindow(HWND *, RECT *) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CCommonBrowser::IEParseDisplayNameEx(unsigned int, const unsigned short *, DWORD, LPITEMIDLIST *) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CCommonBrowser::InsertMenusSB(HMENU hmenuShared, LPOLEMENUGROUPWIDTHS lpMenuWidths) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CCommonBrowser::SetMenuSB(HMENU hmenuShared, HOLEMENU holemenuRes, HWND hwndActiveObject) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CCommonBrowser::RemoveMenusSB(HMENU hmenuShared) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CCommonBrowser::SetStatusTextSB(LPCOLESTR pszStatusText) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CCommonBrowser::EnableModelessSB(BOOL fEnable) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CCommonBrowser::TranslateAcceleratorSB(MSG *pmsg, WORD wID) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CCommonBrowser::BrowseObject(LPCITEMIDLIST pidl, UINT wFlags) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CCommonBrowser::GetViewStateStream(DWORD grfMode, IStream **ppStrm) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CCommonBrowser::GetControlWindow(UINT id, HWND *lphwnd) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CCommonBrowser::SendControlMsg(UINT id, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT *pret) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CCommonBrowser::QueryActiveShellView(struct IShellView **ppshv) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CCommonBrowser::OnViewWindowActive(struct IShellView *ppshv) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CCommonBrowser::SetToolbarItems(LPTBBUTTON lpButtons, UINT nButtons, UINT uFlags) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CCommonBrowser::GetPropertyBag(long flags, REFIID riid, void **ppvObject) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CCommonBrowser::GetWindow(HWND *lphwnd) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CCommonBrowser::ContextSensitiveHelp(BOOL fEnterMode) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CCommonBrowser::GetBorderDW(IUnknown* punkObj, LPRECT prcBorder) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CCommonBrowser::RequestBorderSpaceDW(IUnknown* punkObj, LPCBORDERWIDTHS pbw) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CCommonBrowser::SetBorderSpaceDW(IUnknown* punkObj, LPCBORDERWIDTHS pbw) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CCommonBrowser::AddToolbar(IUnknown *punkSrc, LPCWSTR pwszItem, DWORD dwAddFlags) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CCommonBrowser::RemoveToolbar(IUnknown *punkSrc, DWORD dwRemoveFlags) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CCommonBrowser::FindToolbar(LPCWSTR pwszItem, REFIID riid, void **ppv) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CCommonBrowser::OnFocusChangeIS(IUnknown *punkObj, BOOL fSetFocus) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CCommonBrowser::DragEnter(IDataObject *pDataObj, DWORD grfKeyState, POINTL pt, DWORD *pdwEffect) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CCommonBrowser::DragOver(DWORD grfKeyState, POINTL pt, DWORD *pdwEffect) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CCommonBrowser::DragLeave() +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CCommonBrowser::Drop(IDataObject *pDataObj, DWORD grfKeyState, POINTL pt, DWORD *pdwEffect) +{ + return E_NOTIMPL; +} diff --git a/reactos/dll/win32/browseui/commonbrowser.h b/reactos/dll/win32/browseui/commonbrowser.h new file mode 100644 index 00000000000..dfe5562920a --- /dev/null +++ b/reactos/dll/win32/browseui/commonbrowser.h @@ -0,0 +1,210 @@ +/* + * ReactOS Explorer + * + * Copyright 2009 Andrew Hill + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#ifndef _commonbrowser_h +#define _commonbrowser_h + +class CCommonBrowser : + public CComCoClass, + public CComObjectRootEx, + public IServiceProvider, + public IOleCommandTarget, + public IBrowserService3, + public IShellBrowser, + public IShellBrowserService, + public IDockingWindowSite, + public IDockingWindowFrame, + public IInputObjectSite, + public IDropTarget +{ +private: +public: + CCommonBrowser(); + ~CCommonBrowser(); + + // *** IServiceProvider methods *** + virtual HRESULT STDMETHODCALLTYPE QueryService(REFGUID guidService, REFIID riid, void **ppvObject); + + // *** IOleCommandTarget methods *** + virtual HRESULT STDMETHODCALLTYPE QueryStatus(const GUID *pguidCmdGroup, ULONG cCmds, OLECMD prgCmds[ ], OLECMDTEXT *pCmdText); + virtual HRESULT STDMETHODCALLTYPE Exec(const GUID *pguidCmdGroup, DWORD nCmdID, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut); + + // *** IBrowserService methods *** + virtual HRESULT STDMETHODCALLTYPE GetParentSite(IOleInPlaceSite **ppipsite); + virtual HRESULT STDMETHODCALLTYPE SetTitle(IShellView *psv, LPCWSTR pszName); + virtual HRESULT STDMETHODCALLTYPE GetTitle(IShellView *psv, LPWSTR pszName, DWORD cchName); + virtual HRESULT STDMETHODCALLTYPE GetOleObject(IOleObject **ppobjv); + virtual HRESULT STDMETHODCALLTYPE GetTravelLog(ITravelLog **pptl); + virtual HRESULT STDMETHODCALLTYPE ShowControlWindow(UINT id, BOOL fShow); + virtual HRESULT STDMETHODCALLTYPE IsControlWindowShown(UINT id, BOOL *pfShown); + virtual HRESULT STDMETHODCALLTYPE IEGetDisplayName(LPCITEMIDLIST pidl, LPWSTR pwszName, UINT uFlags); + virtual HRESULT STDMETHODCALLTYPE IEParseDisplayName(UINT uiCP, LPCWSTR pwszPath, LPCITEMIDLIST *ppidlOut); + virtual HRESULT STDMETHODCALLTYPE DisplayParseError(HRESULT hres, LPCWSTR pwszPath); + virtual HRESULT STDMETHODCALLTYPE NavigateToPidl(LPCITEMIDLIST pidl, DWORD grfHLNF); + virtual HRESULT STDMETHODCALLTYPE SetNavigateState(BNSTATE bnstate); + virtual HRESULT STDMETHODCALLTYPE GetNavigateState(BNSTATE *pbnstate); + virtual HRESULT STDMETHODCALLTYPE NotifyRedirect(IShellView *psv, LPCITEMIDLIST pidl, BOOL *pfDidBrowse); + virtual HRESULT STDMETHODCALLTYPE UpdateWindowList(); + virtual HRESULT STDMETHODCALLTYPE UpdateBackForwardState(); + virtual HRESULT STDMETHODCALLTYPE SetFlags(DWORD dwFlags, DWORD dwFlagMask); + virtual HRESULT STDMETHODCALLTYPE GetFlags(DWORD *pdwFlags); + virtual HRESULT STDMETHODCALLTYPE CanNavigateNow(); + virtual HRESULT STDMETHODCALLTYPE GetPidl(LPCITEMIDLIST *ppidl); + virtual HRESULT STDMETHODCALLTYPE SetReferrer(LPCITEMIDLIST pidl); + virtual DWORD STDMETHODCALLTYPE GetBrowserIndex(); + virtual HRESULT STDMETHODCALLTYPE GetBrowserByIndex(DWORD dwID, IUnknown **ppunk); + virtual HRESULT STDMETHODCALLTYPE GetHistoryObject(IOleObject **ppole, IStream **pstm, IBindCtx **ppbc); + virtual HRESULT STDMETHODCALLTYPE SetHistoryObject(IOleObject *pole, BOOL fIsLocalAnchor); + virtual HRESULT STDMETHODCALLTYPE CacheOLEServer(IOleObject *pole); + virtual HRESULT STDMETHODCALLTYPE GetSetCodePage(VARIANT *pvarIn, VARIANT *pvarOut); + virtual HRESULT STDMETHODCALLTYPE OnHttpEquiv(IShellView *psv, BOOL fDone, VARIANT *pvarargIn, VARIANT *pvarargOut); + virtual HRESULT STDMETHODCALLTYPE GetPalette(HPALETTE *hpal); + virtual HRESULT STDMETHODCALLTYPE RegisterWindow(BOOL fForceRegister, int swc); + + // *** IBrowserService2 methods *** + virtual LRESULT STDMETHODCALLTYPE WndProcBS(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam); + virtual HRESULT STDMETHODCALLTYPE SetAsDefFolderSettings(); + virtual HRESULT STDMETHODCALLTYPE GetViewRect(RECT *prc); + virtual HRESULT STDMETHODCALLTYPE OnSize(WPARAM wParam); + virtual HRESULT STDMETHODCALLTYPE OnCreate(struct tagCREATESTRUCTW *pcs); + virtual LRESULT STDMETHODCALLTYPE OnCommand(WPARAM wParam, LPARAM lParam); + virtual HRESULT STDMETHODCALLTYPE OnDestroy(); + virtual LRESULT STDMETHODCALLTYPE OnNotify(struct tagNMHDR *pnm); + virtual HRESULT STDMETHODCALLTYPE OnSetFocus(); + virtual HRESULT STDMETHODCALLTYPE OnFrameWindowActivateBS(BOOL fActive); + virtual HRESULT STDMETHODCALLTYPE ReleaseShellView(); + virtual HRESULT STDMETHODCALLTYPE ActivatePendingView(); + virtual HRESULT STDMETHODCALLTYPE CreateViewWindow(IShellView *psvNew, IShellView *psvOld, LPRECT prcView, HWND *phwnd); + virtual HRESULT STDMETHODCALLTYPE CreateBrowserPropSheetExt(REFIID riid, void **ppv); + virtual HRESULT STDMETHODCALLTYPE GetViewWindow(HWND *phwndView); + virtual HRESULT STDMETHODCALLTYPE GetBaseBrowserData(LPCBASEBROWSERDATA *pbbd); + virtual LPBASEBROWSERDATA STDMETHODCALLTYPE PutBaseBrowserData(); + virtual HRESULT STDMETHODCALLTYPE InitializeTravelLog(ITravelLog *ptl, DWORD dw); + virtual HRESULT STDMETHODCALLTYPE SetTopBrowser(); + virtual HRESULT STDMETHODCALLTYPE Offline(int iCmd); + virtual HRESULT STDMETHODCALLTYPE AllowViewResize(BOOL f); + virtual HRESULT STDMETHODCALLTYPE SetActivateState(UINT u); + virtual HRESULT STDMETHODCALLTYPE UpdateSecureLockIcon(int eSecureLock); + virtual HRESULT STDMETHODCALLTYPE InitializeDownloadManager(); + virtual HRESULT STDMETHODCALLTYPE InitializeTransitionSite(); + virtual HRESULT STDMETHODCALLTYPE _Initialize(HWND hwnd, IUnknown *pauto); + virtual HRESULT STDMETHODCALLTYPE _CancelPendingNavigationAsync(); + virtual HRESULT STDMETHODCALLTYPE _CancelPendingView(); + virtual HRESULT STDMETHODCALLTYPE _MaySaveChanges(); + virtual HRESULT STDMETHODCALLTYPE _PauseOrResumeView(BOOL fPaused); + virtual HRESULT STDMETHODCALLTYPE _DisableModeless(); + virtual HRESULT STDMETHODCALLTYPE _NavigateToPidl(LPCITEMIDLIST pidl, DWORD grfHLNF, DWORD dwFlags); + virtual HRESULT STDMETHODCALLTYPE _TryShell2Rename(IShellView *psv, LPCITEMIDLIST pidlNew); + virtual HRESULT STDMETHODCALLTYPE _SwitchActivationNow(); + virtual HRESULT STDMETHODCALLTYPE _ExecChildren(IUnknown *punkBar, BOOL fBroadcast, const GUID *pguidCmdGroup, DWORD nCmdID, DWORD nCmdexecopt, VARIANTARG *pvarargIn, VARIANTARG *pvarargOut); + virtual HRESULT STDMETHODCALLTYPE _SendChildren(HWND hwndBar, BOOL fBroadcast, UINT uMsg, WPARAM wParam, LPARAM lParam); + virtual HRESULT STDMETHODCALLTYPE GetFolderSetData(struct tagFolderSetData *pfsd); + virtual HRESULT STDMETHODCALLTYPE _OnFocusChange(UINT itb); + virtual HRESULT STDMETHODCALLTYPE v_ShowHideChildWindows(BOOL fChildOnly); + virtual UINT STDMETHODCALLTYPE _get_itbLastFocus(); + virtual HRESULT STDMETHODCALLTYPE _put_itbLastFocus(UINT itbLastFocus); + virtual HRESULT STDMETHODCALLTYPE _UIActivateView(UINT uState); + virtual HRESULT STDMETHODCALLTYPE _GetViewBorderRect(RECT *prc); + virtual HRESULT STDMETHODCALLTYPE _UpdateViewRectSize(); + virtual HRESULT STDMETHODCALLTYPE _ResizeNextBorder(UINT itb); + virtual HRESULT STDMETHODCALLTYPE _ResizeView(); + virtual HRESULT STDMETHODCALLTYPE _GetEffectiveClientArea(LPRECT lprectBorder, HMONITOR hmon); + virtual IStream *STDMETHODCALLTYPE v_GetViewStream(LPCITEMIDLIST pidl, DWORD grfMode, LPCWSTR pwszName); + virtual LRESULT STDMETHODCALLTYPE ForwardViewMsg(UINT uMsg, WPARAM wParam, LPARAM lParam); + virtual HRESULT STDMETHODCALLTYPE SetAcceleratorMenu(HACCEL hacc); + virtual int STDMETHODCALLTYPE _GetToolbarCount(); + virtual LPTOOLBARITEM STDMETHODCALLTYPE _GetToolbarItem(int itb); + virtual HRESULT STDMETHODCALLTYPE _SaveToolbars(IStream *pstm); + virtual HRESULT STDMETHODCALLTYPE _LoadToolbars(IStream *pstm); + virtual HRESULT STDMETHODCALLTYPE _CloseAndReleaseToolbars(BOOL fClose); + virtual HRESULT STDMETHODCALLTYPE v_MayGetNextToolbarFocus(LPMSG lpMsg, UINT itbNext, int citb, LPTOOLBARITEM *pptbi, HWND *phwnd); + virtual HRESULT STDMETHODCALLTYPE _ResizeNextBorderHelper(UINT itb, BOOL bUseHmonitor); + virtual UINT STDMETHODCALLTYPE _FindTBar(IUnknown *punkSrc); + virtual HRESULT STDMETHODCALLTYPE _SetFocus(LPTOOLBARITEM ptbi, HWND hwnd, LPMSG lpMsg); + virtual HRESULT STDMETHODCALLTYPE v_MayTranslateAccelerator(MSG *pmsg); + virtual HRESULT STDMETHODCALLTYPE _GetBorderDWHelper(IUnknown *punkSrc, LPRECT lprectBorder, BOOL bUseHmonitor); + virtual HRESULT STDMETHODCALLTYPE v_CheckZoneCrossing(LPCITEMIDLIST pidl); + + // *** IBrowserService3 methods *** + virtual HRESULT STDMETHODCALLTYPE _PositionViewWindow(HWND *, RECT *); + virtual HRESULT STDMETHODCALLTYPE IEParseDisplayNameEx(unsigned int, const unsigned short *, DWORD, LPITEMIDLIST *); + + // *** IShellBrowser methods *** + virtual HRESULT STDMETHODCALLTYPE InsertMenusSB(HMENU hmenuShared, LPOLEMENUGROUPWIDTHS lpMenuWidths); + virtual HRESULT STDMETHODCALLTYPE SetMenuSB(HMENU hmenuShared, HOLEMENU holemenuRes, HWND hwndActiveObject); + virtual HRESULT STDMETHODCALLTYPE RemoveMenusSB(HMENU hmenuShared); + virtual HRESULT STDMETHODCALLTYPE SetStatusTextSB(LPCOLESTR pszStatusText); + virtual HRESULT STDMETHODCALLTYPE EnableModelessSB(BOOL fEnable); + virtual HRESULT STDMETHODCALLTYPE TranslateAcceleratorSB(MSG *pmsg, WORD wID); + virtual HRESULT STDMETHODCALLTYPE BrowseObject(LPCITEMIDLIST pidl, UINT wFlags); + virtual HRESULT STDMETHODCALLTYPE GetViewStateStream(DWORD grfMode, IStream **ppStrm); + virtual HRESULT STDMETHODCALLTYPE GetControlWindow(UINT id, HWND *lphwnd); + virtual HRESULT STDMETHODCALLTYPE SendControlMsg(UINT id, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT *pret); + virtual HRESULT STDMETHODCALLTYPE QueryActiveShellView(struct IShellView **ppshv); + virtual HRESULT STDMETHODCALLTYPE OnViewWindowActive(struct IShellView *ppshv); + virtual HRESULT STDMETHODCALLTYPE SetToolbarItems(LPTBBUTTON lpButtons, UINT nButtons, UINT uFlags); + + // *** IShellBowserService methods *** + virtual HRESULT STDMETHODCALLTYPE GetPropertyBag(long flags, REFIID riid, void **ppvObject); + + // *** IOleWindow methods *** + virtual HRESULT STDMETHODCALLTYPE GetWindow(HWND *lphwnd); + virtual HRESULT STDMETHODCALLTYPE ContextSensitiveHelp(BOOL fEnterMode); + + // *** IDockingWindowSite methods *** + virtual HRESULT STDMETHODCALLTYPE GetBorderDW(IUnknown* punkObj, LPRECT prcBorder); + virtual HRESULT STDMETHODCALLTYPE RequestBorderSpaceDW(IUnknown* punkObj, LPCBORDERWIDTHS pbw); + virtual HRESULT STDMETHODCALLTYPE SetBorderSpaceDW(IUnknown* punkObj, LPCBORDERWIDTHS pbw); + + // *** IDockingWindowFrame methods *** + virtual HRESULT STDMETHODCALLTYPE AddToolbar(IUnknown *punkSrc, LPCWSTR pwszItem, DWORD dwAddFlags); + virtual HRESULT STDMETHODCALLTYPE RemoveToolbar(IUnknown *punkSrc, DWORD dwRemoveFlags); + virtual HRESULT STDMETHODCALLTYPE FindToolbar(LPCWSTR pwszItem, REFIID riid, void **ppv); + + // *** IInputObjectSite specific methods *** + virtual HRESULT STDMETHODCALLTYPE OnFocusChangeIS(IUnknown *punkObj, BOOL fSetFocus); + + // *** IDropTarget methods *** + virtual HRESULT STDMETHODCALLTYPE DragEnter(IDataObject *pDataObj, DWORD grfKeyState, POINTL pt, DWORD *pdwEffect); + virtual HRESULT STDMETHODCALLTYPE DragOver(DWORD grfKeyState, POINTL pt, DWORD *pdwEffect); + virtual HRESULT STDMETHODCALLTYPE DragLeave(); + virtual HRESULT STDMETHODCALLTYPE Drop(IDataObject *pDataObj, DWORD grfKeyState, POINTL pt, DWORD *pdwEffect); + +DECLARE_REGISTRY_RESOURCEID(IDR_COMMONBROWSER) + +DECLARE_PROTECT_FINAL_CONSTRUCT() + +BEGIN_COM_MAP(CCommonBrowser) + COM_INTERFACE_ENTRY_IID(IID_IServiceProvider, IServiceProvider) + COM_INTERFACE_ENTRY_IID(IID_IOleCommandTarget, IOleCommandTarget) + COM_INTERFACE_ENTRY_IID(IID_IBrowserService, IBrowserService) + COM_INTERFACE_ENTRY_IID(IID_IBrowserService2, IBrowserService2) + COM_INTERFACE_ENTRY_IID(IID_IBrowserService3, IBrowserService3) + COM_INTERFACE_ENTRY_IID(IID_IShellBrowser, IShellBrowser) + COM_INTERFACE_ENTRY_IID(IID_IShellBrowserService, IShellBrowserService) + COM_INTERFACE_ENTRY2_IID(IID_IOleWindow, IOleWindow, IDockingWindowSite) + COM_INTERFACE_ENTRY_IID(IID_IDockingWindowSite, IDockingWindowSite) + COM_INTERFACE_ENTRY_IID(IID_IDockingWindowFrame, IDockingWindowFrame) + COM_INTERFACE_ENTRY_IID(IID_IInputObjectSite, IInputObjectSite) + COM_INTERFACE_ENTRY_IID(IID_IDropTarget, IDropTarget) +END_COM_MAP() +}; + +#endif // _commonbrowser_h diff --git a/reactos/dll/win32/browseui/globalfoldersettings.cpp b/reactos/dll/win32/browseui/globalfoldersettings.cpp new file mode 100644 index 00000000000..73ef09345d6 --- /dev/null +++ b/reactos/dll/win32/browseui/globalfoldersettings.cpp @@ -0,0 +1,51 @@ +/* + * ReactOS Explorer + * + * Copyright 2009 Andrew Hill + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "resource.h" +#include "globalfoldersettings.h" + +CGlobalFolderSettings::CGlobalFolderSettings() +{ +} + +CGlobalFolderSettings::~CGlobalFolderSettings() +{ +} + +HRESULT STDMETHODCALLTYPE CGlobalFolderSettings::Get(DEFFOLDERSETTINGS *paramC, int param10) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CGlobalFolderSettings::Set(const DEFFOLDERSETTINGS *paramC, int param10, unsigned int param14) +{ + return E_NOTIMPL; +} diff --git a/reactos/dll/win32/browseui/globalfoldersettings.h b/reactos/dll/win32/browseui/globalfoldersettings.h new file mode 100644 index 00000000000..1878f4017d3 --- /dev/null +++ b/reactos/dll/win32/browseui/globalfoldersettings.h @@ -0,0 +1,48 @@ +/* + * ReactOS Explorer + * + * Copyright 2009 Andrew Hill + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#ifndef _globalfoldersettings_h +#define _globalfoldersettings_h + +class CGlobalFolderSettings : + public CComCoClass, + public CComObjectRootEx, + public IGlobalFolderSettings +{ +private: +public: + CGlobalFolderSettings(); + ~CGlobalFolderSettings(); + + // *** IGlobalFolderSettings methods *** + virtual HRESULT STDMETHODCALLTYPE Get(DEFFOLDERSETTINGS *paramC, int param10); + virtual HRESULT STDMETHODCALLTYPE Set(const DEFFOLDERSETTINGS *paramC, int param10, unsigned int param14); + +DECLARE_REGISTRY_RESOURCEID(IDR_GLOBALFOLDERSETTINGS) +DECLARE_NOT_AGGREGATABLE(CGlobalFolderSettings) + +DECLARE_PROTECT_FINAL_CONSTRUCT() + +BEGIN_COM_MAP(CGlobalFolderSettings) + COM_INTERFACE_ENTRY_IID(IID_IGlobalFolderSettings, IGlobalFolderSettings) +END_COM_MAP() +}; + +#endif // _globalfoldersettings_h diff --git a/reactos/dll/win32/browseui/internettoolbar.cpp b/reactos/dll/win32/browseui/internettoolbar.cpp new file mode 100644 index 00000000000..f64fcf353ba --- /dev/null +++ b/reactos/dll/win32/browseui/internettoolbar.cpp @@ -0,0 +1,1553 @@ +/* + * ReactOS Explorer + * + * Copyright 2009 Andrew Hill + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +/* +Implements a class that knows how to hold and manage the menu band, brand band, +toolbar, and address band for an explorer window +*/ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "resource.h" +#include "internettoolbar.h" + +// navigation controls and menubar just send a message to parent window +/* +TODO: +****Implement BandProxy methods +****Add QueryStatus handler for built-in bands +****Enable/Disable up, search, and folders commands appropriately + **Why are explorer toolbar separators a nonstandard width? + **Remove "(Empty)" item from Favorites menu. Probably something missing in CMenuCallback::CallbackSM + **Chevron menu on menuband doesn't work + **Fix CInternetToolbar::QueryBand to be generic + +****Fix context menu to strip divider when menu shown for menu band +****Fix context menu to have items checked appropriately +****Implement -1 command id update +****When bands are rearranged, resize the internet toolbar and fix height of brand band +****Right clicking on the browse back and forward toolbar buttons displays the same as pulldown menus + Implement show/hide of bands + Why is the background color of my toolbars different from explorer? + Internet Toolbar command handler should get the target for the command and call Exec on the target. + For commands built in to the Internet Toolbar, its Exec handles the command + When window width is changed, brand band flashes badly + Add all bands with correct ids (system bands now add with correct ids) + Implement IBandSite + Implement remaining IExplorerToolbar methods + Fix toolbar buttons to enable/disable correctly + After toolbar is customized, it may be necessary to patch the widths of separators + Add theme support + Check sizes and spacing of toolbars against Explorer + Implement resizing of the dock bar + Add missing icons for toolbar items + Draw History item in forward/back dropdown menus with icon + Fix toolbar customize dialog to not include separators as possible selections + Implement save/restore of toolbar state + Refactor drop down menu code to use a common function since code is so similar +*/ + +extern HRESULT WINAPI SHBindToFolder(LPITEMIDLIST path, IShellFolder **newFolder); +extern HRESULT CreateToolsBar(REFIID riid, void **ppv); +extern HRESULT CreateBrandBand(REFIID riid, void **ppv); +extern HRESULT CreateBandProxy(REFIID riid, void **ppv); +extern HRESULT CreateAddressBand(REFIID riid, void **ppv); + +class CInternetToolbar; + +class CDockSite : + public CComObjectRootEx, + public IDockingWindowSite, + public IInputObjectSite, + public IOleCommandTarget, + public IServiceProvider +{ +public: + enum { + ITF_NOGRIPPER = 1, + ITF_NOTITLE = 2, + ITF_NEWBANDALWAYS = 4, + ITF_GRIPPERALWAYS = 8, + ITF_FIXEDSIZE = 16 + }; +private: + CComPtr fContainedBand; // the band inside us + CInternetToolbar *fToolbar; // our browser + HWND fRebarWindow; + HWND fChildWindow; + int fBandID; +public: + int fFlags; +private: + bool fInitialized; + // fields of DESKBANDINFO must be preserved between calls to GetBandInfo + DESKBANDINFO fDeskBandInfo; +public: + CDockSite(); + ~CDockSite(); + HRESULT Initialize(IUnknown *containedBand, CInternetToolbar *browser, HWND hwnd, int bandID, int flags); + HRESULT GetRBBandInfo(REBARBANDINFOW &bandInfo); +private: + + // *** IOleWindow methods *** + virtual HRESULT STDMETHODCALLTYPE GetWindow(HWND *lphwnd); + virtual HRESULT STDMETHODCALLTYPE ContextSensitiveHelp(BOOL fEnterMode); + + // *** IDockingWindow methods *** + virtual HRESULT STDMETHODCALLTYPE GetBorderDW(IUnknown* punkObj, LPRECT prcBorder); + virtual HRESULT STDMETHODCALLTYPE RequestBorderSpaceDW(IUnknown* punkObj, LPCBORDERWIDTHS pbw); + virtual HRESULT STDMETHODCALLTYPE SetBorderSpaceDW(IUnknown* punkObj, LPCBORDERWIDTHS pbw); + + // *** IInputObjectSite specific methods *** + virtual HRESULT STDMETHODCALLTYPE OnFocusChangeIS(IUnknown *punkObj, BOOL fSetFocus); + + // *** IOleCommandTarget specific methods *** + virtual HRESULT STDMETHODCALLTYPE QueryStatus(const GUID *pguidCmdGroup, ULONG cCmds, OLECMD prgCmds[ ], OLECMDTEXT *pCmdText); + virtual HRESULT STDMETHODCALLTYPE Exec(const GUID *pguidCmdGroup, DWORD nCmdID, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut); + + // *** IServiceProvider methods *** + virtual HRESULT STDMETHODCALLTYPE QueryService(REFGUID guidService, REFIID riid, void **ppvObject); + +BEGIN_COM_MAP(CDockSite) + COM_INTERFACE_ENTRY_IID(IID_IOleWindow, IOleWindow) + COM_INTERFACE_ENTRY_IID(IID_IDockingWindowSite, IDockingWindowSite) + COM_INTERFACE_ENTRY_IID(IID_IInputObjectSite, IInputObjectSite) + COM_INTERFACE_ENTRY_IID(IID_IOleCommandTarget, IOleCommandTarget) + COM_INTERFACE_ENTRY_IID(IID_IServiceProvider, IServiceProvider) +END_COM_MAP() +}; + +CDockSite::CDockSite() +{ + fToolbar = NULL; + fRebarWindow = NULL; + fChildWindow = NULL; + fInitialized = false; + memset(&fDeskBandInfo, 0, sizeof(fDeskBandInfo)); +} + +CDockSite::~CDockSite() +{ +} + +HRESULT CDockSite::Initialize(IUnknown *containedBand, CInternetToolbar *browser, HWND hwnd, int bandID, int flags) +{ + CComPtr site; + CComPtr oleWindow; + CComPtr deskBand; + TCHAR textBuffer[40]; + REBARBANDINFOW bandInfo; + int bandCount; + HRESULT hResult; + + hResult = containedBand->QueryInterface(IID_IObjectWithSite, (void **)&site); + if (FAILED(hResult)) + return hResult; + hResult = containedBand->QueryInterface(IID_IOleWindow, (void **)&oleWindow); + if (FAILED(hResult)) + return hResult; + hResult = containedBand->QueryInterface(IID_IDeskBand, (void **)&deskBand); + if (FAILED(hResult)) + return hResult; + fContainedBand = containedBand; + fToolbar = browser; + fRebarWindow = hwnd; + fBandID = bandID; + fFlags = flags; + hResult = site->SetSite((IOleWindow *)this); + if (FAILED(hResult)) + return hResult; + hResult = oleWindow->GetWindow(&fChildWindow); + if (FAILED(hResult)) + return hResult; + + memset(&bandInfo, 0, sizeof(bandInfo)); + bandInfo.cbSize = sizeof(bandInfo); + bandInfo.lpText = textBuffer; + bandInfo.cch = sizeof(textBuffer) / sizeof(TCHAR); + hResult = GetRBBandInfo(bandInfo); + + bandCount = (int)SendMessage(fRebarWindow, RB_GETBANDCOUNT, 0, 0); + SendMessage(fRebarWindow, RB_INSERTBANDW, -1, (LPARAM)&bandInfo); + fInitialized = true; + return S_OK; +} + +HRESULT CDockSite::GetRBBandInfo(REBARBANDINFOW &bandInfo) +{ + CComPtr deskBand; + HRESULT hResult; + + hResult = fContainedBand->QueryInterface(IID_IDeskBand, (void **)&deskBand); + if (FAILED(hResult)) + return hResult; + + fDeskBandInfo.dwMask = DBIM_BKCOLOR | DBIM_MODEFLAGS | DBIM_TITLE | DBIM_ACTUAL | DBIM_INTEGRAL | DBIM_MAXSIZE | DBIM_MINSIZE; + hResult = deskBand->GetBandInfo(fBandID, 0, &fDeskBandInfo); + // result of call is ignored + + bandInfo.fMask = RBBIM_LPARAM | RBBIM_IDEALSIZE | RBBIM_ID | RBBIM_CHILDSIZE | RBBIM_CHILD | RBBIM_TEXT | RBBIM_STYLE; + + bandInfo.fStyle = RBBS_FIXEDBMP; + if (fDeskBandInfo.dwModeFlags & DBIMF_VARIABLEHEIGHT) + bandInfo.fStyle |= RBBS_VARIABLEHEIGHT; + if (fDeskBandInfo.dwModeFlags & DBIMF_USECHEVRON) + bandInfo.fStyle |= RBBS_USECHEVRON; + if (fDeskBandInfo.dwModeFlags & DBIMF_BREAK) + bandInfo.fStyle |= RBBS_BREAK; + if (fDeskBandInfo.dwModeFlags & DBIMF_TOPALIGN) + bandInfo.fStyle |= RBBS_TOPALIGN; + if (fFlags & ITF_NOGRIPPER || fToolbar->fLocked == true) + bandInfo.fStyle |= RBBS_NOGRIPPER; + if (fFlags & ITF_NOTITLE) + bandInfo.fStyle |= RBBS_HIDETITLE; + if (fFlags & ITF_GRIPPERALWAYS && fToolbar->fLocked == false) + bandInfo.fStyle |= RBBS_GRIPPERALWAYS; + if (fFlags & ITF_FIXEDSIZE) + bandInfo.fStyle |= RBBS_FIXEDSIZE; + + if (fDeskBandInfo.dwModeFlags & DBIMF_BKCOLOR) + { + bandInfo.fMask |= RBBIM_COLORS; + bandInfo.clrFore = CLR_DEFAULT; + bandInfo.clrBack = fDeskBandInfo.crBkgnd; + } + wcsncpy(bandInfo.lpText, fDeskBandInfo.wszTitle, bandInfo.cch); + bandInfo.hwndChild = fChildWindow; + bandInfo.cxMinChild = fDeskBandInfo.ptMinSize.x; + bandInfo.cyMinChild = fDeskBandInfo.ptMinSize.y; + bandInfo.wID = fBandID; + bandInfo.cyChild = fDeskBandInfo.ptActual.y; + bandInfo.cyMaxChild = fDeskBandInfo.ptMaxSize.y; + bandInfo.cyIntegral = fDeskBandInfo.ptIntegral.y; + bandInfo.cxIdeal = fDeskBandInfo.ptActual.x; + bandInfo.lParam = (LPARAM)this; + return S_OK; +} + +HRESULT STDMETHODCALLTYPE CDockSite::GetWindow(HWND *lphwnd) +{ + if (lphwnd == NULL) + return E_POINTER; + *lphwnd = fRebarWindow; + return S_OK; +} + +HRESULT STDMETHODCALLTYPE CDockSite::ContextSensitiveHelp(BOOL fEnterMode) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CDockSite::GetBorderDW(IUnknown* punkObj, LPRECT prcBorder) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CDockSite::RequestBorderSpaceDW(IUnknown* punkObj, LPCBORDERWIDTHS pbw) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CDockSite::SetBorderSpaceDW(IUnknown* punkObj, LPCBORDERWIDTHS pbw) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CDockSite::OnFocusChangeIS (IUnknown *punkObj, BOOL fSetFocus) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CDockSite::QueryStatus(const GUID *pguidCmdGroup, ULONG cCmds, OLECMD prgCmds[ ], OLECMDTEXT *pCmdText) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CDockSite::Exec(const GUID *pguidCmdGroup, DWORD nCmdID, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut) +{ + TCHAR textBuffer[40]; + REBARBANDINFOW bandInfo; + int index; + HRESULT hResult; + + if (IsEqualIID(*pguidCmdGroup, CGID_DeskBand)) + { + switch (nCmdID) + { + case DBID_BANDINFOCHANGED: + if (fInitialized == false) + return S_OK; + if (V_VT(pvaIn) != VT_I4) + return E_INVALIDARG; + if (V_I4(pvaIn) != fBandID) + return E_FAIL; + // deskband information changed + // call GetBandInfo and refresh information in rebar + memset(&bandInfo, 0, sizeof(bandInfo)); + bandInfo.cbSize = sizeof(bandInfo); + bandInfo.lpText = textBuffer; + bandInfo.cch = sizeof(textBuffer) / sizeof(TCHAR); + hResult = GetRBBandInfo(bandInfo); + if (FAILED(hResult)) + return hResult; + index = (int)SendMessage(fRebarWindow, RB_IDTOINDEX, fBandID, 0); + SendMessage(fRebarWindow, RB_SETBANDINFOW, index, (LPARAM)&bandInfo); + return S_OK; + } + } + return E_FAIL; +} + +HRESULT STDMETHODCALLTYPE CDockSite::QueryService(REFGUID guidService, REFIID riid, void **ppvObject) +{ + CComPtr serviceProvider; + HRESULT hResult; + + if (IsEqualIID(guidService, SID_SMenuBandParent)) + return this->QueryInterface(riid, ppvObject); + hResult = fToolbar->QueryInterface(IID_IServiceProvider, (void **)&serviceProvider); + if (FAILED (hResult)) + return hResult; + return serviceProvider->QueryService(guidService, riid, ppvObject); +} + +CMenuCallback::CMenuCallback() +{ +} + +CMenuCallback::~CMenuCallback() +{ +} + +HRESULT STDMETHODCALLTYPE CMenuCallback::GetObject(LPSMDATA psmd, REFIID riid, void **ppvObject) +{ + CComPtr parentMenu; + CComPtr newMenu; + CComPtr favoritesFolder; + LPITEMIDLIST favoritesPIDL; + HWND ownerWindow; + HMENU parentHMenu; + HMENU favoritesHMenu; + HKEY orderRegKey; + DWORD disposition; + HRESULT hResult; + + if (!IsEqualIID(riid, IID_IShellMenu)) + return E_FAIL; + if (psmd->uId != FCIDM_MENU_FAVORITES) + return E_FAIL; + if (fFavoritesMenu.p == NULL) + { + hResult = psmd->punk->QueryInterface(IID_IShellMenu, (void **)&parentMenu); + if (FAILED(hResult)) + return hResult; + hResult = parentMenu->GetMenu(&parentHMenu, &ownerWindow, NULL); + if (FAILED(hResult)) + return hResult; + favoritesHMenu = GetSubMenu(parentHMenu, 3); + if (favoritesHMenu == NULL) + return E_FAIL; + hResult = CoCreateInstance(CLSID_MenuBand, NULL, CLSCTX_INPROC_SERVER, IID_IShellMenu, (void **)&newMenu); + if (FAILED(hResult)) + return hResult; + hResult = newMenu->Initialize(this, FCIDM_MENU_FAVORITES, -1, SMINIT_VERTICAL | SMINIT_CACHED); + if (FAILED(hResult)) + return hResult; + hResult = newMenu->SetMenu(favoritesHMenu, ownerWindow, SMSET_TOP | SMSET_DONTOWN); + if (FAILED(hResult)) + return hResult; + hResult = SHGetSpecialFolderLocation(NULL, CSIDL_FAVORITES, &favoritesPIDL); + if (FAILED(hResult)) + return hResult; + hResult = SHBindToFolder(favoritesPIDL, &favoritesFolder); + if (FAILED(hResult)) + return hResult; + RegCreateKeyEx(HKEY_CURRENT_USER, _T("Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\MenuOrder\\Favorites"), + 0, NULL, 0, KEY_READ | KEY_WRITE, NULL, &orderRegKey, &disposition); + hResult = newMenu->SetShellFolder(favoritesFolder, favoritesPIDL, orderRegKey, SMSET_BOTTOM | 0x18); + ILFree(favoritesPIDL); + if (SUCCEEDED(hResult)) + fFavoritesMenu.Attach(newMenu.Detach()); + } + if (fFavoritesMenu.p == NULL) + return E_FAIL; + return fFavoritesMenu->QueryInterface(riid, ppvObject); +} + +HRESULT STDMETHODCALLTYPE CMenuCallback::CallbackSM(LPSMDATA psmd, UINT uMsg, WPARAM wParam, LPARAM lParam) +{ + switch (uMsg) + { + case SMC_INITMENU: + break; + case SMC_CREATE: + break; + case SMC_EXITMENU: + break; + case SMC_GETINFO: + { + SMINFO *infoPtr = (SMINFO *)lParam; + if ((infoPtr->dwMask & SMIM_FLAGS) != 0) + if (psmd->uId == FCIDM_MENU_FAVORITES) + infoPtr->dwFlags |= SMIF_DROPCASCADE; + else + infoPtr->dwFlags |= SMIF_TRACKPOPUP; + if ((infoPtr->dwMask & SMIM_ICON) != 0) + infoPtr->iIcon = -1; + } + return S_OK; + case SMC_GETSFINFO: + break; + case SMC_GETOBJECT: + return GetObject(psmd, *(IID *)wParam, (void **)lParam); + case SMC_GETSFOBJECT: + break; + case SMC_SFEXEC: + break; + case SMC_SFSELECTITEM: + break; + case 13: + // return tooltip + break; + case SMC_REFRESH: + break; + case SMC_DEMOTE: + break; + case SMC_PROMOTE: + break; + case 0x13: + break; + case SMC_DEFAULTICON: + break; + case SMC_NEWITEM: + break; + case SMC_CHEVRONEXPAND: + break; + case SMC_DISPLAYCHEVRONTIP: + break; + case SMC_SETSFOBJECT: + break; + case SMC_SHCHANGENOTIFY: + break; + case SMC_CHEVRONGETTIP: + break; + case SMC_SFDDRESTRICTED: + break; + case 0x35: + break; + case 49: + break; + case 0x10000000: + break; + } + return S_FALSE; +} + +CInternetToolbar::CInternetToolbar() +{ + fMainReBar = NULL; + fLocked = false; + fMenuBandWindow = NULL; + fNavigationWindow = NULL; + fMenuCallback.AddRef(); + fToolbarWindow = NULL; + fAdviseCookie = 0; +} + +CInternetToolbar::~CInternetToolbar() +{ + fMenuCallback.Release(); +} + +void CInternetToolbar::AddDockItem(IUnknown *newItem, int bandID, int flags) +{ + CDockSite *newSite; + + newSite = new CComObject; + newSite->AddRef(); + newSite->Initialize(newItem, this, fMainReBar, bandID, flags); +} + +HRESULT CInternetToolbar::ReserveBorderSpace() +{ + CComPtr dockingWindowSite; + RECT availableBorderSpace; + RECT neededBorderSpace; + HRESULT hResult; + + hResult = fSite->QueryInterface(IID_IDockingWindowSite, (void **)&dockingWindowSite); + if (FAILED(hResult)) + return hResult; + hResult = dockingWindowSite->GetBorderDW((IDockingWindow *)this, &availableBorderSpace); + if (FAILED(hResult)) + return hResult; + SendMessage(fMainReBar, RB_SIZETORECT, RBSTR_CHANGERECT, (LPARAM)&availableBorderSpace); + neededBorderSpace.left = 0; + neededBorderSpace.top = availableBorderSpace.bottom - availableBorderSpace.top; + if (fLocked == false) + neededBorderSpace.top += 3; + neededBorderSpace.right = 0; + neededBorderSpace.bottom = 0; + hResult = dockingWindowSite->SetBorderSpaceDW((IDockingWindow *)this, &neededBorderSpace); + if (FAILED(hResult)) + return hResult; + return S_OK; +} + +HRESULT CInternetToolbar::CreateMenuBar(IShellMenu **menuBar) +{ + CComPtr siteCommandTarget; + CComPtr oleWindow; + CComPtr commandTarget; + CComPtr callback; + VARIANT menuOut; + HWND ownerWindow; + HRESULT hResult; + + hResult = CoCreateInstance(CLSID_MenuBand, NULL, CLSCTX_INPROC_SERVER, IID_IShellMenu, (void **)menuBar); + if (FAILED(hResult)) + return hResult; + hResult = fMenuCallback.QueryInterface(IID_IShellMenuCallback, (void **)&callback); + if (FAILED(hResult)) + return hResult; + hResult = (*menuBar)->Initialize(callback, -1, ANCESTORDEFAULT, SMINIT_HORIZONTAL | SMINIT_TOPLEVEL); + if (FAILED(hResult)) + return hResult; + hResult = fSite->QueryInterface(IID_IOleWindow, (void **)&oleWindow); + if (FAILED(hResult)) + return hResult; + hResult = oleWindow->GetWindow(&ownerWindow); + if (FAILED(hResult)) + return hResult; + hResult = fSite->QueryInterface(IID_IOleCommandTarget, (void **)&siteCommandTarget); + if (FAILED(hResult)) + return hResult; + hResult = siteCommandTarget->Exec(&CGID_Explorer, 0x35, 0, NULL, &menuOut); + if (FAILED(hResult)) + return hResult; + if (V_VT(&menuOut) != VT_INT_PTR || V_INTREF(&menuOut) == NULL) + return E_FAIL; + hResult = (*menuBar)->SetMenu((HMENU)V_INTREF(&menuOut), ownerWindow, SMSET_DONTOWN); + if (FAILED(hResult)) + return hResult; + hResult = (*menuBar)->QueryInterface(IID_IOleCommandTarget, (void **)&commandTarget); + if (FAILED(hResult)) + return hResult; + hResult = commandTarget->Exec(&CGID_MenuBand, 3, 1, NULL, NULL); + if (FAILED(hResult)) + return hResult; + return S_OK; +} + +HRESULT CInternetToolbar::CreateBrandBand(IUnknown **logoBar) +{ + CComPtr tempBand; + HRESULT hResult; + +#if 1 + hResult = ::CreateBrandBand(IID_IUnknown, (void **)logoBar); +#else + hResult = CoCreateInstance(CLSID_BrandBand, NULL, CLSCTX_INPROC_SERVER, IID_IUnknown, (void **)logoBar); +#endif + if (FAILED(hResult)) + return hResult; + return S_OK; +} + +HRESULT CInternetToolbar::CreateToolsBar(IUnknown **toolsBar) +{ + HRESULT hResult; + + hResult = ::CreateToolsBar(IID_IUnknown, (void **)toolsBar); + if (FAILED(hResult)) + return hResult; + return S_OK; +} + +HRESULT CInternetToolbar::CreateAddressBand(IUnknown **toolsBar) +{ + CComPtr addressBand; + HRESULT hResult; + +#if 1 + hResult = ::CreateAddressBand(IID_IUnknown, (void **)toolsBar); +#else + hResult = CoCreateInstance(CLSID_SH_AddressBand, NULL, CLSCTX_INPROC_SERVER, IID_IUnknown, (void **)toolsBar); +#endif + if (FAILED(hResult)) + return hResult; + hResult = (*toolsBar)->QueryInterface(IID_IAddressBand, (void **)&addressBand); + return S_OK; +} + +HRESULT CInternetToolbar::LockUnlockToolbars(bool locked) +{ + REBARBANDINFOW rebarBandInfo; + int bandCount; + int x; + CDockSite *dockSite; + HRESULT hResult; + + if (locked != fLocked) + { + fLocked = locked; + rebarBandInfo.cbSize = sizeof(rebarBandInfo); + rebarBandInfo.fMask = RBBIM_STYLE | RBBIM_LPARAM; + bandCount = (int)SendMessage(fMainReBar, RB_GETBANDCOUNT, 0, 0); + for (x = 0; x < bandCount; x++) + { + SendMessage(fMainReBar, RB_GETBANDINFOW, x, (LPARAM)&rebarBandInfo); + dockSite = (CDockSite *)rebarBandInfo.lParam; + if (dockSite != NULL) + { + rebarBandInfo.fStyle &= ~(RBBS_NOGRIPPER | RBBS_GRIPPERALWAYS); + if (dockSite->fFlags & CDockSite::ITF_NOGRIPPER || fLocked == true) + rebarBandInfo.fStyle |= RBBS_NOGRIPPER; + if (dockSite->fFlags & CDockSite::ITF_GRIPPERALWAYS && fLocked == false) + rebarBandInfo.fStyle |= RBBS_GRIPPERALWAYS; + SendMessage(fMainReBar, RB_SETBANDINFOW, x, (LPARAM)&rebarBandInfo); + } + } + hResult = ReserveBorderSpace(); + } + return S_OK; +} + +HRESULT CInternetToolbar::CommandStateChanged(bool newValue, int commandID) +{ + HRESULT hResult; + + hResult = S_OK; + switch (commandID) + { + case -1: + // loop through buttons + // for buttons in CLSID_CommonButtons + // if up, QueryStatus for up state and update it + // + // for buttons in fCommandCategory, update with QueryStatus of fCommandTarget + break; + case 1: + // forward + hResult = SetState(&CLSID_CommonButtons, gForwardCommandID, newValue ? TBSTATE_ENABLED : 0); + break; + case 2: + // back + hResult = SetState(&CLSID_CommonButtons, gBackCommandID, newValue ? TBSTATE_ENABLED : 0); + break; + } + return hResult; +} + +HRESULT CInternetToolbar::CreateAndInitBandProxy() +{ + CComPtr serviceProvider; + HRESULT hResult; + + hResult = fSite->QueryInterface(IID_IServiceProvider, (void **)&serviceProvider); + if (FAILED (hResult)) + return hResult; + hResult = serviceProvider->QueryService(SID_IBandProxy, IID_IBandProxy, (void **)&fBandProxy); + if (FAILED (hResult)) + { + hResult = CreateBandProxy(IID_IBandProxy, (void **)&fBandProxy); + if (FAILED (hResult)) + return hResult; + hResult = fBandProxy->SetSite(fSite); + if (FAILED (hResult)) + return hResult; + } + return S_OK; +} + +HRESULT STDMETHODCALLTYPE CInternetToolbar::UIActivateIO(BOOL fActivate, LPMSG lpMsg) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CInternetToolbar::HasFocusIO() +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CInternetToolbar::TranslateAcceleratorIO(LPMSG lpMsg) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CInternetToolbar::GetWindow(HWND *lphwnd) +{ + if (lphwnd == NULL) + return E_POINTER; + *lphwnd = m_hWnd; + return S_OK; +} + +HRESULT STDMETHODCALLTYPE CInternetToolbar::ContextSensitiveHelp(BOOL fEnterMode) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CInternetToolbar::ShowDW(BOOL fShow) +{ + CComPtr dockingWindow; + HRESULT hResult; + + // show the bar here + hResult = ReserveBorderSpace(); + hResult = fMenuBar->QueryInterface(IID_IDockingWindow, (void **)&dockingWindow); + hResult = dockingWindow->ShowDW(fShow); + return S_OK; +} + +HRESULT STDMETHODCALLTYPE CInternetToolbar::CloseDW(DWORD dwReserved) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CInternetToolbar::ResizeBorderDW(LPCRECT prcBorder, IUnknown *punkToolbarSite, BOOL fReserved) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CInternetToolbar::GetClassID(CLSID *pClassID) +{ + if (pClassID == NULL) + return E_POINTER; + *pClassID = CLSID_InternetToolbar; + return S_OK; +} + +HRESULT STDMETHODCALLTYPE CInternetToolbar::IsDirty() +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CInternetToolbar::Load(IStream *pStm) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CInternetToolbar::Save(IStream *pStm, BOOL fClearDirty) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CInternetToolbar::GetSizeMax(ULARGE_INTEGER *pcbSize) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CInternetToolbar::InitNew() +{ + CComPtr menuBar; + CComPtr logoBar; + CComPtr toolsBar; + CComPtr navigationBar; + CComPtr menuOleWindow; + CComPtr toolbarOleWindow; + CComPtr navigationOleWindow; + HRESULT hResult; + + hResult = CreateMenuBar(&menuBar); + if (FAILED(hResult)) + return hResult; + AddDockItem(menuBar, ITBBID_MENUBAND, CDockSite::ITF_NOTITLE | CDockSite::ITF_NEWBANDALWAYS | CDockSite::ITF_GRIPPERALWAYS); + hResult = menuBar->QueryInterface(IID_IOleWindow, (void **)&menuOleWindow); + hResult = menuOleWindow->GetWindow(&fMenuBandWindow); + fMenuBar.Attach(menuBar.Detach()); // transfer the ref count + + hResult = CreateBrandBand(&logoBar); + if (FAILED(hResult)) + return hResult; + AddDockItem(logoBar, ITBBID_BRANDBAND, CDockSite::ITF_NOGRIPPER | CDockSite::ITF_NOTITLE | CDockSite::ITF_FIXEDSIZE); + fLogoBar.Attach(logoBar.Detach()); // transfer the ref count + + hResult = CreateToolsBar(&toolsBar); + if (FAILED(hResult)) + return hResult; + AddDockItem(toolsBar, ITBBID_TOOLSBAND, CDockSite::ITF_NOTITLE | CDockSite::ITF_NEWBANDALWAYS); + fControlsBar.Attach(toolsBar.Detach()); // transfer the ref count + hResult = fControlsBar->QueryInterface(IID_IOleWindow, (void **)&toolbarOleWindow); + if (FAILED(hResult)) + return hResult; + hResult = toolbarOleWindow->GetWindow(&fToolbarWindow); + if (FAILED(hResult)) + return hResult; + + hResult = CreateAddressBand(&navigationBar); + if (FAILED(hResult)) + return hResult; + AddDockItem(navigationBar, ITBBID_ADDRESSBAND, CDockSite::ITF_NEWBANDALWAYS); + hResult = navigationBar->QueryInterface(IID_IOleWindow, (void **)&navigationOleWindow); + hResult = navigationOleWindow->GetWindow(&fNavigationWindow); + fNavigationBar.Attach(navigationBar.Detach()); + + return S_OK; +} + +HRESULT STDMETHODCALLTYPE CInternetToolbar::QueryStatus(const GUID *pguidCmdGroup, ULONG cCmds, OLECMD prgCmds[ ], OLECMDTEXT *pCmdText) +{ + if (IsEqualIID(*pguidCmdGroup, CGID_PrivCITCommands)) + { + while (cCmds != 0) + { + switch (prgCmds->cmdID) + { + case ITID_TEXTLABELS: // Text Labels state + prgCmds->cmdf = OLECMDF_SUPPORTED; + break; + case ITID_TOOLBARBANDSHOWN: // toolbar visibility + prgCmds->cmdf = OLECMDF_SUPPORTED | OLECMDF_ENABLED; + break; + case ITID_ADDRESSBANDSHOWN: // address bar visibility + prgCmds->cmdf = OLECMDF_SUPPORTED | OLECMDF_ENABLED; + break; + case ITID_LINKSBANDSHOWN: // links bar visibility + prgCmds->cmdf = 0; + break; + case ITID_MENUBANDSHOWN: // Menubar band visibility + prgCmds->cmdf = 0; + break; + case ITID_AUTOHIDEENABLED: // Auto hide enabled/disabled + prgCmds->cmdf = 0; + break; + case ITID_CUSTOMIZEENABLED: // customize enabled + prgCmds->cmdf = OLECMDF_SUPPORTED | OLECMDF_ENABLED; + break; + case ITID_TOOLBARLOCKED: // lock toolbars + prgCmds->cmdf = OLECMDF_SUPPORTED | OLECMDF_ENABLED; + if (fLocked) + prgCmds->cmdf |= OLECMDF_LATCHED; + break; + default: + prgCmds->cmdf = 0; + break; + } + prgCmds++; + cCmds--; + } + return S_OK; + } + return E_FAIL; +} + +HRESULT STDMETHODCALLTYPE CInternetToolbar::Exec(const GUID *pguidCmdGroup, DWORD nCmdID, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut) +{ + if (IsEqualIID(*pguidCmdGroup, CGID_PrivCITCommands)) + { + switch (nCmdID) + { + case 1: + // what do I do here? + return S_OK; + case ITID_TEXTLABELS: + // toggle text labels + return S_OK; + case ITID_TOOLBARBANDSHOWN: + // toggle toolbar band visibility + return S_OK; + case ITID_ADDRESSBANDSHOWN: + // toggle address band visibility + return S_OK; + case ITID_LINKSBANDSHOWN: + // toggle links band visibility + return S_OK; + case ITID_CUSTOMIZEENABLED: + // run customize + return S_OK; + case ITID_TOOLBARLOCKED: + return LockUnlockToolbars(!fLocked); + } + } + return E_FAIL; +} + +HRESULT STDMETHODCALLTYPE CInternetToolbar::GetTypeInfoCount(UINT *pctinfo) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CInternetToolbar::GetTypeInfo(UINT iTInfo, LCID lcid, ITypeInfo **ppTInfo) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CInternetToolbar::GetIDsOfNames(REFIID riid, LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CInternetToolbar::Invoke(DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr) +{ + HRESULT hResult; + + switch(dispIdMember) + { + case DISPID_BEFORENAVIGATE: + hResult = S_OK; + break; + case DISPID_DOWNLOADCOMPLETE: + hResult = S_OK; + break; + case DISPID_COMMANDSTATECHANGE: + if (pDispParams->cArgs != 2) + return E_INVALIDARG; + if (V_VT(&pDispParams->rgvarg[0]) != VT_BOOL || V_VT(&pDispParams->rgvarg[1]) != VT_I4) + return E_INVALIDARG; + return CommandStateChanged(V_BOOL(&pDispParams->rgvarg[0]) == VARIANT_FALSE ? false : true, + V_I4(&pDispParams->rgvarg[1])); + case DISPID_DOWNLOADBEGIN: + hResult = S_OK; + break; + case DISPID_NAVIGATECOMPLETE2: + hResult = S_OK; + break; + case DISPID_DOCUMENTCOMPLETE: + hResult = S_OK; + break; + } + return S_OK; +} + +HRESULT STDMETHODCALLTYPE CInternetToolbar::SetCommandTarget(IUnknown *theTarget, GUID *category, long param14) +{ + HRESULT hResult; + + fCommandTarget.Release(); + hResult = theTarget->QueryInterface(IID_IOleCommandTarget, (void **)&fCommandTarget); + if (FAILED(hResult)) + return hResult; + fCommandCategory = *category; + return S_OK; +} + +HRESULT STDMETHODCALLTYPE CInternetToolbar::Unknown1() +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CInternetToolbar::AddButtons(const GUID *pguidCmdGroup, long buttonCount, TBBUTTON *buttons) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CInternetToolbar::AddString(const GUID *pguidCmdGroup, HINSTANCE param10, LPCTSTR param14, long *param18) +{ + long result; + + result = (long)::SendMessage(fToolbarWindow, TB_ADDSTRINGW, (WPARAM)param10, (LPARAM)param14); + *param18 = result; + if (result == -1) + return E_FAIL; + return S_OK; +} + +HRESULT STDMETHODCALLTYPE CInternetToolbar::GetButton(const GUID *pguidCmdGroup, long param10, long param14) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CInternetToolbar::GetState(const GUID *pguidCmdGroup, long commandID, long *theState) +{ + if (theState == NULL) + return E_POINTER; + // map the command id + *theState = (long)::SendMessage(fToolbarWindow, TB_GETSTATE, commandID, 0); + return S_OK; +} + +HRESULT STDMETHODCALLTYPE CInternetToolbar::SetState(const GUID *pguidCmdGroup, long commandID, long theState) +{ + // map the command id + ::SendMessage(fToolbarWindow, TB_SETSTATE, commandID, MAKELONG(theState, 0)); + return S_OK; +} + +HRESULT STDMETHODCALLTYPE CInternetToolbar::AddBitmap(const GUID *pguidCmdGroup, long param10, long buttonCount, TBADDBITMAP *lParam, long *newIndex, COLORREF param20) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CInternetToolbar::GetBitmapSize(long *paramC) +{ + if (paramC == NULL) + return E_POINTER; + *paramC = MAKELONG(24, 24); + return S_OK; +} + +HRESULT STDMETHODCALLTYPE CInternetToolbar::SendToolbarMsg(const GUID *pguidCmdGroup, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT *result) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CInternetToolbar::SetImageList(const GUID *pguidCmdGroup, HIMAGELIST param10, HIMAGELIST param14, HIMAGELIST param18) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CInternetToolbar::ModifyButton(const GUID *pguidCmdGroup, long param10, long param14) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CInternetToolbar::OnChange(LONG lEvent, LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CInternetToolbar::SetSite(IUnknown *pUnkSite) +{ + CComPtr browserService; + CComPtr serviceProvider; + CComPtr oleWindow; + HWND ownerWindow; + HWND dockContainer; + HRESULT hResult; + + if (pUnkSite == NULL) + { + hResult = AtlUnadvise(fSite, DIID_DWebBrowserEvents, fAdviseCookie); + ::DestroyWindow(fMainReBar); + DestroyWindow(); + fSite.Release(); + } + else + { + hResult = pUnkSite->QueryInterface(IID_IOleWindow, (void **)&oleWindow); + if (FAILED(hResult)) + return hResult; + hResult = oleWindow->GetWindow(&ownerWindow); + if (FAILED(hResult)) + return hResult; + if (ownerWindow == NULL) + return E_FAIL; + fSite = pUnkSite; + dockContainer = SHCreateWorkerWindowW(0, ownerWindow, 0, WS_VISIBLE | WS_CHILD | WS_CLIPSIBLINGS | WS_CLIPCHILDREN, NULL, 0); + if (dockContainer == NULL) + return E_FAIL; + SubclassWindow(dockContainer); + fMainReBar = CreateWindow(REBARCLASSNAMEW, _T(""), WS_VISIBLE | WS_CHILD | WS_CLIPSIBLINGS | WS_CLIPCHILDREN | RBS_VARHEIGHT | + RBS_BANDBORDERS | RBS_REGISTERDROP | RBS_AUTOSIZE | CCS_NODIVIDER | CCS_NOPARENTALIGN | CCS_TOP, + 0, 0, 700, 60, dockContainer, NULL, _AtlBaseModule.GetModuleInstance(), NULL); + if (fMainReBar == NULL) + return E_FAIL; + hResult = pUnkSite->QueryInterface(IID_IServiceProvider, (void **)&serviceProvider); + hResult = serviceProvider->QueryService(SID_SShellBrowser, IID_IBrowserService, (void **)&browserService); + hResult = AtlAdvise(browserService, (IDispatch *)this, DIID_DWebBrowserEvents, &fAdviseCookie); + } + return S_OK; +} + +HRESULT STDMETHODCALLTYPE CInternetToolbar::GetSite(REFIID riid, void **ppvSite) +{ + if (ppvSite == NULL) + return E_POINTER; + if (fSite.p != NULL) + return fSite->QueryInterface(riid, ppvSite); + *ppvSite = NULL; + return S_OK; +} + +HRESULT STDMETHODCALLTYPE CInternetToolbar::QueryService(REFGUID guidService, REFIID riid, void **ppvObject) +{ + CComPtr serviceProvider; + HRESULT hResult; + + if (IsEqualIID(guidService, IID_IBandSite)) + return this->QueryInterface(riid, ppvObject); + if (IsEqualIID(guidService, SID_IBandProxy)) + { + if (fBandProxy.p == NULL) + { + hResult = CreateAndInitBandProxy(); + if (FAILED (hResult)) + return hResult; + } + return fBandProxy->QueryInterface(riid, ppvObject); + } + hResult = fSite->QueryInterface(IID_IServiceProvider, (void **)&serviceProvider); + if (FAILED (hResult)) + return hResult; + return serviceProvider->QueryService(guidService, riid, ppvObject); +} + +HRESULT STDMETHODCALLTYPE CInternetToolbar::OnWinEvent(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT *theResult) +{ + CComPtr menuWinEventHandler; + HRESULT hResult; + + if (fMenuBar.p != NULL) + { + hResult = fMenuBar->QueryInterface(IID_IWinEventHandler, (void **)&menuWinEventHandler); + return menuWinEventHandler->OnWinEvent(fMenuBandWindow, uMsg, wParam, lParam, theResult); + } + return E_FAIL; +} + +HRESULT STDMETHODCALLTYPE CInternetToolbar::IsWindowOwner(HWND hWnd) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CInternetToolbar::AddBand(IUnknown *punk) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CInternetToolbar::EnumBands(UINT uBand, DWORD *pdwBandID) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CInternetToolbar::QueryBand(DWORD dwBandID, IDeskBand **ppstb, DWORD *pdwState, LPWSTR pszName, int cchName) +{ + if (ppstb == NULL) + return E_POINTER; + if (dwBandID == ITBBID_MENUBAND && fMenuBar.p != NULL) + return fMenuBar->QueryInterface(IID_IDeskBand, (void **)ppstb); + if (dwBandID == ITBBID_BRANDBAND && fLogoBar.p != NULL) + return fLogoBar->QueryInterface(IID_IDeskBand, (void **)ppstb); + *ppstb = NULL; + return E_FAIL; +} + +HRESULT STDMETHODCALLTYPE CInternetToolbar::SetBandState(DWORD dwBandID, DWORD dwMask, DWORD dwState) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CInternetToolbar::RemoveBand(DWORD dwBandID) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CInternetToolbar::GetBandObject(DWORD dwBandID, REFIID riid, void **ppv) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CInternetToolbar::SetBandSiteInfo(const BANDSITEINFO *pbsinfo) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CInternetToolbar::GetBandSiteInfo(BANDSITEINFO *pbsinfo) +{ + return E_NOTIMPL; +} + +LRESULT CInternetToolbar::OnTravelBack(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled) +{ + CComPtr serviceProvider; + CComPtr webBrowser; + HRESULT hResult; + + hResult = fSite->QueryInterface(IID_IServiceProvider, (void **)&serviceProvider); + if (FAILED (hResult)) + return 0; + hResult = serviceProvider->QueryService(SID_SShellBrowser, IID_IWebBrowser, (void **)&webBrowser); + if (FAILED (hResult)) + return 0; + hResult = webBrowser->GoBack(); + return 1; +} + +LRESULT CInternetToolbar::OnTravelForward(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled) +{ + CComPtr serviceProvider; + CComPtr webBrowser; + HRESULT hResult; + + hResult = fSite->QueryInterface(IID_IServiceProvider, (void **)&serviceProvider); + if (FAILED (hResult)) + return 0; + hResult = serviceProvider->QueryService(SID_SShellBrowser, IID_IWebBrowser, (void **)&webBrowser); + if (FAILED (hResult)) + return 0; + hResult = webBrowser->GoForward(); + return 1; +} + +LRESULT CInternetToolbar::OnUpLevel(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled) +{ + CComPtr oleCommandTarget; + HRESULT hResult; + + hResult = fSite->QueryInterface(IID_IOleCommandTarget, (void **)&oleCommandTarget); + if (FAILED (hResult)) + return hResult; + hResult = oleCommandTarget->Exec(&CGID_ShellBrowser, IDM_GOTO_UPONELEVEL, 0, NULL, NULL); + return 1; +} + +LRESULT CInternetToolbar::OnSearch(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled) +{ + CComPtr objectWithSite; + CComPtr contextMenu; + CMINVOKECOMMANDINFO commandInfo; + char *searchGUID = "{169A0691-8DF9-11d1-A1C4-00C04FD75D13}"; + HRESULT hResult; + + // TODO: Query shell if this command is enabled first + + memset(&commandInfo, 0, sizeof(commandInfo)); + commandInfo.cbSize = sizeof(commandInfo); + commandInfo.hwnd = m_hWnd; + commandInfo.lpParameters = searchGUID; + commandInfo.nShow = SW_SHOWNORMAL; + + hResult = CoCreateInstance(CLSID_ShellSearchExt, NULL, CLSCTX_INPROC_SERVER, IID_IContextMenu, (void **)&contextMenu); + if (FAILED (hResult)) + return 0; + hResult = contextMenu->QueryInterface(IID_IObjectWithSite, (void **)&objectWithSite); + if (FAILED (hResult)) + return 0; + hResult = objectWithSite->SetSite(fSite); + if (FAILED (hResult)) + return 0; + hResult = contextMenu->InvokeCommand(&commandInfo); + hResult = objectWithSite->SetSite(NULL); + return 0; +} + +LRESULT CInternetToolbar::OnFolders(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled) +{ + CComPtr oleCommandTarget; + HRESULT hResult; + + hResult = fSite->QueryInterface(IID_IOleCommandTarget, (void **)&oleCommandTarget); + if (FAILED (hResult)) + return hResult; + hResult = oleCommandTarget->Exec(&CGID_Explorer, 0x23, 0, NULL, NULL); + return 1; +} + +LRESULT CInternetToolbar::OnForwardToCommandTarget(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled) +{ + HRESULT hResult; + + if (fCommandTarget.p != NULL) + { + hResult = fCommandTarget->Exec(&fCommandCategory, wID, 0, NULL, NULL); + } + return 1; +} + +LRESULT CInternetToolbar::OnMenuDropDown(UINT idControl, NMHDR *pNMHDR, BOOL &bHandled) +{ + CComPtr serviceProvider; + CComPtr browserService; + CComPtr commandTarget; + CComPtr travelLog; + NMTOOLBARW *notifyInfo; + RECT bounds; + HMENU newMenu; + TPMPARAMS params; + int selectedItem; + VARIANT parmIn; + OLECMD commandInfo; + HRESULT hResult; + + notifyInfo = (NMTOOLBARW *)pNMHDR; + if (notifyInfo->hdr.hwndFrom != fToolbarWindow) + { + // not from the toolbar, keep looking for a message handler + bHandled = FALSE; + return 0; + } + SendMessage(fToolbarWindow, TB_GETRECT, notifyInfo->iItem, (LPARAM)&bounds); + ::MapWindowPoints(fToolbarWindow, NULL, (POINT *)&bounds, 2); + switch (notifyInfo->iItem) + { + case gBackCommandID: + newMenu = CreatePopupMenu(); + hResult = fSite->QueryInterface(IID_IServiceProvider, (void **)&serviceProvider); + hResult = serviceProvider->QueryService(SID_SShellBrowser, IID_IBrowserService, (void **)&browserService); + hResult = browserService->GetTravelLog(&travelLog); + hResult = travelLog->InsertMenuEntries(browserService, newMenu, 0, 1, 9, TLMENUF_BACK); + hResult = browserService->QueryInterface(IID_IOleCommandTarget, (void **)&commandTarget); + commandInfo.cmdID = 0x1d; + hResult = commandTarget->QueryStatus(&CGID_Explorer, 1, &commandInfo, NULL); + if ((commandInfo.cmdf & (OLECMDF_ENABLED | OLECMDF_LATCHED)) == OLECMDF_ENABLED && travelLog->CountEntries(browserService) > 1) + { + AppendMenu(newMenu, MF_SEPARATOR, -1, L""); + AppendMenu(newMenu, MF_STRING /* | MF_OWNERDRAW */, IDM_EXPLORERBAR_HISTORY, L"&History\tCtrl+H"); + } + params.cbSize = sizeof (params); + params.rcExclude = bounds; + selectedItem = TrackPopupMenuEx(newMenu, TPM_LEFTALIGN | TPM_TOPALIGN | TPM_RETURNCMD, + bounds.left, bounds.bottom, m_hWnd, ¶ms); + if (selectedItem == IDM_EXPLORERBAR_HISTORY) + { + V_VT(&parmIn) = VT_I4; + V_I4(&parmIn) = 1; + Exec(&CGID_Explorer, 0x1d, 2, &parmIn, NULL); + } + else if (selectedItem != 0) + hResult = travelLog->Travel(browserService, -selectedItem); + DestroyMenu(newMenu); + break; + case gForwardCommandID: + newMenu = CreatePopupMenu(); + hResult = fSite->QueryInterface(IID_IServiceProvider, (void **)&serviceProvider); + hResult = serviceProvider->QueryService(SID_SShellBrowser, IID_IBrowserService, (void **)&browserService); + hResult = browserService->GetTravelLog(&travelLog); + hResult = travelLog->InsertMenuEntries(browserService, newMenu, 0, 1, 9, TLMENUF_FORE); + hResult = browserService->QueryInterface(IID_IOleCommandTarget, (void **)&commandTarget); + commandInfo.cmdID = 0x1d; + hResult = commandTarget->QueryStatus(&CGID_Explorer, 1, &commandInfo, NULL); + if ((commandInfo.cmdf & (OLECMDF_ENABLED | OLECMDF_LATCHED)) == OLECMDF_ENABLED && travelLog->CountEntries(browserService) > 1) + { + AppendMenu(newMenu, MF_SEPARATOR, -1, L""); + AppendMenu(newMenu, MF_STRING /* | MF_OWNERDRAW */, IDM_EXPLORERBAR_HISTORY, L"&History\tCtrl+H"); + } + params.cbSize = sizeof (params); + params.rcExclude = bounds; + selectedItem = TrackPopupMenuEx(newMenu, TPM_LEFTALIGN | TPM_TOPALIGN | TPM_RETURNCMD, + bounds.left, bounds.bottom, m_hWnd, ¶ms); + if (selectedItem == IDM_EXPLORERBAR_HISTORY) + { + V_VT(&parmIn) = VT_I4; + V_I4(&parmIn) = 1; + Exec(&CGID_Explorer, 0x1d, 2, &parmIn, NULL); + } + else if (selectedItem != 0) + hResult = travelLog->Travel(browserService, -selectedItem); + DestroyMenu(newMenu); + break; + case gViewsCommandID: + VARIANT inValue; + CComVariant outValue; + HRESULT hResult; + + V_VT(&inValue) = VT_INT_PTR; + V_INTREF(&inValue) = (INT *)&bounds; + + if (fCommandTarget.p != NULL) + hResult = fCommandTarget->Exec(&fCommandCategory, 0x7031, 1, &inValue, &outValue); + // pvaOut is VT_I4 with value 0x403 + break; + } + return TBDDRET_DEFAULT; +} + +LRESULT CInternetToolbar::OnQueryInsert(UINT idControl, NMHDR *pNMHDR, BOOL &bHandled) +{ + return 1; +} + +LRESULT CInternetToolbar::OnQueryDelete(UINT idControl, NMHDR *pNMHDR, BOOL &bHandled) +{ + return 1; +} + +LRESULT CInternetToolbar::OnNavigateCommand(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled) +{ + CComPtr winEventHandler; + LRESULT theResult; + HRESULT hResult; + + hResult = fNavigationBar->QueryInterface(IID_IWinEventHandler, (void **)&winEventHandler); + hResult = winEventHandler->OnWinEvent(m_hWnd, uMsg, wParam, lParam, &theResult); + if (SUCCEEDED(hResult)) + return theResult; + bHandled = FALSE; + return 0; +} + +LRESULT CInternetToolbar::OnContextMenu(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled) +{ + HMENU contextMenuBar; + HMENU contextMenu; + POINT clickLocation; + int command; + RBHITTESTINFO hitTestInfo; + REBARBANDINFOW rebarBandInfo; + int bandID; + + clickLocation.x = LOWORD(lParam); + clickLocation.y = HIWORD(lParam); + hitTestInfo.pt = clickLocation; + ScreenToClient(&hitTestInfo.pt); + SendMessage(fMainReBar, RB_HITTEST, 0, (LPARAM)&hitTestInfo); + if (hitTestInfo.iBand == -1) + return 0; + rebarBandInfo.cbSize = sizeof(rebarBandInfo); + rebarBandInfo.fMask = RBBIM_ID; + SendMessage(fMainReBar, RB_GETBANDINFOW, hitTestInfo.iBand, (LPARAM)&rebarBandInfo); + bandID = rebarBandInfo.wID; + contextMenuBar = LoadMenu(_AtlBaseModule.GetResourceInstance(), MAKEINTRESOURCE(IDM_CABINET_CONTEXTMENU)); + contextMenu = GetSubMenu(contextMenuBar, 0); + switch (bandID) + { + case ITBBID_MENUBAND: // menu band + DeleteMenu(contextMenu, IDM_TOOLBARS_CUSTOMIZE, MF_BYCOMMAND); + DeleteMenu(contextMenu, IDM_TOOLBARS_TEXTLABELS, MF_BYCOMMAND); + DeleteMenu(contextMenu, IDM_TOOLBARS_GOBUTTON, MF_BYCOMMAND); + break; + case ITBBID_BRANDBAND: // brand band + DeleteMenu(contextMenu, IDM_TOOLBARS_CUSTOMIZE, MF_BYCOMMAND); + DeleteMenu(contextMenu, IDM_TOOLBARS_TEXTLABELS, MF_BYCOMMAND); + DeleteMenu(contextMenu, IDM_TOOLBARS_GOBUTTON, MF_BYCOMMAND); + break; + case ITBBID_TOOLSBAND: // tools band + DeleteMenu(contextMenu, IDM_TOOLBARS_TEXTLABELS, MF_BYCOMMAND); + DeleteMenu(contextMenu, IDM_TOOLBARS_GOBUTTON, MF_BYCOMMAND); + break; + case ITBBID_ADDRESSBAND: // navigation band + DeleteMenu(contextMenu, IDM_TOOLBARS_CUSTOMIZE, MF_BYCOMMAND); + DeleteMenu(contextMenu, IDM_TOOLBARS_TEXTLABELS, MF_BYCOMMAND); + break; + default: + break; + } + // TODO: use GetSystemMetrics(SM_MENUDROPALIGNMENT) to determine menu alignment + command = TrackPopupMenu(contextMenu, TPM_LEFTALIGN | TPM_TOPALIGN | TPM_RIGHTBUTTON | TPM_RETURNCMD, + clickLocation.x, clickLocation.y, 0, m_hWnd, NULL); + switch (command) + { + case IDM_TOOLBARS_STANDARDBUTTONS: // standard buttons + break; + case IDM_TOOLBARS_ADDRESSBAR: // address bar + break; + case IDM_TOOLBARS_LINKSBAR: // links + break; + case IDM_TOOLBARS_LOCKTOOLBARS: // lock the toolbars + LockUnlockToolbars(!fLocked); + break; + case IDM_TOOLBARS_CUSTOMIZE: // customize + SendMessage(fToolbarWindow, TB_CUSTOMIZE, 0, 0); + break; + } + return 1; +} + +LRESULT CInternetToolbar::OnSize(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled) +{ + if (wParam != SIZE_MINIMIZED) + { + ::SetWindowPos(fMainReBar, NULL, 0, 0, LOWORD(lParam), HIWORD(lParam), SWP_NOOWNERZORDER | SWP_NOZORDER | SWP_NOMOVE); + } + return 1; +} + +LRESULT CInternetToolbar::OnSetCursor(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled) +{ + if ((short)lParam != HTCLIENT || (HWND)wParam != m_hWnd) + { + bHandled = FALSE; + return 0; + } + SetCursor(LoadCursor(NULL, IDC_SIZENS)); + return 1; +} + +LRESULT CInternetToolbar::OnTipText(UINT idControl, NMHDR *pNMHDR, BOOL &bHandled) +{ + CComPtr browserService; + CComPtr travelLog; + TOOLTIPTEXTW *pTTTW; + UINT nID; + wchar_t tempString[300]; + HRESULT hResult; + + pTTTW = (TOOLTIPTEXTW *)pNMHDR; + if ((pTTTW->uFlags & TTF_IDISHWND) != 0) + nID = ::GetDlgCtrlID((HWND)pNMHDR->idFrom); + else + nID = (UINT)pNMHDR->idFrom; + + if (nID != 0) + { + if (nID == (UINT)gBackCommandID || nID == (UINT)gForwardCommandID) + { + // TODO: Should this call QueryService? + hResult = fSite->QueryInterface(IID_IBrowserService, (void **)&browserService); + hResult = browserService->GetTravelLog(&travelLog); + hResult = travelLog->GetToolTipText(browserService, nID == (UINT)gBackCommandID ? TLOG_BACK : TLOG_FORE, + 0, tempString, 299); + if (FAILED(hResult)) + { + bHandled = FALSE; + return 0; + } + } + else + tempString[0] = 0; + wcsncpy (pTTTW->szText, tempString, sizeof (pTTTW->szText) / sizeof (wchar_t)); + ::SetWindowPos (pNMHDR->hwndFrom, HWND_TOP, 0, 0, 0, 0, SWP_NOOWNERZORDER | SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOSIZE); + return 0; + } + return 0; +} + +LRESULT CInternetToolbar::OnNotify(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled) +{ + NMHDR *notifyHeader; + CComPtr menuWinEventHandler; + LRESULT theResult; + HRESULT hResult; + + notifyHeader = (NMHDR *)lParam; + if (fMenuBar.p != NULL && notifyHeader->hwndFrom == fMenuBandWindow) + { + hResult = fMenuBar->QueryInterface(IID_IWinEventHandler, (void **)&menuWinEventHandler); + hResult = menuWinEventHandler->OnWinEvent(fMenuBandWindow, uMsg, wParam, lParam, &theResult); + return theResult; + } + if (fNavigationBar.p != NULL && notifyHeader->hwndFrom == fNavigationWindow) + { + hResult = fNavigationBar->QueryInterface(IID_IWinEventHandler, (void **)&menuWinEventHandler); + hResult = menuWinEventHandler->OnWinEvent(m_hWnd, uMsg, wParam, lParam, &theResult); + return theResult; + } + return 0; +} + +HRESULT CreateInternetToolbar(REFIID riid, void **ppv) +{ + CComObject *theToolbar; + HRESULT hResult; + + if (ppv == NULL) + return E_POINTER; + *ppv = NULL; + ATLTRY (theToolbar = new CComObject); + if (theToolbar == NULL) + return E_OUTOFMEMORY; + hResult = theToolbar->QueryInterface (riid, (void **)ppv); + if (FAILED (hResult)) + { + delete theToolbar; + return hResult; + } + return S_OK; +} diff --git a/reactos/dll/win32/browseui/internettoolbar.h b/reactos/dll/win32/browseui/internettoolbar.h new file mode 100644 index 00000000000..28b43830271 --- /dev/null +++ b/reactos/dll/win32/browseui/internettoolbar.h @@ -0,0 +1,243 @@ +/* + * ReactOS Explorer + * + * Copyright 2009 Andrew Hill + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#ifndef _internettoolbar_h +#define _internettoolbar_h + +static const int gBackCommandID = 0xa121; +static const int gForwardCommandID = 0xa122; +static const int gUpLevelCommandID = 0xa022; +static const int gSearchCommandID = 1003; +static const int gFoldersCommandID = 1004; +static const int gMoveToCommandID = 0x701f; +static const int gCopyToCommandID = 0x701e; +static const int gDeleteCommandID = 0x7011; +static const int gUndoCommandID = 0x701b; +static const int gViewsCommandID = 0x7031; +static const int gStopCommandID = 1010; +static const int gRefreshCommandID = 0xa220; +static const int gHomeCommandID = 1012; +static const int gMapDriveCommandID = 41089; +static const int gDisconnectCommandID = 41090; +static const int gFavoritesCommandID = 1015; +static const int gHistoryCommandID = 1016; +static const int gFullScreenCommandID = 1017; +static const int gPropertiesCommandID = 0x7013; +static const int gCutCommandID = 0x7018; +static const int gCopyCommandID = 0x7019; +static const int gPasteCommandID = 0x701a; +static const int gFolderOptionsCommandID = 41251; + +class CMenuCallback : + public CComObjectRootEx, + public IShellMenuCallback +{ +private: + CComPtr fFavoritesMenu; +public: + CMenuCallback(); + ~CMenuCallback(); + + HRESULT STDMETHODCALLTYPE GetObject(LPSMDATA psmd, REFIID riid, void **ppvObject); +public: + // *** IShellMenuCallback methods *** + virtual HRESULT STDMETHODCALLTYPE CallbackSM(LPSMDATA psmd, UINT uMsg, WPARAM wParam, LPARAM lParam); + +BEGIN_COM_MAP(CMenuCallback) + COM_INTERFACE_ENTRY_IID(IID_IShellMenuCallback, IShellMenuCallback) +END_COM_MAP() +}; + +class CInternetToolbar : + public CWindowImpl, + public CComCoClass, + public CComObjectRootEx, + public IInputObject, + public IDockingWindow, + public IPersistStreamInit, + public IOleCommandTarget, + public IDispatch, + public IExplorerToolbar, + public IShellChangeNotify, + public IObjectWithSite, + public IServiceProvider, + public IWinEventHandler, + public IBandSite +{ +public: + CComPtr fSite; // our site + HWND fMainReBar; // rebar for top of window + bool fLocked; // is bar locked to prevent changes? + CComPtr fMenuBar; // the menu rebar + HWND fMenuBandWindow; + HWND fNavigationWindow; + CComPtr fLogoBar; // the reactos logo + CComPtr fControlsBar; // navigation controls + CComPtr fNavigationBar; // address bar + CComObject fMenuCallback; + CComPtr fCommandTarget; + GUID fCommandCategory; + HWND fToolbarWindow; + DWORD fAdviseCookie; + CComPtr fBandProxy; +public: + CInternetToolbar(); + ~CInternetToolbar(); + void AddDockItem(IUnknown *newItem, int bandID, int flags); + HRESULT ReserveBorderSpace(); + HRESULT CreateMenuBar(IShellMenu **menuBar); + HRESULT CreateBrandBand(IUnknown **logoBar); + HRESULT CreateToolsBar(IUnknown **toolsBar); + HRESULT CreateAddressBand(IUnknown **toolsBar); + HRESULT LockUnlockToolbars(bool locked); + HRESULT CommandStateChanged(bool newValue, int commandID); + HRESULT CreateAndInitBandProxy(); +public: + // *** IInputObject specific methods *** + virtual HRESULT STDMETHODCALLTYPE UIActivateIO(BOOL fActivate, LPMSG lpMsg); + virtual HRESULT STDMETHODCALLTYPE HasFocusIO(); + virtual HRESULT STDMETHODCALLTYPE TranslateAcceleratorIO(LPMSG lpMsg); + + // *** IOleWindow methods *** + virtual HRESULT STDMETHODCALLTYPE GetWindow(HWND *lphwnd); + virtual HRESULT STDMETHODCALLTYPE ContextSensitiveHelp(BOOL fEnterMode); + + // *** IDockingWindow methods *** + virtual HRESULT STDMETHODCALLTYPE ShowDW(BOOL fShow); + virtual HRESULT STDMETHODCALLTYPE CloseDW(DWORD dwReserved); + virtual HRESULT STDMETHODCALLTYPE ResizeBorderDW(LPCRECT prcBorder, IUnknown *punkToolbarSite, BOOL fReserved); + + // *** IPersist methods *** + virtual HRESULT STDMETHODCALLTYPE GetClassID(CLSID *pClassID); + + // *** IPersistStreamInit methods *** + virtual HRESULT STDMETHODCALLTYPE IsDirty(); + virtual HRESULT STDMETHODCALLTYPE Load(IStream *pStm); + virtual HRESULT STDMETHODCALLTYPE Save(IStream *pStm, BOOL fClearDirty); + virtual HRESULT STDMETHODCALLTYPE GetSizeMax(ULARGE_INTEGER *pcbSize); + virtual HRESULT STDMETHODCALLTYPE InitNew(); + + // *** IOleCommandTarget methods *** + virtual HRESULT STDMETHODCALLTYPE QueryStatus(const GUID *pguidCmdGroup, ULONG cCmds, OLECMD prgCmds[ ], OLECMDTEXT *pCmdText); + virtual HRESULT STDMETHODCALLTYPE Exec(const GUID *pguidCmdGroup, DWORD nCmdID, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut); + + // *** IDispatch methods *** + virtual HRESULT STDMETHODCALLTYPE GetTypeInfoCount(UINT *pctinfo); + virtual HRESULT STDMETHODCALLTYPE GetTypeInfo(UINT iTInfo, LCID lcid, ITypeInfo **ppTInfo); + virtual HRESULT STDMETHODCALLTYPE GetIDsOfNames(REFIID riid, LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId); + virtual HRESULT STDMETHODCALLTYPE Invoke(DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr); + + // *** IExplorerToolbar methods *** + virtual HRESULT STDMETHODCALLTYPE SetCommandTarget(IUnknown *theTarget, GUID *category, long param14); + virtual HRESULT STDMETHODCALLTYPE Unknown1(); + virtual HRESULT STDMETHODCALLTYPE AddButtons(const GUID *pguidCmdGroup, long buttonCount, TBBUTTON *buttons); + virtual HRESULT STDMETHODCALLTYPE AddString(const GUID *pguidCmdGroup, HINSTANCE param10, LPCTSTR param14, long *param18); + virtual HRESULT STDMETHODCALLTYPE GetButton(const GUID *pguidCmdGroup, long param10, long param14); + virtual HRESULT STDMETHODCALLTYPE GetState(const GUID *pguidCmdGroup, long commandID, long *theState); + virtual HRESULT STDMETHODCALLTYPE SetState(const GUID *pguidCmdGroup, long commandID, long theState); + virtual HRESULT STDMETHODCALLTYPE AddBitmap(const GUID *pguidCmdGroup, long param10, long buttonCount, TBADDBITMAP *lParam, long *newIndex, COLORREF param20); + virtual HRESULT STDMETHODCALLTYPE GetBitmapSize(long *paramC); + virtual HRESULT STDMETHODCALLTYPE SendToolbarMsg(const GUID *pguidCmdGroup, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT *result); + virtual HRESULT STDMETHODCALLTYPE SetImageList(const GUID *pguidCmdGroup, HIMAGELIST param10, HIMAGELIST param14, HIMAGELIST param18); + virtual HRESULT STDMETHODCALLTYPE ModifyButton(const GUID *pguidCmdGroup, long param10, long param14); + + // *** IShellChangeNotify methods *** + virtual HRESULT STDMETHODCALLTYPE OnChange(LONG lEvent, LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2); + + // *** IObjectWithSite methods *** + virtual HRESULT STDMETHODCALLTYPE SetSite(IUnknown *pUnkSite); + virtual HRESULT STDMETHODCALLTYPE GetSite(REFIID riid, void **ppvSite); + + // *** IServiceProvider methods *** + virtual HRESULT STDMETHODCALLTYPE QueryService(REFGUID guidService, REFIID riid, void **ppvObject); + + // *** IWinEventHandler methods *** + virtual HRESULT STDMETHODCALLTYPE OnWinEvent(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT *theResult); + virtual HRESULT STDMETHODCALLTYPE IsWindowOwner(HWND hWnd); + + // *** IBandSite specific methods *** + virtual HRESULT STDMETHODCALLTYPE AddBand(IUnknown *punk); + virtual HRESULT STDMETHODCALLTYPE EnumBands(UINT uBand, DWORD *pdwBandID); + virtual HRESULT STDMETHODCALLTYPE QueryBand(DWORD dwBandID, IDeskBand **ppstb, DWORD *pdwState, LPWSTR pszName, int cchName); + virtual HRESULT STDMETHODCALLTYPE SetBandState(DWORD dwBandID, DWORD dwMask, DWORD dwState); + virtual HRESULT STDMETHODCALLTYPE RemoveBand(DWORD dwBandID); + virtual HRESULT STDMETHODCALLTYPE GetBandObject(DWORD dwBandID, REFIID riid, void **ppv); + virtual HRESULT STDMETHODCALLTYPE SetBandSiteInfo(const BANDSITEINFO *pbsinfo); + virtual HRESULT STDMETHODCALLTYPE GetBandSiteInfo(BANDSITEINFO *pbsinfo); + + // message handlers + LRESULT OnTravelBack(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled); + LRESULT OnTravelForward(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled); + LRESULT OnUpLevel(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled); + LRESULT OnSearch(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled); + LRESULT OnFolders(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled); + LRESULT OnForwardToCommandTarget(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled); + LRESULT OnMenuDropDown(UINT idControl, NMHDR *pNMHDR, BOOL &bHandled); + LRESULT OnQueryInsert(UINT idControl, NMHDR *pNMHDR, BOOL &bHandled); + LRESULT OnQueryDelete(UINT idControl, NMHDR *pNMHDR, BOOL &bHandled); + LRESULT OnNavigateCommand(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled); + LRESULT OnContextMenu(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled); + LRESULT OnSize(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled); + LRESULT OnSetCursor(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled); + LRESULT OnTipText(UINT idControl, NMHDR *pNMHDR, BOOL &bHandled); + LRESULT OnNotify(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled); + +BEGIN_MSG_MAP(CInternetToolbar) + COMMAND_ID_HANDLER(gBackCommandID, OnTravelBack) + COMMAND_ID_HANDLER(gForwardCommandID, OnTravelForward) + COMMAND_ID_HANDLER(gUpLevelCommandID, OnUpLevel) + COMMAND_ID_HANDLER(gSearchCommandID, OnSearch) + COMMAND_ID_HANDLER(gFoldersCommandID, OnFolders) + COMMAND_RANGE_HANDLER(0x7000, 0x7fff, OnForwardToCommandTarget) + NOTIFY_HANDLER(0, TBN_DROPDOWN, OnMenuDropDown) + NOTIFY_HANDLER(0, TBN_QUERYINSERT, OnQueryInsert) + NOTIFY_HANDLER(0, TBN_QUERYDELETE, OnQueryDelete) + MESSAGE_HANDLER(WM_COMMAND, OnNavigateCommand) + MESSAGE_HANDLER(WM_CONTEXTMENU, OnContextMenu) + MESSAGE_HANDLER(WM_SIZE, OnSize) + MESSAGE_HANDLER(WM_SETCURSOR, OnSetCursor) + NOTIFY_CODE_HANDLER(TTN_NEEDTEXTW, OnTipText) + MESSAGE_HANDLER(WM_NOTIFY, OnNotify) +END_MSG_MAP() + +DECLARE_REGISTRY_RESOURCEID(IDR_INTERNETTOOLBAR) +DECLARE_NOT_AGGREGATABLE(CInternetToolbar) + +DECLARE_PROTECT_FINAL_CONSTRUCT() + +BEGIN_COM_MAP(CInternetToolbar) + COM_INTERFACE_ENTRY_IID(IID_IInputObject, IInputObject) + COM_INTERFACE_ENTRY_IID(IID_IOleWindow, IOleWindow) + COM_INTERFACE_ENTRY_IID(IID_IDockingWindow, IDockingWindow) + COM_INTERFACE_ENTRY_IID(IID_IPersist, IPersist) +// COM_INTERFACE_ENTRY_IID(IID_IPersistStream, IPersistStream) + COM_INTERFACE_ENTRY_IID(IID_IPersistStreamInit, IPersistStreamInit) + COM_INTERFACE_ENTRY_IID(IID_IOleCommandTarget, IOleCommandTarget) + COM_INTERFACE_ENTRY_IID(IID_IDispatch, IDispatch) + COM_INTERFACE_ENTRY_IID(IID_IExplorerToolbar, IExplorerToolbar) + COM_INTERFACE_ENTRY_IID(IID_IShellChangeNotify, IShellChangeNotify) + COM_INTERFACE_ENTRY_IID(IID_IObjectWithSite, IObjectWithSite) + COM_INTERFACE_ENTRY_IID(IID_IServiceProvider, IServiceProvider) + COM_INTERFACE_ENTRY_IID(IID_IWinEventHandler, IWinEventHandler) + COM_INTERFACE_ENTRY_IID(IID_IBandSite, IBandSite) +END_COM_MAP() +}; + +#endif // _internettoolbar_h diff --git a/reactos/dll/win32/browseui/lang/en-US.rc b/reactos/dll/win32/browseui/lang/en-US.rc new file mode 100644 index 00000000000..03696ad3656 --- /dev/null +++ b/reactos/dll/win32/browseui/lang/en-US.rc @@ -0,0 +1,273 @@ +/* + * Copyright 2009 Andrew Hill + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US + +///////////////////////////////////////////////////////////////////////////// +// +// Menus +// + +IDM_CABINET_CONTEXTMENU MENUEX +BEGIN + POPUP "", 264,MFT_STRING,MFS_ENABLED + BEGIN + MENUITEM "&Standard Buttons", IDM_TOOLBARS_STANDARDBUTTONS,MFT_STRING,MFS_ENABLED + MENUITEM "&Address Bar", IDM_TOOLBARS_ADDRESSBAR,MFT_STRING,MFS_ENABLED + MENUITEM "&Links", IDM_TOOLBARS_LINKSBAR,MFT_STRING,MFS_ENABLED + MENUITEM SEPARATOR + MENUITEM "Lock the Tool&bars", IDM_TOOLBARS_LOCKTOOLBARS,MFT_STRING,MFS_ENABLED + MENUITEM "&Customize...", IDM_TOOLBARS_CUSTOMIZE,MFT_STRING,MFS_ENABLED + MENUITEM "&Text Labels", IDM_TOOLBARS_TEXTLABELS,MFT_STRING,MFS_ENABLED + MENUITEM "&Go Button", IDM_TOOLBARS_GOBUTTON,MFT_STRING,MFS_ENABLED + END +END + +IDM_CABINET_MAINMENU MENUEX +BEGIN + POPUP "&File", FCIDM_MENU_FILE + BEGIN + MENUITEM "", -1, MFT_SEPARATOR + MENUITEM "&Close", IDM_FILE_CLOSE + END + POPUP "&Edit", FCIDM_MENU_EDIT + BEGIN + MENUITEM "", -1, MFT_SEPARATOR + END + POPUP "&View", FCIDM_MENU_VIEW + BEGIN + POPUP "&Toolbars", IDM_VIEW_TOOLBARS + BEGIN + MENUITEM "", -1, MFT_SEPARATOR + END + MENUITEM "Status &Bar", IDM_VIEW_STATUSBAR + POPUP "&Explorer Bar", IDM_VIEW_EXPLORERBAR + BEGIN + MENUITEM "&Search\tCtrl+E", IDM_EXPLORERBAR_SEARCH + MENUITEM "&Favorites\tCtrl+I", IDM_EXPLORERBAR_FAVORITES + MENUITEM "&Media", IDM_EXPLORERBAR_MEDIA + MENUITEM "&History\tCtrl+H", IDM_EXPLORERBAR_HISTORY + MENUITEM "F&olders", IDM_EXPLORERBAR_FOLDERS + MENUITEM "", IDM_EXPLORERBAR_SEPARATOR + END + MENUITEM "", FCIDM_MENU_VIEW_SEP_OPTIONS, MFT_SEPARATOR + POPUP "G&o To", FCIDM_MENU_EXPLORE + BEGIN + MENUITEM "&Back\tAlt+Left Arrow", IDM_GOTO_BACK + MENUITEM "&Forward\tAlt+Right Arrow", IDM_GOTO_FORWARD + MENUITEM "&Up One Level", IDM_GOTO_UPONELEVEL + MENUITEM "", -1, MFT_SEPARATOR + MENUITEM "&Home Page\tAlt+Home", IDM_GOTO_HOMEPAGE + END + MENUITEM "&Refresh", IDM_VIEW_REFRESH + END + POPUP "F&avorites", FCIDM_MENU_FAVORITES + BEGIN + MENUITEM "&Add to Favorites...", IDM_FAVORITES_ADDTOFAVORITES + MENUITEM "&Organize Favorites...", IDM_FAVORITES_ORGANIZEFAVORITES + MENUITEM "", -1, MFT_SEPARATOR + MENUITEM "(Empty)", IDM_FAVORITES_EMPTY + END + POPUP "&Tools", FCIDM_MENU_TOOLS + BEGIN + MENUITEM "Map &Network Drive...", IDM_TOOLS_MAPNETWORKDRIVE + MENUITEM "&Disconnect Network Drive...", IDM_TOOLS_DISCONNECTNETWORKDRIVE + MENUITEM "&Synchronize...", IDM_TOOLS_SYNCHRONIZE + MENUITEM "", -1, MFT_SEPARATOR + MENUITEM "Folder &Options...", IDM_TOOLS_FOLDEROPTIONS + END + POPUP "&Help", FCIDM_MENU_HELP + BEGIN + MENUITEM "Is this copy of ReactOS &legal?", IDM_HELP_ISTHISCOPYLEGAL + MENUITEM "&About ReactOS", IDM_HELP_ABOUT + END +END + + +///////////////////////////////////////////////////////////////////////////// +// +// Dialogs +// + +IDD_CUSTOMIZETOOLBAREX DIALOGEX 0, 0, 357, 33 +STYLE DS_SETFONT | DS_3DLOOK | DS_FIXEDSYS | DS_CONTROL | WS_CHILD | WS_VISIBLE | WS_CAPTION +FONT 8, "MS Shell Dlg", 0, 0, 0x1 +BEGIN + LTEXT "Te&xt options:",-1,4,2,48,15 + COMBOBOX IDC_TEXTOPTIONS,52,0,123,57,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + LTEXT "Ico&n options:",-1,4,20,48,15 + COMBOBOX IDC_ICONOPTIONS,52,18,123,57,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP +END + + +///////////////////////////////////////////////////////////////////////////// +// +// Accelerator +// + +IDR_ACCELERATORS ACCELERATORS +BEGIN + VK_F5, IDM_VIEW_REFRESH, VIRTKEY, NOINVERT + VK_F5, IDM_VIEW_REFRESH, VIRTKEY, CONTROL, NOINVERT + "R", IDM_VIEW_REFRESH, VIRTKEY, CONTROL, NOINVERT + VK_HOME, IDM_GOTO_HOMEPAGE, VIRTKEY, ALT, NOINVERT + "D", IDM_FAVORITES_ADDTOFAVORITES, VIRTKEY, CONTROL, NOINVERT + "B", IDM_FAVORITES_ORGANIZEFAVORITES, VIRTKEY, CONTROL, NOINVERT + VK_LEFT, IDM_GOTO_BACK, VIRTKEY, ALT + VK_RIGHT, IDM_GOTO_FORWARD, VIRTKEY, ALT + "W", IDM_FILE_CLOSE, VIRTKEY, CONTROL, NOINVERT + "E", IDM_EXPLORERBAR_SEARCH, VIRTKEY, CONTROL, NOINVERT + "I", IDM_EXPLORERBAR_FAVORITES, VIRTKEY, CONTROL, NOINVERT + "H", IDM_EXPLORERBAR_HISTORY, VIRTKEY, CONTROL, NOINVERT +END + + +///////////////////////////////////////////////////////////////////////////// +// +// Strings +// + +STRINGTABLE +BEGIN + 800 "Contains commands for manipulating the selected items." +END + +STRINGTABLE +BEGIN + 864 "Contains edit commands." +END + +STRINGTABLE +BEGIN + 928 "Contains commands for manipulating the view." +END + +STRINGTABLE +BEGIN + 992 "Contains tools commands." +END + +STRINGTABLE +BEGIN + 1056 "Contains commands for displaying Help." +END + +STRINGTABLE +BEGIN + 9025 "Closes the window." + 9026 "Goes up one level." +END + +STRINGTABLE +BEGIN + 9121 "Connects to a network drive." + 9122 "Disconnects from a network drive." +END + +STRINGTABLE +BEGIN + 9250 "Displays program information, version number, and copyright." + 9252 "Displays information for debugging." +END + +STRINGTABLE +BEGIN + 9281 "Goes to the previous page." + 9282 "Goes to the next page." + 9283 "Enables you to change settings." + 9285 "Goes to your home page." +END + +STRINGTABLE +BEGIN + 9362 "Opens the Favorites folder." + 9363 "Adds the current page to your Favorites list." +END + +STRINGTABLE +BEGIN + 9505 "Shows or hides toolbars." + 9506 "Shows or hides the status bar." + 9508 "Displays the Standard Buttons toolbar." + 9509 "Displays the Address bar." + 9510 "Displays the Quick Links bar." + 9516 "Locks the sizes and positions of the toolbars." +END + +STRINGTABLE +BEGIN + 9533 "Customizes the toolbar." +END + +STRINGTABLE +BEGIN + 9552 "Shows or hides an Explorer bar." + 9553 "Shows the Search bar." + 9554 "Shows the Favorites bar." + 9555 "Shows the History bar." + 9557 "Shows the Folders bar." + 9559 "Shows the Media Bar." +END + +STRINGTABLE +BEGIN + IDS_SMALLICONS "Small icons" + IDS_LARGEICONS "Large icons" + IDS_SHOWTEXTLABELS "Show text labels" +END + +STRINGTABLE +BEGIN + IDS_NOTEXTLABELS "No text labels" + IDS_SELECTIVETEXTONRIGHT "Selective text on right" +END + +STRINGTABLE +BEGIN + IDS_GOBUTTONLABEL "|Go||" + IDS_GOBUTTONTIPTEMPLATE "Go to ""%s""" +END + +STRINGTABLE +BEGIN + IDS_SEARCHLABEL "Search" + IDS_ADDRESSBANDLABEL "A&ddress" +END + +STRINGTABLE +BEGIN + IDS_FOLDERSLABEL "Folders" +END + +STRINGTABLE +BEGIN + IDS_HISTORYTEXT "&History\tCtrl+H" +END + +STRINGTABLE +BEGIN + IDS_UP "Up" +END + +STRINGTABLE +BEGIN + IDS_BACK "Back" + IDS_FORWARD "Forward" +END + + diff --git a/reactos/dll/win32/browseui/newatlinterfaces.h b/reactos/dll/win32/browseui/newatlinterfaces.h new file mode 100644 index 00000000000..1cf33dcc53f --- /dev/null +++ b/reactos/dll/win32/browseui/newatlinterfaces.h @@ -0,0 +1,90 @@ +/* + * ReactOS Explorer + * + * Copyright 2009 Andrew Hill + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#ifndef _newatlinteraces_h +#define _newatlinteraces_h + +template +class IProfferServiceImpl : public IProfferService +{ +public: + STDMETHODIMP ProfferService(REFGUID rguidService, IServiceProvider *psp, DWORD *pdwCookie) + { + return E_NOTIMPL; + } + + STDMETHODIMP RevokeService(DWORD dwCookie) + { + return E_NOTIMPL; + } + + HRESULT QueryService(REFGUID guidService, REFIID riid, void **ppvObject) + { + return E_FAIL; + } +}; + +/* +This subclass corrects a problem with the ATL IConnectionPointImpl. +IConnectionPointImpl queries for the exact interface that is published, but at least one +implementor of IConnectionPoint (CShellBrowser) advertises DIID_DWebBrowserEvents, +but fires events to IDispatch. +*/ +template +class MyIConnectionPointImpl : public IConnectionPointImpl +{ +public: + STDMETHODIMP Advise(IUnknown *pUnkSink, DWORD *pdwCookie) + { + IConnectionPointImpl *pThisCPImpl; + T *pThis; + IUnknown *adviseSink; + DWORD newCookie; + HRESULT hResult; + + pThis = static_cast(this); + pThisCPImpl = static_cast *>(this); + if (pdwCookie != NULL) + *pdwCookie = 0; + if (pUnkSink == NULL || pdwCookie == NULL) + return E_POINTER; + hResult = pUnkSink->QueryInterface(IID_IDispatch, (void **)&adviseSink); + if (FAILED(hResult)) + { + if (hResult == E_NOINTERFACE) + return CONNECT_E_CANNOTCONNECT; + return hResult; + } + pThis->Lock(); + newCookie = pThisCPImpl->m_vec.Add(adviseSink); + pThis->Unlock(); + *pdwCookie = newCookie; + if (newCookie != 0) + hResult = S_OK; + else + { + adviseSink->Release(); + hResult = CONNECT_E_ADVISELIMIT; + } + return hResult; + } +}; + +#endif // _newatlinteraces_h diff --git a/reactos/dll/win32/browseui/regsvr.c b/reactos/dll/win32/browseui/regsvr.c deleted file mode 100644 index 076cdb85a8a..00000000000 --- a/reactos/dll/win32/browseui/regsvr.c +++ /dev/null @@ -1,505 +0,0 @@ -/* - * self-registerable dll functions for browseui.dll - * - * Copyright (C) 2004 Stefan Leichter - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA - */ - -#include -#include - -#include "windef.h" -#include "winbase.h" -#include "winuser.h" -#include "wingdi.h" -#include "winreg.h" -#include "winerror.h" - -#include "ole2.h" -#include "shlguid.h" -#include "shobjidl.h" /* for IShellFolder used in undoc.h */ -#include "undoc.h" /* for CLSID_RebarBandSite */ - -#include "wine/debug.h" - -WINE_DEFAULT_DEBUG_CHANNEL(browseui); - -/* - * Near the bottom of this file are the exported DllRegisterServer and - * DllUnregisterServer, which make all this worthwhile. - */ - -/*********************************************************************** - * interface for self-registering - */ -struct regsvr_interface -{ - IID const *iid; /* NULL for end of list */ - LPCSTR name; /* can be NULL to omit */ - IID const *base_iid; /* can be NULL to omit */ - int num_methods; /* can be <0 to omit */ - CLSID const *ps_clsid; /* can be NULL to omit */ - CLSID const *ps_clsid32; /* can be NULL to omit */ -}; - -static HRESULT register_interfaces(struct regsvr_interface const *list); -static HRESULT unregister_interfaces(struct regsvr_interface const *list); - -struct regsvr_coclass -{ - CLSID const *clsid; /* NULL for end of list */ - LPCSTR name; /* can be NULL to omit */ - LPCSTR ips; /* can be NULL to omit */ - LPCSTR ips32; /* can be NULL to omit */ - LPCSTR ips32_tmodel; /* can be NULL to omit */ - LPCSTR progid; /* can be NULL to omit */ - LPCSTR viprogid; /* can be NULL to omit */ - LPCSTR progid_extra; /* can be NULL to omit */ -}; - -static HRESULT register_coclasses(struct regsvr_coclass const *list); -static HRESULT unregister_coclasses(struct regsvr_coclass const *list); - -/*********************************************************************** - * static string constants - */ -static WCHAR const interface_keyname[10] = { - 'I', 'n', 't', 'e', 'r', 'f', 'a', 'c', 'e', 0 }; -static WCHAR const base_ifa_keyname[14] = { - 'B', 'a', 's', 'e', 'I', 'n', 't', 'e', 'r', 'f', 'a', 'c', - 'e', 0 }; -static WCHAR const num_methods_keyname[11] = { - 'N', 'u', 'm', 'M', 'e', 't', 'h', 'o', 'd', 's', 0 }; -static WCHAR const ps_clsid_keyname[15] = { - 'P', 'r', 'o', 'x', 'y', 'S', 't', 'u', 'b', 'C', 'l', 's', - 'i', 'd', 0 }; -static WCHAR const ps_clsid32_keyname[17] = { - 'P', 'r', 'o', 'x', 'y', 'S', 't', 'u', 'b', 'C', 'l', 's', - 'i', 'd', '3', '2', 0 }; -static WCHAR const clsid_keyname[6] = { - 'C', 'L', 'S', 'I', 'D', 0 }; -static WCHAR const curver_keyname[7] = { - 'C', 'u', 'r', 'V', 'e', 'r', 0 }; -static WCHAR const ips_keyname[13] = { - 'I', 'n', 'P', 'r', 'o', 'c', 'S', 'e', 'r', 'v', 'e', 'r', - 0 }; -static WCHAR const ips32_keyname[15] = { - 'I', 'n', 'P', 'r', 'o', 'c', 'S', 'e', 'r', 'v', 'e', 'r', - '3', '2', 0 }; -static WCHAR const progid_keyname[7] = { - 'P', 'r', 'o', 'g', 'I', 'D', 0 }; -static WCHAR const viprogid_keyname[25] = { - 'V', 'e', 'r', 's', 'i', 'o', 'n', 'I', 'n', 'd', 'e', 'p', - 'e', 'n', 'd', 'e', 'n', 't', 'P', 'r', 'o', 'g', 'I', 'D', - 0 }; -static char const tmodel_valuename[] = "ThreadingModel"; - -/*********************************************************************** - * static helper functions - */ -static LONG register_key_guid(HKEY base, WCHAR const *name, GUID const *guid); -static LONG register_key_defvalueW(HKEY base, WCHAR const *name, - WCHAR const *value); -static LONG register_key_defvalueA(HKEY base, WCHAR const *name, - char const *value); -static LONG register_progid(WCHAR const *clsid, - char const *progid, char const *curver_progid, - char const *name, char const *extra); - -/*********************************************************************** - * register_interfaces - */ -static HRESULT register_interfaces(struct regsvr_interface const *list) -{ - LONG res = ERROR_SUCCESS; - HKEY interface_key; - - res = RegCreateKeyExW(HKEY_CLASSES_ROOT, interface_keyname, 0, NULL, 0, - KEY_READ | KEY_WRITE, NULL, &interface_key, NULL); - if (res != ERROR_SUCCESS) goto error_return; - - for (; res == ERROR_SUCCESS && list->iid; ++list) { - WCHAR buf[39]; - HKEY iid_key; - - StringFromGUID2(list->iid, buf, 39); - res = RegCreateKeyExW(interface_key, buf, 0, NULL, 0, - KEY_READ | KEY_WRITE, NULL, &iid_key, NULL); - if (res != ERROR_SUCCESS) goto error_close_interface_key; - - if (list->name) { - res = RegSetValueExA(iid_key, NULL, 0, REG_SZ, - (CONST BYTE*)(list->name), - strlen(list->name) + 1); - if (res != ERROR_SUCCESS) goto error_close_iid_key; - } - - if (list->base_iid) { - res = register_key_guid(iid_key, base_ifa_keyname, list->base_iid); - if (res != ERROR_SUCCESS) goto error_close_iid_key; - } - - if (0 <= list->num_methods) { - static WCHAR const fmt[3] = { '%', 'd', 0 }; - HKEY key; - - res = RegCreateKeyExW(iid_key, num_methods_keyname, 0, NULL, 0, - KEY_READ | KEY_WRITE, NULL, &key, NULL); - if (res != ERROR_SUCCESS) goto error_close_iid_key; - - wsprintfW(buf, fmt, list->num_methods); - res = RegSetValueExW(key, NULL, 0, REG_SZ, - (CONST BYTE*)buf, - (lstrlenW(buf) + 1) * sizeof(WCHAR)); - RegCloseKey(key); - - if (res != ERROR_SUCCESS) goto error_close_iid_key; - } - - if (list->ps_clsid) { - res = register_key_guid(iid_key, ps_clsid_keyname, list->ps_clsid); - if (res != ERROR_SUCCESS) goto error_close_iid_key; - } - - if (list->ps_clsid32) { - res = register_key_guid(iid_key, ps_clsid32_keyname, list->ps_clsid32); - if (res != ERROR_SUCCESS) goto error_close_iid_key; - } - - error_close_iid_key: - RegCloseKey(iid_key); - } - -error_close_interface_key: - RegCloseKey(interface_key); -error_return: - return res != ERROR_SUCCESS ? HRESULT_FROM_WIN32(res) : S_OK; -} - -/*********************************************************************** - * unregister_interfaces - */ -static HRESULT unregister_interfaces(struct regsvr_interface const *list) -{ - LONG res = ERROR_SUCCESS; - HKEY interface_key; - - res = RegOpenKeyExW(HKEY_CLASSES_ROOT, interface_keyname, 0, - KEY_READ | KEY_WRITE, &interface_key); - if (res == ERROR_FILE_NOT_FOUND) return S_OK; - if (res != ERROR_SUCCESS) goto error_return; - - for (; res == ERROR_SUCCESS && list->iid; ++list) { - WCHAR buf[39]; - - StringFromGUID2(list->iid, buf, 39); - res = RegDeleteTreeW(interface_key, buf); - if (res == ERROR_FILE_NOT_FOUND) res = ERROR_SUCCESS; - } - - RegCloseKey(interface_key); -error_return: - return res != ERROR_SUCCESS ? HRESULT_FROM_WIN32(res) : S_OK; -} - -/*********************************************************************** - * register_coclasses - */ -static HRESULT register_coclasses(struct regsvr_coclass const *list) -{ - LONG res = ERROR_SUCCESS; - HKEY coclass_key; - - res = RegCreateKeyExW(HKEY_CLASSES_ROOT, clsid_keyname, 0, NULL, 0, - KEY_READ | KEY_WRITE, NULL, &coclass_key, NULL); - if (res != ERROR_SUCCESS) goto error_return; - - for (; res == ERROR_SUCCESS && list->clsid; ++list) { - WCHAR buf[39]; - HKEY clsid_key; - - StringFromGUID2(list->clsid, buf, 39); - res = RegCreateKeyExW(coclass_key, buf, 0, NULL, 0, - KEY_READ | KEY_WRITE, NULL, &clsid_key, NULL); - if (res != ERROR_SUCCESS) goto error_close_coclass_key; - - if (list->name) { - res = RegSetValueExA(clsid_key, NULL, 0, REG_SZ, - (CONST BYTE*)(list->name), - strlen(list->name) + 1); - if (res != ERROR_SUCCESS) goto error_close_clsid_key; - } - - if (list->ips) { - res = register_key_defvalueA(clsid_key, ips_keyname, list->ips); - if (res != ERROR_SUCCESS) goto error_close_clsid_key; - } - - if (list->ips32) { - HKEY ips32_key; - - res = RegCreateKeyExW(clsid_key, ips32_keyname, 0, NULL, 0, - KEY_READ | KEY_WRITE, NULL, - &ips32_key, NULL); - if (res != ERROR_SUCCESS) goto error_close_clsid_key; - - res = RegSetValueExA(ips32_key, NULL, 0, REG_SZ, - (CONST BYTE*)list->ips32, - lstrlenA(list->ips32) + 1); - if (res == ERROR_SUCCESS && list->ips32_tmodel) - res = RegSetValueExA(ips32_key, tmodel_valuename, 0, REG_SZ, - (CONST BYTE*)list->ips32_tmodel, - strlen(list->ips32_tmodel) + 1); - RegCloseKey(ips32_key); - if (res != ERROR_SUCCESS) goto error_close_clsid_key; - } - - if (list->progid) { - res = register_key_defvalueA(clsid_key, progid_keyname, - list->progid); - if (res != ERROR_SUCCESS) goto error_close_clsid_key; - - res = register_progid(buf, list->progid, NULL, - list->name, list->progid_extra); - if (res != ERROR_SUCCESS) goto error_close_clsid_key; - } - - if (list->viprogid) { - res = register_key_defvalueA(clsid_key, viprogid_keyname, - list->viprogid); - if (res != ERROR_SUCCESS) goto error_close_clsid_key; - - res = register_progid(buf, list->viprogid, list->progid, - list->name, list->progid_extra); - if (res != ERROR_SUCCESS) goto error_close_clsid_key; - } - - error_close_clsid_key: - RegCloseKey(clsid_key); - } - -error_close_coclass_key: - RegCloseKey(coclass_key); -error_return: - return res != ERROR_SUCCESS ? HRESULT_FROM_WIN32(res) : S_OK; -} - -/*********************************************************************** - * unregister_coclasses - */ -static HRESULT unregister_coclasses(struct regsvr_coclass const *list) -{ - LONG res = ERROR_SUCCESS; - HKEY coclass_key; - - res = RegOpenKeyExW(HKEY_CLASSES_ROOT, clsid_keyname, 0, - KEY_READ | KEY_WRITE, &coclass_key); - if (res == ERROR_FILE_NOT_FOUND) return S_OK; - if (res != ERROR_SUCCESS) goto error_return; - - for (; res == ERROR_SUCCESS && list->clsid; ++list) { - WCHAR buf[39]; - - StringFromGUID2(list->clsid, buf, 39); - res = RegDeleteTreeW(coclass_key, buf); - if (res == ERROR_FILE_NOT_FOUND) res = ERROR_SUCCESS; - if (res != ERROR_SUCCESS) goto error_close_coclass_key; - - if (list->progid) { - res = RegDeleteTreeA(HKEY_CLASSES_ROOT, list->progid); - if (res == ERROR_FILE_NOT_FOUND) res = ERROR_SUCCESS; - if (res != ERROR_SUCCESS) goto error_close_coclass_key; - } - - if (list->viprogid) { - res = RegDeleteTreeA(HKEY_CLASSES_ROOT, list->viprogid); - if (res == ERROR_FILE_NOT_FOUND) res = ERROR_SUCCESS; - if (res != ERROR_SUCCESS) goto error_close_coclass_key; - } - } - -error_close_coclass_key: - RegCloseKey(coclass_key); -error_return: - return res != ERROR_SUCCESS ? HRESULT_FROM_WIN32(res) : S_OK; -} - -/*********************************************************************** - * regsvr_key_guid - */ -static LONG register_key_guid(HKEY base, WCHAR const *name, GUID const *guid) -{ - WCHAR buf[39]; - - StringFromGUID2(guid, buf, 39); - return register_key_defvalueW(base, name, buf); -} - -/*********************************************************************** - * regsvr_key_defvalueW - */ -static LONG register_key_defvalueW( - HKEY base, - WCHAR const *name, - WCHAR const *value) -{ - LONG res; - HKEY key; - - res = RegCreateKeyExW(base, name, 0, NULL, 0, - KEY_READ | KEY_WRITE, NULL, &key, NULL); - if (res != ERROR_SUCCESS) return res; - res = RegSetValueExW(key, NULL, 0, REG_SZ, (CONST BYTE*)value, - (lstrlenW(value) + 1) * sizeof(WCHAR)); - RegCloseKey(key); - return res; -} - -/*********************************************************************** - * regsvr_key_defvalueA - */ -static LONG register_key_defvalueA( - HKEY base, - WCHAR const *name, - char const *value) -{ - LONG res; - HKEY key; - - res = RegCreateKeyExW(base, name, 0, NULL, 0, - KEY_READ | KEY_WRITE, NULL, &key, NULL); - if (res != ERROR_SUCCESS) return res; - res = RegSetValueExA(key, NULL, 0, REG_SZ, (CONST BYTE*)value, - lstrlenA(value) + 1); - RegCloseKey(key); - return res; -} - -/*********************************************************************** - * regsvr_progid - */ -static LONG register_progid( - WCHAR const *clsid, - char const *progid, - char const *curver_progid, - char const *name, - char const *extra) -{ - LONG res; - HKEY progid_key; - - res = RegCreateKeyExA(HKEY_CLASSES_ROOT, progid, 0, - NULL, 0, KEY_READ | KEY_WRITE, NULL, - &progid_key, NULL); - if (res != ERROR_SUCCESS) return res; - - if (name) { - res = RegSetValueExA(progid_key, NULL, 0, REG_SZ, - (CONST BYTE*)name, strlen(name) + 1); - if (res != ERROR_SUCCESS) goto error_close_progid_key; - } - - if (clsid) { - res = register_key_defvalueW(progid_key, clsid_keyname, clsid); - if (res != ERROR_SUCCESS) goto error_close_progid_key; - } - - if (curver_progid) { - res = register_key_defvalueA(progid_key, curver_keyname, - curver_progid); - if (res != ERROR_SUCCESS) goto error_close_progid_key; - } - - if (extra) { - HKEY extra_key; - - res = RegCreateKeyExA(progid_key, extra, 0, - NULL, 0, KEY_READ | KEY_WRITE, NULL, - &extra_key, NULL); - if (res == ERROR_SUCCESS) - RegCloseKey(extra_key); - } - -error_close_progid_key: - RegCloseKey(progid_key); - return res; -} - -/*********************************************************************** - * coclass list - */ -static struct regsvr_coclass const coclass_list[] = { - { - &CLSID_ACLMulti, - "Multiple AutoComplete List Container", - NULL, - "browseui.dll", - "Apartment" - }, - { - &CLSID_RebarBandSite, - "Shell Rebar Band Site", - NULL, - "browseui.dll", - "Apartment" - }, - { - &CLSID_IShellBandSiteMenu, - "Band Site Menu", - NULL, - "browseui.dll", - "Apartment" - }, - { NULL } /* list terminator */ -}; - -/*********************************************************************** - * interface list - */ - -static struct regsvr_interface const interface_list[] = { - { NULL } /* list terminator */ -}; - -/*********************************************************************** - * DllRegisterServer (HHCTRL.@) - */ -HRESULT WINAPI DllRegisterServer(void) -{ - HRESULT hr; - - TRACE("\n"); - - hr = register_coclasses(coclass_list); - if (SUCCEEDED(hr)) - hr = register_interfaces(interface_list); - return hr; -} - -/*********************************************************************** - * DllUnregisterServer (HHCTRL.@) - */ -HRESULT WINAPI DllUnregisterServer(void) -{ - HRESULT hr; - - TRACE("\n"); - - hr = unregister_coclasses(coclass_list); - if (SUCCEEDED(hr)) - hr = unregister_interfaces(interface_list); - return hr; -} diff --git a/reactos/dll/win32/browseui/regtreeoptions.cpp b/reactos/dll/win32/browseui/regtreeoptions.cpp new file mode 100644 index 00000000000..11009327f73 --- /dev/null +++ b/reactos/dll/win32/browseui/regtreeoptions.cpp @@ -0,0 +1,71 @@ +/* + * ReactOS Explorer + * + * Copyright 2009 Andrew Hill + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "resource.h" +#include "regtreeoptions.h" + +CRegTreeOptions::CRegTreeOptions() +{ +} + +CRegTreeOptions::~CRegTreeOptions() +{ +} + +HRESULT STDMETHODCALLTYPE CRegTreeOptions::InitTree(HWND paramC, HKEY param10, char const *param14, char const *param18) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CRegTreeOptions::WalkTree(WALK_TREE_CMD paramC) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CRegTreeOptions::ToggleItem(HTREEITEM paramC) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CRegTreeOptions::ShowHelp(HTREEITEM paramC, unsigned long param10) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CRegTreeOptions::SetSite(IUnknown *pUnkSite) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CRegTreeOptions::GetSite(REFIID riid, void **ppvSite) +{ + return E_NOTIMPL; +} diff --git a/reactos/dll/win32/browseui/regtreeoptions.h b/reactos/dll/win32/browseui/regtreeoptions.h new file mode 100644 index 00000000000..9df8ad6e05b --- /dev/null +++ b/reactos/dll/win32/browseui/regtreeoptions.h @@ -0,0 +1,56 @@ +/* + * ReactOS Explorer + * + * Copyright 2009 Andrew Hill + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#ifndef _regtreeoptions_h +#define _regtreeoptions_h + +class CRegTreeOptions : + public CComCoClass, + public CComObjectRootEx, + public IRegTreeOptions, + public IObjectWithSite +{ +private: +public: + CRegTreeOptions(); + ~CRegTreeOptions(); + + // *** IRegTreeOptions methods *** + virtual HRESULT STDMETHODCALLTYPE InitTree(HWND paramC, HKEY param10, char const *param14, char const *param18); + virtual HRESULT STDMETHODCALLTYPE WalkTree(WALK_TREE_CMD paramC); + virtual HRESULT STDMETHODCALLTYPE ToggleItem(HTREEITEM paramC); + virtual HRESULT STDMETHODCALLTYPE ShowHelp(HTREEITEM paramC, unsigned long param10); + + // *** IObjectWithSite methods *** + virtual HRESULT STDMETHODCALLTYPE SetSite(IUnknown *pUnkSite); + virtual HRESULT STDMETHODCALLTYPE GetSite(REFIID riid, void **ppvSite); + +DECLARE_REGISTRY_RESOURCEID(IDR_REGTREEOPTIONS) +DECLARE_NOT_AGGREGATABLE(CRegTreeOptions) + +DECLARE_PROTECT_FINAL_CONSTRUCT() + +BEGIN_COM_MAP(CRegTreeOptions) + COM_INTERFACE_ENTRY_IID(IID_IRegTreeOptions, IRegTreeOptions) + COM_INTERFACE_ENTRY_IID(IID_IObjectWithSite, IObjectWithSite) +END_COM_MAP() +}; + +#endif // _regtreeoptions_h diff --git a/reactos/dll/win32/browseui/res/addressband.rgs b/reactos/dll/win32/browseui/res/addressband.rgs new file mode 100644 index 00000000000..1f206150a68 --- /dev/null +++ b/reactos/dll/win32/browseui/res/addressband.rgs @@ -0,0 +1,18 @@ +HKCR +{ + NoRemove CLSID + { + val MenuTextPUI = s '@browseui.dll,-13137' + ForceRemove {01E04581-4EEE-11d0-BFE9-00AA005B4383} = s '&Address' + { + InprocServer32 = s '%MODULE%' + { + val ThreadingModel = s 'Apartment' + } + 'Implemented Categories' + { + {00021492-0000-0000-C000-000000000046} + } + } + } +} diff --git a/reactos/dll/win32/browseui/res/addresseditbox.rgs b/reactos/dll/win32/browseui/res/addresseditbox.rgs new file mode 100644 index 00000000000..fe137af02dc --- /dev/null +++ b/reactos/dll/win32/browseui/res/addresseditbox.rgs @@ -0,0 +1,13 @@ +HKCR +{ + NoRemove CLSID + { + ForceRemove {A08C11D2-A228-11d0-825B-00AA005B4383} = s 'Address EditBox' + { + InprocServer32 = s '%MODULE%' + { + val ThreadingModel = s 'Apartment' + } + } + } +} diff --git a/reactos/dll/win32/browseui/res/autocompletecontainer.rgs b/reactos/dll/win32/browseui/res/autocompletecontainer.rgs new file mode 100644 index 00000000000..0357116962f --- /dev/null +++ b/reactos/dll/win32/browseui/res/autocompletecontainer.rgs @@ -0,0 +1,13 @@ +HKCR +{ + NoRemove CLSID + { + ForceRemove {00BB2765-6A77-11D0-A535-00C04FD7D062} = s 'ReactOS Multiple AutoComplete List Container' + { + InprocServer32 = s '%MODULE%' + { + val ThreadingModel = s 'Apartment' + } + } + } +} diff --git a/reactos/dll/win32/browseui/res/bandproxy.rgs b/reactos/dll/win32/browseui/res/bandproxy.rgs new file mode 100644 index 00000000000..d9a0c775561 --- /dev/null +++ b/reactos/dll/win32/browseui/res/bandproxy.rgs @@ -0,0 +1,13 @@ +HKCR +{ + NoRemove CLSID + { + ForceRemove {F61FFEC1-754F-11d0-80CA-00AA005B4383} = s 'BandProxy' + { + InprocServer32 = s '%MODULE%' + { + val ThreadingModel = s 'Apartment' + } + } + } +} diff --git a/reactos/dll/win32/browseui/res/bandsitemenu.rgs b/reactos/dll/win32/browseui/res/bandsitemenu.rgs new file mode 100644 index 00000000000..49a3e820bcc --- /dev/null +++ b/reactos/dll/win32/browseui/res/bandsitemenu.rgs @@ -0,0 +1,13 @@ +HKCR +{ + NoRemove CLSID + { + ForceRemove {ECD4FC4E-521C-11D0-B792-00A0C90312E1} = s 'Shell Band Site Menu' + { + InprocServer32 = s '%MODULE%' + { + val ThreadingModel = s 'Apartment' + } + } + } +} diff --git a/reactos/dll/win32/browseui/res/brandband.rgs b/reactos/dll/win32/browseui/res/brandband.rgs new file mode 100644 index 00000000000..2ba1e39977a --- /dev/null +++ b/reactos/dll/win32/browseui/res/brandband.rgs @@ -0,0 +1,13 @@ +HKCR +{ + NoRemove CLSID + { + ForceRemove {22BF0C20-6DA7-11D0-B373-00A0C9034938} = s 'Download Status' + { + InprocServer32 = s '%MODULE%' + { + val ThreadingModel = s 'Apartment' + } + } + } +} diff --git a/reactos/dll/win32/browseui/res/commonbrowser.rgs b/reactos/dll/win32/browseui/res/commonbrowser.rgs new file mode 100644 index 00000000000..d2d9702cfb2 --- /dev/null +++ b/reactos/dll/win32/browseui/res/commonbrowser.rgs @@ -0,0 +1,13 @@ +HKCR +{ + NoRemove CLSID + { + ForceRemove {AF604EFE-8897-11D1-B944-00A0C90312E1} = s 'ReactOS Common Browser Architecture' + { + InprocServer32 = s '%MODULE%' + { + val ThreadingModel = s 'Apartment' + } + } + } +} diff --git a/reactos/dll/win32/browseui/res/globalfoldersettings.rgs b/reactos/dll/win32/browseui/res/globalfoldersettings.rgs new file mode 100644 index 00000000000..3188ab7b933 --- /dev/null +++ b/reactos/dll/win32/browseui/res/globalfoldersettings.rgs @@ -0,0 +1,13 @@ +HKCR +{ + NoRemove CLSID + { + ForceRemove {EF8AD2D1-AE36-11D1-B2D2-006097DF8C11} = s 'Global Folder Settings' + { + InprocServer32 = s '%MODULE%' + { + val ThreadingModel = s 'Apartment' + } + } + } +} diff --git a/reactos/dll/win32/browseui/res/internettoolbar.rgs b/reactos/dll/win32/browseui/res/internettoolbar.rgs new file mode 100644 index 00000000000..ea19dc22f65 --- /dev/null +++ b/reactos/dll/win32/browseui/res/internettoolbar.rgs @@ -0,0 +1,13 @@ +HKCR +{ + NoRemove CLSID + { + ForceRemove {5E6AB780-7743-11CF-A12B-00AA004AE837} = s 'ReactOS Internet Toolbar' + { + InprocServer32 = s '%MODULE%' + { + val ThreadingModel = s 'Apartment' + } + } + } +} diff --git a/reactos/dll/win32/browseui/res/rebarbandsite.rgs b/reactos/dll/win32/browseui/res/rebarbandsite.rgs new file mode 100644 index 00000000000..d24d22e0653 --- /dev/null +++ b/reactos/dll/win32/browseui/res/rebarbandsite.rgs @@ -0,0 +1,13 @@ +HKCR +{ + NoRemove CLSID + { + ForceRemove {ECD4FC4D-521C-11D0-B792-00A0C90312E1} = s 'Shell Rebar BandSite' + { + InprocServer32 = s '%MODULE%' + { + val ThreadingModel = s 'Apartment' + } + } + } +} diff --git a/reactos/dll/win32/browseui/res/regtreeoptions.rgs b/reactos/dll/win32/browseui/res/regtreeoptions.rgs new file mode 100644 index 00000000000..479d18ade13 --- /dev/null +++ b/reactos/dll/win32/browseui/res/regtreeoptions.rgs @@ -0,0 +1,13 @@ +HKCR +{ + NoRemove CLSID + { + ForceRemove {AF4F6510-F982-11d0-8595-00AA004CD6D8} = s 'Registry Tree Options Utility' + { + InprocServer32 = s '%MODULE%' + { + val ThreadingModel = s 'Apartment' + } + } + } +} diff --git a/reactos/dll/win32/browseui/resource.h b/reactos/dll/win32/browseui/resource.h new file mode 100644 index 00000000000..ee214c7eee2 --- /dev/null +++ b/reactos/dll/win32/browseui/resource.h @@ -0,0 +1,100 @@ +/* + * ReactOS Explorer + * + * Copyright 2009 Andrew Hill + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#define IDM_FILE_CLOSE 0xA021 +#define IDM_FILE_EXPLORE_MENU 0xA027 +#define IDM_EXPLORE_ITEM_FIRST 0xA470 +#define IDM_EXPLORE_ITEM_LAST 0xA570 +#define IDM_FILE_EXPLORE_SEP 0xA028 +#define IDM_VIEW_TOOLBARS 0xA201 +#define IDM_TOOLBARS_STANDARDBUTTONS 0xA204 +#define IDM_TOOLBARS_ADDRESSBAR 0xA205 +#define IDM_TOOLBARS_LINKSBAR 0xA206 +#define IDM_TOOLBARS_LOCKTOOLBARS 0xA20C +#define IDM_TOOLBARS_CUSTOMIZE 0xA21D +#define IDM_TOOLBARS_TEXTLABELS 0xA207 +#define IDM_TOOLBARS_GOBUTTON 0xA20B +#define IDM_VIEW_STATUSBAR 0xA202 +#define IDM_VIEW_EXPLORERBAR 0xA230 +#define IDM_EXPLORERBAR_SEARCH 0xA231 +#define IDM_EXPLORERBAR_FAVORITES 0xA232 +#define IDM_EXPLORERBAR_MEDIA 0xA237 +#define IDM_EXPLORERBAR_HISTORY 0xA233 +#define IDM_EXPLORERBAR_FOLDERS 0xA235 +#define IDM_EXPLORERBAR_SEPARATOR 0xA23B +#define IDM_GOTO_BACK 0xA121 +#define IDM_GOTO_FORWARD 0xA122 +#define IDM_GOTO_UPONELEVEL 0xA022 +#define IDM_GOTO_HOMEPAGE 0xA125 +#define IDM_VIEW_REFRESH 0xA220 +#define IDM_FAVORITES_ADDTOFAVORITES 0xA173 +#define IDM_FAVORITES_ORGANIZEFAVORITES 0xA172 +#define IDM_FAVORITES_EMPTY 0xA17E +#define IDM_TOOLS_MAPNETWORKDRIVE 0xA081 +#define IDM_TOOLS_DISCONNECTNETWORKDRIVE 0xA082 +#define IDM_TOOLS_SYNCHRONIZE 0xA176 +#define IDM_TOOLS_FOLDEROPTIONS 0xA123 +#define IDM_HELP_ISTHISCOPYLEGAL 0xA104 +#define IDM_HELP_ABOUT 0xA102 + +#define IDM_GOTO_TRAVEL_FIRST 0xA141 +#define IDM_GOTO_TRAVEL_LAST 0xA151 +#define IDM_GOTO_TRAVEL_SEP IDM_GOTO_TRAVEL_FIRST +#define IDM_GOTO_TRAVEL_FIRSTTARGET IDM_GOTO_TRAVEL_FIRST+1 +#define IDM_GOTO_TRAVEL_LASTTARGET IDM_GOTO_TRAVEL_LAST + +#define IDM_CABINET_CONTEXTMENU 103 +#define IDM_CABINET_MAINMENU 104 + +#define IDR_ACLMULTI 128 +#define IDR_ADDRESSBAND 129 +#define IDR_ADDRESSEDITBOX 130 +#define IDR_BANDPROXY 131 +#define IDR_BANDSITE 132 +#define IDR_BANDSITEMENU 133 +#define IDR_BRANDBAND 134 +#define IDR_COMMONBROWSER 135 +#define IDR_INTERNETTOOLBAR 136 +#define IDR_GLOBALFOLDERSETTINGS 137 +#define IDR_REGTREEOPTIONS 138 + +#define IDS_SMALLICONS 12301 +#define IDS_LARGEICONS 12302 +#define IDS_SHOWTEXTLABELS 12303 +#define IDS_NOTEXTLABELS 12304 +#define IDS_SELECTIVETEXTONRIGHT 12305 +#define IDS_GOBUTTONLABEL 12656 +#define IDS_GOBUTTONTIPTEMPLATE 12657 +#define IDS_SEARCHLABEL 12897 +#define IDS_ADDRESSBANDLABEL 12902 +#define IDS_FOLDERSLABEL 12919 +#define IDS_HISTORYTEXT 13169 +#define IDS_UP 58434 +#define IDS_BACK 58689 +#define IDS_FORWARD 58690 + +#define IDR_ACCELERATORS 256 + +#define IDI_CABINET 103 + +#define IDD_CUSTOMIZETOOLBAREX 256 + +#define IDC_TEXTOPTIONS 4096 +#define IDC_ICONOPTIONS 4097 diff --git a/reactos/dll/win32/browseui/shellbrowser.cpp b/reactos/dll/win32/browseui/shellbrowser.cpp new file mode 100644 index 00000000000..3a27a1137d8 --- /dev/null +++ b/reactos/dll/win32/browseui/shellbrowser.cpp @@ -0,0 +1,3224 @@ +/* + * ReactOS Explorer + * + * Copyright 2009 Andrew Hill + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "resource.h" +#include "newatlinterfaces.h" + +/* +TODO: + **Provide implementation of new and delete that use LocalAlloc + **Persist history for shell view isn't working correctly, possibly because of the mismatch between traveling and updating the travel log. The + view doesn't restore the selection correctly. + **Build explorer.exe, browseui.dll, comctl32.dll, shdocvw.dll, shell32.dll, shlwapi.dll into a directory and run them for testing... + **Add brand band bitmaps to shell32.dll + **If Go button on address bar is clicked, each time a new duplicate entry is added to travel log +****The current entry is updated in travel log before doing the travel, which means when traveling back the update of the + current state overwrites the wrong entry's contents. This needs to be changed. +****Fix close of browser window to release all objects +****Given only a GUID in ShowBrowserBar, what is the correct way to determine if the bar is vertical or horizontal? + **When a new bar is added to base bar site, how is base bar told so it can resize? + **Does the base bar site have a classid? + **What should refresh command send to views to make them refresh? + **When new bar is created, what status notifications need to be fired? + **How does keyboard filtering dispatch? + **For deferred persist history load, how does the view connect up and get the state? + How does context menu send open, cut, rename commands to its site (the shell view)? + **Fix browser to implement IProfferService and hold onto brand band correctly - this will allow animations. + + **Route View->Toolbars commands to internet toolbar + **Handle travel log items in View->Go + **Fix ShowBrowserBar to pass correct size on when bar is shown +****Fix SetBorderSpaceDW to cascade resize to subsequent bars +****Make ShowToolbar check if bar is already created before creating it again +****Shell should fill in the list of explorer bars in the View submenus + **Add folder menu in the file menu + **Fix CShellBrowser::GetBorderDW to compute available size correctly + **When a new bar is shown, re-fire the navigate event. This makes the explorer band select the correct folder + **Implement support for refresh. Forward refresh to explorer bar (refresh on toolbar and in menu is dispatched different) + Make folders toolbar item update state appropriately + Read list of bands from registry on launch + Read list of bars from registry on launch + If the folders or search bars don't exist, disable the toolbar buttons + If the favorites or history bars don't exist, disable the toolbar butons + Fix Apply to all Folders in Folder Options + Implement close command + Add explorer band context menu to file menu + Add code to allow restore of internet toolbar from registry + Fix code that calls FireNavigateComplete to pass the correct new path + + What are the other command ids for QueryStatus/FireCommandStateChange? + + Add handler for cabinet settings change + Add handler for system metrics change (renegotiate border space?) + Add handler for theme change and forward to contained windows + + When folders are shown, the status bar text should change + Add code to save/restore shell view settings + Implement tabbing between frames + Fix handling of focus everywhere + Most keyboard shortcuts don't work, such as F2 for rename, F5 for refresh (see list in "explorer keyboard shortcuts") + + The status bar doesn't show help text for items owned by frame during menu tracking + Stub out frame command handlers + "Arrange icons by" group is not checked properly + + When folders are hidden, icon is the same as the current shell object being displayed. When folders are shown, + the icon is always an open folder with magnifying glass + Fix bars to calculate height correctly + Hookup policies for everything... + Investigate toolbar message WM_USER+93 + Investigate toolbar message WM_USER+100 (Adds extra padding between parts of buttons with BTNS_DROPDOWN | BTNS_SHOWTEXT style + + Vertical Explorer Bar CATID_InfoBand + Horizontal Explorer Bar CATID_CommBand + Desk Band CATID_DeskBand + + cache of bars + HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Discardable\PostSetup\Component Categories\{00021493-0000-0000-C000-000000000046}\Enum + HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Discardable\PostSetup\Component Categories\{00021494-0000-0000-C000-000000000046}\Enum + + create key here with CLSID of bar to register tool band + HKEY_LOCAL_MACHINE\Software\Microsoft\Internet Explorer\Toolbar + +*/ + +#ifndef __GNUC__ +#pragma comment(linker, \ + "\"/manifestdependency:type='Win32' "\ + "name='Microsoft.Windows.Common-Controls' "\ + "version='6.0.0.0' "\ + "processorArchitecture='*' "\ + "publicKeyToken='6595b64144ccf1df' "\ + "language='*'\"") +#endif // __GNUC__ + +#ifdef __GNUC__ +#define SHANDLE_PTR LONG +#endif // __GNUC__ + +struct categoryCacheHeader +{ + long dwSize; // size of header only + long version; // currently 1 + SYSTEMTIME writeTime; // time we were written to registry + long classCount; // number of classes following +}; + +static const unsigned int folderOptionsPageCountMax = 20; +static const long BTP_UPDATE_CUR_HISTORY = 1; +static const long BTP_UPDATE_NEXT_HISTORY = 2; + +BOOL createNewStuff = false; + + +// this class is private to browseui.dll and is not registered externally? +//DEFINE_GUID(CLSID_ShellFldSetExt, 0x6D5313C0, 0x8C62, 0x11D1, 0xB2, 0xCD, 0x00, 0x60, 0x97, 0xDF, 0x8C, 0x11); + + +extern HRESULT CreateTravelLog(REFIID riid, void **ppv); +extern HRESULT CreateBaseBar(REFIID riid, void **ppv); +extern HRESULT CreateBaseBarSite(REFIID riid, void **ppv); +#ifndef ROS_Headers +SHSTDAPI_(void *) SHAlloc(SIZE_T cb); +#endif + +// temporary +extern HRESULT CreateInternetToolbar(REFIID riid, void **ppv); + + + +#ifdef SetWindowLongPtr +#undef SetWindowLongPtr +inline LONG_PTR SetWindowLongPtr(HWND hWnd, int nIndex, LONG_PTR dwNewLong) +{ + return SetWindowLong(hWnd, nIndex, (LONG)dwNewLong); +} +#endif + +#ifdef GetWindowLongPtr +#undef GetWindowLongPtr +inline LONG_PTR GetWindowLongPtr(HWND hWnd, int nIndex) +{ + return (LONG_PTR)GetWindowLong(hWnd, nIndex); +} +#endif + +HMENU SHGetMenuFromID(HMENU topMenu, int theID) +{ + MENUITEMINFO menuItemInfo; + + menuItemInfo.cbSize = sizeof(menuItemInfo); + menuItemInfo.fMask = MIIM_SUBMENU; + if (GetMenuItemInfo(topMenu, theID, FALSE, &menuItemInfo) == FALSE) + return NULL; + return menuItemInfo.hSubMenu; +} + +void SHCheckMenuItem(HMENU theMenu, int theID, BOOL checked) +{ + MENUITEMINFO menuItemInfo; + + menuItemInfo.cbSize = sizeof(menuItemInfo); + menuItemInfo.fMask = MIIM_STATE; + if (GetMenuItemInfo(theMenu, theID, FALSE, &menuItemInfo)) + { + if (checked) + menuItemInfo.fState |= MF_CHECKED; + else + menuItemInfo.fState &= ~MF_CHECKED; + SetMenuItemInfo(theMenu, theID, FALSE, &menuItemInfo); + } +} + +void DeleteMenuItems(HMENU theMenu, unsigned int firstIDToDelete, unsigned int lastIDToDelete) +{ + MENUITEMINFO menuItemInfo; + int menuItemCount; + int curIndex; + + menuItemCount = GetMenuItemCount(theMenu); + curIndex = 0; + while (curIndex < menuItemCount) + { + menuItemInfo.cbSize = sizeof(menuItemInfo); + menuItemInfo.fMask = MIIM_ID; + if (GetMenuItemInfo(theMenu, curIndex, TRUE, &menuItemInfo) && menuItemInfo.wID >= firstIDToDelete && menuItemInfo.wID <= lastIDToDelete) + { + DeleteMenu(theMenu, curIndex, MF_BYPOSITION); + menuItemCount--; + } + else + curIndex++; + } +} + +HRESULT WINAPI SHBindToFolder(LPITEMIDLIST path, IShellFolder **newFolder) +{ + CComPtr desktop; + + ::SHGetDesktopFolder(&desktop); + if (desktop == NULL) + return E_FAIL; + if (path == NULL || path->mkid.cb == 0) + { + *newFolder = desktop; + desktop.p->AddRef (); + return S_OK; + } + return desktop->BindToObject (path, NULL, IID_IShellFolder, (void **)newFolder); +} + +static const TCHAR szCabinetWndClass[] = TEXT("CabinetWClassX"); +static const TCHAR szExploreWndClass[] = TEXT("ExploreWClassX"); + +class CDockManager; +class CShellBrowser; + +class CToolbarProxy : + public CWindowImpl +{ +private: + CComPtr fExplorerToolbar; +public: + void Initialize(HWND parent, IUnknown *explorerToolbar); + +private: + + // message handlers + LRESULT OnAddBitmap(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled); + LRESULT OnForwardMessage(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled); + +BEGIN_MSG_MAP(CToolbarProxy) + MESSAGE_HANDLER(TB_ADDBITMAP, OnAddBitmap) + MESSAGE_RANGE_HANDLER(WM_USER, 0x7fff, OnForwardMessage) +END_MSG_MAP() +}; + +void CToolbarProxy::Initialize(HWND parent, IUnknown *explorerToolbar) +{ + HWND myWindow; + HRESULT hResult; + + myWindow = SHCreateWorkerWindowW(0, parent, 0, WS_CHILD, NULL, 0); + if (myWindow != NULL) + { + SubclassWindow(myWindow); + SetWindowPos(NULL, -32000, -32000, 0, 0, SWP_NOOWNERZORDER | SWP_NOZORDER); + hResult = explorerToolbar->QueryInterface(IID_IExplorerToolbar, (void **)&fExplorerToolbar); + } +} + +LRESULT CToolbarProxy::OnAddBitmap(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled) +{ + LRESULT result; + HRESULT hResult; + + result = 0; + if (fExplorerToolbar.p != NULL) + { + hResult = fExplorerToolbar->AddBitmap(&CGID_ShellBrowser, 1, (long)wParam, (TBADDBITMAP *)lParam, &result, RGB(192, 192, 192)); + hResult = fExplorerToolbar->AddBitmap(&CGID_ShellBrowser, 2, (long)wParam, (TBADDBITMAP *)lParam, &result, RGB(192, 192, 192)); + } + return result; +} + +LRESULT CToolbarProxy::OnForwardMessage(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled) +{ + LRESULT result; + HRESULT hResult; + + result = 0; + if (fExplorerToolbar.p != NULL) + hResult = fExplorerToolbar->SendToolbarMsg(&CGID_ShellBrowser, uMsg, wParam, lParam, &result); + return result; +} + +/* +Switch to a new bar when it receives an Exec(CGID_IDeskBand, 1, 1, vaIn, NULL); + where vaIn will be a VT_UNKNOWN with the new bar. It also sends a RB_SHOWBAND to the + rebar +*/ + +class CShellBrowser : + public CWindowImpl, + public CComObjectRootEx, + public IShellBrowser, + public IDropTarget, + public IServiceProvider, + public IProfferServiceImpl, + public IShellBrowserService, + public IWebBrowser2, + public ITravelLogClient, + public IPersistHistory, + public IDockingWindowSite, + public IOleCommandTarget, + public IBrowserService2, + public IConnectionPointContainerImpl, + public MyIConnectionPointImpl, + public MyIConnectionPointImpl +{ +private: + class barInfo + { + public: + RECT borderSpace; + CComPtr clientBar; + HWND hwnd; + }; + static const int BIInternetToolbar = 0; + static const int BIVerticalBaseBar = 1; + static const int BIHorizontalBaseBar = 2; + + HWND fCurrentShellViewWindow; // our currently hosted shell view window + CComPtr fCurrentShellFolder; // + CComPtr fCurrentShellView; // + LPITEMIDLIST fCurrentDirectoryPIDL; // + HWND fStatusBar; + bool fStatusBarVisible; + CToolbarProxy fToolbarProxy; + barInfo fClientBars[3]; + CComPtr fTravelLog; + HMENU fCurrentMenuBar; + CABINETSTATE fCabinetState; + // The next three fields support persisted history for shell views. They do not need to be reference counted. + IOleObject *fHistoryObject; + IStream *fHistoryStream; + IBindCtx *fHistoryBindContext; +public: +#if 0 + ULONG InternalAddRef() + { + OutputDebugString(_T("AddRef\n")); + return CComObjectRootEx::InternalAddRef(); + } + ULONG InternalRelease() + { + OutputDebugString(_T("Release\n")); + return CComObjectRootEx::InternalRelease(); + } +#endif + + CShellBrowser(); + ~CShellBrowser(); + HRESULT Initialize(LPITEMIDLIST pidl, long b, long c, long d); +public: + HRESULT BrowseToPIDL(LPCITEMIDLIST pidl, long flags); + HRESULT BrowseToPath(IShellFolder *newShellFolder, LPITEMIDLIST absolutePIDL, FOLDERSETTINGS *folderSettings, long flags); + HRESULT GetMenuBand(REFIID riid, void **shellMenu); + HRESULT GetBaseBar(bool vertical, IUnknown **theBaseBar); + HRESULT ShowBand(const CLSID &classID, bool vertical); + HRESULT NavigateToParent(); + HRESULT DoFolderOptions(); + static LRESULT CALLBACK WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam); + void RepositionBars(); + virtual WNDPROC GetWindowProc() + { + return WindowProc; + } + HRESULT FireEvent(DISPID dispIdMember, int argCount, VARIANT *arguments); + HRESULT FireNavigateComplete(const wchar_t *newDirectory); + HRESULT FireCommandStateChange(bool newState, int commandID); + HRESULT FireCommandStateChangeAll(); + HRESULT UpdateForwardBackState(); + void UpdateGotoMenu(HMENU theMenu); + void UpdateViewMenu(HMENU theMenu); + +/* // *** IDockingWindowFrame methods *** + virtual HRESULT STDMETHODCALLTYPE AddToolbar(IUnknown *punkSrc, LPCWSTR pwszItem, DWORD dwAddFlags); + virtual HRESULT STDMETHODCALLTYPE RemoveToolbar(IUnknown *punkSrc, DWORD dwRemoveFlags); + virtual HRESULT STDMETHODCALLTYPE FindToolbar(LPCWSTR pwszItem, REFIID riid, void **ppv); + */ + + // *** IDockingWindowSite methods *** + virtual HRESULT STDMETHODCALLTYPE GetBorderDW(IUnknown* punkObj, LPRECT prcBorder); + virtual HRESULT STDMETHODCALLTYPE RequestBorderSpaceDW(IUnknown* punkObj, LPCBORDERWIDTHS pbw); + virtual HRESULT STDMETHODCALLTYPE SetBorderSpaceDW(IUnknown* punkObj, LPCBORDERWIDTHS pbw); + + // *** IOleCommandTarget methods *** + virtual HRESULT STDMETHODCALLTYPE QueryStatus(const GUID *pguidCmdGroup, ULONG cCmds, OLECMD prgCmds[ ], OLECMDTEXT *pCmdText); + virtual HRESULT STDMETHODCALLTYPE Exec(const GUID *pguidCmdGroup, DWORD nCmdID, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut); + + // *** IOleWindow methods *** + virtual HRESULT STDMETHODCALLTYPE GetWindow(HWND *lphwnd); + virtual HRESULT STDMETHODCALLTYPE ContextSensitiveHelp(BOOL fEnterMode); + + // *** IShellBrowser methods *** + virtual HRESULT STDMETHODCALLTYPE InsertMenusSB(HMENU hmenuShared, LPOLEMENUGROUPWIDTHS lpMenuWidths); + virtual HRESULT STDMETHODCALLTYPE SetMenuSB(HMENU hmenuShared, HOLEMENU holemenuRes, HWND hwndActiveObject); + virtual HRESULT STDMETHODCALLTYPE RemoveMenusSB(HMENU hmenuShared); + virtual HRESULT STDMETHODCALLTYPE SetStatusTextSB(LPCOLESTR pszStatusText); + virtual HRESULT STDMETHODCALLTYPE EnableModelessSB(BOOL fEnable); + virtual HRESULT STDMETHODCALLTYPE TranslateAcceleratorSB(MSG *pmsg, WORD wID); + virtual HRESULT STDMETHODCALLTYPE BrowseObject(LPCITEMIDLIST pidl, UINT wFlags); + virtual HRESULT STDMETHODCALLTYPE GetViewStateStream(DWORD grfMode, IStream **ppStrm); + virtual HRESULT STDMETHODCALLTYPE GetControlWindow(UINT id, HWND *lphwnd); + virtual HRESULT STDMETHODCALLTYPE SendControlMsg(UINT id, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT *pret); + virtual HRESULT STDMETHODCALLTYPE QueryActiveShellView(struct IShellView **ppshv); + virtual HRESULT STDMETHODCALLTYPE OnViewWindowActive(struct IShellView *ppshv); + virtual HRESULT STDMETHODCALLTYPE SetToolbarItems(LPTBBUTTON lpButtons, UINT nButtons, UINT uFlags); + + // *** IDropTarget methods *** + virtual HRESULT STDMETHODCALLTYPE DragEnter(IDataObject *pDataObj, DWORD grfKeyState, POINTL pt, DWORD *pdwEffect); + virtual HRESULT STDMETHODCALLTYPE DragOver(DWORD grfKeyState, POINTL pt, DWORD *pdwEffect); + virtual HRESULT STDMETHODCALLTYPE DragLeave(); + virtual HRESULT STDMETHODCALLTYPE Drop(IDataObject *pDataObj, DWORD grfKeyState, POINTL pt, DWORD *pdwEffect); + + // *** IServiceProvider methods *** + virtual HRESULT STDMETHODCALLTYPE QueryService(REFGUID guidService, REFIID riid, void **ppvObject); + + // *** IShellBowserService methods *** + virtual HRESULT STDMETHODCALLTYPE GetPropertyBag(long flags, REFIID riid, void **ppvObject); + + // *** IDispatch methods *** + virtual HRESULT STDMETHODCALLTYPE GetTypeInfoCount(UINT *pctinfo); + virtual HRESULT STDMETHODCALLTYPE GetTypeInfo(UINT iTInfo, LCID lcid, ITypeInfo **ppTInfo); + virtual HRESULT STDMETHODCALLTYPE GetIDsOfNames(REFIID riid, LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId); + virtual HRESULT STDMETHODCALLTYPE Invoke(DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr); + + // *** IBrowserService methods *** + virtual HRESULT STDMETHODCALLTYPE GetParentSite(IOleInPlaceSite **ppipsite); + virtual HRESULT STDMETHODCALLTYPE SetTitle(IShellView *psv, LPCWSTR pszName); + virtual HRESULT STDMETHODCALLTYPE GetTitle(IShellView *psv, LPWSTR pszName, DWORD cchName); + virtual HRESULT STDMETHODCALLTYPE GetOleObject(IOleObject **ppobjv); + virtual HRESULT STDMETHODCALLTYPE GetTravelLog(ITravelLog **pptl); + virtual HRESULT STDMETHODCALLTYPE ShowControlWindow(UINT id, BOOL fShow); + virtual HRESULT STDMETHODCALLTYPE IsControlWindowShown(UINT id, BOOL *pfShown); + virtual HRESULT STDMETHODCALLTYPE IEGetDisplayName(LPCITEMIDLIST pidl, LPWSTR pwszName, UINT uFlags); + virtual HRESULT STDMETHODCALLTYPE IEParseDisplayName(UINT uiCP, LPCWSTR pwszPath, LPCITEMIDLIST *ppidlOut); + virtual HRESULT STDMETHODCALLTYPE DisplayParseError(HRESULT hres, LPCWSTR pwszPath); + virtual HRESULT STDMETHODCALLTYPE NavigateToPidl(LPCITEMIDLIST pidl, DWORD grfHLNF); + virtual HRESULT STDMETHODCALLTYPE SetNavigateState(BNSTATE bnstate); + virtual HRESULT STDMETHODCALLTYPE GetNavigateState(BNSTATE *pbnstate); + virtual HRESULT STDMETHODCALLTYPE NotifyRedirect(IShellView *psv, LPCITEMIDLIST pidl, BOOL *pfDidBrowse); + virtual HRESULT STDMETHODCALLTYPE UpdateWindowList(); + virtual HRESULT STDMETHODCALLTYPE UpdateBackForwardState(); + virtual HRESULT STDMETHODCALLTYPE SetFlags(DWORD dwFlags, DWORD dwFlagMask); + virtual HRESULT STDMETHODCALLTYPE GetFlags(DWORD *pdwFlags); + virtual HRESULT STDMETHODCALLTYPE CanNavigateNow( void); + virtual HRESULT STDMETHODCALLTYPE GetPidl(LPCITEMIDLIST *ppidl); + virtual HRESULT STDMETHODCALLTYPE SetReferrer(LPCITEMIDLIST pidl); + virtual DWORD STDMETHODCALLTYPE GetBrowserIndex(); + virtual HRESULT STDMETHODCALLTYPE GetBrowserByIndex(DWORD dwID, IUnknown **ppunk); + virtual HRESULT STDMETHODCALLTYPE GetHistoryObject(IOleObject **ppole, IStream **pstm, IBindCtx **ppbc); + virtual HRESULT STDMETHODCALLTYPE SetHistoryObject(IOleObject *pole, BOOL fIsLocalAnchor); + virtual HRESULT STDMETHODCALLTYPE CacheOLEServer(IOleObject *pole); + virtual HRESULT STDMETHODCALLTYPE GetSetCodePage(VARIANT *pvarIn, VARIANT *pvarOut); + virtual HRESULT STDMETHODCALLTYPE OnHttpEquiv(IShellView *psv, BOOL fDone, VARIANT *pvarargIn, VARIANT *pvarargOut); + virtual HRESULT STDMETHODCALLTYPE GetPalette(HPALETTE *hpal); + virtual HRESULT STDMETHODCALLTYPE RegisterWindow(BOOL fForceRegister, int swc); + + // *** IBrowserService2 methods *** + virtual LRESULT STDMETHODCALLTYPE WndProcBS(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam); + virtual HRESULT STDMETHODCALLTYPE SetAsDefFolderSettings(); + virtual HRESULT STDMETHODCALLTYPE GetViewRect(RECT *prc); + virtual HRESULT STDMETHODCALLTYPE OnSize(WPARAM wParam); + virtual HRESULT STDMETHODCALLTYPE OnCreate(struct tagCREATESTRUCTW *pcs); + virtual LRESULT STDMETHODCALLTYPE OnCommand(WPARAM wParam, LPARAM lParam); + virtual HRESULT STDMETHODCALLTYPE OnDestroy(); + virtual LRESULT STDMETHODCALLTYPE OnNotify(struct tagNMHDR *pnm); + virtual HRESULT STDMETHODCALLTYPE OnSetFocus(); + virtual HRESULT STDMETHODCALLTYPE OnFrameWindowActivateBS(BOOL fActive); + virtual HRESULT STDMETHODCALLTYPE ReleaseShellView(); + virtual HRESULT STDMETHODCALLTYPE ActivatePendingView(); + virtual HRESULT STDMETHODCALLTYPE CreateViewWindow(IShellView *psvNew, IShellView *psvOld, LPRECT prcView, HWND *phwnd); + virtual HRESULT STDMETHODCALLTYPE CreateBrowserPropSheetExt(REFIID riid, void **ppv); + virtual HRESULT STDMETHODCALLTYPE GetViewWindow(HWND *phwndView); + virtual HRESULT STDMETHODCALLTYPE GetBaseBrowserData(LPCBASEBROWSERDATA *pbbd); + virtual LPBASEBROWSERDATA STDMETHODCALLTYPE PutBaseBrowserData( void); + virtual HRESULT STDMETHODCALLTYPE InitializeTravelLog(ITravelLog *ptl, DWORD dw); + virtual HRESULT STDMETHODCALLTYPE SetTopBrowser(); + virtual HRESULT STDMETHODCALLTYPE Offline(int iCmd); + virtual HRESULT STDMETHODCALLTYPE AllowViewResize(BOOL f); + virtual HRESULT STDMETHODCALLTYPE SetActivateState(UINT u); + virtual HRESULT STDMETHODCALLTYPE UpdateSecureLockIcon(int eSecureLock); + virtual HRESULT STDMETHODCALLTYPE InitializeDownloadManager(); + virtual HRESULT STDMETHODCALLTYPE InitializeTransitionSite(); + virtual HRESULT STDMETHODCALLTYPE _Initialize(HWND hwnd, IUnknown *pauto); + virtual HRESULT STDMETHODCALLTYPE _CancelPendingNavigationAsync( void); + virtual HRESULT STDMETHODCALLTYPE _CancelPendingView(); + virtual HRESULT STDMETHODCALLTYPE _MaySaveChanges(); + virtual HRESULT STDMETHODCALLTYPE _PauseOrResumeView(BOOL fPaused); + virtual HRESULT STDMETHODCALLTYPE _DisableModeless(); + virtual HRESULT STDMETHODCALLTYPE _NavigateToPidl(LPCITEMIDLIST pidl, DWORD grfHLNF, DWORD dwFlags); + virtual HRESULT STDMETHODCALLTYPE _TryShell2Rename(IShellView *psv, LPCITEMIDLIST pidlNew); + virtual HRESULT STDMETHODCALLTYPE _SwitchActivationNow(); + virtual HRESULT STDMETHODCALLTYPE _ExecChildren(IUnknown *punkBar, BOOL fBroadcast, const GUID *pguidCmdGroup, DWORD nCmdID, DWORD nCmdexecopt, VARIANTARG *pvarargIn, VARIANTARG *pvarargOut); + virtual HRESULT STDMETHODCALLTYPE _SendChildren(HWND hwndBar, BOOL fBroadcast, UINT uMsg, WPARAM wParam, LPARAM lParam); + virtual HRESULT STDMETHODCALLTYPE GetFolderSetData(struct tagFolderSetData *pfsd); + virtual HRESULT STDMETHODCALLTYPE _OnFocusChange(UINT itb); + virtual HRESULT STDMETHODCALLTYPE v_ShowHideChildWindows(BOOL fChildOnly); + virtual UINT STDMETHODCALLTYPE _get_itbLastFocus(); + virtual HRESULT STDMETHODCALLTYPE _put_itbLastFocus(UINT itbLastFocus); + virtual HRESULT STDMETHODCALLTYPE _UIActivateView(UINT uState); + virtual HRESULT STDMETHODCALLTYPE _GetViewBorderRect(RECT *prc); + virtual HRESULT STDMETHODCALLTYPE _UpdateViewRectSize(); + virtual HRESULT STDMETHODCALLTYPE _ResizeNextBorder(UINT itb); + virtual HRESULT STDMETHODCALLTYPE _ResizeView(); + virtual HRESULT STDMETHODCALLTYPE _GetEffectiveClientArea(LPRECT lprectBorder, HMONITOR hmon); + virtual IStream *STDMETHODCALLTYPE v_GetViewStream(LPCITEMIDLIST pidl, DWORD grfMode, LPCWSTR pwszName); + virtual LRESULT STDMETHODCALLTYPE ForwardViewMsg(UINT uMsg, WPARAM wParam, LPARAM lParam); + virtual HRESULT STDMETHODCALLTYPE SetAcceleratorMenu(HACCEL hacc); + virtual int STDMETHODCALLTYPE _GetToolbarCount(); + virtual LPTOOLBARITEM STDMETHODCALLTYPE _GetToolbarItem(int itb); + virtual HRESULT STDMETHODCALLTYPE _SaveToolbars(IStream *pstm); + virtual HRESULT STDMETHODCALLTYPE _LoadToolbars(IStream *pstm); + virtual HRESULT STDMETHODCALLTYPE _CloseAndReleaseToolbars(BOOL fClose); + virtual HRESULT STDMETHODCALLTYPE v_MayGetNextToolbarFocus(LPMSG lpMsg, UINT itbNext, int citb, LPTOOLBARITEM *pptbi, HWND *phwnd); + virtual HRESULT STDMETHODCALLTYPE _ResizeNextBorderHelper(UINT itb, BOOL bUseHmonitor); + virtual UINT STDMETHODCALLTYPE _FindTBar(IUnknown *punkSrc); + virtual HRESULT STDMETHODCALLTYPE _SetFocus(LPTOOLBARITEM ptbi, HWND hwnd, LPMSG lpMsg); + virtual HRESULT STDMETHODCALLTYPE v_MayTranslateAccelerator(MSG *pmsg); + virtual HRESULT STDMETHODCALLTYPE _GetBorderDWHelper(IUnknown *punkSrc, LPRECT lprectBorder, BOOL bUseHmonitor); + virtual HRESULT STDMETHODCALLTYPE v_CheckZoneCrossing(LPCITEMIDLIST pidl); + + // *** IWebBrowser methods *** + virtual HRESULT STDMETHODCALLTYPE GoBack(); + virtual HRESULT STDMETHODCALLTYPE GoForward(); + virtual HRESULT STDMETHODCALLTYPE GoHome(); + virtual HRESULT STDMETHODCALLTYPE GoSearch(); + virtual HRESULT STDMETHODCALLTYPE Navigate(BSTR URL, VARIANT *Flags, VARIANT *TargetFrameName, VARIANT *PostData, VARIANT *Headers); + virtual HRESULT STDMETHODCALLTYPE Refresh(); + virtual HRESULT STDMETHODCALLTYPE Refresh2(VARIANT *Level); + virtual HRESULT STDMETHODCALLTYPE Stop(); + virtual HRESULT STDMETHODCALLTYPE get_Application(IDispatch **ppDisp); + virtual HRESULT STDMETHODCALLTYPE get_Parent(IDispatch **ppDisp); + virtual HRESULT STDMETHODCALLTYPE get_Container(IDispatch **ppDisp); + virtual HRESULT STDMETHODCALLTYPE get_Document(IDispatch **ppDisp); + virtual HRESULT STDMETHODCALLTYPE get_TopLevelContainer(VARIANT_BOOL *pBool); + virtual HRESULT STDMETHODCALLTYPE get_Type(BSTR *Type); + virtual HRESULT STDMETHODCALLTYPE get_Left(LONG *pl); + virtual HRESULT STDMETHODCALLTYPE put_Left(LONG Left); + virtual HRESULT STDMETHODCALLTYPE get_Top(LONG *pl); + virtual HRESULT STDMETHODCALLTYPE put_Top(LONG Top); + virtual HRESULT STDMETHODCALLTYPE get_Width(LONG *pl); + virtual HRESULT STDMETHODCALLTYPE put_Width(LONG Width); + virtual HRESULT STDMETHODCALLTYPE get_Height(LONG *pl); + virtual HRESULT STDMETHODCALLTYPE put_Height(LONG Height); + virtual HRESULT STDMETHODCALLTYPE get_LocationName(BSTR *LocationName); + virtual HRESULT STDMETHODCALLTYPE get_LocationURL(BSTR *LocationURL); + virtual HRESULT STDMETHODCALLTYPE get_Busy(VARIANT_BOOL *pBool); + + // *** IWebBrowser2 methods *** + virtual HRESULT STDMETHODCALLTYPE Quit(); + virtual HRESULT STDMETHODCALLTYPE ClientToWindow(int *pcx, int *pcy); + virtual HRESULT STDMETHODCALLTYPE PutProperty(BSTR Property, VARIANT vtValue); + virtual HRESULT STDMETHODCALLTYPE GetProperty(BSTR Property, VARIANT *pvtValue); + virtual HRESULT STDMETHODCALLTYPE get_Name(BSTR *Name); + virtual HRESULT STDMETHODCALLTYPE get_HWND(SHANDLE_PTR *pHWND); + virtual HRESULT STDMETHODCALLTYPE get_FullName(BSTR *FullName); + virtual HRESULT STDMETHODCALLTYPE get_Path(BSTR *Path); + virtual HRESULT STDMETHODCALLTYPE get_Visible(VARIANT_BOOL *pBool); + virtual HRESULT STDMETHODCALLTYPE put_Visible(VARIANT_BOOL Value); + virtual HRESULT STDMETHODCALLTYPE get_StatusBar(VARIANT_BOOL *pBool); + virtual HRESULT STDMETHODCALLTYPE put_StatusBar(VARIANT_BOOL Value); + virtual HRESULT STDMETHODCALLTYPE get_StatusText(BSTR *StatusText); + virtual HRESULT STDMETHODCALLTYPE put_StatusText(BSTR StatusText); + virtual HRESULT STDMETHODCALLTYPE get_ToolBar(int *Value); + virtual HRESULT STDMETHODCALLTYPE put_ToolBar(int Value); + virtual HRESULT STDMETHODCALLTYPE get_MenuBar(VARIANT_BOOL *Value); + virtual HRESULT STDMETHODCALLTYPE put_MenuBar(VARIANT_BOOL Value); + virtual HRESULT STDMETHODCALLTYPE get_FullScreen(VARIANT_BOOL *pbFullScreen); + virtual HRESULT STDMETHODCALLTYPE put_FullScreen(VARIANT_BOOL bFullScreen); + + // *** IWebBrowser2 methods *** + virtual HRESULT STDMETHODCALLTYPE Navigate2(VARIANT *URL, VARIANT *Flags, VARIANT *TargetFrameName, VARIANT *PostData, VARIANT *Headers); + virtual HRESULT STDMETHODCALLTYPE QueryStatusWB(OLECMDID cmdID, OLECMDF *pcmdf); + virtual HRESULT STDMETHODCALLTYPE ExecWB(OLECMDID cmdID, OLECMDEXECOPT cmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut); + virtual HRESULT STDMETHODCALLTYPE ShowBrowserBar(VARIANT *pvaClsid, VARIANT *pvarShow, VARIANT *pvarSize); + virtual HRESULT STDMETHODCALLTYPE get_ReadyState(READYSTATE *plReadyState); + virtual HRESULT STDMETHODCALLTYPE get_Offline(VARIANT_BOOL *pbOffline); + virtual HRESULT STDMETHODCALLTYPE put_Offline(VARIANT_BOOL bOffline); + virtual HRESULT STDMETHODCALLTYPE get_Silent(VARIANT_BOOL *pbSilent); + virtual HRESULT STDMETHODCALLTYPE put_Silent(VARIANT_BOOL bSilent); + virtual HRESULT STDMETHODCALLTYPE get_RegisterAsBrowser(VARIANT_BOOL *pbRegister); + virtual HRESULT STDMETHODCALLTYPE put_RegisterAsBrowser(VARIANT_BOOL bRegister); + virtual HRESULT STDMETHODCALLTYPE get_RegisterAsDropTarget(VARIANT_BOOL *pbRegister); + virtual HRESULT STDMETHODCALLTYPE put_RegisterAsDropTarget(VARIANT_BOOL bRegister); + virtual HRESULT STDMETHODCALLTYPE get_TheaterMode(VARIANT_BOOL *pbRegister); + virtual HRESULT STDMETHODCALLTYPE put_TheaterMode(VARIANT_BOOL bRegister); + virtual HRESULT STDMETHODCALLTYPE get_AddressBar(VARIANT_BOOL *Value); + virtual HRESULT STDMETHODCALLTYPE put_AddressBar(VARIANT_BOOL Value); + virtual HRESULT STDMETHODCALLTYPE get_Resizable(VARIANT_BOOL *Value); + virtual HRESULT STDMETHODCALLTYPE put_Resizable(VARIANT_BOOL Value); + + // *** ITravelLogClient methods *** + virtual HRESULT STDMETHODCALLTYPE FindWindowByIndex(DWORD dwID, IUnknown **ppunk); + virtual HRESULT STDMETHODCALLTYPE GetWindowData(LPWINDOWDATA pWinData); + virtual HRESULT STDMETHODCALLTYPE LoadHistoryPosition(LPWSTR pszUrlLocation, DWORD dwPosition); + + // *** IPersist methods *** + virtual HRESULT STDMETHODCALLTYPE GetClassID(CLSID *pClassID); + + // *** IPersistHistory methods *** + virtual HRESULT STDMETHODCALLTYPE LoadHistory(IStream *pStream, IBindCtx *pbc); + virtual HRESULT STDMETHODCALLTYPE SaveHistory(IStream *pStream); + virtual HRESULT STDMETHODCALLTYPE SetPositionCookie(DWORD dwPositioncookie); + virtual HRESULT STDMETHODCALLTYPE GetPositionCookie(DWORD *pdwPositioncookie); + + // *** IBrowserService2 methods *** + + + // message handlers + LRESULT OnDestroy(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled); + LRESULT OnSize(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled); + LRESULT OnInitMenuPopup(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled); + LRESULT RelayMsgToShellView(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); + LRESULT OnDisconnectNetworkDrive(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled); + LRESULT OnAboutReactOS(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled); + LRESULT OnGoBack(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled); + LRESULT OnGoForward(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled); + LRESULT OnGoUpLevel(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled); + LRESULT OnGoHome(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled); + LRESULT OnIsThisLegal(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled); + LRESULT OnToggleStatusBarVisible(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled); + LRESULT OnToggleToolbarLock(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled); + LRESULT OnToggleToolbarBandVisible(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled); + LRESULT OnToggleAddressBandVisible(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled); + LRESULT OnToggleLinksBandVisible(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled); + LRESULT OnToggleTextLabels(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled); + LRESULT OnToolbarCustomize(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled); + LRESULT OnGoTravel(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled); + LRESULT RelayCommands(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled); + + static ATL::CWndClassInfo& GetWndClassInfo() + { + static ATL::CWndClassInfo wc = + { + { sizeof(WNDCLASSEX), CS_DBLCLKS, StartWindowProc, + 0, 0, NULL, LoadIcon(_AtlBaseModule.GetResourceInstance(), MAKEINTRESOURCE(IDI_CABINET)), + LoadCursor(NULL, IDC_ARROW), (HBRUSH)(COLOR_WINDOW + 1), NULL, szCabinetWndClass, NULL }, + NULL, NULL, IDC_ARROW, TRUE, 0, _T("") + }; + return wc; + } + +BEGIN_MSG_MAP(CShellBrowser) + MESSAGE_HANDLER(WM_DESTROY, OnDestroy) + MESSAGE_HANDLER(WM_SIZE, OnSize) + MESSAGE_HANDLER(WM_INITMENUPOPUP, OnInitMenuPopup) + MESSAGE_HANDLER(WM_MEASUREITEM, RelayMsgToShellView) + MESSAGE_HANDLER(WM_DRAWITEM, RelayMsgToShellView) + MESSAGE_HANDLER(WM_MENUSELECT, RelayMsgToShellView) + COMMAND_ID_HANDLER(IDM_FILE_CLOSE, OnClose) + COMMAND_ID_HANDLER(IDM_TOOLS_FOLDEROPTIONS, OnFolderOptions) + COMMAND_ID_HANDLER(IDM_TOOLS_MAPNETWORKDRIVE, OnMapNetworkDrive) + COMMAND_ID_HANDLER(IDM_TOOLS_DISCONNECTNETWORKDRIVE, OnDisconnectNetworkDrive) + COMMAND_ID_HANDLER(IDM_HELP_ABOUT, OnAboutReactOS) + COMMAND_ID_HANDLER(IDM_GOTO_BACK, OnGoBack) + COMMAND_ID_HANDLER(IDM_GOTO_FORWARD, OnGoForward) + COMMAND_ID_HANDLER(IDM_GOTO_UPONELEVEL, OnGoUpLevel) + COMMAND_ID_HANDLER(IDM_GOTO_HOMEPAGE, OnGoHome) + COMMAND_ID_HANDLER(IDM_HELP_ISTHISCOPYLEGAL, OnIsThisLegal) + COMMAND_ID_HANDLER(IDM_VIEW_STATUSBAR, OnToggleStatusBarVisible) + COMMAND_ID_HANDLER(IDM_TOOLBARS_LOCKTOOLBARS, OnToggleToolbarLock) + COMMAND_ID_HANDLER(IDM_TOOLBARS_STANDARDBUTTONS, OnToggleToolbarBandVisible) + COMMAND_ID_HANDLER(IDM_TOOLBARS_ADDRESSBAR, OnToggleAddressBandVisible) + COMMAND_ID_HANDLER(IDM_TOOLBARS_LINKSBAR, OnToggleLinksBandVisible) + COMMAND_ID_HANDLER(IDM_TOOLBARS_TEXTLABELS, OnToggleTextLabels) + COMMAND_ID_HANDLER(IDM_TOOLBARS_CUSTOMIZE, OnToolbarCustomize) + COMMAND_RANGE_HANDLER(IDM_GOTO_TRAVEL_FIRSTTARGET, IDM_GOTO_TRAVEL_LASTTARGET, OnGoTravel) + MESSAGE_HANDLER(WM_COMMAND, RelayCommands) +END_MSG_MAP() + +BEGIN_CONNECTION_POINT_MAP(CShellBrowser) + CONNECTION_POINT_ENTRY(DIID_DWebBrowserEvents2) + CONNECTION_POINT_ENTRY(DIID_DWebBrowserEvents) +END_CONNECTION_POINT_MAP() + +BEGIN_COM_MAP(CShellBrowser) + COM_INTERFACE_ENTRY_IID(IID_IDockingWindowSite, IDockingWindowSite) + COM_INTERFACE_ENTRY_IID(IID_IOleCommandTarget, IOleCommandTarget) + COM_INTERFACE_ENTRY2_IID(IID_IOleWindow, IOleWindow, IDockingWindowSite) + COM_INTERFACE_ENTRY_IID(IID_IShellBrowser, IShellBrowser) + COM_INTERFACE_ENTRY_IID(IID_IDropTarget, IDropTarget) + COM_INTERFACE_ENTRY_IID(IID_IServiceProvider, IServiceProvider) + COM_INTERFACE_ENTRY_IID(IID_IProfferService, IProfferService) + COM_INTERFACE_ENTRY_IID(IID_IShellBrowserService, IShellBrowserService) + COM_INTERFACE_ENTRY_IID(IID_IDispatch, IDispatch) + COM_INTERFACE_ENTRY_IID(IID_IConnectionPointContainer, IConnectionPointContainer) + COM_INTERFACE_ENTRY_IID(IID_IWebBrowser, IWebBrowser) + COM_INTERFACE_ENTRY_IID(IID_IWebBrowserApp, IWebBrowserApp) + COM_INTERFACE_ENTRY_IID(IID_IWebBrowser2, IWebBrowser2) + COM_INTERFACE_ENTRY_IID(IID_ITravelLogClient, ITravelLogClient) + COM_INTERFACE_ENTRY_IID(IID_IPersist, IPersist) + COM_INTERFACE_ENTRY_IID(IID_IPersistHistory, IPersistHistory) + COM_INTERFACE_ENTRY_IID(IID_IBrowserService, IBrowserService) + COM_INTERFACE_ENTRY_IID(IID_IBrowserService2, IBrowserService2) +END_COM_MAP() +}; + +extern HRESULT CreateProgressDialog(REFIID riid, void **ppv); + +CShellBrowser::CShellBrowser() +{ + int x; + + fCurrentShellViewWindow = NULL; + fCurrentDirectoryPIDL = NULL; + fStatusBar = NULL; + fStatusBarVisible = true; + for (x = 0; x < 3; x++) + fClientBars[x].hwnd = NULL; + fCurrentMenuBar = NULL; + fHistoryObject = NULL; + fHistoryStream = NULL; + fHistoryBindContext = NULL; +} + +CShellBrowser::~CShellBrowser() +{ +} + +HRESULT CShellBrowser::Initialize(LPITEMIDLIST pidl, long b, long c, long d) +{ + CComPtr dockingWindow; + CComPtr settingsStream; + CComPtr persistStreamInit; + CComPtr commandTarget; + CComPtr objectSite; + RECT bounds = {0, 0, 800, 591}; + HRESULT hResult; + + _AtlInitialConstruct(); + + fCabinetState.cLength = sizeof(fCabinetState); + if (ReadCabinetState(&fCabinetState, sizeof(fCabinetState)) == FALSE) + { + } + + Create(HWND_DESKTOP, bounds, NULL, WS_OVERLAPPEDWINDOW | WS_CLIPSIBLINGS | WS_CLIPCHILDREN, 0, 0U); + if (m_hWnd == NULL) + return E_FAIL; + +#if 0 + hResult = CoCreateInstance(CLSID_InternetToolbar, NULL, CLSCTX_INPROC_SERVER, IID_IUnknown, (void **)&fClientBars[BIInternetToolbar].clientBar); + if (FAILED(hResult)) + return hResult; +#else + hResult = CreateInternetToolbar(IID_IUnknown, (void **)&fClientBars[BIInternetToolbar].clientBar); + if (FAILED(hResult)) + return hResult; +#endif + hResult = fClientBars[BIInternetToolbar].clientBar->QueryInterface(IID_IDockingWindow, (void **)&dockingWindow); + if (FAILED(hResult)) + return hResult; + hResult = fClientBars[BIInternetToolbar].clientBar->QueryInterface(IID_IPersistStreamInit, (void **)&persistStreamInit); + if (FAILED(hResult)) + return hResult; + hResult = fClientBars[BIInternetToolbar].clientBar->QueryInterface(IID_IOleCommandTarget, (void **)&commandTarget); + if (FAILED(hResult)) + return hResult; + hResult = fClientBars[BIInternetToolbar].clientBar->QueryInterface(IID_IObjectWithSite, (void **)&objectSite); + if (FAILED(hResult)) + return hResult; + hResult = objectSite->SetSite((IShellBrowser *)this); + if (FAILED(hResult)) + return hResult; + hResult = commandTarget->Exec(&CGID_PrivCITCommands, 1, 1 /* or 0 */, NULL, NULL); + if (FAILED(hResult)) + return hResult; + // TODO: create settingsStream from registry entry + if (settingsStream.p == NULL) + { + hResult = persistStreamInit->InitNew(); + if (FAILED(hResult)) + return hResult; + } + else + { + hResult = persistStreamInit->Load(settingsStream); + if (FAILED(hResult)) + return hResult; + } + hResult = dockingWindow->ShowDW(TRUE); + if (FAILED(hResult)) + return hResult; + + fToolbarProxy.Initialize(m_hWnd, fClientBars[BIInternetToolbar].clientBar); + + fStatusBar = CreateWindow(STATUSCLASSNAMEW, _T(""), WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | + SBT_NOBORDERS | SBT_TOOLTIPS, 0, 0, 500, 20, m_hWnd, (HMENU)0xa001, _AtlBaseModule.GetModuleInstance(), 0); + fStatusBarVisible = true; + + LPITEMIDLIST desktopPIDL; + FOLDERSETTINGS newFolderSettings; + + hResult = SHGetFolderLocation(NULL, CSIDL_DESKTOP, NULL, 0, &desktopPIDL); + if (FAILED(hResult)) + return hResult; + newFolderSettings.ViewMode = FVM_LIST; + newFolderSettings.fFlags = 0; + hResult = BrowseToPIDL(desktopPIDL, BTP_UPDATE_NEXT_HISTORY); + ILFree(desktopPIDL); + if (FAILED (hResult)) + return hResult; + + ShowWindow(SW_SHOWNORMAL); + + + + + // test code to make brand band animate + { + CComPtr oleCommandTarget; + CComPtr serviceProvider; + CComPtr bandSite; + CComPtr deskBand; + CComPtr winEventHandler; + HRESULT hResult; + + if (fClientBars[BIInternetToolbar].clientBar.p == NULL) + return 0; + hResult = fClientBars[BIInternetToolbar].clientBar->QueryInterface(IID_IServiceProvider, (void **)&serviceProvider); + hResult = serviceProvider->QueryService(SID_IBandSite, IID_IBandSite, (void **)&bandSite); + hResult = bandSite->QueryBand(5, &deskBand, NULL, NULL, 0); + deskBand->QueryInterface(IID_IWinEventHandler, (void **)&winEventHandler); + winEventHandler->IsWindowOwner(NULL); + deskBand->QueryInterface(IID_IOleCommandTarget, (void **)&oleCommandTarget); + oleCommandTarget->QueryStatus(&CGID_BrandCmdGroup, 0, NULL, NULL); + oleCommandTarget->Exec(&CGID_BrandCmdGroup, BBID_STARTANIMATION, 0, NULL, NULL); + } + + + + + return S_OK; +} + +HRESULT CShellBrowser::BrowseToPIDL(LPCITEMIDLIST pidl, long flags) +{ + CComPtr newFolder; + FOLDERSETTINGS newFolderSettings; + HRESULT hResult; + + // called by shell view to browse to new folder + // also called by explorer band to navigate to new folder + hResult = SHBindToFolder((LPITEMIDLIST)pidl, &newFolder); + newFolderSettings.ViewMode = FVM_LIST; + newFolderSettings.fFlags = 0; + hResult = BrowseToPath(newFolder, (LPITEMIDLIST)pidl, &newFolderSettings, flags); + if (FAILED (hResult)) + return hResult; + return S_OK; +} + +BOOL WINAPI _ILIsDesktop(LPCITEMIDLIST pidl) +{ + return (pidl == NULL || pidl->mkid.cb == 0); +} + +BOOL WINAPI _ILIsPidlSimple(LPCITEMIDLIST pidl) +{ + LPCITEMIDLIST pidlnext; + WORD length; + BOOL ret; + + ret = TRUE; + if (! _ILIsDesktop(pidl)) + { + length = pidl->mkid.cb; + pidlnext = (LPCITEMIDLIST)(((LPBYTE)pidl) + length); + if (pidlnext->mkid.cb != 0) + ret = FALSE; + } + return ret; +} + +HRESULT WINAPI SHBindToFolderIDListParent(IShellFolder *unused, LPCITEMIDLIST pidl, const IID *riid, LPVOID *ppv, LPITEMIDLIST *ppidlLast) +{ + CComPtr psf; + LPITEMIDLIST pidlChild; + LPITEMIDLIST pidlParent; + HRESULT hResult; + + hResult = E_FAIL; + if (ppv == NULL) + return E_POINTER; + *ppv = NULL; + if (ppidlLast != NULL) + *ppidlLast = NULL; + if (_ILIsPidlSimple(pidl)) + { + if (ppidlLast != NULL) + *ppidlLast = ILClone(pidl); + hResult = SHGetDesktopFolder((IShellFolder **)ppv); + } + else + { + pidlChild = ILClone(ILFindLastID(pidl)); + pidlParent = ILClone(pidl); + ILRemoveLastID(pidlParent); + hResult = SHGetDesktopFolder(&psf); + if (SUCCEEDED(hResult)) + hResult = psf->BindToObject(pidlParent, NULL, *riid, ppv); + if (SUCCEEDED(hResult) && ppidlLast != NULL) + *ppidlLast = pidlChild; + else + ILFree(pidlChild); + ILFree(pidlParent); + } + return hResult; +} + +HRESULT IEGetNameAndFlagsEx(LPITEMIDLIST pidl, SHGDNF uFlags, long param10, LPWSTR pszBuf, UINT cchBuf, SFGAOF *rgfInOut) +{ + CComPtr parentFolder; + LPITEMIDLIST childPIDL; + STRRET L108; + HRESULT hResult; + + hResult = SHBindToFolderIDListParent(NULL, pidl, &IID_IShellFolder, (void **)&parentFolder, &childPIDL); + hResult = parentFolder->GetDisplayNameOf(childPIDL, uFlags, &L108); + StrRetToBufW(&L108, childPIDL, pszBuf, cchBuf); + if (rgfInOut) + hResult = parentFolder->GetAttributesOf(1, (LPCITEMIDLIST *)&childPIDL, rgfInOut); + ILFree(childPIDL); + return S_OK; +} + +long IEGetNameAndFlags(LPITEMIDLIST pidl, SHGDNF uFlags, LPWSTR pszBuf, UINT cchBuf, SFGAOF *rgfInOut) +{ + return IEGetNameAndFlagsEx(pidl, uFlags, 0, pszBuf, cchBuf, rgfInOut); +} + +HRESULT CShellBrowser::BrowseToPath(IShellFolder *newShellFolder, LPITEMIDLIST absolutePIDL, FOLDERSETTINGS *folderSettings, long flags) +{ + CComPtr oleCommandTarget; + CComPtr objectWithSite; + CComPtr saveCurrentShellFolder; + CComPtr saveCurrentShellView; + CComPtr newShellView; + CComPtr travelLog; + HWND newShellViewWindow; + BOOL windowUpdateIsLocked; + RECT shellViewWindowBounds; + HWND previousView; + HCURSOR saveCursor; + wchar_t newTitle[MAX_PATH]; + SHGDNF nameFlags; + HRESULT hResult; + + if (newShellFolder == NULL) + return E_INVALIDARG; + hResult = GetTravelLog(&travelLog); + if (FAILED (hResult)) + return hResult; + if (flags & BTP_UPDATE_CUR_HISTORY) + { + if (travelLog->CountEntries((IDropTarget *)this) > 0) + hResult = travelLog->UpdateEntry((IDropTarget *)this, FALSE); + // what to do with error? Do we want to halt browse because state save failed? + } + hResult = newShellFolder->CreateViewObject(m_hWnd, IID_IShellView, (void **)&newShellView); + if (FAILED (hResult)) + return hResult; + previousView = fCurrentShellViewWindow; + saveCursor = SetCursor(LoadCursor(NULL, IDC_WAIT)); + windowUpdateIsLocked = LockWindowUpdate(TRUE); + if (fCurrentShellView != NULL) + ::SendMessage(fCurrentShellViewWindow, WM_SETREDRAW, 0, 0); + hResult = newShellView->QueryInterface(IID_IObjectWithSite, (void **)&objectWithSite); + if (SUCCEEDED(hResult) && objectWithSite.p != NULL) + hResult = objectWithSite->SetSite((IDropTarget *)this); + saveCurrentShellFolder = fCurrentShellFolder; + saveCurrentShellView = fCurrentShellView; + fCurrentShellFolder = newShellFolder; + fCurrentShellView = newShellView; + if (previousView != NULL) + ::GetWindowRect(previousView, &shellViewWindowBounds); + else + memset(&shellViewWindowBounds, 0, sizeof(shellViewWindowBounds)); + ::MapWindowPoints(0, m_hWnd, (POINT *)&shellViewWindowBounds, 2); + hResult = newShellView->CreateViewWindow(saveCurrentShellView, folderSettings, this, &shellViewWindowBounds, &newShellViewWindow); + if (FAILED (hResult) || newShellViewWindow == NULL) + { + fCurrentShellView = saveCurrentShellView; + fCurrentShellFolder = saveCurrentShellFolder; + ::SendMessage(fCurrentShellViewWindow, WM_SETREDRAW, 1, 0); + if (windowUpdateIsLocked) + LockWindowUpdate(FALSE); + SetCursor(saveCursor); + return hResult; + } + if (objectWithSite.p != NULL) + hResult = objectWithSite->SetSite(NULL); + ILFree(fCurrentDirectoryPIDL); + fCurrentDirectoryPIDL = ILClone(absolutePIDL); + if (saveCurrentShellView != NULL) + saveCurrentShellView->DestroyViewWindow(); + fCurrentShellViewWindow = newShellViewWindow; + oleCommandTarget.Release(); + hResult = newShellView->QueryInterface(IID_IOleCommandTarget, (void **)&oleCommandTarget); + saveCurrentShellView.Release(); + saveCurrentShellFolder.Release(); + hResult = newShellView->UIActivate(SVUIA_ACTIVATE_FOCUS); + if (windowUpdateIsLocked) + LockWindowUpdate(FALSE); + SetCursor(saveCursor); + if (flags & BTP_UPDATE_NEXT_HISTORY) + { + hResult = travelLog->AddEntry((IDropTarget *)this, FALSE); + hResult = travelLog->UpdateEntry((IDropTarget *)this, FALSE); + } + FireNavigateComplete(L"c:\\temp"); // TODO: use real path here + if (fCabinetState.fFullPathTitle) + nameFlags = SHGDN_FORADDRESSBAR | SHGDN_FORPARSING; + else + nameFlags = SHGDN_FORADDRESSBAR; + hResult = IEGetNameAndFlags(fCurrentDirectoryPIDL, nameFlags, newTitle, sizeof(newTitle) / sizeof(wchar_t), NULL); + if (SUCCEEDED(hResult)) + SetWindowText(newTitle); + // TODO: Update the window icon + FireCommandStateChangeAll(); + hResult = UpdateForwardBackState(); + return S_OK; +} + +HRESULT CShellBrowser::GetMenuBand(REFIID riid, void **shellMenu) +{ + CComPtr serviceProvider; + CComPtr bandSite; + CComPtr deskBand; + HRESULT hResult; + + if (fClientBars[BIInternetToolbar].clientBar.p == NULL) + return E_FAIL; + hResult = fClientBars[BIInternetToolbar].clientBar->QueryInterface(IID_IServiceProvider, (void **)&serviceProvider); + if (FAILED(hResult)) + return hResult; + hResult = serviceProvider->QueryService(SID_IBandSite, IID_IBandSite, (void **)&bandSite); + if (FAILED(hResult)) + return hResult; + hResult = bandSite->QueryBand(1, &deskBand, NULL, NULL, 0); + if (FAILED(hResult)) + return hResult; + return deskBand->QueryInterface(riid, shellMenu); +} + +HRESULT CShellBrowser::GetBaseBar(bool vertical, IUnknown **theBaseBar) +{ + CComPtr newBaseBar; + CComPtr deskBar; + CComPtr newBaseBarSite; + CComPtr objectWithSite; + CComPtr deskBarClient; + IUnknown **cache; + HRESULT hResult; + + if (vertical) + cache = &fClientBars[BIVerticalBaseBar].clientBar.p; + else + cache = &fClientBars[BIHorizontalBaseBar].clientBar.p; + if (*cache == NULL) + { + hResult = CreateBaseBar(IID_IUnknown, (void **)&newBaseBar); + if (FAILED(hResult)) + return hResult; + hResult = CreateBaseBarSite(IID_IUnknown, (void **)&newBaseBarSite); + if (FAILED(hResult)) + return hResult; + + // tell the new base bar about the shell browser + hResult = newBaseBar->QueryInterface(IID_IObjectWithSite, (void **)&objectWithSite); + if (FAILED(hResult)) + return hResult; + hResult = objectWithSite->SetSite((IDropTarget *)this); + if (FAILED(hResult)) + return hResult; + + // tell the new base bar about the new base bar site + hResult = newBaseBar->QueryInterface(IID_IDeskBar, (void **)&deskBar); + if (FAILED(hResult)) + return hResult; + hResult = deskBar->SetClient(newBaseBarSite); + if (FAILED(hResult)) + return hResult; + + // tell the new base bar site about the new base bar + hResult = newBaseBarSite->QueryInterface(IID_IDeskBarClient, (void **)&deskBarClient); + if (FAILED(hResult)) + return hResult; + hResult = deskBarClient->SetDeskBarSite(newBaseBar); + if (FAILED(hResult)) + return hResult; + + *cache = newBaseBar.Detach(); + } + return (*cache)->QueryInterface(IID_IUnknown, (void **)theBaseBar); +} + +HRESULT CShellBrowser::ShowBand(const CLSID &classID, bool vertical) +{ + CComPtr dockingWindow; + CComPtr oleCommandTarget; + CComPtr baseBarSite; + CComPtr newBand; + CComPtr theBaseBar; + CComPtr deskBar; + VARIANT vaIn; + HRESULT hResult; + + hResult = GetBaseBar(vertical, (IUnknown **)&theBaseBar); + if (FAILED(hResult)) + return hResult; + hResult = CoCreateInstance(classID, NULL, CLSCTX_INPROC_SERVER, IID_IUnknown, (void **)&newBand); + if (FAILED(hResult)) + return hResult; + hResult = theBaseBar->QueryInterface(IID_IDeskBar, (void **)&deskBar); + if (FAILED(hResult)) + return hResult; + hResult = deskBar->GetClient(&baseBarSite); + if (FAILED(hResult)) + return hResult; + hResult = theBaseBar->QueryInterface(IID_IDockingWindow, (void **)&dockingWindow); + if (FAILED(hResult)) + return hResult; + hResult = baseBarSite->QueryInterface(IID_IOleCommandTarget, (void **)&oleCommandTarget); + if (FAILED(hResult)) + return hResult; + V_VT(&vaIn) = VT_UNKNOWN; + V_UNKNOWN(&vaIn) = newBand.p; + hResult = oleCommandTarget->Exec(&CGID_IDeskBand, 1, 1, &vaIn, NULL); + if (FAILED(hResult)) + return hResult; + hResult = dockingWindow->ShowDW(TRUE); + if (FAILED(hResult)) + return hResult; + return S_OK; +} + +HRESULT CShellBrowser::NavigateToParent() +{ + LPITEMIDLIST newDirectory; + HRESULT hResult; + + newDirectory = ILClone(fCurrentDirectoryPIDL); + if (newDirectory == NULL) + return E_OUTOFMEMORY; + ILRemoveLastID(newDirectory); + hResult = BrowseToPIDL((LPITEMIDLIST)newDirectory, BTP_UPDATE_CUR_HISTORY | BTP_UPDATE_NEXT_HISTORY); + ILFree(newDirectory); + if (FAILED (hResult)) + return hResult; + return S_OK; +} + +BOOL CALLBACK AddFolderOptionsPage(HPROPSHEETPAGE thePage, LPARAM lParam) +{ + PROPSHEETHEADER *sheetInfo; + + sheetInfo = (PROPSHEETHEADER *)lParam; + if (sheetInfo->nPages >= folderOptionsPageCountMax) + return FALSE; + sheetInfo->phpage[sheetInfo->nPages] = thePage; + sheetInfo->nPages++; + return TRUE; +} + +HRESULT CShellBrowser::DoFolderOptions() +{ + CComPtr folderOptionsSheet; + CComPtr objectWithSite; + PROPSHEETHEADER m_PropSheet; + HPROPSHEETPAGE m_psp[folderOptionsPageCountMax]; +// CComPtr globalSettings; +// SHELLSTATE2 shellState; + HRESULT hResult; + + memset(m_psp, 0, sizeof(m_psp)); + memset(&m_PropSheet, 0, sizeof(m_PropSheet)); + + hResult = CoCreateInstance(CLSID_ShellFldSetExt, NULL, CLSCTX_INPROC_SERVER, IID_IShellPropSheetExt, (void **)&folderOptionsSheet); + if (FAILED(hResult)) + return E_FAIL; + // must set site in order for Apply to all Folders on Advanced page to be enabled + hResult = folderOptionsSheet->QueryInterface(IID_IObjectWithSite, (void **)&objectWithSite); + if (SUCCEEDED(hResult) && objectWithSite.p != NULL) + hResult = objectWithSite->SetSite((IDispatch *)this); + m_PropSheet.phpage = m_psp; +#if 0 + hResult = CoCreateInstance(CLSID_GlobalFolderSettings, NULL, CLSCTX_INPROC_SERVER, IID_IGlobalFolderSettings, (void **)&globalSettings); + if (FAILED(hResult)) + return E_FAIL; + hResult = globalSettings->Get(&shellState, sizeof(shellState)); + if (FAILED(hResult)) + return E_FAIL; +#endif + hResult = folderOptionsSheet->AddPages(AddFolderOptionsPage, (LPARAM)&m_PropSheet); + if (FAILED(hResult)) + return E_FAIL; + if (fCurrentShellView != NULL) + { + hResult = fCurrentShellView->AddPropertySheetPages( 0, AddFolderOptionsPage, (LPARAM)&m_PropSheet); + if (FAILED(hResult)) + return E_FAIL; + } + + 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.nStartPage = 0; + + PropertySheet(&m_PropSheet); + return S_OK; +} + +LRESULT CALLBACK CShellBrowser::WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) +{ + CShellBrowser *pThis = reinterpret_cast(hWnd); + _ATL_MSG msg(pThis->m_hWnd, uMsg, wParam, lParam); + LRESULT lResult; + CComPtr menuBand; + const _ATL_MSG *previousMessage; + BOOL handled; + WNDPROC saveWindowProc; + HRESULT hResult; + + hWnd = pThis->m_hWnd; + previousMessage = pThis->m_pCurrentMsg; + pThis->m_pCurrentMsg = &msg; + + hResult = pThis->GetMenuBand(IID_IMenuBand, (void **)&menuBand); + if (SUCCEEDED(hResult) && menuBand.p != NULL) + { + hResult = menuBand->TranslateMenuMessage(&msg, &lResult); + if (hResult == S_OK) + return lResult; + uMsg = msg.message; + wParam = msg.wParam; + lParam = msg.lParam; + } + + handled = pThis->ProcessWindowMessage(hWnd, uMsg, wParam, lParam, lResult, 0); + ATLASSERT(pThis->m_pCurrentMsg == &msg); + if (handled == FALSE) + { + if (uMsg == WM_NCDESTROY) + { + saveWindowProc = (WNDPROC)GetWindowLongPtr(hWnd, GWL_WNDPROC); + lResult = pThis->DefWindowProc(uMsg, wParam, lParam); + if (saveWindowProc == (WNDPROC)GetWindowLongPtr(hWnd, GWL_WNDPROC)) + SetWindowLongPtr(hWnd, GWL_WNDPROC, (LONG_PTR)pThis->m_pfnSuperWindowProc); + pThis->m_dwState |= WINSTATE_DESTROYED; + } + else + lResult = pThis->DefWindowProc(uMsg, wParam, lParam); + } + pThis->m_pCurrentMsg = previousMessage; + if (previousMessage == NULL && (pThis->m_dwState & WINSTATE_DESTROYED) != 0) + { + pThis->m_dwState &= ~WINSTATE_DESTROYED; + pThis->m_hWnd = NULL; + pThis->OnFinalMessage(hWnd); + } + return lResult; +} + +void CShellBrowser::RepositionBars() +{ + RECT clientRect; + RECT statusRect; + RECT toolbarRect; + int x; + HRESULT hResult; + + GetClientRect(&clientRect); + + if (fStatusBarVisible) + { + ::GetWindowRect(fStatusBar, &statusRect); + ::SetWindowPos(fStatusBar, NULL, clientRect.left, clientRect.bottom - (statusRect.bottom - statusRect.top), + clientRect.right - clientRect.left, + statusRect.bottom - statusRect.top, SWP_NOOWNERZORDER | SWP_NOZORDER); + clientRect.bottom -= statusRect.bottom - statusRect.top; + } + + for (x = 0; x < 3; x++) + { + CComPtr oleWindow; + + if (fClientBars[x].hwnd == NULL && fClientBars[x].clientBar != NULL) + { + hResult = fClientBars[x].clientBar->QueryInterface(IID_IOleWindow, (void **)&oleWindow); + if (SUCCEEDED(hResult)) + hResult = oleWindow->GetWindow(&fClientBars[x].hwnd); + } + if (fClientBars[x].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, + 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, + clientRect.right - clientRect.left, + clientRect.bottom - clientRect.top, SWP_NOOWNERZORDER | SWP_NOZORDER); +} + +HRESULT CShellBrowser::FireEvent(DISPID dispIdMember, int argCount, VARIANT *arguments) +{ + DISPPARAMS params; + CComDynamicUnkArray &vec = IConnectionPointImpl::m_vec; + CComDynamicUnkArray &vec2 = IConnectionPointImpl::m_vec; + HRESULT hResult; + + params.rgvarg = arguments; + params.rgdispidNamedArgs = NULL; + params.cArgs = argCount; + params.cNamedArgs = 0; + IUnknown** pp = vec.begin(); + while (pp < vec.end()) + { + if (*pp != NULL) + { + CComPtr theDispatch; + + hResult = (*pp)->QueryInterface(IID_IDispatch, (void **)&theDispatch); + hResult = theDispatch->Invoke(dispIdMember, GUID_NULL, 0, DISPATCH_METHOD, ¶ms, NULL, NULL, NULL); + } + pp++; + } + pp = vec2.begin(); + while (pp < vec2.end()) + { + if (*pp != NULL) + { + CComPtr theDispatch; + + hResult = (*pp)->QueryInterface(IID_IDispatch, (void **)&theDispatch); + hResult = theDispatch->Invoke(dispIdMember, GUID_NULL, 0, DISPATCH_METHOD, ¶ms, NULL, NULL, NULL); + } + pp++; + } + return S_OK; +} + +HRESULT CShellBrowser::FireNavigateComplete(const wchar_t *newDirectory) +{ + // these two variants intentionally to do use CComVariant because it would double free/release + // or does not need to dispose at all + VARIANT varArg[2]; + VARIANT varArgs; + CComBSTR tempString(newDirectory); + + V_VT(&varArgs) = VT_BSTR; + V_BSTR(&varArgs) = tempString.m_str; + + V_VT(&varArg[0]) = VT_VARIANT | VT_BYREF; + V_VARIANTREF(&varArg[0]) = &varArgs; + V_VT(&varArg[1]) = VT_DISPATCH; + V_DISPATCH(&varArg[1]) = (IDispatch *)this; + + return FireEvent(DISPID_NAVIGATECOMPLETE2, 2, varArg); +} + +HRESULT CShellBrowser::FireCommandStateChange(bool newState, int commandID) +{ + VARIANT varArg[2]; + + V_VT(&varArg[0]) = VT_BOOL; + V_BOOL(&varArg[0]) = newState ? VARIANT_TRUE : VARIANT_FALSE; + V_VT(&varArg[1]) = VT_I4; + V_I4(&varArg[1]) = commandID; + + return FireEvent(DISPID_COMMANDSTATECHANGE, 2, varArg); +} + +HRESULT CShellBrowser::FireCommandStateChangeAll() +{ + return FireCommandStateChange(false, -1); +} + +HRESULT CShellBrowser::UpdateForwardBackState() +{ + CComPtr travelLog; + CComPtr unusedEntry; + bool canGoBack; + bool canGoForward; + HRESULT hResult; + + canGoBack = false; + canGoForward = false; + hResult = GetTravelLog(&travelLog); + if (FAILED (hResult)) + return hResult; + hResult = travelLog->GetTravelEntry((IDropTarget *)this, TLOG_BACK, &unusedEntry); + if (SUCCEEDED(hResult)) + { + canGoBack = true; + unusedEntry.Release(); + } + hResult = travelLog->GetTravelEntry((IDropTarget *)this, TLOG_FORE, &unusedEntry); + if (SUCCEEDED(hResult)) + { + canGoForward = true; + unusedEntry.Release(); + } + hResult = FireCommandStateChange(canGoBack, 2); + hResult = FireCommandStateChange(canGoForward, 1); + return S_OK; +} + +void CShellBrowser::UpdateGotoMenu(HMENU theMenu) +{ + CComPtr travelLog; + int position; + MENUITEMINFO menuItemInfo; + HRESULT hResult; + + DeleteMenuItems(theMenu, IDM_GOTO_TRAVEL_FIRST, IDM_GOTO_TRAVEL_LAST); + + position = GetMenuItemCount(theMenu); + hResult = GetTravelLog(&travelLog); + if (FAILED (hResult)) + return; + hResult = travelLog->InsertMenuEntries((IDropTarget *)this, theMenu, position, IDM_GOTO_TRAVEL_FIRSTTARGET, IDM_GOTO_TRAVEL_LASTTARGET, TLMENUF_BACKANDFORTH | TLMENUF_CHECKCURRENT); + if (SUCCEEDED(hResult)) + { + menuItemInfo.cbSize = sizeof(menuItemInfo); + menuItemInfo.fMask = MIIM_TYPE | MIIM_ID; + menuItemInfo.fType = MF_SEPARATOR; + menuItemInfo.wID = IDM_GOTO_TRAVEL_SEP; + InsertMenuItem(theMenu, position, TRUE, &menuItemInfo); + } +} + +void CShellBrowser::UpdateViewMenu(HMENU theMenu) +{ + CComPtr oleCommandTarget; + CComPtr travelLog; + HMENU gotoMenu; + OLECMD commandList[5]; + HMENU toolbarMenuBar; + HMENU toolbarMenu; + MENUITEMINFO menuItemInfo; + HRESULT hResult; + + gotoMenu = SHGetMenuFromID(theMenu, FCIDM_MENU_EXPLORE); + if (gotoMenu != NULL) + UpdateGotoMenu(gotoMenu); + + commandList[0].cmdID = ITID_TOOLBARBANDSHOWN; + commandList[1].cmdID = ITID_ADDRESSBANDSHOWN; + commandList[2].cmdID = ITID_LINKSBANDSHOWN; + commandList[3].cmdID = ITID_TOOLBARLOCKED; + commandList[4].cmdID = ITID_CUSTOMIZEENABLED; + + hResult = fClientBars[BIInternetToolbar].clientBar->QueryInterface(IID_IOleCommandTarget, (void **)&oleCommandTarget); + if (SUCCEEDED(hResult)) + hResult = oleCommandTarget->QueryStatus(&CGID_PrivCITCommands, 5, commandList, NULL); + if (FAILED(hResult)) + DeleteMenu(theMenu, IDM_VIEW_TOOLBARS, MF_BYCOMMAND); + else + { + toolbarMenuBar = LoadMenu(_AtlBaseModule.GetResourceInstance(), MAKEINTRESOURCE(IDM_CABINET_CONTEXTMENU)); + toolbarMenu = GetSubMenu(toolbarMenuBar, 0); + + SHCheckMenuItem(toolbarMenu, IDM_TOOLBARS_STANDARDBUTTONS, commandList[0].cmdf); + SHCheckMenuItem(toolbarMenu, IDM_TOOLBARS_ADDRESSBAR, commandList[1].cmdf & OLECMDF_ENABLED); + SHCheckMenuItem(toolbarMenu, IDM_TOOLBARS_LINKSBAR, commandList[2].cmdf & OLECMDF_ENABLED); + SHCheckMenuItem(toolbarMenu, IDM_TOOLBARS_LOCKTOOLBARS, commandList[3].cmdf & OLECMDF_ENABLED); + if ((commandList[4].cmdf & OLECMDF_ENABLED) == 0) + DeleteMenu(toolbarMenu, IDM_TOOLBARS_CUSTOMIZE, MF_BYCOMMAND); + DeleteMenu(toolbarMenu, IDM_TOOLBARS_TEXTLABELS, MF_BYCOMMAND); + DeleteMenu(toolbarMenu, IDM_TOOLBARS_GOBUTTON, MF_BYCOMMAND); + + menuItemInfo.cbSize = sizeof(menuItemInfo); + menuItemInfo.fMask = MIIM_SUBMENU; + menuItemInfo.hSubMenu = toolbarMenu; + SetMenuItemInfo(theMenu, IDM_VIEW_TOOLBARS, FALSE, &menuItemInfo); + } + SHCheckMenuItem(theMenu, IDM_VIEW_STATUSBAR, fStatusBarVisible ? TRUE : FALSE); +} + +bool IUnknownIsEqual(IUnknown *int1, IUnknown *int2) +{ + CComPtr int1Retry; + CComPtr int2Retry; + HRESULT hResult; + + if (int1 == int2) + return true; + if (int1 == NULL || int2 == NULL) + return false; + hResult = int1->QueryInterface(IID_IUnknown, (void **)&int1Retry); + if (FAILED(hResult)) + return false; + hResult = int2->QueryInterface(IID_IUnknown, (void **)&int2Retry); + if (FAILED(hResult)) + return false; + if (int1Retry == int2Retry) + return true; + return false; +} + +HRESULT STDMETHODCALLTYPE CShellBrowser::GetBorderDW(IUnknown *punkObj, LPRECT prcBorder) +{ + RECT availableBounds; + static const INT excludeItems[] = {1, 1, 1, 0xa001, 0, 0}; + int x; + + GetEffectiveClientRect(m_hWnd, &availableBounds, (INT *)&excludeItems); + for (x = 0; x < 3; x++) + { + if (fClientBars[x].clientBar.p != NULL && !IUnknownIsEqual(fClientBars[x].clientBar, punkObj)) + { + availableBounds.top += fClientBars[x].borderSpace.top; + availableBounds.left += fClientBars[x].borderSpace.left; + availableBounds.bottom -= fClientBars[x].borderSpace.bottom; + availableBounds.right -= fClientBars[x].borderSpace.right; + } + } + *prcBorder = availableBounds; + return S_OK; +} + +HRESULT STDMETHODCALLTYPE CShellBrowser::RequestBorderSpaceDW(IUnknown* punkObj, LPCBORDERWIDTHS pbw) +{ + return S_OK; +} + +HRESULT STDMETHODCALLTYPE CShellBrowser::SetBorderSpaceDW(IUnknown* punkObj, LPCBORDERWIDTHS pbw) +{ + int x; + + for (x = 0; x < 3; x++) + { + if (IUnknownIsEqual(fClientBars[x].clientBar, punkObj)) + { + fClientBars[x].borderSpace = *pbw; + // if this bar changed size, it cascades and forces all subsequent bars to resize + RepositionBars(); + return S_OK; + } + } + return E_INVALIDARG; +} + +HRESULT STDMETHODCALLTYPE CShellBrowser::QueryStatus(const GUID *pguidCmdGroup, ULONG cCmds, OLECMD prgCmds[ ], OLECMDTEXT *pCmdText) +{ + CComPtr commandTarget; + HRESULT hResult; + + if (prgCmds == NULL) + return E_INVALIDARG; + if (pguidCmdGroup == NULL) + { + if (fCurrentShellView.p != NULL) + { + hResult = fCurrentShellView->QueryInterface(IID_IOleCommandTarget, (void **)&commandTarget); + if (SUCCEEDED(hResult) && commandTarget.p != NULL) + return commandTarget->QueryStatus(NULL, 1, prgCmds, pCmdText); + } + while (cCmds != 0) + { + prgCmds->cmdf = 0; + prgCmds++; + cCmds--; + } + } + else if (IsEqualIID(*pguidCmdGroup, CGID_Explorer)) + { + while (cCmds != 0) + { + switch (prgCmds->cmdID) + { + case 0x1c: // search + prgCmds->cmdf = OLECMDF_SUPPORTED | OLECMDF_ENABLED; + break; + case 0x1d: // history + prgCmds->cmdf = OLECMDF_SUPPORTED | OLECMDF_ENABLED; + break; + case 0x1e: // favorites + prgCmds->cmdf = OLECMDF_SUPPORTED | OLECMDF_ENABLED; + break; + case 0x23: // folders + prgCmds->cmdf = OLECMDF_SUPPORTED | OLECMDF_ENABLED | OLECMDF_LATCHED; + break; + default: + prgCmds->cmdf = 0; + break; + } + prgCmds++; + cCmds--; + } + } + else if (IsEqualIID(*pguidCmdGroup, CGID_ShellBrowser)) + { + while (cCmds != 0) + { + switch (prgCmds->cmdID) + { + case 0xa022: // up level + prgCmds->cmdf = OLECMDF_SUPPORTED; + if (fCurrentDirectoryPIDL->mkid.cb != 0) + prgCmds->cmdf |= OLECMDF_ENABLED; + break; + } + prgCmds++; + cCmds--; + } + } + return S_OK; +} + +HRESULT STDMETHODCALLTYPE CShellBrowser::Exec(const GUID *pguidCmdGroup, DWORD nCmdID, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut) +{ + HRESULT hResult; + + if (IsEqualIID(*pguidCmdGroup, CGID_Explorer)) + { + switch (nCmdID) + { + case 0x23: + hResult = ShowBand(CLSID_ExplorerBand, true); + return S_OK; + case 0x27: + if (nCmdexecopt == 1) + { + // pvaIn is a VT_UNKNOWN with a band that is being hidden + } + else + { + // update zones part of the status bar + } + return S_OK; + case 0x35: // don't do this, and the internet toolbar doesn't create a menu band + V_VT(pvaOut) = VT_INT_PTR; + V_INTREF(pvaOut) = (INT *)LoadMenu(_AtlBaseModule.GetResourceInstance(), MAKEINTRESOURCE(IDM_CABINET_MAINMENU)); + return S_OK; + case 0x38: + // indicate if this cabinet was opened as a browser + return S_FALSE; + default: + return E_NOTIMPL; + } + } + else if (IsEqualIID(*pguidCmdGroup, CGID_InternetButtons)) + { + switch (nCmdID) + { + case 0x23: + // placeholder + return S_OK; + } + } + else if (IsEqualIID(*pguidCmdGroup, CGID_Theater)) + { + switch (nCmdID) + { + case 6: + // what is theater mode and why do we receive this? + return E_NOTIMPL; + } + } + else if (IsEqualIID(*pguidCmdGroup, CGID_MenuBand)) + { + switch (nCmdID) + { + case 14: + // initialize favorites menu + return S_OK; + } + } + else if (IsEqualIID(*pguidCmdGroup, CGID_ShellDocView)) + { + switch (nCmdID) + { + case 0x12: + // refresh on toolbar clicked + return S_OK; + case 0x4d: + // tell the view if it should hide the task pane or not + return (fClientBars[BIVerticalBaseBar].clientBar.p == NULL) ? S_FALSE : S_OK; + } + } + else if (IsEqualIID(*pguidCmdGroup, CGID_ShellBrowser)) + { + switch (nCmdID) + { + case 40994: + return NavigateToParent(); + } + } + else if (IsEqualIID(*pguidCmdGroup, CGID_IExplorerToolbar)) + { + switch (nCmdID) + { + case 0x7063: + return DoFolderOptions(); + } + } + else if (IsEqualIID(*pguidCmdGroup, CGID_DefView)) + { + switch (nCmdID) + { + case 1: + // Reset All Folders option in Folder Options + break; + } + } + else + { + return E_NOTIMPL; + } + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CShellBrowser::GetWindow(HWND *lphwnd) +{ + if (lphwnd == NULL) + return E_POINTER; + *lphwnd = m_hWnd; + return S_OK; +} + +HRESULT STDMETHODCALLTYPE CShellBrowser::ContextSensitiveHelp(BOOL fEnterMode) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CShellBrowser::InsertMenusSB(HMENU hmenuShared, LPOLEMENUGROUPWIDTHS lpMenuWidths) +{ + HMENU mainMenu = LoadMenu(_AtlBaseModule.GetResourceInstance(), MAKEINTRESOURCE(IDM_CABINET_MAINMENU)); + Shell_MergeMenus(hmenuShared, mainMenu, 0, 0, FCIDM_BROWSERLAST, MM_SUBMENUSHAVEIDS); + + int GCCU(itemCount3) = GetMenuItemCount(hmenuShared); + Unused(itemCount3); + + lpMenuWidths->width[0] = 2; + lpMenuWidths->width[2] = 3; + lpMenuWidths->width[4] = 1; + return S_OK; +} + +HRESULT STDMETHODCALLTYPE CShellBrowser::SetMenuSB(HMENU hmenuShared, HOLEMENU holemenuRes, HWND hwndActiveObject) +{ + CComPtr shellMenu; + HRESULT hResult; + + if (IsMenu(hmenuShared) == FALSE) + return E_FAIL; + hResult = GetMenuBand(IID_IShellMenu, (void **)&shellMenu); + if (FAILED(hResult)) + return hResult; + hResult = shellMenu->SetMenu(hmenuShared, NULL, SMSET_DONTOWN); + if (FAILED(hResult)) + return hResult; + fCurrentMenuBar = hmenuShared; + return S_OK; +} + +HRESULT STDMETHODCALLTYPE CShellBrowser::RemoveMenusSB(HMENU hmenuShared) +{ + if (hmenuShared == fCurrentMenuBar) + fCurrentMenuBar = NULL; + return S_OK; +} + +HRESULT STDMETHODCALLTYPE CShellBrowser::SetStatusTextSB(LPCOLESTR pszStatusText) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CShellBrowser::EnableModelessSB(BOOL fEnable) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CShellBrowser::TranslateAcceleratorSB(MSG *pmsg, WORD wID) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CShellBrowser::BrowseObject(LPCITEMIDLIST pidl, UINT wFlags) +{ + return BrowseToPIDL((LPITEMIDLIST)pidl, BTP_UPDATE_CUR_HISTORY | BTP_UPDATE_NEXT_HISTORY); +} + +HRESULT STDMETHODCALLTYPE CShellBrowser::GetViewStateStream(DWORD grfMode, IStream **ppStrm) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CShellBrowser::GetControlWindow(UINT id, HWND *lphwnd) +{ + if (lphwnd == NULL) + return E_POINTER; + *lphwnd = NULL; + switch(id) + { + case FCW_TOOLBAR: + *lphwnd = fToolbarProxy.m_hWnd; + return S_OK; + case FCW_STATUS: + *lphwnd = fStatusBar; + return S_OK; + case FCW_TREE: + // find the directory browser and return it + // this should be used only to determine if a tree is present + return S_OK; + case FCW_PROGRESS: + // is this a progress dialog? + return S_OK; + } + return S_OK; +} + +HRESULT STDMETHODCALLTYPE CShellBrowser::SendControlMsg(UINT id, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT *pret) +{ + LPARAM result; + + if (pret != NULL) + *pret = 0; + switch(id) + { + case FCW_TOOLBAR: + result = fToolbarProxy.SendMessage(uMsg, wParam, lParam); + if (pret != NULL) + *pret = result; + break; + case FCW_STATUS: + result = SendMessage(fStatusBar, uMsg, wParam, lParam); + if (pret != NULL) + *pret = result; + break; + } + return S_OK; +} + +HRESULT STDMETHODCALLTYPE CShellBrowser::QueryActiveShellView(struct IShellView **ppshv) +{ + if (ppshv == NULL) + return E_POINTER; + *ppshv = fCurrentShellView; + if (fCurrentShellView.p != NULL) + fCurrentShellView.p->AddRef(); + return S_OK; +} + +HRESULT STDMETHODCALLTYPE CShellBrowser::OnViewWindowActive(struct IShellView *ppshv) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CShellBrowser::SetToolbarItems(LPTBBUTTON lpButtons, UINT nButtons, UINT uFlags) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CShellBrowser::DragEnter(IDataObject *pDataObj, DWORD grfKeyState, POINTL pt, DWORD *pdwEffect) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CShellBrowser::DragOver(DWORD grfKeyState, POINTL pt, DWORD *pdwEffect) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CShellBrowser::DragLeave() +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CShellBrowser::Drop(IDataObject *pDataObj, DWORD grfKeyState, POINTL pt, DWORD *pdwEffect) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CShellBrowser::QueryService(REFGUID guidService, REFIID riid, void **ppvObject) +{ + // view does a query for SID_STopLevelBrowser, IID_IShellBrowserService + // the returned interface has a method GetPropertyBag on it + if (IsEqualIID(guidService, SID_STopLevelBrowser)) + return this->QueryInterface(riid, ppvObject); + if (IsEqualIID(guidService, SID_SShellBrowser)) + return this->QueryInterface(riid, ppvObject); + if (IsEqualIID(guidService, SID_ITargetFrame2)) + return this->QueryInterface(riid, ppvObject); + if (IsEqualIID(guidService, SID_IWebBrowserApp)) // without this, the internet toolbar won't reflect notifications + return this->QueryInterface(riid, ppvObject); + if (IsEqualIID(guidService, SID_SProxyBrowser)) + return this->QueryInterface(riid, ppvObject); + if (IsEqualIID(guidService, SID_IExplorerToolbar)) + return fClientBars[BIInternetToolbar].clientBar->QueryInterface(riid, ppvObject); + return E_NOINTERFACE; +} + +HRESULT STDMETHODCALLTYPE CShellBrowser::GetPropertyBag(long flags, REFIID riid, void **ppvObject) +{ + if (ppvObject == NULL) + return E_POINTER; + *ppvObject = NULL; + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CShellBrowser::GetTypeInfoCount(UINT *pctinfo) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CShellBrowser::GetTypeInfo(UINT iTInfo, LCID lcid, ITypeInfo **ppTInfo) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CShellBrowser::GetIDsOfNames(REFIID riid, LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CShellBrowser::Invoke(DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CShellBrowser::GetParentSite(IOleInPlaceSite **ppipsite) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CShellBrowser::SetTitle(IShellView *psv, LPCWSTR pszName) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CShellBrowser::GetTitle(IShellView *psv, LPWSTR pszName, DWORD cchName) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CShellBrowser::GetOleObject(IOleObject **ppobjv) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CShellBrowser::GetTravelLog(ITravelLog **pptl) +{ + HRESULT hResult; + + // called by toolbar when displaying tooltips + if (pptl != NULL) + *pptl = NULL; + if (fTravelLog.p == NULL) + { + hResult = CreateTravelLog(IID_ITravelLog, (void **)&fTravelLog); + if (FAILED(hResult)) + return hResult; + } + *pptl = fTravelLog.p; + fTravelLog.p->AddRef(); + return S_OK; +} + +HRESULT STDMETHODCALLTYPE CShellBrowser::ShowControlWindow(UINT id, BOOL fShow) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CShellBrowser::IsControlWindowShown(UINT id, BOOL *pfShown) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CShellBrowser::IEGetDisplayName(LPCITEMIDLIST pidl, LPWSTR pwszName, UINT uFlags) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CShellBrowser::IEParseDisplayName(UINT uiCP, LPCWSTR pwszPath, LPCITEMIDLIST *ppidlOut) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CShellBrowser::DisplayParseError(HRESULT hres, LPCWSTR pwszPath) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CShellBrowser::NavigateToPidl(LPCITEMIDLIST pidl, DWORD grfHLNF) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CShellBrowser::SetNavigateState(BNSTATE bnstate) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CShellBrowser::GetNavigateState(BNSTATE *pbnstate) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CShellBrowser::NotifyRedirect(IShellView *psv, LPCITEMIDLIST pidl, BOOL *pfDidBrowse) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CShellBrowser::UpdateWindowList() +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CShellBrowser::UpdateBackForwardState() +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CShellBrowser::SetFlags(DWORD dwFlags, DWORD dwFlagMask) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CShellBrowser::GetFlags(DWORD *pdwFlags) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CShellBrowser::CanNavigateNow() +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CShellBrowser::GetPidl(LPCITEMIDLIST *ppidl) +{ + // called by explorer bar to get current pidl + if (ppidl == NULL) + return E_POINTER; + *ppidl = ILClone(fCurrentDirectoryPIDL); + return S_OK; +} + +HRESULT STDMETHODCALLTYPE CShellBrowser::SetReferrer(LPCITEMIDLIST pidl) +{ + return E_NOTIMPL; +} + +DWORD STDMETHODCALLTYPE CShellBrowser::GetBrowserIndex() +{ + return -1; +} + +HRESULT STDMETHODCALLTYPE CShellBrowser::GetBrowserByIndex(DWORD dwID, IUnknown **ppunk) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CShellBrowser::GetHistoryObject(IOleObject **ppole, IStream **pstm, IBindCtx **ppbc) +{ + if (ppole == NULL || pstm == NULL || ppbc == NULL) + return E_INVALIDARG; + *ppole = fHistoryObject; + if (fHistoryObject != NULL) + fHistoryObject->AddRef(); + *pstm = fHistoryStream; + if (fHistoryStream != NULL) + fHistoryStream->AddRef(); + *ppbc = fHistoryBindContext; + if (fHistoryBindContext != NULL) + fHistoryBindContext->AddRef(); + fHistoryObject = NULL; + fHistoryStream = NULL; + fHistoryBindContext = NULL; + if (*ppole == NULL) + return E_FAIL; + return S_OK; +} + +HRESULT STDMETHODCALLTYPE CShellBrowser::SetHistoryObject(IOleObject *pole, BOOL fIsLocalAnchor) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CShellBrowser::CacheOLEServer(IOleObject *pole) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CShellBrowser::GetSetCodePage(VARIANT *pvarIn, VARIANT *pvarOut) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CShellBrowser::OnHttpEquiv(IShellView *psv, BOOL fDone, VARIANT *pvarargIn, VARIANT *pvarargOut) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CShellBrowser::GetPalette(HPALETTE *hpal) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CShellBrowser::RegisterWindow(BOOL fForceRegister, int swc) +{ + return E_NOTIMPL; +} + +LRESULT STDMETHODCALLTYPE CShellBrowser::WndProcBS(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CShellBrowser::SetAsDefFolderSettings() +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CShellBrowser::GetViewRect(RECT *prc) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CShellBrowser::OnSize(WPARAM wParam) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CShellBrowser::OnCreate(struct tagCREATESTRUCTW *pcs) +{ + return E_NOTIMPL; +} + +LRESULT STDMETHODCALLTYPE CShellBrowser::OnCommand(WPARAM wParam, LPARAM lParam) +{ + return 0; +} + +HRESULT STDMETHODCALLTYPE CShellBrowser::OnDestroy() +{ + return E_NOTIMPL; +} + +LRESULT STDMETHODCALLTYPE CShellBrowser::OnNotify(struct tagNMHDR *pnm) +{ + return 0; +} + +HRESULT STDMETHODCALLTYPE CShellBrowser::OnSetFocus() +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CShellBrowser::OnFrameWindowActivateBS(BOOL fActive) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CShellBrowser::ReleaseShellView() +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CShellBrowser::ActivatePendingView() +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CShellBrowser::CreateViewWindow(IShellView *psvNew, IShellView *psvOld, LPRECT prcView, HWND *phwnd) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CShellBrowser::CreateBrowserPropSheetExt(REFIID riid, void **ppv) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CShellBrowser::GetViewWindow(HWND *phwndView) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CShellBrowser::GetBaseBrowserData(LPCBASEBROWSERDATA *pbbd) +{ + return E_NOTIMPL; +} + +LPBASEBROWSERDATA STDMETHODCALLTYPE CShellBrowser::PutBaseBrowserData() +{ + return NULL; +} + +HRESULT STDMETHODCALLTYPE CShellBrowser::InitializeTravelLog(ITravelLog *ptl, DWORD dw) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CShellBrowser::SetTopBrowser() +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CShellBrowser::Offline(int iCmd) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CShellBrowser::AllowViewResize(BOOL f) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CShellBrowser::SetActivateState(UINT u) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CShellBrowser::UpdateSecureLockIcon(int eSecureLock) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CShellBrowser::InitializeDownloadManager() +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CShellBrowser::InitializeTransitionSite() +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CShellBrowser::_Initialize(HWND hwnd, IUnknown *pauto) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CShellBrowser::_CancelPendingNavigationAsync() +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CShellBrowser::_CancelPendingView() +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CShellBrowser::_MaySaveChanges() +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CShellBrowser::_PauseOrResumeView(BOOL fPaused) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CShellBrowser::_DisableModeless() +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CShellBrowser::_NavigateToPidl(LPCITEMIDLIST pidl, DWORD grfHLNF, DWORD dwFlags) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CShellBrowser::_TryShell2Rename(IShellView *psv, LPCITEMIDLIST pidlNew) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CShellBrowser::_SwitchActivationNow() +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CShellBrowser::_ExecChildren(IUnknown *punkBar, BOOL fBroadcast, const GUID *pguidCmdGroup, DWORD nCmdID, DWORD nCmdexecopt, VARIANTARG *pvarargIn, VARIANTARG *pvarargOut) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CShellBrowser::_SendChildren(HWND hwndBar, BOOL fBroadcast, UINT uMsg, WPARAM wParam, LPARAM lParam) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CShellBrowser::GetFolderSetData(struct tagFolderSetData *pfsd) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CShellBrowser::_OnFocusChange(UINT itb) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CShellBrowser::v_ShowHideChildWindows(BOOL fChildOnly) +{ + return E_NOTIMPL; +} + +UINT STDMETHODCALLTYPE CShellBrowser::_get_itbLastFocus() +{ + return 0; +} + +HRESULT STDMETHODCALLTYPE CShellBrowser::_put_itbLastFocus(UINT itbLastFocus) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CShellBrowser::_UIActivateView(UINT uState) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CShellBrowser::_GetViewBorderRect(RECT *prc) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CShellBrowser::_UpdateViewRectSize() +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CShellBrowser::_ResizeNextBorder(UINT itb) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CShellBrowser::_ResizeView() +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CShellBrowser::_GetEffectiveClientArea(LPRECT lprectBorder, HMONITOR hmon) +{ + return E_NOTIMPL; +} + +IStream *STDMETHODCALLTYPE CShellBrowser::v_GetViewStream(LPCITEMIDLIST pidl, DWORD grfMode, LPCWSTR pwszName) +{ + return NULL; +} + +LRESULT STDMETHODCALLTYPE CShellBrowser::ForwardViewMsg(UINT uMsg, WPARAM wParam, LPARAM lParam) +{ + return 0; +} + +HRESULT STDMETHODCALLTYPE CShellBrowser::SetAcceleratorMenu(HACCEL hacc) +{ + return E_NOTIMPL; +} + +int STDMETHODCALLTYPE CShellBrowser::_GetToolbarCount() +{ + return 0; +} + +LPTOOLBARITEM STDMETHODCALLTYPE CShellBrowser::_GetToolbarItem(int itb) +{ + return NULL; +} + +HRESULT STDMETHODCALLTYPE CShellBrowser::_SaveToolbars(IStream *pstm) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CShellBrowser::_LoadToolbars(IStream *pstm) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CShellBrowser::_CloseAndReleaseToolbars(BOOL fClose) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CShellBrowser::v_MayGetNextToolbarFocus(LPMSG lpMsg, UINT itbNext, int citb, LPTOOLBARITEM *pptbi, HWND *phwnd) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CShellBrowser::_ResizeNextBorderHelper(UINT itb, BOOL bUseHmonitor) +{ + return E_NOTIMPL; +} + +UINT STDMETHODCALLTYPE CShellBrowser::_FindTBar(IUnknown *punkSrc) +{ + return 0; +} + +HRESULT STDMETHODCALLTYPE CShellBrowser::_SetFocus(LPTOOLBARITEM ptbi, HWND hwnd, LPMSG lpMsg) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CShellBrowser::v_MayTranslateAccelerator(MSG *pmsg) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CShellBrowser::_GetBorderDWHelper(IUnknown *punkSrc, LPRECT lprectBorder, BOOL bUseHmonitor) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CShellBrowser::v_CheckZoneCrossing(LPCITEMIDLIST pidl) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CShellBrowser::GoBack() +{ + CComPtr travelLog; + HRESULT hResult; + + hResult = GetTravelLog(&travelLog); + if (FAILED (hResult)) + return hResult; + return travelLog->Travel((IDropTarget *)this, TLOG_BACK); +} + +HRESULT STDMETHODCALLTYPE CShellBrowser::GoForward() +{ + CComPtr travelLog; + HRESULT hResult; + + hResult = GetTravelLog(&travelLog); + if (FAILED (hResult)) + return hResult; + return travelLog->Travel((IDropTarget *)this, TLOG_FORE); +} + +HRESULT STDMETHODCALLTYPE CShellBrowser::GoHome() +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CShellBrowser::GoSearch() +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CShellBrowser::Navigate(BSTR URL, VARIANT *Flags, VARIANT *TargetFrameName, VARIANT *PostData, VARIANT *Headers) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CShellBrowser::Refresh() +{ + VARIANT level; + + V_VT(&level) = VT_I4; + V_I4(&level) = 4; + return Refresh2(&level); +} + +HRESULT STDMETHODCALLTYPE CShellBrowser::Refresh2(VARIANT *Level) +{ + CComPtr oleCommandTarget; + HRESULT hResult; + + hResult = fCurrentShellView->QueryInterface(IID_IOleCommandTarget, (void **)&oleCommandTarget); + if (FAILED (hResult)) + return hResult; + return oleCommandTarget->Exec(NULL, 22, 1, Level, NULL); +} + +HRESULT STDMETHODCALLTYPE CShellBrowser::Stop() +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CShellBrowser::get_Application(IDispatch **ppDisp) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CShellBrowser::get_Parent(IDispatch **ppDisp) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CShellBrowser::get_Container(IDispatch **ppDisp) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CShellBrowser::get_Document(IDispatch **ppDisp) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CShellBrowser::get_TopLevelContainer(VARIANT_BOOL *pBool) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CShellBrowser::get_Type(BSTR *Type) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CShellBrowser::get_Left(LONG *pl) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CShellBrowser::put_Left(LONG Left) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CShellBrowser::get_Top(LONG *pl) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CShellBrowser::put_Top(LONG Top) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CShellBrowser::get_Width(LONG *pl) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CShellBrowser::put_Width(LONG Width) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CShellBrowser::get_Height(LONG *pl) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CShellBrowser::put_Height(LONG Height) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CShellBrowser::get_LocationName(BSTR *LocationName) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CShellBrowser::get_LocationURL(BSTR *LocationURL) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CShellBrowser::get_Busy(VARIANT_BOOL *pBool) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CShellBrowser::Quit() +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CShellBrowser::ClientToWindow(int *pcx, int *pcy) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CShellBrowser::PutProperty(BSTR Property, VARIANT vtValue) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CShellBrowser::GetProperty(BSTR Property, VARIANT *pvtValue) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CShellBrowser::get_Name(BSTR *Name) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CShellBrowser::get_HWND(SHANDLE_PTR *pHWND) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CShellBrowser::get_FullName(BSTR *FullName) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CShellBrowser::get_Path(BSTR *Path) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CShellBrowser::get_Visible(VARIANT_BOOL *pBool) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CShellBrowser::put_Visible(VARIANT_BOOL Value) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CShellBrowser::get_StatusBar(VARIANT_BOOL *pBool) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CShellBrowser::put_StatusBar(VARIANT_BOOL Value) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CShellBrowser::get_StatusText(BSTR *StatusText) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CShellBrowser::put_StatusText(BSTR StatusText) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CShellBrowser::get_ToolBar(int *Value) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CShellBrowser::put_ToolBar(int Value) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CShellBrowser::get_MenuBar(VARIANT_BOOL *Value) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CShellBrowser::put_MenuBar(VARIANT_BOOL Value) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CShellBrowser::get_FullScreen(VARIANT_BOOL *pbFullScreen) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CShellBrowser::put_FullScreen(VARIANT_BOOL bFullScreen) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CShellBrowser::Navigate2(VARIANT *URL, VARIANT *Flags, VARIANT *TargetFrameName, VARIANT *PostData, VARIANT *Headers) +{ + LPITEMIDLIST pidl; + HRESULT hResult; + + // called from drive combo box to navigate to a directory + if (V_VT(URL) != (VT_ARRAY | VT_UI1)) + return E_INVALIDARG; + if (V_ARRAY(URL)->cDims != 1 || V_ARRAY(URL)->cbElements != 1) + return E_INVALIDARG; + pidl = (LPITEMIDLIST)V_ARRAY(URL)->pvData; + hResult = BrowseToPIDL((LPITEMIDLIST)pidl, BTP_UPDATE_CUR_HISTORY | BTP_UPDATE_NEXT_HISTORY); + if (FAILED (hResult)) + return hResult; + return S_OK; +} + +HRESULT STDMETHODCALLTYPE CShellBrowser::QueryStatusWB(OLECMDID cmdID, OLECMDF *pcmdf) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CShellBrowser::ExecWB(OLECMDID cmdID, OLECMDEXECOPT cmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CShellBrowser::ShowBrowserBar(VARIANT *pvaClsid, VARIANT *pvarShow, VARIANT *pvarSize) +{ + CLSID classID; + bool vertical; + + // called to show search bar + if (V_VT(pvaClsid) != VT_BSTR) + return E_INVALIDARG; + CLSIDFromString(V_BSTR(pvaClsid), &classID); + // TODO: properly compute the value of vertical + vertical = true; + return ShowBand(classID, vertical); +} + +HRESULT STDMETHODCALLTYPE CShellBrowser::get_ReadyState(READYSTATE *plReadyState) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CShellBrowser::get_Offline(VARIANT_BOOL *pbOffline) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CShellBrowser::put_Offline(VARIANT_BOOL bOffline) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CShellBrowser::get_Silent(VARIANT_BOOL *pbSilent) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CShellBrowser::put_Silent(VARIANT_BOOL bSilent) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CShellBrowser::get_RegisterAsBrowser(VARIANT_BOOL *pbRegister) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CShellBrowser::put_RegisterAsBrowser(VARIANT_BOOL bRegister) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CShellBrowser::get_RegisterAsDropTarget(VARIANT_BOOL *pbRegister) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CShellBrowser::put_RegisterAsDropTarget(VARIANT_BOOL bRegister) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CShellBrowser::get_TheaterMode(VARIANT_BOOL *pbRegister) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CShellBrowser::put_TheaterMode(VARIANT_BOOL bRegister) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CShellBrowser::get_AddressBar(VARIANT_BOOL *Value) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CShellBrowser::put_AddressBar(VARIANT_BOOL Value) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CShellBrowser::get_Resizable(VARIANT_BOOL *Value) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CShellBrowser::put_Resizable(VARIANT_BOOL Value) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CShellBrowser::FindWindowByIndex(DWORD dwID, IUnknown **ppunk) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CShellBrowser::GetWindowData(LPWINDOWDATA pWinData) +{ + if (pWinData == NULL) + return E_POINTER; + + pWinData->dwWindowID = -1; + pWinData->uiCP = 0; + pWinData->pidl = ILClone(fCurrentDirectoryPIDL); + pWinData->lpszUrl = NULL; + pWinData->lpszUrlLocation = NULL; + pWinData->lpszTitle = NULL; + return S_OK; +} + +HRESULT STDMETHODCALLTYPE CShellBrowser::LoadHistoryPosition(LPWSTR pszUrlLocation, DWORD dwPosition) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CShellBrowser::GetClassID(CLSID *pClassID) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CShellBrowser::LoadHistory(IStream *pStream, IBindCtx *pbc) +{ + CComPtr viewPersistHistory; + CComPtr viewHistoryObject; + persistState oldState; + ULONG numRead; + LPITEMIDLIST pidl; + HRESULT hResult; + + hResult = pStream->Read(&oldState, sizeof(oldState), &numRead); + if (FAILED(hResult)) + return hResult; + if (numRead != sizeof(oldState) || oldState.dwSize != sizeof(oldState)) + return E_FAIL; + if (oldState.browseType != 2) + return E_FAIL; + pidl = (LPITEMIDLIST)SHAlloc(oldState.pidlSize); + if (pidl == NULL) + return E_OUTOFMEMORY; + hResult = pStream->Read(pidl, oldState.pidlSize, &numRead); + if (FAILED(hResult)) + { + ILFree(pidl); + return hResult; + } + if (numRead != oldState.pidlSize) + { + ILFree(pidl); + return E_FAIL; + } + hResult = CoCreateInstance(oldState.persistClass, NULL, CLSCTX_LOCAL_SERVER | CLSCTX_INPROC_SERVER, IID_IOleObject, (void **)&viewHistoryObject); + fHistoryObject = viewHistoryObject; + fHistoryStream = pStream; + fHistoryBindContext = pbc; + hResult = BrowseToPIDL(pidl, BTP_UPDATE_CUR_HISTORY); + fHistoryObject = NULL; + fHistoryStream = NULL; + fHistoryBindContext = NULL; + ILFree(pidl); + if (FAILED(hResult)) + return hResult; + return S_OK; +} + +HRESULT STDMETHODCALLTYPE CShellBrowser::SaveHistory(IStream *pStream) +{ + CComPtr viewPersistHistory; + persistState newState; + HRESULT hResult; + + hResult = fCurrentShellView->GetItemObject(SVGIO_BACKGROUND, IID_IPersistHistory, (void **)&viewPersistHistory); + memset(&newState, 0, sizeof(newState)); + newState.dwSize = sizeof(newState); + newState.browseType = 2; + newState.browserIndex = GetBrowserIndex(); + if (viewPersistHistory.p != NULL) + { + hResult = viewPersistHistory->GetClassID(&newState.persistClass); + if (FAILED(hResult)) + return hResult; + } + newState.pidlSize = ILGetSize(fCurrentDirectoryPIDL); + hResult = pStream->Write(&newState, sizeof(newState), NULL); + if (FAILED(hResult)) + return hResult; + hResult = pStream->Write(fCurrentDirectoryPIDL, newState.pidlSize, NULL); + if (FAILED(hResult)) + return hResult; + if (viewPersistHistory.p != NULL) + { + hResult = viewPersistHistory->SaveHistory(pStream); + if (FAILED(hResult)) + return hResult; + } + return S_OK; +} + +HRESULT STDMETHODCALLTYPE CShellBrowser::SetPositionCookie(DWORD dwPositioncookie) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CShellBrowser::GetPositionCookie(DWORD *pdwPositioncookie) +{ + return E_NOTIMPL; +} + +LRESULT CShellBrowser::OnDestroy(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled) +{ + // TODO: rip down everything + PostQuitMessage(0); + return 0; +} + +LRESULT CShellBrowser::OnSize(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled) +{ + CComPtr dockingWindow; + RECT availableBounds; + static const INT excludeItems[] = {1, 1, 1, 0xa001, 0, 0}; + int x; + HRESULT hResult; + + if (wParam != SIZE_MINIMIZED) + { + GetEffectiveClientRect(m_hWnd, &availableBounds, (INT *)&excludeItems); + for (x = 0; x < 3; x++) + { + if (fClientBars[x].clientBar != NULL) + { + hResult = fClientBars[x].clientBar->QueryInterface(IID_IDockingWindow, (void **)&dockingWindow); + if (SUCCEEDED(hResult) && dockingWindow != NULL) + { + hResult = dockingWindow->ResizeBorderDW(&availableBounds, (IDropTarget *)this, TRUE); + break; + } + } + } + RepositionBars(); + } + return 1; +} + +LRESULT CShellBrowser::OnInitMenuPopup(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled) +{ + HMENU theMenu; + + theMenu = (HMENU)wParam; + if (theMenu == SHGetMenuFromID(fCurrentMenuBar, FCIDM_MENU_VIEW)) + UpdateViewMenu(theMenu); + return RelayMsgToShellView(uMsg, wParam, lParam, bHandled); +} + +LRESULT CShellBrowser::RelayMsgToShellView(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled) +{ + if (fCurrentShellViewWindow != NULL) + return SendMessage(fCurrentShellViewWindow, uMsg, wParam, lParam); + return 0; +} + +LRESULT CShellBrowser::OnClose(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled) +{ + return 0; +} + +LRESULT CShellBrowser::OnFolderOptions(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled) +{ + HRESULT hResult; + + hResult = DoFolderOptions(); + return 0; +} + +LRESULT CShellBrowser::OnMapNetworkDrive(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled) +{ +#ifndef ROS_Headers + WNetConnectionDialog(m_hWnd, RESOURCETYPE_DISK); +#endif + return 0; +} + +LRESULT CShellBrowser::OnDisconnectNetworkDrive(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled) +{ +#ifndef ROS_Headers + WNetDisconnectDialog(m_hWnd, RESOURCETYPE_DISK); +#endif + return 0; +} + +LRESULT CShellBrowser::OnAboutReactOS(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled) +{ + ShellAbout(m_hWnd, _T("ReactOS"), _T(""), NULL); + return 0; +} + +LRESULT CShellBrowser::OnGoBack(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled) +{ + HRESULT hResult; + + hResult = GoBack(); + return 0; +} + +LRESULT CShellBrowser::OnGoForward(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled) +{ + HRESULT hResult; + + hResult = GoForward(); + return 0; +} + +LRESULT CShellBrowser::OnGoUpLevel(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled) +{ + HRESULT hResult; + + hResult = NavigateToParent(); + return 0; +} + +LRESULT CShellBrowser::OnGoHome(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled) +{ + HRESULT hResult; + + hResult = GoHome(); + return 0; +} + +LRESULT CShellBrowser::OnIsThisLegal(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled) +{ + HRESULT hResult; + + typedef HRESULT (WINAPI *PSHOpenNewFrame)(LPITEMIDLIST pidl, IUnknown *b, long c, long d); + PSHOpenNewFrame Func; + HMODULE hShlwapi; + + hShlwapi = LoadLibrary(TEXT("browseui.dll")); + if (hShlwapi != NULL) + Func = (PSHOpenNewFrame)GetProcAddress(hShlwapi, (LPCSTR)103); + else + Func = NULL; + if (Func != NULL) + { + LPITEMIDLIST desktopPIDL; + + hResult = SHGetFolderLocation(NULL, CSIDL_DESKTOP, NULL, 0, &desktopPIDL); + if (SUCCEEDED(hResult)) + { + hResult = Func(desktopPIDL, NULL, -1, 1); + } + } + return 0; +} + +LRESULT CShellBrowser::OnToggleStatusBarVisible(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled) +{ + fStatusBarVisible = !fStatusBarVisible; + // TODO: trigger a relayout of contained items + return 0; +} + +LRESULT CShellBrowser::OnToggleToolbarLock(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled) +{ + CComPtr commandTarget; + HRESULT hResult; + + hResult = fClientBars[BIInternetToolbar].clientBar->QueryInterface(IID_IOleCommandTarget, (void **)&commandTarget); + if (FAILED(hResult)) + return 0; + hResult = commandTarget->Exec(&CGID_PrivCITCommands, ITID_TOOLBARLOCKED, 0, NULL, NULL); + return 0; +} + +LRESULT CShellBrowser::OnToggleToolbarBandVisible(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled) +{ + CComPtr commandTarget; + HRESULT hResult; + + hResult = fClientBars[BIInternetToolbar].clientBar->QueryInterface(IID_IOleCommandTarget, (void **)&commandTarget); + if (FAILED(hResult)) + return 0; + hResult = commandTarget->Exec(&CGID_PrivCITCommands, ITID_TOOLBARBANDSHOWN, 0, NULL, NULL); + return 0; +} + +LRESULT CShellBrowser::OnToggleAddressBandVisible(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled) +{ + CComPtr commandTarget; + HRESULT hResult; + + hResult = fClientBars[BIInternetToolbar].clientBar->QueryInterface(IID_IOleCommandTarget, (void **)&commandTarget); + if (FAILED(hResult)) + return 0; + hResult = commandTarget->Exec(&CGID_PrivCITCommands, ITID_ADDRESSBANDSHOWN, 0, NULL, NULL); + return 0; +} + +LRESULT CShellBrowser::OnToggleLinksBandVisible(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled) +{ + CComPtr commandTarget; + HRESULT hResult; + + hResult = fClientBars[BIInternetToolbar].clientBar->QueryInterface(IID_IOleCommandTarget, (void **)&commandTarget); + if (FAILED(hResult)) + return 0; + hResult = commandTarget->Exec(&CGID_PrivCITCommands, ITID_LINKSBANDSHOWN, 0, NULL, NULL); + return 0; +} + +LRESULT CShellBrowser::OnToggleTextLabels(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled) +{ + CComPtr commandTarget; + HRESULT hResult; + + hResult = fClientBars[BIInternetToolbar].clientBar->QueryInterface(IID_IOleCommandTarget, (void **)&commandTarget); + if (FAILED(hResult)) + return 0; + hResult = commandTarget->Exec(&CGID_PrivCITCommands, ITID_TEXTLABELS, 0, NULL, NULL); + return 0; +} + +LRESULT CShellBrowser::OnToolbarCustomize(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled) +{ + CComPtr commandTarget; + HRESULT hResult; + + hResult = fClientBars[BIInternetToolbar].clientBar->QueryInterface(IID_IOleCommandTarget, (void **)&commandTarget); + if (FAILED(hResult)) + return 0; + hResult = commandTarget->Exec(&CGID_PrivCITCommands, ITID_CUSTOMIZEENABLED, 0, NULL, NULL); + return 0; +} + +LRESULT CShellBrowser::OnGoTravel(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled) +{ + return 0; +} + +LRESULT CShellBrowser::RelayCommands(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled) +{ + if (HIWORD(wParam) == 0 && LOWORD(wParam) < FCIDM_SHVIEWLAST && fCurrentShellViewWindow != NULL) + return SendMessage(fCurrentShellViewWindow, uMsg, wParam, lParam); + return 0; +} + +//static LRESULT CALLBACK ExplorerWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) +//{ +// return DefWindowProc(hwnd, uMsg, wParam, lParam); +//} + +static void ExplorerMessageLoop() +{ + MSG Msg; + BOOL Ret; + + while (1) + { + Ret = (GetMessage(&Msg, NULL, 0, 0) != 0); + + if (Ret != -1) + { + if (!Ret) + break; + + TranslateMessage(&Msg); + DispatchMessage(&Msg); + } + } +} + +DWORD WINAPI BrowserThreadProc(LPVOID lpThreadParameter) +{ + CComPtr shellBrowser; + CComObject *theCabinet; + IEThreadParamBlock *parameters; + HRESULT hResult; + + parameters = (IEThreadParamBlock *)lpThreadParameter; + OleInitialize(NULL); + ATLTRY (theCabinet = new CComObject); + if (theCabinet == NULL) + return E_OUTOFMEMORY; + hResult = theCabinet->QueryInterface(IID_IShellBrowser, (void **)&shellBrowser); + if (FAILED (hResult)) + { + delete theCabinet; + return hResult; + } + hResult = theCabinet->Initialize(parameters->directoryPIDL, 0, 0, 0); + if (FAILED (hResult)) + return hResult; + ExplorerMessageLoop(); + OleUninitialize(); + return 0; +} diff --git a/reactos/dll/win32/browseui/toolsband.cpp b/reactos/dll/win32/browseui/toolsband.cpp new file mode 100644 index 00000000000..dd7d0f76ce6 --- /dev/null +++ b/reactos/dll/win32/browseui/toolsband.cpp @@ -0,0 +1,428 @@ +/* + * ReactOS Explorer + * + * Copyright 2009 Andrew Hill + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +/* +Implements the toolbar band of a cabinet window +*/ +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/* +TODO: + **Fix GetBandInfo to calculate size correctly +*/ +static const int gBackCommandID = 0xa121; +static const int gForwardCommandID = 0xa122; +static const int gUpLevelCommandID = 0xa022; +static const int gSearchCommandID = 1003; +static const int gFoldersCommandID = 1004; +static const int gMoveToCommandID = 0x701f; +static const int gCopyToCommandID = 0x701e; +static const int gDeleteCommandID = 0x7011; +static const int gUndoCommandID = 0x701b; +static const int gViewsCommandID = 0x7031; +static const int gStopCommandID = 1010; +static const int gRefreshCommandID = 0xa220; +static const int gHomeCommandID = 1012; +static const int gMapDriveCommandID = 41089; +static const int gDisconnectCommandID = 41090; +static const int gFavoritesCommandID = 1015; +static const int gHistoryCommandID = 1016; +static const int gFullScreenCommandID = 1017; +static const int gPropertiesCommandID = 0x7013; +static const int gCutCommandID = 0x7018; +static const int gCopyCommandID = 0x7019; +static const int gPasteCommandID = 0x701a; +static const int gFolderOptionsCommandID = 41251; + +class CToolsBand : + public CWindowImpl, + public CComObjectRootEx, + public IDeskBand, + public IObjectWithSite, + public IInputObject, + public IPersistStream +{ +private: + IDockingWindowSite *fDockSite; + GUID fExecCommandCategory; + CComPtr fExecCommandTarget; +public: + CToolsBand(); + ~CToolsBand(); +public: + // *** IDeskBand methods *** + virtual HRESULT STDMETHODCALLTYPE GetBandInfo(DWORD dwBandID, DWORD dwViewMode, DESKBANDINFO* pdbi); + + // *** IObjectWithSite methods *** + virtual HRESULT STDMETHODCALLTYPE SetSite(IUnknown* pUnkSite); + virtual HRESULT STDMETHODCALLTYPE GetSite(REFIID riid, void **ppvSite); + + // *** IOleWindow methods *** + virtual HRESULT STDMETHODCALLTYPE GetWindow(HWND *lphwnd); + virtual HRESULT STDMETHODCALLTYPE ContextSensitiveHelp(BOOL fEnterMode); + + // *** IDockingWindow methods *** + virtual HRESULT STDMETHODCALLTYPE CloseDW(DWORD dwReserved); + virtual HRESULT STDMETHODCALLTYPE ResizeBorderDW(const RECT* prcBorder, IUnknown* punkToolbarSite, BOOL fReserved); + virtual HRESULT STDMETHODCALLTYPE ShowDW(BOOL fShow); + + // *** IInputObject methods *** + virtual HRESULT STDMETHODCALLTYPE HasFocusIO(); + virtual HRESULT STDMETHODCALLTYPE TranslateAcceleratorIO(LPMSG lpMsg); + virtual HRESULT STDMETHODCALLTYPE UIActivateIO(BOOL fActivate, LPMSG lpMsg); + + // *** IPersist methods *** + virtual HRESULT STDMETHODCALLTYPE GetClassID(CLSID *pClassID); + + // *** IPersistStream methods *** + virtual HRESULT STDMETHODCALLTYPE IsDirty(); + virtual HRESULT STDMETHODCALLTYPE Load(IStream *pStm); + virtual HRESULT STDMETHODCALLTYPE Save(IStream *pStm, BOOL fClearDirty); + virtual HRESULT STDMETHODCALLTYPE GetSizeMax(ULARGE_INTEGER *pcbSize); + + // message handlers + LRESULT OnGetButtonInfo(UINT idControl, NMHDR *pNMHDR, BOOL &bHandled); + +BEGIN_MSG_MAP(CToolsBand) +// MESSAGE_HANDLER(WM_NOTIFY, OnNotify) +// MESSAGE_HANDLER(WM_KILLFOCUS, OnKillFocus) + NOTIFY_HANDLER(0, TBN_GETBUTTONINFOW, OnGetButtonInfo) +END_MSG_MAP() + +BEGIN_COM_MAP(CToolsBand) + COM_INTERFACE_ENTRY_IID(IID_IDeskBand, IDeskBand) + COM_INTERFACE_ENTRY_IID(IID_IObjectWithSite, IObjectWithSite) + COM_INTERFACE_ENTRY_IID(IID_IOleWindow, IOleWindow) + COM_INTERFACE_ENTRY_IID(IID_IDockingWindow, IDockingWindow) + COM_INTERFACE_ENTRY_IID(IID_IInputObject, IInputObject) + COM_INTERFACE_ENTRY_IID(IID_IPersist, IPersist) + COM_INTERFACE_ENTRY_IID(IID_IPersistStream, IPersistStream) +END_COM_MAP() +}; + +CToolsBand::CToolsBand() +{ + fDockSite = NULL; +} + +CToolsBand::~CToolsBand() +{ + if (fDockSite) + fDockSite->Release(); +} + +HRESULT STDMETHODCALLTYPE CToolsBand::GetBandInfo(DWORD dwBandID, DWORD dwViewMode, DESKBANDINFO* pdbi) +{ + if (pdbi->dwMask & DBIM_MINSIZE) + { + pdbi->ptMinSize.x = 400; + pdbi->ptMinSize.y = 38; + } + if (pdbi->dwMask & DBIM_MAXSIZE) + { + pdbi->ptMaxSize.x = 0; + pdbi->ptMaxSize.y = 0; + } + if (pdbi->dwMask & DBIM_INTEGRAL) + { + pdbi->ptIntegral.x = 0; + pdbi->ptIntegral.y = 0; + } + if (pdbi->dwMask & DBIM_ACTUAL) + { + pdbi->ptActual.x = 400; + pdbi->ptActual.y = 38; + } + if (pdbi->dwMask & DBIM_TITLE) + wcscpy(pdbi->wszTitle, L""); + if (pdbi->dwMask & DBIM_MODEFLAGS) + pdbi->dwModeFlags = DBIMF_UNDELETEABLE; + if (pdbi->dwMask & DBIM_BKCOLOR) + pdbi->crBkgnd = 0; + return S_OK; +} + +static const int backImageIndex = 0; +static const int forwardImageIndex = 1; +static const int favoritesImageIndex = 2; +// 3 +// 4 +static const int cutImageIndex = 5; +static const int copyImageIndex = 6; +static const int pasteImageIndex = 7; +static const int undoImageIndex = 8; +static const int redoImageIndex = 9; +static const int deleteImageIndex = 10; +// 11 +// 12 +// 13 +// 14 +static const int propertiesImageIndex = 15; +// 16 +static const int searchImageIndex = 17; +// 18 +// 19 +// 20 +// 21 +static const int viewsImageIndex = 22; +// 23 +// 24 +// 25 +// 26 +// 27 +static const int upImageIndex = 28; +static const int mapDriveImageIndex = 29; +static const int disconnectImageIndex = 30; +// 31 +static const int viewsAltImageIndex = 32; // same image as viewsImageIndex +// 33 +// 34 +// 35 +// 36 +// 37 +static const int viewsAlt2ImageIndex = 38; // same image as viewsAltImageIndex & viewsImageIndex +// 39 +// 40 +// 41 +// 42 +static const int foldersImageIndex = 43; +static const int moveToImageIndex = 44; +static const int copyToImageIndex = 45; +static const int folderOptionsImageIndex = 46; + +const int numShownButtons = 13; +const int numHiddenButtons = 13; +TBBUTTON tbButtonsAdd[numShownButtons + numHiddenButtons] = +{ + {backImageIndex, gBackCommandID, TBSTATE_ENABLED, BTNS_DROPDOWN | BTNS_SHOWTEXT, {0}, 0, (INT_PTR)_T("Back")}, + {forwardImageIndex, gForwardCommandID, TBSTATE_ENABLED, BTNS_DROPDOWN, {0}, 0, (INT_PTR)_T("Forward")}, + {upImageIndex, gUpLevelCommandID, TBSTATE_ENABLED, BTNS_BUTTON, {0}, 0, (INT_PTR)_T("Up")}, + {6, -1, TBSTATE_ENABLED, BTNS_SEP}, + {searchImageIndex, gSearchCommandID, TBSTATE_ENABLED, BTNS_BUTTON | BTNS_SHOWTEXT, {0}, 0, (INT_PTR)_T("Search")}, + {foldersImageIndex, gFoldersCommandID, TBSTATE_ENABLED, BTNS_BUTTON | BTNS_SHOWTEXT, {0}, 0, (INT_PTR)_T("Folders")}, + {6, -1, TBSTATE_ENABLED, BTNS_SEP}, + {moveToImageIndex, gMoveToCommandID, TBSTATE_ENABLED, BTNS_BUTTON, {0}, 0, (INT_PTR)_T("Move To")}, + {copyToImageIndex, gCopyToCommandID, TBSTATE_ENABLED, BTNS_BUTTON, {0}, 0, (INT_PTR)_T("Copy To")}, + {deleteImageIndex, gDeleteCommandID, TBSTATE_ENABLED, BTNS_BUTTON, {0}, 0, (INT_PTR)_T("Delete")}, + {undoImageIndex, gUndoCommandID, TBSTATE_ENABLED, BTNS_BUTTON, {0}, 0, (INT_PTR)_T("Undo")}, + {6, -1, TBSTATE_ENABLED, BTNS_SEP}, + {viewsImageIndex, gViewsCommandID, TBSTATE_ENABLED, BTNS_WHOLEDROPDOWN, {0}, 0, (INT_PTR)_T("Views")}, + + {0, gStopCommandID, TBSTATE_ENABLED, BTNS_BUTTON, {0}, 0, (INT_PTR)_T("Stop")}, + {0, gRefreshCommandID, TBSTATE_ENABLED, BTNS_BUTTON, {0}, 0, (INT_PTR)_T("Refresh")}, + {0, gHomeCommandID, TBSTATE_ENABLED, BTNS_BUTTON, {0}, 0, (INT_PTR)_T("Home")}, + {mapDriveImageIndex, gMapDriveCommandID, TBSTATE_ENABLED, BTNS_BUTTON, {0}, 0, (INT_PTR)_T("Map Drive")}, + {disconnectImageIndex, gDisconnectCommandID, TBSTATE_ENABLED, BTNS_BUTTON, {0}, 0, (INT_PTR)_T("Disconnect")}, + {favoritesImageIndex, gFavoritesCommandID, TBSTATE_ENABLED, BTNS_BUTTON | BTNS_SHOWTEXT, {0}, 0, (INT_PTR)_T("Favorites")}, + {0, gHistoryCommandID, TBSTATE_ENABLED, BTNS_BUTTON, {0}, 0, (INT_PTR)_T("History")}, + {0, gFullScreenCommandID, TBSTATE_ENABLED, BTNS_BUTTON, {0}, 0, (INT_PTR)_T("Full Screen")}, + {propertiesImageIndex, gPropertiesCommandID, TBSTATE_ENABLED, BTNS_BUTTON, {0}, 0, (INT_PTR)_T("Properties")}, + {cutImageIndex, gCutCommandID, TBSTATE_ENABLED, BTNS_BUTTON, {0}, 0, (INT_PTR)_T("Cut")}, + {copyImageIndex, gCopyCommandID, TBSTATE_ENABLED, BTNS_BUTTON, {0}, 0, (INT_PTR)_T("Copy")}, + {pasteImageIndex, gPasteCommandID, TBSTATE_ENABLED, BTNS_BUTTON, {0}, 0, (INT_PTR)_T("Paste")}, + {folderOptionsImageIndex, gFolderOptionsCommandID, TBSTATE_ENABLED, BTNS_BUTTON, {0}, 0, (INT_PTR)_T("Folder Options")}, +}; + +HRESULT STDMETHODCALLTYPE CToolsBand::SetSite(IUnknown* pUnkSite) +{ + HWND parentWindow; + IOleWindow *oleWindow; + HWND toolbar; + HRESULT hResult; + + if (fDockSite != NULL) + fDockSite->Release(); + if (pUnkSite == NULL) + return S_OK; + hResult = pUnkSite->QueryInterface(IID_IDockingWindowSite, (void **)&fDockSite); + if (FAILED(hResult)) + return hResult; + parentWindow = NULL; + hResult = pUnkSite->QueryInterface(IID_IOleWindow, (void **)&oleWindow); + if (SUCCEEDED(hResult)) + { + oleWindow->GetWindow(&parentWindow); + oleWindow->Release(); + } + if (!::IsWindow(parentWindow)) + return E_FAIL; + + toolbar = CreateWindowEx(TBSTYLE_EX_DOUBLEBUFFER, TOOLBARCLASSNAMEW, _T(""), WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | + WS_CLIPCHILDREN | TBSTYLE_TOOLTIPS | TBSTYLE_TRANSPARENT | TBSTYLE_REGISTERDROP | TBSTYLE_LIST | TBSTYLE_FLAT | + CCS_NODIVIDER | CCS_NOPARENTALIGN | CCS_NORESIZE | CCS_TOP, 0, 0, 500, 20, parentWindow, NULL, + _AtlBaseModule.GetModuleInstance(), 0); + if (toolbar == NULL) + return E_FAIL; + SubclassWindow(toolbar); + + SendMessage(WM_USER + 100, GetSystemMetrics(SM_CXEDGE) / 2, 0); + SendMessage(TB_BUTTONSTRUCTSIZE, sizeof(TBBUTTON), 0); + SendMessage(TB_SETMAXTEXTROWS, 1, 0); + SendMessage(TB_SETEXTENDEDSTYLE, TBSTYLE_EX_HIDECLIPPEDBUTTONS | TBSTYLE_EX_MIXEDBUTTONS | TBSTYLE_EX_DRAWDDARROWS, TBSTYLE_EX_HIDECLIPPEDBUTTONS | TBSTYLE_EX_MIXEDBUTTONS | TBSTYLE_EX_DRAWDDARROWS); + + HINSTANCE shell32Instance = GetModuleHandle(_T("shell32.dll")); + HBITMAP imageBitmap = (HBITMAP)LoadImage(shell32Instance, MAKEINTRESOURCE(214), IMAGE_BITMAP, 0, 0, LR_DEFAULTSIZE | LR_CREATEDIBSECTION); + + DIBSECTION bitmapInfo; + GetObjectW(imageBitmap, sizeof(bitmapInfo), &bitmapInfo); + HIMAGELIST imageList = ImageList_Create(bitmapInfo.dsBm.bmHeight, bitmapInfo.dsBm.bmHeight, ILC_COLOR32, 4, 4); + + ImageList_Add(imageList, imageBitmap, NULL); + DeleteObject(imageBitmap); + + SendMessage(TB_SETIMAGELIST, 0, (LPARAM)imageList); + + SendMessage(TB_ADDBUTTONSW, numShownButtons, (LPARAM)&tbButtonsAdd); + + return hResult; +} + +HRESULT STDMETHODCALLTYPE CToolsBand::GetSite(REFIID riid, void **ppvSite) +{ + if (fDockSite == NULL) + return E_FAIL; + return fDockSite->QueryInterface(riid, ppvSite); +} + +HRESULT STDMETHODCALLTYPE CToolsBand::GetWindow(HWND *lphwnd) +{ + if (lphwnd == NULL) + return E_POINTER; + *lphwnd = m_hWnd; + return S_OK; +} + +HRESULT STDMETHODCALLTYPE CToolsBand::ContextSensitiveHelp(BOOL fEnterMode) +{ + + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CToolsBand::CloseDW(DWORD dwReserved) +{ + ShowDW(FALSE); + + if (IsWindow()) + DestroyWindow(); + + m_hWnd = NULL; + + return S_OK; +} + +HRESULT STDMETHODCALLTYPE CToolsBand::ResizeBorderDW(const RECT* prcBorder, IUnknown* punkToolbarSite, BOOL fReserved) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CToolsBand::ShowDW(BOOL fShow) +{ + if (m_hWnd) + { + if (fShow) + ShowWindow(SW_SHOW); + else + ShowWindow(SW_HIDE); + } + return S_OK; +} + +HRESULT STDMETHODCALLTYPE CToolsBand::HasFocusIO() +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CToolsBand::TranslateAcceleratorIO(LPMSG lpMsg) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CToolsBand::UIActivateIO(BOOL fActivate, LPMSG lpMsg) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CToolsBand::GetClassID(CLSID *pClassID) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CToolsBand::IsDirty() +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CToolsBand::Load(IStream *pStm) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CToolsBand::Save(IStream *pStm, BOOL fClearDirty) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CToolsBand::GetSizeMax(ULARGE_INTEGER *pcbSize) +{ + return E_NOTIMPL; +} + +LRESULT CToolsBand::OnGetButtonInfo(UINT idControl, NMHDR *pNMHDR, BOOL &bHandled) +{ + TBNOTIFYW *pTBntf = (TBNOTIFYW *)pNMHDR; + + if (pTBntf->iItem >= 0 && pTBntf->iItem < (numShownButtons + numHiddenButtons)) + { + pTBntf->tbButton = tbButtonsAdd[pTBntf->iItem]; + return TRUE; + } + else + return FALSE; + return 0; +} + +HRESULT CreateToolsBar(REFIID riid, void **ppv) +{ + CComObject *theMenuBar; + HRESULT hResult; + + if (ppv == NULL) + return E_POINTER; + *ppv = NULL; + ATLTRY (theMenuBar = new CComObject); + if (theMenuBar == NULL) + return E_OUTOFMEMORY; + hResult = theMenuBar->QueryInterface (riid, (void **)ppv); + if (FAILED (hResult)) + { + delete theMenuBar; + return hResult; + } + return S_OK; +} + diff --git a/reactos/dll/win32/browseui/travellog.cpp b/reactos/dll/win32/browseui/travellog.cpp new file mode 100644 index 00000000000..d05daa27175 --- /dev/null +++ b/reactos/dll/win32/browseui/travellog.cpp @@ -0,0 +1,592 @@ +/* + * ReactOS Explorer + * + * Copyright 2009 Andrew Hill + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +/* +Implements a class that keeps track of a PIDL history and allows +navigation forward and backward. This really should be in shdocvw, but it +is not registered for external instantiation, and the entire IBrowserService +hierarchy that normally spans browseui and shdocvw are collapsed into one +hierarchy in browseui, so I am moving it to browseui for now. If someone +decides to refactor code later, it wouldn't be difficult to move it. + +TODO: +****Does original travel log update the current item in the Travel method before or after calling ITravelEntry::Invoke? +****Change to load maximum size from registry +****Add code to track current size +****Fix InsertMenuEntries to not exceed limit of menu item ids provided. Perhaps the method should try to be intelligent and if there are + too many items, center around the current item? Could cause dispatch problems... +****Move tool tip text templates to resources + **Simplify code in InsertMenuEntries + Implement UpdateExternal + Implement FindTravelEntry + Implement Clone + Implement Revert + +*/ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +class CTravelEntry : + public CComObjectRootEx, + public ITravelEntry +{ +public: + CTravelEntry *fNextEntry; + CTravelEntry *fPreviousEntry; +private: + LPITEMIDLIST fPIDL; + HGLOBAL fPersistState; +public: + CTravelEntry(); + ~CTravelEntry(); + HRESULT GetToolTipText(IUnknown *punk, LPWSTR pwzText) const; + long GetSize() const; + + // *** ITravelEntry methods *** + virtual HRESULT STDMETHODCALLTYPE Invoke(IUnknown *punk); + virtual HRESULT STDMETHODCALLTYPE Update(IUnknown *punk, BOOL fIsLocalAnchor); + virtual HRESULT STDMETHODCALLTYPE GetPidl(LPITEMIDLIST *ppidl); + +BEGIN_COM_MAP(CTravelEntry) + COM_INTERFACE_ENTRY_IID(IID_ITravelEntry, ITravelEntry) +END_COM_MAP() +}; + +class CTravelLog : + public CComObjectRootEx, + public ITravelLog +{ +private: + CTravelEntry *fListHead; + CTravelEntry *fListTail; + CTravelEntry *fCurrentEntry; + long fMaximumSize; + long fCurrentSize; + unsigned long fEntryCount; +public: + CTravelLog(); + ~CTravelLog(); + HRESULT Initialize(); + HRESULT FindRelativeEntry(int offset, CTravelEntry **foundEntry); + void DeleteChain(CTravelEntry *startHere); + void AppendEntry(CTravelEntry *afterEntry, CTravelEntry *newEntry); +public: + + // *** ITravelLog methods *** + virtual HRESULT STDMETHODCALLTYPE AddEntry(IUnknown *punk, BOOL fIsLocalAnchor); + virtual HRESULT STDMETHODCALLTYPE UpdateEntry(IUnknown *punk, BOOL fIsLocalAnchor); + virtual HRESULT STDMETHODCALLTYPE UpdateExternal(IUnknown *punk, IUnknown *punkHLBrowseContext); + virtual HRESULT STDMETHODCALLTYPE Travel(IUnknown *punk, int iOffset); + virtual HRESULT STDMETHODCALLTYPE GetTravelEntry(IUnknown *punk, int iOffset, ITravelEntry **ppte); + virtual HRESULT STDMETHODCALLTYPE FindTravelEntry(IUnknown *punk, LPCITEMIDLIST pidl, ITravelEntry **ppte); + virtual HRESULT STDMETHODCALLTYPE GetToolTipText(IUnknown *punk, int iOffset, int idsTemplate, LPWSTR pwzText, DWORD cchText); + virtual HRESULT STDMETHODCALLTYPE InsertMenuEntries(IUnknown *punk, HMENU hmenu, int nPos, int idFirst, int idLast, DWORD dwFlags); + virtual HRESULT STDMETHODCALLTYPE Clone(ITravelLog **pptl); + virtual DWORD STDMETHODCALLTYPE CountEntries(IUnknown *punk); + virtual HRESULT STDMETHODCALLTYPE Revert(); + +BEGIN_COM_MAP(CTravelLog) + COM_INTERFACE_ENTRY_IID(IID_ITravelLog, ITravelLog) +END_COM_MAP() +}; + +CTravelEntry::CTravelEntry() +{ + fNextEntry = NULL; + fPreviousEntry = NULL; + fPIDL = NULL; + fPersistState = NULL; +} + +CTravelEntry::~CTravelEntry() +{ + ILFree(fPIDL); + GlobalFree(fPersistState); +} + +HRESULT CTravelEntry::GetToolTipText(IUnknown *punk, LPWSTR pwzText) const +{ + HRESULT hResult; + + hResult = ILGetDisplayNameEx(NULL, fPIDL, pwzText, ILGDN_NORMAL); + if (FAILED(hResult)) + return hResult; + return S_OK; +} + +long CTravelEntry::GetSize() const +{ + return 0; +} + +HRESULT STDMETHODCALLTYPE CTravelEntry::Invoke(IUnknown *punk) +{ + CComPtr persistHistory; + CComPtr globalStream; + HRESULT hResult; + + hResult = punk->QueryInterface(IID_IPersistHistory, (void **)&persistHistory); + if (FAILED(hResult)) + return hResult; + hResult = CreateStreamOnHGlobal(fPersistState, FALSE, &globalStream); + if (FAILED(hResult)) + return hResult; + hResult = persistHistory->LoadHistory(globalStream, NULL); + if (FAILED(hResult)) + return hResult; + return S_OK; +} + +HRESULT STDMETHODCALLTYPE CTravelEntry::Update(IUnknown *punk, BOOL fIsLocalAnchor) +{ + CComPtr travelLogClient; + CComPtr persistHistory; + CComPtr globalStream; + WINDOWDATA windowData; + HGLOBAL globalStorage; + HRESULT hResult; + + ILFree(fPIDL); + fPIDL = NULL; + GlobalFree(fPersistState); + fPersistState = NULL; + hResult = punk->QueryInterface(IID_ITravelLogClient, (void **)&travelLogClient); + if (FAILED(hResult)) + return hResult; + hResult = travelLogClient->GetWindowData(&windowData); + if (FAILED(hResult)) + return hResult; + fPIDL = windowData.pidl; + // TODO: Properly free the windowData + hResult = punk->QueryInterface(IID_IPersistHistory, (void **)&persistHistory); + if (FAILED(hResult)) + return hResult; + globalStorage = GlobalAlloc(GMEM_FIXED, 0); + hResult = CreateStreamOnHGlobal(globalStorage, FALSE, &globalStream); + if (FAILED(hResult)) + return hResult; + hResult = persistHistory->SaveHistory(globalStream); + if (FAILED(hResult)) + return hResult; + hResult = GetHGlobalFromStream(globalStream, &fPersistState); + if (FAILED(hResult)) + return hResult; + return S_OK; +} + +HRESULT STDMETHODCALLTYPE CTravelEntry::GetPidl(LPITEMIDLIST *ppidl) +{ + if (ppidl == NULL) + return E_POINTER; + *ppidl = ILClone(fPIDL); + if (*ppidl == NULL) + return E_OUTOFMEMORY; + return S_OK; +} + +CTravelLog::CTravelLog() +{ + fListHead = NULL; + fListTail = NULL; + fCurrentEntry = NULL; + fMaximumSize = 0; + fCurrentSize = 0; + fEntryCount = 0; +} + +CTravelLog::~CTravelLog() +{ + CTravelEntry *anEntry; + CTravelEntry *next; + + anEntry = fListHead; + while (anEntry != NULL) + { + next = anEntry->fNextEntry; + anEntry->Release(); + anEntry = next; + } +} + +HRESULT CTravelLog::Initialize() +{ + fMaximumSize = 1024 * 1024; // TODO: change to read this from registry + // Software\Microsoft\Windows\CurrentVersion\Explorer\TravelLog + // MaxSize + return S_OK; +} + +HRESULT CTravelLog::FindRelativeEntry(int offset, CTravelEntry **foundEntry) +{ + CTravelEntry *curEntry; + + *foundEntry = NULL; + curEntry = fCurrentEntry; + if (offset < 0) + { + while (offset < 0 && curEntry != NULL) + { + curEntry = curEntry->fPreviousEntry; + offset++; + } + } + else + { + while (offset > 0 && curEntry != NULL) + { + curEntry = curEntry->fNextEntry; + offset--; + } + } + if (curEntry == NULL) + return E_INVALIDARG; + *foundEntry = curEntry; + return S_OK; +} + +void CTravelLog::DeleteChain(CTravelEntry *startHere) +{ + CTravelEntry *saveNext; + long itemSize; + + if (startHere->fPreviousEntry != NULL) + { + startHere->fPreviousEntry->fNextEntry = NULL; + fListTail = startHere->fPreviousEntry; + } + else + { + fListHead = NULL; + fListTail = NULL; + } + while (startHere != NULL) + { + saveNext = startHere->fNextEntry; + itemSize = startHere->GetSize(); + fCurrentSize -= itemSize; + startHere->Release(); + startHere = saveNext; + fEntryCount--; + } +} + +void CTravelLog::AppendEntry(CTravelEntry *afterEntry, CTravelEntry *newEntry) +{ + if (afterEntry == NULL) + { + fListHead = newEntry; + fListTail = newEntry; + } + else + { + newEntry->fNextEntry = afterEntry->fNextEntry; + afterEntry->fNextEntry = newEntry; + newEntry->fPreviousEntry = afterEntry; + if (newEntry->fNextEntry == NULL) + fListTail = newEntry; + else + newEntry->fNextEntry->fPreviousEntry = newEntry; + } + fEntryCount++; +} + +HRESULT STDMETHODCALLTYPE CTravelLog::AddEntry(IUnknown *punk, BOOL fIsLocalAnchor) +{ + CComObject *newEntry; + long itemSize; + + if (punk == NULL) + return E_INVALIDARG; + ATLTRY (newEntry = new CComObject); + if (newEntry == NULL) + return E_OUTOFMEMORY; + newEntry->AddRef(); + if (fCurrentEntry != NULL && fCurrentEntry->fNextEntry != NULL) + DeleteChain(fCurrentEntry->fNextEntry); + AppendEntry(fCurrentEntry, newEntry); + itemSize = newEntry->GetSize(); + fCurrentSize += itemSize; + fCurrentEntry = newEntry; + return S_OK; +} + +HRESULT STDMETHODCALLTYPE CTravelLog::UpdateEntry(IUnknown *punk, BOOL fIsLocalAnchor) +{ + if (punk == NULL) + return E_INVALIDARG; + if (fCurrentEntry == NULL) + return E_UNEXPECTED; + return fCurrentEntry->Update(punk, fIsLocalAnchor); +} + +HRESULT STDMETHODCALLTYPE CTravelLog::UpdateExternal(IUnknown *punk, IUnknown *punkHLBrowseContext) +{ + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CTravelLog::Travel(IUnknown *punk, int iOffset) +{ + CTravelEntry *destinationEntry; + HRESULT hResult; + + hResult = FindRelativeEntry(iOffset, &destinationEntry); + if (FAILED(hResult)) + return hResult; + fCurrentEntry = destinationEntry; + hResult = destinationEntry->Invoke(punk); + if (FAILED(hResult)) + return hResult; + return S_OK; +} + +HRESULT STDMETHODCALLTYPE CTravelLog::GetTravelEntry(IUnknown *punk, int iOffset, ITravelEntry **ppte) +{ + CTravelEntry *destinationEntry; + HRESULT hResult; + + hResult = FindRelativeEntry(iOffset, &destinationEntry); + if (FAILED(hResult)) + return hResult; + return destinationEntry->QueryInterface(IID_ITravelEntry, (void **)ppte); +} + +HRESULT STDMETHODCALLTYPE CTravelLog::FindTravelEntry(IUnknown *punk, LPCITEMIDLIST pidl, ITravelEntry **ppte) +{ + if (ppte == NULL) + return E_POINTER; + if (punk == NULL || pidl == NULL) + return E_INVALIDARG; + return E_NOTIMPL; +} + +HRESULT STDMETHODCALLTYPE CTravelLog::GetToolTipText(IUnknown *punk, int iOffset, int idsTemplate, LPWSTR pwzText, DWORD cchText) +{ + CTravelEntry *destinationEntry; + wchar_t tempString[MAX_PATH]; + wchar_t templateString[200]; + HRESULT hResult; + + if (pwzText == NULL) + return E_POINTER; + if (punk == NULL || cchText == 0) + return E_INVALIDARG; + hResult = FindRelativeEntry(iOffset, &destinationEntry); + if (FAILED(hResult)) + return hResult; + hResult = destinationEntry->GetToolTipText(punk, tempString); + if (FAILED(hResult)) + return hResult; + if (iOffset < 0) + { + wcscpy(templateString, L"Back to %s"); + } + else + { + wcscpy(templateString, L"Forward to %s"); + } + _snwprintf(pwzText, cchText, templateString, tempString); + return S_OK; +} + +static void FixAmpersands(wchar_t *buffer) +{ + wchar_t tempBuffer[MAX_PATH * 2]; + wchar_t ch; + wchar_t *srcPtr; + wchar_t *dstPtr; + + srcPtr = buffer; + dstPtr = tempBuffer; + while (*srcPtr != 0) + { + ch = *srcPtr++; + *dstPtr++ = ch; + if (ch == '&') + *dstPtr++ = '&'; + } + *dstPtr = 0; + wcscpy(buffer, tempBuffer); +} + +HRESULT STDMETHODCALLTYPE CTravelLog::InsertMenuEntries(IUnknown *punk, HMENU hmenu, int nPos, int idFirst, int idLast, DWORD dwFlags) +{ + CTravelEntry *currentItem; + MENUITEMINFO menuItemInfo; + wchar_t itemTextBuffer[MAX_PATH * 2]; + HRESULT hResult; + + // TLMENUF_BACK - include back entries + // TLMENUF_INCLUDECURRENT - include current entry, if TLMENUF_CHECKCURRENT then check the entry + // TLMENUF_FORE - include next entries + // if fore+back, list from oldest to newest + // if back, list from newest to oldest + // if fore, list from newest to oldest + + // don't forget to patch ampersands before adding to menu + if (punk == NULL) + return E_INVALIDARG; + if (idLast <= idFirst) + return E_INVALIDARG; + menuItemInfo.cbSize = sizeof(menuItemInfo); + menuItemInfo.fMask = MIIM_FTYPE | MIIM_ID | MIIM_STATE | MIIM_STRING; + menuItemInfo.fType = MFT_STRING; + menuItemInfo.wID = idFirst; + menuItemInfo.fState = MFS_ENABLED; + menuItemInfo.dwTypeData = itemTextBuffer; + if ((dwFlags & TLMENUF_BACK) != 0) + { + if ((dwFlags & TLMENUF_FORE) != 0) + { + currentItem = fCurrentEntry; + if (currentItem != NULL) + { + while (currentItem->fPreviousEntry != NULL) + currentItem = currentItem->fPreviousEntry; + } + while (currentItem != fCurrentEntry) + { + hResult = currentItem->GetToolTipText(punk, itemTextBuffer); + if (SUCCEEDED(hResult)) + { + FixAmpersands(itemTextBuffer); + if (InsertMenuItem(hmenu, nPos, TRUE, &menuItemInfo)) + { + nPos++; + menuItemInfo.wID++; + } + } + currentItem = currentItem->fNextEntry; + } + } + else + { + currentItem = fCurrentEntry; + if (currentItem != NULL) + currentItem = currentItem->fPreviousEntry; + while (currentItem != NULL) + { + hResult = currentItem->GetToolTipText(punk, itemTextBuffer); + if (SUCCEEDED(hResult)) + { + FixAmpersands(itemTextBuffer); + if (InsertMenuItem(hmenu, nPos, TRUE, &menuItemInfo)) + { + nPos++; + menuItemInfo.wID++; + } + } + currentItem = currentItem->fPreviousEntry; + } + } + } + if ((dwFlags & TLMENUF_INCLUDECURRENT) != 0) + { + if (fCurrentEntry != NULL) + { + hResult = fCurrentEntry->GetToolTipText(punk, itemTextBuffer); + if (SUCCEEDED(hResult)) + { + FixAmpersands(itemTextBuffer); + if ((dwFlags & TLMENUF_CHECKCURRENT) != 0) + menuItemInfo.fState |= MFS_CHECKED; + if (InsertMenuItem(hmenu, nPos, TRUE, &menuItemInfo)) + { + nPos++; + menuItemInfo.wID++; + } + menuItemInfo.fState &= ~MFS_CHECKED; + } + } + } + if ((dwFlags & TLMENUF_FORE) != 0) + { + currentItem = fCurrentEntry; + if (currentItem != NULL) + currentItem = currentItem->fNextEntry; + while (currentItem != NULL) + { + hResult = currentItem->GetToolTipText(punk, itemTextBuffer); + if (SUCCEEDED(hResult)) + { + FixAmpersands(itemTextBuffer); + if (InsertMenuItem(hmenu, nPos, TRUE, &menuItemInfo)) + { + nPos++; + menuItemInfo.wID++; + } + } + currentItem = currentItem->fNextEntry; + } + } + return S_OK; +} + +HRESULT STDMETHODCALLTYPE CTravelLog::Clone(ITravelLog **pptl) +{ + if (pptl == NULL) + return E_POINTER; + *pptl = NULL; + // duplicate the log + return E_NOTIMPL; +} + +DWORD STDMETHODCALLTYPE CTravelLog::CountEntries(IUnknown *punk) +{ + if (punk == NULL) + return E_INVALIDARG; + return fEntryCount; +} + +HRESULT STDMETHODCALLTYPE CTravelLog::Revert() +{ + // remove the current entry? + return E_NOTIMPL; +} + +HRESULT CreateTravelLog(REFIID riid, void **ppv) +{ + CComObject *theTravelLog; + HRESULT hResult; + + if (ppv == NULL) + return E_POINTER; + *ppv = NULL; + ATLTRY (theTravelLog = new CComObject); + if (theTravelLog == NULL) + return E_OUTOFMEMORY; + hResult = theTravelLog->QueryInterface (riid, (void **)ppv); + if (FAILED (hResult)) + { + delete theTravelLog; + return hResult; + } + hResult = theTravelLog->Initialize(); + if (FAILED(hResult)) + return hResult; + return S_OK; +} diff --git a/reactos/dll/win32/browseui/utility.cpp b/reactos/dll/win32/browseui/utility.cpp new file mode 100644 index 00000000000..dd1367367f7 --- /dev/null +++ b/reactos/dll/win32/browseui/utility.cpp @@ -0,0 +1,14 @@ + +#include +#include "utility.h" + +void *operator new(size_t size) +{ + return LocalAlloc(LMEM_ZEROINIT, size); +} + +void operator delete(void *p) +{ + LocalFree(p); +} + diff --git a/reactos/dll/win32/browseui/utility.h b/reactos/dll/win32/browseui/utility.h new file mode 100644 index 00000000000..4c73abb0d59 --- /dev/null +++ b/reactos/dll/win32/browseui/utility.h @@ -0,0 +1,8 @@ + +#ifndef _utility_h +#define _utility_h + +void *operator new(size_t size); +void operator delete(void *p); + +#endif // _utility_h diff --git a/reactos/dll/win32/shell32/desktop.c b/reactos/dll/win32/shell32/desktop.c index 252f8fab0e2..131e3cc263e 100644 --- a/reactos/dll/win32/shell32/desktop.c +++ b/reactos/dll/win32/shell32/desktop.c @@ -45,7 +45,7 @@ typedef struct _SHDESK HWND hWnd; HWND hWndShellView; HWND hWndDesktopListView; - IShellDesktop *ShellDesk; + IShellDesktopTray *ShellDesk; IShellView *DesktopView; IShellBrowser *DefaultShellBrowser; LPITEMIDLIST pidlDesktopDirectory; @@ -104,7 +104,7 @@ static void SHDESK_Free(SHDESK *This) { if (This->ShellDesk != NULL) - IShellDesktop_Release(This->ShellDesk); + IShellDesktopTray_Release(This->ShellDesk); if (This->DesktopView != NULL) { @@ -202,12 +202,12 @@ static PSHDESK SHDESK_Create(HWND hWnd, LPCREATESTRUCT lpCreateStruct) { IShellFolder *psfDesktopFolder; - IShellDesktop *ShellDesk; + IShellDesktopTray *ShellDesk; CSFV csfv; SHDESK *This; HRESULT hRet; - ShellDesk = (IShellDesktop *)lpCreateStruct->lpCreateParams; + ShellDesk = (IShellDesktopTray *)lpCreateStruct->lpCreateParams; if (ShellDesk == NULL) { WARN("No IShellDesk interface provided!"); @@ -226,7 +226,7 @@ SHDESK_Create(HWND hWnd, LPCREATESTRUCT lpCreateStruct) This->Ref = 1; This->hWnd = hWnd; This->ShellDesk = ShellDesk; - IShellDesktop_AddRef(ShellDesk); + IShellDesktopTray_AddRef(ShellDesk); This->pidlDesktopDirectory = SHCloneSpecialIDList(This->hWnd, CSIDL_DESKTOPDIRECTORY, FALSE); hRet = SHGetSpecialFolderLocation(This->hWnd, CSIDL_DESKTOP, &This->pidlDesktop); @@ -632,7 +632,7 @@ ProgmanWindowProc(IN HWND hwnd, case WM_CREATE: { - IShellDesktop_RegisterDesktopWindow(This->ShellDesk, + IShellDesktopTray_RegisterDesktopWindow(This->ShellDesk, This->hWnd); if (!SHDESK_CreateDeskWnd(This)) @@ -698,7 +698,7 @@ RegisterProgmanWindowClass(VOID) * SHCreateDesktop [SHELL32.200] * */ -HANDLE WINAPI SHCreateDesktop(IShellDesktop *ShellDesk) +HANDLE WINAPI SHCreateDesktop(IShellDesktopTray *ShellDesk) { HWND hWndDesk; RECT rcDesk; diff --git a/reactos/dll/win32/shell32/precomp.h b/reactos/dll/win32/shell32/precomp.h index 66ed12a94b9..1c84e8a8a2e 100644 --- a/reactos/dll/win32/shell32/precomp.h +++ b/reactos/dll/win32/shell32/precomp.h @@ -22,8 +22,10 @@ #include #include +#include #include #include +#include #include #include #include diff --git a/reactos/dll/win32/shell32/she_ocmenu.c b/reactos/dll/win32/shell32/she_ocmenu.c index 929c6456090..c98a45acef7 100644 --- a/reactos/dll/win32/shell32/she_ocmenu.c +++ b/reactos/dll/win32/shell32/she_ocmenu.c @@ -81,7 +81,7 @@ typedef struct { #define MRUF_STRING_LIST 0 -typedef int (WINAPI *CREATEMRULISTW)( +typedef int (WINAPI *CREATEMRULISTPROCW)( LPMRUINFO lpmi ); @@ -111,9 +111,9 @@ void LoadItemFromHKCR(POPEN_WITH_CONTEXT pContext, WCHAR * szExt); void InsertOpenWithItem(POPEN_WITH_CONTEXT pContext, WCHAR * szAppName); static HMODULE hModule = NULL; -static CREATEMRULISTW CreateMRUListW = NULL; +static CREATEMRULISTPROCW CreateMRUListProcW = NULL; static ENUMMRULISTW EnumMRUListW = NULL; -static FREEMRULIST FreeMRUList = NULL; +static FREEMRULIST FreeMRUListProc = NULL; static ADDMRUSTRINGW AddMRUStringW = NULL; @@ -161,11 +161,11 @@ static HRESULT WINAPI SHEOWCm_fnQueryInterface(IContextMenu2 *iface, REFIID riid IsEqualIID(riid, &IID_IContextMenu) || IsEqualIID(riid, &IID_IContextMenu2)) { - *ppvObj = &This->lpVtblContextMenu; + *ppvObj = (void *)&This->lpVtblContextMenu; } else if(IsEqualIID(riid, &IID_IShellExtInit)) { - *ppvObj = &This->lpvtblShellExtInit; + *ppvObj = (void *)&This->lpvtblShellExtInit; } if(*ppvObj) @@ -451,7 +451,7 @@ StoreNewSettings(LPCWSTR szFileName, WCHAR *szAppName) result = (*AddMRUStringW)((HANDLE)hList, szAppName); /* close mru list */ - (*FreeMRUList)((HANDLE)hList); + (*FreeMRUListProc)((HANDLE)hList); /* create mru list key */ RegCloseKey(hKey); } @@ -1008,12 +1008,12 @@ OpenMRUList(HKEY hKey) wcscat(szPath, L"comctl32.dll"); hModule = LoadLibraryExW(szPath, NULL, 0); } - CreateMRUListW = (CREATEMRULISTW)GetProcAddress(hModule, MAKEINTRESOURCEA(400)); + CreateMRUListProcW = (CREATEMRULISTPROCW)GetProcAddress(hModule, MAKEINTRESOURCEA(400)); EnumMRUListW = (ENUMMRULISTW)GetProcAddress(hModule, MAKEINTRESOURCEA(403)); - FreeMRUList = (FREEMRULIST)GetProcAddress(hModule, MAKEINTRESOURCEA(152)); + FreeMRUListProc = (FREEMRULIST)GetProcAddress(hModule, MAKEINTRESOURCEA(152)); AddMRUStringW = (ADDMRUSTRINGW)GetProcAddress(hModule, MAKEINTRESOURCEA(401)); - if (!CreateMRUListW || !EnumMRUListW || !FreeMRUList || !AddMRUStringW) + if (!CreateMRUListProcW || !EnumMRUListW || !FreeMRUListProc || !AddMRUStringW) return 0; /* initialize mru list info */ @@ -1025,7 +1025,7 @@ OpenMRUList(HKEY hKey) info.lpfnCompare = NULL; /* load list */ - return (*CreateMRUListW)(&info); + return (*CreateMRUListProcW)(&info); } void diff --git a/reactos/dll/win32/shell32/shellitem.c b/reactos/dll/win32/shell32/shellitem.c index 613455011a7..75560aa640a 100644 --- a/reactos/dll/win32/shell32/shellitem.c +++ b/reactos/dll/win32/shell32/shellitem.c @@ -54,7 +54,7 @@ static HRESULT WINAPI ShellItem_QueryInterface(IShellItem *iface, REFIID riid, } else if (IsEqualIID(&IID_IPersist, riid) || IsEqualIID(&IID_IPersistIDList, riid)) { - *ppv = &(This->lpIPersistIDListVtbl); + *ppv = (IPersistIDListVtbl *)&(This->lpIPersistIDListVtbl); } else { FIXME("not implemented for %s\n", shdebugstr_guid(riid)); diff --git a/reactos/dll/win32/shell32/shelllink.c b/reactos/dll/win32/shell32/shelllink.c index 9aed7eb6bb9..67c678d5c7d 100644 --- a/reactos/dll/win32/shell32/shelllink.c +++ b/reactos/dll/win32/shell32/shelllink.c @@ -219,35 +219,35 @@ static HRESULT ShellLink_QueryInterface( IShellLinkImpl *This, REFIID riid, LPV } else if(IsEqualIID(riid, &IID_IShellLinkW)) { - *ppvObj = &(This->lpvtblw); + *ppvObj = (void *)&(This->lpvtblw); } else if(IsEqualIID(riid, &IID_IPersistFile)) { - *ppvObj = &(This->lpvtblPersistFile); + *ppvObj = (void *)&(This->lpvtblPersistFile); } else if(IsEqualIID(riid, &IID_IPersistStream)) { - *ppvObj = &(This->lpvtblPersistStream); + *ppvObj = (void *)&(This->lpvtblPersistStream); } else if(IsEqualIID(riid, &IID_IShellLinkDataList)) { - *ppvObj = &(This->lpvtblShellLinkDataList); + *ppvObj = (void *)&(This->lpvtblShellLinkDataList); } else if(IsEqualIID(riid, &IID_IShellExtInit)) { - *ppvObj = &(This->lpvtblShellExtInit); + *ppvObj = (void *)&(This->lpvtblShellExtInit); } else if(IsEqualIID(riid, &IID_IContextMenu)) { - *ppvObj = &(This->lpvtblContextMenu); + *ppvObj = (void *)&(This->lpvtblContextMenu); } else if(IsEqualIID(riid, &IID_IObjectWithSite)) { - *ppvObj = &(This->lpvtblObjectWithSite); + *ppvObj = (void *)&(This->lpvtblObjectWithSite); } else if(IsEqualIID(riid, &IID_IShellPropSheetExt)) { - *ppvObj = &(This->lpvtblPropSheetExt); + *ppvObj = (void *)&(This->lpvtblPropSheetExt); } if(*ppvObj) diff --git a/reactos/dll/win32/shell32/shellord.c b/reactos/dll/win32/shell32/shellord.c index 002a6bb8e8f..13d33c5fe9c 100644 --- a/reactos/dll/win32/shell32/shellord.c +++ b/reactos/dll/win32/shell32/shellord.c @@ -1124,7 +1124,7 @@ BOOL WINAPI DAD_DragEnter(HWND hwnd) * DAD_DragEnterEx [SHELL32.131] * */ -BOOL WINAPI DAD_DragEnterEx(HWND hwnd, const POINT p) +BOOL WINAPI DAD_DragEnterEx(HWND hwnd, POINT p) { FIXME("hwnd = %p (%d,%d)\n",hwnd,p.x,p.y); return FALSE; diff --git a/reactos/dll/win32/shell32/shfldr_desktop.c b/reactos/dll/win32/shell32/shfldr_desktop.c index c0515535cf4..db810ba87c7 100644 --- a/reactos/dll/win32/shell32/shfldr_desktop.c +++ b/reactos/dll/win32/shell32/shfldr_desktop.c @@ -81,11 +81,11 @@ static HRESULT WINAPI ISF_Desktop_fnQueryInterface( else if (IsEqualIID (riid, &IID_IPersistFolder) || IsEqualIID (riid, &IID_IPersistFolder2)) { - *ppvObj = &This->lpPF2; + *ppvObj = (void *)&This->lpPF2; } else if (IsEqualIID(riid, &IID_ISFHelper)) { - *ppvObj = &This->lpvtblSFHelper; + *ppvObj = (void *)&This->lpvtblSFHelper; } if (*ppvObj) { diff --git a/reactos/dll/win32/shell32/shfldr_mydocuments.c b/reactos/dll/win32/shell32/shfldr_mydocuments.c index d45ba8dff0a..8290a411e02 100644 --- a/reactos/dll/win32/shell32/shfldr_mydocuments.c +++ b/reactos/dll/win32/shell32/shfldr_mydocuments.c @@ -76,7 +76,7 @@ static HRESULT WINAPI ISF_MyDocuments_fnQueryInterface( else if (IsEqualIID (riid, &IID_IPersistFolder) || IsEqualIID (riid, &IID_IPersistFolder2)) { - *ppvObj = &This->lpPF2; + *ppvObj = (void *)&This->lpPF2; } if (*ppvObj) { diff --git a/reactos/dll/win32/shell32/shfldr_netplaces.c b/reactos/dll/win32/shell32/shfldr_netplaces.c index 3e1c7929287..e816cb91a01 100644 --- a/reactos/dll/win32/shell32/shfldr_netplaces.c +++ b/reactos/dll/win32/shell32/shfldr_netplaces.c @@ -119,7 +119,7 @@ static HRESULT WINAPI ISF_NetworkPlaces_fnQueryInterface (IShellFolder2 *iface, IsEqualIID (riid, &IID_IPersistFolder) || IsEqualIID (riid, &IID_IPersistFolder2)) { - *ppvObj = _IPersistFolder2_ (This); + *ppvObj = (void *)_IPersistFolder2_ (This); } if (*ppvObj) diff --git a/reactos/dll/win32/shell32/shfldr_recyclebin.c b/reactos/dll/win32/shell32/shfldr_recyclebin.c index eb17e4d89ef..855f4accd1e 100644 --- a/reactos/dll/win32/shell32/shfldr_recyclebin.c +++ b/reactos/dll/win32/shell32/shfldr_recyclebin.c @@ -152,16 +152,16 @@ static HRESULT WINAPI RecycleBin_QueryInterface(IShellFolder2 *iface, REFIID rii if (IsEqualGUID(riid, &IID_IPersist) || IsEqualGUID(riid, &IID_IPersistFolder) || IsEqualGUID(riid, &IID_IPersistFolder2)) - *ppvObject = &This->lpPersistFolderVtbl; + *ppvObject = (void *)&This->lpPersistFolderVtbl; else if (IsEqualIID(riid, &IID_IContextMenu) || IsEqualGUID(riid, &IID_IContextMenu2)) { This->lpContextMenu2 = &recycleBincmVtblFolder; - *ppvObject = &This->lpContextMenu2; + *ppvObject = (void *)&This->lpContextMenu2; } else if(IsEqualIID(riid, &IID_IShellExtInit)) { - *ppvObject = &(This->lpSEI); + *ppvObject = (void *)&(This->lpSEI); } if (*ppvObject != NULL) @@ -429,7 +429,7 @@ static HRESULT WINAPI RecycleBin_CreateViewObject(IShellFolder2 *iface, HWND hwn else if (IsEqualIID (riid, &IID_IContextMenu) || IsEqualIID (riid, &IID_IContextMenu2)) { This->lpContextMenu2 = &recycleBincmVtblFolder; - *ppv = &This->lpContextMenu2; + *ppv = (void *)&This->lpContextMenu2; This->refCount++; hr = S_OK; } diff --git a/reactos/dll/win32/shell32/shv_item_new.c b/reactos/dll/win32/shell32/shv_item_new.c index b1bc56e0273..b35d4a09c27 100644 --- a/reactos/dll/win32/shell32/shv_item_new.c +++ b/reactos/dll/win32/shell32/shv_item_new.c @@ -579,11 +579,11 @@ static HRESULT WINAPI INewItem_fnQueryInterface(INewMenuImpl * This, REFIID riid IsEqualIID(riid, &IID_IContextMenu) || IsEqualIID(riid, &IID_IContextMenu2)) { - *ppvObj = &This->lpVtblContextMenu; + *ppvObj = (void *)&This->lpVtblContextMenu; } else if(IsEqualIID(riid, &IID_IShellExtInit)) { - *ppvObj = &This->lpvtblShellExtInit; + *ppvObj = (void *)&This->lpvtblShellExtInit; } diff --git a/reactos/dll/win32/shell32/startmenu.c b/reactos/dll/win32/shell32/startmenu.c index 5b861d88a3f..5e81610deb7 100644 --- a/reactos/dll/win32/shell32/startmenu.c +++ b/reactos/dll/win32/shell32/startmenu.c @@ -103,15 +103,15 @@ static HRESULT WINAPI StartMenu_QueryInterface(IMenuPopup *iface, REFIID iid, LP if (IsEqualIID(iid, &IID_IUnknown) || IsEqualIID(iid, &IID_IOleWindow) || IsEqualIID(iid, &IID_IDeskBar) || IsEqualIID(iid, &IID_IMenuPopup)) { - *ppvOut = &This->vtbl; + *ppvOut = (void *)&This->vtbl; } else if (IsEqualIID(iid, &IID_IObjectWithSite)) { - *ppvOut = &This->objectSiteVtbl; + *ppvOut = (void *)&This->objectSiteVtbl; } else if (IsEqualIID(iid, &IID_IInitializeObject)) { - *ppvOut = &This->initObjectVtbl; + *ppvOut = (void *)&This->initObjectVtbl; } if (*ppvOut) diff --git a/reactos/dll/win32/shell32/stubs.c b/reactos/dll/win32/shell32/stubs.c index e12e2203099..2ac288701d3 100644 --- a/reactos/dll/win32/shell32/stubs.c +++ b/reactos/dll/win32/shell32/stubs.c @@ -14,6 +14,41 @@ WINE_DEFAULT_DEBUG_CHANNEL(shell); +/* + * Unimplemented + */ +HLOCAL +WINAPI +SHLocalAlloc(UINT uFlags, SIZE_T uBytes) +{ + FIXME("SHLocalAlloc() stub\n"); + return NULL; +} + +/* + * Unimplemented + */ +HLOCAL +WINAPI +SHLocalFree(HLOCAL hMem) +{ + FIXME("SHLocalFree() stub\n"); + return NULL; +} + +/* + * Unimplemented + */ +HLOCAL +WINAPI +SHLocalReAlloc(HLOCAL hMem, + SIZE_T uBytes, + UINT uFlags) +{ + FIXME("SHLocalReAlloc() stub\n"); + return NULL; +} + /* * Unimplemented */ @@ -901,7 +936,7 @@ PifMgr_CloseProperties(HANDLE hHandle, UINT uUnknown) BOOL WINAPI DAD_DragEnterEx2(HWND hwndTarget, - const POINT ptStart, + POINT ptStart, IDataObject *pdtObject) { FIXME("DAD_DragEnterEx2() stub\n"); diff --git a/reactos/dll/win32/shell32/undocshell.h b/reactos/dll/win32/shell32/undocshell.h index c56da79ffc2..8911967b694 100644 --- a/reactos/dll/win32/shell32/undocshell.h +++ b/reactos/dll/win32/shell32/undocshell.h @@ -548,33 +548,8 @@ BOOL WINAPI SHInitRestricted(LPCVOID unused, LPCVOID inpRegKey); /* Shell Desktop functions */ -#undef INTERFACE -#define INTERFACE IShellDesktop -DECLARE_INTERFACE_(IShellDesktop,IUnknown) -{ - /*** IUnknown ***/ - STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; - STDMETHOD_(ULONG,AddRef)(THIS) PURE; - STDMETHOD_(ULONG,Release)(THIS) PURE; - /*** IShellDesktopTray ***/ - STDMETHOD_(ULONG,GetState)(THIS) PURE; - STDMETHOD(GetTrayWindow)(THIS_ HWND*) PURE; - STDMETHOD(RegisterDesktopWindow)(THIS_ HWND) PURE; - STDMETHOD(Unknown)(THIS_ DWORD,DWORD) PURE; -}; -#undef INTERFACE - -#define IShellDesktop_QueryInterface(T,a,b) (T)->lpVtbl->QueryInterface(T,a,b) -#define IShellDesktop_AddRef(T) (T)->lpVtbl->AddRef(T) -#define IShellDesktop_Release(T) (T)->lpVtbl->Release(T) -#define IShellDesktop_GetState(T) (T)->lpVtbl->GetState(T) -#define IShellDesktop_GetTrayWindow(T,a) (T)->lpVtbl->GetTrayWindow(T,a) -#define IShellDesktop_RegisterDesktopWindow(T,a) (T)->lpVtbl->RegisterDesktopWindow(T,a) -#define IShellDesktop_Unknown(T,a,b) (T)->lpVtbl->Unknown(T,a,b) - #define WM_GETISHELLBROWSER (WM_USER+7) -HANDLE WINAPI SHCreateDesktop(IShellDesktop*); BOOL WINAPI SHDesktopMessageLoop(HANDLE); #define CSIDL_FOLDER_MASK 0x00ff diff --git a/reactos/include/dxsdk/axextend.idl b/reactos/include/dxsdk/axextend.idl index 723def70e5b..a5174b8a3d5 100644 --- a/reactos/include/dxsdk/axextend.idl +++ b/reactos/include/dxsdk/axextend.idl @@ -420,10 +420,6 @@ interface IOverlayNotify : IUnknown typedef IOverlayNotify *POVERLAYNOTIFY; -cpp_quote("#if 0") -typedef HANDLE HMONITOR; -cpp_quote("#endif /* 0 */") - [ object, local, diff --git a/reactos/include/psdk/commctrl.h b/reactos/include/psdk/commctrl.h index 9210c4d5f91..b9d2f588ebb 100644 --- a/reactos/include/psdk/commctrl.h +++ b/reactos/include/psdk/commctrl.h @@ -1935,6 +1935,8 @@ static const WCHAR REBARCLASSNAMEW[] = { 'R','e','B','a','r', #define RBN_MINMAX (RBN_FIRST-21) #define RBN_AUTOBREAK (RBN_FIRST-22) +#define RBSTR_CHANGERECT 0x0001 + typedef struct tagREBARINFO { UINT cbSize; diff --git a/reactos/include/psdk/guiddef.h b/reactos/include/psdk/guiddef.h index 2fc94676b58..b02e57e4972 100644 --- a/reactos/include/psdk/guiddef.h +++ b/reactos/include/psdk/guiddef.h @@ -110,6 +110,16 @@ typedef GUID FMTID,*LPFMTID; #endif /* !defined(__cplusplus) && !defined(CINTERFACE) */ #if defined(__cplusplus) && !defined(CINTERFACE) + +__inline int InlineIsEqualGUID(REFGUID rguid1, REFGUID rguid2) +{ + return ( + ((unsigned long *) &rguid1)[0] == ((unsigned long *) &rguid2)[0] && + ((unsigned long *) &rguid1)[1] == ((unsigned long *) &rguid2)[1] && + ((unsigned long *) &rguid1)[2] == ((unsigned long *) &rguid2)[2] && + ((unsigned long *) &rguid1)[3] == ((unsigned long *) &rguid2)[3]); +} + #define IsEqualGUID(rguid1, rguid2) (!memcmp(&(rguid1), &(rguid2), sizeof(GUID))) #else /* defined(__cplusplus) && !defined(CINTERFACE) */ #define IsEqualGUID(rguid1, rguid2) (!memcmp(rguid1, rguid2, sizeof(GUID))) diff --git a/reactos/include/psdk/shlguid.h b/reactos/include/psdk/shlguid.h index a68f631a971..6990466d99c 100644 --- a/reactos/include/psdk/shlguid.h +++ b/reactos/include/psdk/shlguid.h @@ -166,8 +166,23 @@ DEFINE_GUID(VID_Tile, 0x65f125e5, 0x7be1, 0x4810, 0xba, 0x9d, 0xd2, 0x71, DEFINE_GUID(VID_ThumbStrip, 0x8eefa624, 0xd1e9, 0x445b, 0x94, 0xb7, 0x74, 0xfb, 0xce, 0x2e, 0xa1, 0x1a); /* REACTOS ONLY */ -DEFINE_GUID(CLSID_NewMenu, 0xd969A300L,0xe7FF,0x11D0,0xA9,0x3B,0x00,0xA0,0xC9,0x0F,0x27,0x19); -DEFINE_GUID(IID_IShellFolderViewCB, 0x2047E320L, 0xF2A9, 0x11CE, 0xAE, 0x65, 0x08, 0x00, 0x2B, 0x2E, 0x12, 0x62); +DEFINE_GUID(CLSID_NewMenu, 0xd969A300, 0xe7FF, 0x11D0, 0xA9, 0x3B, 0x0, 0xA0, 0xC9, 0x0F, 0x27, 0x19); +DEFINE_GUID(IID_IShellFolderViewCB, 0x2047E320, 0xF2A9, 0x11CE, 0xAE, 0x65, 0x8, 0x00, 0x2B, 0x2E, 0x12, 0x62); +DEFINE_GUID(CLSID_InternetButtons, 0x1E796980, 0x9CC5, 0x11D1, 0xA8, 0x3F, 0x0, 0xC0, 0x4F, 0xC9, 0x9D, 0x61); + +DEFINE_GUID(SID_SMenuBandChild, 0xed9cc020, 0x08b9, 0x11d1, 0x98, 0x23, 0x0, 0xc0, 0x4f, 0xd9, 0x19, 0x72); +DEFINE_GUID(SID_SMenuBandParent, 0x8c278eec, 0x3eab, 0x11d1, 0x8c, 0xb0, 0x0, 0xc0, 0x4f, 0xd9, 0x18, 0xd0); +DEFINE_GUID(SID_SMenuPopup, 0xD1E7AFEB, 0x6A2E, 0x11d0, 0x8C, 0x78, 0x0, 0xC0, 0x4F, 0xD9, 0x18, 0xB4); +DEFINE_GUID(SID_SMenuBandBottomSelected, 0x165ebaf4, 0x6d51, 0x11d2, 0x83, 0xad, 0x0, 0xc0, 0x4f, 0xd9, 0x18, 0xd0); +DEFINE_GUID(SID_SMenuBandBottom, 0x743ca664, 0x0deb, 0x11d1, 0x98, 0x25, 0x0, 0xc0, 0x4f, 0xd9, 0x19, 0x72); +DEFINE_GUID(CLSID_ShellFldSetExt, 0x6D5313C0, 0x8C62, 0x11D1, 0xB2, 0xCD, 0x0, 0x60, 0x97, 0xDF, 0x8C, 0x11); +DEFINE_GUID(CGID_DefView, 0x4af07f10, 0xd231, 0x11d0, 0xb9, 0x42, 0x0, 0xa0, 0xc9, 0x03, 0x12, 0xe1); +DEFINE_GUID(CLSID_MenuBand, 0x5b4dae26, 0xb807, 0x11d0, 0x98, 0x15, 0x0, 0xc0, 0x4f, 0xd9, 0x19, 0x72); +//DEFINE_GUID(IID_IShellMenuCallback, 0xcb728b20, 0xf786, 0x11ce, 0xb9, 0x42, 0x0, 0xa0, 0xc9, 0x03, 0x12, 0xe1); +DEFINE_GUID(IID_IDeskBarClient, 0xEB0FE175, 0x1A3A, 0x11D0, 0x89, 0xB3, 0x0, 0xA0, 0xC9, 0x0A, 0x90, 0xAC); + +#define CGID_InternetButtons CLSID_InternetButtons + /* END REACTOS ONLY */ #endif /* __WINE_SHLGUID_H */ diff --git a/reactos/include/psdk/shlguid_undoc.h b/reactos/include/psdk/shlguid_undoc.h new file mode 100644 index 00000000000..5c16646ff91 --- /dev/null +++ b/reactos/include/psdk/shlguid_undoc.h @@ -0,0 +1,77 @@ + +DEFINE_GUID(CLSID_RebarBandSite, 0xECD4FC4D, 0x521C, 0x11D0, 0xB7, 0x92, 0x00, 0xA0, 0xC9, 0x03, 0x12, 0xE1); +DEFINE_GUID(CLSID_BandSiteMenu, 0xECD4FC4E, 0x521C, 0x11D0, 0xB7, 0x92, 0x00, 0xA0, 0xC9, 0x03, 0x12, 0xE1); +DEFINE_GUID(IID_IBandSiteHelper, 0xD1E7AFEA, 0x6A2E, 0x11D0, 0x8C, 0x78, 0x00, 0xC0, 0x4F, 0xD9, 0x18, 0xB4); +DEFINE_GUID(CLSID_PersonalStartMenu, 0x3F6953F0, 0x5359, 0x47FC, 0xBD, 0x99, 0x9F, 0x2C, 0xB9, 0x5A, 0x62, 0xFD); +DEFINE_GUID(IID_ITrayPriv, 0x4622AD10, 0xFF23, 0x11D0, 0x8D, 0x34, 0x00, 0xA0, 0xC9, 0x0F, 0x27, 0x19); +DEFINE_GUID(IID_ITrayPriv2, 0x9E83C057, 0xFF23, 0x6823, 0x1F, 0x4F, 0xBF, 0xA3, 0x74, 0x61, 0xD4, 0x0A); +DEFINE_GUID(IID_IShellMenu2, 0x6F51C646, 0x0EFE, 0x4370, 0x88, 0x2A, 0xC1, 0xF6, 0x1C, 0xB2, 0x7C, 0x3B); +DEFINE_GUID(IID_IWinEventHandler, 0xEA5F2D61, 0xE008, 0x11CF, 0x99, 0xCB, 0x00, 0xC0, 0x4F, 0xD6, 0x44, 0x97); +DEFINE_GUID(IID_IShellMenuAcc, 0xFAF6FE96, 0xCE5E, 0x11D1, 0x83, 0x71, 0x00, 0xC0, 0x4F, 0xD9, 0x18, 0xD0); +DEFINE_GUID(IID_IShellBrowserService, 0x1307EE17, 0xEA83, 0x49EB, 0x96, 0xB2, 0x3A, 0x28, 0xE2, 0xD7, 0x04, 0x8A); +DEFINE_GUID(IID_IFolderView, 0xCDE725B0, 0xCCC9, 0x4519, 0x91, 0x7E, 0x32, 0x5D, 0x72, 0xFA, 0xB4, 0xCE); + +DEFINE_GUID(SID_SProxyBrowser, 0x20C46561, 0x8491, 0x11CF, 0x96, 0x0C, 0x00, 0x80, 0xC7, 0xF4, 0xEE, 0x85); + +// this class lives in shell32.dll +DEFINE_GUID(IID_IGlobalFolderSettings, 0xEF8AD2D3, 0xAE36, 0x11D1, 0xB2, 0xD2, 0x00, 0x60, 0x97, 0xDF, 0x8C, 0x11); +DEFINE_GUID(CLSID_GlobalFolderSettings, 0xEF8AD2D1, 0xAE36, 0x11D1, 0xB2, 0xD2, 0x00, 0x60, 0x97, 0xDF, 0x8C, 0x11); +DEFINE_GUID(IID_IRegTreeOptions, 0xAF4F6511, 0xF982, 0x11D0, 0x85, 0x95, 0x00, 0xAA, 0x00, 0x4C, 0xD6, 0xD8); +DEFINE_GUID(CLSID_CRegTreeOptions, 0xAF4F6510, 0xF982, 0x11D0, 0x85, 0x95, 0x00, 0xAA, 0x00, 0x4C, 0xD6, 0xD8); +DEFINE_GUID(IID_IExplorerToolbar, 0x8455F0C1, 0x158F, 0x11D0, 0x89, 0xAE, 0x00, 0xA0, 0xC9, 0x0A, 0x90, 0xAC); + +// not registered, lives in browseui.dll +DEFINE_GUID(CLSID_BrowserBar, 0x9581015C, 0xD08E, 0x11D0, 0x8D, 0x36, 0x00, 0xA0, 0xC9, 0x2D, 0xBF, 0xE8); + +DEFINE_GUID(CGID_DefViewFrame, 0x710EB7A1, 0x45ED, 0x11D0, 0x92, 0x4A, 0x00, 0x20, 0xAF, 0xC7, 0xAC, 0x4D); + +// browseui.dll +DEFINE_GUID(CLSID_SH_AddressBand, 0x01E04581, 0x4EEE, 0x11D0, 0xBF, 0xE9, 0x00, 0xAA, 0x00, 0x5B, 0x43, 0x83); +DEFINE_GUID(CLSID_AddressEditBox, 0xA08C11D2, 0xA228, 0x11D0, 0x82, 0x5B, 0x00, 0xAA, 0x00, 0x5B, 0x43, 0x83); +DEFINE_GUID(IID_IAddressEditBox, 0xA08C11D1, 0xA228, 0x11D0, 0x82, 0x5B, 0x00, 0xAA, 0x00, 0x5B, 0x43, 0x83); + +DEFINE_GUID(IID_IAddressBand, 0x106E86E1, 0x52B5, 0x11D0, 0xBF, 0xED, 0x00, 0xAA, 0x00, 0x5B, 0x43, 0x83); +DEFINE_GUID(CLSID_BrandBand, 0x22BF0C20, 0x6DA7, 0x11D0, 0xB3, 0x73, 0x00, 0xA0, 0xC9, 0x03, 0x49, 0x38); +DEFINE_GUID(SID_SBrandBand, 0x82A62DE8, 0x32AC, 0x4E4A, 0x99, 0x35, 0x90, 0x46, 0xC3, 0x78, 0xCF, 0x90); +DEFINE_GUID(CLSID_InternetToolbar, 0x5E6AB780, 0x7743, 0x11CF, 0xA1, 0x2B, 0x00, 0xAA, 0x00, 0x4A, 0xE8, 0x37); + +DEFINE_GUID(CGID_PrivCITCommands, 0x67077B95, 0x4F9D, 0x11D0, 0xB8, 0x84, 0x00, 0xAA, 0x00, 0xB6, 0x01, 0x04); +DEFINE_GUID(CGID_Theater, 0x0F12079C, 0xC193, 0x11D0, 0x8D, 0x49, 0x00, 0xC0, 0x4F, 0xC9, 0x9D, 0x61); +DEFINE_GUID(CGID_ShellBrowser, 0x3531F060, 0x22B3, 0x11D0, 0x96, 0x9E, 0x00, 0xAA, 0x00, 0xB6, 0x01, 0x04); + +DEFINE_GUID(CLSID_SearchBand, 0x2559A1F0, 0x21D7, 0x11D4, 0xBD, 0xAF, 0x00, 0xC0, 0x4F, 0x60, 0xB9, 0xF0); +DEFINE_GUID(CLSID_TipOfTheDayBand, 0x4D5C8C25, 0xD075, 0x11D0, 0xB4, 0x16, 0x00, 0xC0, 0x4F, 0xB9, 0x03, 0x76); +DEFINE_GUID(CLSID_DiscussBand, 0xBDEADE7F, 0xC265, 0x11D0, 0xBC, 0xED, 0x00, 0xA0, 0xC9, 0x0A, 0xB5, 0x0F); +DEFINE_GUID(CLSID_SH_FavBand, 0xEFA24E61, 0xB078, 0x11D0, 0x89, 0xE4, 0x00, 0xC0, 0x4F, 0xC9, 0xE2, 0x6E); +DEFINE_GUID(CLSID_SH_HistBand, 0xEFA24E62, 0xB078, 0x11D0, 0x89, 0xE4, 0x00, 0xC0, 0x4F, 0xC9, 0xE2, 0x6E); +DEFINE_GUID(CLSID_ExplorerBand, 0xEFA24E64, 0xB078, 0x11D0, 0x89, 0xE4, 0x00, 0xC0, 0x4F, 0xC9, 0xE2, 0x6E); +DEFINE_GUID(CLSID_SH_SearchBand, 0x21569614, 0xB795, 0x46B1, 0x85, 0xF4, 0xE7, 0x37, 0xA8, 0xDC, 0x09, 0xAD); +DEFINE_GUID(CLSID_FileSearchBand, 0xC4EE31F3, 0x4768, 0x11D2, 0x5C, 0xBE, 0x00, 0xA0, 0xC9, 0xA8, 0x3D, 0xA1); +// missing ResearchBand + +DEFINE_GUID(IID_IBandNavigate, 0x3697C30B, 0xCD88, 0x11D0, 0x8A, 0x3E, 0x00, 0xC0, 0x4F, 0xC9, 0xE2, 0x6E); +DEFINE_GUID(IID_INamespaceProxy, 0xCF1609EC, 0xFA4B, 0x4818, 0xAB, 0x01, 0x55, 0x64, 0x33, 0x67, 0xE6, 0x6D); +DEFINE_GUID(IID_IBandProxy, 0x208CE801, 0x754B, 0x11D0, 0x80, 0xCA, 0x00, 0xAA, 0x00, 0x5B, 0x43, 0x83); +DEFINE_GUID(CLSID_BandProxy, 0xF61FFEC1, 0x754F, 0x11D0, 0x80, 0xCA, 0x00, 0xAA, 0x00, 0x5B, 0x43, 0x83); +DEFINE_GUID(SID_IBandProxy, 0x80243AC1, 0x0569, 0x11D1, 0xA7, 0xAE, 0x00, 0x60, 0x97, 0xDF, 0x5B, 0xD4); +DEFINE_GUID(CLSID_ShellSearchExt, 0x169A0691, 0x8DF9, 0x11D1, 0xA1, 0xC4, 0x00, 0xC0, 0x4F, 0xD7, 0x5D, 0x13); + +DEFINE_GUID(CLSID_CommonButtons, 0x1E79697E, 0x9CC5, 0x11D1, 0xA8, 0x3F, 0x00, 0xC0, 0x4F, 0xC9, 0x9D, 0x61); + +DEFINE_GUID(CGID_BrandCmdGroup, 0x25019D8C, 0x9EE0, 0x45C0, 0x88, 0x3B, 0x97, 0x2D, 0x48, 0x32, 0x5E, 0x18); + +DEFINE_GUID(IID_INSCTree, 0x43A8F463, 0x4222, 0x11D2, 0xB6, 0x41, 0x00, 0x60, 0x97, 0xDF, 0x5B, 0xD4); +DEFINE_GUID(IID_INSCTree2, 0x801C1AD5, 0xC47C, 0x428C, 0x97, 0xAF, 0xE9, 0x91, 0xE4, 0x85, 0x7D, 0x97); + +DEFINE_GUID(IID_IInitializeObject, 0x4622AD16, 0xFF23, 0x11D0, 0x8D, 0x34, 0x00, 0xA0, 0xC9, 0x0F, 0x27, 0x19); +DEFINE_GUID(IID_IBanneredBar, 0x596A9A94, 0x013E, 0x11D1, 0x8D, 0x34, 0x00, 0xA0, 0xC9, 0x0F, 0x27, 0x19); + +#define CGID_IExplorerToolbar IID_IExplorerToolbar +#define SID_IExplorerToolbar IID_IExplorerToolbar +#define SID_ITargetFrame2 IID_ITargetFrame2 +#define SID_IWebBrowserApp IID_IWebBrowserApp +#define CGID_IDeskBand IID_IDeskBand +#define CGID_MenuBand CLSID_MenuBand +#define SID_STravelLogCursor IID_ITravelLogStg +#define SID_IBandSite IID_IBandSite + diff --git a/reactos/include/psdk/shlobj.h b/reactos/include/psdk/shlobj.h index 1e14332036d..3f12542304f 100644 --- a/reactos/include/psdk/shlobj.h +++ b/reactos/include/psdk/shlobj.h @@ -467,7 +467,7 @@ DECLARE_INTERFACE_(IProgressDialog,IUnknown) /* IDeskBarClient interface */ #define INTERFACE IDeskBarClient -DECLARE_INTERFACE_(IDeskBarClient,IUnknown) +DECLARE_INTERFACE_(IDeskBarClient,IOleWindow) { /*** IUnknown methods ***/ STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; @@ -1576,29 +1576,6 @@ HRESULT WINAPI SHOpenWithDialog( const OPENASINFO *poainfo ); -/***************************************************************************** - * IInitializeObject interface - */ -#undef INTERFACE -#define INTERFACE IInitializeObject - -DECLARE_INTERFACE_(IInitializeObject, IUnknown)//, "4622AD16-FF23-11d0-8D34-00A0C90F2719") -{ - STDMETHOD(QueryInterface) (THIS_ REFIID riid, void **ppv) PURE; - STDMETHOD_(ULONG,AddRef) (THIS) PURE; - STDMETHOD_(ULONG,Release) (THIS) PURE; - - STDMETHOD(Initialize)(THIS) PURE; -}; -#undef INTERFACE -#if !defined(__cplusplus) || defined(CINTERFACE) -#define IInitializeObject_QueryInterface(T,a,b) (T)->lpVtbl->QueryInterface(T,a,b) -#define IInitializeObject_AddRef(T) (T)->lpVtbl->AddRef(T) -#define IInitializeObject_Release(T) (T)->lpVtbl->Release(T) -#define IInitializeObject_Initialize(T) (T)->lpVtbl->Initialize(T) -#endif - - #define INTERFACE IShellIconOverlayIdentifier DEFINE_GUID(IID_IShellIconOverlayIdentifier, 0x0c6c4200L, 0xc589, 0x11d0, 0x99, 0x9a, 0x00, 0xc0, 0x4f, 0xd6, 0x55, 0xe1); @@ -1618,37 +1595,40 @@ DECLARE_INTERFACE_(IShellIconOverlayIdentifier, IUnknown) #undef INTERFACE -/***************************************************************************** - * IBanneredBar interface +/**************************************************************************** + * Travel log */ -enum -{ - BMICON_LARGE = 0, - BMICON_SMALL -}; -#define INTERFACE IBanneredBar -DECLARE_INTERFACE_(IBanneredBar, IUnknown)//, "596A9A94-013E-11d1-8D34-00A0C90F2719") -{ - STDMETHOD(QueryInterface) (THIS_ REFIID riid, void **ppv) PURE; - STDMETHOD_(ULONG,AddRef) (THIS) PURE; - STDMETHOD_(ULONG,Release) (THIS) PURE; - STDMETHOD(SetIconSize)(THIS_ DWORD iIcon) PURE; - STDMETHOD(GetIconSize)(THIS_ DWORD* piIcon) PURE; - STDMETHOD(SetBitmap)(THIS_ HBITMAP hBitmap) PURE; - STDMETHOD(GetBitmap)(THIS_ HBITMAP* phBitmap) PURE; +#define TLOG_BACK -1 +#define TLOG_FORE 1 +#define TLMENUF_INCLUDECURRENT 0x00000001 +#define TLMENUF_CHECKCURRENT (TLMENUF_INCLUDECURRENT | 0x00000002) +#define TLMENUF_BACK 0x00000010 // Default +#define TLMENUF_FORE 0x00000020 +#define TLMENUF_BACKANDFORTH (TLMENUF_BACK | TLMENUF_FORE | TLMENUF_INCLUDECURRENT) + +/***************************************************************************** + * IDockingWindowSite interface + */ +#define INTERFACE IDockingWindowSite +DECLARE_INTERFACE_(IDockingWindowSite, IOleWindow) +{ + // *** IUnknown methods *** + STDMETHOD(QueryInterface)(THIS_ REFIID riid, void **ppv) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + + // *** IOleWindow methods *** + STDMETHOD(GetWindow)(THIS_ HWND *lphwnd) PURE; + STDMETHOD(ContextSensitiveHelp)(THIS_ BOOL fEnterMode) PURE; + + // *** IDockingWindowSite methods *** + STDMETHOD(GetBorderDW)(THIS_ IUnknown *punkObj, LPRECT prcBorder) PURE; + STDMETHOD(RequestBorderSpaceDW)(THIS_ IUnknown *punkObj, LPCBORDERWIDTHS pbw) PURE; + STDMETHOD(SetBorderSpaceDW)(THIS_ IUnknown *punkObj, LPCBORDERWIDTHS pbw) PURE; }; #undef INTERFACE -#if !defined(__cplusplus) || defined(CINTERFACE) -#define IBanneredBar_QueryInterface(T,a,b) (T)->lpVtbl->QueryInterface(T,a,b) -#define IBanneredBar_AddRef(T) (T)->lpVtbl->AddRef(T) -#define IBanneredBar_Release(T) (T)->lpVtbl->Release(T) -#define IBanneredBar_SetIconSize(T,a) (T)->lpVtbl->SetIconSize(T,a) -#define IBanneredBar_GetIconSize(T,a) (T)->lpVtbl->GetIconSize(T,a) -#define IBanneredBar_SetBitmap(T,a) (T)->lpVtbl->SetBitmap(T,a) -#define IBanneredBar_GetBitmap(T,a) (T)->lpVtbl->GetBitmap(T,a) -#endif #ifdef __cplusplus } /* extern "C" */ diff --git a/reactos/include/psdk/shlobj_undoc.h b/reactos/include/psdk/shlobj_undoc.h new file mode 100644 index 00000000000..ef475f04649 --- /dev/null +++ b/reactos/include/psdk/shlobj_undoc.h @@ -0,0 +1,828 @@ +/* + * ReactOS undocumented shell interface + * + * Copyright 2009 Andrew Hill + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#ifndef __SHLOBJ_UNDOC__H +#define __SHLOBJ_UNDOC__H + +#ifdef __cplusplus +extern "C" { +#endif /* defined(__cplusplus) */ + +/***************************************************************************** + * New shellstate structure + */ +struct SHELLSTATE2 +{ + SHELLSTATE oldState; + long newState1; + long newState2; +}; + +/***************************************************************************** + * Header for persisted view state in cabinet windows + */ +struct persistState +{ + long dwSize; + long browseType; + long alwaysZero; + long browserIndex; + CLSID persistClass; + ULONG pidlSize; +}; + +/***************************************************************************** + * IInitializeObject interface + */ +#undef INTERFACE +#define INTERFACE IInitializeObject + +DECLARE_INTERFACE_(IInitializeObject, IUnknown)//, "4622AD16-FF23-11d0-8D34-00A0C90F2719") +{ + STDMETHOD(QueryInterface) (THIS_ REFIID riid, void **ppv) PURE; + STDMETHOD_(ULONG,AddRef) (THIS) PURE; + STDMETHOD_(ULONG,Release) (THIS) PURE; + + STDMETHOD(Initialize)(THIS) PURE; +}; +#undef INTERFACE +#if !defined(__cplusplus) || defined(CINTERFACE) +#define IInitializeObject_QueryInterface(T,a,b) (T)->lpVtbl->QueryInterface(T,a,b) +#define IInitializeObject_AddRef(T) (T)->lpVtbl->AddRef(T) +#define IInitializeObject_Release(T) (T)->lpVtbl->Release(T) +#define IInitializeObject_Initialize(T) (T)->lpVtbl->Initialize(T) +#endif + + +/***************************************************************************** + * IBanneredBar interface + */ +enum +{ + BMICON_LARGE = 0, + BMICON_SMALL +}; +#define INTERFACE IBanneredBar +DECLARE_INTERFACE_(IBanneredBar, IUnknown)//, "596A9A94-013E-11d1-8D34-00A0C90F2719") +{ + STDMETHOD(QueryInterface) (THIS_ REFIID riid, void **ppv) PURE; + STDMETHOD_(ULONG,AddRef) (THIS) PURE; + STDMETHOD_(ULONG,Release) (THIS) PURE; + + STDMETHOD(SetIconSize)(THIS_ DWORD iIcon) PURE; + STDMETHOD(GetIconSize)(THIS_ DWORD* piIcon) PURE; + STDMETHOD(SetBitmap)(THIS_ HBITMAP hBitmap) PURE; + STDMETHOD(GetBitmap)(THIS_ HBITMAP* phBitmap) PURE; + +}; +#undef INTERFACE + +#if !defined(__cplusplus) || defined(CINTERFACE) +#define IBanneredBar_QueryInterface(T,a,b) (T)->lpVtbl->QueryInterface(T,a,b) +#define IBanneredBar_AddRef(T) (T)->lpVtbl->AddRef(T) +#define IBanneredBar_Release(T) (T)->lpVtbl->Release(T) +#define IBanneredBar_SetIconSize(T,a) (T)->lpVtbl->SetIconSize(T,a) +#define IBanneredBar_GetIconSize(T,a) (T)->lpVtbl->GetIconSize(T,a) +#define IBanneredBar_SetBitmap(T,a) (T)->lpVtbl->SetBitmap(T,a) +#define IBanneredBar_GetBitmap(T,a) (T)->lpVtbl->GetBitmap(T,a) +#endif + +/***************************************************************************** + * IGlobalFolderSettings interface + */ +struct DEFFOLDERSETTINGS +{ + long offset0; +}; + +#undef INTERFACE +#define INTERFACE IGlobalFolderSettings +DECLARE_INTERFACE_(IGlobalFolderSettings, IUnknown) +{ + /*** IUnknown ***/ + STDMETHOD(QueryInterface)(THIS_ REFIID riid, void **ppv) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + /*** IGlobalFolderSettings ***/ + STDMETHOD(Get)(THIS_ struct DEFFOLDERSETTINGS *buffer, int theSize) PURE; + STDMETHOD(Set)(THIS_ const struct DEFFOLDERSETTINGS *buffer, int theSize, unsigned int param14) PURE; +}; +#undef INTERFACE + +/***************************************************************************** + * IStartMenuCallback interface + */ +#define INTERFACE IStartMenuCallback +DECLARE_INTERFACE_(IStartMenuCallback, IOleWindow) +{ + /*** IUnknown ***/ + STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + /*** IOleWindow methods ***/ + STDMETHOD_(HRESULT,GetWindow)(THIS_ HWND*) PURE; + STDMETHOD_(HRESULT,ContextSensitiveHelp)(THIS_ BOOL) PURE; + /*** IStartMenuCallback ***/ + STDMETHOD_(HRESULT,Execute)(THIS_ IShellFolder*,LPCITEMIDLIST) PURE; + STDMETHOD_(HRESULT,Unknown)(THIS_ PVOID,PVOID,PVOID,PVOID) PURE; + STDMETHOD_(HRESULT,AppendMenu)(THIS_ HMENU*) PURE; +}; +#undef INTERFACE + +#ifdef COBJMACROS +#define IStartMenuCallback_QueryInterface(T,a,b) (T)->lpVtbl->QueryInterface(T,a,b) +#define IStartMenuCallback_AddRef(T) (T)->lpVtbl->AddRef(T) +#define IStartMenuCallback_Release(T) (T)->lpVtbl->Release(T) +#define IStartMenuCallback_GetWindow(T,a) (T)->lpVtbl->GetWindow(T,a) +#define IStartMenuCallback_ContextSensitiveHelp(T,a) (T)->lpVtbl->ContextSensitiveHelp(T,a) +#define IStartMenuCallback_Execute(T,a,b) (T)->lpVtbl->Execute(T,a,b) +#define IStartMenuCallback_Unknown(T,a,b,c,d) (T)->lpVtbl->Unknown(T,a,b,c,d) +#define IStartMenuCallback_AppendMenu(T,a) (T)->lpVtbl->AppendMenu(T,a) +#endif + +/***************************************************************************** + * IBandSiteStreamCallback interface + */ +#define INTERFACE IBandSiteStreamCallback +DECLARE_INTERFACE_(IBandSiteStreamCallback, IUnknown) +{ + /*** IUnknown ***/ + STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + /*** IBandSiteStreamCallback ***/ + STDMETHOD_(HRESULT,OnLoad)(THIS_ IStream *pStm, REFIID riid, PVOID *pvObj) PURE; + STDMETHOD_(HRESULT,OnSave)(THIS_ IUnknown *pUnk, IStream *pStm) PURE; +}; +#undef INTERFACE + +#ifdef COBJMACROS +#define IBandSiteStreamCallback_QueryInterface(T,a,b) (T)->lpVtbl->QueryInterface(T,a,b) +#define IBandSiteStreamCallback_AddRef(T) (T)->lpVtbl->AddRef(T) +#define IBandSiteStreamCallback_Release(T) (T)->lpVtbl->Release(T) +#define IBandSiteStreamCallback_OnLoad(T,a,b,c) (T)->lpVtbl->OnLoad(T,a,b,c) +#define IBandSiteStreamCallback_OnSave(T,a,b) (T)->lpVtbl->OnSave(T,a,b) +#endif + +/***************************************************************************** + * IShellDesktopTray interface + */ +#define INTERFACE IShellDesktopTray +DECLARE_INTERFACE_(IShellDesktopTray, IUnknown) +{ + /*** IUnknown ***/ + STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + /*** IShellDesktopTray ***/ + STDMETHOD_(ULONG,GetState)(THIS) PURE; + STDMETHOD(GetTrayWindow)(THIS_ HWND*) PURE; + STDMETHOD(RegisterDesktopWindow)(THIS_ HWND) PURE; + STDMETHOD(Unknown)(THIS_ DWORD,DWORD) PURE; +}; +#undef INTERFACE + +#ifdef COBJMACROS +#define IShellDesktopTray_QueryInterface(T,a,b) (T)->lpVtbl->QueryInterface(T,a,b) +#define IShellDesktopTray_AddRef(T) (T)->lpVtbl->AddRef(T) +#define IShellDesktopTray_Release(T) (T)->lpVtbl->Release(T) +#define IShellDesktopTray_GetState(T) (T)->lpVtbl->GetState(T) +#define IShellDesktopTray_GetTrayWindow(T,a) (T)->lpVtbl->GetTrayWindow(T,a) +#define IShellDesktopTray_RegisterDesktopWindow(T,a) (T)->lpVtbl->RegisterDesktopWindow(T,a) +#define IShellDesktopTray_Unknown(T,a,b) (T)->lpVtbl->Unknown(T,a,b) +#endif + +/***************************************************************************** + * INscTree interface + */ +#define INTERFACE INscTree +DECLARE_INTERFACE_(INscTree, IUnknown) +{ + /*** IUnknown ***/ + STDMETHOD(QueryInterface)(THIS_ REFIID riid, void **ppv) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + /*** INscTree ***/ + STDMETHOD(CreateTree)(THIS_ long paramC, long param10, long param14) PURE; + STDMETHOD(Initialize)(THIS_ long paramC, long param10, long param14) PURE; + STDMETHOD(ShowWindow)(THIS_ long paramC) PURE; + STDMETHOD(Refresh)(THIS) PURE; + STDMETHOD(GetSelectedItem)(THIS_ long paramC, long param10) PURE; + STDMETHOD(SetSelectedItem)(THIS_ long paramC, long param10, long param14, long param18) PURE; + STDMETHOD(GetNscMode)(THIS_ long paramC) PURE; + STDMETHOD(SetNscMode)(THIS_ long paramC) PURE; + STDMETHOD(GetSelectedItemName)(THIS_ long paramC, long param10) PURE; + STDMETHOD(BindToSelectedItemParent)(THIS_ long paramC, long param10, long param14) PURE; + STDMETHOD(InLabelEdit)(THIS) PURE; + STDMETHOD(RightPaneNavigationStarted)(THIS_ long paramC) PURE; + STDMETHOD(RightPaneNavigationFinished)(THIS_ long paramC) PURE; +}; +#undef INTERFACE + +#ifdef COBJMACROS +#define INscTree_QueryInterface(T,a,b) (T)->lpVtbl->QueryInterface(T,a,b) +#define INscTree_AddRef(T) (T)->lpVtbl->AddRef(T) +#define INscTree_Release(T) (T)->lpVtbl->Release(T) +#define INscTree_CreateTree(T,a,b,c) (T)->lpVtbl->CreateTree(T,a,b,c) +#define INscTree_Initialize(T,a,b,c) (T)->lpVtbl->Initialize(T,a,b,c) +#define INscTree_ShowWindow(T,a) (T)->lpVtbl->ShowWindow(T,a) +#define INscTree_Refresh(T) (T)->lpVtbl->Refresh(T) +#define INscTree_GetSelectedItem(T,a,b) (T)->lpVtbl->GetSelectedItem(T,a,b) +#define INscTree_SetSelectedItem(T,a,b,c,d) (T)->lpVtbl->SetSelectedItem(T,a,b,c,d) +#define INscTree_GetNscMode(T,a) (T)->lpVtbl->GetNscMode(T,a) +#define INscTree_SetNscMode(T,a) (T)->lpVtbl->SetNscMode(T,a) +#define INscTree_GetSelectedItemName(T,a,b) (T)->lpVtbl->GetSelectedItemName(T,a,b) +#define INscTree_BindToSelectedItemParent(T,a,b,c) (T)->lpVtbl->BindToSelectedItemParent(T,a,b,c) +#define INscTree_InLabelEdit(T) (T)->lpVtbl->InLabelEdit(T) +#define INscTree_RightPaneNavigationStarted(T,a) (T)->lpVtbl->RightPaneNavigationStarted(T,a) +#define INscTree_RightPaneNavigationFinished(T,a) (T)->lpVtbl->RightPaneNavigationFinished(T,a) +#endif + +/***************************************************************************** + * INscTree2 interface + */ +#define INTERFACE INscTree2 +DECLARE_INTERFACE_(INscTree2, INscTree) +{ + /*** IUnknown ***/ + STDMETHOD(QueryInterface)(THIS_ REFIID riid, void **ppv) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + /*** INscTree ***/ + STDMETHOD(CreateTree)(THIS_ long paramC, long param10, long param14) PURE; + STDMETHOD(Initialize)(THIS_ long paramC, long param10, long param14) PURE; + STDMETHOD(ShowWindow)(THIS_ long paramC) PURE; + STDMETHOD(Refresh)(THIS) PURE; + STDMETHOD(GetSelectedItem)(THIS_ long paramC, long param10) PURE; + STDMETHOD(SetSelectedItem)(THIS_ long paramC, long param10, long param14, long param18) PURE; + STDMETHOD(GetNscMode)(THIS_ long paramC) PURE; + STDMETHOD(SetNscMode)(THIS_ long paramC) PURE; + STDMETHOD(GetSelectedItemName)(THIS_ long paramC, long param10) PURE; + STDMETHOD(BindToSelectedItemParent)(THIS_ long paramC, long param10, long param14) PURE; + STDMETHOD(InLabelEdit)(THIS) PURE; + STDMETHOD(RightPaneNavigationStarted)(THIS_ long paramC) PURE; + STDMETHOD(RightPaneNavigationFinished)(THIS_ long paramC) PURE; + /*** INscTree2 ***/ + STDMETHOD(CreateTree2)(THIS_ long paramC, long param10, long param14, long param18) PURE; +}; +#undef INTERFACE + +#ifdef COBJMACROS +#define INscTree2_QueryInterface(T,a,b) (T)->lpVtbl->QueryInterface(T,a,b) +#define INscTree2_AddRef(T) (T)->lpVtbl->AddRef(T) +#define INscTree2_Release(T) (T)->lpVtbl->Release(T) +#define INscTree2_CreateTree(T,a,b,c) (T)->lpVtbl->CreateTree(T,a,b,c) +#define INscTree2_Initialize(T,a,b,c) (T)->lpVtbl->Initialize(T,a,b,c) +#define INscTree2_ShowWindow(T,a) (T)->lpVtbl->ShowWindow(T,a) +#define INscTree2_Refresh(T) (T)->lpVtbl->Refresh(T) +#define INscTree2_GetSelectedItem(T,a,b) (T)->lpVtbl->GetSelectedItem(T,a,b) +#define INscTree2_SetSelectedItem(T,a,b,c,d) (T)->lpVtbl->SetSelectedItem(T,a,b,c,d) +#define INscTree2_GetNscMode(T,a) (T)->lpVtbl->GetNscMode(T,a) +#define INscTree2_SetNscMode(T,a) (T)->lpVtbl->SetNscMode(T,a) +#define INscTree2_GetSelectedItemName(T,a,b) (T)->lpVtbl->GetSelectedItemName(T,a,b) +#define INscTree2_BindToSelectedItemParent(T,a,b,c) (T)->lpVtbl->BindToSelectedItemParent(T,a,b,c) +#define INscTree2_InLabelEdit(T) (T)->lpVtbl->InLabelEdit(T) +#define INscTree2_RightPaneNavigationStarted(T,a) (T)->lpVtbl->RightPaneNavigationStarted(T,a) +#define INscTree2_RightPaneNavigationFinished(T,a) (T)->lpVtbl->RightPaneNavigationFinished(T,a) +#define INscTree2_CreateTree2(T,a,b,c,d) (T)->lpVtbl->CreateTree2(T,a,b,c,d) +#endif + +/***************************************************************************** + * IAddressEditBox interface + */ +#define INTERFACE IAddressEditBox +DECLARE_INTERFACE_(IAddressEditBox, IUnknown) +{ + /*** IUnknown ***/ + STDMETHOD(QueryInterface)(THIS_ REFIID riid, void **ppv) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + /*** IAddressEditBox ***/ + STDMETHOD(Init)(THIS_ HWND comboboxEx, HWND editControl, long param14, IUnknown *param18) PURE; + STDMETHOD(SetCurrentDir)(THIS_ long paramC) PURE; + STDMETHOD(ParseNow)(THIS_ long paramC) PURE; + STDMETHOD(Execute)(THIS_ long paramC) PURE; + STDMETHOD(Save)(THIS_ long paramC) PURE; +}; +#undef INTERFACE + +#ifdef COBJMACROS +#define IAddressEditBox_QueryInterface(T,a,b) (T)->lpVtbl->QueryInterface(T,a,b) +#define IAddressEditBox_AddRef(T) (T)->lpVtbl->AddRef(T) +#define IAddressEditBox_Release(T) (T)->lpVtbl->Release(T) +#define IAddressEditBox_Init(T,a,b,c,d) (T)->lpVtbl->Init(T,a,b,c,d) +#define IAddressEditBox_SetCurrentDir(T,a) (T)->lpVtbl->SetCurrentDir(T,a) +#define IAddressEditBox_ParseNow(T,a) (T)->lpVtbl->ParseNow(T,a) +#define IAddressEditBox_Execute(T,a) (T)->lpVtbl->Execute(T,a) +#define IAddressEditBox_Save(T,a) (T)->lpVtbl->Save(T,a) +#endif + +/***************************************************************************** + * IBandProxy interface + */ +#define INTERFACE IBandProxy +DECLARE_INTERFACE_(IBandProxy, IUnknown) +{ + /*** IUnknown ***/ + STDMETHOD(QueryInterface)(THIS_ REFIID riid, void **ppv) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + /*** IBandProxy ***/ + STDMETHOD(SetSite)(THIS_ IUnknown *paramC) PURE; + STDMETHOD(CreateNewWindow)(THIS_ long paramC) PURE; + STDMETHOD(GetBrowserWindow)(THIS_ IUnknown **paramC) PURE; + STDMETHOD(IsConnected)(THIS) PURE; + STDMETHOD(NavigateToPIDL)(THIS_ LPCITEMIDLIST pidl) PURE; + STDMETHOD(NavigateToURL)(THIS_ long paramC, long param10) PURE; +}; +#undef INTERFACE + +#ifdef COBJMACROS +#define IBandProxy_QueryInterface(T,a,b) (T)->lpVtbl->QueryInterface(T,a,b) +#define IBandProxy_AddRef(T) (T)->lpVtbl->AddRef(T) +#define IBandProxy_Release(T) (T)->lpVtbl->Release(T) +#define IBandProxy_SetSite(T,a) (T)->lpVtbl->SetSite(T,a) +#define IBandProxy_CreateNewWindow(T,a) (T)->lpVtbl->CreateNewWindow(T,a) +#define IBandProxy_GetBrowserWindow(T,a) (T)->lpVtbl->GetBrowserWindow(T,a) +#define IBandProxy_IsConnected(T) (T)->lpVtbl->IsConnected(T) +#define IBandProxy_NavigateToPIDL(T,a) (T)->lpVtbl->NavigateToPIDL(T,a) +#define IBandProxy_NavigateToURL(T,a,b) (T)->lpVtbl->NavigateToURL(T,a,b) +#endif + +/***************************************************************************** + * IExplorerToolbar interface + */ +#define INTERFACE IExplorerToolbar +DECLARE_INTERFACE_(IExplorerToolbar, IUnknown) +{ + /*** IUnknown ***/ + STDMETHOD(QueryInterface)(THIS_ REFIID riid, void **ppv) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + /*** IExplorerToolbar ***/ + STDMETHOD(SetCommandTarget)(THIS_ IUnknown *theTarget, GUID *category, long param14) PURE; + STDMETHOD(Unknown1)(THIS) PURE; + STDMETHOD(AddButtons)(THIS_ const GUID *pguidCmdGroup, long buttonCount, TBBUTTON *buttons) PURE; + STDMETHOD(AddString)(THIS_ const GUID *pguidCmdGroup, HINSTANCE param10, LPCTSTR param14, long *param18) PURE; + STDMETHOD(GetButton)(THIS_ const GUID *paramC, long param10, long param14) PURE; + STDMETHOD(GetState)(THIS_ const GUID *pguidCmdGroup, long commandID, long *theState) PURE; + STDMETHOD(SetState)(THIS_ const GUID *pguidCmdGroup, long commandID, long theState) PURE; + STDMETHOD(AddBitmap)(THIS_ const GUID *pguidCmdGroup, long param10, long buttonCount, TBADDBITMAP *lParam, long *newIndex, COLORREF param20) PURE; + STDMETHOD(GetBitmapSize)(THIS_ long *paramC) PURE; + STDMETHOD(SendToolbarMsg)(THIS_ const GUID *pguidCmdGroup, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT *result) PURE; + STDMETHOD(SetImageList)(THIS_ const GUID *pguidCmdGroup, HIMAGELIST param10, HIMAGELIST param14, HIMAGELIST param18) PURE; + STDMETHOD(ModifyButton)(THIS_ const GUID *paramC, long param10, long param14) PURE; +}; +#undef INTERFACE + +#ifdef COBJMACROS +#define IExplorerToolbar_QueryInterface(T,a,b) (T)->lpVtbl->QueryInterface(T,a,b) +#define IExplorerToolbar_AddRef(T) (T)->lpVtbl->AddRef(T) +#define IExplorerToolbar_Release(T) (T)->lpVtbl->Release(T) +#define IExplorerToolbar_SetCommandTarget(T,a,b,c) (T)->lpVtbl->SetCommandTarget(T,a,b,c) +#define IExplorerToolbar_Unknown1(T) (T)->lpVtbl->Unknown1(T) +#define IExplorerToolbar_AddButtons(T,a,b,c) (T)->lpVtbl->AddButtons(T,a,b,c) +#define IExplorerToolbar_AddString(T,a,b,c,d) (T)->lpVtbl->AddString(T,a,b,c,d) +#define IExplorerToolbar_GetButton(T,a,b,c) (T)->lpVtbl->GetButton(T,a,b,c) +#define IExplorerToolbar_GetState(T,a,b,c) (T)->lpVtbl->GetState(T,a,b,c) +#define IExplorerToolbar_SetState(T,a,b,c) (T)->lpVtbl->SetState(T,a,b,c) +#define IExplorerToolbar_AddBitmap(T,a,b,c,d,e,f) (T)->lpVtbl->AddBitmap(T,a,b,c,d,e,f) +#define IExplorerToolbar_GetBitmapSize(T,a) (T)->lpVtbl->GetBitmapSize(T,a) +#define IExplorerToolbar_SendToolbarMsg(T,a,b,c,d,e) (T)->lpVtbl->SendToolbarMsg(T,a,b,c,d,e) +#define IExplorerToolbar_SetImageList(T,a,b,c,d) (T)->lpVtbl->SetImageList(T,a,b,c,d) +#define IExplorerToolbar_ModifyButton(T,a,b,c) (T)->lpVtbl->ModifyButton(T,a,b,c) +#endif + +/***************************************************************************** + * IRegTreeOptions interface + */ +typedef enum tagWALK_TREE_CMD +{ + WALK_TREE_OPTION0 = 0, + WALK_TREE_OPTION1 = 1, + WALK_TREE_OPTION2 = 2, + WALK_TREE_OPTION3 = 3 +} WALK_TREE_CMD; + +#define INTERFACE IRegTreeOptions +DECLARE_INTERFACE_(IRegTreeOptions, IUnknown) +{ + /*** IUnknown ***/ + STDMETHOD(QueryInterface)(THIS_ REFIID riid, void **ppv) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + /*** IRegTreeOptions ***/ + STDMETHOD(InitTree)(THIS_ HWND paramC, HKEY param10, char const *param14, char const *param18) PURE; + STDMETHOD(WalkTree)(THIS_ WALK_TREE_CMD paramC) PURE; + STDMETHOD(ToggleItem)(THIS_ HTREEITEM paramC) PURE; + STDMETHOD(ShowHelp)(THIS_ HTREEITEM paramC, unsigned long param10) PURE; +}; +#undef INTERFACE + +#ifdef COBJMACROS +#define IRegTreeOptions_QueryInterface(T,a,b) (T)->lpVtbl->QueryInterface(T,a,b) +#define IRegTreeOptions_AddRef(T) (T)->lpVtbl->AddRef(T) +#define IRegTreeOptions_Release(T) (T)->lpVtbl->Release(T) +#define IRegTreeOptions_InitTree(T,a,b,c,d) (T)->lpVtbl->InitTree(T,a,b,c,d) +#define IRegTreeOptions_WalkTree(T,a) (T)->lpVtbl->WalkTree(T,a) +#define IRegTreeOptions_ToggleItem(T,a) (T)->lpVtbl->ToggleItem(T,a) +#define IRegTreeOptions_ShowHelp(T,a,b) (T)->lpVtbl->ShowHelp(T,a,b) +#endif + +/***************************************************************************** + * IBandNavigate interface + */ +#define INTERFACE IBandNavigate +DECLARE_INTERFACE_(IBandNavigate, IUnknown) +{ + /*** IUnknown ***/ + STDMETHOD(QueryInterface)(THIS_ REFIID riid, void **ppv) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + /*** IBandNavigate ***/ + STDMETHOD(Select)(THIS_ long paramC) PURE; +}; +#undef INTERFACE + +#ifdef COBJMACROS +#define IBandNavigate_QueryInterface(T,a,b) (T)->lpVtbl->QueryInterface(T,a,b) +#define IBandNavigate_AddRef(T) (T)->lpVtbl->AddRef(T) +#define IBandNavigate_Release(T) (T)->lpVtbl->Release(T) +#define IBandNavigate_Select(T,a) (T)->lpVtbl->Select(T,a) +#endif + +/***************************************************************************** + * INamespaceProxy interface + */ +#define INTERFACE INamespaceProxy +DECLARE_INTERFACE_(INamespaceProxy, IUnknown) +{ + /*** IUnknown ***/ + STDMETHOD(QueryInterface)(THIS_ REFIID riid, void **ppv) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + /*** INamespaceProxy ***/ + STDMETHOD(GetNavigateTarget)(THIS_ long paramC, long param10, long param14) PURE; + STDMETHOD(Invoke)(THIS_ long paramC) PURE; + STDMETHOD(OnSelectionChanged)(THIS_ long paramC) PURE; + STDMETHOD(RefreshFlags)(THIS_ long paramC, long param10, long param14) PURE; + STDMETHOD(CacheItem)(THIS_ long paramC) PURE; +}; +#undef INTERFACE + +#ifdef COBJMACROS +#define INamespaceProxy_QueryInterface(T,a,b) (T)->lpVtbl->QueryInterface(T,a,b) +#define INamespaceProxy_AddRef(T) (T)->lpVtbl->AddRef(T) +#define INamespaceProxy_Release(T) (T)->lpVtbl->Release(T) +#define INamespaceProxy_GetNavigateTarget(T,a,b,c) (T)->lpVtbl->GetNavigateTarget(T,a,b,c) +#define INamespaceProxy_Invoke(T,a) (T)->lpVtbl->Invoke(T,a) +#define INamespaceProxy_OnSelectionChanged(T,a) (T)->lpVtbl->OnSelectionChanged(T,a) +#define INamespaceProxy_RefreshFlags(T,a,b,c) (T)->lpVtbl->RefreshFlags(T,a,b,c) +#define INamespaceProxy_CacheItem(T,a) (T)->lpVtbl->CacheItem(T,a) +#endif + +/***************************************************************************** + * IShellMenu2 interface + */ +#define INTERFACE IShellMenu2 +DECLARE_INTERFACE_(IShellMenu2, IShellMenu) +{ + /*** IUnknown ***/ + STDMETHOD(QueryInterface)(THIS_ REFIID riid, void **ppv) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + /*** IShellMenu ***/ + STDMETHOD(Initialize)(THIS_ IShellMenuCallback *psmc, UINT uId, UINT uIdAncestor, DWORD dwFlags) PURE; + STDMETHOD(GetMenuInfo)(THIS_ IShellMenuCallback **ppsmc, UINT *puId, UINT *puIdAncestor, DWORD *pdwFlags) PURE; + STDMETHOD(SetShellFolder)(THIS_ IShellFolder *psf, LPCITEMIDLIST pidlFolder, HKEY hKey, DWORD dwFlags) PURE; + STDMETHOD(GetShellFolder)(THIS_ DWORD *pdwFlags, LPITEMIDLIST *ppidl, REFIID riid, void **ppv) PURE; + STDMETHOD(SetMenu)(THIS_ HMENU hmenu, HWND hwnd, DWORD dwFlags) PURE; + STDMETHOD(GetMenu)(THIS_ HMENU *phmenu, HWND *phwnd, DWORD *pdwFlags) PURE; + STDMETHOD(InvalidateItem)(THIS_ LPSMDATA psmd, DWORD dwFlags) PURE; + STDMETHOD(GetState)(THIS_ LPSMDATA psmd) PURE; + STDMETHOD(SetMenuToolbar)(THIS_ IUnknown *punk, DWORD dwFlags) PURE; + /*** IShellMenu2 ***/ + STDMETHOD(GetSubMenu)(THIS) PURE; + STDMETHOD(SetToolbar)(THIS) PURE; + STDMETHOD(SetMinWidth)(THIS) PURE; + STDMETHOD(SetNoBorder)(THIS) PURE; + STDMETHOD(SetTheme)(THIS) PURE; +}; +#undef INTERFACE + +#ifdef COBJMACROS +#define IShellMenu2_QueryInterface(T,a,b) (T)->lpVtbl->QueryInterface(T,a,b) +#define IShellMenu2_AddRef(T) (T)->lpVtbl->AddRef(T) +#define IShellMenu2_Release(T) (T)->lpVtbl->Release(T) +#define IShellMenu2_Initialize(T,a,b,c,d) (T)->lpVtbl->Initialize(T,a,b,c,d) +#define IShellMenu2_GetMenuInfo(T,a,b,c,d) (T)->lpVtbl->GetMenuInfo(T,a,b,c,d) +#define IShellMenu2_SetShellFolder(T,a,b,c,d) (T)->lpVtbl->SetShellFolder(T,a,b,c,d) +#define IShellMenu2_GetShellFolder(T,a,b,c,d) (T)->lpVtbl->GetShellFolder(T,a,b,c,d) +#define IShellMenu2_SetMenu(T,a,b,c) (T)->lpVtbl->SetMenu(T,a,b,c) +#define IShellMenu2_GetMenu(T,a,b,c) (T)->lpVtbl->GetMenu(T,a,b,c) +#define IShellMenu2_InvalidateItem(T,a,b) (T)->lpVtbl->InvalidateItem(T,a,b) +#define IShellMenu2_GetState(T,a) (T)->lpVtbl->GetState(T,a) +#define IShellMenu2_SetMenuToolbar(T,a,b) (T)->lpVtbl->SetMenuToolbar(T,a,b) +#define IShellMenu2_GetSubMenu(T) (T)->lpVtbl->GetSubMenu(T) +#define IShellMenu2_SetToolbar(T) (T)->lpVtbl->SetToolbar(T) +#define IShellMenu2_SetMinWidth(T) (T)->lpVtbl->SetMinWidth(T) +#define IShellMenu2_SetNoBorder(T) (T)->lpVtbl->SetNoBorder(T) +#define IShellMenu2_SetTheme(T) (T)->lpVtbl->SetTheme(T) +#endif + +/***************************************************************************** + * IWinEventHandler interface + */ +#define INTERFACE IWinEventHandler +DECLARE_INTERFACE_(IWinEventHandler, IUnknown) +{ + /*** IUnknown ***/ + STDMETHOD(QueryInterface)(THIS_ REFIID riid, void **ppv) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + /*** IWinEventHandler ***/ + STDMETHOD(OnWinEvent)(THIS_ HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT *theResult) PURE; + STDMETHOD(IsWindowOwner)(THIS_ HWND hWnd) PURE; +}; +#undef INTERFACE + +#ifdef COBJMACROS +#define IWinEventHandler_QueryInterface(T,a,b) (T)->lpVtbl->QueryInterface(T,a,b) +#define IWinEventHandler_AddRef(T) (T)->lpVtbl->AddRef(T) +#define IWinEventHandler_Release(T) (T)->lpVtbl->Release(T) +#define IWinEventHandler_OnWinEvent(T,a,b,c,d,e) (T)->lpVtbl->OnWinEvent(T,a,b,c,d,e) +#define IWinEventHandler_IsWindowOwner(T,a) (T)->lpVtbl->IsWindowOwner(T,a) +#endif + +/***************************************************************************** + * IAddressBand interface + */ +#define INTERFACE IAddressBand +DECLARE_INTERFACE_(IAddressBand, IUnknown) +{ + /*** IUnknown ***/ + STDMETHOD(QueryInterface)(THIS_ REFIID riid, void **ppv) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + /*** IAddressBand ***/ + STDMETHOD(FileSysChange)(THIS_ long param8, long paramC) PURE; + STDMETHOD(Refresh)(THIS_ long param8) PURE; +}; +#undef INTERFACE + +#ifdef COBJMACROS +#define IAddressBand_QueryInterface(T,a,b) (T)->lpVtbl->QueryInterface(T,a,b) +#define IAddressBand_AddRef(T) (T)->lpVtbl->AddRef(T) +#define IAddressBand_Release(T) (T)->lpVtbl->Release(T) +#define IAddressBand_FileSysChange(T,a,b) (T)->lpVtbl->FileSysChange(T,a,b) +#define IAddressBand_Refresh(T,a) (T)->lpVtbl->Refresh(T,a) +#endif + +/***************************************************************************** + * IShellMenuAcc interface + */ +#define INTERFACE IShellMenuAcc +DECLARE_INTERFACE_(IShellMenuAcc, IUnknown) +{ + /*** IUnknown ***/ + STDMETHOD(QueryInterface)(THIS_ REFIID riid, void **ppv) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + /*** IShellMenuAcc ***/ + STDMETHOD(GetTop)(THIS) PURE; + STDMETHOD(GetBottom)(THIS) PURE; + STDMETHOD(GetTracked)(THIS) PURE; + STDMETHOD(GetParentSite)(THIS) PURE; + STDMETHOD(GetState)(THIS) PURE; + STDMETHOD(DoDefaultAction)(THIS) PURE; + STDMETHOD(GetSubMenu)(THIS) PURE; + STDMETHOD(IsEmpty)(THIS) PURE; +}; +#undef INTERFACE + +#ifdef COBJMACROS +#define IShellMenuAcc_QueryInterface(T,a,b) (T)->lpVtbl->QueryInterface(T,a,b) +#define IShellMenuAcc_AddRef(T) (T)->lpVtbl->AddRef(T) +#define IShellMenuAcc_Release(T) (T)->lpVtbl->Release(T) +#define IShellMenuAcc_GetTop(T) (T)->lpVtbl->GetTop(T) +#define IShellMenuAcc_GetBottom(T) (T)->lpVtbl->GetBottom(T) +#define IShellMenuAcc_GetTracked(T) (T)->lpVtbl->GetTracked(T) +#define IShellMenuAcc_GetParentSite(T) (T)->lpVtbl->GetParentSite(T) +#define IShellMenuAcc_GetState(T) (T)->lpVtbl->GetState(T) +#define IShellMenuAcc_DoDefaultAction(T) (T)->lpVtbl->DoDefaultAction(T) +#define IShellMenuAcc_GetSubMenu(T) (T)->lpVtbl->GetSubMenu(T) +#define IShellMenuAcc_IsEmpty(T) (T)->lpVtbl->IsEmpty(T) +#endif + +/***************************************************************************** + * IAddressBand interface + */ +#define INTERFACE IBandSiteHelper +DECLARE_INTERFACE_(IBandSiteHelper, IUnknown) +{ + /*** IUnknown ***/ + STDMETHOD(QueryInterface)(THIS_ REFIID riid, void **ppv) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + /*** IBandSiteHelper ***/ + STDMETHOD(LoadFromStreamBS)(THIS_ IStream *, REFGUID, void **) PURE; + STDMETHOD(SaveToStreamBS)(THIS_ IUnknown *, IStream *) PURE; +}; +#undef INTERFACE + +#ifdef COBJMACROS +#define IBandSiteHelper_QueryInterface(T,a,b) (T)->lpVtbl->QueryInterface(T,a,b) +#define IBandSiteHelper_AddRef(T) (T)->lpVtbl->AddRef(T) +#define IBandSiteHelper_Release(T) (T)->lpVtbl->Release(T) +#define IBandSiteHelper_LoadFromStreamBS(T,a,b) (T)->lpVtbl->LoadFromStreamBS(T,a,b) +#define IBandSiteHelper_SaveToStreamBS(T,a,b) (T)->lpVtbl->SaveToStreamBS(T,a,b) +#endif + +/***************************************************************************** + * IAddressBand interface + */ +#define INTERFACE IShellBrowserService +DECLARE_INTERFACE_(IShellBrowserService, IUnknown) +{ + /*** IUnknown ***/ + STDMETHOD(QueryInterface)(THIS_ REFIID riid, void **ppv) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + /*** IShellBrowserService ***/ + STDMETHOD(GetPropertyBag)(THIS_ long flags, REFIID riid, void **ppvObject) PURE; +}; +#undef INTERFACE + +#ifdef COBJMACROS +#define IShellBrowserService_QueryInterface(T,a,b) (T)->lpVtbl->QueryInterface(T,a,b) +#define IShellBrowserService_AddRef(T) (T)->lpVtbl->AddRef(T) +#define IShellBrowserService_Release(T) (T)->lpVtbl->Release(T) +#define IShellBrowserService_GetPropertyBag(T,a,b,c) (T)->lpVtbl->GetPropertyBag(T,a,b,c) +#endif + +/***************************************************************************** + * ITrayPriv interface + */ +#define INTERFACE ITrayPriv +DECLARE_INTERFACE_(ITrayPriv, IUnknown) +{ + /*** IUnknown ***/ + STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + /*** IOleWindow methods ***/ + STDMETHOD_(HRESULT,GetWindow)(THIS_ HWND*) PURE; + STDMETHOD_(HRESULT,ContextSensitiveHelp)(THIS_ BOOL) PURE; + /*** ITrayPriv ***/ + STDMETHOD_(HRESULT,Execute)(THIS_ IShellFolder*,LPCITEMIDLIST) PURE; + STDMETHOD_(HRESULT,Unknown)(THIS_ PVOID,PVOID,PVOID,PVOID) PURE; + STDMETHOD_(HRESULT,AppendMenu)(THIS_ HMENU*) PURE; +}; +#undef INTERFACE + +#ifdef COBJMACROS +#define ITrayPriv_QueryInterface(T,a,b) (T)->lpVtbl->QueryInterface(T,a,b) +#define ITrayPriv_AddRef(T) (T)->lpVtbl->AddRef(T) +#define ITrayPriv_Release(T) (T)->lpVtbl->Release(T) +#define ITrayPriv_GetWindow(T,a) (T)->lpVtbl->GetWindow(T,a) +#define ITrayPriv_ContextSensitiveHelp(T,a) (T)->lpVtbl->ContextSensitiveHelp(T,a) +#define ITrayPriv_Execute(T,a,b) (T)->lpVtbl->Execute(T,a,b) +#define ITrayPriv_Unknown(T,a,b,c,d) (T)->lpVtbl->Unknown(T,a,b,c,d) +#define ITrayPriv_AppendMenu(T,a) (T)->lpVtbl->AppendMenu(T,a) +#endif + +/***************************************************************************** + * Shell32 resources + */ +// these resources are in shell32.dll +#define IDB_GOBUTTON_NORMAL 0x0e6 +#define IDB_GOBUTTON_HOT 0x0e7 + +// band ids in internet toolbar +#define ITBBID_MENUBAND 1 +#define ITBBID_BRANDBAND 5 +#define ITBBID_TOOLSBAND 2 +#define ITBBID_ADDRESSBAND 4 + +// commands in the CGID_PrivCITCommands command group handled by the internet toolbar +// there seems to be some support for hiding the menubar and an auto hide feature that are +// unavailable in the UI +#define ITID_TEXTLABELS 3 +#define ITID_TOOLBARBANDSHOWN 4 +#define ITID_ADDRESSBANDSHOWN 5 +#define ITID_LINKSBANDSHOWN 6 +#define ITID_MENUBANDSHOWN 12 +#define ITID_AUTOHIDEENABLED 13 +#define ITID_CUSTOMIZEENABLED 20 +#define ITID_TOOLBARLOCKED 27 + +// commands in the CGID_BrandCmdGroup command group handled by the brand band +#define BBID_STARTANIMATION 1 +#define BBID_STOPANIMATION 2 + +// undocumented flags for IShellMenu::SetShellFolder +#define SMSET_UNKNOWN08 0x08 +#define SMSET_UNKNOWN10 0x10 + +BOOL WINAPI ILGetDisplayNameEx(IShellFolder *psf, LPCITEMIDLIST pidl, LPVOID path, DWORD type); + +/* type parameter for ILGetDisplayNameEx() */ +#define ILGDN_FORPARSING 0 +#define ILGDN_NORMAL 1 +#define ILGDN_INFOLDER 2 + +HANDLE WINAPI SHCreateDesktop(IShellDesktopTray*); +BOOL WINAPI SHDesktopMessageLoop(HANDLE); + +#define WM_GETISHELLBROWSER (WM_USER+7) +BOOL WINAPI SetShellWindow(HWND); +BOOL WINAPI SetShellWindowEx(HWND, HWND); +BOOL WINAPI RegisterShellHook(HWND, DWORD); +IStream* WINAPI SHGetViewStream(LPCITEMIDLIST, DWORD, LPCTSTR, LPCTSTR, LPCTSTR); +BOOL WINAPI SHIsEmptyStream(IStream*); + +typedef struct tagCREATEMRULISTA +{ + DWORD cbSize; + DWORD nMaxItems; + DWORD dwFlags; + HKEY hKey; + LPCSTR lpszSubKey; + PROC lpfnCompare; +} CREATEMRULISTA, *LPCREATEMRULISTA; +typedef struct tagCREATEMRULISTW +{ + DWORD cbSize; + DWORD nMaxItems; + DWORD dwFlags; + HKEY hKey; + LPCWSTR lpszSubKey; + PROC lpfnCompare; +} CREATEMRULISTW, *LPCREATEMRULISTW; + +#define MRU_BINARY 0x1 +#define MRU_CACHEWRITE 0x2 + +HANDLE WINAPI CreateMRUListW(LPCREATEMRULISTW); +HANDLE WINAPI CreateMRUListA(LPCREATEMRULISTA); +INT WINAPI AddMRUData(HANDLE,LPCVOID,DWORD); +INT WINAPI FindMRUData(HANDLE,LPCVOID,DWORD,LPINT); +VOID WINAPI FreeMRUList(HANDLE); + +#define DC_NOSENDMSG 0x2000 +BOOL WINAPI DrawCaptionTempA(HWND,HDC,const RECT*,HFONT,HICON,LPCSTR,UINT); +BOOL WINAPI DrawCaptionTempW(HWND,HDC,const RECT*,HFONT,HICON,LPCWSTR,UINT); + +#ifdef UNICODE +typedef CREATEMRULISTW CREATEMRULIST, *PCREATEMRULIST; +#define CreateMRUList CreateMRUListW +#define DrawCaptionTemp DrawCaptionTempW +#else +typedef CREATEMRULISTA CREATEMRULIST, *PCREATEMRULIST; +#define CreateMRUList CreateMRUListA +#define DrawCaptionTemp DrawCaptionTempA +#endif + +HRESULT WINAPI SHInvokeDefaultCommand(HWND,IShellFolder*,LPCITEMIDLIST); + +HRESULT WINAPI SHPropertyBag_ReadPOINTL(IPropertyBag*,LPCWSTR,POINTL*); + +HRESULT WINAPI SHGetPerScreenResName(OUT LPWSTR lpResName, + IN INT cchResName, + IN DWORD dwReserved); + +HRESULT WINAPI SHPropertyBag_ReadStream(IPropertyBag*,LPCWSTR,IStream**); + +HWND WINAPI SHCreateWorkerWindowA(LONG wndProc, HWND hWndParent, DWORD dwExStyle, + DWORD dwStyle, HMENU hMenu, LONG z); + +HWND WINAPI SHCreateWorkerWindowW(LONG wndProc, HWND hWndParent, DWORD dwExStyle, + DWORD dwStyle, HMENU hMenu, LONG z); +#ifdef UNICODE +#define SHCreateWorkerWindow SHCreateWorkerWindowW +#else +#define SHCreateWorkerWindow SHCreateWorkerWindowA +#endif + +#ifdef __cplusplus +} /* extern "C" */ +#endif /* defined(__cplusplus) */ + +#endif // __SHLOBJ_UNDOC__H diff --git a/reactos/include/psdk/shlwapi_undoc.h b/reactos/include/psdk/shlwapi_undoc.h new file mode 100644 index 00000000000..11cb464cdc7 --- /dev/null +++ b/reactos/include/psdk/shlwapi_undoc.h @@ -0,0 +1,78 @@ +/* + * ReactOS shlwapi + * + * Copyright 2009 Andrew Hill + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#ifndef __SHLWAPI_UNDOC_H +#define __SHLWAPI_UNDOC_H + +#ifdef __cplusplus +extern "C" { +#endif /* defined(__cplusplus) */ + +struct IEThreadParamBlock +{ + long offset0; + long offset4; + long offset8; + IUnknown *offsetC; + long offset10; + IUnknown *offset14; + LPITEMIDLIST directoryPIDL; + char filler1[84]; // unknown contents + IUnknown *offset70; + long filler2; // unknown contents + IUnknown *offset78; + LPITEMIDLIST offset7C; + LPITEMIDLIST offset80; + char filler3[116]; // unknown contents + IUnknown *offsetF8; // instance explorer + long filler4; // unknown contents +}; + +void WINAPI InitOCHostClass(long param8); +long WINAPI SHOpenFolderWindow(IEThreadParamBlock *param8); +void WINAPI SHCreateSavedWindows(); +long WINAPI SHCreateFromDesktop(long param8); +long WINAPI SHExplorerParseCmdLine(LPCTSTR commandLine); +void WINAPI UEMRegisterNotify(long param8, long paramC); +HRESULT WINAPI SHCreateBandForPidl(LPCITEMIDLIST param8, IUnknown *paramC, BOOL param10); +HRESULT WINAPI SHPidlFromDataObject(IDataObject *param8, long *paramC, long param10, FILEDESCRIPTORW *param14); +long WINAPI IDataObject_GetDeskBandState(long param8); +IEThreadParamBlock *WINAPI SHCreateIETHREADPARAM(long param8, long paramC, IUnknown *param10, IUnknown *param14); +IEThreadParamBlock *WINAPI SHCloneIETHREADPARAM(IEThreadParamBlock *param); +long WINAPI SHParseIECommandLine(long param8, long paramC); +void WINAPI SHDestroyIETHREADPARAM(IEThreadParamBlock *param); +HRESULT WINAPI SHOnCWMCommandLine(long param8); +LPITEMIDLIST WINAPI Channel_GetFolderPidl(); +IUnknown *WINAPI ChannelBand_Create(LPITEMIDLIST pidl); +HRESULT WINAPI Channels_SetBandInfoSFB(IUnknown *param8); +HRESULT WINAPI IUnknown_SetBandInfoSFB(IUnknown *param8, long paramC); +HRESULT WINAPI Channel_QuickLaunch(); +HRESULT WINAPI SHGetNavigateTarget(long param8, long paramC, long param10, long param14); +HRESULT WINAPI GetInfoTip(IUnknown *param8, long paramC, LPTSTR *param10, long cchMax); +HRESULT WINAPI SHEnumClassesOfCategories(long param8, long paramC, long param10, long param14, long param18); +HRESULT WINAPI SHWriteClassesOfCategories(long param8, long paramC, long param10, long param14, long param18, long param1C, long param20); +BOOL WINAPI SHIsExplorerBrowser(); +HRESULT WINAPI SHOpenNewFrame(LPITEMIDLIST pidl, IUnknown *paramC, long param10, long param14); + +#ifdef __cplusplus +} /* extern "C" */ +#endif /* defined(__cplusplus) */ + +#endif /* __SHLWAPI_UNDOC_H */ diff --git a/reactos/include/psdk/shobjidl.idl b/reactos/include/psdk/shobjidl.idl index 5fc8cf5b31f..35e63dd0671 100644 --- a/reactos/include/psdk/shobjidl.idl +++ b/reactos/include/psdk/shobjidl.idl @@ -1868,4 +1868,859 @@ interface IMenuBand : IUnknown [out] LRESULT* plRet); } +/***************************************************************************** + * IProfferService interface + */ +[ + uuid(cb728b20-f786-11ce-92ad-00aa00a74cd0), + object, + pointer_default(unique), + local +] +interface IProfferService : IUnknown +{ + HRESULT ProfferService( + [in] REFGUID rguidService, + [in] IServiceProvider *psp, + [out] DWORD *pdwCookie); + + HRESULT RevokeService( + [in] DWORD dwCookie); +} +/***************************************************************************** + * IShellMenuCallback interface + */ +cpp_quote("#include ") + +typedef struct tagSMDATA +{ + DWORD dwMask; + DWORD dwFlags; + HMENU hmenu; + HWND hwnd; + UINT uId; + UINT uIdParent; + UINT uIdAncestor; + IUnknown *punk; + LPITEMIDLIST pidlFolder; + LPITEMIDLIST pidlItem; + IShellFolder *psf; + void *pvUserData; +} SMDATA, *LPSMDATA; + +cpp_quote("#define SMDM_SHELLFOLDER 0x00000001") +cpp_quote("#define SMDM_HMENU 0x00000002") +cpp_quote("#define SMDM_TOOLBAR 0x00000004") + +typedef struct tagSMINFO +{ + DWORD dwMask; + DWORD dwType; + DWORD dwFlags; + int iIcon; +} SMINFO, *PSMINFO; + +typedef struct tagSHCSCHANGENOTIFYSTRUCT +{ + LONG lEvent; + LPCITEMIDLIST pidl1; + LPCITEMIDLIST pidl2; +} SMCSHCHANGENOTIFYSTRUCT, *PSMCSHCHANGENOTIFYSTRUCT; + +cpp_quote("#include ") + +enum +{ + SMIM_TYPE = 0x00000001, + SMIM_FLAGS = 0x00000002, + SMIM_ICON = 0x00000004 +}; + +enum +{ + SMIT_SEPARATOR = 0x00000001, + SMIT_STRING = 0x00000002 +}; + +enum +{ + SMIF_ICON = 0x00000001, + SMIF_ACCELERATOR = 0x00000002, + SMIF_DROPTARGET = 0x00000004, + SMIF_SUBMENU = 0x00000008, + SMIF_CHECKED = 0x00000020, + SMIF_DROPCASCADE = 0x00000040, + SMIF_HIDDEN = 0x00000080, + SMIF_DISABLED = 0x00000100, + SMIF_TRACKPOPUP = 0x00000200, + SMIF_DEMOTED = 0x00000400, + SMIF_ALTSTATE = 0x00000800, + SMIF_DRAGNDROP = 0x00001000, + SMIF_NEW = 0x00002000, +}; + + +cpp_quote("#define SMC_INITMENU 0x00000001") +cpp_quote("#define SMC_CREATE 0x00000002") +cpp_quote("#define SMC_EXITMENU 0x00000003") +cpp_quote("#define SMC_GETINFO 0x00000005") +cpp_quote("#define SMC_GETSFINFO 0x00000006") +cpp_quote("#define SMC_GETOBJECT 0x00000007") +cpp_quote("#define SMC_GETSFOBJECT 0x00000008") +cpp_quote("#define SMC_SFEXEC 0x00000009") +cpp_quote("#define SMC_SFSELECTITEM 0x0000000A") +cpp_quote("#define SMC_REFRESH 0x00000010") +cpp_quote("#define SMC_DEMOTE 0x00000011") +cpp_quote("#define SMC_PROMOTE 0x00000012") +cpp_quote("#define SMC_DEFAULTICON 0x00000016") +cpp_quote("#define SMC_NEWITEM 0x00000017") +cpp_quote("#define SMC_CHEVRONEXPAND 0x00000019") +cpp_quote("#define SMC_DISPLAYCHEVRONTIP 0x0000002A") +cpp_quote("#define SMC_SETSFOBJECT 0x0000002D") +cpp_quote("#define SMC_SHCHANGENOTIFY 0x0000002E") +cpp_quote("#define SMC_CHEVRONGETTIP 0x0000002F") +cpp_quote("#define SMC_SFDDRESTRICTED 0x00000030") + +[ + uuid(4CA300A1-9B8D-11d1-8B22-00C04FD918D0), + object, + pointer_default(unique), + local +] +interface IShellMenuCallback : IUnknown +{ + HRESULT CallbackSM( + [in, out] LPSMDATA psmd, + [in] UINT uMsg, + [in] WPARAM wParam, + [in] LPARAM lParam); +} + + +/***************************************************************************** + * IShellMenu interface + */ + +cpp_quote("#define SMINIT_DEFAULT 0x00000000") +cpp_quote("#define SMINIT_RESTRICT_DRAGDROP 0x00000002") +cpp_quote("#define SMINIT_TOPLEVEL 0x00000004") +cpp_quote("#define SMINIT_CACHED 0x00000010") +cpp_quote("#define SMINIT_VERTICAL 0x10000000") +cpp_quote("#define SMINIT_HORIZONTAL 0x20000000") +cpp_quote("") +cpp_quote("#define ANCESTORDEFAULT (UINT)-1") +cpp_quote("") +cpp_quote("#define SMSET_TOP 0x10000000") +cpp_quote("#define SMSET_BOTTOM 0x20000000") +cpp_quote("#define SMSET_DONTOWN 0x00000001") +cpp_quote("") +cpp_quote("#define SMINV_REFRESH 0x00000001") +cpp_quote("#define SMINV_ID 0x00000008") + +[ + uuid(EE1F7637-E138-11d1-8379-00C04FD918D0), + object, + pointer_default(unique), + local +] +interface IShellMenu : IUnknown +{ + HRESULT Initialize( + [in] IShellMenuCallback *psmc, + [in] UINT uId, + [in] UINT uIdAncestor, + [in] DWORD dwFlags); + + HRESULT GetMenuInfo( + [out] IShellMenuCallback **ppsmc, + [out] UINT *puId, + [out] UINT *puIdAncestor, + [out] DWORD *pdwFlags); + + HRESULT SetShellFolder( + [in] IShellFolder *psf, + [in] LPCITEMIDLIST pidlFolder, + [in] HKEY hKey, + [in] DWORD dwFlags); + + HRESULT GetShellFolder( + [out] DWORD *pdwFlags, + [out] LPITEMIDLIST *ppidl, + [in] REFIID riid, + [out] void **ppv); + + HRESULT SetMenu( + [in] HMENU hmenu, + [in] HWND hwnd, + [in] DWORD dwFlags); + + HRESULT GetMenu( + [out] HMENU *phmenu, + [out] HWND *phwnd, + [out] DWORD *pdwFlags); + + HRESULT InvalidateItem( + [in] LPSMDATA psmd, + [in] DWORD dwFlags); + + HRESULT GetState( + [out] LPSMDATA psmd); + + HRESULT SetMenuToolbar( + [in] IUnknown *punk, + [in] DWORD dwFlags); +} + + +typedef struct _WINDOWDATA +{ + DWORD dwWindowID; + UINT uiCP; + LPITEMIDLIST pidl; + [string] LPWSTR lpszUrl; + [string] LPWSTR lpszUrlLocation; + [string] LPWSTR lpszTitle; +} WINDOWDATA; + +typedef WINDOWDATA *LPWINDOWDATA; +typedef const WINDOWDATA *LPCWINDOWDATA; + + +/***************************************************************************** + * ITravelEntry interface + */ +[ + uuid(F46EDB3B-BC2F-11d0-9412-00AA00A3EBD3), + object, + pointer_default(unique), + local +] +interface ITravelEntry : IUnknown +{ + HRESULT Invoke( + [in] IUnknown *punk); + + HRESULT Update( + [in] IUnknown *punk, + BOOL fIsLocalAnchor); + + HRESULT GetPidl( + [in] LPITEMIDLIST *ppidl); +}; + + +/***************************************************************************** + * ITravelLogClient interface + */ +[ + uuid(241c033e-e659-43da-aa4d-4086dbc4758d), + object, + pointer_default(unique), + local +] +interface ITravelLogClient : IUnknown +{ + HRESULT FindWindowByIndex( + [in] DWORD dwID, + [out] IUnknown **ppunk); + + HRESULT GetWindowData( + [out] LPWINDOWDATA pWinData); + + HRESULT LoadHistoryPosition( + [in] LPWSTR pszUrlLocation, + [in] DWORD dwPosition); +}; + + +/***************************************************************************** + * ITravelLog interface + */ +[ + uuid(02BA3B52-0547-11D1-B833-00C04FC9B31F), + object, + pointer_default(unique), + local +] +interface ITravelLog : IUnknown +{ + enum tagTLENUMF + { + TLEF_RELATIVE_INCLUDE_CURRENT = 0x00000001, + TLEF_RELATIVE_BACK = 0x00000010, + TLEF_RELATIVE_FORE = 0x00000020, + TLEF_INCLUDE_UNINVOKEABLE = 0x00000040, + TLEF_ABSOLUTE = 0x00000031, + }; + typedef DWORD TLENUMF; + + HRESULT AddEntry( + [in] IUnknown *punk, + BOOL fIsLocalAnchor); + + HRESULT UpdateEntry( + [in] IUnknown *punk, + BOOL fIsLocalAnchor); + + HRESULT UpdateExternal( + [in] IUnknown *punk, + [in] IUnknown *punkHLBrowseContext); + + HRESULT Travel( + [in] IUnknown *punk, + int iOffset); + + HRESULT GetTravelEntry( + [in] IUnknown *punk, + int iOffset, + [out] ITravelEntry **ppte); + + HRESULT FindTravelEntry( + [in] IUnknown *punk, + [in] LPCITEMIDLIST pidl, + [out] ITravelEntry **ppte); + + HRESULT GetToolTipText( + [in] IUnknown *punk, + int iOffset, + int idsTemplate, + [out] LPWSTR pwzText, + DWORD cchText); + + HRESULT InsertMenuEntries( + [in] IUnknown *punk, + [in, out] HMENU hmenu, + int nPos, + int idFirst, + int idLast, + DWORD dwFlags); + + HRESULT Clone( + [out] ITravelLog **pptl); + + DWORD CountEntries( + [in] IUnknown *punk); + + HRESULT Revert(); +}; + + +/***************************************************************************** + * IShellService interface + */ +[ + object, + uuid(5836FB00-8187-11CF-A12B-00AA004AE837), + pointer_default(unique), + local +] +interface IShellService : IUnknown +{ + HRESULT SetOwner( + [in] IUnknown *owner); +}; + +/***************************************************************************** + * IShellBrowser interface + */ +[ + object, + uuid(02BA3B52-0547-11D1-B833-00C04FC9B31F), + pointer_default(unique), + local +] +interface IBrowserService : IUnknown +{ + typedef enum tagBNSTATE + { + BNS_NORMAL = 0, + BNS_BEGIN_NAVIGATE = 1, + BNS_NAVIGATE = 2 + } BNSTATE; + + cpp_quote("#include ") + typedef struct basebrowserdataxp + { + HWND _hwnd; + ITravelLog *_ptl; + IUnknown *_phlf; + IUnknown *_pautoWB2; + IUnknown *_pautoEDS; + IShellService *_pautoSS; + int _eSecureLockIcon; + DWORD _fCreatingViewWindow; + UINT _uActivateState; + LPITEMIDLIST _pidlViewState; + IOleCommandTarget *_pctView; + LPITEMIDLIST _pidlCur; + IShellView *_psv; + IShellFolder *_psf; + HWND _hwndView; + LPWSTR _pszTitleCur; + LPITEMIDLIST _pidlPending; + IShellView *_psvPending; + IShellFolder *_psfPending; + HWND _hwndViewPending; + LPWSTR _pszTitlePending; + BOOL _fIsViewMSHTML; + BOOL _fPrivacyImpacted; + CLSID _clsidView; + CLSID _clsidViewPending; + HWND _hwndFrame; + } BASEBROWSERDATAXP; + typedef struct basebrowserdataxp *LPBASEBROWSERDATAXP; + + typedef struct basebrowserdatalh + { + HWND _hwnd; + ITravelLog *_ptl; + IUnknown *_phlf; + IUnknown *_pautoWB2; + IUnknown *_pautoEDS; + IShellService *_pautoSS; + int _eSecureLockIcon; + DWORD _fCreatingViewWindow; + UINT _uActivateState; + LPITEMIDLIST _pidlViewState; + IOleCommandTarget *_pctView; + LPITEMIDLIST _pidlCur; + IShellView *_psv; + IShellFolder *_psf; + HWND _hwndView; + LPWSTR _pszTitleCur; + LPITEMIDLIST _pidlPending; + IShellView *_psvPending; + IShellFolder *_psfPending; + HWND _hwndViewPending; + LPWSTR _pszTitlePending; + BOOL _fIsViewMSHTML; + BOOL _fPrivacyImpacted; + CLSID _clsidView; + CLSID _clsidViewPending; + HWND _hwndFrame; + LONG _lPhishingFilterStatus; + } BASEBROWSERDATALH; + cpp_quote("#include ") + typedef struct basebrowserdatalh *LPBASEBROWSERDATALH; + + typedef BASEBROWSERDATAXP BASEBROWSERDATA; + + typedef const BASEBROWSERDATA *LPCBASEBROWSERDATA; + + typedef BASEBROWSERDATA *LPBASEBROWSERDATA; + + typedef struct SToolbarItem + { + IDockingWindow *ptbar; + BORDERWIDTHS rcBorderTool; + LPWSTR pwszItem; + BOOL fShow; + HMONITOR hMon; + } TOOLBARITEM; + + typedef struct SToolbarItem *LPTOOLBARITEM; + + HRESULT GetParentSite( + [out] IOleInPlaceSite **ppipsite); + + HRESULT SetTitle( + [in] IShellView *psv, + [in] LPCWSTR pszName); + + HRESULT GetTitle( + [in] IShellView *psv, + [out] LPWSTR pszName, + DWORD cchName); + + HRESULT GetOleObject( + [out] IOleObject **ppobjv); + + HRESULT GetTravelLog( + [out] ITravelLog **pptl); + + HRESULT ShowControlWindow( + UINT id, + BOOL fShow); + + HRESULT IsControlWindowShown( + UINT id, + [out] BOOL *pfShown); + + HRESULT IEGetDisplayName( + [in] LPCITEMIDLIST pidl, + [out] LPWSTR pwszName, + UINT uFlags); + + HRESULT IEParseDisplayName( + UINT uiCP, + [in] LPCWSTR pwszPath, + [out] LPCITEMIDLIST *ppidlOut); + + HRESULT DisplayParseError( + HRESULT hres, + [in] LPCWSTR pwszPath); + + HRESULT NavigateToPidl( + [in] LPCITEMIDLIST pidl, + DWORD grfHLNF); + + HRESULT SetNavigateState( + BNSTATE bnstate); + + HRESULT GetNavigateState( + [out] BNSTATE *pbnstate); + + HRESULT NotifyRedirect( + [in] IShellView *psv, + [in] LPCITEMIDLIST pidl, + [out] BOOL *pfDidBrowse); + + HRESULT UpdateWindowList(); + + HRESULT UpdateBackForwardState(); + + HRESULT SetFlags( + DWORD dwFlags, + DWORD dwFlagMask); + + HRESULT GetFlags( + [out] DWORD *pdwFlags); + + HRESULT CanNavigateNow(); + + HRESULT GetPidl( + [out] LPCITEMIDLIST *ppidl); + + HRESULT SetReferrer( + [in] LPCITEMIDLIST pidl); + + DWORD GetBrowserIndex(); + + HRESULT GetBrowserByIndex( + DWORD dwID, + [out] IUnknown **ppunk); + + HRESULT GetHistoryObject( + [out] IOleObject **ppole, + [out] IStream **pstm, + [out] IBindCtx **ppbc); + + HRESULT SetHistoryObject( + [in] IOleObject *pole, + BOOL fIsLocalAnchor); + + HRESULT CacheOLEServer( + [in] IOleObject *pole); + + HRESULT GetSetCodePage( + [in] VARIANT *pvarIn, + [out] VARIANT *pvarOut); + + HRESULT OnHttpEquiv( + [in] IShellView *psv, + BOOL fDone, + [in] VARIANT *pvarargIn, + [out] VARIANT *pvarargOut); + + HRESULT GetPalette( + [out] HPALETTE *hpal); + + HRESULT RegisterWindow( + BOOL fForceRegister, + int swc); +} + + +/***************************************************************************** + * IShellBrowser2 interface + */ +[ + uuid(68BD21CC-438B-11D2-A560-00A0C92DBFE8), + object, + pointer_default(unique), + local +] +interface IBrowserService2 : IBrowserService +{ + typedef struct tagFolderSetData + { + FOLDERSETTINGS _fs; + SHELLVIEWID _vidRestore; + DWORD _dwViewPriority; + } FOLDERSETDATA; + + typedef struct tagFolderSetData *LPFOLDERSETDATA; + + LRESULT WndProcBS( + [in] HWND hwnd, + UINT uMsg, + WPARAM wParam, + LPARAM lParam); + + HRESULT SetAsDefFolderSettings(); + + HRESULT GetViewRect( + [out] RECT *prc); + + HRESULT OnSize( + WPARAM wParam); + + HRESULT OnCreate( + [in] struct tagCREATESTRUCTW *pcs); + + LRESULT OnCommand( + WPARAM wParam, + LPARAM lParam); + + HRESULT OnDestroy(); + + LRESULT OnNotify( + [in] struct tagNMHDR *pnm); + + HRESULT OnSetFocus(); + + HRESULT OnFrameWindowActivateBS( + BOOL fActive); + + HRESULT ReleaseShellView(); + + HRESULT ActivatePendingView(); + + HRESULT CreateViewWindow( + [in] IShellView *psvNew, + [in] IShellView *psvOld, + [in] LPRECT prcView, + [out] HWND *phwnd); + + HRESULT CreateBrowserPropSheetExt( + [in] REFIID riid, + [out] void **ppv); + + HRESULT GetViewWindow( + [out] HWND *phwndView); + + HRESULT GetBaseBrowserData( + [out] LPCBASEBROWSERDATA *pbbd); + + LPBASEBROWSERDATA PutBaseBrowserData(); + + HRESULT InitializeTravelLog( + [in] ITravelLog *ptl, + DWORD dw); + + HRESULT SetTopBrowser(); + + HRESULT Offline( + int iCmd); + + HRESULT AllowViewResize( + BOOL f); + + HRESULT SetActivateState( + UINT u); + + HRESULT UpdateSecureLockIcon( + int eSecureLock); + + HRESULT InitializeDownloadManager(); + + HRESULT InitializeTransitionSite(); + + HRESULT _Initialize( + [in] HWND hwnd, + [in] IUnknown *pauto); + + HRESULT _CancelPendingNavigationAsync(); + + HRESULT _CancelPendingView(); + + HRESULT _MaySaveChanges(); + + HRESULT _PauseOrResumeView( + BOOL fPaused); + + HRESULT _DisableModeless(); + + HRESULT _NavigateToPidl( + [in] LPCITEMIDLIST pidl, + DWORD grfHLNF, + DWORD dwFlags); + + HRESULT _TryShell2Rename( + [in] IShellView *psv, + [in] LPCITEMIDLIST pidlNew); + + HRESULT _SwitchActivationNow(); + + HRESULT _ExecChildren( + [in] IUnknown *punkBar, + BOOL fBroadcast, + [in] const GUID *pguidCmdGroup, + DWORD nCmdID, + DWORD nCmdexecopt, + [in] VARIANTARG *pvarargIn, + [in, out] VARIANTARG *pvarargOut); + + HRESULT _SendChildren( + [in] HWND hwndBar, + BOOL fBroadcast, + UINT uMsg, + WPARAM wParam, + LPARAM lParam); + + HRESULT GetFolderSetData( + [out] struct tagFolderSetData *pfsd); + + HRESULT _OnFocusChange( + UINT itb); + + HRESULT v_ShowHideChildWindows( + BOOL fChildOnly); + + UINT _get_itbLastFocus(); + + HRESULT _put_itbLastFocus( + UINT itbLastFocus); + + HRESULT _UIActivateView( + UINT uState); + + HRESULT _GetViewBorderRect( + [out] RECT *prc); + + HRESULT _UpdateViewRectSize(); + + HRESULT _ResizeNextBorder( + UINT itb); + + HRESULT _ResizeView(); + + HRESULT _GetEffectiveClientArea( + [out] LPRECT lprectBorder, + [in] HMONITOR hmon); + + IStream *v_GetViewStream( + [in] LPCITEMIDLIST pidl, + DWORD grfMode, + [in] LPCWSTR pwszName); + + LRESULT ForwardViewMsg( + UINT uMsg, + WPARAM wParam, + LPARAM lParam); + + HRESULT SetAcceleratorMenu( + [in] HACCEL hacc); + + int _GetToolbarCount(); + + LPTOOLBARITEM _GetToolbarItem( + int itb); + + HRESULT _SaveToolbars( + [in] IStream *pstm); + + HRESULT _LoadToolbars( + [in] IStream *pstm); + + HRESULT _CloseAndReleaseToolbars( + BOOL fClose); + + HRESULT v_MayGetNextToolbarFocus( + [in] LPMSG lpMsg, + UINT itbNext, + int citb, + [out] LPTOOLBARITEM *pptbi, + [out] HWND *phwnd); + + HRESULT _ResizeNextBorderHelper( + UINT itb, + BOOL bUseHmonitor); + + UINT _FindTBar( + [in] IUnknown *punkSrc); + + HRESULT _SetFocus( + [in] LPTOOLBARITEM ptbi, + [in] HWND hwnd, + [in] LPMSG lpMsg); + + HRESULT v_MayTranslateAccelerator( + [in] MSG *pmsg); + + HRESULT _GetBorderDWHelper( + [in] IUnknown *punkSrc, + [out] LPRECT lprectBorder, + BOOL bUseHmonitor); + + HRESULT v_CheckZoneCrossing( + [in] LPCITEMIDLIST pidl); +} + + +/***************************************************************************** + * IShellBrowser3 interface + */ +[ + uuid(27D7CE21-762D-48F3-86F3-40E2FD3749C4), + object, + pointer_default(unique), + local +] +interface IBrowserService3 : IBrowserService2 +{ + HRESULT _PositionViewWindow( + [in] HWND hwnd, + [in] LPRECT prc); + + HRESULT IEParseDisplayNameEx( + UINT uiCP, + [in] LPCWSTR pwszPath, + DWORD dwFlags, + [out] LPITEMIDLIST *ppidlOut); +} + + +/***************************************************************************** + * IShellBrowser4 interface + */ +[ + uuid(639f1bff-e135-4096-abd8-e0f504d649a4), + object, + pointer_default(unique), + local +] +interface IBrowserService4 : IBrowserService3 +{ + HRESULT ActivateView( + BOOL fPendingView); + + HRESULT SaveViewState(); + + HRESULT _ResizeAllBorders(); +} + + +/***************************************************************************** + * ITrackShellMenu interface + */ +[ + uuid(8278F932-2A3E-11d2-838F-00C04FD918D0), + object, + pointer_default(unique), + local +] +interface ITrackShellMenu : IShellMenu +{ + HRESULT SetObscured( + [in] HWND hwndTB, + [in] IUnknown *punkBand, + DWORD dwSMSetFlags); + + HRESULT Popup( + [in] HWND hwnd, + [in] POINTL *ppt, + [in] RECTL *prcExclude, + MP_POPUPFLAGS dwFlags); +}; diff --git a/reactos/include/psdk/wtypes.idl b/reactos/include/psdk/wtypes.idl index 5f66044b106..6a3f9a9109e 100644 --- a/reactos/include/psdk/wtypes.idl +++ b/reactos/include/psdk/wtypes.idl @@ -91,6 +91,10 @@ DECLARE_HANDLE(HWINSTA); DECLARE_HANDLE(HKL); DECLARE_HANDLE(HGDIOBJ); +cpp_quote("#if 0") +typedef HANDLE HMONITOR; +cpp_quote("#endif /* 0 */") + typedef HANDLE HDWP; typedef LONG_PTR LRESULT; @@ -581,6 +585,36 @@ typedef struct tagMSG POINT pt; } MSG, *PMSG, *NPMSG, *LPMSG; +typedef struct tagCREATESTRUCTA { + LPVOID lpCreateParams; + HINSTANCE hInstance; + HMENU hMenu; + HWND hwndParent; + int cy; + int cx; + int y; + int x; + LONG style; + LPCSTR lpszName; + LPCSTR lpszClass; + DWORD dwExStyle; +} CREATESTRUCTA, *LPCREATESTRUCTA; + +typedef struct tagCREATESTRUCTW { + LPVOID lpCreateParams; + HINSTANCE hInstance; + HMENU hMenu; + HWND hwndParent; + int cy; + int cx; + int y; + int x; + LONG style; + LPCWSTR lpszName; + LPCWSTR lpszClass; + DWORD dwExStyle; +} CREATESTRUCTW, *LPCREATESTRUCTW; + cpp_quote("#endif") /******************** GUID TYPES ********************/ diff --git a/reactos/include/reactos/wine/wined3d.idl b/reactos/include/reactos/wine/wined3d.idl index 049ac90b0e8..b429774a26e 100644 --- a/reactos/include/reactos/wine/wined3d.idl +++ b/reactos/include/reactos/wine/wined3d.idl @@ -26,7 +26,6 @@ import "unknwn.idl"; cpp_quote("#if 0") -typedef HANDLE HMONITOR; typedef struct _RGNDATAHEADER { diff --git a/reactos/lib/atl/atlbase.h b/reactos/lib/atl/atlbase.h index 62b431b04f7..a37516ceb57 100644 --- a/reactos/lib/atl/atlbase.h +++ b/reactos/lib/atl/atlbase.h @@ -244,15 +244,6 @@ inline BOOL WINAPI InlineIsEqualUnknown(REFGUID rguid1) ((unsigned long *)&rguid1)[3] == 0x46000000); } -inline BOOL WINAPI InlineIsEqualGUID(REFGUID rguid1, REFGUID rguid2) -{ - return ( - ((unsigned long *)&rguid1)[0] == ((unsigned long *)&rguid2)[0] && - ((unsigned long *)&rguid1)[1] == ((unsigned long *)&rguid2)[1] && - ((unsigned long *)&rguid1)[2] == ((unsigned long *)&rguid2)[2] && - ((unsigned long *)&rguid1)[3] == ((unsigned long *)&rguid2)[3]); -} - class CComMultiThreadModelNoCS { public: @@ -331,6 +322,8 @@ public: class CAtlModule : public _ATL_MODULE { +protected: + static GUID m_libid; public: CAtlModule() { @@ -435,6 +428,8 @@ private: } }; +__declspec(selectany) GUID CAtlModule::m_libid = {0x0, 0x0, 0x0, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} }; + template class CAtlModuleT : public CAtlModule { @@ -553,6 +548,47 @@ public: _pModule = NULL; } + HRESULT Init(_ATL_OBJMAP_ENTRY *p, HINSTANCE /* h */, const GUID *plibid) + { + _ATL_OBJMAP_ENTRY *objectMapEntry; + + if (plibid != NULL) + m_libid = *plibid; + + if (p != reinterpret_cast<_ATL_OBJMAP_ENTRY *>(-1)) + { + m_pObjMap = p; + if (p != NULL) + { + objectMapEntry = p; + while (objectMapEntry->pclsid != NULL) + { + objectMapEntry->pfnObjectMain(true); + objectMapEntry++; + } + } + } + return S_OK; + } + + void Term() + { + _ATL_OBJMAP_ENTRY *objectMapEntry; + + if (m_pObjMap != NULL) + { + objectMapEntry = m_pObjMap; + while (objectMapEntry->pclsid != NULL) + { + if (objectMapEntry->pCF != NULL) + objectMapEntry->pCF->Release(); + objectMapEntry->pCF = NULL; + objectMapEntry->pfnObjectMain(false); + objectMapEntry++; + } + } + } + HRESULT GetClassObject(REFCLSID rclsid, REFIID riid, LPVOID *ppv) { _ATL_OBJMAP_ENTRY *objectMapEntry; diff --git a/reactos/lib/sdk/uuid/uuid.c b/reactos/lib/sdk/uuid/uuid.c index 8847c0091ba..0988aaf10c8 100644 --- a/reactos/lib/sdk/uuid/uuid.c +++ b/reactos/lib/sdk/uuid/uuid.c @@ -49,6 +49,7 @@ DEFINE_GUID(GUID_NULL,0,0,0,0,0,0,0,0,0,0,0); #include "exdisp.h" #include "shlguid.h" +#include "shlguid_undoc.h" #include "shlobj.h" #include "shldisp.h" #include "comcat.h"