pass menuitem ident around directly, instead of deriving from itemid

sidestepping the while duplicate itemids in separate submenus problem

Change-Id: Icb57ac805f3c8c4fc3a68341e318375c6492cbb1
Reviewed-on: https://gerrit.libreoffice.org/61189
Reviewed-by: Caolán McNamara <caolanm@redhat.com>
Tested-by: Caolán McNamara <caolanm@redhat.com>
diff --git a/include/vcl/menu.hxx b/include/vcl/menu.hxx
index f865166..3d0e6cb 100644
--- a/include/vcl/menu.hxx
+++ b/include/vcl/menu.hxx
@@ -146,6 +146,7 @@ private:
    sal_uInt16 mnHighlightedItemPos; // for native menus: keeps track of the highlighted item
    MenuFlags nMenuFlags;
    sal_uInt16 nSelectedId;
    OString sSelectedIdent;

    // for output:
    sal_uInt16 nImgOrChkPos;
@@ -262,8 +263,7 @@ public:
    OString GetItemIdent(sal_uInt16 nItemId) const;
    MenuItemType GetItemType( sal_uInt16 nPos ) const;
    sal_uInt16 GetCurItemId() const { return nSelectedId;}
    OString GetCurItemIdent() const;
    OString GetItemIdentFromSubMenu(sal_uInt16 nItemId) const;
    OString GetCurItemIdent() const { return sSelectedIdent; }
    void SetItemBits( sal_uInt16 nItemId, MenuItemBits nBits );
    MenuItemBits GetItemBits( sal_uInt16 nItemId ) const;

diff --git a/include/vcl/menubtn.hxx b/include/vcl/menubtn.hxx
index b5c1e22..a76e3a3 100644
--- a/include/vcl/menubtn.hxx
+++ b/include/vcl/menubtn.hxx
@@ -38,6 +38,7 @@ private:
    std::unique_ptr<Timer> mpMenuTimer;
    VclPtr<PopupMenu> mpMenu;
    VclPtr<Window>  mpFloatingWindow;
    OString         msCurItemIdent;
    sal_uInt16      mnCurItemId;
    bool            mbDelayMenu;
    Link<MenuButton*,void> maActivateHdl;
@@ -81,7 +82,7 @@ public:
    void            SetPopover(Window* pWindow);

    sal_uInt16      GetCurItemId() const { return mnCurItemId; }
    OString         GetCurItemIdent() const;
    OString         GetCurItemIdent() const { return msCurItemIdent; }

    void            SetActivateHdl( const Link<MenuButton *, void>& rLink ) { maActivateHdl = rLink; }
    void            SetSelectHdl( const Link<MenuButton *, void>& rLink ) { maSelectHdl = rLink; }
diff --git a/sc/source/ui/navipi/content.cxx b/sc/source/ui/navipi/content.cxx
index 6ab4e59..489a12d 100644
--- a/sc/source/ui/navipi/content.cxx
+++ b/sc/source/ui/navipi/content.cxx
@@ -668,8 +668,8 @@ void ScContentTree::Command( const CommandEvent& rCEvt )
                aPop->InsertItem( 2, pParentWindow->GetStrDisplay() );
                aPop->SetPopupMenu( 2, aDocMenu.get() );

                sal_uInt16 nSelected = aPop->Execute(this, rCEvt.GetMousePosPixel());
                OString sIdent = aPop->GetItemIdentFromSubMenu(nSelected);
                aPop->Execute(this, rCEvt.GetMousePosPixel());
                OString sIdent = aPop->GetCurItemIdent();

                if (sIdent.startsWith("document"))
                {
diff --git a/vcl/source/control/menubtn.cxx b/vcl/source/control/menubtn.cxx
index 8ffa935e..6aa89d9 100644
--- a/vcl/source/control/menubtn.cxx
+++ b/vcl/source/control/menubtn.cxx
@@ -50,7 +50,9 @@ void MenuButton::ExecuteMenu()
    {
        Point aPos(0, 1);
        tools::Rectangle aRect(aPos, aSize );
        mnCurItemId = mpMenu->Execute(this, aRect, PopupMenuFlags::ExecuteDown);
        mpMenu->Execute(this, aRect, PopupMenuFlags::ExecuteDown);
        mnCurItemId = mpMenu->GetCurItemId();
        msCurItemIdent = mpMenu->GetCurItemIdent();
    }
    else
    {
@@ -70,6 +72,7 @@ void MenuButton::ExecuteMenu()
    {
        Select();
        mnCurItemId = 0;
        msCurItemIdent.clear();
    }
}

@@ -107,12 +110,6 @@ bool MenuButton::MenuShown() const
    }
}

OString MenuButton::GetCurItemIdent() const
{
    return (mnCurItemId && mpMenu) ?
        mpMenu->GetItemIdent(mnCurItemId) : OString();
}

MenuButton::MenuButton( vcl::Window* pParent, WinBits nWinBits )
    : PushButton(WindowType::MENUBUTTON)
    , mnCurItemId(0)
diff --git a/vcl/source/window/menu.cxx b/vcl/source/window/menu.cxx
index b92daf2..d1adaf2 100644
--- a/vcl/source/window/menu.cxx
+++ b/vcl/source/window/menu.cxx
@@ -364,6 +364,7 @@ void Menu::Select()
            if ( pStartMenu && ( pStartMenu != this ) )
            {
                pStartMenu->nSelectedId = nSelectedId;
                pStartMenu->sSelectedIdent = sSelectedIdent;
                pStartMenu->aSelectHdl.Call( this );
            }
        }
@@ -690,24 +691,12 @@ MenuItemType Menu::GetItemType( sal_uInt16 nPos ) const
        return MenuItemType::DONTKNOW;
}

OString Menu::GetCurItemIdent() const
{
    const MenuItemData* pData = pItemList->GetData(nSelectedId);
    return pData ? pData->sIdent : OString();
}

OString Menu::GetItemIdent(sal_uInt16 nId) const
{
    const MenuItemData* pData = pItemList->GetData(nId);
    return pData ? pData->sIdent : OString();
}

OString Menu::GetItemIdentFromSubMenu(sal_uInt16 nId) const
{
    const MenuItemData* pData = pItemList->GetDataFromSubMenu(nId);
    return pData ? pData->sIdent : OString();
}

void Menu::SetItemBits( sal_uInt16 nItemId, MenuItemBits nBits )
{
    MenuItemData* pData = pItemList->GetData( nItemId );
@@ -2132,13 +2121,20 @@ void Menu::ImplCallHighlight(sal_uInt16 nItem)
    ImplMenuDelData aDelData( this );

    nSelectedId = 0;
    sSelectedIdent.clear();
    MenuItemData* pData = pItemList->GetDataFromPos(nItem);
    if ( pData )
    if (pData)
    {
        nSelectedId = pData->nId;
        sSelectedIdent = pData->sIdent;
    }
    ImplCallEventListeners( VclEventId::MenuHighlight, GetItemPos( GetCurItemId() ) );

    if( !aDelData.isDeleted() )
    {
        nSelectedId = 0;
        sSelectedIdent.clear();
    }
}

IMPL_LINK_NOARG(Menu, ImplCallSelect, void*, void)
@@ -2620,6 +2616,7 @@ bool MenuBar::HandleMenuHighlightEvent( Menu *pMenu, sal_uInt16 nHighlightEventI
        {
            pMenu->mnHighlightedItemPos = pMenu->GetItemPos( nHighlightEventId );
            pMenu->nSelectedId = nHighlightEventId;
            pMenu->sSelectedIdent = pMenu->GetItemIdent( nHighlightEventId );
            pMenu->pStartedFrom = const_cast<MenuBar*>(this);
            pMenu->ImplCallHighlight( pMenu->mnHighlightedItemPos );
        }
@@ -2636,6 +2633,7 @@ bool Menu::HandleMenuCommandEvent( Menu *pMenu, sal_uInt16 nCommandEventId ) con
    if( pMenu )
    {
        pMenu->nSelectedId = nCommandEventId;
        pMenu->sSelectedIdent = pMenu->GetItemIdent(nCommandEventId);
        pMenu->pStartedFrom = const_cast<Menu*>(this);
        pMenu->ImplSelect();
        return true;
@@ -2762,6 +2760,7 @@ void PopupMenu::SelectItem(sal_uInt16 nId)
void PopupMenu::SetSelectedEntry( sal_uInt16 nId )
{
    nSelectedId = nId;
    sSelectedIdent = GetItemIdent(nId);
}

sal_uInt16 PopupMenu::Execute( vcl::Window* pExecWindow, const Point& rPopupPos )
@@ -2825,6 +2824,7 @@ sal_uInt16 PopupMenu::ImplExecute( const VclPtr<vcl::Window>& pW, const tools::R

    pStartedFrom = pSFrom;
    nSelectedId = 0;
    sSelectedIdent.clear();
    bCanceled = false;

    VclPtr<vcl::Window> xFocusId;
diff --git a/vcl/source/window/menufloatingwindow.cxx b/vcl/source/window/menufloatingwindow.cxx
index 8e72542..67d6d0c 100644
--- a/vcl/source/window/menufloatingwindow.cxx
+++ b/vcl/source/window/menufloatingwindow.cxx
@@ -508,8 +508,12 @@ void MenuFloatingWindow::EndExecute()
        if ( pItemData && !pItemData->bIsTemporary )
        {
            pM->nSelectedId = pItemData->nId;
            if ( pStart )
            pM->sSelectedIdent = pItemData->sIdent;
            if (pStart)
            {
                pStart->nSelectedId = pItemData->nId;
                pStart->sSelectedIdent = pItemData->sIdent;
            }

            pM->ImplSelect();
        }
@@ -749,7 +753,10 @@ void MenuFloatingWindow::ChangeHighlightItem( sal_uInt16 n, bool bStartPopupTime
        pMenu->ImplCallHighlight( nHighlightedItem );
    }
    else
    {
        pMenu->nSelectedId = 0;
        pMenu->sSelectedIdent.clear();
    }

    if ( bStartPopupTimer )
    {
diff --git a/vcl/source/window/menuitemlist.cxx b/vcl/source/window/menuitemlist.cxx
index 7be1f22..9c25bf4 100644
--- a/vcl/source/window/menuitemlist.cxx
+++ b/vcl/source/window/menuitemlist.cxx
@@ -163,17 +163,6 @@ MenuItemData* MenuItemList::GetData( sal_uInt16 nSVId, size_t& rPos ) const
    return nullptr;
}

MenuItemData* MenuItemList::GetDataFromSubMenu(sal_uInt16 nSVId) const
{
    for ( size_t i = 0, n = maItemList.size(); i < n; ++i )
    {
        if ( maItemList[i]->pSubMenu
            && maItemList[i]->pSubMenu->GetCurItemId() != 0 ) // if something is selected
            return maItemList[i].get()->pSubMenu->GetItemList()->GetDataFromPos(nSVId - 1);
    }
    return nullptr;
}

MenuItemData* MenuItemList::SearchItem(
    sal_Unicode cSelectChar,
    KeyCode aKeyCode,
diff --git a/vcl/source/window/menuitemlist.hxx b/vcl/source/window/menuitemlist.hxx
index 89d1953..276c078 100644
--- a/vcl/source/window/menuitemlist.hxx
+++ b/vcl/source/window/menuitemlist.hxx
@@ -122,7 +122,6 @@ public:
    void            Clear();

    MenuItemData*   GetData( sal_uInt16 nSVId, size_t& rPos ) const;
    MenuItemData*   GetDataFromSubMenu( sal_uInt16 nSVId ) const;
    MenuItemData*   GetData( sal_uInt16 nSVId ) const
                    {
                        size_t nTemp;