/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/*
* This file is part of the LibreOffice project.
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*/
#include <swmodeltestbase.hxx>
#include <com/sun/star/linguistic2/XHyphenator.hpp>
#include <com/sun/star/view/XSelectionSupplier.hpp>
#include <com/sun/star/linguistic2/XSpellChecker1.hpp>
#include <comphelper/scopeguard.hxx>
#include <comphelper/sequence.hxx>
#include <editeng/unolingu.hxx>
#include <i18nlangtag/languagetag.hxx>
#include <o3tl/string_view.hxx>
#include <vcl/scheduler.hxx>
#include <rootfrm.hxx>
#include <pagefrm.hxx>
#include <bodyfrm.hxx>
#include <txtfrm.hxx>
#include <ndtxt.hxx>
#include <wrtsh.hxx>
#include <IDocumentLayoutAccess.hxx>
#include <IDocumentRedlineAccess.hxx>
#include <fmtanchr.hxx>
#include <redline.hxx>
/// Test to assert layout / rendering result of Writer.
class SwLayoutWriter2 :
public SwModelTestBase
{
public :
SwLayoutWriter2()
: SwModelTestBase(u
"/sw/qa/extras/layout/data/" _ustr)
{
}
protected :
void CheckRedlineCharAttributesHidden();
};
// this mainly tests that splitting portions across redlines in SwAttrIter works
void SwLayoutWriter2::CheckRedlineCharAttributesHidden()
{
xmlDocUniquePtr pXmlDoc = parseLayoutDump();
assertXPath(pXmlDoc,
"/root/page[1]/body/txt[1]/merged" ,
"paraPropsNodeIndex" , u
"9" );
assertXPath(pXmlDoc, "/root/page[1]/body/txt[1]/SwParaPortion/SwLineLayout/SwParaPortion[1]" ,
"type" , u"PortionType::Para" );
assertXPath(pXmlDoc, "/root/page[1]/body/txt[1]/SwParaPortion/SwLineLayout/SwParaPortion[1]" ,
"portion" , u"foobaz" );
assertXPath(pXmlDoc, "/root/page[1]/body/txt[2]/merged" , "paraPropsNodeIndex" , u"10" );
assertXPath(pXmlDoc, "/root/page[1]/body/txt[2]/SwParaPortion/SwLineLayout/SwParaPortion[1]" ,
"type" , u"PortionType::Para" );
assertXPath(pXmlDoc, "/root/page[1]/body/txt[2]/SwParaPortion/SwLineLayout/SwParaPortion[1]" ,
"portion" , u"foobaz" );
assertXPath(pXmlDoc, "/root/page[1]/body/txt[3]/merged" , "paraPropsNodeIndex" , u"11" );
assertXPath(pXmlDoc, "/root/page[1]/body/txt[3]/SwParaPortion/SwLineLayout/SwLinePortion[1]" ,
"type" , u"PortionType::Text" );
assertXPath(pXmlDoc, "/root/page[1]/body/txt[3]/SwParaPortion/SwLineLayout/SwLinePortion[1]" ,
"portion" , u"foo" );
assertXPath(pXmlDoc, "/root/page[1]/body/txt[3]/SwParaPortion/SwLineLayout/SwLinePortion[2]" ,
"type" , u"PortionType::Text" );
assertXPath(pXmlDoc, "/root/page[1]/body/txt[3]/SwParaPortion/SwLineLayout/SwLinePortion[2]" ,
"portion" , u"baz" );
assertXPath(pXmlDoc, "/root/page[1]/body/txt[4]/merged" , "paraPropsNodeIndex" , u"12" );
assertXPath(pXmlDoc, "/root/page[1]/body/txt[4]/SwParaPortion/SwLineLayout/SwLinePortion[1]" ,
"type" , u"PortionType::Text" );
assertXPath(pXmlDoc, "/root/page[1]/body/txt[4]/SwParaPortion/SwLineLayout/SwLinePortion[1]" ,
"portion" , u"foo" );
assertXPath(pXmlDoc, "/root/page[1]/body/txt[4]/SwParaPortion/SwLineLayout/SwLinePortion[2]" ,
"type" , u"PortionType::Text" );
assertXPath(pXmlDoc, "/root/page[1]/body/txt[4]/SwParaPortion/SwLineLayout/SwLinePortion[2]" ,
"portion" , u"baz" );
assertXPath(pXmlDoc, "/root/page[1]/body/txt[5]/merged" , "paraPropsNodeIndex" , u"13" );
assertXPath(pXmlDoc, "/root/page[1]/body/txt[5]/SwParaPortion/SwLineLayout/SwLinePortion[1]" ,
"type" , u"PortionType::Text" );
assertXPath(pXmlDoc, "/root/page[1]/body/txt[5]/SwParaPortion/SwLineLayout/SwLinePortion[1]" ,
"portion" , u"foo" );
assertXPath(pXmlDoc, "/root/page[1]/body/txt[5]/SwParaPortion/SwLineLayout/SwLinePortion[2]" ,
"type" , u"PortionType::Text" );
assertXPath(pXmlDoc, "/root/page[1]/body/txt[5]/SwParaPortion/SwLineLayout/SwLinePortion[2]" ,
"portion" , u"baz" );
assertXPath(pXmlDoc, "/root/page[1]/body/txt[6]/merged" , "paraPropsNodeIndex" , u"14" );
assertXPath(pXmlDoc, "/root/page[1]/body/txt[6]/SwParaPortion/SwLineLayout/SwLinePortion[1]" ,
"type" , u"PortionType::Text" );
assertXPath(pXmlDoc, "/root/page[1]/body/txt[6]/SwParaPortion/SwLineLayout/SwLinePortion[1]" ,
"portion" , u"foo" );
assertXPath(pXmlDoc, "/root/page[1]/body/txt[6]/SwParaPortion/SwLineLayout/SwLinePortion[2]" ,
"type" , u"PortionType::Text" );
assertXPath(pXmlDoc, "/root/page[1]/body/txt[6]/SwParaPortion/SwLineLayout/SwLinePortion[2]" ,
"portion" , u"baz" );
assertXPath(pXmlDoc, "/root/page[1]/body/txt[7]/merged" , "paraPropsNodeIndex" , u"15" );
assertXPath(pXmlDoc, "/root/page[1]/body/txt[7]/SwParaPortion/SwLineLayout/SwLinePortion[1]" ,
"type" , u"PortionType::Text" );
assertXPath(pXmlDoc, "/root/page[1]/body/txt[7]/SwParaPortion/SwLineLayout/SwLinePortion[1]" ,
"portion" , u"foo" );
assertXPath(pXmlDoc, "/root/page[1]/body/txt[7]/SwParaPortion/SwLineLayout/SwLinePortion[2]" ,
"type" , u"PortionType::Text" );
assertXPath(pXmlDoc, "/root/page[1]/body/txt[7]/SwParaPortion/SwLineLayout/SwLinePortion[2]" ,
"portion" , u"baz" );
assertXPath(pXmlDoc, "/root/page[1]/body/txt[8]/merged" , "paraPropsNodeIndex" , u"16" );
assertXPath(pXmlDoc, "/root/page[1]/body/txt[8]/SwParaPortion/SwLineLayout/SwLinePortion[1]" ,
"type" , u"PortionType::Text" );
assertXPath(pXmlDoc, "/root/page[1]/body/txt[8]/SwParaPortion/SwLineLayout/SwLinePortion[1]" ,
"portion" , u"foo" );
assertXPath(pXmlDoc, "/root/page[1]/body/txt[8]/SwParaPortion/SwLineLayout/SwLinePortion[2]" ,
"type" , u"PortionType::Text" );
assertXPath(pXmlDoc, "/root/page[1]/body/txt[8]/SwParaPortion/SwLineLayout/SwLinePortion[2]" ,
"portion" , u"baz" );
assertXPath(pXmlDoc, "/root/page[1]/body/txt[9]/merged" , "paraPropsNodeIndex" , u"17" );
assertXPath(pXmlDoc, "/root/page[1]/body/txt[9]/SwParaPortion/SwLineLayout/SwParaPortion[1]" ,
"type" , u"PortionType::Para" );
assertXPath(pXmlDoc, "/root/page[1]/body/txt[9]/SwParaPortion/SwLineLayout/SwParaPortion[1]" ,
"portion" , u"foobaz" );
assertXPath(pXmlDoc, "/root/page[1]/body/txt[10]/merged" , "paraPropsNodeIndex" , u"18" );
assertXPath(pXmlDoc, "/root/page[1]/body/txt[10]/SwParaPortion/SwLineLayout/SwLinePortion[1]" ,
"type" , u"PortionType::Text" );
assertXPath(pXmlDoc, "/root/page[1]/body/txt[10]/SwParaPortion/SwLineLayout/SwLinePortion[1]" ,
"portion" , u"fo" );
assertXPath(pXmlDoc, "/root/page[1]/body/txt[10]/SwParaPortion/SwLineLayout/SwLinePortion[2]" ,
"type" , u"PortionType::Text" );
assertXPath(pXmlDoc, "/root/page[1]/body/txt[10]/SwParaPortion/SwLineLayout/SwLinePortion[2]" ,
"portion" , u"ob" );
assertXPath(pXmlDoc, "/root/page[1]/body/txt[10]/SwParaPortion/SwLineLayout/SwLinePortion[3]" ,
"type" , u"PortionType::Text" );
assertXPath(pXmlDoc, "/root/page[1]/body/txt[10]/SwParaPortion/SwLineLayout/SwLinePortion[3]" ,
"portion" , u"az" );
assertXPath(pXmlDoc, "/root/page[1]/body/txt[11]/merged" , "paraPropsNodeIndex" , u"19" );
assertXPath(pXmlDoc, "/root/page[1]/body/txt[11]/SwParaPortion/SwLineLayout/SwParaPortion[1]" ,
"type" , u"PortionType::Para" );
assertXPath(pXmlDoc, "/root/page[1]/body/txt[11]/SwParaPortion/SwLineLayout/SwParaPortion[1]" ,
"portion" , u"foobaz" );
}
CPPUNIT_TEST_FIXTURE(SwLayoutWriter2, testTdf148897)
{
createSwDoc("tdf148897.odt" );
xmlDocUniquePtr pXmlDoc = parseLayoutDump();
assertXPath(pXmlDoc, "/root/page[1]/sorted_objs/fly" , 1);
assertXPath(pXmlDoc, "/root/page[1]/body/txt[2]/anchored/fly" , 1);
assertXPath(pXmlDoc, "/root/page[2]/sorted_objs/fly" , 1);
assertXPath(pXmlDoc, "/root/page[2]/body/txt[3]/anchored/fly" , 1);
assertXPath(pXmlDoc, "/root/page[3]/sorted_objs/fly" , 0);
assertXPath(pXmlDoc, "/root/page[3]/body/txt/anchored/fly" , 0);
assertXPath(pXmlDoc, "/root/page[4]/sorted_objs/fly" , 1);
assertXPath(pXmlDoc, "/root/page[4]/body/txt[1]/anchored/fly" , 1);
// fly portion exists, no overlapping text
assertXPath(pXmlDoc, "/root/page[4]/body/txt[1]/SwParaPortion/SwLineLayout[1]/SwFixPortion" ,
"height" , u"5797" );
assertXPath(pXmlDoc, "/root/page[5]/sorted_objs/fly" , 0);
assertXPath(pXmlDoc, "/root/page" , 5);
auto xModel = mxComponent.queryThrow<frame::XModel>();
uno::Reference<drawing::XShape> xShape(getShapeByName(u"Image3" ));
uno::Reference<view::XSelectionSupplier> xCtrl(xModel->getCurrentController(), uno::UNO_QUERY);
xCtrl->select(uno::Any(xShape));
dispatchCommand(mxComponent, u".uno:Delete" _ustr, {});
pXmlDoc = parseLayoutDump();
assertXPath(pXmlDoc, "/root/page[1]/sorted_objs/fly" , 0);
assertXPath(pXmlDoc, "/root/page[1]/body/txt/anchored/fly" , 0);
assertXPath(pXmlDoc, "/root/page[2]/sorted_objs/fly" , 1);
assertXPath(pXmlDoc, "/root/page[2]/body/txt[1]/anchored/fly" , 1);
assertXPath(pXmlDoc, "/root/page[3]/sorted_objs/fly" , 1);
assertXPath(pXmlDoc, "/root/page[3]/body/txt[2]/anchored/fly" , 1);
// fly portion exists, no overlapping text
assertXPath(pXmlDoc, "/root/page[3]/body/txt[1]/SwParaPortion/SwLineLayout[1]/SwFixPortion" ,
"height" , u"5797" );
assertXPath(pXmlDoc, "/root/page[4]/sorted_objs/fly" , 0);
assertXPath(pXmlDoc, "/root/page[4]/body/txt/anchored/fly" , 0);
assertXPath(pXmlDoc, "/root/page" , 4);
dispatchCommand(mxComponent, u".uno:Undo" _ustr, {});
pXmlDoc = parseLayoutDump();
assertXPath(pXmlDoc, "/root/page[1]/sorted_objs/fly" , 1);
assertXPath(pXmlDoc, "/root/page[1]/body/txt[2]/anchored/fly" , 1);
assertXPath(pXmlDoc, "/root/page[2]/sorted_objs/fly" , 1);
assertXPath(pXmlDoc, "/root/page[2]/body/txt[3]/anchored/fly" , 1);
assertXPath(pXmlDoc, "/root/page[3]/sorted_objs/fly" , 0);
assertXPath(pXmlDoc, "/root/page[3]/body/txt/anchored/fly" , 0);
assertXPath(pXmlDoc, "/root/page[4]/sorted_objs/fly" , 1);
assertXPath(pXmlDoc, "/root/page[4]/body/txt[1]/anchored/fly" , 1);
// fly portion exists, no overlapping text
assertXPath(pXmlDoc, "/root/page[4]/body/txt[1]/SwParaPortion/SwLineLayout[1]/SwFixPortion" ,
"height" , u"5797" );
assertXPath(pXmlDoc, "/root/page[5]/sorted_objs/fly" , 0);
assertXPath(pXmlDoc, "/root/page" , 5);
dispatchCommand(mxComponent, u".uno:Redo" _ustr, {});
pXmlDoc = parseLayoutDump();
assertXPath(pXmlDoc, "/root/page[1]/sorted_objs/fly" , 0);
assertXPath(pXmlDoc, "/root/page[1]/body/txt/anchored/fly" , 0);
assertXPath(pXmlDoc, "/root/page[2]/sorted_objs/fly" , 1);
assertXPath(pXmlDoc, "/root/page[2]/body/txt[1]/anchored/fly" , 1);
assertXPath(pXmlDoc, "/root/page[3]/sorted_objs/fly" , 1);
assertXPath(pXmlDoc, "/root/page[3]/body/txt[2]/anchored/fly" , 1);
// fly portion exists, no overlapping text
assertXPath(pXmlDoc, "/root/page[3]/body/txt[1]/SwParaPortion/SwLineLayout[1]/SwFixPortion" ,
"height" , u"5797" );
assertXPath(pXmlDoc, "/root/page[4]/sorted_objs/fly" , 0);
assertXPath(pXmlDoc, "/root/page[4]/body/txt/anchored/fly" , 0);
assertXPath(pXmlDoc, "/root/page" , 4);
}
CPPUNIT_TEST_FIXTURE(SwLayoutWriter2, testRedlineCharAttributes)
{
createSwDoc("redline_charatr.fodt" );
SwDoc* pDoc(getSwDoc());
SwRootFrame* pLayout(pDoc->getIDocumentLayoutAccess().GetCurrentLayout());
CPPUNIT_ASSERT(pLayout->IsHideRedlines());
// verify after load
CheckRedlineCharAttributesHidden();
dispatchCommand(mxComponent, u".uno:ShowTrackedChanges" _ustr, {});
CPPUNIT_ASSERT(!pLayout->IsHideRedlines());
// why is this needed explicitly?
calcLayout();
xmlDocUniquePtr pXmlDoc = parseLayoutDump();
// show: nothing is merged
assertXPath(pXmlDoc, "//merged", 0);
assertXPath(pXmlDoc, "/root/page[1]/body/txt[1]/SwParaPortion/SwLineLayout/SwLinePortion[1]" ,
"type" , u"PortionType::Text" );
assertXPath(pXmlDoc, "/root/page[1]/body/txt[1]/SwParaPortion/SwLineLayout/SwLinePortion[1]" ,
"portion" , u"foo" );
assertXPath(pXmlDoc, "/root/page[1]/body/txt[1]/SwParaPortion/SwLineLayout/SwLinePortion[2]" ,
"type" , u"PortionType::Text" );
assertXPath(pXmlDoc, "/root/page[1]/body/txt[1]/SwParaPortion/SwLineLayout/SwLinePortion[2]" ,
"portion" , u"bar" );
assertXPath(pXmlDoc, "/root/page[1]/body/txt[1]/SwParaPortion/SwLineLayout/SwLinePortion[3]" ,
"type" , u"PortionType::Text" );
assertXPath(pXmlDoc, "/root/page[1]/body/txt[1]/SwParaPortion/SwLineLayout/SwLinePortion[3]" ,
"portion" , u"baz" );
assertXPath(pXmlDoc, "/root/page[1]/body/txt[2]/SwParaPortion/SwLineLayout/SwLinePortion[1]" ,
"type" , u"PortionType::Text" );
assertXPath(pXmlDoc, "/root/page[1]/body/txt[2]/SwParaPortion/SwLineLayout/SwLinePortion[1]" ,
"portion" , u"foo" );
assertXPath(pXmlDoc, "/root/page[1]/body/txt[2]/SwParaPortion/SwLineLayout/SwLinePortion[2]" ,
"type" , u"PortionType::Text" );
assertXPath(pXmlDoc, "/root/page[1]/body/txt[2]/SwParaPortion/SwLineLayout/SwLinePortion[2]" ,
"portion" , u"bar" );
assertXPath(pXmlDoc, "/root/page[1]/body/txt[2]/SwParaPortion/SwLineLayout/SwLinePortion[3]" ,
"type" , u"PortionType::Text" );
assertXPath(pXmlDoc, "/root/page[1]/body/txt[2]/SwParaPortion/SwLineLayout/SwLinePortion[3]" ,
"portion" , u"baz" );
assertXPath(pXmlDoc, "/root/page[1]/body/txt[3]/SwParaPortion/SwLineLayout/SwLinePortion[1]" ,
"type" , u"PortionType::Text" );
assertXPath(pXmlDoc, "/root/page[1]/body/txt[3]/SwParaPortion/SwLineLayout/SwLinePortion[1]" ,
"portion" , u"foo" );
assertXPath(pXmlDoc, "/root/page[1]/body/txt[3]/SwParaPortion/SwLineLayout/SwLinePortion[2]" ,
"type" , u"PortionType::Text" );
assertXPath(pXmlDoc, "/root/page[1]/body/txt[3]/SwParaPortion/SwLineLayout/SwLinePortion[2]" ,
"portion" , u"bar" );
assertXPath(pXmlDoc, "/root/page[1]/body/txt[3]/SwParaPortion/SwLineLayout/SwLinePortion[3]" ,
"type" , u"PortionType::Text" );
assertXPath(pXmlDoc, "/root/page[1]/body/txt[3]/SwParaPortion/SwLineLayout/SwLinePortion[3]" ,
"portion" , u"baz" );
assertXPath(pXmlDoc, "/root/page[1]/body/txt[4]/SwParaPortion/SwLineLayout/SwLinePortion[1]" ,
"type" , u"PortionType::Text" );
assertXPath(pXmlDoc, "/root/page[1]/body/txt[4]/SwParaPortion/SwLineLayout/SwLinePortion[1]" ,
"portion" , u"foo" );
assertXPath(pXmlDoc, "/root/page[1]/body/txt[4]/SwParaPortion/SwLineLayout/SwLinePortion[2]" ,
"type" , u"PortionType::Text" );
assertXPath(pXmlDoc, "/root/page[1]/body/txt[4]/SwParaPortion/SwLineLayout/SwLinePortion[2]" ,
"portion" , u"bar" );
assertXPath(pXmlDoc, "/root/page[1]/body/txt[4]/SwParaPortion/SwLineLayout/SwLinePortion[3]" ,
"type" , u"PortionType::Text" );
assertXPath(pXmlDoc, "/root/page[1]/body/txt[4]/SwParaPortion/SwLineLayout/SwLinePortion[3]" ,
"portion" , u"baz" );
assertXPath(pXmlDoc, "/root/page[1]/body/txt[5]/SwParaPortion/SwLineLayout/SwLinePortion[1]" ,
"type" , u"PortionType::Text" );
assertXPath(pXmlDoc, "/root/page[1]/body/txt[5]/SwParaPortion/SwLineLayout/SwLinePortion[1]" ,
"portion" , u"foo" );
assertXPath(pXmlDoc, "/root/page[1]/body/txt[5]/SwParaPortion/SwLineLayout/SwLinePortion[2]" ,
"type" , u"PortionType::Text" );
assertXPath(pXmlDoc, "/root/page[1]/body/txt[5]/SwParaPortion/SwLineLayout/SwLinePortion[2]" ,
"portion" , u"bar" );
assertXPath(pXmlDoc, "/root/page[1]/body/txt[5]/SwParaPortion/SwLineLayout/SwLinePortion[3]" ,
"type" , u"PortionType::Text" );
assertXPath(pXmlDoc, "/root/page[1]/body/txt[5]/SwParaPortion/SwLineLayout/SwLinePortion[3]" ,
"portion" , u"baz" );
assertXPath(pXmlDoc, "/root/page[1]/body/txt[6]/SwParaPortion/SwLineLayout/SwLinePortion[1]" ,
"type" , u"PortionType::Text" );
assertXPath(pXmlDoc, "/root/page[1]/body/txt[6]/SwParaPortion/SwLineLayout/SwLinePortion[1]" ,
"portion" , u"foo" );
assertXPath(pXmlDoc, "/root/page[1]/body/txt[6]/SwParaPortion/SwLineLayout/SwLinePortion[2]" ,
"type" , u"PortionType::Text" );
assertXPath(pXmlDoc, "/root/page[1]/body/txt[6]/SwParaPortion/SwLineLayout/SwLinePortion[2]" ,
"portion" , u"bar" );
assertXPath(pXmlDoc, "/root/page[1]/body/txt[6]/SwParaPortion/SwLineLayout/SwLinePortion[3]" ,
"type" , u"PortionType::Text" );
assertXPath(pXmlDoc, "/root/page[1]/body/txt[6]/SwParaPortion/SwLineLayout/SwLinePortion[3]" ,
"portion" , u"baz" );
assertXPath(pXmlDoc, "/root/page[1]/body/txt[7]/SwParaPortion/SwLineLayout/SwLinePortion[1]" ,
"type" , u"PortionType::Text" );
assertXPath(pXmlDoc, "/root/page[1]/body/txt[7]/SwParaPortion/SwLineLayout/SwLinePortion[1]" ,
"portion" , u"foo" );
assertXPath(pXmlDoc, "/root/page[1]/body/txt[7]/SwParaPortion/SwLineLayout/SwLinePortion[2]" ,
"type" , u"PortionType::Text" );
assertXPath(pXmlDoc, "/root/page[1]/body/txt[7]/SwParaPortion/SwLineLayout/SwLinePortion[2]" ,
"portion" , u"bar" );
assertXPath(pXmlDoc, "/root/page[1]/body/txt[7]/SwParaPortion/SwLineLayout/SwLinePortion[3]" ,
"type" , u"PortionType::Text" );
assertXPath(pXmlDoc, "/root/page[1]/body/txt[7]/SwParaPortion/SwLineLayout/SwLinePortion[3]" ,
"portion" , u"baz" );
assertXPath(pXmlDoc, "/root/page[1]/body/txt[8]/SwParaPortion/SwLineLayout/SwLinePortion[1]" ,
"type" , u"PortionType::Text" );
assertXPath(pXmlDoc, "/root/page[1]/body/txt[8]/SwParaPortion/SwLineLayout/SwLinePortion[1]" ,
"portion" , u"foo" );
assertXPath(pXmlDoc, "/root/page[1]/body/txt[8]/SwParaPortion/SwLineLayout/SwLinePortion[2]" ,
"type" , u"PortionType::Text" );
assertXPath(pXmlDoc, "/root/page[1]/body/txt[8]/SwParaPortion/SwLineLayout/SwLinePortion[2]" ,
"portion" , u"ba" );
assertXPath(pXmlDoc, "/root/page[1]/body/txt[8]/SwParaPortion/SwLineLayout/SwLinePortion[3]" ,
"type" , u"PortionType::Text" );
assertXPath(pXmlDoc, "/root/page[1]/body/txt[8]/SwParaPortion/SwLineLayout/SwLinePortion[3]" ,
"portion" , u"r" );
assertXPath(pXmlDoc, "/root/page[1]/body/txt[8]/SwParaPortion/SwLineLayout/SwLinePortion[4]" ,
"type" , u"PortionType::Text" );
assertXPath(pXmlDoc, "/root/page[1]/body/txt[8]/SwParaPortion/SwLineLayout/SwLinePortion[4]" ,
"portion" , u"baz" );
assertXPath(pXmlDoc, "/root/page[1]/body/txt[9]/SwParaPortion/SwLineLayout/SwLinePortion[1]" ,
"type" , u"PortionType::Text" );
assertXPath(pXmlDoc, "/root/page[1]/body/txt[9]/SwParaPortion/SwLineLayout/SwLinePortion[1]" ,
"portion" , u"foo" );
assertXPath(pXmlDoc, "/root/page[1]/body/txt[9]/SwParaPortion/SwLineLayout/SwLinePortion[2]" ,
"type" , u"PortionType::Text" );
assertXPath(pXmlDoc, "/root/page[1]/body/txt[9]/SwParaPortion/SwLineLayout/SwLinePortion[2]" ,
"portion" , u"bar" );
assertXPath(pXmlDoc, "/root/page[1]/body/txt[9]/SwParaPortion/SwLineLayout/SwLinePortion[3]" ,
"type" , u"PortionType::Text" );
assertXPath(pXmlDoc, "/root/page[1]/body/txt[9]/SwParaPortion/SwLineLayout/SwLinePortion[3]" ,
"portion" , u"baz" );
assertXPath(pXmlDoc, "/root/page[1]/body/txt[10]/SwParaPortion/SwLineLayout/SwLinePortion[1]" ,
"type" , u"PortionType::Text" );
assertXPath(pXmlDoc, "/root/page[1]/body/txt[10]/SwParaPortion/SwLineLayout/SwLinePortion[1]" ,
"portion" , u"fo" );
assertXPath(pXmlDoc, "/root/page[1]/body/txt[10]/SwParaPortion/SwLineLayout/SwLinePortion[2]" ,
"type" , u"PortionType::Text" );
assertXPath(pXmlDoc, "/root/page[1]/body/txt[10]/SwParaPortion/SwLineLayout/SwLinePortion[2]" ,
"portion" , u"o" );
assertXPath(pXmlDoc, "/root/page[1]/body/txt[10]/SwParaPortion/SwLineLayout/SwLinePortion[3]" ,
"type" , u"PortionType::Text" );
assertXPath(pXmlDoc, "/root/page[1]/body/txt[10]/SwParaPortion/SwLineLayout/SwLinePortion[3]" ,
"portion" , u"bar" );
assertXPath(pXmlDoc, "/root/page[1]/body/txt[10]/SwParaPortion/SwLineLayout/SwLinePortion[4]" ,
"type" , u"PortionType::Text" );
assertXPath(pXmlDoc, "/root/page[1]/body/txt[10]/SwParaPortion/SwLineLayout/SwLinePortion[4]" ,
"portion" , u"b" );
assertXPath(pXmlDoc, "/root/page[1]/body/txt[10]/SwParaPortion/SwLineLayout/SwLinePortion[5]" ,
"type" , u"PortionType::Text" );
assertXPath(pXmlDoc, "/root/page[1]/body/txt[10]/SwParaPortion/SwLineLayout/SwLinePortion[5]" ,
"portion" , u"az" );
assertXPath(pXmlDoc, "/root/page[1]/body/txt[11]/SwParaPortion/SwLineLayout/SwLinePortion[1]" ,
"type" , u"PortionType::Text" );
assertXPath(pXmlDoc, "/root/page[1]/body/txt[11]/SwParaPortion/SwLineLayout/SwLinePortion[1]" ,
"portion" , u"foo" );
assertXPath(pXmlDoc, "/root/page[1]/body/txt[11]/SwParaPortion/SwLineLayout/SwLinePortion[2]" ,
"type" , u"PortionType::Text" );
assertXPath(pXmlDoc, "/root/page[1]/body/txt[11]/SwParaPortion/SwLineLayout/SwLinePortion[2]" ,
"portion" , u"b" );
assertXPath(pXmlDoc, "/root/page[1]/body/txt[11]/SwParaPortion/SwLineLayout/SwLinePortion[3]" ,
"type" , u"PortionType::Text" );
assertXPath(pXmlDoc, "/root/page[1]/body/txt[11]/SwParaPortion/SwLineLayout/SwLinePortion[3]" ,
"portion" , u"a" );
assertXPath(pXmlDoc, "/root/page[1]/body/txt[11]/SwParaPortion/SwLineLayout/SwLinePortion[4]" ,
"type" , u"PortionType::Text" );
assertXPath(pXmlDoc, "/root/page[1]/body/txt[11]/SwParaPortion/SwLineLayout/SwLinePortion[4]" ,
"portion" , u"r" );
assertXPath(pXmlDoc, "/root/page[1]/body/txt[11]/SwParaPortion/SwLineLayout/SwLinePortion[5]" ,
"type" , u"PortionType::Text" );
assertXPath(pXmlDoc, "/root/page[1]/body/txt[11]/SwParaPortion/SwLineLayout/SwLinePortion[5]" ,
"portion" , u"baz" );
// verify after hide
dispatchCommand(mxComponent, u".uno:ShowTrackedChanges" _ustr, {});
CPPUNIT_ASSERT(pLayout->IsHideRedlines());
// why is this needed explicitly?
calcLayout();
CheckRedlineCharAttributesHidden();
}
CPPUNIT_TEST_FIXTURE(SwLayoutWriter2, testRedlineShowHideFootnotePagination)
{
createSwDoc("redline_footnote_pagination.fodt" );
SwDoc* pDoc(getSwDoc());
SwRootFrame* pLayout(pDoc->getIDocumentLayoutAccess().GetCurrentLayout());
CPPUNIT_ASSERT(!pLayout->IsHideRedlines());
xmlDocUniquePtr pXmlDoc = parseLayoutDump();
// check footnotes
assertXPath(pXmlDoc, "/root/page[1]/ftncont/ftn" , 6);
assertXPath(pXmlDoc, "/root/page[2]/ftncont/ftn" , 3);
// check that first page ends with the y line and second page starts with z
assertXPath(pXmlDoc, "/root/page[1]/body/txt[last()]/SwParaPortion/SwLineLayout[last()]" ,
"portion" ,
u"yyyyyyyyy yyy yyyyyyyyyyyyyyyy yyyyyyy yyy yyyyy yyyyyyyyy yyy yyyyyyyyy " );
assertXPath(pXmlDoc, "/root/page[2]/body/txt[1]/SwParaPortion/SwLineLayout[1]" , "portion" ,
u"zzz. zzz zzzz zzzz* zzz zzz zzzzzzz zzz zzzz zzzzzzzzzzzzzz zzzzzzzzzzzz " );
// hide redlines - all still visible footnotes move to page 1
dispatchCommand(mxComponent, u".uno:ShowTrackedChanges" _ustr, {});
pXmlDoc = parseLayoutDump();
assertXPath(pXmlDoc, "/root/page[1]/ftncont/ftn" , 2);
assertXPath(pXmlDoc, "/root/page[2]/ftncont/ftn" , 0);
// show again - should now get the same result as on loading
dispatchCommand(mxComponent, u".uno:ShowTrackedChanges" _ustr, {});
pXmlDoc = parseLayoutDump();
// check footnotes
assertXPath(pXmlDoc, "/root/page[1]/ftncont/ftn" , 6);
assertXPath(pXmlDoc, "/root/page[2]/ftncont/ftn" , 3);
// check that first page ends with the y line and second page starts with z
assertXPath(pXmlDoc, "/root/page[1]/body/txt[last()]/SwParaPortion/SwLineLayout[last()]" ,
"portion" ,
u"yyyyyyyyy yyy yyyyyyyyyyyyyyyy yyyyyyy yyy yyyyy yyyyyyyyy yyy yyyyyyyyy " );
assertXPath(pXmlDoc, "/root/page[2]/body/txt[1]/SwParaPortion/SwLineLayout[1]" , "portion" ,
u"zzz. zzz zzzz zzzz* zzz zzz zzzzzzz zzz zzzz zzzzzzzzzzzzzz zzzzzzzzzzzz " );
}
CPPUNIT_TEST_FIXTURE(SwLayoutWriter2, testtdf138951)
{
// Open the bugdoc
createSwDoc("tdf138951.odt" );
// Get the only shape
uno::Reference<drawing::XShape> xShape(getShape(1), uno::UNO_QUERY);
CPPUNIT_ASSERT(xShape);
// Gather its formats: the shape and textbox
const SwFrameFormat* pTxFrm = SwTextBoxHelper::getOtherTextBoxFormat(xShape);
CPPUNIT_ASSERT(pTxFrm);
const SwFrameFormat* pShFrm = SwTextBoxHelper::getOtherTextBoxFormat(pTxFrm, RES_FLYFRMFMT);
CPPUNIT_ASSERT(pShFrm);
calcLayout();
// Get the bound rectangle of the textframe
tools::Rectangle aTxtFrmRect(pTxFrm->FindRealSdrObject()->GetLogicRect());
// Get the bound rectangle of the shape
tools::Rectangle aShpRect(pShFrm->FindRealSdrObject()->GetLogicRect());
// Check the anchor the same and the textbox is inside the shape
const bool bIsAnchTheSame
= *pShFrm->GetAnchor().GetAnchorNode() == *pShFrm->GetAnchor().GetAnchorNode();
CPPUNIT_ASSERT_MESSAGE("The anchor is different for the textbox and shape!" , bIsAnchTheSame);
CPPUNIT_ASSERT_MESSAGE("The textbox has fallen apart!" , aShpRect.Contains(aTxtFrmRect));
// Without the fix the anchor differs, and the frame outside of the shape
}
CPPUNIT_TEST_FIXTURE(SwLayoutWriter2, testTdf150717)
{
createSwDoc("tdf150717.odt" );
xmlDocUniquePtr pXmlDoc = parseLayoutDump();
// check bookmark colors defined in metadata
assertXPath(pXmlDoc, "/root/page/body/txt/SwParaPortion/SwLineLayout/child::*[2]" , "colors" ,
u"#Bookmark1 Bookmark Start" );
assertXPath(pXmlDoc, "/root/page/body/txt/SwParaPortion/SwLineLayout/child::*[4]" , "colors" ,
u"#Bookmark2 Bookmark Start" );
assertXPath(pXmlDoc, "/root/page/body/txt/SwParaPortion/SwLineLayout/child::*[6]" , "colors" ,
u"#Bookmark2 Bookmark End#Bookmark1 Bookmark End" );
// full text, if bookmarks are visible
assertXPath(pXmlDoc, "/root/page/body/txt/SwParaPortion/SwLineLayout/child::*[1]" , "portion" ,
u"Lorem " );
assertXPath(pXmlDoc, "/root/page/body/txt/SwParaPortion/SwLineLayout/child::*[3]" , "portion" ,
u"ipsum dolor et " );
assertXPath(pXmlDoc, "/root/page/body/txt/SwParaPortion/SwLineLayout/child::*[5]" , "portion" ,
u"ames" );
assertXPath(pXmlDoc, "/root/page/body/txt/SwParaPortion/SwLineLayout/child::*[7]" , "portion" ,
u"." );
}
CPPUNIT_TEST_FIXTURE(SwLayoutWriter2, testTdf150790)
{
createSwDoc("tdf150790.fodt" );
xmlDocUniquePtr pXmlDoc = parseLayoutDump();
// point bookmark is shown as I-beam (only its text dump is |, as before on the screen)
assertXPath(pXmlDoc, "/root/page/body/txt[1]/SwParaPortion/SwLineLayout/SwBookmarkPortion" ,
"colors" , u"#Bookmark 1 Bookmark" );
// single start bookmark
assertXPath(pXmlDoc, "/root/page/body/txt[2]/SwParaPortion/SwLineLayout/SwBookmarkPortion[1]" ,
"colors" , u"#Bookmark 2 Bookmark Start" );
// single end bookmark
assertXPath(pXmlDoc, "/root/page/body/txt[2]/SwParaPortion/SwLineLayout/SwBookmarkPortion[3]" ,
"colors" , u"#Bookmark 3 Bookmark End" );
// This was |, as before the point bookmark (neighboring end and start bookmarks)
assertXPath(pXmlDoc, "/root/page/body/txt[2]/SwParaPortion/SwLineLayout/SwBookmarkPortion[2]" ,
"colors" , u"#Bookmark 2 Bookmark End#Bookmark 3 Bookmark Start" );
}
CPPUNIT_TEST_FIXTURE(SwLayoutWriter2, testTdf129357)
{
createSwDoc("tdf129357.fodt" );
SwDocShell* pShell = getSwDocShell();
// 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);
// visible soft hyphen
assertXPathContent(pXmlDoc, "/metafile/push/push/push/push/push/textarray[2]/text" , u"-" );
}
CPPUNIT_TEST_FIXTURE(SwLayoutWriter2, testTdf165322)
{
createSwDoc("CT-formatted-deletion.docx" );
SwDocShell* pShell = getSwDocShell();
// 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);
// paragraph with 2 redlines was not marked as deleted
assertXPath(pXmlDoc,
"//text[text() = 'Nunc viverra imperdiet enim. Fusce est. Vivamus a "
"tellus.']/parent::textarray/preceding-sibling::font[1]" ,
"strikeout" , u"1" );
// Also check if the tooltip shows the delete, not the format
// Given a paragraph with both delete and format:
SwWrtShell* pWrtShell = getSwDocShell()->GetWrtShell();
SwRootFrame* pLayout = pWrtShell->GetLayout();
SwFrame* pPage = pLayout->GetLower();
SwFrame* pBody = pPage->GetLower();
SwFrame* pPara = pBody->GetLower()->GetNext();
// When getting the content at a position for tooltip purposes:
Point aPoint = pPara->getFrameArea().Center();
SwContentAtPos aContentAtPos(IsAttrAtPos::Redline);
CPPUNIT_ASSERT(pWrtShell->GetContentAtPos(aPoint, aContentAtPos));
// Then make sure we find a delete redline:
CPPUNIT_ASSERT_EQUAL(IsAttrAtPos::Redline, aContentAtPos.eContentAtPos);
const SwRangeRedline* pRedline = aContentAtPos.aFnd.pRedl;
// Without the accompanying fix in place, this test would have failed with:
// - Expected: 1 (RedlineType::Delete)
// - Actual : 5 (RedlineType::ParagraphFormat)
// i.e. the delete didn't have priority over para format, leading to a misleading tooltip.
CPPUNIT_ASSERT_EQUAL(RedlineType::Delete , pRedline->GetType());
}
CPPUNIT_TEST_FIXTURE(SwLayoutWriter2, testRedlineNumberInNumbering)
{
createSwDoc("tdf42748.fodt" );
SwDocShell* pShell = getSwDocShell();
// 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);
// Assert the tracked deletion of the number of joined list item and
// the tracked insertion of the number after a split list item as not black
// (and not COL_GREEN color of the tracked text movement, see testRedlineMoving) elements
assertXPath(
pXmlDoc,
"/metafile/push/push/push/textcolor[not(@color='#000000') and not(@color='#008000')]" , 5);
// tdf#145068 numbering shows changes in the associated list item, not the next one
// This was 1 (black numbering of the first list item previously)
assertXPath(pXmlDoc, "/metafile/push/push/push/font[4][@color='#000000']" , 0);
}
CPPUNIT_TEST_FIXTURE(SwLayoutWriter2, testRedlineNumbering)
{
createSwDoc("tdf115523.fodt" );
SwDocShell* pShell = getSwDocShell();
// 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);
// Show the correct and the original line numbering instead of counting
// the deleted list items in Show Changes mode, as part of the list
assertXPathContent(pXmlDoc, "/metafile/push/push/push/textarray[1]/text" , u"1." );
// This was "2." (deleted text node, now its text content is part of the first list item)
assertXPathContent(pXmlDoc, "/metafile/push/push/push/textarray[3]/text" , u"[2.] " );
// This was "3." (now it's the second list item)
assertXPathContent(pXmlDoc, "/metafile/push/push/push/textarray[5]/text" , u"2.[3.] " );
}
CPPUNIT_TEST_FIXTURE(SwLayoutWriter2, testRedlineNumbering2)
{
createSwDoc("tdf115524.fodt" );
SwDocShell* pShell = getSwDocShell();
// 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);
// Show the correct and the original line numbering in Show Changes mode
assertXPathContent(pXmlDoc, "/metafile/push/push/push/textarray[1]/text" , u"1." );
assertXPathContent(pXmlDoc, "/metafile/push/push/push/textarray[3]/text" , u"2." );
// FIXME: show as 3.[2.]
assertXPathContent(pXmlDoc, "/metafile/push/push/push/textarray[5]/text" , u"3." );
// This was "4." (not shown the original number)
assertXPathContent(pXmlDoc, "/metafile/push/push/push/textarray[7]/text" , u"4.[3.] " );
}
CPPUNIT_TEST_FIXTURE(SwLayoutWriter2, tdf157596_paragraph_numbering)
{
createSwDoc("tdf157596_paragraph_numbering.docx" );
xmlDocUniquePtr pXmlDoc = parseLayoutDump();
// show correct numbering during fileload.
assertXPath(pXmlDoc, "/root/page/body/txt[1]/SwParaPortion/SwLineLayout/SwFieldPortion" ,
"expand" , u"1." );
assertXPath(pXmlDoc, "/root/page/body/txt[2]/SwParaPortion/SwLineLayout/SwFieldPortion" ,
"expand" , u"2." );
assertXPath(pXmlDoc, "/root/page/body/txt[3]/SwParaPortion/SwLineLayout/SwFieldPortion" ,
"expand" , u"3." );
}
CPPUNIT_TEST_FIXTURE(SwLayoutWriter2, testTdf149710_RedlineNumberingEditing)
{
createSwDoc("tdf149710.fodt" );
// Show Changes
SwWrtShell* pWrtShell = getSwDocShell()->GetWrtShell();
SwRootFrame* pLayout(pWrtShell->GetLayout());
CPPUNIT_ASSERT(!pLayout->IsHideRedlines());
// delete the paragraph mark of the first list item with change tracking
dispatchCommand(mxComponent, u".uno:GoToEndOfLine" _ustr, {});
dispatchCommand(mxComponent, u".uno:TrackChanges" _ustr, {});
dispatchCommand(mxComponent, u".uno:Delete" _ustr, {});
// Dump the rendering of the first page as an XML file.
SwDocShell* pShell = getSwDocShell();
std::shared_ptr<GDIMetaFile> xMetaFile = pShell->GetPreviewMetaFile();
MetafileXmlDump dumper;
xmlDocUniquePtr pXmlDoc = dumpAndParse(dumper, *xMetaFile);
CPPUNIT_ASSERT(pXmlDoc);
// Show the correct and the original line numbering instead of counting
// the deleted list items in Show Changes mode, as part of the list
// This was "1."
assertXPathContent(pXmlDoc, "/metafile/push/push/push/textarray[1]/text" , u"[1.] " );
// This was "2." (deleted text node, now its text content is part of the first list item)
assertXPathContent(pXmlDoc, "/metafile/push/push/push/textarray[3]/text" , u"1.[2.] " );
// This was "3." (now it's the second list item)
assertXPathContent(pXmlDoc, "/metafile/push/push/push/textarray[5]/text" , u"2.[3.] " );
// remove the tracked deletion, and check the layout again
pWrtShell->Undo();
xMetaFile = pShell->GetPreviewMetaFile();
pXmlDoc = dumpAndParse(dumper, *xMetaFile);
assertXPathContent(pXmlDoc, "/metafile/push/push/push/textarray[1]/text" , u"1." );
assertXPathContent(pXmlDoc, "/metafile/push/push/push/textarray[3]/text" , u"2." );
assertXPathContent(pXmlDoc, "/metafile/push/push/push/textarray[5]/text" , u"3." );
}
CPPUNIT_TEST_FIXTURE(SwLayoutWriter2, testTdf149709_RedlineNumberingLevel)
{
createSwDoc("tdf149709.fodt" );
// Show Changes
SwWrtShell* pWrtShell = getSwDocShell()->GetWrtShell();
SwRootFrame* pLayout(pWrtShell->GetLayout());
CPPUNIT_ASSERT(!pLayout->IsHideRedlines());
// insert a new list item at start of the second list item "a)"
dispatchCommand(mxComponent, u".uno:TrackChanges" _ustr, {});
pWrtShell->Down(false , 1);
pWrtShell->SplitNode(false );
// Dump the rendering of the first page as an XML file.
SwDocShell* pShell = getSwDocShell();
std::shared_ptr<GDIMetaFile> xMetaFile = pShell->GetPreviewMetaFile();
MetafileXmlDump dumper;
xmlDocUniquePtr pXmlDoc = dumpAndParse(dumper, *xMetaFile);
CPPUNIT_ASSERT(pXmlDoc);
// Show the correct and the original line numbering instead of counting
// the deleted list items in Show Changes mode, as part of the list
assertXPathContent(pXmlDoc, "/metafile/push/push/push/textarray[1]/text" , u"1." );
assertXPathContent(pXmlDoc, "/metafile/push/push/push/textarray[3]/text" , u"a)" );
// This was "b)[2.]"
assertXPathContent(pXmlDoc, "/metafile/push/push/push/textarray[4]/text" , u"b)[a)] " );
// This was "c)[3.]"
assertXPathContent(pXmlDoc, "/metafile/push/push/push/textarray[6]/text" , u"c)[b)] " );
// This was "4.[2.]" (after disabling Show Changes, and enabling again)
assertXPathContent(pXmlDoc, "/metafile/push/push/push/textarray[8]/text" , u"2." );
// remove the tracked deletion, and check the layout again
pWrtShell->Undo();
xMetaFile = pShell->GetPreviewMetaFile();
pXmlDoc = dumpAndParse(dumper, *xMetaFile);
assertXPathContent(pXmlDoc, "/metafile/push/push/push/textarray[1]/text" , u"1." );
assertXPathContent(pXmlDoc, "/metafile/push/push/push/textarray[3]/text" , u"a)" );
assertXPathContent(pXmlDoc, "/metafile/push/push/push/textarray[5]/text" , u"b)" );
assertXPathContent(pXmlDoc, "/metafile/push/push/push/textarray[7]/text" , u"2." );
// check Redo
pWrtShell->Redo();
xMetaFile = pShell->GetPreviewMetaFile();
pXmlDoc = dumpAndParse(dumper, *xMetaFile);
assertXPathContent(pXmlDoc, "/metafile/push/push/push/textarray[1]/text" , u"1." );
assertXPathContent(pXmlDoc, "/metafile/push/push/push/textarray[3]/text" , u"a)" );
// TODO: show as b)[a)]
assertXPathContent(pXmlDoc, "/metafile/push/push/push/textarray[4]/text" , u"b)" );
// FIXME: This must be "c)[b]"
assertXPathContent(pXmlDoc, "/metafile/push/push/push/textarray[6]/text" , u"c)[a)] " );
assertXPathContent(pXmlDoc, "/metafile/push/push/push/textarray[8]/text" , u"2." );
}
CPPUNIT_TEST_FIXTURE(SwLayoutWriter2, testTdf149711_importDOCXMoveToParagraphMark)
{
createSwDoc("tdf149711.docx" );
SwDoc* pDoc = getSwDoc();
xmlDocUniquePtr pXmlDoc = parseLayoutDump();
assertXPath(pXmlDoc, "/root/page[1]/body/txt" , 6);
// reject tracked insertion (moveTo)
SwEditShell* const pEditShell(pDoc->GetEditShell());
CPPUNIT_ASSERT(pEditShell);
CPPUNIT_ASSERT_EQUAL(static_cast <SwRedlineTable::size_type>(2), pEditShell->GetRedlineCount());
pEditShell->RejectRedline(1);
pXmlDoc = parseLayoutDump();
// This was 6 (not tracked paragraph mark of the moveTo list item)
assertXPath(pXmlDoc, "/root/page[1]/body/txt" , 5);
}
CPPUNIT_TEST_FIXTURE(SwLayoutWriter2, testTdf152872)
{
createSwDoc("hidden-para-separator.docx" );
xmlDocUniquePtr pXmlDoc = parseLayoutDump();
assertXPath(pXmlDoc, "/root/page[1]/body/txt" , 2);
assertXPath(pXmlDoc, "/root/page/body/txt[1]/SwParaPortion/SwLineLayout" , "portion" , u"C DE" );
// 5 is empty and hidden
assertXPath(pXmlDoc, "/root/page/body/txt[2]/infos/bounds" , "height" , u"0" );
SwWrtShell* pWrtShell = getSwDocShell()->GetWrtShell();
SwViewOption aViewOptions(*pWrtShell->GetViewOptions());
aViewOptions.SetShowHiddenChar(true );
aViewOptions.SetViewMetaChars(true );
pWrtShell->ApplyViewOptions(aViewOptions);
pXmlDoc = parseLayoutDump();
assertXPath(pXmlDoc, "/root/page[1]/body/txt" , 5);
assertXPath(pXmlDoc, "/root/page/body/txt[1]/SwParaPortion/SwLineLayout" , "portion" , u"C " );
assertXPath(pXmlDoc, "/root/page/body/txt[2]/SwParaPortion/SwLineLayout" , "portion" , u"D" );
// 3 is an empty paragraph with RES_CHRATR_HIDDEN
assertXPath(pXmlDoc, "/root/page/body/txt[3]/infos/bounds" , "height" , u"398" );
assertXPath(pXmlDoc, "/root/page/body/txt[4]/SwParaPortion/SwLineLayout" , "portion" , u"E" );
// 5 is an empty paragraph with RES_CHRATR_HIDDEN
assertXPath(pXmlDoc, "/root/page/body/txt[5]/infos/bounds" , "height" , u"398" );
aViewOptions.SetViewMetaChars(false );
pWrtShell->ApplyViewOptions(aViewOptions);
pXmlDoc = parseLayoutDump();
assertXPath(pXmlDoc, "/root/page[1]/body/txt" , 2);
assertXPath(pXmlDoc, "/root/page/body/txt[1]/SwParaPortion/SwLineLayout" , "portion" , u"C DE" );
// 5 is empty and hidden
assertXPath(pXmlDoc, "/root/page/body/txt[2]/infos/bounds" , "height" , u"0" );
}
CPPUNIT_TEST_FIXTURE(SwLayoutWriter2, testHiddenParaBreaks)
{
createSwDoc("section-break-hidden-paragraphs.rtf" );
SwWrtShell* pWrtShell = getSwDocShell()->GetWrtShell();
SwViewOption aViewOptions(*pWrtShell->GetViewOptions());
aViewOptions.SetShowHiddenChar(true );
aViewOptions.SetViewMetaChars(true );
pWrtShell->ApplyViewOptions(aViewOptions);
Scheduler::ProcessEventsToIdle();
xmlDocUniquePtr pXmlDoc = parseLayoutDump();
assertXPath(pXmlDoc, "/root/page[1]/body/txt" , 1);
assertXPath(pXmlDoc, "/root/page[1]/body/txt[1]/SwParaPortion/SwLineLayout" , "portion" ,
u"First" );
// actually Word shows an additional paragraph before the table
assertXPath(pXmlDoc, "/root/page[2]/body/txt" , 3);
assertXPath(pXmlDoc, "/root/page[2]/body/txt[1]/SwParaPortion/SwLineLayout" , "portion" , u"" );
assertXPath(pXmlDoc, "/root/page[2]/body/txt[1]/infos/bounds" , "top" , u"18846" );
assertXPath(pXmlDoc, "/root/page[2]/body/txt[1]/infos/bounds" , "height" , u"269" );
assertXPath(pXmlDoc, "/root/page[2]/body/txt[2]/infos/bounds" , "top" , u"19115" );
assertXPath(pXmlDoc, "/root/page[2]/body/txt[2]/infos/bounds" , "height" , u"450" );
assertXPath(pXmlDoc, "/root/page[2]/body/tab[1]/infos/bounds" , "top" , u"19565" );
assertXPath(pXmlDoc, "/root/page[2]/body/txt[3]/SwParaPortion/SwLineLayout" , "portion" , u"End" );
aViewOptions.SetViewMetaChars(false );
pWrtShell->ApplyViewOptions(aViewOptions);
Scheduler::ProcessEventsToIdle();
pXmlDoc = parseLayoutDump();
assertXPath(pXmlDoc, "/root/page[1]/body/txt" , 1);
assertXPath(pXmlDoc, "/root/page[1]/body/txt[1]/SwParaPortion/SwLineLayout" , "portion" ,
u"First" );
assertXPath(pXmlDoc, "/root/page[2]/body/txt" , 2);
// this one is merged; if it were 2 0-height frames that would work too
assertXPath(pXmlDoc, "/root/page[2]/body/txt[1]/infos/bounds" , "top" , u"18846" );
assertXPath(pXmlDoc, "/root/page[2]/body/txt[1]/infos/bounds" , "height" , u"0" );
assertXPath(pXmlDoc, "/root/page[2]/body/tab[1]/infos/bounds" , "top" , u"18846" );
assertXPath(pXmlDoc, "/root/page[2]/body/txt[2]/SwParaPortion/SwLineLayout" , "portion" , u"End" );
}
CPPUNIT_TEST_FIXTURE(SwLayoutWriter2, testHiddenParaLineHeight)
{
createSwDoc("merge_hidden_redline_lineheight.rtf" );
SwWrtShell* pWrtShell = getSwDocShell()->GetWrtShell();
SwViewOption aViewOptions(*pWrtShell->GetViewOptions());
aViewOptions.SetShowHiddenChar(true );
aViewOptions.SetViewMetaChars(true );
pWrtShell->ApplyViewOptions(aViewOptions);
{
xmlDocUniquePtr pXmlDoc = parseLayoutDump();
assertXPath(pXmlDoc, "/root/page[1]/body/txt[1]/infos/bounds" , "height" , u"269" );
assertXPath(pXmlDoc, "/root/page[1]/body/txt[2]/infos/bounds" , "height" , u"767" );
assertXPath(pXmlDoc, "/root/page[1]/body/txt[3]/infos/bounds" , "height" , u"475" );
assertXPath(pXmlDoc, "/root/page[1]/body/txt[4]/infos/bounds" , "height" , u"450" );
assertXPath(pXmlDoc, "/root/page[1]/body/txt[5]/infos/bounds" , "height" , u"450" );
assertXPath(pXmlDoc, "/root/page[1]/body/txt[6]/infos/bounds" , "height" , u"767" );
assertXPath(pXmlDoc, "/root/page[1]/body/txt[7]/infos/bounds" , "height" , u"475" );
assertXPath(pXmlDoc, "/root/page[1]/body/txt[8]/infos/bounds" , "height" , u"767" );
assertXPath(pXmlDoc, "/root/page[1]/body/txt[9]/infos/bounds" , "height" , u"475" );
assertXPath(pXmlDoc, "/root/page[1]/body/txt[10]/infos/bounds" , "height" , u"450" );
assertXPath(pXmlDoc, "/root/page[1]/body/txt[11]/infos/bounds" , "height" , u"767" );
assertXPath(pXmlDoc, "/root/page[1]/body/txt[12]/infos/bounds" , "height" , u"475" );
assertXPath(pXmlDoc, "/root/page[1]/body/txt[13]/infos/bounds" , "height" , u"450" );
assertXPath(pXmlDoc, "/root/page[1]/body/txt[14]/infos/bounds" , "height" , u"450" );
assertXPath(pXmlDoc, "/root/page[1]/body/txt[15]/infos/bounds" , "height" , u"767" );
assertXPath(pXmlDoc, "/root/page[1]/body/txt[16]/infos/bounds" , "height" , u"475" );
assertXPath(pXmlDoc, "/root/page[1]/body/txt[17]/infos/bounds" , "height" , u"450" );
assertXPath(pXmlDoc, "/root/page[1]/body/txt[18]/infos/bounds" , "height" , u"767" );
assertXPath(pXmlDoc, "/root/page[1]/body/txt[19]/infos/bounds" , "height" , u"475" );
assertXPath(pXmlDoc, "/root/page[1]/body/txt[20]/infos/bounds" , "height" , u"767" );
assertXPath(pXmlDoc, "/root/page[1]/body/txt[21]/infos/bounds" , "height" , u"475" );
assertXPath(pXmlDoc, "/root/page[1]/body/txt[22]/infos/bounds" , "height" , u"450" );
assertXPath(pXmlDoc, "/root/page[1]/body/txt[23]/infos/bounds" , "height" , u"450" );
assertXPath(pXmlDoc, "/root/page[1]/body/txt[24]/infos/bounds" , "height" , u"767" );
assertXPath(pXmlDoc, "/root/page[1]/body/txt[25]/infos/bounds" , "height" , u"475" );
}
aViewOptions.SetShowHiddenChar(false );
pWrtShell->ApplyViewOptions(aViewOptions);
dispatchCommand(mxComponent, u".uno:ShowTrackedChanges" _ustr, {});
{
xmlDocUniquePtr pXmlDoc = parseLayoutDump();
assertXPath(pXmlDoc, "/root/page[1]/body/txt[1]/infos/bounds" , "height" , u"269" );
assertXPath(pXmlDoc, "/root/page[1]/body/txt[2]/infos/bounds" , "height" , u"450" );
assertXPath(pXmlDoc, "/root/page[1]/body/txt[3]/infos/bounds" , "height" , u"450" );
assertXPath(pXmlDoc, "/root/page[1]/body/txt[4]/infos/bounds" , "height" , u"767" );
assertXPath(pXmlDoc, "/root/page[1]/body/txt[5]/infos/bounds" , "height" , u"475" );
assertXPath(pXmlDoc, "/root/page[1]/body/txt[6]/infos/bounds" , "height" , u"450" );
assertXPath(pXmlDoc, "/root/page[1]/body/txt[7]/infos/bounds" , "height" , u"475" );
// 4: this was using wrong node's character properties (height 767)
assertXPath(pXmlDoc, "/root/page[1]/body/txt[8]/infos/bounds" , "height" , u"450" );
assertXPath(pXmlDoc, "/root/page[1]/body/txt[9]/infos/bounds" , "height" , u"475" );
assertXPath(pXmlDoc, "/root/page[1]/body/txt[10]/infos/bounds" , "height" , u"767" );
assertXPath(pXmlDoc, "/root/page[1]/body/txt[11]/infos/bounds" , "height" , u"475" );
assertXPath(pXmlDoc, "/root/page[1]/body/txt[12]/infos/bounds" , "height" , u"450" );
assertXPath(pXmlDoc, "/root/page[1]/body/txt[13]/infos/bounds" , "height" , u"475" );
assertXPath(pXmlDoc, "/root/page[1]/body/txt[14]/infos/bounds" , "height" , u"450" );
assertXPath(pXmlDoc, "/root/page[1]/body/txt[15]/infos/bounds" , "height" , u"450" );
assertXPath(pXmlDoc, "/root/page[1]/body/txt[16]/infos/bounds" , "height" , u"767" );
assertXPath(pXmlDoc, "/root/page[1]/body/txt[17]/infos/bounds" , "height" , u"475" );
}
}
CPPUNIT_TEST_FIXTURE(SwLayoutWriter2, testHiddenParaProps)
{
createSwDoc("merge_hidden_redline.docx" );
SwWrtShell* pWrtShell = getSwDocShell()->GetWrtShell();
SwViewOption aViewOptions(*pWrtShell->GetViewOptions());
aViewOptions.SetShowHiddenChar(true );
aViewOptions.SetViewMetaChars(true );
pWrtShell->ApplyViewOptions(aViewOptions);
// note: do not use layout dump here, because it doesn't work:
// SwTextFrame::Format doesn't actually create the SwMarginPortion for
// non-left-aligned frames; instead, it sets SetFormatAdj() flag and later
// *SwTextPainter* checks via GetAdjusted() if the flag is set and calls
// CalcAdjLine() which inserts the SwMarginPortion.
SwRootFrame* pRoot = pWrtShell->GetLayout();
CPPUNIT_ASSERT(pRoot->GetLower()->IsPageFrame());
SwPageFrame* pPage = static_cast <SwPageFrame*>(pRoot->GetLower());
CPPUNIT_ASSERT(pPage->GetLower()->IsBodyFrame());
SwBodyFrame* pBody = static_cast <SwBodyFrame*>(pPage->GetLower());
CPPUNIT_ASSERT(pBody->GetLower()->IsTextFrame());
SwTextFrame* pTextFrame = dynamic_cast <SwTextFrame*>(pBody->GetLower());
CPPUNIT_ASSERT_EQUAL(u"1 hidden, delete-merge" _ustr, pTextFrame->GetText());
pTextFrame = dynamic_cast <SwTextFrame*>(pTextFrame->GetNext());
// TODO: redlines don't merge like in Word yet
CPPUNIT_ASSERT_EQUAL(u"Abcdef" _ustr, pTextFrame->GetText());
pTextFrame = dynamic_cast <SwTextFrame*>(pTextFrame->GetNext());
CPPUNIT_ASSERT_EQUAL(u"ghi" _ustr, pTextFrame->GetText());
pTextFrame = dynamic_cast <SwTextFrame*>(pTextFrame->GetNext());
CPPUNIT_ASSERT_EQUAL(u"2 visible, delete-merge" _ustr, pTextFrame->GetText());
pTextFrame = dynamic_cast <SwTextFrame*>(pTextFrame->GetNext());
CPPUNIT_ASSERT_EQUAL(u"abcghi" _ustr, pTextFrame->GetText());
pTextFrame = dynamic_cast <SwTextFrame*>(pTextFrame->GetNext());
CPPUNIT_ASSERT_EQUAL(u"def" _ustr, pTextFrame->GetText());
pTextFrame = dynamic_cast <SwTextFrame*>(pTextFrame->GetNext());
CPPUNIT_ASSERT_EQUAL(u"3 delete-merge" _ustr, pTextFrame->GetText());
pTextFrame = dynamic_cast <SwTextFrame*>(pTextFrame->GetNext());
CPPUNIT_ASSERT_EQUAL(u"def" _ustr, pTextFrame->GetText());
pTextFrame = dynamic_cast <SwTextFrame*>(pTextFrame->GetNext());
CPPUNIT_ASSERT_EQUAL(u"ghi" _ustr, pTextFrame->GetText());
pTextFrame = dynamic_cast <SwTextFrame*>(pTextFrame->GetNext());
CPPUNIT_ASSERT_EQUAL(u"4 delete-merge, delete-merge" _ustr, pTextFrame->GetText());
pTextFrame = dynamic_cast <SwTextFrame*>(pTextFrame->GetNext());
CPPUNIT_ASSERT_EQUAL(u"abc" _ustr, pTextFrame->GetText());
pTextFrame = dynamic_cast <SwTextFrame*>(pTextFrame->GetNext());
CPPUNIT_ASSERT_EQUAL(u"def" _ustr, pTextFrame->GetText());
pTextFrame = dynamic_cast <SwTextFrame*>(pTextFrame->GetNext());
CPPUNIT_ASSERT_EQUAL(u"" _ustr, pTextFrame->GetText());
pTextFrame = dynamic_cast <SwTextFrame*>(pTextFrame->GetNext());
CPPUNIT_ASSERT_EQUAL(u"5 visible, hidden-merge, visible" _ustr, pTextFrame->GetText());
pTextFrame = dynamic_cast <SwTextFrame*>(pTextFrame->GetNext());
CPPUNIT_ASSERT_EQUAL(u"abc" _ustr, pTextFrame->GetText());
CPPUNIT_ASSERT_EQUAL(
SvxAdjust::Center,
pTextFrame->GetTextNodeForParaProps()->GetSwAttrSet().Get(RES_PARATR_ADJUST).GetAdjust());
pTextFrame = dynamic_cast <SwTextFrame*>(pTextFrame->GetNext());
CPPUNIT_ASSERT_EQUAL(u"def" _ustr, pTextFrame->GetText());
CPPUNIT_ASSERT_EQUAL(
SvxAdjust::Left,
pTextFrame->GetTextNodeForParaProps()->GetSwAttrSet().Get(RES_PARATR_ADJUST).GetAdjust());
pTextFrame = dynamic_cast <SwTextFrame*>(pTextFrame->GetNext());
CPPUNIT_ASSERT_EQUAL(u"6 hidden-merge, visible" _ustr, pTextFrame->GetText());
pTextFrame = dynamic_cast <SwTextFrame*>(pTextFrame->GetNext());
CPPUNIT_ASSERT_EQUAL(u"abc" _ustr, pTextFrame->GetText());
CPPUNIT_ASSERT_EQUAL(
SvxAdjust::Center,
pTextFrame->GetTextNodeForParaProps()->GetSwAttrSet().Get(RES_PARATR_ADJUST).GetAdjust());
pTextFrame = dynamic_cast <SwTextFrame*>(pTextFrame->GetNext());
CPPUNIT_ASSERT_EQUAL(u"def" _ustr, pTextFrame->GetText());
CPPUNIT_ASSERT_EQUAL(
SvxAdjust::Left,
pTextFrame->GetTextNodeForParaProps()->GetSwAttrSet().Get(RES_PARATR_ADJUST).GetAdjust());
pTextFrame = dynamic_cast <SwTextFrame*>(pTextFrame->GetNext());
CPPUNIT_ASSERT_EQUAL(u"7 visible, hidden-merge" _ustr, pTextFrame->GetText());
pTextFrame = dynamic_cast <SwTextFrame*>(pTextFrame->GetNext());
CPPUNIT_ASSERT_EQUAL(u"abcdef" _ustr, pTextFrame->GetText());
CPPUNIT_ASSERT_EQUAL(
SvxAdjust::Center,
pTextFrame->GetTextNodeForParaProps()->GetSwAttrSet().Get(RES_PARATR_ADJUST).GetAdjust());
pTextFrame = dynamic_cast <SwTextFrame*>(pTextFrame->GetNext());
CPPUNIT_ASSERT_EQUAL(u"ghi" _ustr, pTextFrame->GetText());
CPPUNIT_ASSERT_EQUAL(
SvxAdjust::Left,
pTextFrame->GetTextNodeForParaProps()->GetSwAttrSet().Get(RES_PARATR_ADJUST).GetAdjust());
pTextFrame = dynamic_cast <SwTextFrame*>(pTextFrame->GetNext());
CPPUNIT_ASSERT_EQUAL(u"8 visible, delete-merge, visible, hidden-merge, visible" _ustr,
pTextFrame->GetText());
pTextFrame = dynamic_cast <SwTextFrame*>(pTextFrame->GetNext());
CPPUNIT_ASSERT_EQUAL(u"abc" _ustr, pTextFrame->GetText());
CPPUNIT_ASSERT_EQUAL(
SvxAdjust::Right,
pTextFrame->GetTextNodeForParaProps()->GetSwAttrSet().Get(RES_PARATR_ADJUST).GetAdjust());
pTextFrame = dynamic_cast <SwTextFrame*>(pTextFrame->GetNext());
CPPUNIT_ASSERT_EQUAL(u"def" _ustr, pTextFrame->GetText());
CPPUNIT_ASSERT_EQUAL(
SvxAdjust::Center,
pTextFrame->GetTextNodeForParaProps()->GetSwAttrSet().Get(RES_PARATR_ADJUST).GetAdjust());
pTextFrame = dynamic_cast <SwTextFrame*>(pTextFrame->GetNext());
CPPUNIT_ASSERT_EQUAL(u"ghi" _ustr, pTextFrame->GetText());
CPPUNIT_ASSERT_EQUAL(
SvxAdjust::Left,
pTextFrame->GetTextNodeForParaProps()->GetSwAttrSet().Get(RES_PARATR_ADJUST).GetAdjust());
pTextFrame = dynamic_cast <SwTextFrame*>(pTextFrame->GetNext());
CPPUNIT_ASSERT_EQUAL(u"9 hidden-merge" _ustr, pTextFrame->GetText());
pTextFrame = dynamic_cast <SwTextFrame*>(pTextFrame->GetNext());
CPPUNIT_ASSERT_EQUAL(u"abc" _ustr, pTextFrame->GetText());
CPPUNIT_ASSERT_EQUAL(
SvxAdjust::Center,
pTextFrame->GetTextNodeForParaProps()->GetSwAttrSet().Get(RES_PARATR_ADJUST).GetAdjust());
pTextFrame = dynamic_cast <SwTextFrame*>(pTextFrame->GetNext());
CPPUNIT_ASSERT_EQUAL(u"def" _ustr, pTextFrame->GetText());
CPPUNIT_ASSERT_EQUAL(
SvxAdjust::Left,
pTextFrame->GetTextNodeForParaProps()->GetSwAttrSet().Get(RES_PARATR_ADJUST).GetAdjust());
pTextFrame = dynamic_cast <SwTextFrame*>(pTextFrame->GetNext());
CPPUNIT_ASSERT_EQUAL(u"10 visible, hidden-merge, visible, delete-merge, visible" _ustr,
pTextFrame->GetText());
pTextFrame = dynamic_cast <SwTextFrame*>(pTextFrame->GetNext());
CPPUNIT_ASSERT_EQUAL(u"abc" _ustr, pTextFrame->GetText());
CPPUNIT_ASSERT_EQUAL(
SvxAdjust::Right,
pTextFrame->GetTextNodeForParaProps()->GetSwAttrSet().Get(RES_PARATR_ADJUST).GetAdjust());
pTextFrame = dynamic_cast <SwTextFrame*>(pTextFrame->GetNext());
CPPUNIT_ASSERT_EQUAL(u"def" _ustr, pTextFrame->GetText());
CPPUNIT_ASSERT_EQUAL(
SvxAdjust::Center,
pTextFrame->GetTextNodeForParaProps()->GetSwAttrSet().Get(RES_PARATR_ADJUST).GetAdjust());
pTextFrame = dynamic_cast <SwTextFrame*>(pTextFrame->GetNext());
CPPUNIT_ASSERT_EQUAL(u"ghi" _ustr, pTextFrame->GetText());
CPPUNIT_ASSERT_EQUAL(
SvxAdjust::Left,
pTextFrame->GetTextNodeForParaProps()->GetSwAttrSet().Get(RES_PARATR_ADJUST).GetAdjust());
aViewOptions.SetShowHiddenChar(false );
pWrtShell->ApplyViewOptions(aViewOptions);
// the problem was that the wrong SwTextNode was used for properties
pTextFrame = dynamic_cast <SwTextFrame*>(pBody->GetLower());
CPPUNIT_ASSERT_EQUAL(u"1 hidden, delete-merge" _ustr, pTextFrame->GetText());
pTextFrame = dynamic_cast <SwTextFrame*>(pTextFrame->GetNext());
// TODO: redlines don't merge like in Word yet
CPPUNIT_ASSERT_EQUAL(u"Abcdef" _ustr, pTextFrame->GetText());
pTextFrame = dynamic_cast <SwTextFrame*>(pTextFrame->GetNext());
CPPUNIT_ASSERT_EQUAL(u"ghi" _ustr, pTextFrame->GetText());
pTextFrame = dynamic_cast <SwTextFrame*>(pTextFrame->GetNext());
CPPUNIT_ASSERT_EQUAL(u"2 visible, delete-merge" _ustr, pTextFrame->GetText());
pTextFrame = dynamic_cast <SwTextFrame*>(pTextFrame->GetNext());
CPPUNIT_ASSERT_EQUAL(u"abcghi" _ustr, pTextFrame->GetText());
pTextFrame = dynamic_cast <SwTextFrame*>(pTextFrame->GetNext());
CPPUNIT_ASSERT_EQUAL(u"def" _ustr, pTextFrame->GetText());
pTextFrame = dynamic_cast <SwTextFrame*>(pTextFrame->GetNext());
CPPUNIT_ASSERT_EQUAL(u"3 delete-merge" _ustr, pTextFrame->GetText());
pTextFrame = dynamic_cast <SwTextFrame*>(pTextFrame->GetNext());
CPPUNIT_ASSERT_EQUAL(u"def" _ustr, pTextFrame->GetText());
pTextFrame = dynamic_cast <SwTextFrame*>(pTextFrame->GetNext());
CPPUNIT_ASSERT_EQUAL(u"ghi" _ustr, pTextFrame->GetText());
pTextFrame = dynamic_cast <SwTextFrame*>(pTextFrame->GetNext());
CPPUNIT_ASSERT_EQUAL(u"4 delete-merge, delete-merge" _ustr, pTextFrame->GetText());
pTextFrame = dynamic_cast <SwTextFrame*>(pTextFrame->GetNext());
CPPUNIT_ASSERT_EQUAL(u"abc" _ustr, pTextFrame->GetText());
pTextFrame = dynamic_cast <SwTextFrame*>(pTextFrame->GetNext());
CPPUNIT_ASSERT_EQUAL(u"def" _ustr, pTextFrame->GetText());
pTextFrame = dynamic_cast <SwTextFrame*>(pTextFrame->GetNext());
CPPUNIT_ASSERT_EQUAL(u"" _ustr, pTextFrame->GetText());
pTextFrame = dynamic_cast <SwTextFrame*>(pTextFrame->GetNext());
CPPUNIT_ASSERT_EQUAL(u"5 visible, hidden-merge, visible" _ustr, pTextFrame->GetText());
pTextFrame = dynamic_cast <SwTextFrame*>(pTextFrame->GetNext());
CPPUNIT_ASSERT_EQUAL(u"abcdef" _ustr, pTextFrame->GetText());
CPPUNIT_ASSERT_EQUAL(
SvxAdjust::Center,
pTextFrame->GetTextNodeForParaProps()->GetSwAttrSet().Get(RES_PARATR_ADJUST).GetAdjust());
pTextFrame = dynamic_cast <SwTextFrame*>(pTextFrame->GetNext());
CPPUNIT_ASSERT_EQUAL(u"6 hidden-merge, visible" _ustr, pTextFrame->GetText());
pTextFrame = dynamic_cast <SwTextFrame*>(pTextFrame->GetNext());
CPPUNIT_ASSERT_EQUAL(u"abcdef" _ustr, pTextFrame->GetText());
CPPUNIT_ASSERT_EQUAL(
SvxAdjust::Left,
pTextFrame->GetTextNodeForParaProps()->GetSwAttrSet().Get(RES_PARATR_ADJUST).GetAdjust());
pTextFrame = dynamic_cast <SwTextFrame*>(pTextFrame->GetNext());
CPPUNIT_ASSERT_EQUAL(u"7 visible, hidden-merge" _ustr, pTextFrame->GetText());
pTextFrame = dynamic_cast <SwTextFrame*>(pTextFrame->GetNext());
CPPUNIT_ASSERT_EQUAL(u"abcdefghi" _ustr, pTextFrame->GetText());
CPPUNIT_ASSERT_EQUAL(
SvxAdjust::Center,
pTextFrame->GetTextNodeForParaProps()->GetSwAttrSet().Get(RES_PARATR_ADJUST).GetAdjust());
pTextFrame = dynamic_cast <SwTextFrame*>(pTextFrame->GetNext());
CPPUNIT_ASSERT_EQUAL(u"8 visible, delete-merge, visible, hidden-merge, visible" _ustr,
pTextFrame->GetText());
pTextFrame = dynamic_cast <SwTextFrame*>(pTextFrame->GetNext());
CPPUNIT_ASSERT_EQUAL(u"abc" _ustr, pTextFrame->GetText());
CPPUNIT_ASSERT_EQUAL(
SvxAdjust::Right,
pTextFrame->GetTextNodeForParaProps()->GetSwAttrSet().Get(RES_PARATR_ADJUST).GetAdjust());
pTextFrame = dynamic_cast <SwTextFrame*>(pTextFrame->GetNext());
CPPUNIT_ASSERT_EQUAL(u"defghi" _ustr, pTextFrame->GetText());
CPPUNIT_ASSERT_EQUAL(
SvxAdjust::Center,
pTextFrame->GetTextNodeForParaProps()->GetSwAttrSet().Get(RES_PARATR_ADJUST).GetAdjust());
pTextFrame = dynamic_cast <SwTextFrame*>(pTextFrame->GetNext());
CPPUNIT_ASSERT_EQUAL(u"9 hidden-merge" _ustr, pTextFrame->GetText());
pTextFrame = dynamic_cast <SwTextFrame*>(pTextFrame->GetNext());
CPPUNIT_ASSERT_EQUAL(u"abcdef" _ustr, pTextFrame->GetText());
CPPUNIT_ASSERT_EQUAL(
SvxAdjust::Left,
pTextFrame->GetTextNodeForParaProps()->GetSwAttrSet().Get(RES_PARATR_ADJUST).GetAdjust());
pTextFrame = dynamic_cast <SwTextFrame*>(pTextFrame->GetNext());
CPPUNIT_ASSERT_EQUAL(u"10 visible, hidden-merge, visible, delete-merge, visible" _ustr,
pTextFrame->GetText());
pTextFrame = dynamic_cast <SwTextFrame*>(pTextFrame->GetNext());
CPPUNIT_ASSERT_EQUAL(u"abcdef" _ustr, pTextFrame->GetText());
CPPUNIT_ASSERT_EQUAL(
SvxAdjust::Right,
pTextFrame->GetTextNodeForParaProps()->GetSwAttrSet().Get(RES_PARATR_ADJUST).GetAdjust());
pTextFrame = dynamic_cast <SwTextFrame*>(pTextFrame->GetNext());
CPPUNIT_ASSERT_EQUAL(u"ghi" _ustr, pTextFrame->GetText());
CPPUNIT_ASSERT_EQUAL(
SvxAdjust::Left,
pTextFrame->GetTextNodeForParaProps()->GetSwAttrSet().Get(RES_PARATR_ADJUST).GetAdjust());
dispatchCommand(mxComponent, u".uno:ShowTrackedChanges" _ustr, {});
pTextFrame = dynamic_cast <SwTextFrame*>(pBody->GetLower());
for (int i = 0; i < 18; ++i)
{
pTextFrame = dynamic_cast <SwTextFrame*>(pTextFrame->GetNext());
}
// the problem was that this redline (following hidden) wasn't merged
CPPUNIT_ASSERT_EQUAL(u"10 visible, hidden-merge, visible, delete-merge, visible" _ustr,
pTextFrame->GetText());
pTextFrame = dynamic_cast <SwTextFrame*>(pTextFrame->GetNext());
CPPUNIT_ASSERT_EQUAL(u"abcdefghi" _ustr, pTextFrame->GetText());
}
CPPUNIT_TEST_FIXTURE(SwLayoutWriter2, testTdf151954)
{
createSwDoc("tdf151954.docx" );
SwDoc* pDoc = getSwDoc();
xmlDocUniquePtr pXmlDoc = parseLayoutDump();
assertXPath(pXmlDoc, "/root/page[1]/body/txt" , 2);
// accept tracked insertion (moveTo)
SwEditShell* const pEditShell(pDoc->GetEditShell());
CPPUNIT_ASSERT(pEditShell);
CPPUNIT_ASSERT_EQUAL(static_cast <SwRedlineTable::size_type>(3), pEditShell->GetRedlineCount());
pEditShell->AcceptRedline(0);
pXmlDoc = parseLayoutDump();
// This was 1 (moveFrom was extended to the paragraph mark)
assertXPath(pXmlDoc, "/root/page[1]/body/txt" , 2);
}
CPPUNIT_TEST_FIXTURE(SwLayoutWriter2, testTdf152952)
{
createSwDoc("Hyphenated-link.rtf" );
xmlDocUniquePtr pXmlDoc = parseLayoutDump();
// URL should not be hyphenated
assertXPath(pXmlDoc, "/root/page[1]/body/txt[1]/SwParaPortion/SwLineLayout[1]" , "portion" ,
u" NNNNNNNNNN NNNNNNNNNNNNNNN " );
assertXPath(pXmlDoc, "/root/page[1]/body/txt[1]/SwParaPortion/SwLineLayout[2]" , "portion" ,
u"https://example.com/xxxxxxx/testtesttesttest/hyphenate/testtesttest ");
}
CPPUNIT_TEST_FIXTURE(SwLayoutWriter2, testTdf152952_compat)
{
uno::Reference<linguistic2::XHyphenator> xHyphenator = LinguMgr::GetHyphenator();
if (!xHyphenator->hasLocale(lang::Locale(u"en" _ustr, u"US" _ustr, OUString())))
return ;
createSwDoc("Hyphenated-link.fodt" );
xmlDocUniquePtr pXmlDoc = parseLayoutDump();
// URL hyphenated for backward compatibility
assertXPath(pXmlDoc, "/root/page[1]/body/txt[1]/SwParaPortion/SwLineLayout[1]" , "portion" ,
u" NNNNNNNNNN NNNNNNNNNNNNNNN https://example.com/xxxxxxx/testtesttesttest/hyphen ");
assertXPath(pXmlDoc, "/root/page[1]/body/txt[1]/SwParaPortion/SwLineLayout[2]" , "portion" ,
u"ate/testtesttest " );
}
CPPUNIT_TEST_FIXTURE(SwLayoutWriter2, testTdf158885_compound_remain)
{
uno::Reference<linguistic2::XHyphenator> xHyphenator = LinguMgr::GetHyphenator();
if (!xHyphenator->hasLocale(lang::Locale(u"hu" _ustr, u"HU" _ustr, OUString())))
return ;
uno::Reference<linguistic2::XSpellChecker1> xSpell = LinguMgr::GetSpellChecker();
LanguageType eLang
= LanguageTag::convertToLanguageType(lang::Locale(u"hu" _ustr, u"HU" _ustr, OUString()));
if (!xSpell.is() || !xSpell->hasLanguage(static_cast <sal_uInt16>(eLang)))
return ;
createSwDoc("tdf158885_compound-remain.fodt" );
xmlDocUniquePtr pXmlDoc = parseLayoutDump();
// hyphenate compound word with 3- or more character distance from the stem boundary
// This was "emberel=lenes" (now "ember=ellenes", i.e. hyphenating at the stem boundary)
assertXPath(pXmlDoc, "/root/page[1]/body/txt[1]/SwParaPortion/SwLineLayout[1]" , "portion" ,
u"emberellenes emberellenes emberellenes emberellenes emberellenes ember" );
assertXPath(pXmlDoc, "/root/page[1]/body/txt[1]/SwParaPortion/SwLineLayout[2]" , "portion" ,
u"ellenes emberellenes emberellenes emberellenes emberellenes emberellenes " );
}
CPPUNIT_TEST_FIXTURE(SwLayoutWriter2, testTdf158885_not_compound_remain)
{
uno::Reference<linguistic2::XHyphenator> xHyphenator = LinguMgr::GetHyphenator();
if (!xHyphenator->hasLocale(lang::Locale(u"hu" _ustr, u"HU" _ustr, OUString())))
return ;
uno::Reference<linguistic2::XSpellChecker1> xSpell = LinguMgr::GetSpellChecker();
LanguageType eLang
= LanguageTag::convertToLanguageType(lang::Locale(u"hu" _ustr, u"HU" _ustr, OUString()));
if (!xSpell.is() || !xSpell->hasLanguage(static_cast <sal_uInt16>(eLang)))
return ;
--> --------------------
--> maximum size reached
--> --------------------
Messung V0.5 C=94 H=90 G=91
¤ Dauer der Verarbeitung: 0.19 Sekunden
¤
*© Formatika GbR, Deutschland