include/svx/svxids.hrc                                               |    3 
 officecfg/registry/data/org/openoffice/Office/UI/GenericCommands.xcu |    5 
 svx/sdi/svx.sdi                                                      |   17 +++
 sw/sdi/_textsh.sdi                                                   |    6 +
 sw/source/uibase/lingu/olmenu.cxx                                    |   22 
----
 sw/source/uibase/shells/textsh1.cxx                                  |   53 
+++++++---
 6 files changed, 73 insertions(+), 33 deletions(-)

New commits:
commit 5a6527eea72a629ebc393b7d82f486c3a564ccec
Author:     Caolán McNamara <caolan.mcnam...@collabora.com>
AuthorDate: Fri Dec 20 12:46:36 2024 +0000
Commit:     Miklos Vajna <vmik...@collabora.com>
CommitDate: Mon Jan 6 10:34:51 2025 +0100

    add uno:AddToWordbook for adding word to user dictionary
    
    Change-Id: I1c679f62f554bfa112c505a545ceb8b5e31ef453
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/178916
    Reviewed-by: Miklos Vajna <vmik...@collabora.com>
    Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoff...@gmail.com>

diff --git a/include/svx/svxids.hrc b/include/svx/svxids.hrc
index 0a2bc143210a..7f5875ae8775 100644
--- a/include/svx/svxids.hrc
+++ b/include/svx/svxids.hrc
@@ -451,7 +451,8 @@ class XFillGradientItem;
 #define SID_ATTR_TEXTCOLUMNS_NUMBER                     ( SID_SVX_START + 340 )
 #define SID_ATTR_TEXTCOLUMNS_SPACING                    ( SID_SVX_START + 341 )
 
-// FREE                                                 ( SID_SVX_START + 342 )
+#define SID_ADD_TO_WORDBOOK                             ( SID_SVX_START + 342 )
+
 // FREE                                                 ( SID_SVX_START + 343 )
 // FREE                                                 ( SID_SVX_START + 344 )
 // FREE                                                 ( SID_SVX_START + 345 )
diff --git 
a/officecfg/registry/data/org/openoffice/Office/UI/GenericCommands.xcu 
b/officecfg/registry/data/org/openoffice/Office/UI/GenericCommands.xcu
index 30896cc0cdbc..33887fc92394 100644
--- a/officecfg/registry/data/org/openoffice/Office/UI/GenericCommands.xcu
+++ b/officecfg/registry/data/org/openoffice/Office/UI/GenericCommands.xcu
@@ -7182,6 +7182,11 @@ bit 3 (0x8): #define 
UICOMMANDDESCRIPTION_PROPERTIES_TOGGLEBUTTON 8
           <value xml:lang="en-US">Language for All Text</value>
         </prop>
       </node>
+      <node oor:name=".uno:AddToWordbook" oor:op="replace">
+        <prop oor:name="Label" oor:type="xs:string">
+          <value xml:lang="en-US">Add To Dictionary</value>
+        </prop>
+      </node>
       <node oor:name=".uno:MoreDictionaries" oor:op="replace">
         <prop oor:name="Label" oor:type="xs:string">
           <value xml:lang="en-US">More Dictionaries Online...</value>
diff --git a/svx/sdi/svx.sdi b/svx/sdi/svx.sdi
index 197daf2edf2a..f682c37a5e50 100644
--- a/svx/sdi/svx.sdi
+++ b/svx/sdi/svx.sdi
@@ -12517,6 +12517,23 @@ SfxVoidItem SpellCheckIgnoreAll 
SID_SPELLCHECK_IGNORE_ALL
     GroupId = SfxGroupId::Format;
 ]
 
+SfxVoidItem AddToWordbook SID_ADD_TO_WORDBOOK
+(SfxStringItem Wordbook FN_PARAM_1)
+[
+    AutoUpdate = FALSE,
+    FastCall = TRUE,
+    ReadOnlyDoc = FALSE,
+    Toggle = FALSE,
+    Container = FALSE,
+    RecordAbsolute = FALSE,
+    RecordPerSet;
+
+    AccelConfig = FALSE,
+    MenuConfig = FALSE,
+    ToolBoxConfig = FALSE,
+    GroupId = SfxGroupId::Format;
+]
+
 SfxVoidItem SpellCheckApplySuggestion SID_SPELLCHECK_APPLY_SUGGESTION
 (SfxStringItem ApplyRule FN_PARAM_1)
 [
diff --git a/sw/sdi/_textsh.sdi b/sw/sdi/_textsh.sdi
index d40c58ea6ba7..f4c47c6b1098 100644
--- a/sw/sdi/_textsh.sdi
+++ b/sw/sdi/_textsh.sdi
@@ -1910,6 +1910,12 @@ interface BaseText
         StateMethod = GetState ;
     ]
 
+    SID_ADD_TO_WORDBOOK
+    [
+        ExecMethod = Execute ;
+        StateMethod = GetState ;
+    ]
+
     SID_SPELLCHECK_APPLY_SUGGESTION
     [
         ExecMethod = Execute ;
diff --git a/sw/source/uibase/lingu/olmenu.cxx 
b/sw/source/uibase/lingu/olmenu.cxx
index acf06f2e41a7..d92920521d2b 100644
--- a/sw/source/uibase/lingu/olmenu.cxx
+++ b/sw/source/uibase/lingu/olmenu.cxx
@@ -771,9 +771,7 @@ void SwSpellPopup::Execute( sal_uInt16 nId )
     }
     else if ((MN_DICTIONARIES_START <= nId && nId <= MN_DICTIONARIES_END) || 
nId == m_nAddId)
     {
-        OUString sWord( m_xSpellAlt->getWord() );
         OUString aDicName;
-
         if (MN_DICTIONARIES_START <= nId && nId <= MN_DICTIONARIES_END)
         {
             PopupMenu *pMenu = m_xPopupMenu->GetPopupMenu(m_nAddMenuId);
@@ -782,24 +780,8 @@ void SwSpellPopup::Execute( sal_uInt16 nId )
         else
             aDicName = m_aDicNameSingle;
 
-        uno::Reference< linguistic2::XDictionary >      xDic;
-        uno::Reference< linguistic2::XSearchableDictionaryList >  xDicList( 
LinguMgr::GetDictionaryList() );
-        if (xDicList.is())
-            xDic = xDicList->getDictionaryByName( aDicName );
-
-        if (xDic.is())
-        {
-            linguistic::DictionaryError nAddRes = 
linguistic::AddEntryToDic(xDic, sWord, false, OUString());
-            // save modified user-dictionary if it is persistent
-            uno::Reference< frame::XStorable >  xSavDic( xDic, uno::UNO_QUERY 
);
-            if (xSavDic.is())
-                xSavDic->store();
-
-            if (linguistic::DictionaryError::NONE != nAddRes && 
!xDic->getEntry(sWord).is())
-            {
-                SvxDicError(m_pSh->GetView().GetFrameWeld(), nAddRes);
-            }
-        }
+        SfxStringItem aDictString(FN_PARAM_1, aDicName);
+        
m_pSh->GetView().GetViewFrame().GetDispatcher()->ExecuteList(SID_ADD_TO_WORDBOOK,
 SfxCallMode::SYNCHRON, { &aDictString });
     }
     else if ( nId == MN_EXPLANATION_LINK && !m_sExplanationLink.isEmpty() )
     {
diff --git a/sw/source/uibase/shells/textsh1.cxx 
b/sw/source/uibase/shells/textsh1.cxx
index 66a92416f3b0..380b35cc2965 100644
--- a/sw/source/uibase/shells/textsh1.cxx
+++ b/sw/source/uibase/shells/textsh1.cxx
@@ -22,6 +22,8 @@
 #include <config_features.h>
 
 #include <com/sun/star/i18n/WordType.hpp>
+#include <com/sun/star/frame/XStorable.hpp>
+#include <com/sun/star/linguistic2/XSearchableDictionaryList.hpp>
 #include <com/sun/star/linguistic2/XThesaurus.hpp>
 #include <com/sun/star/text/XContentControlsSupplier.hpp>
 
@@ -939,6 +941,26 @@ bool lcl_DeleteChartColumns(const 
uno::Reference<chart2::XChartDocument>& xChart
 }
 }
 
+static bool AddWordToWordbook(const uno::Reference<linguistic2::XDictionary>& 
xDictionary, SwWrtShell &rWrtSh)
+{
+    if (!xDictionary)
+        return false;
+
+    SwRect aToFill;
+    uno::Reference<linguistic2::XSpellAlternatives>  
xSpellAlt(rWrtSh.GetCorrection(nullptr, aToFill));
+    if (!xSpellAlt.is())
+        return false;
+
+    OUString sWord = xSpellAlt->getWord();
+    linguistic::DictionaryError nAddRes = 
linguistic::AddEntryToDic(xDictionary, sWord, false, OUString());
+    if (linguistic::DictionaryError::NONE != nAddRes && xDictionary.is() && 
!xDictionary->getEntry(sWord).is())
+    {
+        SvxDicError(rWrtSh.GetView().GetFrameWeld(), nAddRes);
+        return false;
+    }
+    return true;
+}
+
 void SwTextShell::Execute(SfxRequest &rReq)
 {
     bool bUseDialog = true;
@@ -2224,19 +2246,26 @@ void SwTextShell::Execute(SfxRequest &rReq)
         }
         else if (sApplyText == "Spelling")
         {
-            SwRect aToFill;
-            uno::Reference<linguistic2::XSpellAlternatives>  
xSpellAlt(rWrtSh.GetCorrection(nullptr, aToFill));
-            if (!xSpellAlt.is())
-                return;
-            uno::Reference< linguistic2::XDictionary > xDictionary = 
LinguMgr::GetIgnoreAllList();
-            OUString sWord(xSpellAlt->getWord());
-            linguistic::DictionaryError nAddRes = linguistic::AddEntryToDic( 
xDictionary,
-                    sWord, false, OUString() );
-            if (linguistic::DictionaryError::NONE != nAddRes && 
xDictionary.is() && !xDictionary->getEntry(sWord).is())
-            {
-                SvxDicError(rWrtSh.GetView().GetFrameWeld(), nAddRes);
-            }
+            AddWordToWordbook(LinguMgr::GetIgnoreAllList(), rWrtSh);
+        }
+    }
+    break;
+    case SID_ADD_TO_WORDBOOK:
+    {
+        OUString aDicName;
+        if (const SfxStringItem* pItem1 = 
rReq.GetArg<SfxStringItem>(FN_PARAM_1))
+            aDicName = pItem1->GetValue();
+
+        uno::Reference<linguistic2::XSearchableDictionaryList> 
xDicList(LinguMgr::GetDictionaryList());
+        uno::Reference<linguistic2::XDictionary> xDic = xDicList.is() ? 
xDicList->getDictionaryByName(aDicName) : nullptr;
+        if (AddWordToWordbook(xDic, rWrtSh))
+        {
+            // save modified user-dictionary if it is persistent
+            uno::Reference<frame::XStorable> xSavDic(xDic, uno::UNO_QUERY);
+            if (xSavDic.is())
+                xSavDic->store();
         }
+        break;
     }
     break;
     case SID_SPELLCHECK_APPLY_SUGGESTION:

Reply via email to