diff options
author | Douglas Mencken <dougmencken@gmail.com> | 2016-04-14 08:56:01 -0400 |
---|---|---|
committer | Douglas Mencken <dougmencken@gmail.com> | 2017-01-12 06:35:54 -0500 |
commit | 854c42adfc500b498c181dd8a7fd9d7148d448d5 (patch) | |
tree | 68654faf792e3d8c16984ce3990fb9d76d74eb4e | |
parent | 5f8641b11bd5384465cc15fde4a0686c7fb39953 (diff) |
playing with menus & separators
Change-Id: I20a51b2a173d81eb51310a04722c1b61dd49630b
-rw-r--r-- | framework/source/uielement/newmenucontroller.cxx | 8 | ||||
-rw-r--r-- | include/vcl/menu.hxx | 7 | ||||
-rw-r--r-- | vcl/inc/osx/salmenu.h | 3 | ||||
-rw-r--r-- | vcl/osx/salmenu.cxx | 84 | ||||
-rw-r--r-- | vcl/source/window/builder.cxx | 13 | ||||
-rw-r--r-- | vcl/source/window/menu.cxx | 20 | ||||
-rw-r--r-- | vcl/source/window/menubarwindow.cxx | 4 | ||||
-rw-r--r-- | vcl/source/window/menufloatingwindow.cxx | 2 | ||||
-rw-r--r-- | vcl/source/window/menuitemlist.cxx | 92 | ||||
-rw-r--r-- | vcl/source/window/menuitemlist.hxx | 10 |
10 files changed, 199 insertions, 44 deletions
diff --git a/framework/source/uielement/newmenucontroller.cxx b/framework/source/uielement/newmenucontroller.cxx index e8963fd76e88..142efef532e5 100644 --- a/framework/source/uielement/newmenucontroller.cxx +++ b/framework/source/uielement/newmenucontroller.cxx @@ -302,6 +302,8 @@ NewMenuController::~NewMenuController() // private function void NewMenuController::fillPopupMenu( Reference< css::awt::XPopupMenu >& rPopupMenu ) { + SAL_WARN( "framework", "fillPopupMenu()" ); + VCLXPopupMenu* pPopupMenu = static_cast<VCLXPopupMenu *>(VCLXMenu::GetImplementation( rPopupMenu )); PopupMenu* pVCLPopupMenu = nullptr; @@ -348,11 +350,17 @@ void NewMenuController::fillPopupMenu( Reference< css::awt::XPopupMenu >& rPopup continue; if ( aURL == "private:separator" ) + { + SAL_WARN( "framework", "separator" ); pVCLPopupMenu->InsertSeparator(); + } else { + SAL_WARN( "framework", "item ( aTitle \"" << aTitle << "\", aURL \"" << aURL << "\", nItemId " << OUString::number( nItemId ) << " )" ); + pVCLPopupMenu->InsertItem( nItemId, aTitle ); pVCLPopupMenu->SetItemCommand( nItemId, aURL ); + //pVCLPopupMenu->DoSomethingCool(); sal_uIntPtr nAttributePtr = MenuAttributes::CreateAttribute( aTargetFrame, aImageId ); pVCLPopupMenu->SetUserValue( nItemId, nAttributePtr, MenuAttributes::ReleaseAttribute ); diff --git a/include/vcl/menu.hxx b/include/vcl/menu.hxx index f2202d1f3f2d..8d746adeb1f6 100644 --- a/include/vcl/menu.hxx +++ b/include/vcl/menu.hxx @@ -211,7 +211,12 @@ protected: virtual void MenuBarKeyInput(const KeyEvent& rEvent); public: - SAL_DLLPRIVATE void ImplKillLayoutData() const; + OUString& GetText() + { + return aTitleText; + } + + SAL_DLLPRIVATE void ImplBinLayoutData() const; SAL_DLLPRIVATE vcl::Window* ImplGetWindow() const { return pWindow; } #if defined(MACOSX) diff --git a/vcl/inc/osx/salmenu.h b/vcl/inc/osx/salmenu.h index f21c750bcc01..3981cdbed0ba 100644 --- a/vcl/inc/osx/salmenu.h +++ b/vcl/inc/osx/salmenu.h @@ -84,6 +84,9 @@ public: static void addFallbackMenuItem( NSMenuItem* NewItem ); static void removeFallbackMenuItem( NSMenuItem* pOldItem ); + bool IsSeparatorAt( unsigned nPos ); + static bool IsItemSeparator( AquaSalMenuItem * pAquaSalMenuItem ); + const std::vector< MenuBarButtonEntry >& getButtons() const { return maButtons; } bool mbMenuBar; // true - Menubar, false - Menu diff --git a/vcl/osx/salmenu.cxx b/vcl/osx/salmenu.cxx index e5947a486dbe..712ff12daa64 100644 --- a/vcl/osx/salmenu.cxx +++ b/vcl/osx/salmenu.cxx @@ -512,9 +512,36 @@ void AquaSalMenu::SetFrame( const SalFrame *pFrame ) mpFrame = static_cast<const AquaSalFrame*>(pFrame); } +bool AquaSalMenu::IsItemSeparator( AquaSalMenuItem * pAquaSalMenuItem ) +{ + if ( ! pAquaSalMenuItem ) + return false; + + return ( [ pAquaSalMenuItem->mpMenuItem isSeparatorItem ] ? true : false ); +} + +bool AquaSalMenu::IsSeparatorAt( unsigned nPos ) +{ + if( nPos < maItems.size() ) + return IsItemSeparator( maItems[ nPos ] ); + + return false; +} + void AquaSalMenu::InsertItem( SalMenuItem* pSalMenuItem, unsigned nPos ) { - AquaSalMenuItem *pAquaSalMenuItem = static_cast<AquaSalMenuItem*>(pSalMenuItem); + AquaSalMenuItem *pAquaSalMenuItem = static_cast< AquaSalMenuItem * >( pSalMenuItem ); + NSMenuItem* nsMenuItem = pAquaSalMenuItem->mpMenuItem; + bool isSeparator = IsItemSeparator( pAquaSalMenuItem ); + +#if OSL_DEBUG_LEVEL > 0 + if ( isSeparator ) { + SAL_WARN( "vcl.osx", "AquaSalMenu::InsertItem separator at position " << nPos ); + } else { + const char* theTitle = [ [ nsMenuItem title ] UTF8String ]; + SAL_WARN( "vcl.osx", "AquaSalMenu::InsertItem with label \"" << theTitle << "\" at position " << nPos ); + } +#endif pAquaSalMenuItem->mpParentMenu = this; DBG_ASSERT( pAquaSalMenuItem->mpVCLMenu == nullptr || @@ -524,24 +551,37 @@ void AquaSalMenu::InsertItem( SalMenuItem* pSalMenuItem, unsigned nPos ) if( pAquaSalMenuItem->mpVCLMenu ) mpVCLMenu = pAquaSalMenuItem->mpVCLMenu; - if( nPos == MENU_APPEND || nPos == maItems.size() ) - maItems.push_back( pAquaSalMenuItem ); - else if( nPos < maItems.size() ) - maItems.insert( maItems.begin() + nPos, pAquaSalMenuItem ); - else + bool bInsert = true; + if ( isSeparator ) { - OSL_FAIL( "invalid item index in insert" ); - return; + bInsert = ( nPos > 0 ) ? + ( !IsSeparatorAt( nPos ) && !IsSeparatorAt( nPos - 1 ) ) : + !IsSeparatorAt( nPos ) ; + if ( !bInsert ) + SAL_WARN( "vcl.osx", "yet another separator here is redundant" ); } - if( ! mbMenuBar || pCurrentMenuBar == this ) - [mpMenu insertItem: pAquaSalMenuItem->mpMenuItem atIndex: getItemIndexByPos(nPos)]; + if ( bInsert ) + { + if( nPos == MENU_APPEND || nPos == maItems.size() ) + maItems.push_back( pAquaSalMenuItem ); + else if( nPos < maItems.size() ) + maItems.insert( maItems.begin() + nPos, pAquaSalMenuItem ); + else + { + SAL_WARN( "vcl.osx", "position of item is somewhere out @ AquaSalMenu::InsertItem" ); + return; + } + + if( ! mbMenuBar || pCurrentMenuBar == this ) + [ mpMenu insertItem: nsMenuItem atIndex: getItemIndexByPos( nPos ) ]; + } } void AquaSalMenu::RemoveItem( unsigned nPos ) { AquaSalMenuItem* pRemoveItem = nullptr; - if( nPos == MENU_APPEND || nPos == (maItems.size()-1) ) + if( nPos == MENU_APPEND || nPos == ( maItems.size() - 1 ) ) { pRemoveItem = maItems.back(); maItems.pop_back(); @@ -549,18 +589,18 @@ void AquaSalMenu::RemoveItem( unsigned nPos ) else if( nPos < maItems.size() ) { pRemoveItem = maItems[ nPos ]; - maItems.erase( maItems.begin()+nPos ); + maItems.erase( maItems.begin() + nPos ); } else { - OSL_FAIL( "invalid item index in remove" ); + SAL_WARN( "vcl.osx", "RemoveItem: item is somewhere out" ); return; } pRemoveItem->mpParentMenu = nullptr; if( ! mbMenuBar || pCurrentMenuBar == this ) - [mpMenu removeItemAtIndex: getItemIndexByPos(nPos)]; + [ mpMenu removeItemAtIndex: getItemIndexByPos( nPos ) ]; } void AquaSalMenu::SetSubMenu( SalMenuItem* pSalMenuItem, SalMenu* pSubMenu, unsigned /*nPos*/ ) @@ -801,7 +841,7 @@ void AquaSalMenu::statusLayout() if( [pNSView isMemberOfClass: [OOStatusItemView class]] ) // well of course it is [(OOStatusItemView*)pNSView layout]; else - OSL_FAIL( "someone stole our status view" ); + SAL_WARN( "vcl.osx", "¿where is my status view?" ); } } @@ -908,6 +948,8 @@ AquaSalMenuItem::AquaSalMenuItem( const SalItemParams* pItemData ) : // these can go occasionally go in and out of a menu, ensure their lifecycle // also for the release in AquaSalMenuItem destructor [mpMenuItem retain]; + + SAL_WARN( "vcl.osx", "created AquaSalMenuItem separator" ); } else { @@ -921,8 +963,16 @@ AquaSalMenuItem::AquaSalMenuItem( const SalItemParams* pItemData ) : [mpMenuItem setTitle: pString]; [pString release]; } - // anything but a separator should set a menu to dispatch to - SAL_WARN_IF( !mpVCLMenu, "vcl", "no menu" ); + +#if OSL_DEBUG_LEVEL > 0 + const char* item = [ [ mpMenuItem title ] UTF8String ]; + if ( mpVCLMenu ) { + SAL_WARN( "vcl.osx", "created AquaSalMenuItem \"" << item << "\" of menu \"" << mpVCLMenu->GetText() << "\"" ); + } else { + // anything but a separator needs a menu to dispatch to + SAL_WARN( "vcl.osx", "created AquaSalMenuItem \"" << item << "\" of *no menu*" ); + } +#endif } } diff --git a/vcl/source/window/builder.cxx b/vcl/source/window/builder.cxx index 9e3057ff8ea6..b37dc7f13862 100644 --- a/vcl/source/window/builder.cxx +++ b/vcl/source/window/builder.cxx @@ -2477,6 +2477,8 @@ std::vector<OString> VclBuilder::handleItems(xmlreader::XmlReader &reader, const void VclBuilder::handleMenu(xmlreader::XmlReader &reader, const OString &rID) { + SAL_WARN( "vcl.window", "handleMenu" ); + VclPtr<PopupMenu> pCurrentMenu = VclPtr<PopupMenu>::Create(); int nLevel = 1; @@ -2522,6 +2524,8 @@ void VclBuilder::handleMenu(xmlreader::XmlReader &reader, const OString &rID) void VclBuilder::handleMenuChild(PopupMenu *pParent, xmlreader::XmlReader &reader) { + SAL_WARN( "vcl.window", "handleMenuChild" ); + xmlreader::Span name; int nsId; @@ -2719,14 +2723,17 @@ void VclBuilder::insertMenuObject(PopupMenu *pParent, const OString &rClass, con if (rClass == "GtkMenuItem") { OUString sLabel(OStringToOUString(convertMnemonicMarkup(extractLabel(rProps)), RTL_TEXTENCODING_UTF8)); + SAL_WARN( "vcl.window", "going to InsertItem with position " << nNewId << " & label \"" << sLabel << "\" & id \"" << rID << "\" @ insertMenuObject" ); pParent->InsertItem(nNewId, sLabel, MenuItemBits::TEXT, rID); } else if (rClass == "GtkSeparatorMenuItem") { + SAL_WARN( "vcl.window", "going to InsertSeparator with id \"" << rID << "\" @ insertMenuObject" ); pParent->InsertSeparator(rID); } + SAL_WARN( "vcl.window", "done insert @ insertMenuObject" ); - SAL_WARN_IF(nOldCount == pParent->GetItemCount(), "vcl.layout", "probably need to implement " << rClass.getStr()); + SAL_WARN_IF(nOldCount == pParent->GetItemCount(), "vcl", "probably need to implement " << rClass.getStr()); if (nOldCount != pParent->GetItemCount()) { @@ -2746,7 +2753,7 @@ void VclBuilder::insertMenuObject(PopupMenu *pParent, const OString &rClass, con else if (rKey == "has-default" && toBool(rValue)) pParent->SetSelectedEntry(nNewId); else - SAL_INFO("vcl.layout", "unhandled property: " << rKey.getStr()); + SAL_INFO( "vcl", "unhandled property \"" << rKey.getStr() << "\"" ); } for (stringmap::iterator aI = rAccels.begin(), aEnd = rAccels.end(); aI != aEnd; ++aI) @@ -2757,7 +2764,7 @@ void VclBuilder::insertMenuObject(PopupMenu *pParent, const OString &rClass, con if (rSignal == "activate") pParent->SetAccelKey(nNewId, makeKeyCode(rValue)); else - SAL_INFO("vcl.layout", "unhandled accelerator for: " << rSignal.getStr()); + SAL_INFO( "vcl", "unhandled accelerator for \"" << rSignal.getStr() << "\"" ); } } diff --git a/vcl/source/window/menu.cxx b/vcl/source/window/menu.cxx index 00b931e32ba9..597dc3ccbaaf 100644 --- a/vcl/source/window/menu.cxx +++ b/vcl/source/window/menu.cxx @@ -242,7 +242,7 @@ void Menu::Deactivate() if ( ImplGetSalMenu() ) ImplGetSalMenu()->RemoveItem( n ); - pItemList->Remove( n ); + pItemList->RemoveMenuItem( n ); } } @@ -371,8 +371,8 @@ MenuItemData* Menu::NbcInsertItem(sal_uInt16 nId, MenuItemBits nBits, size_t nPos, const OString &rIdent) { // put Item in MenuItemList - MenuItemData* pData = pItemList->Insert(nId, MenuItemType::STRING, - nBits, rStr, Image(), pMenu, nPos, rIdent); + MenuItemData* pData = pItemList->InsertMenuItem( nId, MenuItemType::STRING, + nBits, rStr, Image(), pMenu, nPos, rIdent ); // update native menu if (ImplGetSalMenu() && pData->pSalMenuItem) @@ -526,6 +526,8 @@ void Menu::InsertItem(const OUString& rCommand, const css::uno::Reference<css::f void Menu::InsertSeparator(const OString &rIdent, sal_uInt16 nPos) { + SAL_WARN( "vcl", "Menu::InsertSeparator with ident \"" << rIdent << "\" & position " << nPos ); + // do nothing if it's a menu bar if (IsMenuBar()) return; @@ -535,13 +537,13 @@ void Menu::InsertSeparator(const OString &rIdent, sal_uInt16 nPos) nPos = MENU_APPEND; // put separator in item list - pItemList->InsertSeparator(rIdent, nPos); + MenuItemData *pData = pItemList->InsertSeparator( rIdent, nPos ); // update native menu - size_t itemPos = ( nPos != MENU_APPEND ) ? nPos : pItemList->size() - 1; - MenuItemData *pData = pItemList->GetDataFromPos( itemPos ); if( ImplGetSalMenu() && pData && pData->pSalMenuItem ) + { ImplGetSalMenu()->InsertItem( pData->pSalMenuItem, nPos ); + } delete mpLayoutData; mpLayoutData = nullptr; @@ -559,7 +561,7 @@ void Menu::RemoveItem( sal_uInt16 nPos ) if( ImplGetSalMenu() ) ImplGetSalMenu()->RemoveItem( nPos ); - pItemList->Remove( nPos ); + pItemList->RemoveMenuItem( nPos ); bRemove = true; } @@ -1404,7 +1406,7 @@ bool Menu::ImplGetNativeSubmenuArrowSize(vcl::RenderContext& rRenderContext, Siz void Menu::ImplAddDel( ImplMenuDelData& rDel ) { - SAL_WARN_IF( rDel.mpMenu, "vcl", "Menu::ImplAddDel(): cannot add ImplMenuDelData twice !" ); + SAL_WARN_IF( rDel.mpMenu, "vcl", "Menu::ImplAddDel(): cannot add ImplMenuDelData twice" ); if( !rDel.mpMenu ) { rDel.mpMenu = this; @@ -2245,7 +2247,7 @@ void Menu::MenuBarKeyInput(const KeyEvent&) { } -void Menu::ImplKillLayoutData() const +void Menu::ImplBinLayoutData() const { delete mpLayoutData; mpLayoutData = nullptr; diff --git a/vcl/source/window/menubarwindow.cxx b/vcl/source/window/menubarwindow.cxx index f92290104608..a70205dfffe0 100644 --- a/vcl/source/window/menubarwindow.cxx +++ b/vcl/source/window/menubarwindow.cxx @@ -984,7 +984,7 @@ void MenuBarWindow::StateChanged( StateChangedType nType ) } else if(pMenu) { - pMenu->ImplKillLayoutData(); + pMenu->ImplBinLayoutData(); } } @@ -1010,7 +1010,7 @@ void MenuBarWindow::LayoutChanged() Invalidate(); Resize(); - pMenu->ImplKillLayoutData(); + pMenu->ImplBinLayoutData(); } void MenuBarWindow::ApplySettings(vcl::RenderContext& rRenderContext) diff --git a/vcl/source/window/menufloatingwindow.cxx b/vcl/source/window/menufloatingwindow.cxx index 79586c00c9cc..5b8493b9f633 100644 --- a/vcl/source/window/menufloatingwindow.cxx +++ b/vcl/source/window/menufloatingwindow.cxx @@ -599,7 +599,7 @@ void MenuFloatingWindow::ImplScroll( bool bUp ) Invalidate(); - pMenu->ImplKillLayoutData(); + pMenu->ImplBinLayoutData(); if ( bScrollUp && bUp ) { diff --git a/vcl/source/window/menuitemlist.cxx b/vcl/source/window/menuitemlist.cxx index 44757a4778ba..27eb2eb6eb15 100644 --- a/vcl/source/window/menuitemlist.cxx +++ b/vcl/source/window/menuitemlist.cxx @@ -50,7 +50,7 @@ MenuItemList::~MenuItemList() delete i; } -MenuItemData* MenuItemList::Insert( +MenuItemData* MenuItemList::InsertMenuItem( sal_uInt16 nId, MenuItemType eType, MenuItemBits nBits, @@ -61,6 +61,12 @@ MenuItemData* MenuItemList::Insert( const OString &rIdent ) { + SAL_WARN( "vcl", "MenuItemList::InsertMenuItem with ident \"" << rIdent << "\" & id " << nId + << " & text \"" << rStr << "\" & position " << nPos ); + + if ( eType == MenuItemType::SEPARATOR ) + return InsertSeparator( rIdent, nPos ); + MenuItemData* pData = new MenuItemData( rStr, rImage ); pData->nId = nId; pData->sIdent = rIdent; @@ -90,11 +96,14 @@ MenuItemData* MenuItemList::Insert( } else { maItemList.push_back( pData ); } + return pData; } -void MenuItemList::InsertSeparator(const OString &rIdent, size_t nPos) +MenuItemData* MenuItemList::InsertSeparator( const OString &rIdent, size_t nPos ) { + SAL_WARN( "vcl", "MenuItemList::InsertSeparator with ident \"" << rIdent << "\" & position " << nPos ); + MenuItemData* pData = new MenuItemData; pData->nId = 0; pData->sIdent = rIdent; @@ -116,23 +125,94 @@ void MenuItemList::InsertSeparator(const OString &rIdent, size_t nPos) aSalMIData.aText.clear(); aSalMIData.aImage = Image(); - // Native-support: returns NULL if not supported + // create native item returns nil if it is not supported pData->pSalMenuItem = ImplGetSVData()->mpDefInst->CreateMenuItem( &aSalMIData ); if( nPos < maItemList.size() ) { - maItemList.insert( maItemList.begin() + nPos, pData ); + if ( maItemList[ nPos ] && maItemList[ nPos ]->eType != MenuItemType::SEPARATOR ) + { + if ( nPos > 0 && maItemList[ nPos - 1 ] && maItemList[ nPos - 1 ]->eType != MenuItemType::SEPARATOR ) + { + maItemList.insert( maItemList.begin() + nPos, pData ); + } + else { SAL_WARN( "vcl", "separator is just above" ); } + } + else { SAL_WARN( "vcl", "separator is already here" ); } } else { - maItemList.push_back( pData ); + if ( maItemList.back() && maItemList.back()->eType != MenuItemType::SEPARATOR ) + { + maItemList.push_back( pData ); + } } + + return pData; } -void MenuItemList::Remove( size_t nPos ) +void MenuItemList::RemoveMenuItem( size_t nPos ) { if( nPos < maItemList.size() ) { delete maItemList[ nPos ]; maItemList.erase( maItemList.begin() + nPos ); } + + PeelSeparators(); +} + +// bin double separators and boundary ones +bool MenuItemList::PeelSeparators( bool bLastOneToo ) +{ + SAL_WARN( "vcl", "MenuItemList::PeelSeparators" ); + + bool bRet = false; + + for ( size_t i = 1; i < maItemList.size(); ++i ) + { + if ( ( maItemList[ i ] && maItemList[ i ]->eType == MenuItemType::SEPARATOR ) + && ( maItemList[ i - 1 ] && maItemList[ i - 1 ]->eType == MenuItemType::SEPARATOR ) ) { + SAL_WARN( "vcl.window", "double separators @" << OUString::number( i ) << " & @" << OUString::number( i - 1 ) ); + delete maItemList[ i ]; + maItemList.erase( maItemList.begin() + i ); + i--; + bRet = true; + } + } + + while ( maItemList.size() > 0 ) + { + if ( maItemList[ 0 ] && maItemList[ 0 ]->eType == MenuItemType::SEPARATOR ) + { + SAL_WARN( "vcl.window", "first item @" << OUString::number( 0 ) + << " \"" << maItemList[ 0 ]->aText + << "\" id " << OUString::number( maItemList[ 0 ]->nId ) + << " is separator" ); + delete maItemList[ 0 ]; + maItemList.erase( maItemList.begin() ); + bRet = true; + } + else { break; } + } + + if ( bLastOneToo ) + { + while ( maItemList.size() > 0 ) + { + if ( maItemList[ maItemList.size() - 1 ]->eType == MenuItemType::SEPARATOR ) + { + size_t n = maItemList.size() - 1; + SAL_WARN( "vcl.window", "last item @" << OUString::number( n ) + << " \"" << maItemList[ n ]->aText + << "\" id " << OUString::number( maItemList[ n ]->nId ) + << " is separator" ); + delete maItemList[ n ]; + maItemList.erase( maItemList.end() ); + bRet = true; + } + else { break; } + } + } + + return bRet; } MenuItemData* MenuItemList::GetData( sal_uInt16 nSVId, size_t& rPos ) const diff --git a/vcl/source/window/menuitemlist.hxx b/vcl/source/window/menuitemlist.hxx index 89befc106e28..a2eedb9d7c99 100644 --- a/vcl/source/window/menuitemlist.hxx +++ b/vcl/source/window/menuitemlist.hxx @@ -97,14 +97,13 @@ struct MenuItemData class MenuItemList { private: - typedef ::std::vector< MenuItemData* > MenuItemDataList_impl; - MenuItemDataList_impl maItemList; + ::std::vector< MenuItemData* > maItemList; public: MenuItemList() {} ~MenuItemList(); - MenuItemData* Insert( + MenuItemData* InsertMenuItem( sal_uInt16 nId, MenuItemType eType, MenuItemBits nBits, @@ -114,8 +113,9 @@ public: size_t nPos, const OString &rIdent ); - void InsertSeparator(const OString &rIdent, size_t nPos); - void Remove( size_t nPos ); + MenuItemData* InsertSeparator(const OString &rIdent, size_t nPos); + void RemoveMenuItem( size_t nPos ); + bool PeelSeparators( bool bLastOneToo = false ); MenuItemData* GetData( sal_uInt16 nSVId, size_t& rPos ) const; MenuItemData* GetData( sal_uInt16 nSVId ) const |