summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLászló Németh <nemeth@numbertext.org>2023-05-26 18:47:57 +0200
committerLászló Németh <nemeth@numbertext.org>2023-06-02 03:57:30 +0200
commit472abf99a4d90d7a53316394a2e51a26b7e62345 (patch)
treeef686e0a6e5038e897ba2087da5a9db13a5ba7c2
parent389a8d52d9961f89c0b2847b30ee1ca59a8fdc80 (diff)
tdf#155341 sw tracked table column: add insertion
All the inserted cells get a dummy redline to store the change tracking metadata, setting also the HasTextChangesOnly bit of the table box to FALSE. Follow-up to commit ffd8d20d368a885d6d786749278fa438573227a7 "tdf#150673 sw xmloff: import/export tracked table column". Change-Id: I55f5a44ac0ec040993a100156665f116355c235a Reviewed-on: https://gerrit.libreoffice.org/c/core/+/152336 Tested-by: László Németh <nemeth@numbertext.org> Reviewed-by: László Németh <nemeth@numbertext.org>
-rw-r--r--sw/qa/extras/uiwriter/uiwriter5.cxx46
-rw-r--r--sw/source/core/table/swnewtable.cxx16
-rw-r--r--sw/source/core/table/swtable.cxx34
3 files changed, 82 insertions, 14 deletions
diff --git a/sw/qa/extras/uiwriter/uiwriter5.cxx b/sw/qa/extras/uiwriter/uiwriter5.cxx
index ec76c2589317..c8927ff15f52 100644
--- a/sw/qa/extras/uiwriter/uiwriter5.cxx
+++ b/sw/qa/extras/uiwriter/uiwriter5.cxx
@@ -2691,6 +2691,52 @@ CPPUNIT_TEST_FIXTURE(SwUiWriterTest5, testRedlineTableColumnDeletionWithDOCXExpo
assertXPath(pXmlDoc, "//page[1]//body/tab/row/cell", 1);
}
+CPPUNIT_TEST_FIXTURE(SwUiWriterTest5, testTdf155341_RedlineTableColumnInsertionWithExport)
+{
+ // load a table, and insert a new column with enabled change tracking
+ createSwDoc("tdf118311.fodt");
+ SwDoc* pDoc = getSwDoc();
+
+ // turn on red-lining and show changes
+ pDoc->getIDocumentRedlineAccess().SetRedlineFlags(RedlineFlags::On | RedlineFlags::ShowDelete
+ | RedlineFlags::ShowInsert);
+ CPPUNIT_ASSERT_MESSAGE("redlining should be on",
+ pDoc->getIDocumentRedlineAccess().IsRedlineOn());
+ CPPUNIT_ASSERT_MESSAGE(
+ "redlines should be visible",
+ IDocumentRedlineAccess::IsShowChanges(pDoc->getIDocumentRedlineAccess().GetRedlineFlags()));
+
+ // check table
+ xmlDocUniquePtr pXmlDoc = parseLayoutDump();
+ assertXPath(pXmlDoc, "//page[1]//body/tab");
+
+ // insert table column with enabled change tracking
+ // (HasTextChangesOnly property of the cell will be false)
+ dispatchCommand(mxComponent, ".uno:InsertColumnsAfter", {});
+
+ // text content with change tracking (dummy redline)
+ discardDumpedLayout();
+ pXmlDoc = parseLayoutDump();
+ assertXPath(pXmlDoc, "//page[1]//body/tab");
+ assertXPath(pXmlDoc, "//page[1]//body/tab/row/cell", 3);
+
+ // Save it and load it back.
+ reload("writer8", "tdf150673_tracked_column_insertion.odt");
+ pDoc = getSwDoc();
+
+ // reject the insertion of the hidden content of the cell
+ SwEditShell* const pEditShell(pDoc->GetEditShell());
+ CPPUNIT_ASSERT_EQUAL(static_cast<SwRedlineTable::size_type>(1), pEditShell->GetRedlineCount());
+ pEditShell->RejectRedline(0);
+
+ // inserted table column was deleted
+ // (working export/import of HasTextChangesOnly)
+ discardDumpedLayout();
+ pXmlDoc = parseLayoutDump();
+ assertXPath(pXmlDoc, "//page[1]//body/tab");
+ assertXPath(pXmlDoc, "//page[1]//body/tab/row/cell", 2);
+}
+
CPPUNIT_TEST_FIXTURE(SwUiWriterTest5, testTdf128335)
{
// Load the bugdoc, which has 3 textboxes.
diff --git a/sw/source/core/table/swnewtable.cxx b/sw/source/core/table/swnewtable.cxx
index cd98b4fb186a..6debaf7fa577 100644
--- a/sw/source/core/table/swnewtable.cxx
+++ b/sw/source/core/table/swnewtable.cxx
@@ -18,6 +18,7 @@
*/
#include <swtable.hxx>
+#include <swcrsr.hxx>
#include <tblsel.hxx>
#include <tblrwcl.hxx>
#include <ndtxt.hxx>
@@ -34,6 +35,7 @@
#include <IDocumentContentOperations.hxx>
#include <IDocumentFieldsAccess.hxx>
#include <IDocumentLayoutAccess.hxx>
+#include <IDocumentRedlineAccess.hxx>
#include <cstdlib>
#include <vector>
#include <set>
@@ -745,6 +747,20 @@ bool SwTable::NewInsertCol( SwDoc& rDoc, const SwSelBoxes& rBoxes,
for( sal_uInt16 j = 0; j < nCnt; ++j )
{
SwTableBox *pCurrBox = pLine->GetTabBoxes()[nInsPos+j];
+
+ // set tracked insertion by inserting a dummy redline
+ if ( rDoc.getIDocumentRedlineAccess().IsRedlineOn() )
+ {
+ SwPosition aPos(*pCurrBox->GetSttNd());
+ SwCursor aCursor( aPos, nullptr );
+ SwNodeIndex aInsDummyPos(*pCurrBox->GetSttNd(), 1 );
+ SwPaM aPaM(aInsDummyPos);
+ rDoc.getIDocumentContentOperations().InsertString( aPaM,
+ OUStringChar(CH_TXT_TRACKED_DUMMY_CHAR) );
+ SvxPrintItem aHasTextChangesOnly(RES_PRINT, false);
+ rDoc.SetBoxAttr( aCursor, aHasTextChangesOnly );
+ }
+
if( bNewSpan )
{
pCurrBox->setRowSpan( nLastRowSpan );
diff --git a/sw/source/core/table/swtable.cxx b/sw/source/core/table/swtable.cxx
index e5703eb7f039..ee4753b96d67 100644
--- a/sw/source/core/table/swtable.cxx
+++ b/sw/source/core/table/swtable.cxx
@@ -2981,15 +2981,22 @@ void SwTableBox::ActualiseValueBox()
SwRedlineTable::size_type SwTableBox::GetRedline() const
{
+ const SwRedlineTable& aRedlineTable = GetFrameFormat()->GetDoc()->getIDocumentRedlineAccess().GetRedlineTable();
const SwStartNode *pSttNd = GetSttNd();
- if ( !pSttNd || GetRedlineType() == RedlineType::None )
+ if ( aRedlineTable.empty() || !pSttNd )
+ return SwRedlineTable::npos;
+
+ // check table row property "HasTextChangesOnly", if it's defined and its value is
+ // false, return with the first redline of the cell
+ const SvxPrintItem *pHasTextChangesOnlyProp =
+ GetFrameFormat()->GetAttrSet().GetItem<SvxPrintItem>(RES_PRINT);
+ if ( !pHasTextChangesOnlyProp || pHasTextChangesOnlyProp->GetValue() )
return SwRedlineTable::npos;
SwPosition aCellStart( *GetSttNd(), SwNodeOffset(0) );
SwPosition aCellEnd( *GetSttNd()->EndOfSectionNode(), SwNodeOffset(-1) );
SwNodeIndex pEndNodeIndex(aCellEnd.GetNode());
- const SwRedlineTable& aRedlineTable = GetFrameFormat()->GetDoc()->getIDocumentRedlineAccess().GetRedlineTable();
SwRedlineTable::size_type nRedlinePos = 0;
for( ; nRedlinePos < aRedlineTable.size(); ++nRedlinePos )
{
@@ -3012,18 +3019,17 @@ SwRedlineTable::size_type SwTableBox::GetRedline() const
RedlineType SwTableBox::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 RedlineType::Delete
- // TODO add support for RedlineType::Insert
- const SvxPrintItem *pHasTextChangesOnlyProp =
- GetFrameFormat()->GetAttrSet().GetItem<SvxPrintItem>(RES_PRINT);
- if ( pHasTextChangesOnlyProp && !pHasTextChangesOnlyProp->GetValue() )
- return RedlineType::Delete;
-
+ SwRedlineTable::size_type nPos = GetRedline();
+ if ( nPos != SwRedlineTable::npos )
+ {
+ const SwRedlineTable& aRedlineTable = GetFrameFormat()->GetDoc()->getIDocumentRedlineAccess().GetRedlineTable();
+ const SwRangeRedline* pRedline = aRedlineTable[ nPos ];
+ if ( RedlineType::Delete == pRedline->GetType() ||
+ RedlineType::Insert == pRedline->GetType() )
+ {
+ return pRedline->GetType();
+ }
+ }
return RedlineType::None;
}