diff options
author | László Németh <nemeth@numbertext.org> | 2022-04-27 12:18:22 +0200 |
---|---|---|
committer | László Németh <nemeth@numbertext.org> | 2022-04-27 16:36:44 +0200 |
commit | d1d23f01ed321b088c26217e9be367c0fe8121af (patch) | |
tree | 370269bb892bc6bcc7cc30d3eaa2043d32980035 | |
parent | 8ae17abbcce62dab714e8e36ef5225e6fef75334 (diff) |
tdf#85610 sw: show tracked footnote insertion/deletion
also in the footnote area by formatting the footnote
number there as the footnote index number in the main
text (i.e. as anchor of the footnote).
Previously deleted footnotes were shown as not
deleted footnotes in Show Changes mode, also inserted
footnotes lost their footnote number formatting (i.e.
author color of the tracked change, and e.g. the default
underline) after file saving.
Note: for a working test, fix also MetafileXmlDump by
removing the bad 0x01 from the XML dump, which resulted
by the not expanded footnote index placeholder character.
Change-Id: Ie003f4e19d2e2cee6f09d3b195db69fe5c10e405
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/133503
Tested-by: Jenkins
Reviewed-by: László Németh <nemeth@numbertext.org>
-rw-r--r-- | sw/qa/extras/layout/data/tdf85610.fodt | 56 | ||||
-rw-r--r-- | sw/qa/extras/layout/layout2.cxx | 18 | ||||
-rw-r--r-- | sw/source/core/text/txtftn.cxx | 37 | ||||
-rw-r--r-- | vcl/source/gdi/mtfxmldump.cxx | 10 |
4 files changed, 120 insertions, 1 deletions
diff --git a/sw/qa/extras/layout/data/tdf85610.fodt b/sw/qa/extras/layout/data/tdf85610.fodt new file mode 100644 index 000000000000..17c51096db12 --- /dev/null +++ b/sw/qa/extras/layout/data/tdf85610.fodt @@ -0,0 +1,56 @@ +<?xml version="1.0" encoding="UTF-8"?> + +<office:document xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office: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:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0" xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0" xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:meta="urn:oasis:names:tc:opendocument:xmlns:meta:1.0" xmlns:number="urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0" xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0" xmlns:chart="urn:oasis:names:tc:opendocument:xmlns:chart:1.0" xmlns:dr3d="urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0" xmlns:math="http://www.w3.org/1998/Math/MathML" xmlns:form="urn:oasis:names:tc:opendocument:xmlns:form:1.0" xmlns:script="urn:oasis:names:tc:opendocument:xmlns:script:1.0" xmlns:config="urn:oasis:names:tc:opendocument:xmlns:config:1.0" xmlns:ooo="http://openoffice.org/2004/office" xmlns:ooow="http://openoffice.org/2004/writer" xmlns:oooc="http://openoffice.org/2004/calc" xmlns:dom="http://www.w3.org/2001/xml-events" xmlns:xforms="http://www.w3.org/2002/xforms" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:rpt="http://openoffice.org/2005/report" xmlns:of="urn:oasis:names:tc:opendocument:xmlns:of:1.2" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:grddl="http://www.w3.org/2003/g/data-view#" xmlns:officeooo="http://openoffice.org/2009/office" xmlns:tableooo="http://openoffice.org/2009/table" xmlns:drawooo="http://openoffice.org/2010/draw" xmlns:calcext="urn:org:documentfoundation:names:experimental:calc:xmlns:calcext:1.0" xmlns:loext="urn:org:documentfoundation:names:experimental:office:xmlns:loext:1.0" xmlns:field="urn:openoffice:names:experimental:ooo-ms-interop:xmlns:field:1.0" xmlns:formx="urn:openoffice:names:experimental:ooxml-odf-interop:xmlns:form:1.0" xmlns:css3t="http://www.w3.org/TR/css3-text/" office:version="1.2" office:mimetype="application/vnd.oasis.opendocument.text"> + <office:automatic-styles> + <style:style style:name="P1" style:family="paragraph" style:parent-style-name="Standard" style:list-style-name="L1"> + <style:text-properties officeooo:rsid="001fa9e2" officeooo:paragraph-rsid="001fa9e2"/> + </style:style> + <text:list-style style:name="L1"> + <text:list-level-style-number text:level="1" text:style-name="Numbering_20_Symbols" style:num-suffix="." style:num-format="1"> + <style:list-level-properties text:list-level-position-and-space-mode="label-alignment"> + <style:list-level-label-alignment text:label-followed-by="listtab" text:list-tab-stop-position="1.27cm" fo:text-indent="-0.635cm" fo:margin-left="1.27cm"/> + </style:list-level-properties> + </text:list-level-style-number> + </text:list-style> + </office:automatic-styles> + <office:body> + <office:text> + <text:tracked-changes text:track-changes="false"> + <text:changed-region xml:id="ct94243390468896" text:id="ct94243390468896"> + <text:insertion> + <office:change-info> + <dc:creator>C</dc:creator> + <dc:date>2022-04-27T11:06:53</dc:date> + </office:change-info> + </text:insertion> + </text:changed-region> + <text:changed-region xml:id="ct94243403412256" text:id="ct94243403412256"> + <text:deletion> + <office:change-info> + <dc:creator>C</dc:creator> + <dc:date>2022-04-27T11:07:06</dc:date> + </office:change-info> + </text:deletion> + </text:changed-region> + <text:changed-region xml:id="ct94243407515552" text:id="ct94243407515552"> + <text:insertion> + <office:change-info> + <dc:creator>C</dc:creator> + <dc:date>2022-04-27T11:06:51</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-decls> + <text:p text:style-name="P3"><text:span text:style-name="T1">Lorem.</text:span><text:change-start text:change-id="ct94243403412256"/><text:span text:style-name="T1"><text:note text:id="ftn2" text:note-class="footnote"><text:note-citation>1</text:note-citation><text:note-body> + <text:p text:style-name="P1">Ipsum.</text:p></text:note-body></text:note></text:span><text:change-end text:change-id="ct94243403412256"/></text:p> + <text:p text:style-name="P3"><text:span text:style-name="T1">Dolor sit.</text:span><text:change-start text:change-id="ct94243407515552"/><text:span text:style-name="T1"><text:note text:id="ftn1" text:note-class="footnote"><text:note-citation>2</text:note-citation><text:note-body> + <text:p text:style-name="P1"><text:change-start text:change-id="ct94243390468896"/>Amet.<text:change-end text:change-id="ct94243390468896"/></text:p></text:note-body></text:note></text:span><text:change-end text:change-id="ct94243407515552"/></text:p> + </office:text> + </office:body> +</office:document> diff --git a/sw/qa/extras/layout/layout2.cxx b/sw/qa/extras/layout/layout2.cxx index 6c059f0f57c4..02b40c21b5ef 100644 --- a/sw/qa/extras/layout/layout2.cxx +++ b/sw/qa/extras/layout/layout2.cxx @@ -302,6 +302,24 @@ CPPUNIT_TEST_FIXTURE(SwLayoutWriter2, testRedlineNumberInNumbering) assertXPath(pXmlDoc, "/metafile/push/push/push/font[4][@color='#000000']", 0); } +CPPUNIT_TEST_FIXTURE(SwLayoutWriter2, testRedlineNumberInFootnote) +{ + SwDoc* pDoc = createSwDoc(DATA_DIRECTORY, "tdf85610.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); + + // changed color of numbers of footnote 1 (deleted footnote) and footnote 2 (inserted footnote) + // decreased the black <font> elements by 2: + // This was 7 + assertXPath(pXmlDoc, "/metafile/push/push/push/font[@color='#000000']", 5); +} + CPPUNIT_TEST_FIXTURE(SwLayoutWriter2, testRedlineMoving) { SwDoc* pDoc = createSwDoc(DATA_DIRECTORY, "tdf42748.fodt"); diff --git a/sw/source/core/text/txtftn.cxx b/sw/source/core/text/txtftn.cxx index ce7756c23a45..64d0f0418286 100644 --- a/sw/source/core/text/txtftn.cxx +++ b/sw/source/core/text/txtftn.cxx @@ -53,6 +53,13 @@ #include <frmtool.hxx> #include <ndindex.hxx> #include <IDocumentSettingAccess.hxx> +#include <IDocumentRedlineAccess.hxx> +#include <swmodule.hxx> +#include <unotextrange.hxx> +#include <redline.hxx> +#include <editeng/colritem.hxx> +#include <editeng/udlnitem.hxx> +#include <editeng/crossedoutitem.hxx> #include <com/sun/star/beans/XPropertySet.hpp> #include <com/sun/star/awt/CharSet.hpp> @@ -990,6 +997,36 @@ SwNumberPortion *SwTextFormatter::NewFootnoteNumPortion( SwTextFormatInfo const pNumFnt->SetDiffFnt(&rSet, pIDSA ); pNumFnt->SetVertical( pNumFnt->GetOrientation(), m_pFrame->IsVertical() ); + // tdf#85610 apply redline coloring to the footnote numbering in the footnote area + SwUnoInternalPaM aPam(*pDoc); + if ( ::sw::XTextRangeToSwPaM(aPam, xAnchor) ) + { + SwRedlineTable::size_type nRedlinePos = 0; + const SwRedlineTable& rTable = pDoc->getIDocumentRedlineAccess().GetRedlineTable(); + const SwRangeRedline* pRedline = rTable.FindAtPosition( *aPam.Start(), nRedlinePos ); + if (pRedline) + { + SwAttrPool& rPool = pDoc->GetAttrPool(); + SfxItemSetFixed<RES_CHRATR_BEGIN, RES_CHRATR_END-1> aSet(rPool); + + std::size_t aAuthor = (1 < pRedline->GetStackCount()) + ? pRedline->GetAuthor( 1 ) + : pRedline->GetAuthor(); + + if ( RedlineType::Delete == pRedline->GetType() ) + SW_MOD()->GetDeletedAuthorAttr(aAuthor, aSet); + else + SW_MOD()->GetInsertAuthorAttr(aAuthor, aSet); + + if (const SvxColorItem* pItem = aSet.GetItemIfSet(RES_CHRATR_COLOR)) + pNumFnt->SetColor(pItem->GetValue()); + if (const SvxUnderlineItem* pItem = aSet.GetItemIfSet(RES_CHRATR_UNDERLINE)) + pNumFnt->SetUnderline(pItem->GetLineStyle()); + if (const SvxCrossedOutItem* pItem = aSet.GetItemIfSet(RES_CHRATR_CROSSEDOUT)) + pNumFnt->SetStrikeout( pItem->GetStrikeout() ); + } + } + SwFootnoteNumPortion* pNewPor = new SwFootnoteNumPortion( aFootnoteText, std::move(pNumFnt) ); pNewPor->SetLeft( !m_pFrame->IsRightToLeft() ); return pNewPor; diff --git a/vcl/source/gdi/mtfxmldump.cxx b/vcl/source/gdi/mtfxmldump.cxx index f6e2a0bda869..26e1afd7a6c4 100644 --- a/vcl/source/gdi/mtfxmldump.cxx +++ b/vcl/source/gdi/mtfxmldump.cxx @@ -823,7 +823,15 @@ void MetafileXmlDump::writeXml(const GDIMetaFile& rMetaFile, tools::XmlWriter& r } rWriter.startElement("text"); - rWriter.content(pMetaTextArrayAction->GetText()); + + const OUString& rStr = pMetaTextArrayAction->GetText(); + // fix bad XML dump by removing forbidden 0x01 + // FIXME: expand footnote anchor point 0x01 instead of this + if ( rStr.indexOf(0x01) > -1 ) + rWriter.content(rStr.replaceAll("\001", "")); + else + rWriter.content(rStr); + rWriter.endElement(); rWriter.endElement(); |