filter/source/svg/svgfilter.cxx | 38 +++++++++++++++++++++++--------------- filter/source/svg/svgfilter.hxx | 1 + 2 files changed, 24 insertions(+), 15 deletions(-)
New commits: commit cde5aa1e55bc5af29e484bd6da9078d49a825edc Author: Mike Kaganski <mike.kagan...@collabora.com> AuthorDate: Thu May 29 07:38:37 2025 +0200 Commit: Xisco Fauli <xiscofa...@libreoffice.org> CommitDate: Wed Jun 4 10:10:08 2025 +0200 tdf#166779: use model first to obtain selection The current frame can be Basic, so only use it as a fallback to obtain selection. Also, failure to get the selection is not fatal here. The throwing behavior was since commit aa1927dc257b52edf96de220cc3797e02c83a0ae (Make svg export use slidesorter selection in most cases., 2012-10-10). Change-Id: I06f80151b4184f353d1d5387c11837f1e883a068 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/185983 Reviewed-by: Mike Kaganski <mike.kagan...@collabora.com> Tested-by: Jenkins (cherry picked from commit 58ba249df589b0c9f91667f2938bfa18d2a1ce61) Reviewed-on: https://gerrit.libreoffice.org/c/core/+/185991 Reviewed-by: Xisco Fauli <xiscofa...@libreoffice.org> diff --git a/filter/source/svg/svgfilter.cxx b/filter/source/svg/svgfilter.cxx index 04514f029425..b50c1c12d7f9 100644 --- a/filter/source/svg/svgfilter.cxx +++ b/filter/source/svg/svgfilter.cxx @@ -149,15 +149,28 @@ sal_Bool SAL_CALL SVGFilter::filter( const Sequence< PropertyValue >& rDescripto return filterImpressOrDraw(rDescriptor); } +css::uno::Reference<css::frame::XController> SVGFilter::getSourceController() const +{ + uno::Reference<frame::XController> xController; + // Current frame may be e.g. Basic. Try to get a controller from the source model first. + if (auto xModel = mxSrcDoc.query<frame::XModel>()) + xController = xModel->getCurrentController(); + // Try current frame as a fallback. + if (!xController) + { + uno::Reference<frame::XDesktop2> xDesktop(frame::Desktop::create(mxContext)); + if (auto xFrame = xDesktop->getCurrentFrame()) // Manage headless case + xController = xFrame->getController(); + } + return xController; +} + css::uno::Reference<css::frame::XController> SVGFilter::fillDrawImpressSelectedPages() { - uno::Reference<frame::XDesktop2> xDesktop(frame::Desktop::create(mxContext)); - uno::Reference<frame::XFrame> xFrame = xDesktop->getCurrentFrame(); // Manage headless case - if (!xFrame) + uno::Reference<frame::XController> xController = getSourceController(); + uno::Reference<drawing::framework::XControllerManager> xManager(xController, uno::UNO_QUERY); + if (!xManager) return {}; - uno::Reference<frame::XController> xController(xFrame->getController(), uno::UNO_SET_THROW); - uno::Reference<drawing::framework::XControllerManager> xManager(xController, - uno::UNO_QUERY_THROW); uno::Reference<drawing::framework::XConfigurationController> xConfigController( xManager->getConfigurationController()); @@ -210,9 +223,9 @@ css::uno::Reference<css::frame::XController> SVGFilter::fillDrawImpressSelectedP if (mSelectedPages.empty()) { - // apparently failed to clean selection - fallback to current page - uno::Reference<drawing::XDrawView> xDrawView(xController, uno::UNO_QUERY_THROW); - mSelectedPages.push_back(xDrawView->getCurrentPage()); + // apparently failed to get a selection - fallback to current page + if (auto xDrawView = xController.query<drawing::XDrawView>()) + mSelectedPages.push_back(xDrawView->getCurrentPage()); } return xController; } @@ -580,12 +593,7 @@ bool SVGFilter::filterWriterOrCalc( const Sequence< PropertyValue >& rDescriptor if(!bSelectionOnly) // For Writer only the selection-only mode is supported return false; - uno::Reference<frame::XDesktop2> xDesktop(frame::Desktop::create(mxContext)); - uno::Reference<frame::XController > xController; - if (uno::Reference<frame::XFrame> xFrame = xDesktop->getCurrentFrame()) - xController.set(xFrame->getController(), uno::UNO_SET_THROW); - - Reference< view::XSelectionSupplier > xSelection (xController, UNO_QUERY); + Reference<view::XSelectionSupplier> xSelection(getSourceController(), UNO_QUERY); if (!xSelection.is()) return false; diff --git a/filter/source/svg/svgfilter.hxx b/filter/source/svg/svgfilter.hxx index 90bd682fdb95..902f42b8aab2 100644 --- a/filter/source/svg/svgfilter.hxx +++ b/filter/source/svg/svgfilter.hxx @@ -284,6 +284,7 @@ private: bool filterImpressOrDraw( const Sequence< PropertyValue >& rDescriptor ); bool filterWriterOrCalc( const Sequence< PropertyValue >& rDescriptor ); + css::uno::Reference<css::frame::XController> getSourceController() const; css::uno::Reference<css::frame::XController> fillDrawImpressSelectedPages(); protected: