[SHELL] IPersistFolder::Initialize takes a PCIDLIST_ABSOLUTE. CORE-16385
[reactos.git] / dll / win32 / browseui / shellfind / CFindFolder.h
index 5c95ae6..a19651b 100644 (file)
@@ -1,9 +1,14 @@
+/*
+ * PROJECT:     ReactOS Search Shell Extension
+ * LICENSE:     GPL-2.0-or-later (https://spdx.org/licenses/GPL-2.0-or-later)
+ * PURPOSE:     Search results folder
+ * COPYRIGHT:   Copyright 2019 Brock Mammen
+ */
+
 #pragma once
 
 #include "shellfind.h"
 
-#define SWM_ADD_ITEM (WM_USER + 0)
-
 class CFindFolder :
         public CWindowImpl<CFindFolder>,
         public CComCoClass<CFindFolder, &CLSID_FindFolder>,
@@ -11,7 +16,8 @@ class CFindFolder :
         public IShellFolder2,
         public IPersistFolder2,
         public IShellFolderViewCB,
-        public IContextMenuCB
+        public IConnectionPointContainerImpl<CFindFolder>,
+        public IConnectionPointImpl<CFindFolder, &DIID_DSearchCommandEvents>
 {
     // *** IShellFolder2 methods ***
     STDMETHODIMP GetDefaultSearchGUID(GUID *pguid);
@@ -56,37 +62,54 @@ class CFindFolder :
     //// *** IShellFolderViewCB methods ***
     STDMETHODIMP MessageSFVCB(UINT uMsg, WPARAM wParam, LPARAM lParam);
 
-    //// *** IContextMenuCB method ***
-    STDMETHODIMP CallBack(IShellFolder *psf, HWND hwndOwner, IDataObject *pdtobj, UINT uMsg, WPARAM wParam,
-                          LPARAM lParam);
-
 private:
     LPITEMIDLIST m_pidl;
     CComPtr<IShellFolder2> m_pisfInner;
     CComPtr<IShellFolderView> m_shellFolderView;
+    CComPtr<IShellBrowser> m_shellBrowser;
+    HANDLE m_hStopEvent;
+
+    void NotifyConnections(DISPID id);
+    static DWORD WINAPI SearchThreadProc(LPVOID lpParameter);
 
     //// *** IPersistFolder2 methods ***
-    STDMETHODIMP GetCurFolder(LPITEMIDLIST *pidl);
+    STDMETHODIMP GetCurFolder(PIDLIST_ABSOLUTE *pidl);
 
 
     // *** IPersistFolder methods ***
-    STDMETHODIMP Initialize(LPCITEMIDLIST pidl);
+    STDMETHODIMP Initialize(PCIDLIST_ABSOLUTE pidl);
 
 
     // *** IPersist methods ***
     STDMETHODIMP GetClassID(CLSID *pClassId);
 
-    LRESULT AddItem(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled);
+    // *** Message handlers ***
+    LRESULT StartSearch(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled);
+
+    LRESULT StopSearch(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled);
+
+    LRESULT AddResult(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled);
+
+    LRESULT UpdateStatus(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled);
 
 public:
+    CFindFolder();
+
     DECLARE_REGISTRY_RESOURCEID(IDR_FINDFOLDER)
 
     DECLARE_NOT_AGGREGATABLE(CFindFolder)
 
     DECLARE_PROTECT_FINAL_CONSTRUCT()
 
+    BEGIN_CONNECTION_POINT_MAP(CFindFolder)
+        CONNECTION_POINT_ENTRY(DIID_DSearchCommandEvents)
+    END_CONNECTION_POINT_MAP()
+
     BEGIN_MSG_MAP(CFindFolder)
-        MESSAGE_HANDLER(SWM_ADD_ITEM, AddItem)
+        MESSAGE_HANDLER(WM_SEARCH_START, StartSearch)
+        MESSAGE_HANDLER(WM_SEARCH_STOP, StopSearch)
+        MESSAGE_HANDLER(WM_SEARCH_ADD_RESULT, AddResult)
+        MESSAGE_HANDLER(WM_SEARCH_UPDATE_STATUS, UpdateStatus)
     END_MSG_MAP()
 
     BEGIN_COM_MAP(CFindFolder)
@@ -96,7 +119,7 @@ public:
         COM_INTERFACE_ENTRY_IID(IID_IPersistFolder2, IPersistFolder2)
         COM_INTERFACE_ENTRY_IID(IID_IPersistFolder, IPersistFolder)
         COM_INTERFACE_ENTRY_IID(IID_IPersist, IPersist)
-        COM_INTERFACE_ENTRY_IID(IID_IContextMenuCB, IContextMenuCB)
+        COM_INTERFACE_ENTRY_IID(IID_IConnectionPointContainer, IConnectionPointContainer)
     END_COM_MAP()
 };