From c8b68f7d63df9335ab4ef90441d3d2815bb4ddd6 Mon Sep 17 00:00:00 2001 From: Regina Henschel Date: Mon, 8 Oct 2018 19:42:56 +0200 Subject: tdf#119956 unit test, LayerTabBar, adapt focus if Alt+Click The test simulates Alt+Click and checks which tab is current. Some methods have been exported, so that they can be used in the test. The test classes have been changed to get an odg document really opened in Draw. Change-Id: I6ece8594f297c48c862693ead049e6e1f9edbc31 Reviewed-on: https://gerrit.libreoffice.org/61545 Tested-by: Jenkins Reviewed-by: Regina Henschel Reviewed-by: Thorsten Behrens Tested-by: Thorsten Behrens --- sd/qa/unit/data/tdf119956.odg | Bin 0 -> 11124 bytes sd/qa/unit/misc-tests.cxx | 92 ++++++++++++++++++++++++++++++++++++----- sd/qa/unit/sdmodeltestbase.hxx | 3 +- 3 files changed, 83 insertions(+), 12 deletions(-) create mode 100644 sd/qa/unit/data/tdf119956.odg (limited to 'sd/qa') diff --git a/sd/qa/unit/data/tdf119956.odg b/sd/qa/unit/data/tdf119956.odg new file mode 100644 index 000000000000..eb1104035f1a Binary files /dev/null and b/sd/qa/unit/data/tdf119956.odg differ diff --git a/sd/qa/unit/misc-tests.cxx b/sd/qa/unit/misc-tests.cxx index df038e5fde65..2bfd5789407a 100644 --- a/sd/qa/unit/misc-tests.cxx +++ b/sd/qa/unit/misc-tests.cxx @@ -20,6 +20,7 @@ #include #include +#include #include #include #include @@ -46,10 +47,17 @@ #include #include #include -#include +#include #include #include #include +#include +#include +#include +#include +#include + + using namespace ::com::sun::star; @@ -68,6 +76,7 @@ public: void testTdf101242_settings(); void testTdf119392(); void testTdf67248(); + void testTdf119956(); CPPUNIT_TEST_SUITE(SdMiscTest); CPPUNIT_TEST(testTdf96206); @@ -81,6 +90,7 @@ public: CPPUNIT_TEST(testTdf101242_settings); CPPUNIT_TEST(testTdf119392); CPPUNIT_TEST(testTdf67248); + CPPUNIT_TEST(testTdf119956); CPPUNIT_TEST_SUITE_END(); virtual void registerNamespaces(xmlXPathContextPtr& pXmlXPathCtx) override @@ -118,6 +128,17 @@ sd::DrawDocShellRef SdMiscTest::Load(const OUString& rURL, sal_Int32 nFormat) uno::Reference< frame::XFrame > xTargetFrame = xDesktop->findFrame("_blank", 0); CPPUNIT_ASSERT(xTargetFrame.is()); + // This ContainerWindow corresponds to the outermost window of a running LibreOffice. + // It needs a non-zero size and must be shown. Otherwise visible elements like the + // LayerTabBar in Draw have zero size and cannot get mouse events. + // The here used size is freely chosen. + uno::Reference xContainerWindow = xTargetFrame->getContainerWindow(); + CPPUNIT_ASSERT(xContainerWindow.is()); + xContainerWindow->setPosSize(0, 0, 1024, 768, awt::PosSize::SIZE); + VclPtr pContainerWindow = VCLUnoHelper::GetWindow(xContainerWindow); + CPPUNIT_ASSERT(pContainerWindow); + pContainerWindow->Show(true); + // 1. Open the document sd::DrawDocShellRef xDocSh = loadURL(rURL, nFormat); CPPUNIT_ASSERT_MESSAGE("Failed to load file.", xDocSh.is()); @@ -137,16 +158,27 @@ sd::DrawDocShellRef SdMiscTest::Load(const OUString& rURL, sal_Int32 nFormat) sd::ViewShell *pViewShell = xDocSh->GetViewShell(); CPPUNIT_ASSERT(pViewShell); - sd::slidesorter::SlideSorterViewShell* pSSVS = nullptr; - for (int i = 0; i < 1000; i++) + + // Draw has no slidesorter, Impress never shows a LayerTabBar + if (sd::ViewShell::ST_DRAW == pViewShell->GetShellType()) { - // Process all Tasks - slide sorter is created here - while (Scheduler::ProcessTaskScheduling()); - if ((pSSVS = sd::slidesorter::SlideSorterViewShell::GetSlideSorter(pViewShell->GetViewShellBase())) != nullptr) - break; - osl::Thread::wait(std::chrono::milliseconds(100)); + sd::LayerTabBar* pLayerTabBar = static_cast(pViewShell)->GetLayerTabControl(); + CPPUNIT_ASSERT(pLayerTabBar); + pLayerTabBar->StateChanged(StateChangedType::InitShow); + } + else + { + sd::slidesorter::SlideSorterViewShell* pSSVS = nullptr; + for (int i = 0; i < 1000; i++) + { + // Process all Tasks - slide sorter is created here + while (Scheduler::ProcessTaskScheduling()); + if ((pSSVS = sd::slidesorter::SlideSorterViewShell::GetSlideSorter(pViewShell->GetViewShellBase())) != nullptr) + break; + osl::Thread::wait(std::chrono::milliseconds(100)); + } + CPPUNIT_ASSERT(pSSVS); } - CPPUNIT_ASSERT(pSSVS); return xDocSh; } @@ -497,7 +529,7 @@ void SdMiscTest::testTdf119392() // Loads a document which has two user layers "V--" and "V-L". Inserts a new layer "-P-" between them. // Checks, that the bitfields in the saved file have the bits in the correct order. - sd::DrawDocShellRef xDocShRef = Load(m_directories.getURLFromSrc("/sd/qa/unit/data/tdf119392_InsertLayer.odg"), ODG); + sd::DrawDocShellRef xDocShRef = Load(m_directories.getURLFromSrc("sd/qa/unit/data/tdf119392_InsertLayer.odg"), ODG); CPPUNIT_ASSERT_MESSAGE("Failed to load file.", xDocShRef.is()); // Insert layer "-P-", not visible, printable, not locked SdrView* pView = xDocShRef -> GetViewShell()->GetView(); @@ -542,7 +574,7 @@ void SdMiscTest::testTdf67248() // The document tdf67248.odg has been created with a German UI. It has a user layer named "Background". // On opening the user layer must still exists. The error was, that it was merged into the standard // layer "background". - sd::DrawDocShellRef xDocShRef = Load(m_directories.getURLFromSrc("/sd/qa/unit/data/tdf67248.odg"), ODG); + sd::DrawDocShellRef xDocShRef = Load(m_directories.getURLFromSrc("sd/qa/unit/data/tdf67248.odg"), ODG); CPPUNIT_ASSERT_MESSAGE("Failed to load file.", xDocShRef.is()); SdrLayerAdmin& rLayerAdmin = xDocShRef->GetDoc()->GetLayerAdmin(); CPPUNIT_ASSERT_EQUAL( sal_uInt16(6), rLayerAdmin.GetLayerCount()); @@ -550,6 +582,44 @@ void SdMiscTest::testTdf67248() xDocShRef->DoClose(); } +void SdMiscTest::testTdf119956() +{ + sd::DrawDocShellRef xDocShRef = Load(m_directories.getURLFromSrc("sd/qa/unit/data/tdf119956.odg"), ODG); + CPPUNIT_ASSERT_MESSAGE("Failed to load file.", xDocShRef.is()); + sd::GraphicViewShell* pGraphicViewShell = static_cast(xDocShRef -> GetViewShell()); + CPPUNIT_ASSERT(pGraphicViewShell); + sd::LayerTabBar* pLayerTabBar = pGraphicViewShell->GetLayerTabControl(); + CPPUNIT_ASSERT(pLayerTabBar); + + // Alt+Click sets a tab in edit mode, so that you can rename it. + // The error was, that Alt+Click on a tab, which was not the current tab, did not set the clicked tab + // as current tab. As a result, the entered text was applied to the wrong tab. + + // The test document has the layer tabs "layout", "controls", "measurelines" and "Layer4" in this order + // The "pagePos" is 0, 1, 2, 3 + // Make sure, that tab "layout" is the current tab. + MouseEvent aSyntheticMouseEvent; + if (pLayerTabBar->GetCurPagePos() != 0) + { + sal_uInt16 nIdOfTabPos0(pLayerTabBar->GetPageId(0)); + tools::Rectangle aTabPos0Rect(pLayerTabBar->GetPageRect(nIdOfTabPos0)); + aSyntheticMouseEvent = MouseEvent(aTabPos0Rect.Center(), 1, MouseEventModifiers::SYNTHETIC, MOUSE_LEFT, 0); + pLayerTabBar->MouseButtonDown(aSyntheticMouseEvent); + } + CPPUNIT_ASSERT_EQUAL(sal_uInt16(0), pLayerTabBar->GetCurPagePos()); + + // Alt+Click on tab "Layer4" + sal_uInt16 nIdOfTabPos3(pLayerTabBar->GetPageId(3)); + tools::Rectangle aTabPos3Rect(pLayerTabBar->GetPageRect(nIdOfTabPos3)); + aSyntheticMouseEvent = MouseEvent(aTabPos3Rect.Center(), 1, MouseEventModifiers::SYNTHETIC, MOUSE_LEFT, KEY_MOD2); + pLayerTabBar->MouseButtonDown(aSyntheticMouseEvent); + + // Make sure, tab 3 is current tab now. + CPPUNIT_ASSERT_EQUAL(sal_uInt16(3), pLayerTabBar->GetCurPagePos()); + + xDocShRef->DoClose(); +} + CPPUNIT_TEST_SUITE_REGISTRATION(SdMiscTest); CPPUNIT_PLUGIN_IMPLEMENT(); diff --git a/sd/qa/unit/sdmodeltestbase.hxx b/sd/qa/unit/sdmodeltestbase.hxx index 089e36c6dd63..153798399cb1 100644 --- a/sd/qa/unit/sdmodeltestbase.hxx +++ b/sd/qa/unit/sdmodeltestbase.hxx @@ -20,6 +20,7 @@ #include #include +#include #include #include #include @@ -147,7 +148,7 @@ protected: pFilter->SetVersion(SOFFICE_FILEFORMAT_CURRENT); std::shared_ptr pFilt(pFilter); - ::sd::DrawDocShellRef xDocShRef = new ::sd::DrawDocShell(SfxObjectCreateMode::EMBEDDED, false, DocumentType::Draw); + ::sd::DrawDocShellRef xDocShRef = new ::sd::GraphicDocShell(SfxObjectCreateMode::EMBEDDED); SfxMedium* pSrcMed = new SfxMedium(rURL, StreamMode::STD_READ, pFilt, std::move(pParams)); if ( !xDocShRef->DoLoad(pSrcMed) || !xDocShRef.is() ) { -- cgit