/* * */ #include #include "wine/obj_base.h" #include "wine/obj_enumidlist.h" #include "wine/obj_shellfolder.h" #include "heap.h" #include "debug.h" #include "winversion.h" #include "shell32_main.h" #include "pidl.h" DEFAULT_DEBUG_CHANNEL(shell) BOOL WINAPI FileMenu_DeleteAllItems (HMENU hMenu); /************************************************************************* * FileMenu_Create [SHELL32.114] * */ HMENU WINAPI FileMenu_Create ( COLORREF crBorderColor, int nBorderWidth, HBITMAP hBorderBmp, int nSelHeight, UINT uFlags) { HMENU ret = CreatePopupMenu(); FIXME(shell,"0x%08lx 0x%08x 0x%08x 0x%08x 0x%08x ret=0x%08x\n", crBorderColor, nBorderWidth, hBorderBmp, nSelHeight, uFlags, ret); return ret; } /************************************************************************* * FileMenu_Destroy [SHELL32.118] * * NOTES * exported by name */ void WINAPI FileMenu_Destroy (HMENU hMenu) { TRACE(shell,"0x%08x\n", hMenu); FileMenu_DeleteAllItems (hMenu); DestroyMenu (hMenu); } /************************************************************************* * FileMenu_AppendItemAW [SHELL32.115] * */ BOOL WINAPI FileMenu_AppendItemAW( HMENU hMenu, LPCVOID lpText, UINT uID, int icon, HMENU hMenuPopup, int nItemHeight) { LPSTR lpszText = (LPSTR)lpText; MENUITEMINFOA mii; ZeroMemory (&mii, sizeof(MENUITEMINFOA)); if (VERSION_OsIsUnicode() && (lpszText!=FM_SEPARATOR)) lpszText = HEAP_strdupWtoA ( GetProcessHeap(),0, lpText); FIXME(shell,"0x%08x %s 0x%08x 0x%08x 0x%08x 0x%08x\n", hMenu, (lpszText!=FM_SEPARATOR) ? lpszText: NULL, uID, icon, hMenuPopup, nItemHeight); mii.cbSize = sizeof(mii); if ( hMenuPopup ) { /* sub menu */ mii.fMask = MIIM_SUBMENU | MIIM_TYPE | MIIM_DATA;; mii.hSubMenu = hMenuPopup; mii.fType = MFT_STRING; mii.dwTypeData = lpszText; } else if (lpText == FM_SEPARATOR ) { mii.fMask = MIIM_ID | MIIM_TYPE; mii.fType = MFT_SEPARATOR; } else { /* normal item */ mii.fMask = MIIM_ID | MIIM_TYPE | MIIM_STATE; mii.dwTypeData = lpszText; mii.fState = MFS_ENABLED | MFS_DEFAULT; mii.fType = MFT_STRING; } mii.wID = uID; InsertMenuItemA (hMenu, (UINT)-1, TRUE, &mii); if (VERSION_OsIsUnicode()) HeapFree( GetProcessHeap(), 0, lpszText ); return TRUE; } /************************************************************************* * FileMenu_InsertUsingPidl [SHELL32.110] * * NOTES * uEnumFlags any SHCONTF flag */ int WINAPI FileMenu_InsertUsingPidl ( HMENU hMenu, UINT uID, LPCITEMIDLIST pidl, UINT uFlags, UINT uEnumFlags, LPFNFMCALLBACK lpfnCallback) { IShellFolder *lpsf, *lpsf2; IEnumIDList *lpe=0; ULONG ulFetched; LPITEMIDLIST pidlTemp=0; ULONG ulItemAttr; char sTemp[MAX_PATH]; int NumberOfItems = 0; FIXME(shell,"0x%08x 0x%08x %p 0x%08x 0x%08x %p\n", hMenu, uID, pidl, uFlags, uEnumFlags, lpfnCallback); pdump (pidl); if (SUCCEEDED (SHGetDesktopFolder(&lpsf))) { if (SUCCEEDED(IShellFolder_BindToObject(lpsf, pidl,0,(REFIID)&IID_IShellFolder,(LPVOID *)&lpsf2))) { if (SUCCEEDED (IShellFolder_EnumObjects(lpsf2, 0, uEnumFlags, &lpe ))) { while (NOERROR == IEnumIDList_Next(lpe,1,&pidlTemp,&ulFetched)) { if (SUCCEEDED (IShellFolder_GetAttributesOf(lpsf, 1, &pidlTemp, &ulItemAttr))) { ILGetDisplayName( pidlTemp, sTemp); if ( SFGAO_FOLDER & ulItemAttr) { FileMenu_AppendItemAW (hMenu, sTemp, uID, FM_BLANK_ICON, CreatePopupMenu(), FM_DEFAULT_HEIGHT); } else { FileMenu_AppendItemAW (hMenu, sTemp, uID, FM_BLANK_ICON, 0, FM_DEFAULT_HEIGHT); } } TRACE(shell,"enter callback\n"); lpfnCallback ( pidl, pidlTemp); TRACE(shell,"leave callback\n"); NumberOfItems++; } IEnumIDList_Release (lpe); } IShellFolder_Release(lpsf2); } IShellFolder_Release(lpsf); } return NumberOfItems; } /************************************************************************* * FileMenu_ReplaceUsingPidl [SHELL32.113] * */ int WINAPI FileMenu_ReplaceUsingPidl( HMENU hMenu, UINT uID, LPCITEMIDLIST pidl, UINT uEnumFlags, LPFNFMCALLBACK lpfnCallback) { FIXME(shell,"0x%08x 0x%08x %p 0x%08x %p\n", hMenu, uID, pidl, uEnumFlags, lpfnCallback); return 0; } /************************************************************************* * FileMenu_Invalidate [SHELL32.111] */ void WINAPI FileMenu_Invalidate (HMENU hMenu) { FIXME(shell,"0x%08x\n",hMenu); } /************************************************************************* * FileMenu_FindSubMenuByPidl [SHELL32.106] */ HMENU WINAPI FileMenu_FindSubMenuByPidl( HMENU hMenu, LPCITEMIDLIST pidl) { FIXME(shell,"0x%08x %p\n",hMenu, pidl); return 0; } /************************************************************************* * FileMenu_AppendFilesForPidl [SHELL32.124] */ HMENU WINAPI FileMenu_AppendFilesForPidl( HMENU hMenu, LPCITEMIDLIST pidl, BOOL bAddSeperator) { FIXME(shell,"0x%08x %p 0x%08x\n",hMenu, pidl,bAddSeperator); return 0; } /************************************************************************* * FileMenu_AddFilesForPidl [SHELL32.125] * * NOTES * uEnumFlags any SHCONTF flag */ int WINAPI FileMenu_AddFilesForPidl ( HMENU hMenu, UINT uReserved, UINT uID, LPCITEMIDLIST pidl, UINT uFlags, UINT uEnumFlags, LPFNFMCALLBACK lpfnCallback) { FIXME(shell,"0x%08x 0x%08x 0x%08x %p 0x%08x 0x%08x %p\n", hMenu, uReserved, uID, pidl, uFlags, uEnumFlags, lpfnCallback); pdump (pidl); return 0; } /************************************************************************* * FileMenu_TrackPopupMenuEx [SHELL32.116] */ HRESULT WINAPI FileMenu_TrackPopupMenuEx ( HMENU hMenu, UINT uFlags, int x, int y, HWND hWnd, LPTPMPARAMS lptpm) { FIXME(shell,"0x%08x 0x%08x 0x%x 0x%x 0x%08x %p stub\n", hMenu, uFlags, x, y, hWnd, lptpm); return TrackPopupMenuEx(hMenu, uFlags, x, y, hWnd, lptpm); } /************************************************************************* * FileMenu_GetLastSelectedItemPidls [SHELL32.107] */ BOOL WINAPI FileMenu_GetLastSelectedItemPidls( UINT uReserved, LPCITEMIDLIST *ppidlFolder, LPCITEMIDLIST *ppidlItem) { FIXME(shell,"0x%08x %p %p\n",uReserved, ppidlFolder, ppidlItem); return 0; } /************************************************************************* * FileMenu_MeasureItem [SHELL32.112] */ LRESULT WINAPI FileMenu_MeasureItem( HWND hWnd, LPMEASUREITEMSTRUCT lpmis) { FIXME(shell,"0x%08x %p\n", hWnd, lpmis); return 0; } /************************************************************************* * FileMenu_DrawItem [SHELL32.105] */ LRESULT WINAPI FileMenu_DrawItem( HWND hWnd, LPDRAWITEMSTRUCT lpdis) { FIXME(shell,"0x%08x %p\n", hWnd, lpdis); return 0; } /************************************************************************* * FileMenu_InitMenuPopup [SHELL32.109] * * NOTES * The filemenu is a ownerdrawn menu. Call this function responding to * WM_INITPOPUPMENU * */ HRESULT WINAPI FileMenu_InitMenuPopup (DWORD hmenu) { FIXME(shell,"hmenu=0x%lx stub\n",hmenu); return 0; } /************************************************************************* * FileMenu_HandleMenuChar [SHELL32.108] */ LRESULT WINAPI FileMenu_HandleMenuChar( HMENU hMenu, WPARAM wParam) { FIXME(shell,"0x%08x 0x%08x\n",hMenu,wParam); return 0; } /************************************************************************* * FileMenu_DeleteAllItems [SHELL32.104] * * NOTES * exported by name */ BOOL WINAPI FileMenu_DeleteAllItems (HMENU hMenu) { FIXME(shell,"0x%08x stub\n", hMenu); DestroyMenu (hMenu); return TRUE; } /************************************************************************* * FileMenu_DeleteItemByCmd [SHELL32.] * */ BOOL WINAPI FileMenu_DeleteItemByCmd (HMENU hMenu, UINT uID) { TRACE(shell,"0x%08x 0x%08x\n", hMenu, uID); DeleteMenu(hMenu, MF_BYCOMMAND, uID); return TRUE; } /************************************************************************* * FileMenu_DeleteItemByIndex [SHELL32.140] */ BOOL WINAPI FileMenu_DeleteItemByIndex ( HMENU hMenu, UINT uPos) { TRACE(shell,"0x%08x 0x%08x\n", hMenu, uPos); DeleteMenu(hMenu, MF_BYPOSITION, uPos); return TRUE; } /************************************************************************* * FileMenu_DeleteItemByFirstID [SHELL32.141] */ BOOL WINAPI FileMenu_DeleteItemByFirstID( HMENU hMenu, UINT uID) { TRACE(shell,"0x%08x 0x%08x\n", hMenu, uID); return 0; } /************************************************************************* * FileMenu_DeleteSeparator [SHELL32.142] */ BOOL WINAPI FileMenu_DeleteSeparator(HMENU hMenu) { TRACE(shell,"0x%08x\n", hMenu); return 0; } /************************************************************************* * FileMenu_EnableItemByCmd [SHELL32.143] */ BOOL WINAPI FileMenu_EnableItemByCmd( HMENU hMenu, UINT uID, BOOL bEnable) { TRACE(shell,"0x%08x 0x%08x 0x%08x\n", hMenu, uID,bEnable); return 0; } /************************************************************************* * FileMenu_GetItemExtent [SHELL32.144] * */ DWORD WINAPI FileMenu_GetItemExtent (HMENU hMenu, UINT uPos) { RECT rect; FIXME (shell,"0x%08x 0x%08x\n", hMenu, uPos); if (GetMenuItemRect(0, hMenu, uPos, &rect)) { FIXME (shell,"0x%04x 0x%04x 0x%04x 0x%04x\n", rect.right, rect.left, rect.top, rect.bottom); return ((rect.right-rect.left)<<16) + (rect.top-rect.bottom); } return 0x00200020; /*fixme*/ } /************************************************************************* * FileMenu_AbortInitMenu [SHELL32.120] * */ void WINAPI FileMenu_AbortInitMenu (void) { TRACE(shell,"\n"); } /************************************************************************* * SHFind_InitMenuPopup [SHELL32.149] * * * PARAMETERS * hMenu [in] handel of menu previously created * hWndParent [in] parent window * w [in] no pointer * x [in] no pointer */ HRESULT WINAPI SHFind_InitMenuPopup (HMENU hMenu, HWND hWndParent, DWORD w, DWORD x) { FIXME(shell,"hmenu=0x%08x hwnd=0x%08x 0x%08lx 0x%08lx stub\n", hMenu,hWndParent,w,x); return TRUE; } /************************************************************************* * Shell_MergeMenus [SHELL32.67] * */ BOOL _SHIsMenuSeparator(HMENU hm, int i) { MENUITEMINFOA mii; mii.cbSize = sizeof(MENUITEMINFOA); mii.fMask = MIIM_TYPE; mii.cch = 0; /* WARNING: We MUST initialize it to 0*/ if (!GetMenuItemInfoA(hm, i, TRUE, &mii)) { return(FALSE); } if (mii.fType & MFT_SEPARATOR) { return(TRUE); } return(FALSE); } #define MM_ADDSEPARATOR 0x00000001L #define MM_SUBMENUSHAVEIDS 0x00000002L HRESULT WINAPI Shell_MergeMenus (HMENU hmDst, HMENU hmSrc, UINT uInsert, UINT uIDAdjust, UINT uIDAdjustMax, ULONG uFlags) { int nItem; HMENU hmSubMenu; BOOL bAlreadySeparated; MENUITEMINFOA miiSrc; char szName[256]; UINT uTemp, uIDMax = uIDAdjust; FIXME(shell,"hmenu1=0x%04x hmenu2=0x%04x 0x%04x 0x%04x 0x%04x 0x%04lx stub\n", hmDst, hmSrc, uInsert, uIDAdjust, uIDAdjustMax, uFlags); if (!hmDst || !hmSrc) { return uIDMax; } nItem = GetMenuItemCount(hmDst); if (uInsert >= (UINT)nItem) { uInsert = (UINT)nItem; bAlreadySeparated = TRUE; } else { bAlreadySeparated = _SHIsMenuSeparator(hmDst, uInsert);; } if ((uFlags & MM_ADDSEPARATOR) && !bAlreadySeparated) { /* Add a separator between the menus */ InsertMenuA(hmDst, uInsert, MF_BYPOSITION | MF_SEPARATOR, 0, NULL); bAlreadySeparated = TRUE; } /* Go through the menu items and clone them*/ for (nItem = GetMenuItemCount(hmSrc) - 1; nItem >= 0; nItem--) { miiSrc.cbSize = sizeof(MENUITEMINFOA); miiSrc.fMask = MIIM_STATE | MIIM_ID | MIIM_SUBMENU | MIIM_CHECKMARKS | MIIM_TYPE | MIIM_DATA; /* We need to reset this every time through the loop in case menus DON'T have IDs*/ miiSrc.fType = MFT_STRING; miiSrc.dwTypeData = szName; miiSrc.dwItemData = 0; miiSrc.cch = sizeof(szName); if (!GetMenuItemInfoA(hmSrc, nItem, TRUE, &miiSrc)) { continue; } if (miiSrc.fType & MFT_SEPARATOR) { /* This is a separator; don't put two of them in a row*/ if (bAlreadySeparated) { continue; } bAlreadySeparated = TRUE; } else if (miiSrc.hSubMenu) { if (uFlags & MM_SUBMENUSHAVEIDS) { /* Adjust the ID and check it*/ miiSrc.wID += uIDAdjust; if (miiSrc.wID > uIDAdjustMax) { continue; } if (uIDMax <= miiSrc.wID) { uIDMax = miiSrc.wID + 1; } } else { /* Don't set IDs for submenus that didn't have them already */ miiSrc.fMask &= ~MIIM_ID; } hmSubMenu = miiSrc.hSubMenu; miiSrc.hSubMenu = CreatePopupMenu(); if (!miiSrc.hSubMenu) { return(uIDMax); } uTemp = Shell_MergeMenus(miiSrc.hSubMenu, hmSubMenu, 0, uIDAdjust, uIDAdjustMax, uFlags&MM_SUBMENUSHAVEIDS); if (uIDMax <= uTemp) { uIDMax = uTemp; } bAlreadySeparated = FALSE; } else { /* Adjust the ID and check it*/ miiSrc.wID += uIDAdjust; if (miiSrc.wID > uIDAdjustMax) { continue; } if (uIDMax <= miiSrc.wID) { uIDMax = miiSrc.wID + 1; } bAlreadySeparated = FALSE; } if (!InsertMenuItemA(hmDst, uInsert, TRUE, &miiSrc)) { return(uIDMax); } } /* Ensure the correct number of separators at the beginning of the inserted menu items*/ if (uInsert == 0) { if (bAlreadySeparated) { DeleteMenu(hmDst, uInsert, MF_BYPOSITION); } } else { if (_SHIsMenuSeparator(hmDst, uInsert-1)) { if (bAlreadySeparated) { DeleteMenu(hmDst, uInsert, MF_BYPOSITION); } } else { if ((uFlags & MM_ADDSEPARATOR) && !bAlreadySeparated) { /* Add a separator between the menus*/ InsertMenuA(hmDst, uInsert, MF_BYPOSITION | MF_SEPARATOR, 0, NULL); } } } return(uIDMax); }