diff options
author | Joseph Powers <jpowers27@cox.net> | 2011-08-02 22:02:19 -0700 |
---|---|---|
committer | Joseph Powers <jpowers27@cox.net> | 2011-08-02 22:02:19 -0700 |
commit | 6692d36f1a822661c6135965e28e2eff96408cd3 (patch) | |
tree | 867b1e3b3277d2f48e2bc36eea98116b92962520 /vcl | |
parent | 809b8bbf8ab62956674bb0d01e6d1ae98ce5da58 (diff) |
Modify MenuItemList so it uses std::vector<> instead of List
I also removed GetCharClass() since it wasn't used and it was in the
unusedcode.easy list.
I don't see any changes in the menus (Mac OS X).
Diffstat (limited to 'vcl')
-rw-r--r-- | vcl/source/window/menu.cxx | 186 |
1 files changed, 112 insertions, 74 deletions
diff --git a/vcl/source/window/menu.cxx b/vcl/source/window/menu.cxx index 0b3ea6024698..40e0758b2949 100644 --- a/vcl/source/window/menu.cxx +++ b/vcl/source/window/menu.cxx @@ -76,6 +76,7 @@ #include "vcl/lazydelete.hxx" #include <map> +#include <vector> namespace vcl { @@ -174,51 +175,74 @@ MenuItemData::~MenuItemData() ImplGetSVData()->mpDefInst->DestroyMenuItem( pSalMenuItem ); } -class MenuItemList : public List +class MenuItemList { private: - uno::Reference< i18n::XCharacterClassification > xCharClass; + typedef ::std::vector< MenuItemData* > MenuItemDataList_impl; + MenuItemDataList_impl maItemList; + uno::Reference< i18n::XCharacterClassification > xCharClass; public: - MenuItemList() : List( 16, 4 ) {} + MenuItemList() {} ~MenuItemList(); - MenuItemData* Insert( sal_uInt16 nId, MenuItemType eType, MenuItemBits nBits, - const XubString& rStr, const Image& rImage, - Menu* pMenu, sal_uInt16 nPos ); - void InsertSeparator( sal_uInt16 nPos ); - void Remove( sal_uInt16 nPos ); + MenuItemData* Insert( + sal_uInt16 nId, + MenuItemType eType, + MenuItemBits nBits, + const XubString& rStr, + const Image& rImage, + Menu* pMenu, + size_t nPos + ); + void InsertSeparator( size_t nPos ); + void Remove( size_t nPos ); MenuItemData* GetData( sal_uInt16 nSVId, sal_uInt16& rPos ) const; MenuItemData* GetData( sal_uInt16 nSVId ) const - { sal_uInt16 nTemp; return GetData( nSVId, nTemp ); } - MenuItemData* GetDataFromPos( sal_uLong nPos ) const - { return (MenuItemData*)List::GetObject( nPos ); } - - MenuItemData* SearchItem( xub_Unicode cSelectChar, KeyCode aKeyCode, sal_uInt16& rPos, sal_uInt16& nDuplicates, sal_uInt16 nCurrentPos ) const; - sal_uInt16 GetItemCount( xub_Unicode cSelectChar ) const; - sal_uInt16 GetItemCount( KeyCode aKeyCode ) const; + { + sal_uInt16 nTemp; + return GetData( nSVId, nTemp ); + } + MenuItemData* GetDataFromPos( size_t nPos ) const + { + return ( nPos < maItemList.size() ) ? maItemList[ nPos ] : NULL; + } - uno::Reference< i18n::XCharacterClassification > GetCharClass() const; + MenuItemData* SearchItem( + xub_Unicode cSelectChar, + KeyCode aKeyCode, + sal_uInt16& rPos, + sal_uInt16& nDuplicates, + sal_uInt16 nCurrentPos + ) const; + size_t GetItemCount( xub_Unicode cSelectChar ) const; + size_t GetItemCount( KeyCode aKeyCode ) const; + size_t Count() + { + return maItemList.size(); + } }; MenuItemList::~MenuItemList() { - for ( sal_uLong n = Count(); n; ) - { - MenuItemData* pData = GetDataFromPos( --n ); - delete pData; - } + for( size_t i = 0, n = maItemList.size(); i < n; ++i ) + delete maItemList[ i ]; } -MenuItemData* MenuItemList::Insert( sal_uInt16 nId, MenuItemType eType, - MenuItemBits nBits, - const XubString& rStr, const Image& rImage, - Menu* pMenu, sal_uInt16 nPos ) +MenuItemData* MenuItemList::Insert( + sal_uInt16 nId, + MenuItemType eType, + MenuItemBits nBits, + const XubString& rStr, + const Image& rImage, + Menu* pMenu, + size_t nPos +) { MenuItemData* pData = new MenuItemData( rStr, rImage ); pData->nId = nId; @@ -245,11 +269,15 @@ MenuItemData* MenuItemList::Insert( sal_uInt16 nId, MenuItemType eType, // Native-support: returns NULL if not supported pData->pSalMenuItem = ImplGetSVData()->mpDefInst->CreateMenuItem( &aSalMIData ); - List::Insert( (void*)pData, nPos ); + if( nPos < maItemList.size() ) { + maItemList.insert( maItemList.begin() + nPos, pData ); + } else { + maItemList.push_back( pData ); + } return pData; } -void MenuItemList::InsertSeparator( sal_uInt16 nPos ) +void MenuItemList::InsertSeparator( size_t nPos ) { MenuItemData* pData = new MenuItemData; pData->nId = 0; @@ -276,37 +304,46 @@ void MenuItemList::InsertSeparator( sal_uInt16 nPos ) // Native-support: returns NULL if not supported pData->pSalMenuItem = ImplGetSVData()->mpDefInst->CreateMenuItem( &aSalMIData ); - List::Insert( (void*)pData, nPos ); + if( nPos < maItemList.size() ) { + maItemList.insert( maItemList.begin() + nPos, pData ); + } else { + maItemList.push_back( pData ); + } } -void MenuItemList::Remove( sal_uInt16 nPos ) +void MenuItemList::Remove( size_t nPos ) { - MenuItemData* pData = (MenuItemData*)List::Remove( (sal_uLong)nPos ); - if ( pData ) - delete pData; + if( nPos < maItemList.size() ) + { + delete maItemList[ nPos ]; + maItemList.erase( maItemList.begin() + nPos ); + } } MenuItemData* MenuItemList::GetData( sal_uInt16 nSVId, sal_uInt16& rPos ) const { - rPos = 0; - MenuItemData* pData = (MenuItemData*)GetObject( rPos ); - while ( pData ) + for( size_t i = 0, n = maItemList.size(); i < n; ++i ) { - if ( pData->nId == nSVId ) - return pData; - - rPos++; - pData = (MenuItemData*)GetObject( rPos ); + if ( maItemList[ i ]->nId == nSVId ) + { + rPos = i; + return maItemList[ i ]; + } } - return NULL; } -MenuItemData* MenuItemList::SearchItem( xub_Unicode cSelectChar, KeyCode aKeyCode, sal_uInt16& rPos, sal_uInt16& nDuplicates, sal_uInt16 nCurrentPos ) const +MenuItemData* MenuItemList::SearchItem( + xub_Unicode cSelectChar, + KeyCode aKeyCode, + sal_uInt16& rPos, + sal_uInt16& nDuplicates, + sal_uInt16 nCurrentPos +) const { const vcl::I18nHelper& rI18nHelper = Application::GetSettings().GetUILocaleI18nHelper(); - sal_uInt16 nListCount = (sal_uInt16)Count(); + size_t nListCount = maItemList.size();; // try character code first nDuplicates = GetItemCount( cSelectChar ); // return number of duplicates @@ -314,7 +351,7 @@ MenuItemData* MenuItemList::SearchItem( xub_Unicode cSelectChar, KeyCode aKeyCod { for ( rPos = 0; rPos < nListCount; rPos++) { - MenuItemData* pData = GetDataFromPos( rPos ); + MenuItemData* pData = maItemList[ rPos ]; if ( pData->bEnabled && rI18nHelper.MatchMnemonic( pData->aText, cSelectChar ) ) { if( nDuplicates > 1 && rPos == nCurrentPos ) @@ -336,7 +373,7 @@ MenuItemData* MenuItemList::SearchItem( xub_Unicode cSelectChar, KeyCode aKeyCod for ( rPos = 0; rPos < nListCount; rPos++) { - MenuItemData* pData = GetDataFromPos( rPos ); + MenuItemData* pData = maItemList[ rPos ]; if ( pData->bEnabled ) { sal_uInt16 n = pData->aText.Search( '~' ); @@ -345,10 +382,14 @@ MenuItemData* MenuItemList::SearchItem( xub_Unicode cSelectChar, KeyCode aKeyCod KeyCode mnKeyCode; xub_Unicode mnUnicode = pData->aText.GetChar(n+1); Window* pDefWindow = ImplGetDefaultWindow(); - if( (pDefWindow && pDefWindow->ImplGetFrame()->MapUnicodeToKeyCode( mnUnicode, Application::GetSettings().GetUILanguage(), mnKeyCode ) - && aKeyCode.GetCode() == mnKeyCode.GetCode()) - || (ascii && rI18nHelper.MatchMnemonic( pData->aText, ascii ) ) ) - + if( ( pDefWindow + && pDefWindow->ImplGetFrame()->MapUnicodeToKeyCode( mnUnicode, Application::GetSettings().GetUILanguage(), mnKeyCode ) + && aKeyCode.GetCode() == mnKeyCode.GetCode() + ) + || ( ascii + && rI18nHelper.MatchMnemonic( pData->aText, ascii ) + ) + ) { if( nDuplicates > 1 && rPos == nCurrentPos ) continue; // select next entry with the same mnemonic @@ -363,15 +404,15 @@ MenuItemData* MenuItemList::SearchItem( xub_Unicode cSelectChar, KeyCode aKeyCod return NULL; } -sal_uInt16 MenuItemList::GetItemCount( xub_Unicode cSelectChar ) const +size_t MenuItemList::GetItemCount( xub_Unicode cSelectChar ) const { // returns number of entries with same mnemonic const vcl::I18nHelper& rI18nHelper = Application::GetSettings().GetUILocaleI18nHelper(); - sal_uInt16 nItems = 0, nPos; - for ( nPos = (sal_uInt16)Count(); nPos; ) + size_t nItems = 0; + for ( size_t nPos = maItemList.size(); nPos; ) { - MenuItemData* pData = GetDataFromPos( --nPos ); + MenuItemData* pData = maItemList[ --nPos ]; if ( pData->bEnabled && rI18nHelper.MatchMnemonic( pData->aText, cSelectChar ) ) nItems++; } @@ -379,7 +420,7 @@ sal_uInt16 MenuItemList::GetItemCount( xub_Unicode cSelectChar ) const return nItems; } -sal_uInt16 MenuItemList::GetItemCount( KeyCode aKeyCode ) const +size_t MenuItemList::GetItemCount( KeyCode aKeyCode ) const { // returns number of entries with same mnemonic // uses key codes instead of character codes @@ -388,10 +429,10 @@ sal_uInt16 MenuItemList::GetItemCount( KeyCode aKeyCode ) const if( aKeyCode.GetCode() >= KEY_A && aKeyCode.GetCode() <= KEY_Z ) ascii = sal::static_int_cast<char>('A' + (aKeyCode.GetCode() - KEY_A)); - sal_uInt16 nItems = 0, nPos; - for ( nPos = (sal_uInt16)Count(); nPos; ) + size_t nItems = 0; + for ( size_t nPos = maItemList.size(); nPos; ) { - MenuItemData* pData = GetDataFromPos( --nPos ); + MenuItemData* pData = maItemList[ --nPos ]; if ( pData->bEnabled ) { sal_uInt16 n = pData->aText.Search( '~' ); @@ -401,9 +442,14 @@ sal_uInt16 MenuItemList::GetItemCount( KeyCode aKeyCode ) const // if MapUnicodeToKeyCode fails or is unsupported we try the pure ascii mapping of the keycodes // so we have working shortcuts when ascii mnemonics are used Window* pDefWindow = ImplGetDefaultWindow(); - if( (pDefWindow && pDefWindow->ImplGetFrame()->MapUnicodeToKeyCode( pData->aText.GetChar(n+1), Application::GetSettings().GetUILanguage(), mnKeyCode ) - && aKeyCode.GetCode() == mnKeyCode.GetCode()) - || ( ascii && rI18nHelper.MatchMnemonic( pData->aText, ascii ) ) ) + if( ( pDefWindow + && pDefWindow->ImplGetFrame()->MapUnicodeToKeyCode( pData->aText.GetChar(n+1), Application::GetSettings().GetUILanguage(), mnKeyCode ) + && aKeyCode.GetCode() == mnKeyCode.GetCode() + ) + || ( ascii + && rI18nHelper.MatchMnemonic( pData->aText, ascii ) + ) + ) nItems++; } } @@ -412,14 +458,6 @@ sal_uInt16 MenuItemList::GetItemCount( KeyCode aKeyCode ) const return nItems; } -uno::Reference< i18n::XCharacterClassification > MenuItemList::GetCharClass() const -{ - if ( !xCharClass.is() ) - ((MenuItemList*)this)->xCharClass = vcl::unohelper::CreateCharacterClassification(); - return xCharClass; -} - - // ---------------------- // - MenuFloatingWindow - @@ -988,7 +1026,7 @@ void Menu::ImplLoadRes( const ResId& rResId ) void Menu::CreateAutoMnemonics() { MnemonicGenerator aMnemonicGenerator; - sal_uLong n; + size_t n; for ( n = 0; n < pItemList->Count(); n++ ) { MenuItemData* pData = pItemList->GetDataFromPos(n); @@ -1033,7 +1071,7 @@ void Menu::Activate() void Menu::Deactivate() { - for ( sal_uInt16 n = (sal_uInt16)pItemList->Count(); n; ) + for ( size_t n = pItemList->Count(); n; ) { MenuItemData* pData = pItemList->GetDataFromPos( --n ); if ( pData->bIsTemporary ) @@ -1352,7 +1390,7 @@ void Menu::InsertSeparator( sal_uInt16 nPos ) pItemList->InsertSeparator( nPos ); // update native menu - sal_uInt16 itemPos = nPos != MENU_APPEND ? nPos : (sal_uInt16)pItemList->Count() - 1; + size_t itemPos = nPos != MENU_APPEND ? nPos : pItemList->Count() - 1; MenuItemData *pData = pItemList->GetDataFromPos( itemPos ); if( ImplGetSalMenu() && pData && pData->pSalMenuItem ) ImplGetSalMenu()->InsertItem( pData->pSalMenuItem, nPos ); @@ -3632,10 +3670,10 @@ void PopupMenu::SelectEntry( sal_uInt16 nId ) { MenuFloatingWindow* pFloat = ImplGetFloatingWindow(); pFloat->GrabFocus(); - sal_uInt16 nPos; - for( nPos = 0; nPos < GetItemList()->Count(); nPos++ ) + + for( size_t nPos = 0; nPos < GetItemList()->Count(); nPos++ ) { - MenuItemData* pData = (MenuItemData*)GetItemList()->GetObject( nPos ); + MenuItemData* pData = GetItemList()->GetDataFromPos( nPos ); if( pData->pSubMenu ) { pFloat->KillActivePopup(); |