mirror of
https://github.com/reactos/reactos.git
synced 2025-07-04 00:41:23 +00:00
[SHDOCVW] Initial implementation of Favorites bar (#7146)
First step to Favorites bar support. Menu: [View]→[Explorer bar] →[Favorites] JIRA issue: CORE-19686 - Add CFavBand.cpp, CFavBand.h, favband.rgs, and resource.h files. - Modify CMakeLists.txt. - Add IDS_ADD and IDS_ORGANIZE resource strings. - Implement empty Favorites bar. - The treeview is not populated yet. - The Add button is not implemented yet.
This commit is contained in:
parent
61b7fb99eb
commit
69931a4a7d
10 changed files with 919 additions and 8 deletions
647
dll/win32/shdocvw/CFavBand.cpp
Normal file
647
dll/win32/shdocvw/CFavBand.cpp
Normal file
|
@ -0,0 +1,647 @@
|
||||||
|
/*
|
||||||
|
* PROJECT: ReactOS Explorer
|
||||||
|
* LICENSE: LGPL-2.1-or-later (https://spdx.org/licenses/LGPL-2.1-or-later)
|
||||||
|
* PURPOSE: Favorites bar
|
||||||
|
* COPYRIGHT: Copyright 2024 Katayama Hirofumi MZ <katayama.hirofumi.mz@gmail.com>
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <windows.h>
|
||||||
|
#include <shlobj.h>
|
||||||
|
#include <shlwapi.h>
|
||||||
|
#include <atlbase.h>
|
||||||
|
#include <atlcom.h>
|
||||||
|
#include <atlwin.h>
|
||||||
|
#include <undocshell.h>
|
||||||
|
#include <shlobj_undoc.h>
|
||||||
|
#include <shlguid_undoc.h>
|
||||||
|
#include <shlwapi_undoc.h>
|
||||||
|
#include <shdeprecated.h>
|
||||||
|
#include <olectlid.h>
|
||||||
|
#include <exdispid.h>
|
||||||
|
#include <shellutils.h>
|
||||||
|
#include <ui/rosctrls.h>
|
||||||
|
#include "shdocvw.h"
|
||||||
|
#include "CFavBand.h"
|
||||||
|
|
||||||
|
#include <wine/debug.h>
|
||||||
|
WINE_DEFAULT_DEBUG_CHANNEL(shdocvw);
|
||||||
|
|
||||||
|
void *operator new(size_t size)
|
||||||
|
{
|
||||||
|
return ::LocalAlloc(LPTR, size);
|
||||||
|
}
|
||||||
|
|
||||||
|
void operator delete(void *ptr)
|
||||||
|
{
|
||||||
|
::LocalFree(ptr);
|
||||||
|
}
|
||||||
|
|
||||||
|
void operator delete(void *ptr, size_t size)
|
||||||
|
{
|
||||||
|
::LocalFree(ptr);
|
||||||
|
}
|
||||||
|
|
||||||
|
#if 1
|
||||||
|
#undef UNIMPLEMENTED
|
||||||
|
#define UNIMPLEMENTED ERR("%s is UNIMPLEMENTED!\n", __FUNCTION__)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
CFavBand::CFavBand()
|
||||||
|
: m_fVisible(FALSE)
|
||||||
|
, m_bFocused(FALSE)
|
||||||
|
, m_dwBandID(0)
|
||||||
|
, m_hToolbarImageList(NULL)
|
||||||
|
, m_hTreeViewImageList(NULL)
|
||||||
|
{
|
||||||
|
::InterlockedIncrement(&SHDOCVW_refCount);
|
||||||
|
SHGetSpecialFolderLocation(NULL, CSIDL_FAVORITES, &m_pidlFav);
|
||||||
|
}
|
||||||
|
|
||||||
|
CFavBand::~CFavBand()
|
||||||
|
{
|
||||||
|
if (m_hToolbarImageList)
|
||||||
|
{
|
||||||
|
ImageList_Destroy(m_hToolbarImageList);
|
||||||
|
m_hToolbarImageList = NULL;
|
||||||
|
}
|
||||||
|
if (m_hTreeViewImageList)
|
||||||
|
{
|
||||||
|
ImageList_Destroy(m_hTreeViewImageList);
|
||||||
|
m_hTreeViewImageList = NULL;
|
||||||
|
}
|
||||||
|
::InterlockedDecrement(&SHDOCVW_refCount);
|
||||||
|
}
|
||||||
|
|
||||||
|
VOID CFavBand::OnFinalMessage(HWND)
|
||||||
|
{
|
||||||
|
// The message loop is finished, now we can safely destruct!
|
||||||
|
Release();
|
||||||
|
}
|
||||||
|
|
||||||
|
// *** helper methods ***
|
||||||
|
|
||||||
|
BOOL CFavBand::CreateToolbar()
|
||||||
|
{
|
||||||
|
#define IDB_SHELL_EXPLORER_SM 216 // Borrowed from browseui.dll
|
||||||
|
HINSTANCE hinstBrowseUI = LoadLibraryExW(L"browseui.dll", NULL, LOAD_LIBRARY_AS_DATAFILE);
|
||||||
|
ATLASSERT(hinstBrowseUI);
|
||||||
|
HBITMAP hbmToolbar = NULL;
|
||||||
|
if (hinstBrowseUI)
|
||||||
|
{
|
||||||
|
hbmToolbar = LoadBitmapW(hinstBrowseUI, MAKEINTRESOURCEW(IDB_SHELL_EXPLORER_SM));
|
||||||
|
FreeLibrary(hinstBrowseUI);
|
||||||
|
}
|
||||||
|
#undef IDB_SHELL_EXPLORER_SM
|
||||||
|
ATLASSERT(hbmToolbar);
|
||||||
|
if (!hbmToolbar)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
m_hToolbarImageList = ImageList_Create(16, 16, ILC_COLOR32, 0, 8);
|
||||||
|
ATLASSERT(m_hToolbarImageList);
|
||||||
|
if (!m_hToolbarImageList)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
ImageList_Add(m_hToolbarImageList, hbmToolbar, NULL);
|
||||||
|
DeleteObject(hbmToolbar);
|
||||||
|
|
||||||
|
DWORD style = WS_CHILD | WS_VISIBLE | TBSTYLE_FLAT | TBSTYLE_LIST | CCS_NODIVIDER |
|
||||||
|
TBSTYLE_WRAPABLE;
|
||||||
|
HWND hwndTB = ::CreateWindowExW(0, TOOLBARCLASSNAMEW, NULL, style, 0, 0, 0, 0, m_hWnd,
|
||||||
|
(HMENU)(LONG_PTR)IDW_TOOLBAR, instance, NULL);
|
||||||
|
ATLASSERT(hwndTB);
|
||||||
|
if (!hwndTB)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
m_hwndToolbar.Attach(hwndTB);
|
||||||
|
m_hwndToolbar.SendMessage(TB_BUTTONSTRUCTSIZE, (WPARAM)sizeof(TBBUTTON), 0);
|
||||||
|
m_hwndToolbar.SendMessage(TB_SETIMAGELIST, 0, (LPARAM)m_hToolbarImageList);
|
||||||
|
m_hwndToolbar.SendMessage(TB_SETEXTENDEDSTYLE, 0, TBSTYLE_EX_MIXEDBUTTONS);
|
||||||
|
|
||||||
|
WCHAR szzAdd[MAX_PATH], szzOrganize[MAX_PATH];
|
||||||
|
ZeroMemory(szzAdd, sizeof(szzAdd));
|
||||||
|
ZeroMemory(szzOrganize, sizeof(szzOrganize));
|
||||||
|
LoadStringW(instance, IDS_ADD, szzAdd, _countof(szzAdd));
|
||||||
|
LoadStringW(instance, IDS_ORGANIZE, szzOrganize, _countof(szzOrganize));
|
||||||
|
|
||||||
|
TBBUTTON tbb[2] = { { 0 } };
|
||||||
|
INT iButton = 0;
|
||||||
|
tbb[iButton].iBitmap = 3;
|
||||||
|
tbb[iButton].idCommand = ID_ADD;
|
||||||
|
tbb[iButton].fsState = TBSTATE_ENABLED;
|
||||||
|
tbb[iButton].fsStyle = BTNS_BUTTON | BTNS_AUTOSIZE | BTNS_SHOWTEXT;
|
||||||
|
tbb[iButton].iString = (INT)m_hwndToolbar.SendMessage(TB_ADDSTRING, 0, (LPARAM)szzAdd);
|
||||||
|
++iButton;
|
||||||
|
tbb[iButton].iBitmap = 42;
|
||||||
|
tbb[iButton].idCommand = ID_ORGANIZE;
|
||||||
|
tbb[iButton].fsState = TBSTATE_ENABLED;
|
||||||
|
tbb[iButton].fsStyle = BTNS_BUTTON | BTNS_AUTOSIZE | BTNS_SHOWTEXT;
|
||||||
|
tbb[iButton].iString = (INT)m_hwndToolbar.SendMessage(TB_ADDSTRING, 0, (LPARAM)szzOrganize);
|
||||||
|
++iButton;
|
||||||
|
ATLASSERT(iButton == _countof(tbb));
|
||||||
|
|
||||||
|
LRESULT ret = m_hwndToolbar.SendMessage(TB_ADDBUTTONS, iButton, (LPARAM)&tbb);
|
||||||
|
ATLASSERT(ret);
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
BOOL CFavBand::CreateTreeView()
|
||||||
|
{
|
||||||
|
m_hTreeViewImageList = ImageList_Create(16, 16, ILC_COLOR32 | ILC_MASK, 64, 0);
|
||||||
|
ATLASSERT(m_hTreeViewImageList);
|
||||||
|
if (!m_hTreeViewImageList)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
DWORD style = TVS_NOHSCROLL | TVS_NONEVENHEIGHT | TVS_FULLROWSELECT | TVS_INFOTIP |
|
||||||
|
TVS_SINGLEEXPAND | TVS_TRACKSELECT | TVS_SHOWSELALWAYS | TVS_EDITLABELS |
|
||||||
|
WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_TABSTOP;
|
||||||
|
HWND hwndTV = ::CreateWindowExW(WS_EX_CLIENTEDGE, WC_TREEVIEWW, NULL, style, 0, 0, 0, 0,
|
||||||
|
m_hWnd, (HMENU)(ULONG_PTR)IDW_TREEVIEW, instance, NULL);
|
||||||
|
ATLASSERT(hwndTV);
|
||||||
|
if (!hwndTV)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
m_hwndTreeView.Attach(hwndTV);
|
||||||
|
TreeView_SetImageList(m_hwndTreeView, m_hTreeViewImageList, TVSIL_NORMAL);
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
// *** message handlers ***
|
||||||
|
|
||||||
|
LRESULT CFavBand::OnCreate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
|
||||||
|
{
|
||||||
|
INITCOMMONCONTROLSEX iccx = { sizeof(iccx), ICC_TREEVIEW_CLASSES | ICC_BAR_CLASSES };
|
||||||
|
if (!::InitCommonControlsEx(&iccx) || !CreateToolbar() || !CreateTreeView())
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
LRESULT CFavBand::OnDestroy(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
|
||||||
|
{
|
||||||
|
m_hwndTreeView.DestroyWindow();
|
||||||
|
m_hwndToolbar.DestroyWindow();
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
LRESULT CFavBand::OnSize(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
|
||||||
|
{
|
||||||
|
if (!m_hwndTreeView)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
RECT rc;
|
||||||
|
GetClientRect(&rc);
|
||||||
|
LONG cx = rc.right, cy = rc.bottom;
|
||||||
|
|
||||||
|
RECT rcTB;
|
||||||
|
m_hwndToolbar.SendMessage(TB_AUTOSIZE, 0, 0);
|
||||||
|
m_hwndToolbar.GetWindowRect(&rcTB);
|
||||||
|
|
||||||
|
LONG cyTB = rcTB.bottom - rcTB.top;
|
||||||
|
m_hwndTreeView.MoveWindow(0, cyTB, cx, cy - cyTB);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
LRESULT CFavBand::OnSetFocus(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
|
||||||
|
{
|
||||||
|
m_bFocused = TRUE;
|
||||||
|
IUnknown_OnFocusChangeIS(m_pSite, reinterpret_cast<IUnknown*>(this), TRUE);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
LRESULT CFavBand::OnKillFocus(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
|
||||||
|
{
|
||||||
|
IUnknown_OnFocusChangeIS(m_pSite, reinterpret_cast<IUnknown*>(this), FALSE);
|
||||||
|
m_bFocused = FALSE;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
LRESULT CFavBand::OnCommand(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
|
||||||
|
{
|
||||||
|
switch (LOWORD(wParam))
|
||||||
|
{
|
||||||
|
case ID_ADD:
|
||||||
|
{
|
||||||
|
UNIMPLEMENTED;
|
||||||
|
SHELL_ErrorBox(m_hWnd, ERROR_NOT_SUPPORTED);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case ID_ORGANIZE:
|
||||||
|
{
|
||||||
|
SHELLEXECUTEINFOW sei = { sizeof(sei), SEE_MASK_IDLIST };
|
||||||
|
sei.hwnd = m_hWnd;
|
||||||
|
sei.nShow = SW_SHOWNORMAL;
|
||||||
|
sei.lpIDList = m_pidlFav;
|
||||||
|
::ShellExecuteExW(&sei);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// *** IOleWindow ***
|
||||||
|
|
||||||
|
STDMETHODIMP CFavBand::GetWindow(HWND *lphwnd)
|
||||||
|
{
|
||||||
|
if (!lphwnd)
|
||||||
|
return E_INVALIDARG;
|
||||||
|
*lphwnd = m_hWnd;
|
||||||
|
return S_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
STDMETHODIMP CFavBand::ContextSensitiveHelp(BOOL fEnterMode)
|
||||||
|
{
|
||||||
|
UNIMPLEMENTED;
|
||||||
|
return E_NOTIMPL;
|
||||||
|
}
|
||||||
|
|
||||||
|
// *** IDockingWindow ***
|
||||||
|
|
||||||
|
STDMETHODIMP CFavBand::CloseDW(DWORD dwReserved)
|
||||||
|
{
|
||||||
|
// We do nothing, we don't have anything to save yet
|
||||||
|
TRACE("CloseDW called\n");
|
||||||
|
return S_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
STDMETHODIMP CFavBand::ResizeBorderDW(const RECT *prcBorder, IUnknown *punkToolbarSite, BOOL fReserved)
|
||||||
|
{
|
||||||
|
/* Must return E_NOTIMPL according to MSDN */
|
||||||
|
return E_NOTIMPL;
|
||||||
|
}
|
||||||
|
|
||||||
|
STDMETHODIMP CFavBand::ShowDW(BOOL fShow)
|
||||||
|
{
|
||||||
|
m_fVisible = fShow;
|
||||||
|
ShowWindow(fShow ? SW_SHOW : SW_HIDE);
|
||||||
|
return S_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
// *** IDeskBand ***
|
||||||
|
|
||||||
|
STDMETHODIMP CFavBand::GetBandInfo(DWORD dwBandID, DWORD dwViewMode, DESKBANDINFO *pdbi)
|
||||||
|
{
|
||||||
|
if (!pdbi)
|
||||||
|
return E_INVALIDARG;
|
||||||
|
|
||||||
|
m_dwBandID = dwBandID;
|
||||||
|
|
||||||
|
if (pdbi->dwMask & DBIM_MINSIZE)
|
||||||
|
{
|
||||||
|
pdbi->ptMinSize.x = 200;
|
||||||
|
pdbi->ptMinSize.y = 30;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pdbi->dwMask & DBIM_MAXSIZE)
|
||||||
|
pdbi->ptMaxSize.y = -1;
|
||||||
|
|
||||||
|
if (pdbi->dwMask & DBIM_INTEGRAL)
|
||||||
|
pdbi->ptIntegral.y = 1;
|
||||||
|
|
||||||
|
if (pdbi->dwMask & DBIM_ACTUAL)
|
||||||
|
{
|
||||||
|
pdbi->ptActual.x = 200;
|
||||||
|
pdbi->ptActual.y = 30;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pdbi->dwMask & DBIM_TITLE)
|
||||||
|
{
|
||||||
|
#define IDS_FAVORITES 47 // Borrowed from shell32.dll
|
||||||
|
HINSTANCE hShell32 = LoadLibraryExW(L"shell32.dll", NULL, LOAD_LIBRARY_AS_DATAFILE);
|
||||||
|
if (hShell32)
|
||||||
|
{
|
||||||
|
LoadStringW(hShell32, IDS_FAVORITES, pdbi->wszTitle, _countof(pdbi->wszTitle));
|
||||||
|
FreeLibrary(hShell32);
|
||||||
|
}
|
||||||
|
#undef IDS_FAVORITES
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pdbi->dwMask & DBIM_MODEFLAGS)
|
||||||
|
pdbi->dwModeFlags = DBIMF_NORMAL | DBIMF_VARIABLEHEIGHT;
|
||||||
|
|
||||||
|
if (pdbi->dwMask & DBIM_BKCOLOR)
|
||||||
|
pdbi->dwMask &= ~DBIM_BKCOLOR;
|
||||||
|
|
||||||
|
return S_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
// *** IObjectWithSite ***
|
||||||
|
|
||||||
|
STDMETHODIMP CFavBand::SetSite(IUnknown *pUnkSite)
|
||||||
|
{
|
||||||
|
HRESULT hr;
|
||||||
|
|
||||||
|
if (pUnkSite == m_pSite)
|
||||||
|
return S_OK;
|
||||||
|
|
||||||
|
TRACE("SetSite called\n");
|
||||||
|
|
||||||
|
if (!pUnkSite)
|
||||||
|
{
|
||||||
|
DestroyWindow();
|
||||||
|
m_hWnd = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pUnkSite != m_pSite)
|
||||||
|
m_pSite = NULL;
|
||||||
|
|
||||||
|
if (!pUnkSite)
|
||||||
|
return S_OK;
|
||||||
|
|
||||||
|
HWND hwndParent;
|
||||||
|
hr = IUnknown_GetWindow(pUnkSite, &hwndParent);
|
||||||
|
if (!SUCCEEDED(hr))
|
||||||
|
{
|
||||||
|
ERR("Could not get parent's window! 0x%08lX\n", hr);
|
||||||
|
return E_INVALIDARG;
|
||||||
|
}
|
||||||
|
|
||||||
|
m_pSite = pUnkSite;
|
||||||
|
|
||||||
|
if (m_hWnd)
|
||||||
|
{
|
||||||
|
SetParent(hwndParent); // Change its parent
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
this->Create(hwndParent, NULL, NULL, WS_CHILD | WS_VISIBLE, 0, (UINT)0, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
return S_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
STDMETHODIMP CFavBand::GetSite(REFIID riid, void **ppvSite)
|
||||||
|
{
|
||||||
|
if (!ppvSite)
|
||||||
|
return E_POINTER;
|
||||||
|
*ppvSite = m_pSite;
|
||||||
|
return S_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
// *** IOleCommandTarget ***
|
||||||
|
|
||||||
|
STDMETHODIMP CFavBand::QueryStatus(const GUID *pguidCmdGroup, ULONG cCmds, OLECMD prgCmds [], OLECMDTEXT *pCmdText)
|
||||||
|
{
|
||||||
|
UNIMPLEMENTED;
|
||||||
|
return E_NOTIMPL;
|
||||||
|
}
|
||||||
|
|
||||||
|
STDMETHODIMP CFavBand::Exec(const GUID *pguidCmdGroup, DWORD nCmdID, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
|
||||||
|
{
|
||||||
|
UNIMPLEMENTED;
|
||||||
|
return E_NOTIMPL;
|
||||||
|
}
|
||||||
|
|
||||||
|
// *** IServiceProvider ***
|
||||||
|
|
||||||
|
STDMETHODIMP CFavBand::QueryService(REFGUID guidService, REFIID riid, void **ppvObject)
|
||||||
|
{
|
||||||
|
UNIMPLEMENTED;
|
||||||
|
return E_NOTIMPL;
|
||||||
|
}
|
||||||
|
|
||||||
|
// *** IServiceProvider ***
|
||||||
|
|
||||||
|
STDMETHODIMP CFavBand::QueryContextMenu(
|
||||||
|
HMENU hmenu,
|
||||||
|
UINT indexMenu,
|
||||||
|
UINT idCmdFirst,
|
||||||
|
UINT idCmdLast,
|
||||||
|
UINT uFlags)
|
||||||
|
{
|
||||||
|
UNIMPLEMENTED;
|
||||||
|
return E_NOTIMPL;
|
||||||
|
}
|
||||||
|
|
||||||
|
STDMETHODIMP CFavBand::InvokeCommand(
|
||||||
|
LPCMINVOKECOMMANDINFO lpici)
|
||||||
|
{
|
||||||
|
UNIMPLEMENTED;
|
||||||
|
return E_NOTIMPL;
|
||||||
|
}
|
||||||
|
|
||||||
|
STDMETHODIMP CFavBand::GetCommandString(
|
||||||
|
UINT_PTR idCmd,
|
||||||
|
UINT uType,
|
||||||
|
UINT *pwReserved,
|
||||||
|
LPSTR pszName,
|
||||||
|
UINT cchMax)
|
||||||
|
{
|
||||||
|
UNIMPLEMENTED;
|
||||||
|
return E_NOTIMPL;
|
||||||
|
}
|
||||||
|
|
||||||
|
// *** IInputObject ***
|
||||||
|
|
||||||
|
STDMETHODIMP CFavBand::UIActivateIO(BOOL fActivate, LPMSG lpMsg)
|
||||||
|
{
|
||||||
|
if (fActivate)
|
||||||
|
{
|
||||||
|
//SetFocus();
|
||||||
|
SetActiveWindow();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (lpMsg)
|
||||||
|
{
|
||||||
|
TranslateMessage(lpMsg);
|
||||||
|
DispatchMessage(lpMsg);
|
||||||
|
}
|
||||||
|
|
||||||
|
return S_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
STDMETHODIMP CFavBand::HasFocusIO()
|
||||||
|
{
|
||||||
|
return m_bFocused ? S_OK : S_FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
STDMETHODIMP CFavBand::TranslateAcceleratorIO(LPMSG lpMsg)
|
||||||
|
{
|
||||||
|
if (lpMsg->hwnd == m_hWnd)
|
||||||
|
{
|
||||||
|
TranslateMessage(lpMsg);
|
||||||
|
DispatchMessage(lpMsg);
|
||||||
|
return S_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
return S_FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
// *** IPersist ***
|
||||||
|
|
||||||
|
STDMETHODIMP CFavBand::GetClassID(CLSID *pClassID)
|
||||||
|
{
|
||||||
|
if (!pClassID)
|
||||||
|
return E_POINTER;
|
||||||
|
*pClassID = CLSID_SH_FavBand;
|
||||||
|
return S_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// *** IPersistStream ***
|
||||||
|
|
||||||
|
STDMETHODIMP CFavBand::IsDirty()
|
||||||
|
{
|
||||||
|
UNIMPLEMENTED;
|
||||||
|
return E_NOTIMPL;
|
||||||
|
}
|
||||||
|
|
||||||
|
STDMETHODIMP CFavBand::Load(IStream *pStm)
|
||||||
|
{
|
||||||
|
UNIMPLEMENTED;
|
||||||
|
return E_NOTIMPL;
|
||||||
|
}
|
||||||
|
|
||||||
|
STDMETHODIMP CFavBand::Save(IStream *pStm, BOOL fClearDirty)
|
||||||
|
{
|
||||||
|
UNIMPLEMENTED;
|
||||||
|
return E_NOTIMPL;
|
||||||
|
}
|
||||||
|
|
||||||
|
STDMETHODIMP CFavBand::GetSizeMax(ULARGE_INTEGER *pcbSize)
|
||||||
|
{
|
||||||
|
// TODO: calculate max size
|
||||||
|
UNIMPLEMENTED;
|
||||||
|
return E_NOTIMPL;
|
||||||
|
}
|
||||||
|
|
||||||
|
// *** IWinEventHandler ***
|
||||||
|
|
||||||
|
STDMETHODIMP CFavBand::OnWinEvent(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT *theResult)
|
||||||
|
{
|
||||||
|
UNIMPLEMENTED;
|
||||||
|
return E_NOTIMPL;
|
||||||
|
}
|
||||||
|
|
||||||
|
STDMETHODIMP CFavBand::IsWindowOwner(HWND hWnd)
|
||||||
|
{
|
||||||
|
return (hWnd == m_hWnd) ? S_OK : S_FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
// *** IBandNavigate ***
|
||||||
|
|
||||||
|
STDMETHODIMP CFavBand::Select(long paramC)
|
||||||
|
{
|
||||||
|
UNIMPLEMENTED;
|
||||||
|
return E_NOTIMPL;
|
||||||
|
}
|
||||||
|
|
||||||
|
// *** INamespaceProxy ***
|
||||||
|
|
||||||
|
STDMETHODIMP CFavBand::GetNavigateTarget(long paramC, long param10, long param14)
|
||||||
|
{
|
||||||
|
UNIMPLEMENTED;
|
||||||
|
return E_NOTIMPL;
|
||||||
|
}
|
||||||
|
|
||||||
|
STDMETHODIMP CFavBand::Invoke(long paramC)
|
||||||
|
{
|
||||||
|
UNIMPLEMENTED;
|
||||||
|
return E_NOTIMPL;
|
||||||
|
}
|
||||||
|
|
||||||
|
STDMETHODIMP CFavBand::OnSelectionChanged(long paramC)
|
||||||
|
{
|
||||||
|
UNIMPLEMENTED;
|
||||||
|
return E_NOTIMPL;
|
||||||
|
}
|
||||||
|
|
||||||
|
STDMETHODIMP CFavBand::RefreshFlags(long paramC, long param10, long param14)
|
||||||
|
{
|
||||||
|
UNIMPLEMENTED;
|
||||||
|
return E_NOTIMPL;
|
||||||
|
}
|
||||||
|
|
||||||
|
STDMETHODIMP CFavBand::CacheItem(long paramC)
|
||||||
|
{
|
||||||
|
UNIMPLEMENTED;
|
||||||
|
return E_NOTIMPL;
|
||||||
|
}
|
||||||
|
|
||||||
|
// *** IDispatch ***
|
||||||
|
|
||||||
|
STDMETHODIMP CFavBand::GetTypeInfoCount(UINT *pctinfo)
|
||||||
|
{
|
||||||
|
UNIMPLEMENTED;
|
||||||
|
return E_NOTIMPL;
|
||||||
|
}
|
||||||
|
|
||||||
|
STDMETHODIMP CFavBand::GetTypeInfo(UINT iTInfo, LCID lcid, ITypeInfo **ppTInfo)
|
||||||
|
{
|
||||||
|
UNIMPLEMENTED;
|
||||||
|
return E_NOTIMPL;
|
||||||
|
}
|
||||||
|
|
||||||
|
STDMETHODIMP CFavBand::GetIDsOfNames(
|
||||||
|
REFIID riid,
|
||||||
|
LPOLESTR *rgszNames,
|
||||||
|
UINT cNames,
|
||||||
|
LCID lcid,
|
||||||
|
DISPID *rgDispId)
|
||||||
|
{
|
||||||
|
UNIMPLEMENTED;
|
||||||
|
return E_NOTIMPL;
|
||||||
|
}
|
||||||
|
|
||||||
|
STDMETHODIMP CFavBand::Invoke(
|
||||||
|
DISPID dispIdMember,
|
||||||
|
REFIID riid,
|
||||||
|
LCID lcid,
|
||||||
|
WORD wFlags,
|
||||||
|
DISPPARAMS *pDispParams,
|
||||||
|
VARIANT *pVarResult,
|
||||||
|
EXCEPINFO *pExcepInfo,
|
||||||
|
UINT *puArgErr)
|
||||||
|
{
|
||||||
|
switch (dispIdMember)
|
||||||
|
{
|
||||||
|
case DISPID_DOWNLOADCOMPLETE:
|
||||||
|
case DISPID_NAVIGATECOMPLETE2:
|
||||||
|
// FIXME: Update current location
|
||||||
|
return S_OK;
|
||||||
|
}
|
||||||
|
return E_INVALIDARG;
|
||||||
|
}
|
||||||
|
|
||||||
|
BEGIN_OBJECT_MAP(ObjectMap)
|
||||||
|
OBJECT_ENTRY(CLSID_SH_FavBand, CFavBand)
|
||||||
|
END_OBJECT_MAP()
|
||||||
|
|
||||||
|
class CFavBandModule : public CComModule
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
};
|
||||||
|
|
||||||
|
static CFavBandModule gModule;
|
||||||
|
|
||||||
|
EXTERN_C VOID
|
||||||
|
CFavBand_Init(HINSTANCE hInstance)
|
||||||
|
{
|
||||||
|
gModule.Init(ObjectMap, hInstance, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
EXTERN_C HRESULT
|
||||||
|
CFavBand_DllCanUnloadNow(VOID)
|
||||||
|
{
|
||||||
|
return gModule.DllCanUnloadNow();
|
||||||
|
}
|
||||||
|
|
||||||
|
EXTERN_C HRESULT
|
||||||
|
CFavBand_DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID *ppv)
|
||||||
|
{
|
||||||
|
return gModule.DllGetClassObject(rclsid, riid, ppv);
|
||||||
|
}
|
||||||
|
|
||||||
|
EXTERN_C HRESULT
|
||||||
|
CFavBand_DllRegisterServer(VOID)
|
||||||
|
{
|
||||||
|
return gModule.DllRegisterServer(FALSE);
|
||||||
|
}
|
||||||
|
|
||||||
|
EXTERN_C HRESULT
|
||||||
|
CFavBand_DllUnregisterServer(VOID)
|
||||||
|
{
|
||||||
|
return gModule.DllUnregisterServer(FALSE);
|
||||||
|
}
|
183
dll/win32/shdocvw/CFavBand.h
Normal file
183
dll/win32/shdocvw/CFavBand.h
Normal file
|
@ -0,0 +1,183 @@
|
||||||
|
/*
|
||||||
|
* PROJECT: ReactOS Explorer
|
||||||
|
* LICENSE: LGPL-2.1-or-later (https://spdx.org/licenses/LGPL-2.1-or-later)
|
||||||
|
* PURPOSE: Favorites bar
|
||||||
|
* COPYRIGHT: Copyright 2024 Katayama Hirofumi MZ <katayama.hirofumi.mz@gmail.com>
|
||||||
|
*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
EXTERN_C VOID CFavBand_Init(HINSTANCE hInstance);
|
||||||
|
EXTERN_C HRESULT CFavBand_DllCanUnloadNow(VOID);
|
||||||
|
EXTERN_C HRESULT CFavBand_DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID *ppv);
|
||||||
|
EXTERN_C HRESULT CFavBand_DllRegisterServer(VOID);
|
||||||
|
EXTERN_C HRESULT CFavBand_DllUnregisterServer(VOID);
|
||||||
|
|
||||||
|
#define FAVBANDCLASSNAME L"ReactOS Favorites Band"
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
class CFavBand
|
||||||
|
: public CComCoClass<CFavBand, &CLSID_SH_FavBand>
|
||||||
|
, public CComObjectRootEx<CComMultiThreadModelNoCS>
|
||||||
|
, public CWindowImpl<CFavBand>
|
||||||
|
, public IDispatch
|
||||||
|
, public IDeskBand
|
||||||
|
, public IObjectWithSite
|
||||||
|
, public IInputObject
|
||||||
|
, public IPersistStream
|
||||||
|
, public IOleCommandTarget
|
||||||
|
, public IServiceProvider
|
||||||
|
, public IContextMenu
|
||||||
|
, public IBandNavigate
|
||||||
|
, public IWinEventHandler
|
||||||
|
, public INamespaceProxy
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
DECLARE_WND_CLASS_EX(FAVBANDCLASSNAME, 0, COLOR_3DFACE)
|
||||||
|
static LPCWSTR GetWndClassName() { return FAVBANDCLASSNAME; }
|
||||||
|
|
||||||
|
CFavBand();
|
||||||
|
virtual ~CFavBand();
|
||||||
|
|
||||||
|
// *** IOleWindow methods ***
|
||||||
|
STDMETHODIMP GetWindow(HWND *lphwnd) override;
|
||||||
|
STDMETHODIMP ContextSensitiveHelp(BOOL fEnterMode) override;
|
||||||
|
|
||||||
|
// *** IDockingWindow methods ***
|
||||||
|
STDMETHODIMP CloseDW(DWORD dwReserved) override;
|
||||||
|
STDMETHODIMP ResizeBorderDW(const RECT *prcBorder, IUnknown *punkToolbarSite, BOOL fReserved) override;
|
||||||
|
STDMETHODIMP ShowDW(BOOL fShow) override;
|
||||||
|
|
||||||
|
// *** IDeskBand methods ***
|
||||||
|
STDMETHODIMP GetBandInfo(DWORD dwBandID, DWORD dwViewMode, DESKBANDINFO *pdbi) override;
|
||||||
|
|
||||||
|
// *** IObjectWithSite methods ***
|
||||||
|
STDMETHODIMP SetSite(IUnknown *pUnkSite) override;
|
||||||
|
STDMETHODIMP GetSite(REFIID riid, void **ppvSite) override;
|
||||||
|
|
||||||
|
// *** IOleCommandTarget methods ***
|
||||||
|
STDMETHODIMP QueryStatus(const GUID *pguidCmdGroup, ULONG cCmds, OLECMD prgCmds [], OLECMDTEXT *pCmdText) override;
|
||||||
|
STDMETHODIMP Exec(const GUID *pguidCmdGroup, DWORD nCmdID, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut) override;
|
||||||
|
|
||||||
|
// *** IServiceProvider methods ***
|
||||||
|
STDMETHODIMP QueryService(REFGUID guidService, REFIID riid, void **ppvObject) override;
|
||||||
|
|
||||||
|
// *** IContextMenu methods ***
|
||||||
|
STDMETHODIMP QueryContextMenu(
|
||||||
|
HMENU hmenu,
|
||||||
|
UINT indexMenu,
|
||||||
|
UINT idCmdFirst,
|
||||||
|
UINT idCmdLast,
|
||||||
|
UINT uFlags) override;
|
||||||
|
STDMETHODIMP InvokeCommand(LPCMINVOKECOMMANDINFO lpici) override;
|
||||||
|
STDMETHODIMP GetCommandString(
|
||||||
|
UINT_PTR idCmd,
|
||||||
|
UINT uType,
|
||||||
|
UINT *pwReserved,
|
||||||
|
LPSTR pszName,
|
||||||
|
UINT cchMax) override;
|
||||||
|
|
||||||
|
// *** IInputObject methods ***
|
||||||
|
STDMETHODIMP UIActivateIO(BOOL fActivate, LPMSG lpMsg) override;
|
||||||
|
STDMETHODIMP HasFocusIO() override;
|
||||||
|
STDMETHODIMP TranslateAcceleratorIO(LPMSG lpMsg) override;
|
||||||
|
|
||||||
|
// *** IPersist methods ***
|
||||||
|
STDMETHODIMP GetClassID(CLSID *pClassID) override;
|
||||||
|
|
||||||
|
// *** IPersistStream methods ***
|
||||||
|
STDMETHODIMP IsDirty() override;
|
||||||
|
STDMETHODIMP Load(IStream *pStm) override;
|
||||||
|
STDMETHODIMP Save(IStream *pStm, BOOL fClearDirty) override;
|
||||||
|
STDMETHODIMP GetSizeMax(ULARGE_INTEGER *pcbSize) override;
|
||||||
|
|
||||||
|
// *** IWinEventHandler methods ***
|
||||||
|
STDMETHODIMP OnWinEvent(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT *theResult) override;
|
||||||
|
STDMETHODIMP IsWindowOwner(HWND hWnd) override;
|
||||||
|
|
||||||
|
// *** IBandNavigate methods ***
|
||||||
|
STDMETHODIMP Select(long paramC) override;
|
||||||
|
|
||||||
|
// *** INamespaceProxy methods ***
|
||||||
|
STDMETHODIMP GetNavigateTarget(long paramC, long param10, long param14) override;
|
||||||
|
STDMETHODIMP Invoke(long paramC) override;
|
||||||
|
STDMETHODIMP OnSelectionChanged(long paramC) override;
|
||||||
|
STDMETHODIMP RefreshFlags(long paramC, long param10, long param14) override;
|
||||||
|
STDMETHODIMP CacheItem(long paramC) override;
|
||||||
|
|
||||||
|
// *** IDispatch methods ***
|
||||||
|
STDMETHODIMP GetTypeInfoCount(UINT *pctinfo) override;
|
||||||
|
STDMETHODIMP GetTypeInfo(UINT iTInfo, LCID lcid, ITypeInfo **ppTInfo) override;
|
||||||
|
STDMETHODIMP GetIDsOfNames(
|
||||||
|
REFIID riid,
|
||||||
|
LPOLESTR *rgszNames,
|
||||||
|
UINT cNames,
|
||||||
|
LCID lcid,
|
||||||
|
DISPID *rgDispId) override;
|
||||||
|
STDMETHODIMP Invoke(
|
||||||
|
DISPID dispIdMember,
|
||||||
|
REFIID riid,
|
||||||
|
LCID lcid,
|
||||||
|
WORD wFlags,
|
||||||
|
DISPPARAMS *pDispParams,
|
||||||
|
VARIANT *pVarResult,
|
||||||
|
EXCEPINFO *pExcepInfo,
|
||||||
|
UINT *puArgErr) override;
|
||||||
|
|
||||||
|
DECLARE_REGISTRY_RESOURCEID(IDR_FAVBAND)
|
||||||
|
DECLARE_NOT_AGGREGATABLE(CFavBand)
|
||||||
|
DECLARE_PROTECT_FINAL_CONSTRUCT()
|
||||||
|
|
||||||
|
BEGIN_COM_MAP(CFavBand)
|
||||||
|
COM_INTERFACE_ENTRY_IID(IID_IDispatch, IDispatch)
|
||||||
|
COM_INTERFACE_ENTRY_IID(IID_IDeskBand, IDeskBand)
|
||||||
|
COM_INTERFACE_ENTRY2_IID(IID_IDockingWindow, IDockingWindow, IDeskBand)
|
||||||
|
COM_INTERFACE_ENTRY2_IID(IID_IOleWindow, IOleWindow, IDeskBand)
|
||||||
|
COM_INTERFACE_ENTRY_IID(IID_IObjectWithSite, IObjectWithSite)
|
||||||
|
COM_INTERFACE_ENTRY_IID(IID_IInputObject, IInputObject)
|
||||||
|
COM_INTERFACE_ENTRY_IID(IID_IPersistStream, IPersistStream)
|
||||||
|
COM_INTERFACE_ENTRY2_IID(IID_IPersist, IPersist, IPersistStream)
|
||||||
|
COM_INTERFACE_ENTRY_IID(IID_IOleCommandTarget, IOleCommandTarget)
|
||||||
|
COM_INTERFACE_ENTRY_IID(IID_IServiceProvider, IServiceProvider)
|
||||||
|
COM_INTERFACE_ENTRY_IID(IID_IContextMenu, IContextMenu)
|
||||||
|
COM_INTERFACE_ENTRY2_IID(IID_IUnknown, IUnknown, IContextMenu)
|
||||||
|
COM_INTERFACE_ENTRY_IID(IID_IBandNavigate, IBandNavigate)
|
||||||
|
COM_INTERFACE_ENTRY_IID(IID_IWinEventHandler, IWinEventHandler)
|
||||||
|
COM_INTERFACE_ENTRY_IID(IID_INamespaceProxy, INamespaceProxy)
|
||||||
|
END_COM_MAP()
|
||||||
|
|
||||||
|
BEGIN_MSG_MAP(CFavBand)
|
||||||
|
MESSAGE_HANDLER(WM_CREATE, OnCreate)
|
||||||
|
MESSAGE_HANDLER(WM_DESTROY, OnDestroy)
|
||||||
|
MESSAGE_HANDLER(WM_SIZE, OnSize)
|
||||||
|
MESSAGE_HANDLER(WM_SETFOCUS, OnSetFocus)
|
||||||
|
MESSAGE_HANDLER(WM_KILLFOCUS, OnKillFocus)
|
||||||
|
MESSAGE_HANDLER(WM_COMMAND, OnCommand)
|
||||||
|
END_MSG_MAP()
|
||||||
|
|
||||||
|
protected:
|
||||||
|
BOOL m_fVisible;
|
||||||
|
BOOL m_bFocused;
|
||||||
|
DWORD m_dwBandID;
|
||||||
|
CComPtr<IUnknown> m_pSite;
|
||||||
|
CComHeapPtr<ITEMIDLIST> m_pidlFav;
|
||||||
|
HIMAGELIST m_hToolbarImageList;
|
||||||
|
HIMAGELIST m_hTreeViewImageList;
|
||||||
|
CToolbar<> m_hwndToolbar;
|
||||||
|
CTreeView m_hwndTreeView;
|
||||||
|
|
||||||
|
VOID OnFinalMessage(HWND) override;
|
||||||
|
|
||||||
|
// *** helper methods ***
|
||||||
|
BOOL CreateToolbar();
|
||||||
|
BOOL CreateTreeView();
|
||||||
|
|
||||||
|
// *** message handlers ***
|
||||||
|
LRESULT OnCreate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
|
||||||
|
LRESULT OnDestroy(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
|
||||||
|
LRESULT OnSize(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
|
||||||
|
LRESULT OnSetFocus(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled);
|
||||||
|
LRESULT OnKillFocus(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled);
|
||||||
|
LRESULT OnCommand(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled);
|
||||||
|
};
|
||||||
|
#endif // def __cplusplus
|
|
@ -1,9 +1,7 @@
|
||||||
|
|
||||||
add_definitions(
|
add_definitions(
|
||||||
-D__WINESRC__
|
|
||||||
-D_SHDOCVW_)
|
-D_SHDOCVW_)
|
||||||
|
|
||||||
include_directories(${REACTOS_SOURCE_DIR}/sdk/include/reactos/wine)
|
|
||||||
spec2def(shdocvw.dll shdocvw.spec ADD_IMPORTLIB)
|
spec2def(shdocvw.dll shdocvw.spec ADD_IMPORTLIB)
|
||||||
|
|
||||||
list(APPEND SOURCE
|
list(APPEND SOURCE
|
||||||
|
@ -19,12 +17,23 @@ add_library(shdocvw MODULE
|
||||||
${SOURCE}
|
${SOURCE}
|
||||||
mrulist.cpp
|
mrulist.cpp
|
||||||
shdocvw.rc
|
shdocvw.rc
|
||||||
|
$<TARGET_OBJECTS:shdocvw_sublib>
|
||||||
${CMAKE_CURRENT_BINARY_DIR}/shdocvw.def)
|
${CMAKE_CURRENT_BINARY_DIR}/shdocvw.def)
|
||||||
|
|
||||||
set_module_type(shdocvw win32dll)
|
target_include_directories(shdocvw BEFORE PRIVATE
|
||||||
|
${REACTOS_SOURCE_DIR}/sdk/include/reactos/wine
|
||||||
|
)
|
||||||
|
|
||||||
|
set_module_type(shdocvw win32dll UNICODE)
|
||||||
target_link_libraries(shdocvw uuid wine)
|
target_link_libraries(shdocvw uuid wine)
|
||||||
add_delay_importlibs(shdocvw shell32 ole32 oleaut32 ieframe)
|
add_delay_importlibs(shdocvw shell32 user32 gdi32 ole32 oleaut32 ieframe)
|
||||||
add_importlibs(shdocvw shlwapi advapi32 msvcrt kernel32 ntdll)
|
add_importlibs(shdocvw shlwapi advapi32 msvcrt comctl32 kernel32 ntdll)
|
||||||
add_dependencies(shdocvw stdole2)
|
add_dependencies(shdocvw stdole2)
|
||||||
add_pch(shdocvw precomp.h SOURCE)
|
add_pch(shdocvw precomp.h SOURCE)
|
||||||
add_cd_file(TARGET shdocvw DESTINATION reactos/system32 FOR all)
|
add_cd_file(TARGET shdocvw DESTINATION reactos/system32 FOR all)
|
||||||
|
|
||||||
|
add_library(shdocvw_sublib OBJECT CFavBand.cpp)
|
||||||
|
target_link_libraries(shdocvw_sublib PRIVATE atl_classes)
|
||||||
|
target_compile_definitions(shdocvw_sublib PRIVATE $<TARGET_PROPERTY:shdocvw,COMPILE_DEFINITIONS>)
|
||||||
|
target_compile_options(shdocvw_sublib PRIVATE $<TARGET_PROPERTY:shdocvw,COMPILE_OPTIONS>)
|
||||||
|
add_dependencies(shdocvw_sublib psdk)
|
||||||
|
|
13
dll/win32/shdocvw/favband.rgs
Normal file
13
dll/win32/shdocvw/favband.rgs
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
HKCR
|
||||||
|
{
|
||||||
|
NoRemove CLSID
|
||||||
|
{
|
||||||
|
ForceRemove {EFA24E61-B078-11D0-89E4-00C04FC9E26E} = s 'Favorites Band'
|
||||||
|
{
|
||||||
|
InprocServer32 = s '%MODULE%'
|
||||||
|
{
|
||||||
|
val ThreadingModel = s 'Apartment'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
8
dll/win32/shdocvw/lang/en-US.rc
Normal file
8
dll/win32/shdocvw/lang/en-US.rc
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
|
||||||
|
LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
|
||||||
|
|
||||||
|
STRINGTABLE
|
||||||
|
BEGIN
|
||||||
|
IDS_ADD "Add"
|
||||||
|
IDS_ORGANIZE "Organize"
|
||||||
|
END
|
12
dll/win32/shdocvw/resource.h
Normal file
12
dll/win32/shdocvw/resource.h
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
#define IDR_SHDOCVW 1
|
||||||
|
#define IDR_FAVBAND 2
|
||||||
|
#define IDR_TYPELIB 1
|
||||||
|
|
||||||
|
#define IDW_TOOLBAR 2
|
||||||
|
#define IDW_TREEVIEW 100
|
||||||
|
|
||||||
|
#define ID_ADD 100
|
||||||
|
#define ID_ORGANIZE 101
|
||||||
|
|
||||||
|
#define IDS_ADD 1000
|
||||||
|
#define IDS_ORGANIZE 1001
|
|
@ -60,9 +60,17 @@ static inline void SHDOCVW_LockModule(void) { InterlockedIncrement( &SHDOCVW_ref
|
||||||
static inline void SHDOCVW_UnlockModule(void) { InterlockedDecrement( &SHDOCVW_refCount ); }
|
static inline void SHDOCVW_UnlockModule(void) { InterlockedDecrement( &SHDOCVW_refCount ); }
|
||||||
|
|
||||||
#ifdef __REACTOS__
|
#ifdef __REACTOS__
|
||||||
|
#include "resource.h"
|
||||||
EXTERN_C HRESULT CMruLongList_CreateInstance(DWORD_PTR dwUnused1, void **ppv, DWORD_PTR dwUnused3);
|
EXTERN_C HRESULT CMruLongList_CreateInstance(DWORD_PTR dwUnused1, void **ppv, DWORD_PTR dwUnused3);
|
||||||
EXTERN_C HRESULT CMruPidlList_CreateInstance(DWORD_PTR dwUnused1, void **ppv, DWORD_PTR dwUnused3);
|
EXTERN_C HRESULT CMruPidlList_CreateInstance(DWORD_PTR dwUnused1, void **ppv, DWORD_PTR dwUnused3);
|
||||||
EXTERN_C HRESULT CMruClassFactory_CreateInstance(REFIID riid, void **ppv);
|
EXTERN_C HRESULT CMruClassFactory_CreateInstance(REFIID riid, void **ppv);
|
||||||
|
#define ARRAY_SIZE(array) _countof(array)
|
||||||
|
#ifdef __cplusplus
|
||||||
|
void *operator new(size_t size);
|
||||||
|
void operator delete(void *ptr);
|
||||||
|
void operator delete(void *ptr, size_t size);
|
||||||
#endif
|
#endif
|
||||||
|
EXTERN_C HINSTANCE instance;
|
||||||
|
#endif // def __REACTOS__
|
||||||
|
|
||||||
#endif /* __WINE_SHDOCVW_H */
|
#endif /* __WINE_SHDOCVW_H */
|
||||||
|
|
|
@ -17,10 +17,13 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "windef.h"
|
#include "windef.h"
|
||||||
|
#include "resource.h"
|
||||||
|
|
||||||
1 WINE_REGISTRY "shdocvw_v1.rgs"
|
IDR_SHDOCVW WINE_REGISTRY "shdocvw_v1.rgs"
|
||||||
|
|
||||||
1 TYPELIB "shdocvw_v1.tlb"
|
IDR_FAVBAND REGISTRY "favband.rgs"
|
||||||
|
|
||||||
|
IDR_TYPELIB TYPELIB "shdocvw_v1.tlb"
|
||||||
|
|
||||||
LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
|
LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
|
||||||
|
|
||||||
|
@ -33,3 +36,10 @@ LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
|
||||||
#define WINE_EXTRAVALUES VALUE "OLESelfRegister",""
|
#define WINE_EXTRAVALUES VALUE "OLESelfRegister",""
|
||||||
|
|
||||||
#include "wine/wine_common_ver.rc"
|
#include "wine/wine_common_ver.rc"
|
||||||
|
|
||||||
|
/* UTF-8 */
|
||||||
|
#pragma code_page(65001)
|
||||||
|
|
||||||
|
#ifdef LANGUAGE_EN_US
|
||||||
|
#include "lang/en-US.rc"
|
||||||
|
#endif
|
||||||
|
|
|
@ -32,6 +32,7 @@
|
||||||
#include "winnls.h"
|
#include "winnls.h"
|
||||||
#include <shlguid_undoc.h>
|
#include <shlguid_undoc.h>
|
||||||
#include <rpcproxy.h> /* for __wine_register_resources / __wine_unregister_resources */
|
#include <rpcproxy.h> /* for __wine_register_resources / __wine_unregister_resources */
|
||||||
|
#include "CFavBand.h"
|
||||||
#endif
|
#endif
|
||||||
#include "shlwapi.h"
|
#include "shlwapi.h"
|
||||||
#include "wininet.h"
|
#include "wininet.h"
|
||||||
|
@ -46,7 +47,7 @@ LONG SHDOCVW_refCount = 0;
|
||||||
static HMODULE SHDOCVW_hshell32 = 0;
|
static HMODULE SHDOCVW_hshell32 = 0;
|
||||||
static HINSTANCE ieframe_instance;
|
static HINSTANCE ieframe_instance;
|
||||||
#ifdef __REACTOS__
|
#ifdef __REACTOS__
|
||||||
static HINSTANCE instance;
|
HINSTANCE instance;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static HINSTANCE get_ieframe_instance(void)
|
static HINSTANCE get_ieframe_instance(void)
|
||||||
|
@ -93,6 +94,11 @@ HRESULT WINAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, void **ppv)
|
||||||
return get_ieframe_object(rclsid, riid, ppv);
|
return get_ieframe_object(rclsid, riid, ppv);
|
||||||
|
|
||||||
#ifdef __REACTOS__
|
#ifdef __REACTOS__
|
||||||
|
{
|
||||||
|
HRESULT hr = CFavBand_DllGetClassObject(rclsid, riid, ppv);
|
||||||
|
if (hr != CLASS_E_CLASSNOTAVAILABLE)
|
||||||
|
return hr;
|
||||||
|
}
|
||||||
if (IsEqualGUID(riid, &IID_IClassFactory) || IsEqualGUID(riid, &IID_IUnknown))
|
if (IsEqualGUID(riid, &IID_IClassFactory) || IsEqualGUID(riid, &IID_IUnknown))
|
||||||
{
|
{
|
||||||
if (IsEqualGUID(rclsid, &CLSID_MruLongList) ||
|
if (IsEqualGUID(rclsid, &CLSID_MruLongList) ||
|
||||||
|
@ -122,6 +128,7 @@ HRESULT WINAPI DllRegisterServer(void)
|
||||||
{
|
{
|
||||||
TRACE("\n");
|
TRACE("\n");
|
||||||
#ifdef __REACTOS__
|
#ifdef __REACTOS__
|
||||||
|
CFavBand_DllRegisterServer();
|
||||||
return __wine_register_resources(instance);
|
return __wine_register_resources(instance);
|
||||||
#else
|
#else
|
||||||
return S_OK;
|
return S_OK;
|
||||||
|
@ -135,6 +142,7 @@ HRESULT WINAPI DllUnregisterServer(void)
|
||||||
{
|
{
|
||||||
TRACE("\n");
|
TRACE("\n");
|
||||||
#ifdef __REACTOS__
|
#ifdef __REACTOS__
|
||||||
|
CFavBand_DllUnregisterServer();
|
||||||
return __wine_unregister_resources(instance);
|
return __wine_unregister_resources(instance);
|
||||||
#else
|
#else
|
||||||
return S_OK;
|
return S_OK;
|
||||||
|
@ -181,6 +189,7 @@ BOOL WINAPI DllMain(HINSTANCE hinst, DWORD fdwReason, LPVOID fImpLoad)
|
||||||
case DLL_PROCESS_ATTACH:
|
case DLL_PROCESS_ATTACH:
|
||||||
#ifdef __REACTOS__
|
#ifdef __REACTOS__
|
||||||
instance = hinst;
|
instance = hinst;
|
||||||
|
CFavBand_Init(hinst);
|
||||||
#endif
|
#endif
|
||||||
DisableThreadLibraryCalls(hinst);
|
DisableThreadLibraryCalls(hinst);
|
||||||
break;
|
break;
|
||||||
|
@ -198,6 +207,10 @@ BOOL WINAPI DllMain(HINSTANCE hinst, DWORD fdwReason, LPVOID fImpLoad)
|
||||||
*/
|
*/
|
||||||
HRESULT WINAPI DllCanUnloadNow(void)
|
HRESULT WINAPI DllCanUnloadNow(void)
|
||||||
{
|
{
|
||||||
|
#ifdef __REACTOS__
|
||||||
|
if (CFavBand_DllCanUnloadNow() != S_OK)
|
||||||
|
return S_FALSE;
|
||||||
|
#endif
|
||||||
return SHDOCVW_refCount ? S_FALSE : S_OK;
|
return SHDOCVW_refCount ? S_FALSE : S_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -160,7 +160,11 @@ static HRESULT WINAPI RegistryPropertyBag_IPropertyBag_Write(IPropertyBag *iface
|
||||||
return E_NOTIMPL;
|
return E_NOTIMPL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef __REACTOS__
|
||||||
|
static IPropertyBagVtbl RegistryPropertyBag_IPropertyBagVtbl = {
|
||||||
|
#else
|
||||||
static const IPropertyBagVtbl RegistryPropertyBag_IPropertyBagVtbl = {
|
static const IPropertyBagVtbl RegistryPropertyBag_IPropertyBagVtbl = {
|
||||||
|
#endif
|
||||||
RegistryPropertyBag_IPropertyBag_QueryInterface,
|
RegistryPropertyBag_IPropertyBag_QueryInterface,
|
||||||
RegistryPropertyBag_IPropertyBag_AddRef,
|
RegistryPropertyBag_IPropertyBag_AddRef,
|
||||||
RegistryPropertyBag_IPropertyBag_Release,
|
RegistryPropertyBag_IPropertyBag_Release,
|
||||||
|
@ -305,7 +309,11 @@ static HRESULT WINAPI InstanceObjectFactory_IClassFactory_LockServer(IClassFacto
|
||||||
return S_OK;
|
return S_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef __REACTOS__
|
||||||
|
static IClassFactoryVtbl InstanceObjectFactory_IClassFactoryVtbl = {
|
||||||
|
#else
|
||||||
static const IClassFactoryVtbl InstanceObjectFactory_IClassFactoryVtbl = {
|
static const IClassFactoryVtbl InstanceObjectFactory_IClassFactoryVtbl = {
|
||||||
|
#endif
|
||||||
InstanceObjectFactory_IClassFactory_QueryInterface,
|
InstanceObjectFactory_IClassFactory_QueryInterface,
|
||||||
InstanceObjectFactory_IClassFactory_AddRef,
|
InstanceObjectFactory_IClassFactory_AddRef,
|
||||||
InstanceObjectFactory_IClassFactory_Release,
|
InstanceObjectFactory_IClassFactory_Release,
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue