From 4ac24a6b7ea3af2fa5fe82f779cfaa294bbc6b6d Mon Sep 17 00:00:00 2001 From: Caolán McNamara Date: Mon, 26 Feb 2024 11:57:43 +0000 Subject: return early without error if no shape it selected on generating preview MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit of current selection. Which can arise in calc on repeatedly double-clicking on a shape and pressing esc. Eventually there will be a case where the shape isn't selected by the time the preview generation is attempted. Change-Id: Ic92149b5e12f35fe69265b6c8df289819313a899 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/163942 Tested-by: Jenkins Reviewed-by: Caolán McNamara --- desktop/source/lib/init.cxx | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) (limited to 'desktop/source') diff --git a/desktop/source/lib/init.cxx b/desktop/source/lib/init.cxx index 5bc92fdb2a5d..4bc426ecd83c 100644 --- a/desktop/source/lib/init.cxx +++ b/desktop/source/lib/init.cxx @@ -133,6 +133,8 @@ #include #include #include +#include +#include #include #ifdef IOS @@ -4820,6 +4822,37 @@ static void doc_postWindowKeyEvent(LibreOfficeKitDocument* /*pThis*/, unsigned n } } +// To be an exportable selection, there must be something selected and that +// selection can't be "ScCellObj" which doesn't can't provide a svg. +// +// Typically a problem arises when double clicking a shape in calc. The 1st +// click selects the shape, triggering generation of a preview, but the second +// shape engers into edit mode befoce doc_renderShapeSelection has a chance to +// fire, at which point the shape is no longer selected. Rather than generate +// an error just return a 0 length result if there is no shape selected, so we +// continue to generate an error if a shape is selected, but could not provide +// an svg. +static bool doc_hasShapeSelection(const css::uno::Reference& rComponent) +{ + uno::Reference xModel(rComponent, uno::UNO_QUERY); + if (!xModel.is()) + return false; + + uno::Reference xController(xModel->getCurrentController()); + if (!xController.is()) + return false; + + uno::Reference xSelectionSupplier(xController, uno::UNO_QUERY); + if (!xSelectionSupplier.is()) + return false; + + Any selection = xSelectionSupplier->getSelection(); + uno::Reference xSelection; + selection >>= xSelection; + + return xSelection && xSelection->getImplementationName() != "ScCellObj"; +} + static size_t doc_renderShapeSelection(LibreOfficeKitDocument* pThis, char** pOutput) { comphelper::ProfileZone aZone("doc_renderShapeSelection"); @@ -4836,6 +4869,9 @@ static size_t doc_renderShapeSelection(LibreOfficeKitDocument* pThis, char** pOu { LibLODocument_Impl* pDocument = static_cast(pThis); + if (!doc_hasShapeSelection(pDocument->mxComponent)) + return 0; + uno::Reference xStorable(pDocument->mxComponent, uno::UNO_QUERY_THROW); SvMemoryStream aOutStream; -- cgit