[SHELL32]
[reactos.git] / reactos / dll / win32 / shell32 / CDefView.cpp
index 590cbb1..ea1aac6 100644 (file)
@@ -113,6 +113,7 @@ class CDefView :
 
         CLSID m_Category;
         HMENU m_hView;
+        BOOL m_Destroyed;
     private:
 
         HRESULT _MergeToolbar();
@@ -248,6 +249,8 @@ class CDefView :
         LRESULT OnEraseBackground(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled);
         LRESULT OnSysColorChange(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled);
         LRESULT OnGetShellBrowser(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled);
+        LRESULT OnNCCreate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled);
+        LRESULT OnNCDestroy(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled);
         LRESULT OnCreate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled);
         LRESULT OnContextMenu(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled);
         LRESULT OnSize(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled);
@@ -296,6 +299,8 @@ class CDefView :
         MESSAGE_HANDLER(WM_SIZE, OnSize)
         MESSAGE_HANDLER(WM_SETFOCUS, OnSetFocus)
         MESSAGE_HANDLER(WM_KILLFOCUS, OnKillFocus)
+        MESSAGE_HANDLER(WM_NCCREATE, OnNCCreate)
+        MESSAGE_HANDLER(WM_NCDESTROY, OnNCDestroy)
         MESSAGE_HANDLER(WM_CREATE, OnCreate)
         MESSAGE_HANDLER(WM_ACTIVATE, OnActivate)
         MESSAGE_HANDLER(WM_NOTIFY, OnNotify)
@@ -364,7 +369,8 @@ CDefView::CDefView() :
     m_iDragOverItem(0),
     m_cScrollDelay(0),
     m_isEditing(FALSE),
-    m_hView(NULL)
+    m_hView(NULL),
+    m_Destroyed(FALSE)
 {
     ZeroMemory(&m_FolderSettings, sizeof(m_FolderSettings));
     ZeroMemory(&m_sortInfo, sizeof(m_sortInfo));
@@ -971,11 +977,20 @@ LRESULT CDefView::OnGetDlgCode(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bH
 
 LRESULT CDefView::OnDestroy(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
 {
-    if (m_hMenu)
-        DestroyMenu(m_hMenu);
-    RevokeDragDrop(m_hWnd);
-    SHChangeNotifyDeregister(m_hNotify);
-    SHFree(m_pidlParent);
+    if (!m_Destroyed)
+    {
+        m_Destroyed = TRUE;
+        if (m_hMenu)
+        {
+            DestroyMenu(m_hMenu);
+            m_hMenu = NULL;
+        }
+        RevokeDragDrop(m_hWnd);
+        SHChangeNotifyDeregister(m_hNotify);
+        m_hNotify = NULL;
+        SHFree(m_pidlParent);
+        m_pidlParent = NULL;
+    }
     bHandled = FALSE;
     return 0;
 }
@@ -1004,6 +1019,20 @@ LRESULT CDefView::OnGetShellBrowser(UINT uMsg, WPARAM wParam, LPARAM lParam, BOO
     return reinterpret_cast<LRESULT>(m_pShellBrowser.p);
 }
 
+LRESULT CDefView::OnNCCreate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
+{
+    this->AddRef();
+    bHandled = FALSE;
+    return 0;
+}
+
+LRESULT CDefView::OnNCDestroy(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
+{
+    this->Release();
+    bHandled = FALSE;
+    return 0;
+}
+
 /**********************************************************
 *  ShellView_OnCreate()
 */
@@ -1223,10 +1252,6 @@ HRESULT CDefView::OpenSelectedItems()
     if (FAILED(hResult))
         goto cleanup;
 
-    hResult = IUnknown_SetSite(m_pCM, (IShellView *)this);
-    //if (FAILED( hResult))
-    //    goto cleanup;
-
     hResult = m_pCM->QueryContextMenu(hMenu, 0, 0x20, 0x7fff, CMF_DEFAULTONLY);
     if (FAILED(hResult))
         goto cleanup;
@@ -1251,10 +1276,7 @@ cleanup:
         DestroyMenu(hMenu);
 
     if (m_pCM)
-    {
-        IUnknown_SetSite(m_pCM, NULL);
         m_pCM.Release();
-    }
 
     return hResult;
 }
@@ -1290,10 +1312,6 @@ LRESULT CDefView::OnContextMenu(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &b
     if (FAILED( hResult))
         goto cleanup;
 
-    hResult = IUnknown_SetSite(m_pCM, (IShellView *)this);
-    //if (FAILED( hResult))
-    //    goto cleanup;
-
     hResult = m_pCM->QueryContextMenu(hMenu, 0, FCIDM_SHVIEWFIRST, FCIDM_SHVIEWLAST, CMF_NORMAL);
     if (FAILED( hResult))
         goto cleanup;
@@ -1319,10 +1337,7 @@ LRESULT CDefView::OnContextMenu(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &b
 cleanup:
     
     if (m_pCM)
-    {
-        IUnknown_SetSite(m_pCM, NULL);
         m_pCM.Release();
-    }
 
     if (hMenu)
         DestroyMenu(hMenu);
@@ -1344,10 +1359,6 @@ LRESULT CDefView::OnExplorerCommand(UINT uCommand, BOOL bUseSelection)
     if (FAILED( hResult))
         goto cleanup;
 
-    hResult = IUnknown_SetSite(m_pCM, (IShellView *)this);
-    //if (FAILED( hResult))
-    //    goto cleanup;
-
     hResult = m_pCM->QueryContextMenu(hMenu, 0, FCIDM_SHVIEWFIRST, FCIDM_SHVIEWLAST, CMF_NORMAL);
     if (FAILED( hResult))
         goto cleanup;
@@ -1361,10 +1372,7 @@ LRESULT CDefView::OnExplorerCommand(UINT uCommand, BOOL bUseSelection)
 cleanup:
 
     if (m_pCM)
-    {
-        IUnknown_SetSite(m_pCM, NULL);
         m_pCM.Release();
-    }
 
     if (hMenu)
         DestroyMenu(hMenu);
@@ -2250,7 +2258,7 @@ HRESULT WINAPI CDefView::DestroyViewWindow()
     if (m_hMenu)
     {
         DestroyMenu(m_hMenu);
-        m_hView = NULL;
+        m_hMenu = NULL;
     }
 
     if (m_ListView)
@@ -2906,7 +2914,7 @@ HRESULT CDefView::drag_notify_subitem(DWORD grfKeyState, POINTL pt, DWORD *pdwEf
     {
         /* We are not above one of the listview's subitems. Bind to the parent folder's
          * DropTarget interface. */
-        hr = m_pSFParent->QueryInterface(IID_PPV_ARG(IDropTarget,&m_pCurDropTarget));
+        hr = m_pSFParent->CreateViewObject(NULL, IID_PPV_ARG(IDropTarget,&m_pCurDropTarget));
     }
     else
     {