cui/source/tabpages/chardlg.cxx | 43 ++++++++++++++++----------- include/svx/langbox.hxx | 2 - svx/source/dialog/langbox.cxx | 63 ++++++++++++++++++++++++++++++---------- 3 files changed, 75 insertions(+), 33 deletions(-)
New commits: commit 1ea19958d6fed38513b1983599c2c43ad76aae61 Author: Eike Rathke <er...@redhat.com> AuthorDate: Wed Oct 5 19:21:36 2022 +0200 Commit: Eike Rathke <er...@redhat.com> CommitDate: Wed Oct 5 20:07:36 2022 +0200 Add on-the-fly language tag to proper language list Western/Asian/Complex In which combobox wherever it was added, the correct SfxItem will be updated and at least when switching to another dialog tab and back it will appear in the correct list. (shouldn't tabbing out of the combobox already trigger that?) Change-Id: I5aa78797dc24527c753c97d0357c3058271fa4d8 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/140991 Reviewed-by: Eike Rathke <er...@redhat.com> Tested-by: Jenkins diff --git a/cui/source/tabpages/chardlg.cxx b/cui/source/tabpages/chardlg.cxx index 226fe846ee3d..e34eca07485c 100644 --- a/cui/source/tabpages/chardlg.cxx +++ b/cui/source/tabpages/chardlg.cxx @@ -1062,31 +1062,40 @@ bool SvxCharNamePage::FillItemSet_Impl( SfxItemSet& rSet, LanguageGroup eLangGrp case Asian : nSlot = SID_ATTR_CHAR_CJK_LANGUAGE; break; case Ctl : nSlot = SID_ATTR_CHAR_CTL_LANGUAGE; break; } - nWhich = GetWhich( nSlot ); - pOld = GetOldItem( rSet, nSlot ); // For language list boxes acting as ComboBox, check for, add and select an // edited entry. - if (pLangBox == m_xWestFontLanguageLB.get()) + switch (pLangBox->GetEditedAndValid()) { - switch (pLangBox->GetEditedAndValid()) - { - case SvxLanguageBox::EditedAndValid::No: - ; // nothing to do - break; - case SvxLanguageBox::EditedAndValid::Valid: + case SvxLanguageBox::EditedAndValid::No: + ; // nothing to do + break; + case SvxLanguageBox::EditedAndValid::Valid: + { + SvxLanguageBox* ppBoxes[3] + = {m_xWestFontLanguageLB.get(), m_xEastFontLanguageLB.get(), m_xCTLFontLanguageLB.get()}; + SvxLanguageBox* pBox = pLangBox->SaveEditedAsEntry(ppBoxes); + if (pBox != pLangBox) { - const int nPos = pLangBox->SaveEditedAsEntry(); - if (nPos != -1) - pLangBox->set_active(nPos); + // Get item from corresponding slot. + if (pBox == m_xWestFontLanguageLB.get()) + nSlot = SID_ATTR_CHAR_LANGUAGE; + else if (pBox == m_xEastFontLanguageLB.get()) + nSlot = SID_ATTR_CHAR_CJK_LANGUAGE; + else if (pBox == m_xCTLFontLanguageLB.get()) + nSlot = SID_ATTR_CHAR_CTL_LANGUAGE; + pLangBox = pBox; } - break; - case SvxLanguageBox::EditedAndValid::Invalid: - pLangBox->set_active_id(pLangBox->get_saved_active_id()); - break; - } + } + break; + case SvxLanguageBox::EditedAndValid::Invalid: + pLangBox->set_active_id(pLangBox->get_saved_active_id()); + break; } + nWhich = GetWhich( nSlot ); + pOld = GetOldItem( rSet, nSlot ); + int nLangPos = pLangBox->get_active(); LanguageType eLangType = pLangBox->get_active_id(); diff --git a/include/svx/langbox.hxx b/include/svx/langbox.hxx index a3d74adba703..7a03c522d98b 100644 --- a/include/svx/langbox.hxx +++ b/include/svx/langbox.hxx @@ -84,7 +84,7 @@ public: void InsertLanguage(const LanguageType nLangType); EditedAndValid GetEditedAndValid() const { return m_eEditedAndValid;} - sal_Int32 SaveEditedAsEntry(); + SvxLanguageBox* SaveEditedAsEntry( SvxLanguageBox* ppBoxes[3] /* convention: Western, Asian, Complex */ ); void connect_changed(const Link<weld::ComboBox&, void>& rLink) { m_aChangeHdl = rLink; } void connect_focus_in(const Link<weld::Widget&, void>& rLink) { m_xControl->connect_focus_in(rLink); } diff --git a/svx/source/dialog/langbox.cxx b/svx/source/dialog/langbox.cxx index 5db46c695493..76d9b3de1fe5 100644 --- a/svx/source/dialog/langbox.cxx +++ b/svx/source/dialog/langbox.cxx @@ -463,40 +463,73 @@ SvxLanguageBox::SvxLanguageBox(std::unique_ptr<weld::ComboBox> pControl) m_xControl->connect_changed(LINK(this, SvxLanguageBox, ChangeHdl)); } -sal_Int32 SvxLanguageBox::SaveEditedAsEntry() +SvxLanguageBox* SvxLanguageBox::SaveEditedAsEntry(SvxLanguageBox* ppBoxes[3]) { if (m_eEditedAndValid != EditedAndValid::Valid) - return -1; + return this; LanguageTag aLanguageTag(m_xControl->get_active_text()); LanguageType nLang = aLanguageTag.getLanguageType(); if (nLang == LANGUAGE_DONTKNOW) { - SAL_WARN( "svx.dialog", "SvxLanguageComboBox::SaveEditedAsEntry: unknown tag"); - return -1; + SAL_WARN( "svx.dialog", "SvxLanguageBox::SaveEditedAsEntry: unknown tag"); + return this; } - int nPos = ImplTypeToPos( nLang); - if (nPos != -1) - return nPos; // Already present but with a different string. + for (size_t i = 0; i < 3; ++i) + { + SvxLanguageBox* pBox = ppBoxes[i]; + if (!pBox) + continue; + + const int nPos = pBox->ImplTypeToPos( nLang); + if (nPos != -1) + { + // Already present but with a different string or in another list. + pBox->m_xControl->set_active(nPos); + return pBox; + } + } if (SvtLanguageTable::HasLanguageType( nLang)) { - // In SvtLanguageTable but not in SvxLanguageComboBox. On purpose? This - // may be an entry with different settings or CTL instead of Western or - // ... all things we don't handle yet. - SAL_WARN( "svx.dialog", "SvxLanguageComboBox::SaveEditedAsEntry: already in SvtLanguageTable: " << + // In SvtLanguageTable but not in SvxLanguageBox. On purpose? This + // may be an entry with different settings. + SAL_WARN( "svx.dialog", "SvxLanguageBox::SaveEditedAsEntry: already in SvtLanguageTable: " << SvtLanguageTable::GetLanguageString( nLang) << ", " << nLang); } else { - // Add to both, SvtLanguageTable and SvxLanguageComboBox. - /* TODO: a descriptive user comment would be a nice to have here. */ + // Add to SvtLanguageTable first. This at an on-the-fly LanguageTag + // also sets the ScriptType needed below. SvtLanguageTable::AddLanguageTag( aLanguageTag ); } - InsertLanguage(nLang); - return ImplTypeToPos(nLang); + // Add to the proper list. + SvxLanguageBox* pBox = nullptr; + switch (MsLangId::getScriptType(nLang)) + { + default: + case css::i18n::ScriptType::LATIN: + pBox = ppBoxes[0]; + break; + case css::i18n::ScriptType::ASIAN: + pBox = ppBoxes[1]; + break; + case css::i18n::ScriptType::COMPLEX: + pBox = ppBoxes[2]; + break; + } + if (!pBox) + pBox = this; + pBox->InsertLanguage(nLang); + + // Select it. + const int nPos = pBox->ImplTypeToPos(nLang); + if (nPos != -1) + pBox->m_xControl->set_active(nPos); + + return pBox; } /* vim:set shiftwidth=4 softtabstop=4 expandtab: */