ReactOS Fundraising Campaign 2012
 
€ 4,410 / € 30,000

Information | Donate

Home | Info | Community | Development | myReactOS | Contact Us

  1. Home
  2. Community
  3. Development
  4. myReactOS
  5. Fundraiser 2012

  1. Main Page
  2. Alphabetical List
  3. Data Structures
  4. Directories
  5. File List
  6. Data Fields
  7. Globals
  8. Related Pages

ReactOS Development > Doxygen

newmenu.cpp
Go to the documentation of this file.
00001 /*
00002  * provides new shell item service
00003  *
00004  * Copyright 2007 Johannes Anderwald (janderwald@reactos.org)
00005  * Copyright 2009 Andrew Hill
00006  * Copyright 2012 Rafal Harabien
00007  *
00008  * This library is free software; you can redistribute it and/or
00009  * modify it under the terms of the GNU Lesser General Public
00010  * License as published by the Free Software Foundation; either
00011  * version 2.1 of the License, or (at your option) any later version.
00012  *
00013  * This library is distributed in the hope that it will be useful,
00014  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00015  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00016  * Lesser General Public License for more details.
00017  *
00018  * You should have received a copy of the GNU Lesser General Public
00019  * License along with this library; if not, write to the Free Software
00020  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
00021  */
00022 
00023 #include <precomp.h>
00024 
00025 WINE_DEFAULT_DEBUG_CHANNEL(shell);
00026 
00027 CNewMenu::CNewMenu()
00028 {
00029     m_wszPath = NULL;
00030     m_pItems = NULL;
00031     m_pLinkItem = NULL;
00032     m_pSite = NULL;
00033     m_hbmFolder = NULL;
00034     m_hbmLink = NULL;
00035 }
00036 
00037 CNewMenu::~CNewMenu()
00038 {
00039     UnloadAllItems();
00040     if (m_hbmFolder)
00041         DeleteObject(m_hbmFolder);
00042     if (m_hbmLink)
00043         DeleteObject(m_hbmLink);
00044 }
00045 
00046 void CNewMenu::UnloadItem(SHELLNEW_ITEM *pItem)
00047 {
00048     /* Note: free allows NULL as argument */
00049     free(pItem->pData);
00050     free(pItem->pwszDesc);
00051     free(pItem->pwszExt);
00052 
00053     if (pItem->hBitmap)
00054         DeleteObject(pItem->hBitmap);
00055 
00056     HeapFree(GetProcessHeap(), 0, pItem);
00057 }
00058 
00059 void CNewMenu::UnloadAllItems()
00060 {
00061     SHELLNEW_ITEM *pCurItem;
00062 
00063     /* Unload normal items */
00064     while (m_pItems)
00065     {
00066         pCurItem = m_pItems;
00067         m_pItems = m_pItems->pNext;
00068 
00069         UnloadItem(pCurItem);
00070     }
00071 
00072     /* Unload link item */
00073     if (m_pLinkItem)
00074         UnloadItem(m_pLinkItem);
00075     m_pLinkItem = NULL;
00076 }
00077 
00078 static HBITMAP IconToBitmap(HICON hIcon)
00079 {
00080     HDC hdc, hdcScr;
00081     HBITMAP hbm, hbmOld;
00082     RECT rc;
00083 
00084     hdcScr = GetDC(NULL);
00085     hdc = CreateCompatibleDC(hdcScr);
00086     SetRect(&rc, 0, 0, GetSystemMetrics(SM_CXMENUCHECK), GetSystemMetrics(SM_CYMENUCHECK));
00087     hbm = CreateCompatibleBitmap(hdcScr, rc.right, rc.bottom);
00088     ReleaseDC(NULL, hdcScr);
00089 
00090     hbmOld = (HBITMAP)SelectObject(hdc, hbm);
00091     FillRect(hdc, &rc, (HBRUSH)(COLOR_MENU + 1));
00092     if (!DrawIconEx(hdc, 0, 0, hIcon, rc.right, rc.bottom, 0, NULL, DI_NORMAL))
00093         ERR("DrawIcon failed: %x\n", GetLastError());
00094     SelectObject(hdc, hbmOld);
00095 
00096     DeleteDC(hdc);
00097 
00098     return hbm;
00099 }
00100 
00101 CNewMenu::SHELLNEW_ITEM *CNewMenu::LoadItem(LPCWSTR pwszExt)
00102 {
00103     HKEY hKey;
00104     WCHAR wszBuf[MAX_PATH];
00105     BYTE *pData = NULL;
00106     DWORD cbData;
00107 
00108     StringCbPrintfW(wszBuf, sizeof(wszBuf), L"%s\\ShellNew", pwszExt);
00109 
00110     TRACE("LoadItem Keyname %s Name %s\n", debugstr_w(pwszExt), debugstr_w(wszBuf));
00111 
00112     if (RegOpenKeyExW(HKEY_CLASSES_ROOT, wszBuf, 0, KEY_READ, &hKey) != ERROR_SUCCESS)
00113     {
00114         TRACE("Failed to open key\n");
00115         return NULL;
00116     }
00117 
00118     /* Find first valid value */
00119     struct
00120     {
00121         LPCWSTR pszName;
00122         SHELLNEW_TYPE Type;
00123         BOOL bNeedData;
00124         BOOL bStr;
00125     } Types[] = {
00126         {L"FileName", SHELLNEW_TYPE_FILENAME, TRUE, TRUE},
00127         {L"Command", SHELLNEW_TYPE_COMMAND, TRUE, TRUE},
00128         {L"Data", SHELLNEW_TYPE_DATA, TRUE, FALSE},
00129         {L"NullFile", SHELLNEW_TYPE_NULLFILE, FALSE},
00130         {NULL}
00131     };
00132     UINT i;
00133 
00134     for (i = 0; Types[i].pszName; ++i)
00135     {
00136         /* Note: We are using ANSI function because strings can be treated as data */
00137         cbData = 0;
00138         DWORD dwFlags = Types[i].bStr ? RRF_RT_REG_SZ : RRF_RT_ANY;
00139         DWORD dwType;
00140         if (RegGetValueW(hKey, NULL, Types[i].pszName, dwFlags, NULL, NULL, &cbData) == ERROR_SUCCESS)
00141         {
00142             if (Types[i].bNeedData && cbData > 0)
00143             {
00144                 pData = (BYTE*)malloc(cbData);
00145                 RegGetValueW(hKey, NULL, Types[i].pszName, dwFlags, &dwType, pData, &cbData);
00146                 if (!Types[i].bStr && (dwType == REG_SZ || dwType == REG_EXPAND_SZ))
00147                 {
00148                     PBYTE pData2 = (PBYTE)malloc(cbData);
00149                     cbData = WideCharToMultiByte(CP_ACP, 0, (LPWSTR)pData, -1, (LPSTR)pData2, cbData, NULL, NULL);
00150                     free(pData);
00151                     pData = pData2;
00152                 }
00153             }
00154             break;
00155         }
00156     }
00157     RegCloseKey(hKey);
00158 
00159     /* Was any key found? */
00160     if (!Types[i].pszName)
00161         return NULL;
00162 
00163     SHFILEINFO fi;
00164     if (!SHGetFileInfoW(pwszExt, FILE_ATTRIBUTE_NORMAL, &fi, sizeof(fi), SHGFI_USEFILEATTRIBUTES|SHGFI_TYPENAME|SHGFI_ICON|SHGFI_SMALLICON))
00165         return NULL;
00166 
00167     /* Create new item */
00168     SHELLNEW_ITEM *pNewItem = (SHELLNEW_ITEM *)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(SHELLNEW_ITEM));
00169     if (!pNewItem)
00170     {
00171         free(pData);
00172         return NULL;
00173     }
00174 
00175     TRACE("new item %ls\n", fi.szTypeName);
00176     pNewItem->Type = Types[i].Type;
00177     pNewItem->pData = pData;
00178     pNewItem->cbData = pData ? cbData : 0;
00179     pNewItem->pwszExt = _wcsdup(pwszExt);
00180     pNewItem->pwszDesc = _wcsdup(fi.szTypeName);
00181     if (fi.hIcon)
00182         pNewItem->hBitmap = IconToBitmap(fi.hIcon);
00183 
00184     return pNewItem;
00185 }
00186 
00187 BOOL
00188 CNewMenu::LoadAllItems()
00189 {
00190     DWORD dwIndex = 0;
00191     WCHAR wszName[MAX_PATH];
00192     SHELLNEW_ITEM *pNewItem;
00193     SHELLNEW_ITEM *pCurItem = NULL;
00194 
00195     /* If there are any unload them */
00196     UnloadAllItems();
00197 
00198     /* Enumerate all extesions */
00199     while (RegEnumKeyW(HKEY_CLASSES_ROOT, dwIndex++, wszName, _countof(wszName)) == ERROR_SUCCESS)
00200     {
00201         if (wszName[0] != L'.')
00202             continue;
00203 
00204         pNewItem = LoadItem(wszName);
00205         if (pNewItem)
00206         {
00207             if (wcsicmp(pNewItem->pwszExt, L".lnk") == 0)
00208             {
00209                 /* Link handler */
00210                 m_pLinkItem = pNewItem;
00211             }
00212             else
00213             {
00214                 /* Add at the end of list */
00215                 if (pCurItem)
00216                 {
00217                     pCurItem->pNext = pNewItem;
00218                     pCurItem = pNewItem;
00219                 }
00220                 else
00221                     pCurItem = m_pItems = pNewItem;
00222             }
00223         }
00224     }
00225 
00226     if (!m_pLinkItem)
00227     {
00228         m_pLinkItem = (SHELLNEW_ITEM *)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(SHELLNEW_ITEM));
00229         if (m_pLinkItem)
00230         {
00231             m_pLinkItem->Type = SHELLNEW_TYPE_NULLFILE;
00232             m_pLinkItem->pwszDesc = _wcsdup(L"Link");
00233             m_pLinkItem->pwszExt = _wcsdup(L".lnk");
00234         }
00235     }
00236 
00237     if (m_pItems == NULL)
00238         return FALSE;
00239     else
00240         return TRUE;
00241 }
00242 
00243 UINT
00244 CNewMenu::InsertShellNewItems(HMENU hMenu, UINT idCmdFirst, UINT Pos)
00245 {
00246     MENUITEMINFOW mii;
00247     WCHAR wszBuf[256];
00248     UINT idCmd = idCmdFirst;
00249 
00250     if (m_pItems == NULL)
00251     {
00252         if (!LoadAllItems())
00253             return 0;
00254     }
00255 
00256     ZeroMemory(&mii, sizeof(mii));
00257     mii.cbSize = sizeof(mii);
00258 
00259     /* Insert new folder action */
00260     if (!LoadStringW(shell32_hInstance, FCIDM_SHVIEW_NEWFOLDER, wszBuf, _countof(wszBuf)))
00261         wszBuf[0] = 0;
00262     mii.fMask = MIIM_ID | MIIM_TYPE | MIIM_STATE | MIIM_DATA;
00263     mii.fType = MFT_STRING;
00264     mii.dwTypeData = wszBuf;
00265     mii.cch = wcslen(mii.dwTypeData);
00266     mii.wID = idCmd;
00267     if (m_hbmFolder)
00268     {
00269         mii.fMask |= MIIM_CHECKMARKS;
00270         mii.hbmpChecked = mii.hbmpUnchecked = m_hbmFolder;
00271     }
00272     if (InsertMenuItemW(hMenu, Pos++, TRUE, &mii))
00273         ++idCmd;
00274 
00275     /* Insert new shortcut action */
00276     if (!LoadStringW(shell32_hInstance, FCIDM_SHVIEW_NEWLINK, wszBuf, _countof(wszBuf)))
00277         wszBuf[0] = 0;
00278     mii.dwTypeData = wszBuf;
00279     mii.cch = wcslen(mii.dwTypeData);
00280     mii.wID = idCmd;
00281     if (m_hbmLink)
00282     {
00283         mii.fMask |= MIIM_CHECKMARKS;
00284         mii.hbmpChecked = mii.hbmpUnchecked = m_hbmLink;
00285     }
00286     if (InsertMenuItemW(hMenu, Pos++, TRUE, &mii))
00287         ++idCmd;
00288 
00289     /* Insert seperator for custom new action */
00290     mii.fMask = MIIM_TYPE | MIIM_ID;
00291     mii.fType = MFT_SEPARATOR;
00292     mii.wID = -1;
00293     InsertMenuItemW(hMenu, Pos++, TRUE, &mii);
00294 
00295     /* Insert rest of items */
00296     mii.fType = MFT_STRING;
00297     mii.fState = MFS_ENABLED;
00298 
00299     SHELLNEW_ITEM *pCurItem = m_pItems;
00300     while (pCurItem)
00301     {
00302         TRACE("szDesc %s\n", debugstr_w(pCurItem->pwszDesc));
00303         mii.fMask = MIIM_ID | MIIM_TYPE | MIIM_STATE | MIIM_DATA;
00304         mii.dwTypeData = pCurItem->pwszDesc;
00305         mii.cch = wcslen(mii.dwTypeData);
00306         mii.wID = idCmd;
00307         if (pCurItem->hBitmap)
00308         {
00309             mii.fMask |= MIIM_CHECKMARKS;
00310             mii.hbmpChecked = mii.hbmpUnchecked = pCurItem->hBitmap;
00311         }
00312         if (InsertMenuItemW(hMenu, Pos++, TRUE, &mii))
00313             ++idCmd;
00314         pCurItem = pCurItem->pNext;
00315     }
00316 
00317     return idCmd - idCmdFirst;
00318 }
00319 
00320 CNewMenu::SHELLNEW_ITEM *CNewMenu::FindItemFromIdOffset(UINT IdOffset)
00321 {
00322     if (IdOffset == 0)
00323         return NULL; /* Folder */
00324 
00325     if (IdOffset == 1)
00326         return m_pLinkItem; /* shortcut */
00327 
00328     /* Find shell new item */
00329     SHELLNEW_ITEM *pItem = m_pItems;
00330     for (UINT i = 2; pItem; ++i)
00331     {
00332         if (i == IdOffset)
00333             break;
00334 
00335         pItem = pItem->pNext;
00336     }
00337 
00338     return pItem;
00339 }
00340 
00341 HRESULT CNewMenu::CreateNewFolder(IShellView *psv)
00342 {
00343     WCHAR wszName[MAX_PATH];
00344     CComPtr<ISFHelper> psfhlp; 
00345     CComPtr<IFolderView> pFolderView;
00346     CComPtr<IShellFolder> pParentFolder;
00347     HRESULT hr;
00348 
00349     //if (m_pSite == NULL)
00350     //    return E_FAIL;
00351 
00352     /* Get current folder */
00353     hr = IUnknown_QueryService(psv, SID_IFolderView, IID_IFolderView, (void **)&pFolderView);
00354     if (FAILED(hr))
00355         return hr;
00356 
00357     hr = pFolderView->GetFolder(IID_IShellFolder, (void **)&pParentFolder);
00358     if (FAILED(hr))
00359         return hr;
00360 
00361     hr = pParentFolder->QueryInterface(IID_ISFHelper, (LPVOID*)&psfhlp);
00362     if (FAILED(hr))
00363         return hr;
00364 
00365     LPITEMIDLIST pidl;
00366 
00367     /* Get unique name and create a folder */
00368     hr = psfhlp->GetUniqueName(wszName, _countof(wszName));
00369     if (hr != S_OK)
00370         return hr;
00371     hr = psfhlp->AddFolder(0, wszName, &pidl);
00372     if (hr != S_OK)
00373     {
00374         WCHAR wszBuf[256];
00375         StringCbPrintfW(wszBuf, sizeof(wszBuf), L"Cannot create folder: %s", wszName);
00376         MessageBoxW(NULL, wszBuf, L"Cannot create folder", MB_OK|MB_ICONERROR);
00377         return hr;
00378     }
00379 
00380     /* Do a labeledit */
00381     psv->Refresh();
00382     psv->SelectItem(pidl, SVSI_DESELECTOTHERS | SVSI_EDIT | SVSI_ENSUREVISIBLE |
00383                           SVSI_FOCUSED | SVSI_SELECT);
00384 
00385     SHFree(pidl);
00386     return S_OK;
00387 }
00388 
00389 HRESULT CNewMenu::CreateNewItem(SHELLNEW_ITEM *pItem, LPCMINVOKECOMMANDINFO lpcmi, IShellView *psv)
00390 {
00391     LPITEMIDLIST pidl;
00392     STRRET strTemp;
00393     WCHAR wszBuf[MAX_PATH];
00394     WCHAR wszPath[MAX_PATH];
00395     CComPtr<IFolderView> pFolderView;
00396     CComPtr<IShellFolder> pParentFolder;
00397     CComPtr<IPersistFolder3> psf;
00398     HRESULT hr;
00399 
00400     /* Get current folder */
00401     hr = IUnknown_QueryService(psv, SID_IFolderView, IID_IFolderView, (void **)&pFolderView);
00402     if (FAILED(hr))
00403         return hr;
00404 
00405     hr = pFolderView->GetFolder(IID_IShellFolder, (void **)&pParentFolder);
00406     if (FAILED(hr))
00407         return hr;
00408 
00409     if (pParentFolder->QueryInterface(IID_IPersistFolder2, (LPVOID*)&psf) != S_OK)
00410     {
00411         ERR("Failed to get interface IID_IPersistFolder2\n");
00412         return E_FAIL;
00413     }
00414 
00415     if (psf->GetCurFolder(&pidl) != S_OK)
00416     {
00417         ERR("IPersistFolder2_GetCurFolder failed\n");
00418         return E_FAIL;
00419     }
00420 
00421     /* Get folder path */
00422     if (pParentFolder == NULL || pParentFolder->GetDisplayNameOf(pidl, SHGDN_FORPARSING, &strTemp) != S_OK)
00423     {
00424         ERR("IShellFolder_GetDisplayNameOf failed\n");
00425         return E_FAIL;
00426     }
00427     StrRetToBufW(&strTemp, pidl, wszPath, _countof(wszPath));
00428 
00429     switch (pItem->Type)
00430     {
00431         case SHELLNEW_TYPE_COMMAND:
00432         {
00433             LPWSTR Ptr, pwszCmd;
00434             WCHAR wszTemp[MAX_PATH];
00435             STARTUPINFOW si;
00436             PROCESS_INFORMATION pi;
00437 
00438             if (!ExpandEnvironmentStringsW((LPWSTR)pItem->pData, wszBuf, MAX_PATH))
00439             {
00440                 TRACE("ExpandEnvironmentStrings failed\n");
00441                 break;
00442             }
00443 
00444             /* Expand command parameter, FIXME: there can be more modifiers */
00445             Ptr = wcsstr(wszBuf, L"%1");
00446             if (Ptr)
00447             {
00448                 Ptr[1] = 's';
00449                 StringCbPrintfW(wszTemp, sizeof(wszTemp), wszBuf, wszPath);
00450                 pwszCmd = wszTemp;
00451             }
00452             else
00453                 pwszCmd = wszBuf;
00454 
00455             /* Create process */
00456             ZeroMemory(&si, sizeof(si));
00457             si.cb = sizeof(si);
00458             if (CreateProcessW(NULL, pwszCmd, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi))
00459             {
00460                 CloseHandle(pi.hProcess);
00461                 CloseHandle(pi.hThread);
00462             } else
00463                 ERR("Failed to create process\n");
00464             break;
00465         }
00466         case SHELLNEW_TYPE_DATA:
00467         case SHELLNEW_TYPE_FILENAME:
00468         case SHELLNEW_TYPE_NULLFILE:
00469         {
00470             BOOL bSuccess = TRUE;
00471             LPWSTR pwszFilename = NULL;
00472             size_t cchFilenameMax = 0;
00473 
00474             /* Build new file name */
00475             LoadStringW(shell32_hInstance, FCIDM_SHVIEW_NEW, wszBuf, _countof(wszBuf));
00476             StringCchCatExW(wszPath, _countof(wszPath), L"\\", &pwszFilename, &cchFilenameMax, 0);
00477             StringCchPrintfW(pwszFilename, cchFilenameMax, L"%s %s%s", wszBuf, pItem->pwszDesc, pItem->pwszExt);
00478 
00479             /* Find unique name */
00480             for (UINT i = 2; PathFileExistsW(wszPath); ++i)
00481             {
00482                 StringCchPrintfW(pwszFilename, cchFilenameMax, L"%s %s (%u)%s", wszBuf, pItem->pwszDesc, i, pItem->pwszExt);
00483                 TRACE("New Filename %ls\n", pwszFilename);
00484             }
00485 
00486             /* Create new file */
00487             HANDLE hFile = CreateFileW(wszPath, GENERIC_WRITE, 0, NULL, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, NULL);
00488             if (hFile != INVALID_HANDLE_VALUE)
00489             {
00490                 if (pItem->Type == SHELLNEW_TYPE_DATA)
00491                 {
00492                     /* Write a content */
00493                     DWORD cbWritten;
00494                     WriteFile(hFile, pItem->pData, pItem->cbData, &cbWritten, NULL);
00495                 }
00496 
00497                 /* Close file now */
00498                 CloseHandle(hFile);
00499             } else
00500                 bSuccess = FALSE;
00501 
00502             if (pItem->Type == SHELLNEW_TYPE_FILENAME)
00503             {
00504                 /* Copy file */
00505                 if (!CopyFileW((LPWSTR)pItem->pData, wszPath, FALSE))
00506                     ERR("Copy file failed: %ls\n", (LPWSTR)pItem->pData);
00507             }
00508 
00509             /* Show message if we failed */
00510             if (bSuccess)
00511             {
00512                 TRACE("Notifying fs %s\n", debugstr_w(wszPath));
00513                 SHChangeNotify(SHCNE_CREATE, SHCNF_PATHW, (LPCVOID)wszPath, NULL);
00514                 psv->Refresh();
00515 
00516                 LPITEMIDLIST pidl;
00517                 hr = _ILCreateFromPathW(wszPath, &pidl);
00518                 if (SUCCEEDED(hr))
00519                 {
00520                     psv->SelectItem(pidl, SVSI_DESELECTOTHERS|SVSI_EDIT|SVSI_ENSUREVISIBLE|SVSI_FOCUSED|SVSI_SELECT);
00521                     ILFree(pidl);
00522                 }
00523             }
00524             else
00525             {
00526                 StringCbPrintfW(wszBuf, sizeof(wszBuf), L"Cannot create file: %s", pwszFilename);
00527                 MessageBoxW(NULL, wszBuf, L"Cannot create file", MB_OK|MB_ICONERROR); // FIXME
00528             }
00529             break;
00530         }
00531         case SHELLNEW_TYPE_INVALID:
00532             ERR("Invalid type\n");
00533             break;
00534     }
00535 
00536     return S_OK;
00537 }
00538 
00539 HRESULT STDMETHODCALLTYPE CNewMenu::SetSite(IUnknown *pUnkSite)
00540 {
00541     m_pSite = pUnkSite;
00542     return S_OK;
00543 }
00544 
00545 HRESULT STDMETHODCALLTYPE CNewMenu::GetSite(REFIID riid, void **ppvSite)
00546 {
00547     if (ppvSite == NULL)
00548         return E_POINTER;
00549     *ppvSite = m_pSite;
00550     if (m_pSite != NULL)
00551         m_pSite->AddRef();
00552     return S_OK;
00553 }
00554 
00555 HRESULT
00556 WINAPI
00557 CNewMenu::QueryContextMenu(HMENU hMenu,
00558                            UINT indexMenu,
00559                            UINT idCmdFirst,
00560                            UINT idCmdLast,
00561                            UINT uFlags)
00562 {
00563     WCHAR wszNew[200];
00564     MENUITEMINFOW mii;
00565     UINT cItems = 0;
00566 
00567     TRACE("%p %p %u %u %u %u\n", this,
00568           hMenu, indexMenu, idCmdFirst, idCmdLast, uFlags);
00569 
00570     if (!LoadStringW(shell32_hInstance, FCIDM_SHVIEW_NEW, wszNew, _countof(wszNew)))
00571         return E_FAIL;
00572 
00573     m_hSubMenu = CreateMenu();
00574     if (!m_hSubMenu)
00575         return E_FAIL;
00576 
00577     cItems = InsertShellNewItems(m_hSubMenu, idCmdFirst, 0);
00578 
00579     memset(&mii, 0, sizeof(mii));
00580     mii.cbSize = sizeof(mii);
00581     mii.fMask = MIIM_TYPE | MIIM_ID | MIIM_STATE | MIIM_SUBMENU;
00582     mii.fType = MFT_STRING;
00583     mii.wID = -1;
00584     mii.dwTypeData = wszNew;
00585     mii.cch = wcslen(mii.dwTypeData);
00586     mii.fState = MFS_ENABLED;
00587     mii.hSubMenu = m_hSubMenu;
00588 
00589     if (!InsertMenuItemW(hMenu, indexMenu, TRUE, &mii))
00590         return E_FAIL;
00591 
00592     return MAKE_HRESULT(SEVERITY_SUCCESS, 0, cItems);
00593 }
00594 
00595 HRESULT
00596 WINAPI
00597 CNewMenu::InvokeCommand(LPCMINVOKECOMMANDINFO lpici)
00598 {
00599     IShellBrowser *lpSB = NULL;
00600     CComPtr<IShellView> lpSV = NULL;
00601     HRESULT hr = E_FAIL;
00602 
00603     /* Note: CWM_GETISHELLBROWSER returns shell browser without adding reference */
00604     lpSB = (LPSHELLBROWSER)SendMessageA(lpici->hwnd, CWM_GETISHELLBROWSER, 0, 0);
00605     if (lpSB)
00606         lpSB->QueryActiveShellView(&lpSV);
00607 
00608     if (LOWORD(lpici->lpVerb) == 0)
00609         hr = CreateNewFolder(lpSV);
00610     else
00611     {
00612         SHELLNEW_ITEM *pItem = FindItemFromIdOffset(LOWORD(lpici->lpVerb));
00613         if (pItem)
00614             hr = CreateNewItem(pItem, lpici, lpSV);
00615     }
00616 
00617     TRACE("CNewMenu::InvokeCommand %x\n", hr);
00618     return hr;
00619 }
00620 
00621 HRESULT
00622 WINAPI
00623 CNewMenu::GetCommandString(UINT_PTR idCmd,
00624                            UINT uType,
00625                            UINT *pwReserved,
00626                            LPSTR pszName,
00627                            UINT cchMax)
00628 {
00629     FIXME("%p %lu %u %p %p %u\n", this,
00630           idCmd, uType, pwReserved, pszName, cchMax );
00631 
00632     return E_NOTIMPL;
00633 }
00634 
00635 HRESULT
00636 WINAPI
00637 CNewMenu::HandleMenuMsg(UINT uMsg, WPARAM wParam, LPARAM lParam)
00638 {
00639     return S_OK;
00640 }
00641 
00642 HRESULT WINAPI
00643 CNewMenu::Initialize(LPCITEMIDLIST pidlFolder,
00644                      IDataObject *pdtobj, HKEY hkeyProgID)
00645 {
00646     /* Load folder and shortcut icons */
00647     HICON hIcon = (HICON)LoadImage(shell32_hInstance, MAKEINTRESOURCE(IDI_SHELL_FOLDER), IMAGE_ICON, 0, 0, LR_SHARED);
00648     m_hbmFolder = hIcon ? IconToBitmap(hIcon) : NULL;
00649     hIcon = (HICON)LoadImage(shell32_hInstance, MAKEINTRESOURCE(IDI_SHELL_SHORTCUT), IMAGE_ICON, 0, 0, LR_SHARED);
00650     m_hbmLink = hIcon ? IconToBitmap(hIcon) : NULL;
00651 
00652     return S_OK;
00653 }

Generated on Sun May 27 2012 04:26:23 for ReactOS by doxygen 1.7.6.1

ReactOS is a registered trademark or a trademark of ReactOS Foundation in the United States and other countries.