diff options
author | Michael Stahl <Michael.Stahl@cib.de> | 2018-11-28 17:09:22 +0100 |
---|---|---|
committer | Michael Stahl <Michael.Stahl@cib.de> | 2018-12-01 08:44:45 +0100 |
commit | c03da6a4a429327244bbe27e32e2f6e82b18163d (patch) | |
tree | 0836823fd5fc6447e120089af46a09dda80aad33 /sw | |
parent | 9926ea7dd07f1f3d012ddf97941a42bb7fa5717d (diff) |
sw_redlinehide_4a: SwAutoFormat::AutoCorrect()
Change-Id: I0ab7665f8635d6716fce996408db1e2bedf54d0c
Diffstat (limited to 'sw')
-rw-r--r-- | sw/source/core/edit/autofmt.cxx | 117 |
1 files changed, 63 insertions, 54 deletions
diff --git a/sw/source/core/edit/autofmt.cxx b/sw/source/core/edit/autofmt.cxx index e9fa364fa267..d006febbcc51 100644 --- a/sw/source/core/edit/autofmt.cxx +++ b/sw/source/core/edit/autofmt.cxx @@ -186,7 +186,7 @@ class SwAutoFormat /// join with the previous paragraph void JoinPrevPara(); /// execute AutoCorrect on current TextNode - void AutoCorrect( sal_Int32 nSttPos = 0 ); + void AutoCorrect(TextFrameIndex nSttPos = TextFrameIndex(0)); bool CanJoin(const SwTextFrame * pNextFrame) const { @@ -1495,7 +1495,7 @@ void SwAutoFormat::BuildEnum( sal_uInt16 nLvl, sal_uInt16 nDigitLevel ) DeleteLeadingTrailingBlanks(); bool bChgBullet = false, bChgEnum = false; - sal_Int32 nAutoCorrPos = 0; + TextFrameIndex nAutoCorrPos(0); // if numbering is set, get the current one SwNumRule aRule( m_pDoc->GetUniqueNumRuleName(), @@ -1748,7 +1748,7 @@ void SwAutoFormat::BuildEnum( sal_uInt16 nLvl, sal_uInt16 nDigitLevel ) RES_CHRATR_FONT ) ); m_pDoc->SetFormatItemByAutoFormat( m_aDelPam, aSet ); m_aDelPam.DeleteMark(); - nAutoCorrPos = 2; + nAutoCorrPos = TextFrameIndex(2); aSet.ClearItem(); } SvxTabStopItem aTStops( RES_PARATR_TABSTOP ); @@ -1906,7 +1906,7 @@ void SwAutoFormat::BuildHeadLine( sal_uInt16 nLvl ) } /// Start autocorrection for the current TextNode -void SwAutoFormat::AutoCorrect( sal_Int32 nPos ) +void SwAutoFormat::AutoCorrect(TextFrameIndex nPos) { SvxAutoCorrect* pATst = SvxAutoCorrCfg::Get().GetAutoCorrect(); ACFlags aSvxFlags = pATst->GetFlags( ); @@ -1921,8 +1921,8 @@ void SwAutoFormat::AutoCorrect( sal_Int32 nPos ) !m_aFlags.bChgWeightUnderl && !m_aFlags.bAddNonBrkSpace) ) return; - const OUString* pText = &m_pCurTextNd->GetText(); - if (nPos >= pText->getLength()) + const OUString* pText = &m_pCurTextFrame->GetText(); + if (TextFrameIndex(pText->getLength()) <= nPos) return; bool bGetLanguage = m_aFlags.bChgOrdinalNumber || @@ -1931,14 +1931,13 @@ void SwAutoFormat::AutoCorrect( sal_Int32 nPos ) m_aFlags.bAddNonBrkSpace; m_aDelPam.DeleteMark(); - m_aDelPam.GetPoint()->nNode = m_aNdIdx; - m_aDelPam.GetPoint()->nContent.Assign( m_pCurTextNd, 0 ); + *m_aDelPam.GetPoint() = m_pCurTextFrame->MapViewToModelPos(TextFrameIndex(0)); SwAutoCorrDoc aACorrDoc( *m_pEditShell, m_aDelPam ); SwTextFrameInfo aFInfo( nullptr ); - sal_Int32 nSttPos, nLastBlank = nPos; + TextFrameIndex nSttPos, nLastBlank = nPos; bool bFirst = m_aFlags.bCapitalStartSentence, bFirstSent = bFirst; sal_Unicode cChar = 0; bool bNbspRunNext = false; @@ -1946,14 +1945,15 @@ void SwAutoFormat::AutoCorrect( sal_Int32 nPos ) CharClass& rAppCC = GetAppCharClass(); do { - while (nPos < pText->getLength() && IsSpace(cChar = (*pText)[nPos])) + while (nPos < TextFrameIndex(pText->getLength()) + && IsSpace(cChar = (*pText)[sal_Int32(nPos)])) ++nPos; - if (nPos == pText->getLength()) + if (nPos == TextFrameIndex(pText->getLength())) break; // that's it if( ( ( bReplaceQuote && '\"' == cChar ) || ( bReplaceSglQuote && '\'' == cChar ) ) && - (!nPos || ' ' == (*pText)[nPos-1])) + (!nPos || ' ' == (*pText)[sal_Int32(nPos)-1])) { // note: special case symbol fonts !!! @@ -1962,14 +1962,14 @@ void SwAutoFormat::AutoCorrect( sal_Int32 nPos ) if( !aFInfo.IsBullet( nPos )) { SetRedlineText( STR_AUTOFMTREDL_TYPO ); - m_aDelPam.GetPoint()->nContent = nPos; + *m_aDelPam.GetPoint() = m_pCurTextFrame->MapViewToModelPos(nPos); bool bSetHardBlank = false; OUString sReplace( pATst->GetQuote( aACorrDoc, - nPos, cChar, true )); + sal_Int32(nPos), cChar, true )); m_aDelPam.SetMark(); - m_aDelPam.GetPoint()->nContent = nPos+1; + m_aDelPam.GetPoint()->nContent = m_aDelPam.GetMark()->nContent.GetIndex() + 1; if( 2 == sReplace.getLength() && ' ' == sReplace[ 1 ]) { sReplace = sReplace.copy( 0, 1 ); @@ -1981,12 +1981,13 @@ void SwAutoFormat::AutoCorrect( sal_Int32 nPos ) { m_aNdIdx = m_aDelPam.GetPoint()->nNode; m_pCurTextNd = m_aNdIdx.GetNode().GetTextNode(); - pText = &m_pCurTextNd->GetText(); + m_pCurTextFrame = GetFrame( *m_pCurTextNd ); + pText = &m_pCurTextFrame->GetText(); m_aDelPam.SetMark(); aFInfo.SetFrame( nullptr ); } - nPos += sReplace.getLength() - 1; + nPos += TextFrameIndex(sReplace.getLength() - 1); m_aDelPam.DeleteMark(); if( bSetHardBlank ) { @@ -1998,11 +1999,11 @@ void SwAutoFormat::AutoCorrect( sal_Int32 nPos ) bool bCallACorr = false; int bBreak = 0; - if (nPos && IsSpace((*pText)[nPos-1])) + if (nPos && IsSpace((*pText)[sal_Int32(nPos) - 1])) nLastBlank = nPos; - for (nSttPos = nPos; !bBreak && nPos < pText->getLength(); ++nPos) + for (nSttPos = nPos; !bBreak && nPos < TextFrameIndex(pText->getLength()); ++nPos) { - cChar = (*pText)[nPos]; + cChar = (*pText)[sal_Int32(nPos)]; switch (cChar) { case '\"': @@ -2016,9 +2017,9 @@ void SwAutoFormat::AutoCorrect( sal_Int32 nPos ) { SetRedlineText( STR_AUTOFMTREDL_TYPO ); bool bSetHardBlank = false; - m_aDelPam.GetPoint()->nContent = nPos; + *m_aDelPam.GetPoint() = m_pCurTextFrame->MapViewToModelPos(nPos); OUString sReplace( pATst->GetQuote( aACorrDoc, - nPos, cChar, false )); + sal_Int32(nPos), cChar, false) ); if( 2 == sReplace.getLength() && ' ' == sReplace[ 0 ]) { @@ -2027,27 +2028,29 @@ void SwAutoFormat::AutoCorrect( sal_Int32 nPos ) } m_aDelPam.SetMark(); - m_aDelPam.GetPoint()->nContent = nPos+1; + m_aDelPam.GetPoint()->nContent = m_aDelPam.GetMark()->nContent.GetIndex() + 1; m_pDoc->getIDocumentContentOperations().ReplaceRange( m_aDelPam, sReplace, false ); if( m_aFlags.bWithRedlining ) { m_aNdIdx = m_aDelPam.GetPoint()->nNode; m_pCurTextNd = m_aNdIdx.GetNode().GetTextNode(); - pText = &m_pCurTextNd->GetText(); + m_pCurTextFrame = GetFrame( *m_pCurTextNd ); + pText = &m_pCurTextFrame->GetText(); m_aDelPam.SetMark(); m_aDelPam.DeleteMark(); aFInfo.SetFrame( nullptr ); } - nPos += sReplace.getLength() - 1; + nPos += TextFrameIndex(sReplace.getLength() - 1); m_aDelPam.DeleteMark(); if( bSetHardBlank ) { - m_aDelPam.GetPoint()->nContent = nPos; + *m_aDelPam.GetPoint() = m_pCurTextFrame->MapViewToModelPos(nPos); m_pDoc->getIDocumentContentOperations().InsertString( m_aDelPam, OUString(CHAR_HARDBLANK) ); - m_aDelPam.GetPoint()->nContent = ++nPos; + ++nPos; + *m_aDelPam.GetPoint() = m_pCurTextFrame->MapViewToModelPos(nPos); } } } @@ -2065,25 +2068,26 @@ void SwAutoFormat::AutoCorrect( sal_Int32 nPos ) ? STR_AUTOFMTREDL_BOLD : STR_AUTOFMTREDL_UNDER ); - sal_Unicode cBlank = nSttPos ? (*pText)[nSttPos - 1] : 0; - m_aDelPam.GetPoint()->nContent = nPos; + sal_Unicode cBlank = nSttPos ? (*pText)[sal_Int32(nSttPos) - 1] : 0; + *m_aDelPam.GetPoint() = m_pCurTextFrame->MapViewToModelPos(nPos); - if( pATst->FnChgWeightUnderl( aACorrDoc, *pText, nPos )) + if (pATst->FnChgWeightUnderl(aACorrDoc, *pText, sal_Int32(nPos))) { if( m_aFlags.bWithRedlining ) { m_aNdIdx = m_aDelPam.GetPoint()->nNode; m_pCurTextNd = m_aNdIdx.GetNode().GetTextNode(); - pText = &m_pCurTextNd->GetText(); + m_pCurTextFrame = GetFrame( *m_pCurTextNd ); + pText = &m_pCurTextFrame->GetText(); m_aDelPam.SetMark(); m_aDelPam.DeleteMark(); aFInfo.SetFrame( nullptr ); } //#125102# in case of the mode RedlineFlags::ShowDelete the ** are still contained in pText if(!(m_pDoc->getIDocumentRedlineAccess().GetRedlineFlags() & RedlineFlags::ShowDelete)) - nPos = m_aDelPam.GetPoint()->nContent.GetIndex() - 1; + nPos = m_pCurTextFrame->MapModelToViewPos(*m_aDelPam.GetPoint()) - TextFrameIndex(1); // Was a character deleted before starting? - if (cBlank && cBlank != (*pText)[nSttPos - 1]) + if (cBlank && cBlank != (*pText)[sal_Int32(nSttPos) - 1]) --nSttPos; } } @@ -2093,11 +2097,11 @@ void SwAutoFormat::AutoCorrect( sal_Int32 nPos ) if ( m_aFlags.bAddNonBrkSpace ) { LanguageType eLang = bGetLanguage - ? m_pCurTextNd->GetLang( nSttPos ) - : LANGUAGE_SYSTEM; + ? m_pCurTextFrame->GetLangOfChar(nSttPos, 0, true) + : LANGUAGE_SYSTEM; SetRedlineText( STR_AUTOFMTREDL_NON_BREAK_SPACE ); - if ( pATst->FnAddNonBrkSpace( aACorrDoc, *pText, nPos, eLang, bNbspRunNext ) ) + if (pATst->FnAddNonBrkSpace(aACorrDoc, *pText, sal_Int32(nPos), eLang, bNbspRunNext)) --nPos; } break; @@ -2109,7 +2113,7 @@ void SwAutoFormat::AutoCorrect( sal_Int32 nPos ) bFirstSent = true; SAL_FALLTHROUGH; default: - if( !( rAppCC.isLetterNumeric( *pText, nPos ) + if (!(rAppCC.isLetterNumeric(*pText, sal_Int32(nPos)) || '/' == cChar )) // '/' should not be a word separator (e.g. '1/2' needs to be handled as one word for replacement) { --nPos; // revert ++nPos which was decremented in for loop @@ -2121,7 +2125,7 @@ void SwAutoFormat::AutoCorrect( sal_Int32 nPos ) if( nPos == nSttPos ) { - if (++nPos == pText->getLength()) + if (++nPos == TextFrameIndex(pText->getLength())) bCallACorr = true; } else @@ -2129,18 +2133,19 @@ void SwAutoFormat::AutoCorrect( sal_Int32 nPos ) if( bCallACorr ) { - m_aDelPam.GetPoint()->nContent = nPos; + *m_aDelPam.GetPoint() = m_pCurTextFrame->MapViewToModelPos(nPos); SetRedlineText( STR_AUTOFMTREDL_USE_REPLACE ); if( m_aFlags.bAutoCorrect && - aACorrDoc.ChgAutoCorrWord( nSttPos, nPos, *pATst, nullptr ) ) + aACorrDoc.ChgAutoCorrWord(reinterpret_cast<sal_Int32&>(nSttPos), sal_Int32(nPos), *pATst, nullptr)) { - nPos = m_aDelPam.GetPoint()->nContent.GetIndex(); + nPos = m_pCurTextFrame->MapModelToViewPos(*m_aDelPam.GetPoint()) - TextFrameIndex(1); if( m_aFlags.bWithRedlining ) { m_aNdIdx = m_aDelPam.GetPoint()->nNode; m_pCurTextNd = m_aNdIdx.GetNode().GetTextNode(); - pText = &m_pCurTextNd->GetText(); + m_pCurTextFrame = GetFrame( *m_pCurTextNd ); + pText = &m_pCurTextFrame->GetText(); m_aDelPam.SetMark(); m_aDelPam.DeleteMark(); } @@ -2149,39 +2154,41 @@ void SwAutoFormat::AutoCorrect( sal_Int32 nPos ) } LanguageType eLang = bGetLanguage - ? m_pCurTextNd->GetLang( nSttPos ) - : LANGUAGE_SYSTEM; + ? m_pCurTextFrame->GetLangOfChar(nSttPos, 0, true) + : LANGUAGE_SYSTEM; if ( m_aFlags.bAddNonBrkSpace ) { SetRedlineText( STR_AUTOFMTREDL_NON_BREAK_SPACE ); - pATst->FnAddNonBrkSpace( aACorrDoc, *pText, nPos, eLang, bNbspRunNext ); + pATst->FnAddNonBrkSpace(aACorrDoc, *pText, sal_Int32(nPos), eLang, bNbspRunNext); } if( ( m_aFlags.bChgOrdinalNumber && SetRedlineText( STR_AUTOFMTREDL_ORDINAL ) && - pATst->FnChgOrdinalNumber( aACorrDoc, *pText, nSttPos, nPos, eLang ) ) || + pATst->FnChgOrdinalNumber(aACorrDoc, *pText, sal_Int32(nSttPos), sal_Int32(nPos), eLang)) || ( m_aFlags.bChgToEnEmDash && SetRedlineText( STR_AUTOFMTREDL_DASH ) && - pATst->FnChgToEnEmDash( aACorrDoc, *pText, nSttPos, nPos, eLang ) ) || + pATst->FnChgToEnEmDash(aACorrDoc, *pText, sal_Int32(nSttPos), sal_Int32(nPos), eLang)) || ( m_aFlags.bSetINetAttr && - (nPos == pText->getLength() || IsSpace((*pText)[nPos])) && + (nPos == TextFrameIndex(pText->getLength()) || IsSpace((*pText)[sal_Int32(nPos)])) && SetRedlineText( STR_AUTOFMTREDL_DETECT_URL ) && - pATst->FnSetINetAttr( aACorrDoc, *pText, nLastBlank, nPos, eLang ) ) ) - nPos = m_aDelPam.GetPoint()->nContent.GetIndex(); + pATst->FnSetINetAttr(aACorrDoc, *pText, sal_Int32(nLastBlank), sal_Int32(nPos), eLang))) + { + nPos = m_pCurTextFrame->MapModelToViewPos(*m_aDelPam.GetPoint()) - TextFrameIndex(1); + } else { // two capital letters at the beginning of a word? if( m_aFlags.bCapitalStartWord ) { SetRedlineText( STR_AUTOFMTREDL_CPTL_STT_WORD ); - pATst->FnCapitalStartWord( aACorrDoc, *pText, nSttPos, nPos, eLang ); + pATst->FnCapitalStartWord(aACorrDoc, *pText, sal_Int32(nSttPos), sal_Int32(nPos), eLang); } // capital letter at the beginning of a sentence? if( m_aFlags.bCapitalStartSentence && bFirst ) { SetRedlineText( STR_AUTOFMTREDL_CPTL_STT_SENT ); - pATst->FnCapitalStartSentence( aACorrDoc, *pText, true, nSttPos, nPos, eLang); + pATst->FnCapitalStartSentence(aACorrDoc, *pText, true, sal_Int32(nSttPos), sal_Int32(nPos), eLang); } bFirst = bFirstSent; @@ -2191,13 +2198,15 @@ void SwAutoFormat::AutoCorrect( sal_Int32 nPos ) { m_aNdIdx = m_aDelPam.GetPoint()->nNode; m_pCurTextNd = m_aNdIdx.GetNode().GetTextNode(); - pText = &m_pCurTextNd->GetText(); + m_pCurTextFrame = GetFrame( *m_pCurTextNd ); + pText = &m_pCurTextFrame->GetText(); m_aDelPam.SetMark(); m_aDelPam.DeleteMark(); } } } - } while (nPos < pText->getLength()); + } + while (nPos < TextFrameIndex(pText->getLength())); ClearRedlineText(); } |