summaryrefslogtreecommitdiff
path: root/sw
diff options
context:
space:
mode:
Diffstat (limited to 'sw')
-rw-r--r--sw/qa/extras/uiwriter/uiwriter2.cxx101
-rw-r--r--sw/source/uibase/docvw/UnfloatTableButton.cxx23
2 files changed, 83 insertions, 41 deletions
diff --git a/sw/qa/extras/uiwriter/uiwriter2.cxx b/sw/qa/extras/uiwriter/uiwriter2.cxx
index 93334ddc5027..6f56022e92ae 100644
--- a/sw/qa/extras/uiwriter/uiwriter2.cxx
+++ b/sw/qa/extras/uiwriter/uiwriter2.cxx
@@ -648,49 +648,70 @@ void SwUiWriterTest2::testUnfloatButtonReadOnlyMode()
void SwUiWriterTest2::testUnfloating()
{
- // Test what happens when pushing the unfloat button
- load(FLOATING_TABLE_DATA_DIRECTORY, "unfloatable_floating_table.odt");
- SwXTextDocument* pTextDoc = dynamic_cast<SwXTextDocument*>(mxComponent.get());
- CPPUNIT_ASSERT(pTextDoc);
- SwWrtShell* pWrtShell = pTextDoc->GetDocShell()->GetWrtShell();
- CPPUNIT_ASSERT(pWrtShell);
-
- SwFlyFrame* pFlyFrame;
+ // Test unfloating with tables imported from different file formats
+ const std::vector<OUString> aTestFiles = {
+ "unfloatable_floating_table.odt",
+ "unfloatable_floating_table.docx",
+ "unfloatable_floating_table.doc",
+ };
- // Before unfloating we have only one page with a fly frame
+ for (const OUString& aTestFile : aTestFiles)
{
- CPPUNIT_ASSERT_EQUAL(SwFrameType::Page, pWrtShell->GetLayout()->GetLower()->GetType());
- CPPUNIT_ASSERT(!pWrtShell->GetLayout()->GetLower()->GetNext());
- CPPUNIT_ASSERT_EQUAL(SwFrameType::Txt,
- pWrtShell->GetLayout()->GetLower()->GetLower()->GetLower()->GetType());
- const SwSortedObjs* pAnchored
- = pWrtShell->GetLayout()->GetLower()->GetLower()->GetLower()->GetDrawObjs();
- CPPUNIT_ASSERT(pAnchored);
- CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(1), pAnchored->size());
- SwAnchoredObject* pAnchoredObj = (*pAnchored)[0];
- pFlyFrame = dynamic_cast<SwFlyFrame*>(pAnchoredObj);
- CPPUNIT_ASSERT(pFlyFrame);
- }
+ OString sTestFileName = OUStringToOString(aTestFile, RTL_TEXTENCODING_UTF8);
+ OString sFailureMessage = OString("Failure in the test file: ") + sTestFileName;
- // Select the floating table
- SdrObject* pObj = pFlyFrame->GetFormat()->FindRealSdrObject();
- CPPUNIT_ASSERT(pObj);
- pWrtShell->SelectObj(Point(), 0, pObj);
- CPPUNIT_ASSERT(pFlyFrame->IsShowUnfloatButton(pWrtShell));
-
- // Push the unfloat button
- pFlyFrame->ActiveUnfloatButton(pWrtShell);
-
- // After unfloating we have two pages with one table frame on each page
- CPPUNIT_ASSERT(pWrtShell->GetLayout()->GetLower()->GetNext());
- CPPUNIT_ASSERT_EQUAL(SwFrameType::Page,
- pWrtShell->GetLayout()->GetLower()->GetNext()->GetType());
- CPPUNIT_ASSERT(!pWrtShell->GetLayout()->GetLower()->GetNext()->GetNext());
- CPPUNIT_ASSERT_EQUAL(SwFrameType::Tab,
- pWrtShell->GetLayout()->GetLower()->GetLower()->GetLower()->GetType());
- CPPUNIT_ASSERT_EQUAL(
- SwFrameType::Tab,
- pWrtShell->GetLayout()->GetLower()->GetNext()->GetLower()->GetLower()->GetType());
+ // Test what happens when pushing the unfloat button
+ load(FLOATING_TABLE_DATA_DIRECTORY, "unfloatable_floating_table.docx");
+ SwXTextDocument* pTextDoc = dynamic_cast<SwXTextDocument*>(mxComponent.get());
+ CPPUNIT_ASSERT_MESSAGE(sFailureMessage.getStr(), pTextDoc);
+ SwWrtShell* pWrtShell = pTextDoc->GetDocShell()->GetWrtShell();
+ CPPUNIT_ASSERT_MESSAGE(sFailureMessage.getStr(), pWrtShell);
+
+ SwFlyFrame* pFlyFrame;
+
+ // Before unfloating we have only one page with a fly frame
+ {
+ CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailureMessage.getStr(), SwFrameType::Page,
+ pWrtShell->GetLayout()->GetLower()->GetType());
+ CPPUNIT_ASSERT_MESSAGE(sFailureMessage.getStr(),
+ !pWrtShell->GetLayout()->GetLower()->GetNext());
+ CPPUNIT_ASSERT_EQUAL_MESSAGE(
+ sFailureMessage.getStr(), SwFrameType::Txt,
+ pWrtShell->GetLayout()->GetLower()->GetLower()->GetLower()->GetType());
+ const SwSortedObjs* pAnchored
+ = pWrtShell->GetLayout()->GetLower()->GetLower()->GetLower()->GetDrawObjs();
+ CPPUNIT_ASSERT_MESSAGE(sFailureMessage.getStr(), pAnchored);
+ CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailureMessage.getStr(), static_cast<size_t>(1),
+ pAnchored->size());
+ SwAnchoredObject* pAnchoredObj = (*pAnchored)[0];
+ pFlyFrame = dynamic_cast<SwFlyFrame*>(pAnchoredObj);
+ CPPUNIT_ASSERT_MESSAGE(sFailureMessage.getStr(), pFlyFrame);
+ }
+
+ // Select the floating table
+ SdrObject* pObj = pFlyFrame->GetFormat()->FindRealSdrObject();
+ CPPUNIT_ASSERT_MESSAGE(sFailureMessage.getStr(), pObj);
+ pWrtShell->SelectObj(Point(), 0, pObj);
+ CPPUNIT_ASSERT_MESSAGE(sFailureMessage.getStr(), pFlyFrame->IsShowUnfloatButton(pWrtShell));
+
+ // Push the unfloat button
+ pFlyFrame->ActiveUnfloatButton(pWrtShell);
+ Scheduler::ProcessEventsToIdle();
+
+ // After unfloating we have two pages with one table frame on each page
+ CPPUNIT_ASSERT_MESSAGE(sFailureMessage.getStr(),
+ pWrtShell->GetLayout()->GetLower()->GetNext());
+ CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailureMessage.getStr(), SwFrameType::Page,
+ pWrtShell->GetLayout()->GetLower()->GetNext()->GetType());
+ CPPUNIT_ASSERT_MESSAGE(sFailureMessage.getStr(),
+ !pWrtShell->GetLayout()->GetLower()->GetNext()->GetNext());
+ CPPUNIT_ASSERT_EQUAL_MESSAGE(
+ sFailureMessage.getStr(), SwFrameType::Tab,
+ pWrtShell->GetLayout()->GetLower()->GetLower()->GetLower()->GetType());
+ CPPUNIT_ASSERT_EQUAL_MESSAGE(
+ sFailureMessage.getStr(), SwFrameType::Tab,
+ pWrtShell->GetLayout()->GetLower()->GetNext()->GetLower()->GetLower()->GetType());
+ }
}
void SwUiWriterTest2::testTdf122893()
diff --git a/sw/source/uibase/docvw/UnfloatTableButton.cxx b/sw/source/uibase/docvw/UnfloatTableButton.cxx
index 4fd025ad8ba1..3c564b95024a 100644
--- a/sw/source/uibase/docvw/UnfloatTableButton.cxx
+++ b/sw/source/uibase/docvw/UnfloatTableButton.cxx
@@ -11,7 +11,10 @@
#include <HeaderFooterWin.hxx>
#include <edtwin.hxx>
+#include <view.hxx>
+#include <wrtsh.hxx>
#include <strings.hrc>
+#include <fmtpdsc.hxx>
#include <vcl/metric.hxx>
#include <vcl/settings.hxx>
#include <viewopt.hxx>
@@ -19,10 +22,12 @@
#include <flyfrm.hxx>
#include <tabfrm.hxx>
#include <txtfrm.hxx>
+#include <pagefrm.hxx>
#include <ndindex.hxx>
#include <swtable.hxx>
#include <IDocumentState.hxx>
#include <IDocumentUndoRedo.hxx>
+#include <IDocumentLayoutAccess.hxx>
#include <drawinglayer/primitive2d/textprimitive2d.hxx>
#include <drawinglayer/processor2d/baseprocessor2d.hxx>
#include <drawinglayer/attribute/fontattribute.hxx>
@@ -105,12 +110,28 @@ void UnfloatTableButton::MouseButtonDown(const MouseEvent& /*rMEvt*/)
SwDoc& rDoc = pTextFrame->GetDoc();
+ // When we move the table before the first text node, we need to clear RES_PAGEDESC attribute
+ // of the text node otherwise LO will create a page break after the table
+ if (pTextFrame->GetTextNodeFirst())
+ {
+ SfxItemSet aSet(GetEditWin()->GetView().GetWrtShell().GetAttrPool(),
+ svl::Items<RES_PAGEDESC, RES_PAGEDESC>{});
+ aSet.Put(SwFormatPageDesc(nullptr));
+ SwPaM aPaM(*pTextFrame->GetTextNodeFirst());
+ rDoc.getIDocumentContentOperations().InsertItemSet(aPaM, aSet, SetAttrMode::DEFAULT,
+ GetPageFrame()->getRootFrame());
+ }
+
// Move the table outside of the text frame
SwNodeRange aRange(*pTableNode, 0, *pTableNode->EndOfSectionNode(), 1);
rDoc.getIDocumentContentOperations().MoveNodeRange(aRange, aInsertPos, SwMoveFlags::DEFAULT);
// Remove the floating table's frame
- SwFrame::DestroyFrame(pFlyFrame);
+ SwFlyFrameFormat* pFrameFormat = pFlyFrame->GetFormat();
+ if (pFrameFormat)
+ {
+ rDoc.getIDocumentLayoutAccess().DelLayoutFormat(pFrameFormat);
+ }
rDoc.getIDocumentState().SetModified();