diff options
-rw-r--r-- | cui/source/dialogs/cuicharmap.cxx | 93 | ||||
-rw-r--r-- | include/cui/cuicharmap.hxx | 17 | ||||
-rw-r--r-- | sfx2/source/control/charmapcontrol.cxx | 13 |
3 files changed, 85 insertions, 38 deletions
diff --git a/cui/source/dialogs/cuicharmap.cxx b/cui/source/dialogs/cuicharmap.cxx index 83931f69e9e2..c8bf07cc5794 100644 --- a/cui/source/dialogs/cuicharmap.cxx +++ b/cui/source/dialogs/cuicharmap.cxx @@ -186,7 +186,7 @@ short SvxCharacterMap::run() if( SvxShowCharSet::getSelectedChar() == ' ') { m_xOKBtn->set_sensitive(false); - setFavButtonState(OUString(), OUString()); + setFavButtonState(u"", u""); } else { @@ -235,6 +235,11 @@ void SvxCharacterMap::getRecentCharacterList() { maRecentCharFontList.push_back(s); } + + // tdf#135997: make sure that the two lists are same length + const auto nCommonLength = std::min(maRecentCharList.size(), maRecentCharFontList.size()); + maRecentCharList.resize(nCommonLength); + maRecentCharFontList.resize(nCommonLength); } @@ -255,11 +260,46 @@ void SvxCharacterMap::getFavCharacterList() { maFavCharFontList.push_back(s); } + + // tdf#135997: make sure that the two lists are same length + const auto nCommonLength = std::min(maFavCharList.size(), maFavCharFontList.size()); + maFavCharList.resize(nCommonLength); + maFavCharFontList.resize(nCommonLength); +} + +static std::pair<std::deque<OUString>::const_iterator, std::deque<OUString>::const_iterator> +findInPair(std::u16string_view str1, const std::deque<OUString>& rContainer1, + std::u16string_view str2, const std::deque<OUString>& rContainer2) +{ + assert(rContainer1.size() == rContainer2.size()); + + if (auto it1 = std::find(rContainer1.begin(), rContainer1.end(), str1); + it1 != rContainer1.end()) + { + auto it2 = rContainer2.begin() + (it1 - rContainer1.begin()); + if (*it2 == str2) + return { it1, it2 }; + } + return { rContainer1.end(), rContainer2.end() }; +} + +std::pair<std::deque<OUString>::const_iterator, std::deque<OUString>::const_iterator> +SvxCharacterMap::getRecentChar(std::u16string_view sTitle, std::u16string_view rFont) const +{ + return findInPair(sTitle, maRecentCharList, rFont, maRecentCharFontList); +} + +std::pair<std::deque<OUString>::const_iterator, std::deque<OUString>::const_iterator> +SvxCharacterMap::getFavChar(std::u16string_view sTitle, std::u16string_view rFont) const +{ + return findInPair(sTitle, maFavCharList, rFont, maFavCharFontList); } void SvxCharacterMap::updateRecentCharControl() { + assert(maRecentCharList.size() == maRecentCharFontList.size()); + int i = 0; for ( std::deque< OUString >::iterator it = maRecentCharList.begin(), it2 = maRecentCharFontList.begin(); it != maRecentCharList.end() && it2 != maRecentCharFontList.end(); @@ -281,12 +321,9 @@ void SvxCharacterMap::updateRecentCharControl() void SvxCharacterMap::updateRecentCharacterList(const OUString& sTitle, const OUString& rFont) { - auto itChar = std::find(maRecentCharList.begin(), maRecentCharList.end(), sTitle); - - auto itChar2 = std::find(maRecentCharFontList.begin(), maRecentCharFontList.end(), rFont); - // if recent char to be added is already in list, remove it - if( itChar != maRecentCharList.end() && itChar2 != maRecentCharFontList.end() ) + if( const auto& [itChar, itChar2] = getRecentChar(sTitle, rFont); + itChar != maRecentCharList.end() && itChar2 != maRecentCharFontList.end() ) { maRecentCharList.erase( itChar ); maRecentCharFontList.erase( itChar2); @@ -321,12 +358,9 @@ void SvxCharacterMap::updateRecentCharacterList(const OUString& sTitle, const OU void SvxCharacterMap::updateFavCharacterList(const OUString& sTitle, const OUString& rFont) { - auto itChar = std::find(maFavCharList.begin(), maFavCharList.end(), sTitle); - - auto itChar2 = std::find(maFavCharFontList.begin(), maFavCharFontList.end(), rFont); - // if Fav char to be added is already in list, remove it - if( itChar != maFavCharList.end() && itChar2 != maFavCharFontList.end() ) + if( const auto& [itChar, itChar2] = getFavChar(sTitle, rFont); + itChar != maFavCharList.end() && itChar2 != maFavCharFontList.end() ) { maFavCharList.erase( itChar ); maFavCharFontList.erase( itChar2); @@ -359,6 +393,8 @@ void SvxCharacterMap::updateFavCharacterList(const OUString& sTitle, const OUStr void SvxCharacterMap::updateFavCharControl() { + assert(maFavCharList.size() == maFavCharFontList.size()); + int i = 0; for ( std::deque< OUString >::iterator it = maFavCharList.begin(), it2 = maFavCharFontList.begin(); it != maFavCharList.end() && it2 != maFavCharFontList.end(); @@ -380,14 +416,11 @@ void SvxCharacterMap::updateFavCharControl() m_xSearchSet->getFavCharacterList(); } -void SvxCharacterMap::deleteFavCharacterFromList(const OUString& sTitle, const OUString& rFont) +void SvxCharacterMap::deleteFavCharacterFromList(std::u16string_view sTitle, std::u16string_view rFont) { - auto itChar = std::find(maFavCharList.begin(), maFavCharList.end(), sTitle); - - auto itChar2 = std::find(maFavCharFontList.begin(), maFavCharFontList.end(), rFont); - - // if Fav char to be added is already in list, remove it - if( itChar != maFavCharList.end() && itChar2 != maFavCharFontList.end() ) + // if Fav char is found, remove it + if( const auto& [itChar, itChar2] = getFavChar(sTitle, rFont); + itChar != maFavCharList.end() && itChar2 != maFavCharFontList.end() ) { maFavCharList.erase( itChar ); maFavCharFontList.erase( itChar2); @@ -529,24 +562,16 @@ void SvxCharacterMap::init() m_xSearchText->connect_changed(LINK(this, SvxCharacterMap, SearchUpdateHdl)); } -bool SvxCharacterMap::isFavChar(const OUString& sTitle, const OUString& rFont) +bool SvxCharacterMap::isFavChar(std::u16string_view sTitle, std::u16string_view rFont) { - auto isFavCharTitleExists = std::any_of(maFavCharList.begin(), - maFavCharList.end(), - [sTitle] (const OUString & a) { return a == sTitle; }); - - auto isFavCharFontExists = std::any_of(maFavCharFontList.begin(), - maFavCharFontList.end(), - [rFont] (const OUString & a) { return a == rFont; }); - - // if Fav char to be added is already in list, remove it - return isFavCharTitleExists && isFavCharFontExists; + const auto& [itChar, itFont] = getFavChar(sTitle, rFont); + return itChar != maFavCharList.end() && itFont != maFavCharFontList.end(); } -void SvxCharacterMap::setFavButtonState(const OUString& sTitle, const OUString& rFont) +void SvxCharacterMap::setFavButtonState(std::u16string_view sTitle, std::u16string_view rFont) { - if(sTitle.isEmpty() || rFont.isEmpty()) + if(sTitle.empty() || rFont.empty()) { m_xFavouritesBtn->set_sensitive(false); return; @@ -746,13 +771,11 @@ IMPL_LINK_NOARG(SvxCharacterMap, SubsetSelectHdl, weld::ComboBox&, void) IMPL_LINK(SvxCharacterMap, RecentClearClickHdl, SvxCharView*, rView, void) { const OUString& sTitle = rView->GetText(); - auto itChar = std::find(maRecentCharList.begin(), maRecentCharList.end(), sTitle); - OUString sFont = rView->GetFont().GetFamilyName(); - auto itChar2 = std::find(maRecentCharFontList.begin(), maRecentCharFontList.end(), sFont); // if recent char to be added is already in list, remove it - if( itChar != maRecentCharList.end() && itChar2 != maRecentCharFontList.end() ) + if( const auto& [itChar, itChar2] = getRecentChar(sTitle, sFont); + itChar != maRecentCharList.end() && itChar2 != maRecentCharFontList.end() ) { maRecentCharList.erase( itChar ); maRecentCharFontList.erase( itChar2); diff --git a/include/cui/cuicharmap.hxx b/include/cui/cuicharmap.hxx index 4548f7013e87..11e464912a8d 100644 --- a/include/cui/cuicharmap.hxx +++ b/include/cui/cuicharmap.hxx @@ -31,6 +31,10 @@ #include <cui/cuidllapi.h> #include <com/sun/star/frame/XFrame.hpp> +#include <deque> +#include <memory> +#include <utility> + using namespace ::com::sun::star; class SubsetMap; @@ -165,18 +169,25 @@ public: void getFavCharacterList(); //gets both Fav char and Fav char font list void updateFavCharacterList(const OUString& rChar, const OUString& rFont); - void deleteFavCharacterFromList(const OUString& rChar, const OUString& rFont); - bool isFavChar(const OUString& sTitle, const OUString& rFont); + void deleteFavCharacterFromList(std::u16string_view rChar, std::u16string_view rFont); + bool isFavChar(std::u16string_view sTitle, std::u16string_view rFont); void updateRecentCharControl(); void insertCharToDoc(const OUString& sChar); void updateFavCharControl(); - void setFavButtonState(const OUString& sTitle, const OUString& rFont); + void setFavButtonState(std::u16string_view sTitle, std::u16string_view rFont); void setCharName(sal_UCS4 nDecimalValue); void toggleSearchView(bool state); + +private: + std::pair<std::deque<OUString>::const_iterator, std::deque<OUString>::const_iterator> + getRecentChar(std::u16string_view sTitle, std::u16string_view rFont) const; + + std::pair<std::deque<OUString>::const_iterator, std::deque<OUString>::const_iterator> + getFavChar(std::u16string_view sTitle, std::u16string_view rFont) const; }; #endif diff --git a/sfx2/source/control/charmapcontrol.cxx b/sfx2/source/control/charmapcontrol.cxx index 5417f21bc1b6..b88defff73b9 100644 --- a/sfx2/source/control/charmapcontrol.cxx +++ b/sfx2/source/control/charmapcontrol.cxx @@ -125,10 +125,17 @@ void SfxCharmapCtrl::getFavCharacterList() //retrieve recent character font list css::uno::Sequence< OUString > rFavCharFontList( officecfg::Office::Common::FavoriteCharacters::FavoriteCharacterFontList::get() ); m_aFavCharFontList.insert( m_aFavCharFontList.end(), rFavCharFontList.begin(), rFavCharFontList.end() ); + + // tdf#135997: make sure that the two lists are same length + const auto nCommonLength = std::min(m_aFavCharList.size(), m_aFavCharFontList.size()); + m_aFavCharList.resize(nCommonLength); + m_aFavCharFontList.resize(nCommonLength); } void SfxCharmapCtrl::updateFavCharControl() { + assert(m_aFavCharList.size() == m_aFavCharFontList.size()); + int i = 0; for ( std::deque< OUString >::iterator it = m_aFavCharList.begin(), it2 = m_aFavCharFontList.begin(); it != m_aFavCharList.end() && it2 != m_aFavCharFontList.end(); @@ -157,10 +164,16 @@ void SfxCharmapCtrl::getRecentCharacterList() //retrieve recent character font list css::uno::Sequence< OUString > rRecentCharFontList( officecfg::Office::Common::RecentCharacters::RecentCharacterFontList::get() ); m_aRecentCharFontList.insert( m_aRecentCharFontList.end(), rRecentCharFontList.begin(), rRecentCharFontList.end() ); + + // tdf#135997: make sure that the two lists are same length + const auto nCommonLength = std::min(m_aRecentCharList.size(), m_aRecentCharFontList.size()); + m_aRecentCharList.resize(nCommonLength); + m_aRecentCharFontList.resize(nCommonLength); } void SfxCharmapCtrl::updateRecentCharControl() { + assert(m_aRecentCharList.size() == m_aRecentCharFontList.size()); int i = 0; for ( std::deque< OUString >::iterator it = m_aRecentCharList.begin(), it2 = m_aRecentCharFontList.begin(); it != m_aRecentCharList.end() && it2 != m_aRecentCharFontList.end(); |