[SHELL32] Fix the grouping of folder options radiobuttons CORE-10837
[reactos.git] / reactos / dll / win32 / shell32 / CFolder.cpp
1 /*
2 * Folder implementation
3 *
4 * Copyright 2015 Mark Jansen
5 *
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
10 *
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
15 *
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
19 */
20
21 #include "precomp.h"
22
23 WINE_DEFAULT_DEBUG_CHANNEL(shell);
24
25
26 CFolder::CFolder()
27 {
28 }
29
30 CFolder::~CFolder()
31 {
32 }
33
34 void CFolder::Init(LPITEMIDLIST idlist)
35 {
36 m_idlist.Attach(idlist);
37 }
38
39 HRESULT CFolder::GetShellFolder(CComPtr<IShellFolder>& psfCurrent)
40 {
41 CComPtr<IShellFolder> psfDesktop;
42
43 HRESULT hr = SHGetDesktopFolder(&psfDesktop);
44 if (FAILED_UNEXPECTEDLY(hr))
45 return hr;
46
47 return psfDesktop->BindToObject(m_idlist, NULL, IID_PPV_ARG(IShellFolder, &psfCurrent));
48 }
49
50 // *** Folder methods ***
51 HRESULT STDMETHODCALLTYPE CFolder::get_Title(BSTR *pbs)
52 {
53 if (!pbs)
54 return E_POINTER;
55
56 WCHAR path[MAX_PATH+2] = {0};
57 HRESULT hr = ILGetDisplayNameExW(NULL, m_idlist, path, ILGDN_INFOLDER);
58 if (FAILED_UNEXPECTEDLY(hr))
59 return hr;
60
61 *pbs = SysAllocString(path);
62 return S_OK;
63 }
64
65 HRESULT STDMETHODCALLTYPE CFolder::get_Application(IDispatch **ppid)
66 {
67 TRACE("(%p, %p)\n", this, ppid);
68 return E_NOTIMPL;
69 }
70
71 HRESULT STDMETHODCALLTYPE CFolder::get_Parent(IDispatch **ppid)
72 {
73 TRACE("(%p %p)\n", this, ppid);
74 return E_NOTIMPL;
75 }
76
77 HRESULT STDMETHODCALLTYPE CFolder::get_ParentFolder(Folder **ppsf)
78 {
79 TRACE("(%p, %p)\n", this);
80 return E_NOTIMPL;
81 }
82
83 HRESULT STDMETHODCALLTYPE CFolder::Items(FolderItems **ppid)
84 {
85 TRACE("(%p, %p)\n", this, ppid);
86 return E_NOTIMPL;
87 }
88
89 HRESULT STDMETHODCALLTYPE CFolder::ParseName(BSTR bName, FolderItem **ppid)
90 {
91 TRACE("(%p, %s, %p)\n", this, wine_dbgstr_w(bName), ppid);
92 if (!ppid)
93 return E_POINTER;
94 *ppid = NULL;
95
96 CComPtr<IShellFolder> psfCurrent;
97 HRESULT hr = GetShellFolder(psfCurrent);
98 if (FAILED_UNEXPECTEDLY(hr))
99 return hr;
100
101 CComHeapPtr<ITEMIDLIST_RELATIVE> relativePidl;
102 hr = psfCurrent->ParseDisplayName(NULL, NULL, bName, NULL, &relativePidl, NULL);
103 if (!SUCCEEDED(hr))
104 return S_FALSE;
105
106 CFolderItem* item = new CComObject<CFolderItem>();
107 item->AddRef();
108 item->Init(ILCombine(m_idlist, relativePidl));
109 *ppid = item;
110 return S_OK;
111 }
112
113 HRESULT STDMETHODCALLTYPE CFolder::NewFolder(BSTR bName, VARIANT vOptions)
114 {
115 TRACE("(%p, %s, %s)\n", this, wine_dbgstr_w(bName), wine_dbgstr_variant(&vOptions));
116 return E_NOTIMPL;
117 }
118
119 HRESULT STDMETHODCALLTYPE CFolder::MoveHere(VARIANT vItem, VARIANT vOptions)
120 {
121 TRACE("(%p, %s, %s)\n", this, wine_dbgstr_variant(&vItem), wine_dbgstr_variant(&vOptions));
122 return E_NOTIMPL;
123 }
124
125 HRESULT STDMETHODCALLTYPE CFolder::CopyHere(VARIANT vItem, VARIANT vOptions)
126 {
127 TRACE("(%p, %s, %s)\n", this, wine_dbgstr_variant(&vItem), wine_dbgstr_variant(&vOptions));
128 return E_NOTIMPL;
129 }
130
131 HRESULT STDMETHODCALLTYPE CFolder::GetDetailsOf(VARIANT vItem, int iColumn, BSTR *pbs)
132 {
133 TRACE("(%p, %s, %i, %p)\n", this, wine_dbgstr_variant(&vItem), iColumn, pbs);
134 return E_NOTIMPL;
135 }
136
137
138 // *** Folder2 methods ***
139 HRESULT STDMETHODCALLTYPE CFolder::get_Self(FolderItem **ppfi)
140 {
141 TRACE("(%p, %p)\n", this, ppfi);
142 if (!ppfi)
143 return E_POINTER;
144 CFolderItem* item = new CComObject<CFolderItem>();
145 item->AddRef();
146 item->Init(ILClone(m_idlist));
147 *ppfi = item;
148 return S_OK;
149 }
150
151 HRESULT STDMETHODCALLTYPE CFolder::get_OfflineStatus(LONG *pul)
152 {
153 TRACE("(%p, %p)\n", this, pul);
154 return E_NOTIMPL;
155 }
156
157 HRESULT STDMETHODCALLTYPE CFolder::Synchronize()
158 {
159 TRACE("(%p)\n", this);
160 return E_NOTIMPL;
161 }
162
163 HRESULT STDMETHODCALLTYPE CFolder::get_HaveToShowWebViewBarricade(VARIANT_BOOL *pbHaveToShowWebViewBarricade)
164 {
165 TRACE("(%p, %p)\n", this, pbHaveToShowWebViewBarricade);
166 return E_NOTIMPL;
167 }
168
169 HRESULT STDMETHODCALLTYPE CFolder::DismissedWebViewBarricade()
170 {
171 TRACE("(%p)\n", this);
172 return E_NOTIMPL;
173 }
174
175