/* -*- 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 #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include namespace { class SwUiWriterTest9 : public SwModelTestBase { public: SwUiWriterTest9() : SwModelTestBase("/sw/qa/extras/uiwriter/data/") { } }; CPPUNIT_TEST_FIXTURE(SwUiWriterTest9, testTdf158785) { // given a document with a hyperlink surrounded by N-dashes (–www.dordt.edu–) createSwDoc("tdf158785_hyperlink.fodt"); SwDoc& rDoc = *getSwDoc(); SwWrtShell* pWrtShell = rDoc.GetDocShell()->GetWrtShell(); CPPUNIT_ASSERT(pWrtShell); // go to the end of the hyperlink pWrtShell->SttEndDoc(/*bStart=*/false); pWrtShell->Left(SwCursorSkipMode::Chars, /*bSelect=*/false, 1, /*bBasicCall=*/false); // get last point that will be part of the hyperlink (current position 1pt wide). Point aLogicL(pWrtShell->GetCharRect().Center()); Point aLogicR(aLogicL); // sanity check - we really are right by the hyperlink aLogicL.AdjustX(-1); SwContentAtPos aContentAtPos(IsAttrAtPos::InetAttr); pWrtShell->GetContentAtPos(aLogicL, aContentAtPos); CPPUNIT_ASSERT_EQUAL(IsAttrAtPos::InetAttr, aContentAtPos.eContentAtPos); // The test: the position of the N-dash should not indicate hyperlink properties // cursor pos would NOT be considered part of the hyperlink, but increase for good measure... aLogicR.AdjustX(1); pWrtShell->GetContentAtPos(aLogicR, aContentAtPos); CPPUNIT_ASSERT_EQUAL(IsAttrAtPos::NONE, aContentAtPos.eContentAtPos); } CPPUNIT_TEST_FIXTURE(SwUiWriterTest9, testTdf159049) { // The document contains a shape which has a text with a line break. When copying the text to // clipboard the line break was missing in the RTF flavor of the clipboard. createSwDoc("tdf159049_LineBreakRTFClipboard.fodt"); CPPUNIT_ASSERT_EQUAL(1, getShapes()); selectShape(1); // Bring shape into text edit mode SwXTextDocument* pTextDoc = dynamic_cast(mxComponent.get()); CPPUNIT_ASSERT(pTextDoc); pTextDoc->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 0, KEY_RETURN); pTextDoc->postKeyEvent(LOK_KEYEVENT_KEYUP, 0, KEY_RETURN); Scheduler::ProcessEventsToIdle(); // Copy text dispatchCommand(mxComponent, ".uno:SelectAll", {}); dispatchCommand(mxComponent, ".uno:Copy", {}); // Deactivate text edit mode ... pTextDoc->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 0, KEY_ESCAPE); pTextDoc->postKeyEvent(LOK_KEYEVENT_KEYUP, 0, KEY_ESCAPE); Scheduler::ProcessEventsToIdle(); // ... and deselect shape. pTextDoc->postKeyEvent(LOK_KEYEVENT_KEYINPUT, 0, KEY_ESCAPE); pTextDoc->postKeyEvent(LOK_KEYEVENT_KEYUP, 0, KEY_ESCAPE); Scheduler::ProcessEventsToIdle(); // Paste special as RTF uno::Sequence aArgs(comphelper::InitPropertySequence( { { "SelectedFormat", uno::Any(static_cast(SotClipboardFormatId::RTF)) } })); dispatchCommand(mxComponent, ".uno:ClipboardFormatItems", aArgs); // Without fix Actual was "Abreakhere", the line break \n was missing. CPPUNIT_ASSERT_EQUAL(u"Abreak\nhere"_ustr, getParagraph(1)->getString()); } CPPUNIT_TEST_FIXTURE(SwUiWriterTest9, testTdf135083) { createSwDoc("tdf135083-simple-text-plus-list.fodt"); dispatchCommand(mxComponent, u".uno:SelectAll"_ustr, {}); dispatchCommand(mxComponent, u".uno:Copy"_ustr, {}); // Paste special as RTF uno::Sequence aArgs(comphelper::InitPropertySequence( { { u"SelectedFormat"_ustr, uno::Any(static_cast(SotClipboardFormatId::RTF)) } })); dispatchCommand(mxComponent, ".uno:ClipboardFormatItems", aArgs); auto xLastPara = getParagraph(3); CPPUNIT_ASSERT_EQUAL(u"dolor"_ustr, xLastPara->getString()); // Without the fix in place, the last paragraph would loose its settings. ListId would be empty. CPPUNIT_ASSERT(!getProperty(xLastPara, u"ListId"_ustr).isEmpty()); } CPPUNIT_TEST_FIXTURE(SwUiWriterTest9, testHiddenSectionsAroundPageBreak) { createSwDoc("hiddenSectionsAroundPageBreak.fodt"); CPPUNIT_ASSERT_EQUAL(1, getPages()); auto xModel(mxComponent.queryThrow()); auto xTextViewCursorSupplier( xModel->getCurrentController().queryThrow()); auto xCursor(xTextViewCursorSupplier->getViewCursor().queryThrow()); // Make sure that the page style is set correctly xCursor->jumpToFirstPage(); CPPUNIT_ASSERT_EQUAL(u"Landscape"_ustr, getProperty(xCursor, "PageStyleName")); } CPPUNIT_TEST_FIXTURE(SwUiWriterTest9, testTdf159565) { // Given a document with a hidden section in the beginning, additionally containing a frame createSwDoc("FrameInHiddenSection.fodt"); dispatchCommand(mxComponent, u".uno:SelectAll"_ustr, {}); // Check that the selection covers the whole visible text auto xModel(mxComponent.queryThrow()); auto xSelSupplier(xModel->getCurrentController().queryThrow()); auto xSelections(xSelSupplier->getSelection().queryThrow()); CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xSelections->getCount()); auto xSelection(xSelections->getByIndex(0).queryThrow()); // Without the fix, this would fail - there was no selection CPPUNIT_ASSERT_EQUAL(u"" SAL_NEWLINE_STRING SAL_NEWLINE_STRING "ipsum"_ustr, xSelection->getString()); } CPPUNIT_TEST_FIXTURE(SwUiWriterTest9, testTdf159816) { createSwDoc(); SwDoc* pDoc = getSwDoc(); CPPUNIT_ASSERT(pDoc); SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell(); CPPUNIT_ASSERT(pWrtShell); // Add 5 empty paragraphs pWrtShell->SplitNode(); pWrtShell->SplitNode(); pWrtShell->SplitNode(); pWrtShell->SplitNode(); pWrtShell->SplitNode(); // Add a bookmark at the very end IDocumentMarkAccess& rIDMA(*pDoc->getIDocumentMarkAccess()); rIDMA.makeMark(*pWrtShell->GetCursor(), "Mark", IDocumentMarkAccess::MarkType::BOOKMARK, sw::mark::InsertMode::New); // Get coordinates of the end point in the document SwRootFrame* pLayout = pDoc->getIDocumentLayoutAccess().GetCurrentLayout(); SwFrame* pPage = pLayout->Lower(); SwFrame* pBody = pPage->GetLower(); SwFrame* pLastPara = pBody->GetLower()->GetNext()->GetNext()->GetNext()->GetNext()->GetNext(); Point ptTo = pLastPara->getFrameArea().BottomRight(); pWrtShell->SelAll(); // Drag-n-drop to its own end rtl::Reference xTransfer = new SwTransferable(*pWrtShell); // Without the fix, this would crash: either in CopyFlyInFlyImpl (tdf#159813): // Assertion failed: !pCopiedPaM || pCopiedPaM->End()->GetNode() == rRg.aEnd.GetNode() // or in BigPtrArray::operator[] (tdf#159816): // Assertion failed: idx < m_nSize xTransfer->PrivateDrop(*pWrtShell, ptTo, /*bMove=*/true, /*bXSelection=*/true); } } // end of anonymous namespace CPPUNIT_PLUGIN_IMPLEMENT(); /* vim:set shiftwidth=4 softtabstop=4 expandtab: */