1 /* 2 * Shell AutoComplete list 3 * 4 * Copyright 2015 Thomas Faber 5 * Copyright 2020 Katayama Hirofumi MZ 6 * 7 * This library is free software; you can redistribute it and/or 8 * modify it under the terms of the GNU Lesser General Public 9 * License as published by the Free Software Foundation; either 10 * version 2.1 of the License, or (at your option) any later version. 11 * 12 * This library is distributed in the hope that it will be useful, 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 15 * Lesser General Public License for more details. 16 * 17 * You should have received a copy of the GNU Lesser General Public 18 * License along with this library; if not, write to the Free Software 19 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA 20 */ 21 22 #pragma once 23 24 class CACListISF : 25 public CComCoClass<CACListISF, &CLSID_ACListISF>, 26 public CComObjectRootEx<CComMultiThreadModelNoCS>, 27 public IEnumString, 28 public IACList2, 29 public ICurrentWorkingDirectory, 30 public IShellService, 31 public IPersistFolder 32 { 33 private: 34 enum LOCATION_TYPE 35 { 36 LT_DIRECTORY, 37 LT_DESKTOP, 38 LT_MYCOMPUTER, 39 LT_FAVORITES, 40 LT_MAX 41 }; 42 43 DWORD m_dwOptions; 44 LOCATION_TYPE m_iNextLocation; 45 BOOL m_fShowHidden; 46 CStringW m_szRawPath; 47 CStringW m_szExpanded; 48 CComHeapPtr<ITEMIDLIST> m_pidlLocation; 49 CComHeapPtr<ITEMIDLIST> m_pidlCurDir; 50 CComPtr<IEnumIDList> m_pEnumIDList; 51 CComPtr<IShellFolder> m_pShellFolder; 52 CComPtr<IBrowserService> m_pBrowserService; 53 54 public: 55 CACListISF(); 56 ~CACListISF(); 57 58 HRESULT NextLocation(); 59 HRESULT SetLocation(LPITEMIDLIST pidl); 60 HRESULT GetDisplayName(LPCITEMIDLIST pidlChild, CComHeapPtr<WCHAR>& pszChild); 61 HRESULT GetPaths(LPCITEMIDLIST pidlChild, CComHeapPtr<WCHAR>& pszRaw, 62 CComHeapPtr<WCHAR>& pszExpanded); 63 64 // *** IEnumString methods *** 65 STDMETHOD(Next)(ULONG celt, LPOLESTR *rgelt, ULONG *pceltFetched) override; 66 STDMETHOD(Skip)(ULONG celt) override; 67 STDMETHOD(Reset)() override; 68 STDMETHOD(Clone)(IEnumString **ppenum) override; 69 70 // *** IACList methods *** 71 STDMETHOD(Expand)(LPCOLESTR pszExpand) override; 72 73 // *** IACList2 methods *** 74 STDMETHOD(SetOptions)(DWORD dwFlag) override; 75 STDMETHOD(GetOptions)(DWORD* pdwFlag) override; 76 77 // *** IShellService methods *** 78 STDMETHOD(SetOwner)(IUnknown *punkOwner) override; 79 80 // *** IPersist methods *** 81 STDMETHOD(GetClassID)(CLSID *pClassID) override; 82 83 // *** IPersistFolder methods *** 84 STDMETHOD(Initialize)(PCIDLIST_ABSOLUTE pidl) override; 85 86 // *** ICurrentWorkingDirectory methods *** 87 STDMETHOD(GetDirectory)(LPWSTR pwzPath, DWORD cchSize) override; 88 STDMETHOD(SetDirectory)(LPCWSTR pwzPath) override; 89 90 public: 91 DECLARE_REGISTRY_RESOURCEID(IDR_ACLISTISF) 92 DECLARE_NOT_AGGREGATABLE(CACListISF) 93 94 DECLARE_PROTECT_FINAL_CONSTRUCT() 95 96 BEGIN_COM_MAP(CACListISF) 97 COM_INTERFACE_ENTRY_IID(IID_IEnumString, IEnumString) 98 COM_INTERFACE_ENTRY_IID(IID_IACList, IACList) 99 COM_INTERFACE_ENTRY_IID(IID_IACList2, IACList2) 100 COM_INTERFACE_ENTRY_IID(IID_IShellService, IShellService) 101 // Windows doesn't return this 102 //COM_INTERFACE_ENTRY_IID(IID_IPersist, IPersist) 103 COM_INTERFACE_ENTRY_IID(IID_IPersistFolder, IPersistFolder) 104 COM_INTERFACE_ENTRY_IID(IID_ICurrentWorkingDirectory, ICurrentWorkingDirectory) 105 END_COM_MAP() 106 }; 107