HMENU fsODMenu::CopyMenu(HMENU hMenu)
{
	HMENU hCopy = CreateMenu ();

	for (int i = 0; i < GetMenuItemCount (hMenu); i++)
	{
		UINT uState = GetMenuState (hMenu, i, MF_BYPOSITION);
		UINT nID;
		char szMenuText [100];

		if (uState & MF_POPUP)
		{
			nID = (UINT) CopyMenu (GetSubMenu (hMenu, i));
			uState = MF_POPUP | MF_STRING;
		}
		else
			nID = GetMenuItemID (hMenu, i);

		GetMenuString (hMenu, i, szMenuText, sizeof (szMenuText), MF_BYPOSITION);

		
		AppendMenu (hCopy, uState, nID, szMenuText);
	}

	return hCopy;
}
int fsODMenu::InsertMenu(CMenu *pMenu, int iWhere, CMenu *pMenuWhere)
{
	BOOL bMenuBar = FALSE;
	if (pMenuWhere == NULL)
	{
		pMenuWhere = CMenu::FromHandle (m_hMenu);
		bMenuBar = TRUE;
	}

	for (UINT i = 0; i < (UINT)pMenu->GetMenuItemCount (); i++)
	{
		CString strText;

		pMenu->GetMenuString (i, strText, MF_BYPOSITION);

		HMENU hMenu = CopyMenu (pMenu->GetSubMenu (i)->m_hMenu);
		CMenu *menu = CMenu::FromHandle (hMenu);

		pMenuWhere->InsertMenu (iWhere, MF_BYPOSITION | MF_POPUP,  (UINT_PTR) menu->m_hMenu, strText);

		AttachMenu (menu);
		AttachMenuItem (pMenuWhere, iWhere++)->bMenuBar = bMenuBar;
	}

	
	return pMenu->GetMenuItemCount ();
}
wxMenu* CopyMenu(wxMenu* mnu, bool with_accelerators)
{
    if (!mnu || mnu->GetMenuItemCount() < 1)
        return nullptr;
    wxMenu* theMenu = new wxMenu();

    for (size_t i = 0; i < mnu->GetMenuItemCount();++i)
    {
        wxMenuItem* tmpItem = mnu->FindItemByPosition(i);
        wxMenuItem* theItem = new wxMenuItem(nullptr,
                                             tmpItem->GetId(),
                                             with_accelerators?tmpItem->GetItemLabel():tmpItem->GetItemLabelText(),
                                             tmpItem->GetHelp(),
                                             tmpItem->GetKind(),
                                             CopyMenu(tmpItem->GetSubMenu()));
        theMenu->Append(theItem);
    }
    return theMenu;
}
// =========================================================================
// This function *requires* dummy menu resource IDR_MENU_DUMMY_LEFTRIGHT with
// two buttons
HWND SetupMenu_Softkey(
    HWND hWnd, 
    int MenuID, 
    int leftMenuItemCtrlID, 
    WCHAR* rightMenuTitle
)
{
    HWND retval;
    MENUITEMINFO menuInfoLeft;
    HMENU hMenuRight;
    TBBUTTON tbb[2];
    HMENU hMenuLoaded;
    WCHAR buffer[1024];  // Just a value large enough to store menu text
    WCHAR defaultRightTitle[1024];  // Just a value large enough to store menu text
    WCHAR* useRightTitle;

    retval = SetupMenu_NonSoftkey(hWnd, IDR_MENU_DUMMY_LEFTRIGHT);    

    useRightTitle = rightMenuTitle;
    if (useRightTitle == NULL)
        {
        wcscpy(defaultRightTitle, _("Menu"));
        useRightTitle = defaultRightTitle;
        }

    if (retval != NULL) 
        {
        // Ditch the dummy buttons...
        SendMessage((HWND)retval, TB_DELETEBUTTON, 0, 0);
        SendMessage((HWND)retval, TB_DELETEBUTTON, 0, 0);

        hMenuLoaded = LoadMenu(G_hInstance, MAKEINTRESOURCE(MenuID)); 

        if (hMenuLoaded != NULL)
            {
            menuInfoLeft.cbSize = sizeof(menuInfoLeft);
            menuInfoLeft.fMask = (MIIM_TYPE | MIIM_ID);
            menuInfoLeft.cch = sizeof(buffer);
            menuInfoLeft.dwTypeData = buffer;

            // Identify menuitem for left button text
            if (GetMenuItemInfo(
                                  hMenuLoaded, 
                                  leftMenuItemCtrlID, 
                                  FALSE,
                                  &menuInfoLeft
                                 ))
                {
                // Lose any "..." following the command
                wcstok(buffer, TEXT("."));
                }
            else
                {
                wsprintf(buffer, TEXT("???"));
                }

            hMenuRight = CreatePopupMenu(); 
            CopyMenu(hMenuLoaded, hMenuRight);
            DestroyMenu(hMenuLoaded);

            memset(&tbb, 0, sizeof(tbb));

            // Setup left menubutton...
            tbb[0].idCommand = leftMenuItemCtrlID;
            tbb[0].iBitmap   = I_IMAGENONE;
            tbb[0].fsState   = TBSTATE_ENABLED;
            tbb[0].fsStyle   = (
                                TBSTYLE_BUTTON   |
                                TBSTYLE_AUTOSIZE |
                                0x80  // magic flag 
                               );
            tbb[0].dwData    = (DWORD)0;
            tbb[0].iString   = (int)buffer; 

            // Setup right menubutton...
            tbb[1].idCommand = TB_MENU_RIGHT;
            tbb[1].iBitmap   = I_IMAGENONE;
            tbb[1].fsState   = TBSTATE_ENABLED;
            tbb[1].fsStyle   = (
                                TBSTYLE_DROPDOWN |
                                TBSTYLE_BUTTON   |
                                TBSTYLE_AUTOSIZE |
                                0x80  // magic flag
                               );
            tbb[1].dwData    = (DWORD)hMenuRight;
            tbb[1].iString   = (int)useRightTitle; 

            SendMessage((HWND)retval, TB_ADDBUTTONSW, 2, (LPARAM)(&tbb));

            DrawMenuBar(retval); 
            }
        }

    return retval;

}
// =========================================================================
// Because we can't load a main menu with separators, any menuitem with
// an ID of ID_SEPARATOR will be replaced with a separator
void CopyMenu(HMENU hOrigMenu, HMENU hNewMenu)
{
    MENUITEMINFO menuItemInfo;
    int i;
    WCHAR buffer[1024];  // Just a value large enough to store menu text
    UINT newID;
    UINT newItemFlags;
    HMENU hNewPopup;

    i = 0;
    while (TRUE)
        {
        ZeroMemory(&menuItemInfo, sizeof(menuItemInfo));
        menuItemInfo.cbSize = sizeof(menuItemInfo);
        menuItemInfo.fMask  = (
                      MIIM_CHECKMARKS |
                      MIIM_DATA |
                      MIIM_ID |
                      MIIM_STATE |
                      MIIM_SUBMENU |
                      MIIM_TYPE
                     );
        menuItemInfo.dwTypeData = buffer;
        menuItemInfo.cch = sizeof(buffer);

        if (!(GetMenuItemInfo(hOrigMenu, i, TRUE, &menuItemInfo)))
            {
            break;
            }

        // Recursively copy submenus:
        newItemFlags = MF_BYPOSITION;
        newID = menuItemInfo.wID;
        if (
            (menuItemInfo.fType && MFT_SEPARATOR) ||
            (newID == ID_SEPARATOR)
           )
            {
            newItemFlags |= MF_SEPARATOR;
            }

        if (menuItemInfo.hSubMenu)
            {
            newItemFlags |= MF_POPUP;
            hNewPopup = CreatePopupMenu();
            CopyMenu(menuItemInfo.hSubMenu, hNewPopup);
            menuItemInfo.hSubMenu = hNewPopup;
            newID = (int)hNewPopup;
            }

        /*
        MF_STRING
        MF_UNCHECKED 
        MF_MENUBREAK 
        MF_GRAYED 
        MF_ENABLED 
        MF_CHECKED
        MF_MENUBARBREAK 
        MF_SEPARATOR 
        */

        // Add the copy...
        InsertMenu(hNewMenu, i, newItemFlags, newID, buffer);

        // Setup this for enabled and checkmarks...
        SetMenuItemInfo(hNewMenu, i, TRUE, &menuItemInfo);

        i++;
        }

}