sw/qa/extras/tiledrendering/tiledrendering.cxx | 33 +++++++++++++++++++++++++ sw/source/uibase/docvw/edtwin.cxx | 10 ++++++- 2 files changed, 42 insertions(+), 1 deletion(-)
New commits: commit f3bedf92fb8d07114bc3d53d8a01928c77e479fc Author: Miklos Vajna <vmik...@collabora.com> AuthorDate: Tue Jan 12 17:10:49 2021 +0100 Commit: Miklos Vajna <vmik...@collabora.com> CommitDate: Wed Jan 13 09:03:34 2021 +0100 sw edit win: fix read-only selections while handling ExtTextInput When typing into a protected section (or other read-only area), the code goes through SwEditWin::KeyInput(), which checks for HasReadonlySel(), and calls into sw::DocumentContentOperationsManager::InsertString() in the read-write case. When typing via ExtTextInput (e.g. Online), then SwEditWin::Command() called into sw::DocumentContentOperationsManager::InsertString() without such a check. The convention is to do a read-only check in the first Writer function called by vcl, so handle this in SwEditWin::Command(), to have exactly 1 read-only popup on typing a character. (cherry picked from commit 0c03a97fb8844ad0de1abea79b5265617a509460) Conflicts: sw/qa/extras/tiledrendering/tiledrendering.cxx Change-Id: I7d002e7d76bffeb6f16750de735c5bbf13a7bba9 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/109212 Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoff...@gmail.com> Reviewed-by: Miklos Vajna <vmik...@collabora.com> diff --git a/sw/qa/extras/tiledrendering/tiledrendering.cxx b/sw/qa/extras/tiledrendering/tiledrendering.cxx index 2f52c97efec1..d5d638e9b4ca 100644 --- a/sw/qa/extras/tiledrendering/tiledrendering.cxx +++ b/sw/qa/extras/tiledrendering/tiledrendering.cxx @@ -14,6 +14,7 @@ #include <com/sun/star/frame/XDispatchResultListener.hpp> #include <com/sun/star/frame/XStorable.hpp> #include <swmodeltestbase.hxx> +#include <com/sun/star/text/XTextViewCursorSupplier.hpp> #include <test/helper/transferable.hxx> #include <LibreOfficeKit/LibreOfficeKitEnums.h> #include <comphelper/dispatchcommand.hxx> @@ -132,6 +133,7 @@ public: void testDropDownFormFieldButtonNoItem(); void testSpellOnlineRenderParameter(); void testTablePaintInvalidate(); + void testExtTextInputReadOnly(); CPPUNIT_TEST_SUITE(SwTiledRenderingTest); CPPUNIT_TEST(testRegisterCallback); @@ -202,6 +204,7 @@ public: CPPUNIT_TEST(testDropDownFormFieldButtonNoItem); CPPUNIT_TEST(testSpellOnlineRenderParameter); CPPUNIT_TEST(testTablePaintInvalidate); + CPPUNIT_TEST(testExtTextInputReadOnly); CPPUNIT_TEST_SUITE_END(); private: @@ -2793,6 +2796,36 @@ void SwTiledRenderingTest::testTablePaintInvalidate() CPPUNIT_ASSERT_EQUAL(0, m_nInvalidations); } +void SwTiledRenderingTest::testExtTextInputReadOnly() +{ + // Create a document with a protected section + a normal paragraph after it. + SwXTextDocument* pXTextDocument = createDoc(); + uno::Reference<text::XTextViewCursorSupplier> xController( + pXTextDocument->getCurrentController(), uno::UNO_QUERY); + uno::Reference<text::XTextViewCursor> xCursor = xController->getViewCursor(); + uno::Reference<text::XText> xText = xCursor->getText(); + uno::Reference<text::XTextContent> xSection( + pXTextDocument->createInstance("com.sun.star.text.TextSection"), uno::UNO_QUERY); + uno::Reference<beans::XPropertySet> xSectionProps(xSection, uno::UNO_QUERY); + xSectionProps->setPropertyValue("IsProtected", uno::Any(true)); + xText->insertTextContent(xCursor, xSection, /*bAbsorb=*/true); + + // First paragraph is the protected section, is it empty? + VclPtr<vcl::Window> pEditWin = pXTextDocument->getDocWindow(); + CPPUNIT_ASSERT(pEditWin); + CPPUNIT_ASSERT(getParagraph(1)->getString().isEmpty()); + + // Try to type into the protected section, is it still empty? + SwWrtShell* pWrtShell = pXTextDocument->GetDocShell()->GetWrtShell(); + pWrtShell->SttEndDoc(/*bStt=*/true); + SfxLokHelper::postExtTextEventAsync(pEditWin, LOK_EXT_TEXTINPUT, "x"); + SfxLokHelper::postExtTextEventAsync(pEditWin, LOK_EXT_TEXTINPUT_END, "x"); + Scheduler::ProcessEventsToIdle(); + // Without the accompanying fix in place, this test would have failed, as it was possible to + // type into the protected section. + CPPUNIT_ASSERT(getParagraph(1)->getString().isEmpty()); +} + CPPUNIT_TEST_SUITE_REGISTRATION(SwTiledRenderingTest); CPPUNIT_PLUGIN_IMPLEMENT(); diff --git a/sw/source/uibase/docvw/edtwin.cxx b/sw/source/uibase/docvw/edtwin.cxx index e9d794eb2e0b..facc9e95bda0 100644 --- a/sw/source/uibase/docvw/edtwin.cxx +++ b/sw/source/uibase/docvw/edtwin.cxx @@ -5392,7 +5392,7 @@ void SwEditWin::Command( const CommandEvent& rCEvt ) { bool bIsDocReadOnly = m_rView.GetDocShell()->IsReadOnly() && rSh.IsCursorReadonly(); - if(!bIsDocReadOnly) + if (!bIsDocReadOnly && !rSh.HasReadonlySel()) { if( m_pQuickHlpData->m_bIsDisplayed ) m_pQuickHlpData->Stop( rSh ); @@ -5426,6 +5426,14 @@ void SwEditWin::Command( const CommandEvent& rCEvt ) } } } + + if (rSh.HasReadonlySel()) + { + // Inform the user that the request has been ignored. + auto xInfo = std::make_shared<weld::GenericDialogController>( + GetFrameWeld(), "modules/swriter/ui/inforeadonlydialog.ui", "InfoReadonlyDialog"); + weld::DialogController::runAsync(xInfo, [](sal_Int32 /*nResult*/) {}); + } } break; case CommandEventId::CursorPos: _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits