[RSHELL]
[reactos.git] / base / shell / rshell / CMenuToolbars.cpp
index 60ee65c..aa879a2 100644 (file)
@@ -63,7 +63,7 @@ HRESULT CMenuToolbarBase::OnWinEvent(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM
             return OnPagerCalcSize(reinterpret_cast<LPNMPGCALCSIZE>(hdr));
 
         case TBN_DROPDOWN:
-            return OnCommand(reinterpret_cast<LPNMTOOLBAR>(hdr)->iItem, 0, theResult);
+            return ProcessClick(reinterpret_cast<LPNMTOOLBAR>(hdr)->iItem);
 
         case TBN_HOTITEMCHANGE:
             //return OnHotItemChange(reinterpret_cast<LPNMTBHOTITEM>(hdr), theResult);
@@ -798,11 +798,10 @@ HRESULT CMenuToolbarBase::TrackContextMenu(IContextMenu* contextMenu, POINT pt)
     return m_menuBand->_TrackContextMenu(contextMenu, pt.x, pt.y);
 }
 
-HRESULT CMenuToolbarBase::OnCommand(WPARAM wParam, LPARAM lParam, LRESULT *theResult)
+HRESULT CMenuToolbarBase::ProcessClick(INT iItem)
 {
     if (m_disableMouseTrack)
     {
-        *theResult = 1;
         TRACE("Item click prevented by DisableMouseTrack\n");
         return S_OK;
     }
@@ -814,10 +813,6 @@ HRESULT CMenuToolbarBase::OnCommand(WPARAM wParam, LPARAM lParam, LRESULT *theRe
         return S_FALSE;
     }
 
-    *theResult = 0;
-
-    INT iItem = (INT)wParam;
-
     if (PopupItem(iItem, FALSE) == S_OK)
     {
         TRACE("PopupItem returned S_OK\n");
@@ -829,40 +824,39 @@ HRESULT CMenuToolbarBase::OnCommand(WPARAM wParam, LPARAM lParam, LRESULT *theRe
     return m_menuBand->_MenuItemHotTrack(MPOS_EXECUTE);
 }
 
-HRESULT CMenuToolbarBase::MenuBarMouseDown(INT item)
+HRESULT CMenuToolbarBase::MenuBarMouseDown(INT iIndex)
 {
-    LRESULT theResult;
     TBBUTTON btn;
 
     if (m_initFlags & SMINIT_VERTICAL)
         return S_OK;
 
-    SendMessage(m_hwndToolbar, TB_GETBUTTON, item, reinterpret_cast<LPARAM>(&btn));
-    return OnCommand(btn.idCommand, 0, &theResult);
+    ::SendMessageW(m_hwndToolbar, TB_GETBUTTON, iIndex, reinterpret_cast<LPARAM>(&btn));
+    return ProcessClick(btn.idCommand);
 }
 
-HRESULT CMenuToolbarBase::MenuBarMouseUp(INT item)
+HRESULT CMenuToolbarBase::MenuBarMouseUp(INT iIndex)
 {
-    LRESULT theResult;
     TBBUTTON btn;
 
     if (!(m_initFlags & SMINIT_VERTICAL))
         return S_OK;
 
-    SendMessage(m_hwndToolbar, TB_GETBUTTON, item, reinterpret_cast<LPARAM>(&btn));
-    return OnCommand(btn.idCommand, 0, &theResult);
+    ::SendMessageW(m_hwndToolbar, TB_GETBUTTON, iIndex, reinterpret_cast<LPARAM>(&btn));
+    return ProcessClick(btn.idCommand);
 }
 
-HRESULT CMenuToolbarBase::ExecuteItem(INT iItem)
+HRESULT CMenuToolbarBase::PrepareExecuteItem(INT iItem)
 {
     this->m_menuBand->_KillPopupTimers();
 
-    INT index;
-    DWORD_PTR data;
-
-    GetDataFromId(iItem, &index, &data);
+    m_executeItem = iItem;
+    return GetDataFromId(iItem, &m_executeIndex, &m_executeData);
+}
 
-    return InternalExecuteItem(iItem, index, data);
+HRESULT CMenuToolbarBase::ExecuteItem()
+{
+    return InternalExecuteItem(m_executeItem, m_executeItem, m_executeData);
 }
 
 HRESULT CMenuToolbarBase::OnContextMenu(NMMOUSE * rclick)
@@ -1198,7 +1192,10 @@ HRESULT CMenuStaticToolbar::FillToolbar(BOOL clearFirst)
 
             HRESULT hr = m_menuBand->_CallCBWithItemId(info.wID, SMC_GETINFO, 0, reinterpret_cast<LPARAM>(sminfo));
             if (FAILED_UNEXPECTEDLY(hr))
+            {
+                delete sminfo;
                 return hr;
+            }
 
             AddButton(info.wID, info.dwTypeData, info.hSubMenu != NULL, sminfo->iIcon, reinterpret_cast<DWORD_PTR>(sminfo), last);
 
@@ -1292,29 +1289,37 @@ HRESULT CMenuSFToolbar::FillToolbar(BOOL clearFirst)
         INT index = 0;
         INT indexOpen = 0;
 
-        STRRET sr = { STRRET_CSTR, { 0 } };
+        if (m_menuBand->_CallCBWithItemPidl(item, 0x10000000, 0, 0) == S_OK)
+        {
+            STRRET sr = { STRRET_CSTR, { 0 } };
 
-        hr = m_shellFolder->GetDisplayNameOf(item, SIGDN_NORMALDISPLAY, &sr);
-        if (FAILED_UNEXPECTEDLY(hr))
-            return hr;
+            hr = m_shellFolder->GetDisplayNameOf(item, SIGDN_NORMALDISPLAY, &sr);
+            if (FAILED_UNEXPECTEDLY(hr))
+                return hr;
 
-        StrRetToStr(&sr, NULL, &MenuString);
+            StrRetToStr(&sr, NULL, &MenuString);
 
-        index = SHMapPIDLToSystemImageListIndex(m_shellFolder, item, &indexOpen);
+            index = SHMapPIDLToSystemImageListIndex(m_shellFolder, item, &indexOpen);
 
-        LPCITEMIDLIST itemc = item;
+            LPCITEMIDLIST itemc = item;
 
-        SFGAOF attrs = SFGAO_FOLDER;
-        hr = m_shellFolder->GetAttributesOf(1, &itemc, &attrs);
+            SFGAOF attrs = SFGAO_FOLDER;
+            hr = m_shellFolder->GetAttributesOf(1, &itemc, &attrs);
 
-        DWORD_PTR dwData = reinterpret_cast<DWORD_PTR>(ILClone(item));
+            DWORD_PTR dwData = reinterpret_cast<DWORD_PTR>(ILClone(item));
 
-        // Fetch next item already, so we know if the current one is the last
-        hr = eidl->Next(1, &item, NULL);
+            // Fetch next item already, so we know if the current one is the last
+            hr = eidl->Next(1, &item, NULL);
 
-        AddButton(++i, MenuString, attrs & SFGAO_FOLDER, index, dwData, hr != S_OK);
+            AddButton(++i, MenuString, attrs & SFGAO_FOLDER, index, dwData, hr != S_OK);
 
-        CoTaskMemFree(MenuString);
+            CoTaskMemFree(MenuString);
+        }
+        else
+        {
+            // Fetch next item here also
+            hr = eidl->Next(1, &item, NULL);
+        }
     }
     ILFree(item);
 
@@ -1369,6 +1374,7 @@ HRESULT CMenuSFToolbar::GetShellFolder(DWORD *pdwFlags, LPITEMIDLIST *ppidl, REF
             pidl = ILClone(m_idList);
             if (!pidl)
             {
+                ERR("ILClone failed!\n");
                 (*reinterpret_cast<IUnknown**>(ppv))->Release();
                 return E_FAIL;
             }