diff options
author | László Németh <nemeth@numbertext.org> | 2021-12-07 13:14:29 +0100 |
---|---|---|
committer | László Németh <nemeth@numbertext.org> | 2021-12-08 14:11:47 +0100 |
commit | c6af542a31e167e5a01908d049e399ce06a5e4e4 (patch) | |
tree | fc9af1a229f082eb4046fc6c469d49801c9eef67 /sw | |
parent | 19d3ecf9334f9750c06feb7207ecc3c6b98ba086 (diff) |
tdf#146120 sw: show tracked table changes with different color
In Change Tracking, show deleted table rows in cyan and
inserted rows in pink. In this case, don't show original
table row or cell background.
Follow-up to commit f481c2c8e74bded11fac754e493560391229dbcd
"tdf#144057 sw track changes: hide deleted table rows".
Change-Id: Ib9cc411b62b92bc8a83dda7589f3e798f7e96f41
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/126482
Tested-by: László Németh <nemeth@numbertext.org>
Reviewed-by: László Németh <nemeth@numbertext.org>
(cherry picked from commit f348440e17debacbcba9153e238e010e8c020bdc)
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/126510
Tested-by: Jenkins
Diffstat (limited to 'sw')
-rw-r--r-- | sw/inc/swtable.hxx | 5 | ||||
-rw-r--r-- | sw/qa/extras/layout/data/changed_table_rows.fodt | 203 | ||||
-rw-r--r-- | sw/qa/extras/layout/layout2.cxx | 19 | ||||
-rw-r--r-- | sw/source/core/layout/paintfrm.cxx | 19 | ||||
-rw-r--r-- | sw/source/core/table/swtable.cxx | 38 |
5 files changed, 282 insertions, 2 deletions
diff --git a/sw/inc/swtable.hxx b/sw/inc/swtable.hxx index e4ba92aaa6df..652b254a8c86 100644 --- a/sw/inc/swtable.hxx +++ b/sw/inc/swtable.hxx @@ -359,6 +359,7 @@ class SW_DLLPUBLIC SwTableLine final : public SwClient // Client of FrameFor { SwTableBoxes m_aBoxes; SwTableBox *m_pUpper; + RedlineType m_eRedlineType; public: @@ -402,9 +403,13 @@ public: // Return with the redline, which associated to the row change (latest deletion // in the case of deleted row, the first insertion in the case of row insertion // or npos, if TextChangesOnly is true, i.e. the table row is not deleted or inserted). + // Cache also the type of the redline associated to the changed table row. SwRedlineTable::size_type UpdateTextChangesOnly(SwRedlineTable::size_type& rRedlinePos) const; // is it a tracked deleted row bool IsDeleted(SwRedlineTable::size_type& rRedlinePos) const; + // set/get (if it's possible, cached) redline type + RedlineType GetRedlineType() const; + void SetRedlineType(RedlineType eType) { m_eRedlineType = eType; } }; /// SwTableBox is one table cell in the document model. diff --git a/sw/qa/extras/layout/data/changed_table_rows.fodt b/sw/qa/extras/layout/data/changed_table_rows.fodt new file mode 100644 index 000000000000..43e3a833c390 --- /dev/null +++ b/sw/qa/extras/layout/data/changed_table_rows.fodt @@ -0,0 +1,203 @@ +<?xml version="1.0" encoding="UTF-8"?> + +<office:document xmlns:css3t="http://www.w3.org/TR/css3-text/" xmlns:grddl="http://www.w3.org/2003/g/data-view#" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:formx="urn:openoffice:names:experimental:ooxml-odf-interop:xmlns:form:1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:dom="http://www.w3.org/2001/xml-events" xmlns:form="urn:oasis:names:tc:opendocument:xmlns:form:1.0" xmlns:xforms="http://www.w3.org/2002/xforms" xmlns:field="urn:openoffice:names:experimental:ooo-ms-interop:xmlns:field:1.0" xmlns:loext="urn:org:documentfoundation:names:experimental:office:xmlns:loext:1.0" xmlns:script="urn:oasis:names:tc:opendocument:xmlns:script:1.0" xmlns:drawooo="http://openoffice.org/2010/draw" xmlns:math="http://www.w3.org/1998/Math/MathML" xmlns:tableooo="http://openoffice.org/2009/table" xmlns:of="urn:oasis:names:tc:opendocument:xmlns:of:1.2" xmlns:oooc="http://openoffice.org/2004/calc" xmlns:ooow="http://openoffice.org/2004/writer" xmlns:calcext="urn:org:documentfoundation:names:experimental:calc:xmlns:calcext:1.0" xmlns:config="urn:oasis:names:tc:opendocument:xmlns:config:1.0" xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:ooo="http://openoffice.org/2004/office" xmlns:chart="urn:oasis:names:tc:opendocument:xmlns:chart:1.0" xmlns:meta="urn:oasis:names:tc:opendocument:xmlns:meta:1.0" xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" xmlns:rpt="http://openoffice.org/2005/report" xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0" xmlns:officeooo="http://openoffice.org/2009/office" xmlns:dr3d="urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0" xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0" xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0" xmlns:number="urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0" office:version="1.3" office:mimetype="application/vnd.oasis.opendocument.text"> + <office:meta><meta:creation-date>2021-09-13T16:07:05.221699428</meta:creation-date><dc:date>2021-09-13T16:10:52.148997944</dc:date><meta:editing-duration>PT3M46S</meta:editing-duration><meta:editing-cycles>3</meta:editing-cycles><meta:generator>LibreOfficeDev/7.3.0.0.alpha0$Linux_X86_64 LibreOffice_project/ba346227f1c4f896b717676a7eae22fea222f3e4</meta:generator><meta:document-statistic meta:table-count="2" meta:image-count="0" meta:object-count="0" meta:page-count="4" meta:paragraph-count="5" meta:word-count="5" meta:character-count="12" meta:non-whitespace-character-count="12"/></office:meta> + <office:styles> + <style:default-style style:family="graphic"> + <style:graphic-properties svg:stroke-color="#3465a4" draw:fill-color="#729fcf" fo:wrap-option="no-wrap" draw:shadow-offset-x="0.3cm" draw:shadow-offset-y="0.3cm" draw:start-line-spacing-horizontal="0.283cm" draw:start-line-spacing-vertical="0.283cm" draw:end-line-spacing-horizontal="0.283cm" draw:end-line-spacing-vertical="0.283cm" style:flow-with-text="false"/> + <style:paragraph-properties style:text-autospace="ideograph-alpha" style:line-break="strict" style:font-independent-line-spacing="false"> + <style:tab-stops/> + </style:paragraph-properties> + <style:text-properties style:use-window-font-color="true" loext:opacity="0%" style:font-name="Liberation Serif" fo:font-size="12pt" fo:language="hu" fo:country="HU" style:letter-kerning="true" style:font-name-asian="Noto Serif CJK SC" style:font-size-asian="10.5pt" style:language-asian="zh" style:country-asian="CN" style:font-name-complex="Lohit Devanagari" style:font-size-complex="12pt" style:language-complex="hi" style:country-complex="IN"/> + </style:default-style> + <style:default-style style:family="paragraph"> + <style:paragraph-properties fo:orphans="2" fo:widows="2" fo:hyphenation-ladder-count="no-limit" style:text-autospace="ideograph-alpha" style:punctuation-wrap="hanging" style:line-break="strict" style:tab-stop-distance="1.251cm" style:writing-mode="page"/> + <style:text-properties style:use-window-font-color="true" loext:opacity="0%" style:font-name="Liberation Serif" fo:font-size="12pt" fo:language="hu" fo:country="HU" style:letter-kerning="true" style:font-name-asian="Noto Serif CJK SC" style:font-size-asian="10.5pt" style:language-asian="zh" style:country-asian="CN" style:font-name-complex="Lohit Devanagari" style:font-size-complex="12pt" style:language-complex="hi" style:country-complex="IN" fo:hyphenate="false" fo:hyphenation-remain-char-count="2" fo:hyphenation-push-char-count="2" loext:hyphenation-no-caps="false"/> + </style:default-style> + <style:default-style style:family="table"> + <style:table-properties table:border-model="collapsing"/> + </style:default-style> + <style:default-style style:family="table-row"> + <style:table-row-properties fo:keep-together="auto"/> + </style:default-style> + <style:style style:name="Standard" style:family="paragraph" style:class="text"/> + <style:style style:name="Heading" style:family="paragraph" style:parent-style-name="Standard" style:next-style-name="Text_20_body" style:class="text"> + <style:paragraph-properties fo:margin-top="0.423cm" fo:margin-bottom="0.212cm" style:contextual-spacing="false" fo:keep-with-next="always"/> + <style:text-properties style:font-name="Liberation Sans" fo:font-family="'Liberation Sans'" style:font-family-generic="swiss" style:font-pitch="variable" fo:font-size="14pt" style:font-name-asian="Noto Sans CJK SC" style:font-family-asian="'Noto Sans CJK SC'" style:font-family-generic-asian="system" style:font-pitch-asian="variable" style:font-size-asian="14pt" style:font-name-complex="Lohit Devanagari" style:font-family-complex="'Lohit Devanagari'" style:font-family-generic-complex="system" style:font-pitch-complex="variable" style:font-size-complex="14pt"/> + </style:style> + <style:style style:name="Text_20_body" style:display-name="Text body" style:family="paragraph" style:parent-style-name="Standard" style:class="text"> + <style:paragraph-properties fo:margin-top="0cm" fo:margin-bottom="0.247cm" style:contextual-spacing="false" fo:line-height="115%"/> + </style:style> + <style:style style:name="List" style:family="paragraph" style:parent-style-name="Text_20_body" style:class="list"> + <style:text-properties style:font-size-asian="12pt" style:font-name-complex="Lohit Devanagari1" style:font-family-complex="'Lohit Devanagari'"/> + </style:style> + <style:style style:name="Caption" style:family="paragraph" style:parent-style-name="Standard" style:class="extra"> + <style:paragraph-properties fo:margin-top="0.212cm" fo:margin-bottom="0.212cm" style:contextual-spacing="false" text:number-lines="false" text:line-number="0"/> + <style:text-properties fo:font-size="12pt" fo:font-style="italic" style:font-size-asian="12pt" style:font-style-asian="italic" style:font-name-complex="Lohit Devanagari1" style:font-family-complex="'Lohit Devanagari'" style:font-size-complex="12pt" style:font-style-complex="italic"/> + </style:style> + <style:style style:name="Index" style:family="paragraph" style:parent-style-name="Standard" style:class="index"> + <style:paragraph-properties text:number-lines="false" text:line-number="0"/> + <style:text-properties fo:language="zxx" fo:country="none" style:font-size-asian="12pt" style:language-asian="zxx" style:country-asian="none" style:font-name-complex="Lohit Devanagari1" style:font-family-complex="'Lohit Devanagari'" style:language-complex="zxx" style:country-complex="none"/> + </style:style> + <style:style style:name="Table_20_Contents" style:display-name="Table Contents" style:family="paragraph" style:parent-style-name="Standard" style:class="extra"> + <style:paragraph-properties fo:orphans="0" fo:widows="0" text:number-lines="false" text:line-number="0"/> + </style:style> + <style:style style:name="Line_20_numbering" style:display-name="Line numbering" style:family="text"/> + </office:styles> + <office:automatic-styles> + <style:style style:name="Table1" style:family="table"> + <style:table-properties style:width="17cm" table:align="margins" fo:background-color="transparent"> + <style:background-image/> + </style:table-properties> + </style:style> + <style:style style:name="Table1.A" style:family="table-column"> + <style:table-column-properties style:column-width="5.667cm" style:rel-column-width="21845*"/> + </style:style> + <style:style style:name="Table1.1" style:family="table-row"> + <style:table-row-properties loext:text-changes-only="false" fo:background-color="transparent"> + <style:background-image/> + </style:table-row-properties> + </style:style> + <style:style style:name="Table1.A1" style:family="table-cell"> + <style:table-cell-properties fo:padding="0.097cm" fo:border-left="0.05pt solid #000000" fo:border-right="none" fo:border-top="0.05pt solid #000000" fo:border-bottom="0.05pt solid #000000"/> + </style:style> + <style:style style:name="Table1.C1" style:family="table-cell"> + <style:table-cell-properties fo:background-color="#3faf46" fo:padding="0.097cm" fo:border="0.05pt solid #000000"> + <style:background-image/> + </style:table-cell-properties> + </style:style> + <style:style style:name="Table1.2" style:family="table-row"> + <style:table-row-properties fo:background-color="transparent"> + <style:background-image/> + </style:table-row-properties> + </style:style> + <style:style style:name="Table1.A2" style:family="table-cell"> + <style:table-cell-properties fo:padding="0.097cm" fo:border-left="0.05pt solid #000000" fo:border-right="none" fo:border-top="none" fo:border-bottom="0.05pt solid #000000"/> + </style:style> + <style:style style:name="Table1.B2" style:family="table-cell"> + <style:table-cell-properties fo:padding="0.097cm" fo:border-left="0.05pt solid #000000" fo:border-right="none" fo:border-top="none" fo:border-bottom="0.05pt solid #000000"/> + </style:style> + <style:style style:name="Table1.C2" style:family="table-cell"> + <style:table-cell-properties fo:background-color="#3faf46" fo:padding="0.097cm" fo:border-left="0.05pt solid #000000" fo:border-right="0.05pt solid #000000" fo:border-top="none" fo:border-bottom="0.05pt solid #000000"> + <style:background-image/> + </style:table-cell-properties> + </style:style> + <style:style style:name="Table1.A3" style:family="table-cell"> + <style:table-cell-properties fo:padding="0.097cm" fo:border-left="0.05pt solid #000000" fo:border-right="none" fo:border-top="none" fo:border-bottom="0.05pt solid #000000"/> + </style:style> + <style:style style:name="Table1.B3" style:family="table-cell"> + <style:table-cell-properties fo:padding="0.097cm" fo:border-left="0.05pt solid #000000" fo:border-right="none" fo:border-top="none" fo:border-bottom="0.05pt solid #000000"/> + </style:style> + <style:style style:name="P1" style:family="paragraph" style:parent-style-name="Table_20_Contents"> + <style:text-properties officeooo:rsid="00039297" officeooo:paragraph-rsid="00039297"/> + </style:style> + <style:page-layout style:name="pm1"> + <style:page-layout-properties fo:page-width="21.001cm" fo:page-height="29.7cm" style:num-format="1" style:print-orientation="portrait" fo:margin-top="2cm" fo:margin-bottom="2cm" fo:margin-left="2cm" fo:margin-right="2cm" style:writing-mode="lr-tb" style:footnote-max-height="0cm" loext:margin-gutter="0cm"> + <style:footnote-sep style:width="0.018cm" style:distance-before-sep="0.101cm" style:distance-after-sep="0.101cm" style:line-style="solid" style:adjustment="left" style:rel-width="25%" style:color="#000000"/> + </style:page-layout-properties> + <style:header-style/> + <style:footer-style/> + </style:page-layout> + </office:automatic-styles> + <office:master-styles> + <style:master-page style:name="Standard" style:page-layout-name="pm1" draw:style-name="dp1"/> + </office:master-styles> + <office:body> + <office:text> + <text:tracked-changes text:track-changes="false"> + <text:changed-region xml:id="ct94301112152528" text:id="ct94301112152528"> + <text:deletion> + <office:change-info> + <dc:creator>x</dc:creator> + <dc:date>2021-12-07T11:51:09</dc:date> + </office:change-info> + </text:deletion> + </text:changed-region> + <text:changed-region xml:id="ct94301107251280" text:id="ct94301107251280"> + <text:deletion> + <office:change-info> + <dc:creator>x</dc:creator> + <dc:date>2021-12-07T11:51:09</dc:date> + </office:change-info> + </text:deletion> + </text:changed-region> + <text:changed-region xml:id="ct94301038852272" text:id="ct94301038852272"> + <text:deletion> + <office:change-info> + <dc:creator>x</dc:creator> + <dc:date>2021-12-07T11:51:09</dc:date> + </office:change-info> + </text:deletion> + </text:changed-region> + <text:changed-region xml:id="ct94301110886240" text:id="ct94301110886240"> + <text:insertion> + <office:change-info> + <dc:creator>x</dc:creator> + <dc:date>2021-12-07T11:51:14</dc:date> + </office:change-info> + </text:insertion> + </text:changed-region> + <text:changed-region xml:id="ct94301114435136" text:id="ct94301114435136"> + <text:insertion> + <office:change-info> + <dc:creator>x</dc:creator> + <dc:date>2021-12-07T11:51:19</dc:date> + </office:change-info> + </text:insertion> + </text:changed-region> + <text:changed-region xml:id="ct94301112304320" text:id="ct94301112304320"> + <text:insertion> + <office:change-info> + <dc:creator>x</dc:creator> + <dc:date>2021-12-07T11:51:21</dc:date> + </office:change-info> + </text:insertion> + </text:changed-region> + </text:tracked-changes> + <text:sequence-decls> + <text:sequence-decl text:display-outline-level="0" text:name="Illustration"/> + <text:sequence-decl text:display-outline-level="0" text:name="Table"/> + <text:sequence-decl text:display-outline-level="0" text:name="Text"/> + <text:sequence-decl text:display-outline-level="0" text:name="Drawing"/> + <text:sequence-decl text:display-outline-level="0" text:name="Figure"/> + </text:sequence-decls> + <table:table table:name="Table1" table:style-name="Table1"> + <table:table-column table:style-name="Table1.A" table:number-columns-repeated="3"/> + <table:table-row table:style-name="Table1.1"> + <table:table-cell table:style-name="Table1.A1" office:value-type="string"> + <text:p text:style-name="P1"><text:change-start text:change-id="ct94301112152528"/>a<text:change-end text:change-id="ct94301112152528"/></text:p> + </table:table-cell> + <table:table-cell table:style-name="Table1.A1" office:value-type="string"> + <text:p text:style-name="P1"><text:change-start text:change-id="ct94301107251280"/>b<text:change-end text:change-id="ct94301107251280"/></text:p> + </table:table-cell> + <table:table-cell table:style-name="Table1.C1" office:value-type="string"> + <text:p text:style-name="P1"><text:change-start text:change-id="ct94301038852272"/>c<text:change-end text:change-id="ct94301038852272"/></text:p> + </table:table-cell> + </table:table-row> + <table:table-row table:style-name="Table1.2"> + <table:table-cell table:style-name="Table1.B3" office:value-type="string"> + <text:p text:style-name="P1">d</text:p> + </table:table-cell> + <table:table-cell table:style-name="Table1.B3" office:value-type="string"> + <text:p text:style-name="P1">e</text:p> + </table:table-cell> + <table:table-cell table:style-name="Table1.C2" office:value-type="string"> + <text:p text:style-name="P1">f</text:p> + </table:table-cell> + </table:table-row> + <table:table-row table:style-name="Table1.1"> + <table:table-cell table:style-name="Table1.B3" office:value-type="string"> + <text:p text:style-name="P1"><text:change-start text:change-id="ct94301110886240"/>g<text:change-end text:change-id="ct94301110886240"/></text:p> + </table:table-cell> + <table:table-cell table:style-name="Table1.B3" office:value-type="string"> + <text:p text:style-name="P1"><text:change-start text:change-id="ct94301114435136"/>h<text:change-end text:change-id="ct94301114435136"/></text:p> + </table:table-cell> + <table:table-cell table:style-name="Table1.C2" office:value-type="string"> + <text:p text:style-name="P1"><text:change-start text:change-id="ct94301112304320"/>i<text:change-end text:change-id="ct94301112304320"/></text:p> + </table:table-cell> + </table:table-row> + </table:table> + <text:p text:style-name="Standard"/> + </office:text> + </office:body> +</office:document> diff --git a/sw/qa/extras/layout/layout2.cxx b/sw/qa/extras/layout/layout2.cxx index 3ca1abc2747a..92910435383e 100644 --- a/sw/qa/extras/layout/layout2.cxx +++ b/sw/qa/extras/layout/layout2.cxx @@ -366,6 +366,25 @@ CPPUNIT_TEST_FIXTURE(SwLayoutWriter2, testTdf145719) assertXPath(pXmlDoc, "/metafile/push/push/push/textcolor[@color='#008000']", 4); } +CPPUNIT_TEST_FIXTURE(SwLayoutWriter2, testChangedTableRows) +{ + SwDoc* pDoc = createSwDoc(DATA_DIRECTORY, "changed_table_rows.fodt"); + SwDocShell* pShell = pDoc->GetDocShell(); + + // Dump the rendering of the first page as an XML file. + std::shared_ptr<GDIMetaFile> xMetaFile = pShell->GetPreviewMetaFile(); + MetafileXmlDump dumper; + xmlDocUniquePtr pXmlDoc = dumpAndParse(dumper, *xMetaFile); + CPPUNIT_ASSERT(pXmlDoc); + + // This was 0 (other color, not COL_AUTHOR_TABLE_DEL, color of the tracked row deletion) + assertXPath(pXmlDoc, "/metafile/push/push/push/push/push/fillcolor[@color='#fce6f4']", 1); + // This was 0 (other color, not COL_AUTHOR_TABLE_INS, color of the tracked row insertion) + assertXPath(pXmlDoc, "/metafile/push/push/push/push/push/fillcolor[@color='#e1f2fa']", 1); + // This was 3 (color of the cells of the last column, 2 of them disabled by change tracking ) + assertXPath(pXmlDoc, "/metafile/push/push/push/push/push/fillcolor[@color='#3faf46']", 1); +} + CPPUNIT_TEST_FIXTURE(SwLayoutWriter2, testTdf145225_RedlineMovingWithBadInsertion) { SwDoc* pDoc = createSwDoc(DATA_DIRECTORY, "tdf42748.fodt"); diff --git a/sw/source/core/layout/paintfrm.cxx b/sw/source/core/layout/paintfrm.cxx index 9abc517a2a4f..e356266b8795 100644 --- a/sw/source/core/layout/paintfrm.cxx +++ b/sw/source/core/layout/paintfrm.cxx @@ -75,6 +75,7 @@ #include <DocumentSettingManager.hxx> #include <IDocumentDeviceAccess.hxx> #include <IDocumentDrawModelAccess.hxx> +#include <IDocumentRedlineAccess.hxx> #include <ndole.hxx> #include <PostItMgr.hxx> @@ -6317,6 +6318,24 @@ void SwFrame::PaintSwFrameBackground( const SwRect &rRect, const SwPageFrame *pP drawinglayer::attribute::SdrAllFillAttributesHelperPtr aFillAttributes; bool bBack = GetBackgroundBrush( aFillAttributes, pItem, pCol, aOrigBackRect, bLowerMode, /*bConsiderTextBox=*/false ); + + // show track changes of table row + if( IsRowFrame() && !getRootFrame()->IsHideRedlines() ) + { + RedlineType eType = static_cast<const SwRowFrame*>(this)->GetTabLine()->GetRedlineType(); + if ( RedlineType::Delete == eType || RedlineType::Insert == eType ) + { + pCol = RedlineType::Delete == eType ? COL_AUTHOR_TABLE_DEL : COL_AUTHOR_TABLE_INS; + bBack = true; + } + } + else if ( bBack && IsCellFrame() && !getRootFrame()->IsHideRedlines() && + // skip cell background to show the row colored according to its tracked change + RedlineType::None != static_cast<const SwRowFrame*>(GetUpper())->GetTabLine()->GetRedlineType() ) + { + return; + } + //- Output if a separate background is used. bool bNoFlyBackground = !gProp.bSFlyMetafile && !bBack && IsFlyFrame(); if ( bNoFlyBackground ) diff --git a/sw/source/core/table/swtable.cxx b/sw/source/core/table/swtable.cxx index a272642125da..63d60625fea9 100644 --- a/sw/source/core/table/swtable.cxx +++ b/sw/source/core/table/swtable.cxx @@ -1451,8 +1451,9 @@ bool SwTable::IsTableComplex() const SwTableLine::SwTableLine( SwTableLineFormat *pFormat, sal_uInt16 nBoxes, SwTableBox *pUp ) - : SwClient( pFormat ), - m_pUpper( pUp ) + : SwClient( pFormat ) + , m_pUpper( pUp ) + , m_eRedlineType( RedlineType::None ) { m_aBoxes.reserve( nBoxes ); } @@ -1679,6 +1680,12 @@ SwRedlineTable::size_type SwTableLine::UpdateTextChangesOnly(SwRedlineTable::siz // TODO: check also text outside of the redlines } } + + // cache the result + const_cast<SwTableLine*>(this)->SetRedlineType( SwRedlineTable::npos == nRet + ? RedlineType::None + : aRedlineTable[ nRet ]->GetType()); + return nRet; } @@ -1695,6 +1702,33 @@ bool SwTableLine::IsDeleted(SwRedlineTable::size_type& rRedlinePos) const return false; } +RedlineType SwTableLine::GetRedlineType() const +{ + const SwRedlineTable& aRedlineTable = GetFrameFormat()->GetDoc()->getIDocumentRedlineAccess().GetRedlineTable(); + if ( aRedlineTable.empty() ) + return RedlineType::None; + + // check table row property "HasTextChangesOnly", if it's defined and its value is + // false, return with the cached redline type, if it exists, otherwise calculate it + const SvxPrintItem *pHasTextChangesOnlyProp = + GetFrameFormat()->GetAttrSet().GetItem<SvxPrintItem>(RES_PRINT); + if ( pHasTextChangesOnlyProp && !pHasTextChangesOnlyProp->GetValue() ) + { + if ( RedlineType::None != m_eRedlineType ) + return m_eRedlineType; + + SwRedlineTable::size_type nPos = 0; + nPos = UpdateTextChangesOnly(nPos); + if ( nPos != SwRedlineTable::npos ) + return aRedlineTable[nPos]->GetType(); + } + else if ( RedlineType::None != m_eRedlineType ) + // empty the cache + const_cast<SwTableLine*>(this)->SetRedlineType( RedlineType::None ); + + return RedlineType::None; +} + SwTableBox::SwTableBox( SwTableBoxFormat* pFormat, sal_uInt16 nLines, SwTableLine *pUp ) : SwClient(nullptr) , m_aLines() |