diff options
author | Miklos Vajna <vmiklos@collabora.co.uk> | 2016-06-08 15:36:24 +0200 |
---|---|---|
committer | Miklos Vajna <vmiklos@collabora.co.uk> | 2016-06-08 14:14:21 +0000 |
commit | 9cea9137b2534da4056f72d3c8a07f85a02f85be (patch) | |
tree | d287ce5d07ac1edf28a90a9cc48c0fd161d1db10 /sd | |
parent | 4501272cd2fee3534ef34b07a85aa0d26b7cae68 (diff) |
tdf#100269 svx: fix undo of table column resize
SdrTableObjImpl::LayoutTable() assumed no re-layout is needed in case
the total width of the table and the number of columns is the same, but
undo of resize is a situation where we also need to check the individual
widths of the columns, otherwise layout won't be up to date.
Change-Id: Ia5ebb05af79dda1c0d8c5bb10e7f37f81ee1d035
Reviewed-on: https://gerrit.libreoffice.org/26061
Reviewed-by: Miklos Vajna <vmiklos@collabora.co.uk>
Tested-by: Jenkins <ci@libreoffice.org>
Diffstat (limited to 'sd')
-rw-r--r-- | sd/qa/unit/tiledrendering/data/table-column.odp | bin | 0 -> 10526 bytes | |||
-rw-r--r-- | sd/qa/unit/tiledrendering/tiledrendering.cxx | 88 |
2 files changed, 87 insertions, 1 deletions
diff --git a/sd/qa/unit/tiledrendering/data/table-column.odp b/sd/qa/unit/tiledrendering/data/table-column.odp Binary files differnew file mode 100644 index 000000000000..d2c274e88856 --- /dev/null +++ b/sd/qa/unit/tiledrendering/data/table-column.odp diff --git a/sd/qa/unit/tiledrendering/tiledrendering.cxx b/sd/qa/unit/tiledrendering/tiledrendering.cxx index a47f99077267..b4b2ec6a1539 100644 --- a/sd/qa/unit/tiledrendering/tiledrendering.cxx +++ b/sd/qa/unit/tiledrendering/tiledrendering.cxx @@ -63,6 +63,7 @@ public: void testInsertTable(); void testPartHash(); void testResizeTable(); + void testResizeTableColumn(); #endif CPPUNIT_TEST_SUITE(SdTiledRenderingTest); @@ -83,6 +84,7 @@ public: CPPUNIT_TEST(testInsertTable); CPPUNIT_TEST(testPartHash); CPPUNIT_TEST(testResizeTable); + CPPUNIT_TEST(testResizeTableColumn); #endif CPPUNIT_TEST_SUITE_END(); @@ -91,6 +93,7 @@ private: SdXImpressDocument* createDoc(const char* pName); static void callback(int nType, const char* pPayload, void* pData); void callbackImpl(int nType, const char* pPayload); + xmlDocPtr parseXmlDump(); #endif uno::Reference<lang::XComponent> mxComponent; @@ -106,6 +109,7 @@ private: /// For document size changed callback. osl::Condition m_aDocumentSizeCondition; + xmlBufferPtr m_pXmlBuffer; #endif }; @@ -114,7 +118,8 @@ SdTiledRenderingTest::SdTiledRenderingTest() : m_bFound(true), m_nPart(0), m_nSelectionBeforeSearchResult(0), - m_nSelectionAfterSearchResult(0) + m_nSelectionAfterSearchResult(0), + m_pXmlBuffer(nullptr) #endif { } @@ -131,6 +136,11 @@ void SdTiledRenderingTest::tearDown() if (mxComponent.is()) mxComponent->dispose(); +#if !defined(_WIN32) && !defined(MACOSX) + if (m_pXmlBuffer) + xmlBufferFree(m_pXmlBuffer); +#endif + test::BootstrapFixture::tearDown(); } @@ -238,6 +248,28 @@ void SdTiledRenderingTest::callbackImpl(int nType, const char* pPayload) } } +xmlDocPtr SdTiledRenderingTest::parseXmlDump() +{ + if (m_pXmlBuffer) + xmlBufferFree(m_pXmlBuffer); + + // Create the xml writer. + m_pXmlBuffer = xmlBufferCreate(); + xmlTextWriterPtr pXmlWriter = xmlNewTextWriterMemory(m_pXmlBuffer, 0); + xmlTextWriterStartDocument(pXmlWriter, nullptr, nullptr, nullptr); + + // Create the dump. + SdXImpressDocument* pImpressDocument = dynamic_cast<SdXImpressDocument*>(mxComponent.get()); + CPPUNIT_ASSERT(pImpressDocument); + pImpressDocument->GetDoc()->dumpAsXml(pXmlWriter); + + // Delete the xml writer. + xmlTextWriterEndDocument(pXmlWriter); + xmlFreeTextWriter(pXmlWriter); + + return xmlParseMemory(reinterpret_cast<const char*>(xmlBufferContent(m_pXmlBuffer)), xmlBufferLength(m_pXmlBuffer)); +} + void SdTiledRenderingTest::testRegisterCallback() { SdXImpressDocument* pXImpressDocument = createDoc("dummy.odp"); @@ -729,6 +761,60 @@ void SdTiledRenderingTest::testResizeTable() comphelper::LibreOfficeKit::setActive(false); } +void SdTiledRenderingTest::testResizeTableColumn() +{ + // Load the document. + comphelper::LibreOfficeKit::setActive(); + SdXImpressDocument* pXImpressDocument = createDoc("table-column.odp"); + sd::ViewShell* pViewShell = pXImpressDocument->GetDocShell()->GetViewShell(); + SdPage* pActualPage = pViewShell->GetActualPage(); + SdrObject* pObject = pActualPage->GetObj(0); + auto pTableObject = dynamic_cast<sdr::table::SdrTableObj*>(pObject); + CPPUNIT_ASSERT(pTableObject); + + // Select the table by marking it + starting and ending text edit. + SdrView* pView = pViewShell->GetView(); + pView->MarkObj(pObject, pView->GetSdrPageView()); + pView->SdrBeginTextEdit(pObject); + pView->SdrEndTextEdit(); + + // Remember the original cell widths. + xmlDocPtr pXmlDoc = parseXmlDump(); + OString aPrefix = "/sdDrawDocument/sdrModel/sdPage/sdrObjList/sdrTableObj/sdrTableObjImpl/tableLayouter/columns/"; + sal_Int32 nExpectedColumn1 = getXPath(pXmlDoc, aPrefix + "layout[1]", "size").toInt32(); + sal_Int32 nExpectedColumn2 = getXPath(pXmlDoc, aPrefix + "layout[2]", "size").toInt32(); + xmlFreeDoc(pXmlDoc); + pXmlDoc = nullptr; + + // Resize the left column, decrease its width by 1 cm. + Point aInnerRowEdge = pObject->GetSnapRect().Center(); + pXImpressDocument->setGraphicSelection(LOK_SETGRAPHICSELECTION_START, convertMm100ToTwip(aInnerRowEdge.getX()), convertMm100ToTwip(aInnerRowEdge.getY())); + pXImpressDocument->setGraphicSelection(LOK_SETGRAPHICSELECTION_END, convertMm100ToTwip(aInnerRowEdge.getX() - 1000), convertMm100ToTwip(aInnerRowEdge.getY())); + + // Remember the resized column widths. + pXmlDoc = parseXmlDump(); + sal_Int32 nResizedColumn1 = getXPath(pXmlDoc, aPrefix + "layout[1]", "size").toInt32(); + CPPUNIT_ASSERT(nResizedColumn1 < nExpectedColumn1); + sal_Int32 nResizedColumn2 = getXPath(pXmlDoc, aPrefix + "layout[2]", "size").toInt32(); + CPPUNIT_ASSERT(nResizedColumn2 > nExpectedColumn2); + xmlFreeDoc(pXmlDoc); + pXmlDoc = nullptr; + + // Now undo the resize. + pXImpressDocument->GetDocShell()->GetUndoManager()->Undo(); + + // Check the undo result. + pXmlDoc = parseXmlDump(); + sal_Int32 nActualColumn1 = getXPath(pXmlDoc, aPrefix + "layout[1]", "size").toInt32(); + // Expected was 7049, actual was 6048, i.e. the first column width after undo was 1cm smaller than expected. + CPPUNIT_ASSERT_EQUAL(nExpectedColumn1, nActualColumn1); + sal_Int32 nActualColumn2 = getXPath(pXmlDoc, aPrefix + "layout[2]", "size").toInt32(); + CPPUNIT_ASSERT_EQUAL(nExpectedColumn2, nActualColumn2); + xmlFreeDoc(pXmlDoc); + pXmlDoc = nullptr; + comphelper::LibreOfficeKit::setActive(false); +} + #endif CPPUNIT_TEST_SUITE_REGISTRATION(SdTiledRenderingTest); |