[SHELLFIND] Remove redundant check
[reactos.git] / dll / win32 / browseui / shellfind / CSearchBar.cpp
index c369ba1..bcb7016 100644 (file)
@@ -21,8 +21,8 @@ WINE_DEFAULT_DEBUG_CHANNEL(shellfind);
 #endif
 
 CSearchBar::CSearchBar() :
-    pSite(NULL),
-    fVisible(FALSE)
+    m_pSite(NULL),
+    m_bVisible(FALSE)
 {
 }
 
@@ -35,9 +35,9 @@ LRESULT CSearchBar::OnInitDialog(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &
     SetSearchInProgress(FALSE);
 
     HWND hCombobox = GetDlgItem(IDC_SEARCH_COMBOBOX);
-    IImageList *pImageList;
+    CComPtr<IImageList> pImageList;
     HRESULT hResult = SHGetImageList(SHIL_SMALL, IID_PPV_ARG(IImageList, &pImageList));
-    SendMessage(hCombobox, CBEM_SETIMAGELIST, 0, FAILED_UNEXPECTEDLY(hResult) ? 0 : reinterpret_cast<LPARAM>(pImageList));
+    SendMessage(hCombobox, CBEM_SETIMAGELIST, 0, FAILED_UNEXPECTEDLY(hResult) ? 0 : reinterpret_cast<LPARAM>(pImageList.p));
 
     SendMessage(hCombobox, CBEM_SETEXTENDEDSTYLE,
         CBES_EX_CASESENSITIVE | CBES_EX_NOSIZELIMIT, CBES_EX_CASESENSITIVE | CBES_EX_NOSIZELIMIT);
@@ -46,24 +46,20 @@ LRESULT CSearchBar::OnInitDialog(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &
     if (FAILED_UNEXPECTEDLY(hResult))
         return hResult;
 
-    CComPtr<IShellService> pShellService;
-    hResult = fAddressEditBox->QueryInterface(IID_PPV_ARG(IShellService, &pShellService));
-    if (FAILED_UNEXPECTEDLY(hResult))
-        return hResult;
-    hResult = fAddressEditBox->Init(hCombobox, fEditControl, 0, pSite);
+    hResult = m_AddressEditBox->Init(hCombobox, hEditControl, 0, m_pSite);
     if (FAILED_UNEXPECTEDLY(hResult))
         return hResult;
 
-    CComPtr<IDispatch> pDispatch;
-    hResult = fAddressEditBox->QueryInterface(IID_PPV_ARG(IDispatch, &pDispatch));
-    if (FAILED_UNEXPECTEDLY(hResult))
-        return hResult;
-    DISPPARAMS params = {0};
-    hResult = pDispatch->Invoke(DISPID_NAVIGATECOMPLETE2, GUID_NULL, 0, DISPATCH_METHOD, &params, NULL, NULL, NULL);
+    // Subscribe to navigation events
+    CComPtr<IShellBrowser> pShellBrowser;
+    hResult = IUnknown_QueryService(m_pSite, SID_SShellBrowser, IID_PPV_ARG(IShellBrowser, &pShellBrowser));
+    DWORD dwAdviseCookie;
+    if (SUCCEEDED(hResult))
+        AtlAdvise(pShellBrowser, static_cast<IDispatch *>(this), DIID_DWebBrowserEvents, &dwAdviseCookie);
 
-    hResult = pShellService->SetOwner(NULL);
-    if (FAILED_UNEXPECTEDLY(hResult))
-        return hResult;
+    // Invoke the navigate event in case a search results folder is already open
+    DISPPARAMS params = {0};
+    Invoke(DISPID_NAVIGATECOMPLETE2, GUID_NULL, 0, DISPATCH_METHOD, &params, NULL, NULL, NULL);
 
     return 0;
 }
@@ -75,7 +71,7 @@ HRESULT CSearchBar::ExecuteCommand(CComPtr<IContextMenu>& menu, UINT nCmd)
     HWND                                browserWnd;
     HRESULT                             hr;
 
-    hr = IUnknown_QueryService(pSite, SID_SShellBrowser, IID_PPV_ARG(IOleWindow, &pBrowserOleWnd));
+    hr = IUnknown_QueryService(m_pSite, SID_SShellBrowser, IID_PPV_ARG(IOleWindow, &pBrowserOleWnd));
     if (FAILED_UNEXPECTEDLY(hr))
         return hr;
 
@@ -99,7 +95,7 @@ HRESULT CSearchBar::ExecuteCommand(CComPtr<IContextMenu>& menu, UINT nCmd)
 // *** ATL event handlers ***
 LRESULT CSearchBar::OnSetFocus(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
 {
-    IUnknown_OnFocusChangeIS(pSite, reinterpret_cast<IUnknown*>(this), TRUE);
+    IUnknown_OnFocusChangeIS(m_pSite, static_cast<IDeskBand *>(this), TRUE);
     bHandled = FALSE;
     return TRUE;
 }
@@ -153,7 +149,7 @@ HRESULT CSearchBar::GetSearchResultsFolder(IShellBrowser **ppShellBrowser, HWND
 
 LRESULT CSearchBar::OnSearchButtonClicked(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
 {
-    CComHeapPtr<SearchStart> pSearchStart((SearchStart *)SHAlloc(sizeof(SearchStart)));
+    CComHeapPtr<SearchStart> pSearchStart(static_cast<SearchStart *>(CoTaskMemAlloc(sizeof(SearchStart))));
     GetDlgItemText(IDC_SEARCH_FILENAME, pSearchStart->szFileName, _countof(pSearchStart->szFileName));
     GetDlgItemText(IDC_SEARCH_QUERY, pSearchStart->szQuery, _countof(pSearchStart->szQuery));
     if (!GetAddressEditBoxPath(pSearchStart->szPath))
@@ -163,7 +159,7 @@ LRESULT CSearchBar::OnSearchButtonClicked(WORD wNotifyCode, WORD wID, HWND hWndC
     }
 
     CComPtr<IShellBrowser> pShellBrowser;
-    HRESULT hr = IUnknown_QueryService(pSite, SID_SShellBrowser, IID_PPV_ARG(IShellBrowser, &pShellBrowser));
+    HRESULT hr = IUnknown_QueryService(m_pSite, SID_SShellBrowser, IID_PPV_ARG(IShellBrowser, &pShellBrowser));
     if (FAILED_UNEXPECTEDLY(hr))
         return hr;
 
@@ -188,14 +184,7 @@ LRESULT CSearchBar::OnSearchButtonClicked(WORD wNotifyCode, WORD wID, HWND hWndC
         if (FAILED_UNEXPECTEDLY(hr))
             return hr;
 
-        CComPtr<IShellFolder> pShellFolder;
-        hr = GetSearchResultsFolder(*pShellBrowser, &hwnd, &pShellFolder);
-        if (FAILED_UNEXPECTEDLY(hr))
-            return hr;
-
-        // Subscribe to search events
-        DWORD fAdviseCookie;
-        hr = AtlAdvise(pShellFolder, static_cast<IDispatch *>(this), DIID_DSearchCommandEvents, &fAdviseCookie);
+        hr = GetSearchResultsFolder(&pShellBrowser, &hwnd, NULL);
         if (FAILED_UNEXPECTEDLY(hr))
             return hr;
     }
@@ -232,8 +221,9 @@ BOOL CSearchBar::GetAddressEditBoxPath(WCHAR (&szPath)[MAX_PATH])
         item.cchTextMax = _countof(szItemText);
         SendMessageW(hComboboxEx, CBEM_GETITEMW, 0, (LPARAM)&item);
 
-        if (!wcscmp(szItemText, szPath) && SHGetPathFromIDListW((LPCITEMIDLIST)item.lParam, szPath))
+        if (!wcscmp(szItemText, szPath) && SHGetPathFromIDListW((LPCITEMIDLIST)item.lParam, szItemText))
         {
+            StringCbCopyW(szPath, MAX_PATH * sizeof(WCHAR), szItemText);
             return TRUE;
         }
     }
@@ -250,16 +240,24 @@ LRESULT CSearchBar::OnSize(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandl
 
     ((CWindow)GetDlgItem(IDC_SEARCH_LABEL)).SetWindowPos(NULL, 0, 0, iWidth - iPadding, 40, SWP_NOACTIVATE | SWP_NOCOPYBITS | SWP_NOMOVE | SWP_NOOWNERZORDER | SWP_NOZORDER);
 
-    HWND inputs[] = { GetDlgItem(IDC_SEARCH_FILENAME), GetDlgItem(IDC_SEARCH_QUERY), GetDlgItem(IDC_SEARCH_COMBOBOX), GetDlgItem(IDC_SEARCH_BUTTON), GetDlgItem(IDC_SEARCH_STOP_BUTTON), GetDlgItem(IDC_PROGRESS_BAR) };
+    int inputs[] = { IDC_SEARCH_FILENAME, IDC_SEARCH_QUERY, IDC_SEARCH_COMBOBOX, IDC_SEARCH_BUTTON, IDC_SEARCH_STOP_BUTTON, IDC_PROGRESS_BAR };
+    HDWP hdwp = BeginDeferWindowPos(_countof(inputs));
     for (SIZE_T i = 0; i < _countof(inputs); i++)
     {
-        CWindow wFileName = (CWindow) inputs[i];
+        CWindow wnd = (CWindow) GetDlgItem(inputs[i]);
         RECT rect;
-        wFileName.GetWindowRect(&rect);
+        wnd.GetWindowRect(&rect);
         POINT pt = { rect.left, rect.top };
         ScreenToClient(&pt);
-        wFileName.MoveWindow(iPadding, pt.y, iWidth - iPadding * 2, rect.bottom - rect.top);
+        hdwp = wnd.DeferWindowPos(hdwp,
+                                  HWND_TOP,
+                                  iPadding,
+                                  pt.y,
+                                  iWidth - iPadding * 2,
+                                  rect.bottom - rect.top,
+                                  SWP_NOZORDER | SWP_NOACTIVATE);
     }
+    EndDeferWindowPos(hdwp);
 
     return 0;
 }
@@ -297,7 +295,7 @@ HRESULT STDMETHODCALLTYPE CSearchBar::ResizeBorderDW(const RECT *prcBorder, IUnk
 
 HRESULT STDMETHODCALLTYPE CSearchBar::ShowDW(BOOL fShow)
 {
-    fVisible = fShow;
+    m_bVisible = fShow;
     ShowWindow(fShow);
     return S_OK;
 }
@@ -358,7 +356,7 @@ HRESULT STDMETHODCALLTYPE CSearchBar::SetSite(IUnknown *pUnkSite)
     HRESULT hr;
     HWND parentWnd;
 
-    if (pUnkSite == pSite)
+    if (pUnkSite == m_pSite)
         return S_OK;
 
     TRACE("SetSite called \n");
@@ -366,15 +364,8 @@ HRESULT STDMETHODCALLTYPE CSearchBar::SetSite(IUnknown *pUnkSite)
     {
         DestroyWindow();
         m_hWnd = NULL;
-    }
-
-    if (pUnkSite != pSite)
-    {
-        pSite = NULL;
-    }
-
-    if(!pUnkSite)
         return S_OK;
+    }
 
     hr = IUnknown_GetWindow(pUnkSite, &parentWnd);
     if (!SUCCEEDED(hr))
@@ -383,7 +374,7 @@ HRESULT STDMETHODCALLTYPE CSearchBar::SetSite(IUnknown *pUnkSite)
         return E_INVALIDARG;
     }
 
-    pSite = pUnkSite;
+    m_pSite = pUnkSite;
 
     if (m_hWnd)
     {
@@ -402,7 +393,7 @@ HRESULT STDMETHODCALLTYPE CSearchBar::GetSite(REFIID riid, void **ppvSite)
 {
     if (!ppvSite)
         return E_POINTER;
-    *ppvSite = pSite;
+    *ppvSite = m_pSite;
     return S_OK;
 }
 
@@ -425,7 +416,7 @@ HRESULT STDMETHODCALLTYPE CSearchBar::Exec(const GUID *pguidCmdGroup, DWORD nCmd
 HRESULT STDMETHODCALLTYPE CSearchBar::QueryService(REFGUID guidService, REFIID riid, void **ppvObject)
 {
     /* FIXME: we probably want to handle more services here */
-    return IUnknown_QueryService(pSite, SID_SShellBrowser, riid, ppvObject);
+    return IUnknown_QueryService(m_pSite, SID_SShellBrowser, riid, ppvObject);
 }
 
 
@@ -580,12 +571,75 @@ void CSearchBar::SetSearchInProgress(BOOL bInProgress)
     ::PostMessage(hProgressBar, PBM_SETMARQUEE, bInProgress, 0);
 }
 
+HRESULT CSearchBar::TrySubscribeToSearchEvents()
+{
+    CComPtr<IShellFolder> pShellFolder;
+    HRESULT hr = GetSearchResultsFolder(NULL, NULL, &pShellFolder);
+    if (FAILED(hr))
+        return hr;
+
+    DWORD fAdviseCookie;
+    hr = AtlAdvise(pShellFolder, static_cast<IDispatch *>(this), DIID_DSearchCommandEvents, &fAdviseCookie);
+    if (FAILED_UNEXPECTEDLY(hr))
+        return hr;
+
+    return S_OK;
+}
+
 HRESULT STDMETHODCALLTYPE CSearchBar::Invoke(DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
 {
-    if (dispIdMember == DISPID_SEARCHCOMPLETE || dispIdMember == DISPID_SEARCHABORT)
+    switch (dispIdMember)
     {
+    case DISPID_NAVIGATECOMPLETE2:
+    case DISPID_DOCUMENTCOMPLETE:
+    {
+        TrySubscribeToSearchEvents();
+
+        // Remove the search results folder from the address box
+        CComPtr<IDispatch> pDispatch;
+        HRESULT hResult = m_AddressEditBox->QueryInterface(IID_PPV_ARG(IDispatch, &pDispatch));
+        if (FAILED_UNEXPECTEDLY(hResult))
+            return hResult;
+        pDispatch->Invoke(dispIdMember, riid, lcid, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr);
+        CComPtr<IShellService> pShellService;
+        hResult = m_AddressEditBox->QueryInterface(IID_PPV_ARG(IShellService, &pShellService));
+        if (FAILED_UNEXPECTEDLY(hResult))
+            return hResult;
+        hResult = pShellService->SetOwner(NULL);
+        if (FAILED_UNEXPECTEDLY(hResult))
+            return hResult;
+        HWND hComboboxEx = GetDlgItem(IDC_SEARCH_COMBOBOX);
+        int index = SendMessageW(hComboboxEx, CB_GETCOUNT, 0, 0);
+        if (index <= 0)
+            return S_OK;
+        COMBOBOXEXITEMW item = {0};
+        item.mask = CBEIF_LPARAM;
+        item.iItem = index - 1;
+        SendMessageW(hComboboxEx, CBEM_GETITEMW, 0, (LPARAM)&item);
+        if (!item.lParam)
+            return S_OK;
+        CComPtr<IShellFolder> pDesktopFolder;
+        hResult = SHGetDesktopFolder(&pDesktopFolder);
+        if (FAILED_UNEXPECTEDLY(hResult))
+            return hResult;
+        CComPtr<IShellFolder> pShellFolder;
+        hResult = pDesktopFolder->BindToObject((LPCITEMIDLIST)item.lParam, NULL, IID_PPV_ARG(IShellFolder, &pShellFolder));
+        if (FAILED(hResult))
+            return S_OK;
+        CLSID clsid;
+        hResult = IUnknown_GetClassID(pShellFolder, &clsid);
+        if (SUCCEEDED(hResult) && clsid == CLSID_FindFolder)
+        {
+            SendMessageW(hComboboxEx, CBEM_DELETEITEM, item.iItem, 0);
+            SendMessageW(hComboboxEx, CB_SETCURSEL, 0, 0);
+        }
+        return S_OK;
+    }
+    case DISPID_SEARCHCOMPLETE:
+    case DISPID_SEARCHABORT:
         SetSearchInProgress(FALSE);
         return S_OK;
+    default:
+        return E_INVALIDARG;
     }
-    return E_INVALIDARG;
 }