From 16c4fefc3dc99dee21a1ea178cd227edc3b0d1b3 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 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/+/163936 Tested-by: Jenkins CollaboraOffice Reviewed-by: Miklos Vajna --- desktop/source/lib/init.cxx | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/desktop/source/lib/init.cxx b/desktop/source/lib/init.cxx index 9b5f50b2a93a..a5e3da349c1d 100644 --- a/desktop/source/lib/init.cxx +++ b/desktop/source/lib/init.cxx @@ -135,6 +135,7 @@ #include #include #include +#include #include #ifdef IOS @@ -4833,6 +4834,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"); @@ -4849,6 +4881,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