[Libreoffice-commits] core.git: Branch 'distro/collabora/cp-6.4' - sw/qa sw/source
Miklos Vajna (via logerrit)
logerrit at kemper.freedesktop.org
Wed Jan 13 08:04:08 UTC 2021
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 <vmiklos at collabora.com>
AuthorDate: Tue Jan 12 17:10:49 2021 +0100
Commit: Miklos Vajna <vmiklos at 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 <jenkinscollaboraoffice at gmail.com>
Reviewed-by: Miklos Vajna <vmiklos at 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:
More information about the Libreoffice-commits
mailing list