diff options
author | Caolán McNamara <caolanm@redhat.com> | 2020-04-24 16:38:26 +0100 |
---|---|---|
committer | Michael Stahl <michael.stahl@cib.de> | 2020-04-29 10:15:17 +0200 |
commit | 994526fadb3faeb57c47cf1060a2ad7d53bd4f94 (patch) | |
tree | 8a8e665878fec7f5608d5ec2e7f64a2ba5f3876b /cui | |
parent | 68f75fe0701fcf9b92c5f1b5fd5eeb9268297494 (diff) |
Resolves: tdf#132288 don't merge adjacent properties for spell checking
spell checking relies on each attribute chunk being unmerged with identical
adjacent chunks
squash includes...
nStartPosition and nEndPosition are always the same
and
tdf#132288 preservation of footnote depends on reverse iteration
like TextCharAttribList::FindAttrib does which spell checking
used before
commit 243b5b392906042ab03800e0b5765e6f3513372c
Author: Caolán McNamara <caolanm@redhat.com>
Date: Fri Jun 14 21:56:44 2019 +0100
weld SpellDialog
converted to use an EditEngine instead of a TextEngine in order to
be able to host it in a native widget
Change-Id: Ia835fa054cad0dee4304f16724b9eb0c29b46102
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/92772
Tested-by: Jenkins
Reviewed-by: Michael Stahl <michael.stahl@cib.de>
Diffstat (limited to 'cui')
-rw-r--r-- | cui/source/dialogs/SpellDialog.cxx | 37 |
1 files changed, 20 insertions, 17 deletions
diff --git a/cui/source/dialogs/SpellDialog.cxx b/cui/source/dialogs/SpellDialog.cxx index 9c65d47cf6da..85dc7027ceed 100644 --- a/cui/source/dialogs/SpellDialog.cxx +++ b/cui/source/dialogs/SpellDialog.cxx @@ -1111,6 +1111,8 @@ void SentenceEditWindow_Impl::SetDrawingArea(weld::DrawingArea* pDrawingArea) pDrawingArea->get_text_height() * 6); pDrawingArea->set_size_request(aSize.Width(), aSize.Height()); WeldEditView::SetDrawingArea(pDrawingArea); + // tdf#132288 don't merge equal adjacent attributes + m_xEditEngine->DisableAttributeExpanding(); } SentenceEditWindow_Impl::~SentenceEditWindow_Impl() @@ -1119,13 +1121,14 @@ SentenceEditWindow_Impl::~SentenceEditWindow_Impl() namespace { - const EECharAttrib* FindCharAttrib(int nStartPosition, int nEndPosition, sal_uInt16 nWhich, std::vector<EECharAttrib>& rAttribList) + const EECharAttrib* FindCharAttrib(int nPosition, sal_uInt16 nWhich, std::vector<EECharAttrib>& rAttribList) { - for (const auto& rTextAtr : rAttribList) + for (auto it = rAttribList.rbegin(); it != rAttribList.rend(); ++it) { + const auto& rTextAtr = *it; if (rTextAtr.pAttr->Which() != nWhich) continue; - if (rTextAtr.nStart <= nStartPosition && rTextAtr.nEnd >= nEndPosition) + if (rTextAtr.nStart <= nPosition && rTextAtr.nEnd >= nPosition) { return &rTextAtr; } @@ -1241,8 +1244,8 @@ bool SentenceEditWindow_Impl::KeyInput(const KeyEvent& rKeyEvt) m_xEditEngine->GetCharAttribs(0, aAttribList); auto nCursor = aCurrentSelection.nStartPos; - const EECharAttrib* pBackAttr = FindCharAttrib(nCursor, nCursor, EE_CHAR_BKGCOLOR, aAttribList); - const EECharAttrib* pErrorAttr = FindCharAttrib(nCursor, nCursor, EE_CHAR_GRABBAG, aAttribList); + const EECharAttrib* pBackAttr = FindCharAttrib(nCursor, EE_CHAR_BKGCOLOR, aAttribList); + const EECharAttrib* pErrorAttr = FindCharAttrib(nCursor, EE_CHAR_GRABBAG, aAttribList); const EECharAttrib* pBackAttrLeft = nullptr; const EECharAttrib* pErrorAttrLeft = nullptr; @@ -1268,8 +1271,8 @@ bool SentenceEditWindow_Impl::KeyInput(const KeyEvent& rKeyEvt) while (nCursor < aCurrentSelection.nEndPos) { ++nCursor; - const EECharAttrib* pIntBackAttr = FindCharAttrib(nCursor, nCursor, EE_CHAR_BKGCOLOR, aAttribList); - const EECharAttrib* pIntErrorAttr = FindCharAttrib(nCursor, nCursor, EE_CHAR_GRABBAG, aAttribList); + const EECharAttrib* pIntBackAttr = FindCharAttrib(nCursor, EE_CHAR_BKGCOLOR, aAttribList); + const EECharAttrib* pIntErrorAttr = FindCharAttrib(nCursor, EE_CHAR_GRABBAG, aAttribList); //if any attr has been found then BRACE if (pIntBackAttr || pIntErrorAttr) nSelectionType = BRACE; @@ -1311,8 +1314,8 @@ bool SentenceEditWindow_Impl::KeyInput(const KeyEvent& rKeyEvt) if (nCursor) { --nCursor; - pBackAttrLeft = FindCharAttrib(nCursor, nCursor, EE_CHAR_BKGCOLOR, aAttribList); - pErrorAttrLeft = FindCharAttrib(nCursor, nCursor, EE_CHAR_GRABBAG, aAttribList); + pBackAttrLeft = FindCharAttrib(nCursor, EE_CHAR_BKGCOLOR, aAttribList); + pErrorAttrLeft = FindCharAttrib(nCursor, EE_CHAR_GRABBAG, aAttribList); bHasFieldLeft = pBackAttrLeft !=nullptr; bHasErrorLeft = pErrorAttrLeft != nullptr; ++nCursor; @@ -1461,8 +1464,8 @@ bool SentenceEditWindow_Impl::KeyInput(const KeyEvent& rKeyEvt) //start position if (!IsUndoEditMode() && bIsErrorActive) { - const EECharAttrib* pFontColor = FindCharAttrib(nCursor, nCursor, EE_CHAR_COLOR, aAttribList); - const EECharAttrib* pErrorAttrib = FindCharAttrib(m_nErrorStart, m_nErrorStart, EE_CHAR_GRABBAG, aAttribList); + const EECharAttrib* pFontColor = FindCharAttrib(nCursor, EE_CHAR_COLOR, aAttribList); + const EECharAttrib* pErrorAttrib = FindCharAttrib(m_nErrorStart, EE_CHAR_GRABBAG, aAttribList); if (pFontColor && pErrorAttrib) { m_nErrorStart = pFontColor->nStart; @@ -1665,7 +1668,7 @@ int SentenceEditWindow_Impl::ChangeMarkedWord(const OUString& rNewWord, Language auto nDiffLen = rNewWord.getLength() - m_nErrorEnd + m_nErrorStart; //Remove spell error attribute m_xEditEngine->UndoActionStart(SPELLUNDO_MOVE_ERROREND); - const EECharAttrib* pErrorAttrib = FindCharAttrib(m_nErrorStart, m_nErrorStart, EE_CHAR_GRABBAG, aAttribList); + const EECharAttrib* pErrorAttrib = FindCharAttrib(m_nErrorStart, EE_CHAR_GRABBAG, aAttribList); DBG_ASSERT(pErrorAttrib, "no error attribute found"); bool bSpellErrorDescription = false; SpellErrorDescription aSpellErrorDescription; @@ -1676,7 +1679,7 @@ int SentenceEditWindow_Impl::ChangeMarkedWord(const OUString& rNewWord, Language bSpellErrorDescription = true; } - const EECharAttrib* pBackAttrib = FindCharAttrib(m_nErrorStart, m_nErrorStart, EE_CHAR_BKGCOLOR, aAttribList); + const EECharAttrib* pBackAttrib = FindCharAttrib(m_nErrorStart, EE_CHAR_BKGCOLOR, aAttribList); ESelection aSel(0, m_nErrorStart, 0, m_nErrorEnd); m_xEditEngine->QuickInsertText(rNewWord, aSel); @@ -1691,7 +1694,7 @@ int SentenceEditWindow_Impl::ChangeMarkedWord(const OUString& rNewWord, Language //attributes following an error at the start of the text are not moved but expanded from the //text engine - this is done to keep full-paragraph-attributes //in the current case that handling is not desired - const EECharAttrib* pLangAttrib = FindCharAttrib(m_nErrorEnd, m_nErrorEnd, EE_CHAR_LANGUAGE, aAttribList); + const EECharAttrib* pLangAttrib = FindCharAttrib(m_nErrorEnd, EE_CHAR_LANGUAGE, aAttribList); if (pLangAttrib && !pLangAttrib->nStart && pLangAttrib->nEnd == nTextLen) { @@ -1746,7 +1749,7 @@ bool SentenceEditWindow_Impl::GetErrorDescription(SpellErrorDescription& rSpellE std::vector<EECharAttrib> aAttribList; m_xEditEngine->GetCharAttribs(0, aAttribList); - if (const EECharAttrib* pEECharAttrib = FindCharAttrib(nPosition, nPosition, EE_CHAR_GRABBAG, aAttribList)) + if (const EECharAttrib* pEECharAttrib = FindCharAttrib(nPosition, EE_CHAR_GRABBAG, aAttribList)) { ExtractErrorDescription(*pEECharAttrib, rSpellErrorDescription); return true; @@ -1865,7 +1868,7 @@ svx::SpellPortions SentenceEditWindow_Impl::CreateSpellPortions() const const EECharAttrib* pError = nullptr; while (nCursor < nTextLen) { - const EECharAttrib* pLang = FindCharAttrib(nCursor, nCursor, EE_CHAR_LANGUAGE, aAttribList); + const EECharAttrib* pLang = FindCharAttrib(nCursor, EE_CHAR_LANGUAGE, aAttribList); if(pLang && pLang != pLastLang) { eLang = static_cast<const SvxLanguageItem*>(pLang->pAttr)->GetLanguage(); @@ -1873,7 +1876,7 @@ svx::SpellPortions SentenceEditWindow_Impl::CreateSpellPortions() const lcl_InsertBreakPosition_Impl(aBreakPositions, pLang->nEnd, eLang); pLastLang = pLang; } - pError = FindCharAttrib(nCursor, nCursor, EE_CHAR_GRABBAG, aAttribList); + pError = FindCharAttrib(nCursor, EE_CHAR_GRABBAG, aAttribList); if (pError && pLastError != pError) { lcl_InsertBreakPosition_Impl(aBreakPositions, pError->nStart, eLang); |