ReactOS 0.4.15-dev-8614-gbc76250
CFavBand.cpp
Go to the documentation of this file.
1/*
2 * PROJECT: ReactOS shdocvw
3 * LICENSE: LGPL-2.1-or-later (https://spdx.org/licenses/LGPL-2.1-or-later)
4 * PURPOSE: Favorites bar
5 * COPYRIGHT: Copyright 2024 Katayama Hirofumi MZ <katayama.hirofumi.mz@gmail.com>
6 */
7
8#include "objects.h"
9
10#include <wine/debug.h>
12
13CFavBand::CFavBand()
14{
15}
16
17CFavBand::~CFavBand()
18{
19}
20
21STDMETHODIMP CFavBand::GetClassID(CLSID *pClassID)
22{
23 if (!pClassID)
24 return E_POINTER;
25 *pClassID = CLSID_SH_FavBand;
26 return S_OK;
27}
28
29INT CFavBand::_GetRootCsidl()
30{
31 return CSIDL_FAVORITES;
32}
33
34DWORD CFavBand::_GetTVStyle()
35{
36 // Remove TVS_SINGLEEXPAND for now since it has strange behaviour
38 /*TVS_SINGLEEXPAND | TVS_TRACKSELECT |*/ TVS_SHOWSELALWAYS | TVS_EDITLABELS |
40}
41
42DWORD CFavBand::_GetTVExStyle()
43{
44 return WS_EX_CLIENTEDGE;
45}
46
47DWORD CFavBand::_GetEnumFlags()
48{
49 return SHCONTF_FOLDERS | SHCONTF_NONFOLDERS;
50}
51
52BOOL CFavBand::_GetTitle(LPWSTR pszTitle, INT cchTitle)
53{
54#define IDS_FAVORITES 47 // Borrowed from shell32.dll
56 if (hShell32)
57 {
58 ::LoadStringW(hShell32, IDS_FAVORITES, pszTitle, cchTitle);
60 return TRUE;
61 }
62 return FALSE;
63#undef IDS_FAVORITES
64}
65
66BOOL CFavBand::_WantsRootItem()
67{
68 return FALSE;
69}
70
71HRESULT CFavBand::_CreateToolbar(HWND hwndParent)
72{
73#define IDB_SHELL_EXPLORER_SM 216 // Borrowed from browseui.dll
74 HINSTANCE hinstBrowseUI = LoadLibraryExW(L"browseui.dll", NULL, LOAD_LIBRARY_AS_DATAFILE);
75 ATLASSERT(hinstBrowseUI);
76 HBITMAP hbmToolbar = NULL;
77 if (hinstBrowseUI)
78 {
79 hbmToolbar = LoadBitmapW(hinstBrowseUI, MAKEINTRESOURCEW(IDB_SHELL_EXPLORER_SM));
80 FreeLibrary(hinstBrowseUI);
81 }
82#undef IDB_SHELL_EXPLORER_SM
83 ATLASSERT(hbmToolbar);
84 if (!hbmToolbar)
85 return E_FAIL;
86
87 m_hToolbarImageList = ImageList_Create(16, 16, ILC_COLOR32, 0, 8);
88 ATLASSERT(m_hToolbarImageList);
89 if (!m_hToolbarImageList)
90 return E_FAIL;
91
92 ImageList_Add(m_hToolbarImageList, hbmToolbar, NULL);
93 DeleteObject(hbmToolbar);
94
99 ATLASSERT(hwndTB);
100 if (!hwndTB)
101 return E_FAIL;
102
103 m_hwndToolbar.Attach(hwndTB);
104 m_hwndToolbar.SendMessage(TB_BUTTONSTRUCTSIZE, (WPARAM)sizeof(TBBUTTON), 0);
105 m_hwndToolbar.SendMessage(TB_SETIMAGELIST, 0, (LPARAM)m_hToolbarImageList);
106 m_hwndToolbar.SendMessage(TB_SETEXTENDEDSTYLE, 0, TBSTYLE_EX_MIXEDBUTTONS);
107
108 WCHAR szzAdd[MAX_PATH], szzOrganize[MAX_PATH];
109 ZeroMemory(szzAdd, sizeof(szzAdd));
110 ZeroMemory(szzOrganize, sizeof(szzOrganize));
111 LoadStringW(instance, IDS_ADD, szzAdd, _countof(szzAdd));
112 LoadStringW(instance, IDS_ORGANIZE, szzOrganize, _countof(szzOrganize));
113
114 TBBUTTON tbb[2] = { { 0 } };
115 INT iButton = 0;
116 tbb[iButton].iBitmap = 3;
117 tbb[iButton].idCommand = ID_ADD;
118 tbb[iButton].fsState = TBSTATE_ENABLED;
120 tbb[iButton].iString = (INT)m_hwndToolbar.SendMessage(TB_ADDSTRING, 0, (LPARAM)szzAdd);
121 ++iButton;
122 tbb[iButton].iBitmap = 42;
123 tbb[iButton].idCommand = ID_ORGANIZE;
124 tbb[iButton].fsState = TBSTATE_ENABLED;
126 tbb[iButton].iString = (INT)m_hwndToolbar.SendMessage(TB_ADDSTRING, 0, (LPARAM)szzOrganize);
127 ++iButton;
128 ATLASSERT(iButton == _countof(tbb));
129 m_hwndToolbar.SendMessage(TB_ADDBUTTONS, iButton, (LPARAM)&tbb);
130
131 return S_OK;
132}
133
134// Called when the user has selected an item.
135STDMETHODIMP CFavBand::OnSelectionChanged(_In_ PCIDLIST_ABSOLUTE pidl)
136{
137 CComHeapPtr<ITEMIDLIST> pidlTarget;
138 DWORD attrs = SFGAO_FOLDER | SFGAO_LINK;
139 HRESULT hr = GetNavigateTarget(pidl, &pidlTarget, &attrs);
141 return hr;
142
143 if ((attrs & (SFGAO_FOLDER | SFGAO_LINK)) == (SFGAO_FOLDER | SFGAO_LINK))
144 return _UpdateBrowser(pidlTarget);
145
146 if (attrs & SFGAO_FOLDER)
147 {
148 HTREEITEM hItem = TreeView_GetSelection(m_hwndTreeView);
149 CItemData *pItemData = GetItemData(hItem);
150 if (pItemData && !pItemData->expanded)
151 {
152 _InsertSubitems(hItem, pItemData->absolutePidl);
153 pItemData->expanded = TRUE;
154 }
155 TreeView_Expand(m_hwndTreeView, hItem, TVE_EXPAND);
156 return S_OK;
157 }
158
159 SHELLEXECUTEINFOW info = { sizeof(info) };
161 info.hwnd = m_hWnd;
162 info.nShow = SW_SHOWNORMAL;
163 info.lpIDList = pidlTarget;
165 return hr;
166}
167
168void CFavBand::_SortItems(HTREEITEM hParent)
169{
170 TreeView_SortChildren(m_hwndTreeView, hParent, 0); // Sort by name
171}
172
173HRESULT CFavBand::_CreateTreeView(HWND hwndParent)
174{
175 HRESULT hr = CNSCBand::_CreateTreeView(hwndParent);
177 return hr;
178
179 TreeView_SetItemHeight(m_hwndTreeView, 24);
180 _InsertSubitems(TVI_ROOT, m_pidlRoot);
181 return hr;
182}
#define ATLASSERT(x)
Definition: CComVariant.cpp:10
#define IDS_FAVORITES
#define IDB_SHELL_EXPLORER_SM
Arabic default style
Definition: afstyles.h:94
#define WINE_DEFAULT_DEBUG_CHANNEL(t)
Definition: precomp.h:23
#define UlongToHandle(ul)
Definition: basetsd.h:97
#define STDMETHODIMP
Definition: basetyps.h:43
static HWND hwndParent
Definition: cryptui.c:300
#define E_FAIL
Definition: ddrawi.h:102
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
static HINSTANCE instance
Definition: main.c:40
INT WINAPI ImageList_Add(HIMAGELIST himl, HBITMAP hbmImage, HBITMAP hbmMask)
Definition: imagelist.c:448
HIMAGELIST WINAPI ImageList_Create(INT cx, INT cy, UINT flags, INT cInitial, INT cGrow)
Definition: imagelist.c:804
#define FreeLibrary(x)
Definition: compat.h:748
#define MAX_PATH
Definition: compat.h:34
#define FAILED_UNEXPECTEDLY(hr)
Definition: precomp.h:121
HINSTANCE WINAPI DECLSPEC_HOTPATCH LoadLibraryExW(LPCWSTR lpLibFileName, HANDLE hFile, DWORD dwFlags)
Definition: loader.c:288
#define IDS_ADD
Definition: resource.h:111
#define IDW_TOOLBAR
Definition: resource.h:6
#define ID_ADD
Definition: resource.h:9
#define IDS_ORGANIZE
Definition: resource.h:13
#define ID_ORGANIZE
Definition: resource.h:10
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
pKey DeleteObject()
#define S_OK
Definition: intsafe.h:52
static HBITMAP
Definition: button.c:44
static HMODULE hShell32
Definition: string.c:34
static const CLSID *static CLSID *static const GUID VARIANT VARIANT *static IServiceProvider DWORD *static HMENU
Definition: ordinal.c:63
#define _In_
Definition: ms_sal.h:308
#define L(x)
Definition: ntvdm.h:50
#define WS_CHILD
Definition: pedump.c:617
#define WS_TABSTOP
Definition: pedump.c:634
#define WS_VISIBLE
Definition: pedump.c:620
#define WS_CLIPSIBLINGS
Definition: pedump.c:618
#define WS_CLIPCHILDREN
Definition: pedump.c:619
#define INT
Definition: polytest.cpp:20
#define TB_ADDBUTTONS
Definition: commctrl.h:1271
#define BTNS_BUTTON
Definition: commctrl.h:998
#define TB_ADDSTRING
Definition: commctrl.h:1167
#define TB_SETEXTENDEDSTYLE
Definition: commctrl.h:1190
#define BTNS_SHOWTEXT
Definition: commctrl.h:1006
#define BTNS_AUTOSIZE
Definition: commctrl.h:1004
#define TreeView_Expand(hwnd, hitem, code)
Definition: commctrl.h:3425
#define TreeView_SortChildren(hwnd, hitem, recurse)
Definition: commctrl.h:3547
#define TBSTYLE_LIST
Definition: commctrl.h:993
#define TBSTYLE_EX_MIXEDBUTTONS
Definition: commctrl.h:1012
#define TB_BUTTONSTRUCTSIZE
Definition: commctrl.h:1134
#define TVS_SHOWSELALWAYS
Definition: commctrl.h:3257
#define ILC_COLOR32
Definition: commctrl.h:358
#define TVS_FULLROWSELECT
Definition: commctrl.h:3264
#define TreeView_GetSelection(hwnd)
Definition: commctrl.h:3478
#define TVE_EXPAND
Definition: commctrl.h:3428
#define TB_SETIMAGELIST
Definition: commctrl.h:1150
#define TVI_ROOT
Definition: commctrl.h:3373
#define TVS_NONEVENHEIGHT
Definition: commctrl.h:3266
#define CCS_NODIVIDER
Definition: commctrl.h:2253
#define TOOLBARCLASSNAMEW
Definition: commctrl.h:943
#define TBSTATE_ENABLED
Definition: commctrl.h:974
#define TBSTYLE_FLAT
Definition: commctrl.h:992
#define TVS_NOHSCROLL
Definition: commctrl.h:3267
#define TBSTYLE_WRAPABLE
Definition: commctrl.h:990
#define TVS_EDITLABELS
Definition: commctrl.h:3255
#define TVS_INFOTIP
Definition: commctrl.h:3263
#define TreeView_SetItemHeight(hwnd, iHeight)
Definition: commctrl.h:3577
#define SEE_MASK_IDLIST
Definition: shellapi.h:27
#define SEE_MASK_FLAG_NO_UI
Definition: shellapi.h:36
BOOL WINAPI DECLSPEC_HOTPATCH ShellExecuteExW(LPSHELLEXECUTEINFOW sei)
Definition: shlexec.cpp:2424
HRESULT hr
Definition: shlfolder.c:183
#define CSIDL_FAVORITES
Definition: shlobj.h:2179
#define _countof(array)
Definition: sndvol32.h:70
BYTE fsState
Definition: commctrl.h:951
INT_PTR iString
Definition: commctrl.h:959
int idCommand
Definition: commctrl.h:950
int iBitmap
Definition: commctrl.h:949
BYTE fsStyle
Definition: commctrl.h:952
int32_t INT
Definition: typedefs.h:58
#define ZeroMemory
Definition: winbase.h:1712
#define LOAD_LIBRARY_AS_DATAFILE
Definition: winbase.h:342
LONG_PTR LPARAM
Definition: windef.h:208
UINT_PTR WPARAM
Definition: windef.h:207
#define E_POINTER
Definition: winerror.h:2365
#define SW_SHOWNORMAL
Definition: winuser.h:773
int WINAPI LoadStringW(_In_opt_ HINSTANCE hInstance, _In_ UINT uID, _Out_writes_to_(cchBufferMax, return+1) LPWSTR lpBuffer, _In_ int cchBufferMax)
HWND WINAPI CreateWindowExW(_In_ DWORD dwExStyle, _In_opt_ LPCWSTR lpClassName, _In_opt_ LPCWSTR lpWindowName, _In_ DWORD dwStyle, _In_ int X, _In_ int Y, _In_ int nWidth, _In_ int nHeight, _In_opt_ HWND hWndParent, _In_opt_ HMENU hMenu, _In_opt_ HINSTANCE hInstance, _In_opt_ LPVOID lpParam)
#define WS_EX_CLIENTEDGE
Definition: winuser.h:384
#define MAKEINTRESOURCEW(i)
Definition: winuser.h:582
HBITMAP WINAPI LoadBitmapW(_In_opt_ HINSTANCE, _In_ LPCWSTR)
Definition: cursoricon.c:2207
__wchar_t WCHAR
Definition: xmlstorage.h:180
WCHAR * LPWSTR
Definition: xmlstorage.h:184