diff options
author | Khaled Hosny <khaled@libreoffice.org> | 2023-09-21 12:20:07 +0300 |
---|---|---|
committer | خالد حسني <khaled@libreoffice.org> | 2023-09-21 12:33:19 +0200 |
commit | 7de4c6b95da7d187c403ee478786bb74467c1eb5 (patch) | |
tree | c28bc64001061720a7ee89c7a7bd40e420fe0185 /starmath/source | |
parent | cfe9c68a7a19dd77d1fcbde3a7dd75730634becc (diff) |
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: خالد حسني <khaled@libreoffice.org>
Diffstat (limited to 'starmath/source')
-rw-r--r-- | starmath/source/dialog.cxx | 8 | ||||
-rw-r--r-- | starmath/source/node.cxx | 6 | ||||
-rw-r--r-- | starmath/source/parse5.cxx | 18 | ||||
-rw-r--r-- | starmath/source/symbol.cxx | 35 |
4 files changed, 44 insertions, 23 deletions
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 ); } |