starmath/inc/symbol.hxx | 8 +++----- starmath/source/dialog.cxx | 8 ++++---- starmath/source/node.cxx | 6 ++---- starmath/source/parse5.cxx | 18 ++++++++++++++---- starmath/source/symbol.cxx | 35 ++++++++++++++++++++++++----------- 5 files changed, 47 insertions(+), 28 deletions(-)
New commits: commit 7de4c6b95da7d187c403ee478786bb74467c1eb5 Author: Khaled Hosny <[email protected]> AuthorDate: Thu Sep 21 12:20:07 2023 +0300 Commit: خالد حسني <[email protected]> CommitDate: Thu Sep 21 12:33:19 2023 +0200 tdf#62174: Fix saving of localized iGreek symbols When saving symbols we use the non-localized name, but iGreek symbols are a bit of a hack since they are added at runtime and don’t have localizations of there own but use the Greek symbols names with an “i” prefix. Instead of looking directly for localized names, we now go through the symbol manager that already knows about iGreek and use the export name of the symbol. We have to also make sure the iGreek symbols has non-localized export name. Change-Id: Ia3e38579abba56ae12ade126f564f8c6f9c3229a Reviewed-on: https://gerrit.libreoffice.org/c/core/+/157137 Tested-by: Jenkins Reviewed-by: خالد حسني <[email protected]> diff --git a/starmath/inc/symbol.hxx b/starmath/inc/symbol.hxx index 321dbb500e03..a7d5bcad6697 100644 --- a/starmath/inc/symbol.hxx +++ b/starmath/inc/symbol.hxx @@ -93,11 +93,9 @@ public: bool AddOrReplaceSymbol( const SmSym & rSymbol, bool bForceChange = false ); void RemoveSymbol( const OUString & rSymbolName ); - SmSym * GetSymbolByName(const OUString& rSymbolName); - const SmSym * GetSymbolByName(const OUString& rSymbolName) const - { - return const_cast<SmSymbolManager *>(this)->GetSymbolByName(rSymbolName); - } + SmSym* GetSymbolByName(std::u16string_view rSymbolName); + SmSym* GetSymbolByUiName(std::u16string_view rSymbolName); + SmSym* GetSymbolByExportName(std::u16string_view rSymbolName); bool IsModified() const { return m_bModified; } void SetModified(bool bModify) { m_bModified = bModify; } diff --git a/starmath/source/dialog.cxx b/starmath/source/dialog.cxx index 8625072c90e8..c5e38f6cb684 100644 --- a/starmath/source/dialog.cxx +++ b/starmath/source/dialog.cxx @@ -1544,7 +1544,7 @@ void SmSymDefineDialog::FillStyles() SmSym* SmSymDefineDialog::GetSymbol(const weld::ComboBox& rComboBox) { assert((&rComboBox == m_xOldSymbols.get() || &rComboBox == m_xSymbols.get()) && "Sm : wrong combobox"); - return m_aSymbolMgrCopy.GetSymbolByName(rComboBox.get_active_text()); + return m_aSymbolMgrCopy.GetSymbolByUiName(rComboBox.get_active_text()); } IMPL_LINK(SmSymDefineDialog, OldSymbolChangeHdl, weld::ComboBox&, rComboBox, void) @@ -1652,7 +1652,7 @@ IMPL_LINK( SmSymDefineDialog, AddClickHdl, weld::Button&, rButton, void ) // add symbol const SmSym aNewSymbol(m_xSymbols->get_active_text(), m_xCharsetDisplay->GetFont(), m_xCharsetDisplay->GetSelectCharacter(), m_xSymbolSets->get_active_text()); - //OSL_ENSURE( m_aSymbolMgrCopy.GetSymbolByName(aTmpSymbolName) == NULL, "symbol already exists" ); + //OSL_ENSURE( m_aSymbolMgrCopy.GetSymbolByUiName(aTmpSymbolName) == NULL, "symbol already exists" ); m_aSymbolMgrCopy.AddOrReplaceSymbol( aNewSymbol ); // update display of new symbol @@ -1750,7 +1750,7 @@ void SmSymDefineDialog::UpdateButtons() && m_xCharsetDisplay->GetSelectCharacter() == m_xOrigSymbol->GetCharacter(); // only add it if there isn't already a symbol with the same name - bAdd = m_aSymbolMgrCopy.GetSymbolByName(aTmpSymbolName) == nullptr; + bAdd = m_aSymbolMgrCopy.GetSymbolByUiName(aTmpSymbolName) == nullptr; // only delete it if all settings are equal bDelete = bool(m_xOrigSymbol); @@ -1982,7 +1982,7 @@ bool SmSymDefineDialog::SelectSymbol(weld::ComboBox& rComboBox, OUString aTmpOldSymbolSetName; if (nPos != -1) { - pOldSymbol = m_aSymbolMgrCopy.GetSymbolByName(aNormName); + pOldSymbol = m_aSymbolMgrCopy.GetSymbolByUiName(aNormName); aTmpOldSymbolSetName = m_xOldSymbolSets->get_active_text(); } SetOrigSymbol(pOldSymbol, aTmpOldSymbolSetName); diff --git a/starmath/source/node.cxx b/starmath/source/node.cxx index 01b14c177e43..b0b91dabe99e 100644 --- a/starmath/source/node.cxx +++ b/starmath/source/node.cxx @@ -2155,8 +2155,7 @@ static bool lcl_IsFromGreekSymbolSet( std::u16string_view aTokenText ) // valid symbol name needs to have a '%' at pos 0 and at least an additional char if (aTokenText.size() > 2 && aTokenText[0] == u'%') { - OUString aName( aTokenText.substr(1) ); - SmSym *pSymbol = SM_MOD()->GetSymbolManager().GetSymbolByName( aName ); + SmSym *pSymbol = SM_MOD()->GetSymbolManager().GetSymbolByName(aTokenText.substr(1)); if (pSymbol && SmLocalizedSymbolData::GetExportSymbolSetName(pSymbol->GetSymbolSetName()) == "Greek") bRes = true; } @@ -2186,8 +2185,7 @@ void SmSpecialNode::Prepare(const SmFormat &rFormat, const SmDocShell &rDocShell const SmSym *pSym; SmModule *pp = SM_MOD(); - OUString aName(GetToken().aText.copy(1)); - if (nullptr != (pSym = pp->GetSymbolManager().GetSymbolByName( aName ))) + if (nullptr != (pSym = pp->GetSymbolManager().GetSymbolByName(GetToken().aText.subView(1)))) { sal_UCS4 cChar = pSym->GetCharacter(); OUString aTmp( &cChar, 1 ); diff --git a/starmath/source/parse5.cxx b/starmath/source/parse5.cxx index 04c4702683b1..27c2471e7418 100644 --- a/starmath/source/parse5.cxx +++ b/starmath/source/parse5.cxx @@ -29,6 +29,7 @@ #include <parse5.hxx> #include <strings.hrc> #include <smmod.hxx> +#include <symbol.hxx> #include <cfgitem.hxx> #include <starmathdatabase.hxx> @@ -2632,13 +2633,22 @@ std::unique_ptr<SmSpecialNode> SmParser5::DoSpecial() { if (IsImportSymbolNames()) { - aNewName = SmLocalizedSymbolData::GetUiSymbolName(rName.subView(1)); - bReplace = true; + const SmSym* pSym + = SM_MOD()->GetSymbolManager().GetSymbolByExportName(rName.subView(1)); + if (pSym) + { + aNewName = pSym->GetName(); + bReplace = true; + } } else if (IsExportSymbolNames()) { - aNewName = SmLocalizedSymbolData::GetExportSymbolName(rName.subView(1)); - bReplace = true; + const SmSym* pSym = SM_MOD()->GetSymbolManager().GetSymbolByUiName(rName.subView(1)); + if (pSym) + { + aNewName = pSym->GetExportName(); + bReplace = true; + } } } if (!aNewName.isEmpty()) diff --git a/starmath/source/symbol.cxx b/starmath/source/symbol.cxx index a75b6a912670..5f81d0151d9a 100644 --- a/starmath/source/symbol.cxx +++ b/starmath/source/symbol.cxx @@ -120,23 +120,35 @@ SmSymbolManager& SmSymbolManager::operator = (const SmSymbolManager& rSymbolSetM return *this; } +SmSym* SmSymbolManager::GetSymbolByName(std::u16string_view rSymbolName) +{ + SmSym* pRes = GetSymbolByUiName(rSymbolName); + if (!pRes) + pRes = GetSymbolByExportName(rSymbolName); + return pRes; +} -SmSym *SmSymbolManager::GetSymbolByName(const OUString& rSymbolName) +SmSym *SmSymbolManager::GetSymbolByUiName(std::u16string_view rSymbolName) { + OUString aSymbolName(rSymbolName); SmSym *pRes = nullptr; - SymbolMap_t::iterator aIt( m_aSymbols.find( rSymbolName ) ); + SymbolMap_t::iterator aIt( m_aSymbols.find( aSymbolName ) ); if (aIt != m_aSymbols.end()) pRes = &aIt->second; - else + return pRes; +} + +SmSym* SmSymbolManager::GetSymbolByExportName(std::u16string_view rSymbolName) +{ + OUString aSymbolName(rSymbolName); + SmSym* pRes = nullptr; + for (auto& rPair : m_aSymbols) { - for (auto& rPair : m_aSymbols) + SmSym& rSymbol = rPair.second; + if (rSymbol.GetExportName() == aSymbolName) { - SmSym& rSymbol = rPair.second; - if (rSymbol.GetExportName() == rSymbolName) - { - pRes = &rSymbol; - break; - } + pRes = &rSymbol; + break; } } return pRes; @@ -161,7 +173,7 @@ bool SmSymbolManager::AddOrReplaceSymbol( const SmSym &rSymbol, bool bForceChang const OUString& aSymbolName( rSymbol.GetName() ); if (!aSymbolName.isEmpty() && !rSymbol.GetSymbolSetName().isEmpty()) { - const SmSym *pFound = GetSymbolByName( aSymbolName ); + const SmSym *pFound = GetSymbolByUiName( aSymbolName ); const bool bSymbolConflict = pFound && !pFound->IsEqualInUI( rSymbol ); // avoid having the same symbol name twice but with different symbols in use @@ -263,6 +275,7 @@ void SmSymbolManager::Load() OUString aSymbolName = "i" + rSym.GetName(); SmSym aSymbol( aSymbolName, aFont, rSym.GetCharacter(), aSymbolSetName, true /*bIsPredefined*/ ); + aSymbol.SetExportName("i" + rSym.GetExportName()); AddOrReplaceSymbol( aSymbol ); }
