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: */

Reply via email to