office-gobmx/sw/qa/uibase/docvw/docvw.cxx
Xisco Fauli fb41273bf4 sw/qa: use getSwDocShell() when possible
Change-Id: Ia2e3dad4e62fb084c3a88564deb137cbcc7728b5
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/175573
Tested-by: Jenkins
Reviewed-by: Xisco Fauli <xiscofauli@libreoffice.org>
2024-10-25 09:23:21 +02:00

192 lines
7.8 KiB
C++

/* -*- 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/text/XTextDocument.hpp>
#include <vcl/event.hxx>
#include <docsh.hxx>
#include <edtwin.hxx>
#include <flyfrm.hxx>
#include <frameformats.hxx>
#include <view.hxx>
#include <wrtsh.hxx>
namespace
{
/// Covers sw/source/uibase/docvw/ fixes.
class Test : public SwModelTestBase
{
};
}
CPPUNIT_TEST_FIXTURE(Test, testShiftClickOnImage)
{
// Given a document with a fly frame:
createSwDoc();
SwDoc* pDoc = getSwDoc();
SwWrtShell* pWrtShell = getSwDocShell()->GetWrtShell();
uno::Reference<lang::XMultiServiceFactory> xMSF(mxComponent, uno::UNO_QUERY);
uno::Reference<text::XTextDocument> xTextDocument(mxComponent, uno::UNO_QUERY);
uno::Reference<text::XText> xText = xTextDocument->getText();
uno::Reference<text::XTextCursor> xCursor = xText->createTextCursor();
uno::Reference<beans::XPropertySet> xTextGraphic(
xMSF->createInstance(u"com.sun.star.text.TextGraphicObject"_ustr), uno::UNO_QUERY);
xTextGraphic->setPropertyValue(u"AnchorType"_ustr,
uno::Any(text::TextContentAnchorType_AS_CHARACTER));
xTextGraphic->setPropertyValue(u"Size"_ustr, uno::Any(awt::Size(5000, 5000)));
uno::Reference<text::XTextContent> xTextContent(xTextGraphic, uno::UNO_QUERY);
xText->insertTextContent(xCursor, xTextContent, false);
pWrtShell->SttEndDoc(/*bStt=*/false);
// When shift-clicking on that fly frame:
auto& rSpzFormats = *pDoc->GetSpzFrameFormats();
auto pFrameFormat = dynamic_cast<SwFlyFrameFormat*>(rSpzFormats[0]);
CPPUNIT_ASSERT(pFrameFormat);
SwFlyFrame* pFlyFrame = pFrameFormat->GetFrame();
vcl::Window& rEditWin = getSwDocShell()->GetView()->GetEditWin();
Point aFlyCenter = rEditWin.LogicToPixel(pFlyFrame->getFrameArea().Center());
MouseEvent aClickEvent(aFlyCenter, 1, MouseEventModifiers::SIMPLECLICK, MOUSE_LEFT, KEY_SHIFT);
rEditWin.MouseButtonDown(aClickEvent);
rEditWin.MouseButtonUp(aClickEvent);
// Then make sure that the fly frame is selected:
SelectionType eType = pWrtShell->GetSelectionType();
// Without the accompanying fix in place, this test would have failed with:
// - Expected: 2 (SelectionType::Graphic)
// - Actual : 1 (SelectionType::Text)
// i.e. the fly frame was not selected, while a plain click or ctrl-click selected it.
CPPUNIT_ASSERT_EQUAL(SelectionType::Graphic, eType);
}
namespace
{
/// Interception implementation that catches the graphic dialog.
class GraphicDialogInterceptor : public cppu::WeakImplHelper<frame::XDispatchProviderInterceptor>
{
uno::Reference<frame::XDispatchProvider> m_xMaster;
uno::Reference<frame::XDispatchProvider> m_xSlave;
int m_nGraphicDialogs = 0;
public:
// XDispatchProviderInterceptor
uno::Reference<frame::XDispatchProvider> SAL_CALL getMasterDispatchProvider() override;
uno::Reference<frame::XDispatchProvider> SAL_CALL getSlaveDispatchProvider() override;
void SAL_CALL setMasterDispatchProvider(
const uno::Reference<frame::XDispatchProvider>& xNewSupplier) override;
void SAL_CALL
setSlaveDispatchProvider(const uno::Reference<frame::XDispatchProvider>& xNewSupplier) override;
// XDispatchProvider
uno::Reference<frame::XDispatch> SAL_CALL queryDispatch(const util::URL& rURL,
const OUString& rTargetFrameName,
sal_Int32 SearchFlags) override;
uno::Sequence<uno::Reference<frame::XDispatch>> SAL_CALL
queryDispatches(const uno::Sequence<frame::DispatchDescriptor>& rRequests) override;
int GetGraphicDialogs() const;
};
}
uno::Reference<frame::XDispatchProvider> GraphicDialogInterceptor::getMasterDispatchProvider()
{
return m_xMaster;
}
uno::Reference<frame::XDispatchProvider> GraphicDialogInterceptor::getSlaveDispatchProvider()
{
return m_xSlave;
}
void GraphicDialogInterceptor::setMasterDispatchProvider(
const uno::Reference<frame::XDispatchProvider>& xNewSupplier)
{
m_xMaster = xNewSupplier;
}
void GraphicDialogInterceptor::setSlaveDispatchProvider(
const uno::Reference<frame::XDispatchProvider>& xNewSupplier)
{
m_xSlave = xNewSupplier;
}
uno::Reference<frame::XDispatch>
GraphicDialogInterceptor::queryDispatch(const util::URL& rURL, const OUString& rTargetFrameName,
sal_Int32 nSearchFlags)
{
if (rURL.Complete == ".uno:GraphicDialog")
{
++m_nGraphicDialogs;
}
return m_xSlave->queryDispatch(rURL, rTargetFrameName, nSearchFlags);
}
uno::Sequence<uno::Reference<frame::XDispatch>> GraphicDialogInterceptor::queryDispatches(
const uno::Sequence<frame::DispatchDescriptor>& /*rRequests*/)
{
return {};
}
int GraphicDialogInterceptor::GetGraphicDialogs() const { return m_nGraphicDialogs; }
CPPUNIT_TEST_FIXTURE(Test, testShiftDoubleClickOnImage)
{
// Given a document with a fly frame, and an interceptor to catch the graphic dialog:
createSwDoc();
SwDoc* pDoc = getSwDoc();
SwWrtShell* pWrtShell = getSwDocShell()->GetWrtShell();
uno::Reference<lang::XMultiServiceFactory> xMSF(mxComponent, uno::UNO_QUERY);
uno::Reference<text::XTextDocument> xTextDocument(mxComponent, uno::UNO_QUERY);
uno::Reference<text::XText> xText = xTextDocument->getText();
uno::Reference<text::XTextCursor> xCursor = xText->createTextCursor();
uno::Reference<beans::XPropertySet> xTextGraphic(
xMSF->createInstance(u"com.sun.star.text.TextGraphicObject"_ustr), uno::UNO_QUERY);
xTextGraphic->setPropertyValue(u"AnchorType"_ustr,
uno::Any(text::TextContentAnchorType_AS_CHARACTER));
xTextGraphic->setPropertyValue(u"Size"_ustr, uno::Any(awt::Size(5000, 5000)));
uno::Reference<text::XTextContent> xTextContent(xTextGraphic, uno::UNO_QUERY);
xText->insertTextContent(xCursor, xTextContent, false);
pWrtShell->SttEndDoc(/*bStt=*/false);
uno::Reference<frame::XModel> xModel(mxComponent, uno::UNO_QUERY);
uno::Reference<frame::XDispatchProviderInterception> xRegistration(
xModel->getCurrentController()->getFrame(), uno::UNO_QUERY);
rtl::Reference pInterceptor(new GraphicDialogInterceptor);
xRegistration->registerDispatchProviderInterceptor(pInterceptor);
// When shift-double-clicking on that fly frame:
auto& rSpzFormats = *pDoc->GetSpzFrameFormats();
auto pFrameFormat = dynamic_cast<SwFlyFrameFormat*>(rSpzFormats[0]);
CPPUNIT_ASSERT(pFrameFormat);
SwFlyFrame* pFlyFrame = pFrameFormat->GetFrame();
vcl::Window& rEditWin = getSwDocShell()->GetView()->GetEditWin();
Point aFlyCenter = rEditWin.LogicToPixel(pFlyFrame->getFrameArea().Center());
MouseEvent aClickEvent(aFlyCenter, 1, MouseEventModifiers::SIMPLECLICK, MOUSE_LEFT, KEY_SHIFT);
rEditWin.MouseButtonDown(aClickEvent);
rEditWin.MouseButtonUp(aClickEvent);
aClickEvent
= MouseEvent(aFlyCenter, 2, MouseEventModifiers::SIMPLECLICK, MOUSE_LEFT, KEY_SHIFT);
rEditWin.MouseButtonDown(aClickEvent);
rEditWin.MouseButtonUp(aClickEvent);
// Then make sure that the fly frame's dialog is dispatched:
int nGraphicDialogs = pInterceptor->GetGraphicDialogs();
// Without the accompanying fix in place, this test would have failed with:
// - Expected greater than: 0 (2)
// - Actual : 0
// i.e. the fly frame's dialog was not dispatched, while a plain click or ctrl-click dispatched
// it.
CPPUNIT_ASSERT_GREATER(0, nGraphicDialogs);
}
CPPUNIT_PLUGIN_IMPLEMENT();
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */