From c2f58bc25cedf8a13a978b52a5bf012809fc38ed Mon Sep 17 00:00:00 2001 From: Tamás Zolnai Date: Sun, 17 Nov 2019 14:17:59 +0100 Subject: SpellingPopup: Convert suggestion menu items to use slot ID. Change-Id: Icf1f50d04ab5e7ba467d68613f4101a3fe48589b --- sw/source/uibase/lingu/olmenu.cxx | 41 +++++++++--------- sw/source/uibase/shells/textsh1.cxx | 85 ++++++++++++++++++++++++++++++++++++- 2 files changed, 106 insertions(+), 20 deletions(-) diff --git a/sw/source/uibase/lingu/olmenu.cxx b/sw/source/uibase/lingu/olmenu.cxx index f04fb6b71880..e08c5f4a2804 100644 --- a/sw/source/uibase/lingu/olmenu.cxx +++ b/sw/source/uibase/lingu/olmenu.cxx @@ -636,26 +636,29 @@ void SwSpellPopup::Execute( sal_uInt16 nId ) if (/*m_bGrammarResults && */nId == MN_SHORT_COMMENT) return; // nothing to do since it is the error message (short comment) - if ((MN_SUGGESTION_START <= nId && nId <= MN_SUGGESTION_END) || - (MN_AUTOCORR_START <= nId && nId <= MN_AUTOCORR_END)) + if (MN_SUGGESTION_START <= nId && nId <= MN_SUGGESTION_END) { - OUString sNewWord; - if (MN_AUTOCORR_START <= nId && nId <= MN_AUTOCORR_END) - { - PopupMenu* pMenu = m_xPopupMenu->GetPopupMenu(m_nCorrectMenuId); - assert(pMenu); - sNewWord = pMenu->GetItemText(nId); - } - else - sNewWord = m_xPopupMenu->GetItemText(nId); - - if (m_bGrammarResults || m_xSpellAlt.is()) + OUString sApplyRule("Replace_"); + if(m_bGrammarResults) + sApplyRule += "Grammar_"; + else if (m_xSpellAlt.is()) + sApplyRule += "Spelling_"; + sApplyRule += m_xPopupMenu->GetItemText(nId); + + SfxStringItem aApplyItem(FN_PARAM_1, sApplyRule); + m_pSh->GetView().GetViewFrame()->GetDispatcher()->ExecuteList(SID_APPLY_SPELLCHECKING, SfxCallMode::SYNCHRON, { &aApplyItem }); + } + else if(MN_AUTOCORR_START <= nId && nId <= MN_AUTOCORR_END) + { + if (m_xSpellAlt.is()) { bool bOldIns = m_pSh->IsInsMode(); m_pSh->SetInsMode(); - OUString aTmp( sNewWord ); - OUString aOrig( m_bGrammarResults ? OUString() : m_xSpellAlt->getWord() ); + PopupMenu* pMenu = m_xPopupMenu->GetPopupMenu(m_nCorrectMenuId); + assert(pMenu); + OUString aTmp( pMenu->GetItemText(nId) ); + OUString aOrig( m_xSpellAlt->getWord() ); // if original word has a trailing . (likely the end of a sentence) // and the replacement text hasn't, then add it to the replacement @@ -688,11 +691,11 @@ void SwSpellPopup::Execute( sal_uInt16 nId ) // record only if it's NOT already present in autocorrection SvxAutoCorrect* pACorr = SvxAutoCorrCfg::Get().GetAutoCorrect(); - OUString aOrigWord( m_bGrammarResults ? OUString() : m_xSpellAlt->getWord() ) ; - SvxPrepareAutoCorrect( aOrigWord, sNewWord ); + OUString aOrigWord( m_xSpellAlt->getWord() ) ; + OUString aNewWord( pMenu->GetItemText(nId) ); + SvxPrepareAutoCorrect( aOrigWord, aNewWord ); - if (MN_AUTOCORR_START <= nId && nId <= MN_AUTOCORR_END) - pACorr->PutText( aOrigWord, sNewWord, m_nCheckedLanguage ); + pACorr->PutText( aOrigWord, aNewWord, m_nCheckedLanguage ); /* #102505# EndAction/EndUndo moved down since insertion of temporary auto correction is now undoable two and diff --git a/sw/source/uibase/shells/textsh1.cxx b/sw/source/uibase/shells/textsh1.cxx index bff08a595f18..4db7fd030846 100644 --- a/sw/source/uibase/shells/textsh1.cxx +++ b/sw/source/uibase/shells/textsh1.cxx @@ -128,6 +128,7 @@ #include #include #include +#include using namespace ::com::sun::star; using namespace com::sun::star::beans; @@ -1444,7 +1445,7 @@ void SwTextShell::Execute(SfxRequest &rReq) const OUString sIgnoreAllPrefix("IgnoreAll_"); const OUString sSpellingRule("Spelling"); const OUString sGrammarRule("Grammar"); - //const OUString aReplacePrefix("Replace_"); + const OUString aReplacePrefix("Replace_"); // Ignore the word at the cursor pos sal_Int32 nPos = 0; @@ -1500,6 +1501,88 @@ void SwTextShell::Execute(SfxRequest &rReq) } } } + // Replace text with the suggestion + else if (-1 != (nPos = sApplyText.indexOf( aReplacePrefix ))) + { + sApplyText = sApplyText.replaceAt(nPos, aReplacePrefix.getLength(), ""); + + const OUString sSpellingRule2(sSpellingRule + "_"); + const OUString sGrammarRule2(sGrammarRule + "_"); + bool bGrammar = false; + uno::Reference< linguistic2::XSpellAlternatives > xSpellAlt; + if(-1 != (nPos = sApplyText.indexOf( sGrammarRule2 ))) + { + sApplyText = sApplyText.replaceAt(nPos, sGrammarRule2.getLength(), ""); + linguistic2::ProofreadingResult aGrammarCheckRes; + sal_Int32 nErrorInResult = -1; + uno::Sequence< OUString > aSuggestions; + sal_Int32 nErrorPosInText = -1; + SwRect aToFill; + bGrammar = rWrtSh.GetGrammarCorrection( aGrammarCheckRes, nErrorPosInText, nErrorInResult, aSuggestions, nullptr, aToFill ); + } + else if (-1 != (nPos = sApplyText.indexOf( sSpellingRule2 ))) + { + sApplyText = sApplyText.replaceAt(nPos, sSpellingRule2.getLength(), ""); + SwRect aToFill; + xSpellAlt.set(rWrtSh.GetCorrection(nullptr, aToFill)); + bGrammar = false; + } + + if (!bGrammar && !xSpellAlt.is()) + return; + + bool bOldIns = rWrtSh.IsInsMode(); + rWrtSh.SetInsMode(); + + OUString aTmp( sApplyText ); + OUString aOrig( bGrammar ? OUString() : xSpellAlt->getWord() ); + + // if original word has a trailing . (likely the end of a sentence) + // and the replacement text hasn't, then add it to the replacement + if (!aTmp.isEmpty() && !aOrig.isEmpty() && + aOrig.endsWith(".") && /* !IsAlphaNumeric ??*/ + !aTmp.endsWith(".")) + { + aTmp += "."; + } + + SwRewriter aRewriter; + + aRewriter.AddRule(UndoArg1, rWrtSh.GetCursorDescr()); + aRewriter.AddRule(UndoArg2, SwResId(STR_YIELDS)); + + OUString aTmpStr = SwResId(STR_START_QUOTE) + + aTmp + SwResId(STR_END_QUOTE); + aRewriter.AddRule(UndoArg3, aTmpStr); + + rWrtSh.StartUndo(SwUndoId::UI_REPLACE, &aRewriter); + rWrtSh.StartAction(); + rWrtSh.DelLeft(); + + rWrtSh.Insert( aTmp ); + + /* #102505# EndAction/EndUndo moved down since insertion + of temporary auto correction is now undoable two and + must reside in the same undo group.*/ + + // record only if it's NOT already present in autocorrection + SvxAutoCorrect* pACorr = SvxAutoCorrCfg::Get().GetAutoCorrect(); + + OUString aOrigWord( bGrammar ? OUString() : xSpellAlt->getWord() ) ; + OUString aNewWord( sApplyText ); + SvxPrepareAutoCorrect( aOrigWord, aNewWord ); + + if (xSpellAlt.is()) + pACorr->PutText( aOrigWord, aNewWord, LanguageTag( xSpellAlt->getLocale() ).getLanguageType() ); + + /* #102505# EndAction/EndUndo moved down since insertion + of temporary auto correction is now undoable two and + must reside in the same undo group.*/ + rWrtSh.EndAction(); + rWrtSh.EndUndo(); + + rWrtSh.SetInsMode( bOldIns ); + } } break; default: -- cgit v1.2.3