include/svx/ctredlin.hxx         |    1 
 sw/source/core/text/frmpaint.cxx |    4 +--
 sw/source/core/text/itrpaint.cxx |   18 ++++++++------
 sw/source/core/text/porlay.cxx   |    6 ++++
 sw/source/core/text/porlay.hxx   |    5 ++++
 sw/source/core/text/porrst.cxx   |   48 +++++++++++++++++++++++++--------------
 sw/source/core/text/porrst.hxx   |    5 +++-
 sw/source/core/text/redlnitr.cxx |    8 +++++-
 sw/source/core/text/redlnitr.hxx |    2 -
 9 files changed, 67 insertions(+), 30 deletions(-)

New commits:
commit 72ec44bc294dd814c0ba8657337b6b2646382b02
Author:     László Németh <nem...@numbertext.org>
AuthorDate: Mon Nov 2 20:22:55 2020 +0100
Commit:     László Németh <nem...@numbertext.org>
CommitDate: Tue Nov 3 07:50:54 2020 +0100

    tdf#105967 sw change tracking: fix line break symbol in empty line
    
    At line break symbol of inserted or deleted empty lines,
    paint strikeout/underline based on redline color. Keep also
    the underline and strikeout formattings of the line break symbol
    in neutral color (NON_PRINTING_CHARACTER_COLOR), if they are not
    affected by change tracking.
    
    Note: in non empty lines, remove also the colored (not
    NON_PRINTING_CHARACTER_COLOR) underline/strikeout,
    if it's not based on redlining, fixing the double
    colored lines on the neutral color line break symbol.
    
    Follow-up of db25f1e2e3ae7a078f8f3c080ff3c4802f83b853
    (tdf#105967 sw change tracking: fix pilcrow in empty line).
    
    Change-Id: I565a10154f5ecbefeb00fe3e17a53f74f2f84e63
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/105206
    Tested-by: Jenkins
    Reviewed-by: László Németh <nem...@numbertext.org>

diff --git a/include/svx/ctredlin.hxx b/include/svx/ctredlin.hxx
index 1b4dac85319b..4dd80bafd709 100644
--- a/include/svx/ctredlin.hxx
+++ b/include/svx/ctredlin.hxx
@@ -59,6 +59,7 @@ enum class RedlineType : sal_uInt16
     TableRowDelete = 0x7,// Table row has been deleted.
     TableCellInsert = 0x8,// Table cell has been inserted.
     TableCellDelete = 0x9,// Table cell has been deleted.
+    None = USHRT_MAX - 1, // special value to indicate missing redlining in 
some return value
     Any = USHRT_MAX // special value to indicate any redline type in some 
method calls
 };
 
diff --git a/sw/source/core/text/frmpaint.cxx b/sw/source/core/text/frmpaint.cxx
index d664b07c5d50..d64cd59eda59 100644
--- a/sw/source/core/text/frmpaint.cxx
+++ b/sw/source/core/text/frmpaint.cxx
@@ -502,7 +502,7 @@ bool SwTextFrame::PaintEmpty( const SwRect &rRect, bool 
bCheck ) const
         else if( pSh->GetWin() )
         {
             std::unique_ptr<SwFont> pFnt;
-            RedlineType eRedline = RedlineType::Any;
+            RedlineType eRedline = RedlineType::None;
             const SwTextNode& rTextNode = *GetTextNodeForParaProps();
             if ( rTextNode.HasSwAttrSet() )
             {
@@ -605,7 +605,7 @@ bool SwTextFrame::PaintEmpty( const SwRect &rRect, bool 
bCheck ) const
 
                     // show redline color and settings drawing a background 
pilcrow,
                     // but keep also other formattings (with neutral pilcrow 
color)
-                    if ( eRedline != RedlineType::Any )
+                    if ( eRedline != RedlineType::None )
                     {
                         pFnt->DrawText_( aDrawInf );
                         if ( eRedline == RedlineType::Delete )
diff --git a/sw/source/core/text/itrpaint.cxx b/sw/source/core/text/itrpaint.cxx
index d714f5c68b4c..866eaf929979 100644
--- a/sw/source/core/text/itrpaint.cxx
+++ b/sw/source/core/text/itrpaint.cxx
@@ -299,6 +299,14 @@ void SwTextPainter::DrawTextLine( const SwRect &rPaint, 
SwSaveClip &rClip,
                 pEndTempl = pPor;
         }
 
+        // set redlining for line break symbol
+        if ( pPor->IsBreakPortion() && GetInfo().GetOpt().IsParagraph() && 
GetRedln() )
+        {
+            SeekAndChg( GetInfo() );
+            if ( m_pCurr->GetRedlineEndType() != RedlineType::None )
+                static_cast<SwBreakPortion&>(*pPor).SetRedline( 
m_pCurr->GetRedlineEndType() );
+        }
+
         // A special case are GluePortions which output blanks.
 
         // 6168: Avoid that the rest of a FieldPortion gets the attributes of 
the
@@ -326,12 +334,7 @@ void SwTextPainter::DrawTextLine( const SwRect &rPaint, 
SwSaveClip &rClip,
             // Paragraph symbols should have the same font as the paragraph in 
front of them,
             // except for the case that there's redlining in the paragraph
             if( GetRedln() )
-            {
                 SeekAndChg( GetInfo() );
-                // paint redlining
-                if ( m_pCurr->HasRedline() )
-                    static_cast<SwBreakPortion&>(*pPor).PaintRedline( 
GetInfo() );
-            }
             else
                 SeekAndChgBefore( GetInfo() );
         }
@@ -433,6 +436,7 @@ void SwTextPainter::DrawTextLine( const SwRect &rPaint, 
SwSaveClip &rClip,
             GetInfo().GetIdx() >= 
TextFrameIndex(GetInfo().GetText().getLength()))
         {
             bool bHasRedlineEnd( GetRedln() && m_pCurr->HasRedlineEnd() );
+            RedlineType eRedlineEnd = bHasRedlineEnd ? 
m_pCurr->GetRedlineEndType() : RedlineType::None;
             if( bHasRedlineEnd )
             {
                 TextFrameIndex nOffset = GetInfo().GetIdx();
@@ -442,8 +446,8 @@ void SwTextPainter::DrawTextLine( const SwRect &rPaint, 
SwSaveClip &rClip,
                 GetRedln()->Seek(*m_pFont, pos.first->GetIndex(), pos.second, 
0);
             }
             const SwTmpEndPortion aEnd( *pEndTempl,
-                           bHasRedlineEnd ? m_pFont->GetUnderline() : 
LINESTYLE_NONE,
-                           bHasRedlineEnd ? m_pFont->GetStrikeout() : 
STRIKEOUT_NONE,
+                           bHasRedlineEnd && eRedlineEnd != 
RedlineType::Delete ? m_pFont->GetUnderline() : LINESTYLE_NONE,
+                           bHasRedlineEnd && eRedlineEnd == 
RedlineType::Delete ? m_pFont->GetStrikeout() : STRIKEOUT_NONE,
                            bHasRedlineEnd ? m_pFont->GetColor() : COL_AUTO );
             GetFnt()->ChgPhysFnt( GetInfo().GetVsh(), *pOut );
 
diff --git a/sw/source/core/text/porlay.cxx b/sw/source/core/text/porlay.cxx
index 148d909f6449..7a72d65b12f4 100644
--- a/sw/source/core/text/porlay.cxx
+++ b/sw/source/core/text/porlay.cxx
@@ -606,13 +606,16 @@ void SwLineLayout::CalcLine( SwTextFormatter &rLine, 
SwTextFormatInfo &rInf )
     {
         OUString sRedlineText;
         bool bHasRedlineEnd;
+        enum RedlineType eRedlineEnd;
         bHasRedline = rLine.GetRedln()->CheckLine(start.first->GetIndex(), 
start.second,
-            end.first->GetIndex(), end.second, sRedlineText, bHasRedlineEnd);
+            end.first->GetIndex(), end.second, sRedlineText, bHasRedlineEnd, 
eRedlineEnd);
         if( bHasRedline )
         {
             SetRedlineText( sRedlineText );
             if( bHasRedlineEnd )
                 SetRedlineEnd( bHasRedlineEnd );
+            if( eRedlineEnd != RedlineType::None )
+                SetRedlineEndType( eRedlineEnd );
         }
     }
     SetRedline( bHasRedline );
@@ -676,6 +679,7 @@ void SwLineLayout::ResetFlags()
     m_bFormatAdj = m_bDummy = m_bEndHyph = m_bMidHyph = m_bFly
     = m_bRest = m_bBlinking = m_bClipping = m_bContent = m_bRedline
     = m_bRedlineEnd = m_bForcedLeftMargin = m_bHanging = false;
+    m_eRedlineEnd = RedlineType::None;
 }
 
 SwLineLayout::SwLineLayout()
diff --git a/sw/source/core/text/porlay.hxx b/sw/source/core/text/porlay.hxx
index 5126460b5424..811f1b19331b 100644
--- a/sw/source/core/text/porlay.hxx
+++ b/sw/source/core/text/porlay.hxx
@@ -24,6 +24,7 @@
 #include <swrect.hxx>
 #include <swtypes.hxx>
 #include "portxt.hxx"
+#include <svx/ctredlin.hxx>
 
 #include <vector>
 #include <deque>
@@ -98,6 +99,8 @@ private:
     bool m_bHanging : 1; // Contains a hanging portion in the margin
     bool m_bUnderscore : 1;
 
+    enum RedlineType m_eRedlineEnd; // redline type of pilcrow and line break 
symbols
+
     OUString m_sRedlineText; // shortened text of (first) tracked deletion 
shown in margin
 
     SwTwips GetHangingMargin_() const;
@@ -133,6 +136,8 @@ public:
     bool HasRedline() const { return m_bRedline; }
     void SetRedlineEnd( const bool bNew ) { m_bRedlineEnd = bNew; }
     bool HasRedlineEnd() const { return m_bRedlineEnd; }
+    void SetRedlineEndType( const enum RedlineType eNew ) { m_eRedlineEnd = 
eNew; }
+    RedlineType GetRedlineEndType() const { return m_eRedlineEnd; }
     void SetRedlineText ( const OUString& sText ) { m_sRedlineText = sText; }
     const OUString* GetRedlineText() const { return &m_sRedlineText; }
     void SetForcedLeftMargin() { m_bForcedLeftMargin = true; }
diff --git a/sw/source/core/text/porrst.cxx b/sw/source/core/text/porrst.cxx
index a82ee74c1a94..f31c597eac57 100644
--- a/sw/source/core/text/porrst.cxx
+++ b/sw/source/core/text/porrst.cxx
@@ -72,8 +72,7 @@ void SwTmpEndPortion::Paint( const SwTextPaintInfo &rInf ) 
const
     if ( eUnderline != LINESTYLE_NONE || eStrikeout != STRIKEOUT_NONE )
     {
         aFont.SetColor( aColor );
-        // don't show underline with strikeout
-        aFont.SetUnderline( eStrikeout == STRIKEOUT_NONE ? eUnderline : 
LINESTYLE_NONE );
+        aFont.SetUnderline( eUnderline );
         aFont.SetStrikeout( eStrikeout );
 
         const_cast<SwTextPaintInfo&>(rInf).SetFont(&aFont);
@@ -98,6 +97,7 @@ SwBreakPortion::SwBreakPortion( const SwLinePortion &rPortion 
)
     : SwLinePortion( rPortion )
 {
     nLineLength = TextFrameIndex(1);
+    m_eRedline = RedlineType::None;
     SetWhichPor( PortionType::Break );
 }
 
@@ -115,24 +115,38 @@ SwLinePortion *SwBreakPortion::Compress()
 void SwBreakPortion::Paint( const SwTextPaintInfo &rInf ) const
 {
     if( rInf.OnWin() && rInf.GetOpt().IsLineBreak() )
+    {
         rInf.DrawLineBreak( *this );
-}
 
-void SwBreakPortion::PaintRedline( const SwTextPaintInfo &rInf ) const
-{
-    if( rInf.OnWin() && rInf.GetOpt().IsLineBreak() )
-    {
-        sal_Int16 nNoBreakWidth = 
rInf.GetTextSize(S_NOBREAK_FOR_REDLINE).Width();
-        if ( nNoBreakWidth > 0 )
+        // paint redlining
+        if (m_eRedline != RedlineType::None)
         {
-            // approximate portion size with multiple no-break spaces
-            // and draw these spaces (at least a single one) by DrawText
-            // painting the requested redline underline/strikeout
-            sal_Int16 nSpaces = (LINE_BREAK_WIDTH + nNoBreakWidth/2) / 
nNoBreakWidth;
-            OUStringBuffer aBuf(S_NOBREAK_FOR_REDLINE);
-            for (sal_Int16 i = 1; i < nSpaces; ++i)
-                aBuf.append(S_NOBREAK_FOR_REDLINE);
-            rInf.DrawText(aBuf.makeStringAndClear(), *this);
+            sal_Int16 nNoBreakWidth = 
rInf.GetTextSize(S_NOBREAK_FOR_REDLINE).Width();
+            if ( nNoBreakWidth > 0 )
+            {
+                // approximate portion size with multiple no-break spaces
+                // and draw these spaces (at least a single one) by DrawText
+                // painting the requested redline underline/strikeout
+                sal_Int16 nSpaces = (LINE_BREAK_WIDTH + nNoBreakWidth/2) / 
nNoBreakWidth;
+                OUStringBuffer aBuf(S_NOBREAK_FOR_REDLINE);
+                for (sal_Int16 i = 1; i < nSpaces; ++i)
+                    aBuf.append(S_NOBREAK_FOR_REDLINE);
+
+                const SwFont* pOldFnt = rInf.GetFont();
+
+                SwFont aFont(*pOldFnt);
+
+                if (m_eRedline == RedlineType::Delete)
+                    aFont.SetUnderline( LINESTYLE_NONE );
+                else
+                    aFont.SetStrikeout( STRIKEOUT_NONE );
+
+                const_cast<SwTextPaintInfo&>(rInf).SetFont(&aFont);
+
+                rInf.DrawText(aBuf.makeStringAndClear(), *this);
+
+                
const_cast<SwTextPaintInfo&>(rInf).SetFont(const_cast<SwFont*>(pOldFnt));
+            }
         }
     }
 }
diff --git a/sw/source/core/text/porrst.hxx b/sw/source/core/text/porrst.hxx
index 32a94ca32e17..af678bb54fc2 100644
--- a/sw/source/core/text/porrst.hxx
+++ b/sw/source/core/text/porrst.hxx
@@ -24,6 +24,7 @@
 #include <TextFrameIndex.hxx>
 #include <txttypes.hxx>
 #include <txtfrm.hxx>
+#include <svx/ctredlin.hxx>
 
 #include "porlin.hxx"
 #include "portxt.hxx"
@@ -55,6 +56,8 @@ public:
 
 class SwBreakPortion : public SwLinePortion
 {
+    RedlineType m_eRedline;
+
 public:
     explicit SwBreakPortion( const SwLinePortion &rPortion );
     // Returns 0 if we have no usable data
@@ -68,7 +71,7 @@ public:
     virtual void HandlePortion( SwPortionHandler& rPH ) const override;
 
     static constexpr OUStringLiteral S_NOBREAK_FOR_REDLINE = u"\u00A0";
-    void PaintRedline( const SwTextPaintInfo &rInf ) const;
+    void SetRedline( const RedlineType eRedline ) { m_eRedline = eRedline; }
 };
 
 class SwKernPortion : public SwLinePortion
diff --git a/sw/source/core/text/redlnitr.cxx b/sw/source/core/text/redlnitr.cxx
index 9dafe23aff05..4a6157581810 100644
--- a/sw/source/core/text/redlnitr.cxx
+++ b/sw/source/core/text/redlnitr.cxx
@@ -805,7 +805,7 @@ bool SwRedlineItr::ChkSpecialUnderline_() const
 bool SwRedlineItr::CheckLine(
         sal_uLong const nStartNode, sal_Int32 const nChkStart,
         sal_uLong const nEndNode, sal_Int32 nChkEnd, OUString& rRedlineText,
-        bool& bRedlineEnd)
+        bool& bRedlineEnd, RedlineType& eRedlineEnd)
 {
     // note: previously this would return true in the (!m_bShow && m_pExt)
     // case, but surely that was a bug?
@@ -818,6 +818,7 @@ bool SwRedlineItr::CheckLine(
     sal_Int32 nOldEnd = m_nEnd;
     SwRedlineTable::size_type const nOldAct = m_nAct;
     bool bRet = bRedlineEnd = false;
+    eRedlineEnd = RedlineType::None;
 
     for (m_nAct = m_nFirst; m_nAct < 
m_rDoc.getIDocumentRedlineAccess().GetRedlineTable().size(); ++m_nAct)
     {
@@ -831,11 +832,16 @@ bool SwRedlineItr::CheckLine(
             bRet = true;
             if ( rRedlineText.isEmpty() && pRedline->GetType() == 
RedlineType::Delete )
                 rRedlineText = 
const_cast<SwRangeRedline*>(pRedline)->GetDescr(/*bSimplified=*/true);
+            // store redlining at paragraph break
             if ( COMPLETE_STRING == m_nEnd )
             {
+                eRedlineEnd = pRedline->GetType();
                 bRedlineEnd = true;
                 break;
             }
+            // store redlining at line end (for line break formatting)
+            else if ( nChkEnd <= m_nEnd )
+                eRedlineEnd = pRedline->GetType();
         }
     }
 
diff --git a/sw/source/core/text/redlnitr.hxx b/sw/source/core/text/redlnitr.hxx
index 0a60b414a9e2..1623a31aacc2 100644
--- a/sw/source/core/text/redlnitr.hxx
+++ b/sw/source/core/text/redlnitr.hxx
@@ -119,7 +119,7 @@ public:
     bool ChkSpecialUnderline() const
         { return IsOn() && ChkSpecialUnderline_(); }
     bool CheckLine(sal_uLong nStartNode, sal_Int32 nChkStart, sal_uLong 
nEndNode,
-        sal_Int32 nChkEnd, OUString& rRedlineText, bool& bRedlineEnd);
+        sal_Int32 nChkEnd, OUString& rRedlineText, bool& bRedlineEnd, 
RedlineType& eRedlineEnd);
     bool LeaveExtend(SwFont& rFnt, sal_uLong const nNode, sal_Int32 const nNew)
         { return m_pExt->Leave(rFnt, nNode, nNew); }
     bool ExtOn() {
_______________________________________________
Libreoffice-commits mailing list
libreoffice-comm...@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits

Reply via email to