diff options
Diffstat (limited to 'cui/source/dialogs/SpellDialog.cxx')
-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); |