sc/inc/datauno.hxx | 12 ++--- sc/source/filter/inc/autofilterbuffer.hxx | 6 +- sc/source/filter/inc/workbookhelper.hxx | 2 sc/source/filter/oox/autofilterbuffer.cxx | 66 ++++++++++++++++-------------- sc/source/filter/oox/tablebuffer.cxx | 11 +++-- sc/source/filter/oox/workbookhelper.cxx | 13 ++--- 6 files changed, 60 insertions(+), 50 deletions(-)
New commits: commit 298058908dff3fbb0255f58c40c16f1cb9273006 Author: Daniel Lee <[email protected]> AuthorDate: Sat Feb 7 21:23:31 2026 -0600 Commit: Ilmari Lauhakangas <[email protected]> CommitDate: Sun Feb 8 17:37:47 2026 +0100 tdf#48140 Remove uno calls in autofilterbuffer.cxx The code for the finalizeImport functions in autofilterbuffer.cxx currently uses the uno types for database ranges and filter descriptors. These have been replaced with their sc implementations ScDatabaseRangeObj and ScRangeFilterDescriptor. Change-Id: I67e3852664c5ff636af504f1399e8310ffd41978 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/198895 Tested-by: Jenkins Reviewed-by: Noel Grandin <[email protected]> Reviewed-by: Ilmari Lauhakangas <[email protected]> diff --git a/sc/inc/datauno.hxx b/sc/inc/datauno.hxx index 18357dab151f..e2cc09787b87 100644 --- a/sc/inc/datauno.hxx +++ b/sc/inc/datauno.hxx @@ -277,7 +277,7 @@ public: ScFilterDescriptorBase(ScDocShell* pDocShell); virtual ~ScFilterDescriptorBase() override; - virtual void Notify( SfxBroadcaster& rBC, const SfxHint& rHint ) override; + SC_DLLPUBLIC virtual void Notify(SfxBroadcaster& rBC, const SfxHint& rHint) override; // in the derived classes(?): // (nField[] here within the area) @@ -297,17 +297,17 @@ public: css::sheet::TableFilterField2 >& aFilterFields ) override; // XSheetFilterDescriptor3 - virtual css::uno::Sequence< css::sheet::TableFilterField3 > SAL_CALL + SC_DLLPUBLIC virtual css::uno::Sequence< css::sheet::TableFilterField3 > SAL_CALL getFilterFields3() override; - virtual void SAL_CALL setFilterFields3( const css::uno::Sequence< + SC_DLLPUBLIC virtual void SAL_CALL setFilterFields3( const css::uno::Sequence< css::sheet::TableFilterField3 >& aFilterFields ) override; // XPropertySet virtual css::uno::Reference< css::beans::XPropertySetInfo > SAL_CALL getPropertySetInfo() override; - virtual void SAL_CALL setPropertyValue( const OUString& aPropertyName, + SC_DLLPUBLIC virtual void SAL_CALL setPropertyValue(const OUString& aPropertyName, const css::uno::Any& aValue ) override; - virtual css::uno::Any SAL_CALL getPropertyValue( + SC_DLLPUBLIC virtual css::uno::Any SAL_CALL getPropertyValue( const OUString& PropertyName ) override; virtual void SAL_CALL addPropertyChangeListener( const OUString& aPropertyName, const css::uno::Reference< @@ -350,7 +350,7 @@ public: // ScRangeFilterDescriptor - FilterDescriptor of a data base area -class ScRangeFilterDescriptor final : public ScFilterDescriptorBase +class SC_DLLPUBLIC ScRangeFilterDescriptor final : public ScFilterDescriptorBase { private: rtl::Reference<ScDatabaseRangeObj> mxParent; diff --git a/sc/source/filter/inc/autofilterbuffer.hxx b/sc/source/filter/inc/autofilterbuffer.hxx index e7e51834a2fd..09cadae26484 100644 --- a/sc/source/filter/inc/autofilterbuffer.hxx +++ b/sc/source/filter/inc/autofilterbuffer.hxx @@ -240,10 +240,10 @@ public: SortCondition& createSortCondition(); /** Applies the filter to the passed filter descriptor. */ - void finalizeImport( const css::uno::Reference< css::sheet::XDatabaseRange >& rxDatabaseRange, + void finalizeImport( const rtl::Reference<ScDatabaseRangeObj>& rxDatabaseRange, sal_Int16 nSheet ); - css::uno::Reference< css::sheet::XDatabaseRange > createDatabaseObject(sal_Int16 nSheet); + rtl::Reference<ScDatabaseRangeObj> createDatabaseObject(sal_Int16 nSheet); private: typedef RefVector< FilterColumn > FilterColumnVector; @@ -270,7 +270,7 @@ public: /** Applies the filters to the passed database range object. @return True = this buffer contains valid auto filter settings. */ - bool finalizeImport( const css::uno::Reference< css::sheet::XDatabaseRange >& rxDatabaseRange, + bool finalizeImport( const rtl::Reference<ScDatabaseRangeObj>& rxDatabaseRange, sal_Int16 nSheet ); private: diff --git a/sc/source/filter/inc/workbookhelper.hxx b/sc/source/filter/inc/workbookhelper.hxx index d445b7c9f05d..0f33fcdec84e 100644 --- a/sc/source/filter/inc/workbookhelper.hxx +++ b/sc/source/filter/inc/workbookhelper.hxx @@ -238,7 +238,7 @@ public: /** Creates and returns an unnamed database range on-the-fly in the Calc document. The range will not be buffered in the global table buffer. */ - css::uno::Reference< css::sheet::XDatabaseRange > + rtl::Reference<ScDatabaseRangeObj> createUnnamedDatabaseRangeObject( const ScRange& rRangeAddr ) const; diff --git a/sc/source/filter/oox/autofilterbuffer.cxx b/sc/source/filter/oox/autofilterbuffer.cxx index fb1f380911ae..140d915f181c 100644 --- a/sc/source/filter/oox/autofilterbuffer.cxx +++ b/sc/source/filter/oox/autofilterbuffer.cxx @@ -42,6 +42,7 @@ #include <addressconverter.hxx> #include <defnamesbuffer.hxx> #include <biffhelper.hxx> +#include <datauno.hxx> #include <document.hxx> #include <dbdata.hxx> #include <scitems.hxx> @@ -720,20 +721,21 @@ SortCondition& AutoFilter::createSortCondition() return *xSortCondition; } -void AutoFilter::finalizeImport( const Reference< XDatabaseRange >& rxDatabaseRange, sal_Int16 nSheet ) +void AutoFilter::finalizeImport(const rtl::Reference<ScDatabaseRangeObj>& rxDatabaseRange, sal_Int16 nSheet) { // convert filter settings using the filter descriptor of the database range - const Reference<XSheetFilterDescriptor3> xFilterDesc( rxDatabaseRange->getFilterDescriptor(), UNO_QUERY_THROW ); + ScDocument& rDoc = getScDocument(); + ScDocShell* pDocSh = rDoc.GetDocumentShell(); + rtl::Reference<ScRangeFilterDescriptor> xFilterDesc = new ScRangeFilterDescriptor(pDocSh, rxDatabaseRange.get()); if( !xFilterDesc.is() ) return; // set some common properties for the auto filter range - PropertySet aDescProps( xFilterDesc ); - aDescProps.setProperty( PROP_IsCaseSensitive, false ); - aDescProps.setProperty( PROP_SkipDuplicates, false ); - aDescProps.setProperty( PROP_Orientation, TableOrientation_ROWS ); - aDescProps.setProperty( PROP_ContainsHeader, true ); - aDescProps.setProperty( PROP_CopyOutputData, false ); + xFilterDesc->setPropertyValue(u"IsCaseSensitive"_ustr, css::uno::Any(false)); + xFilterDesc->setPropertyValue(u"SkipDuplicates"_ustr, css::uno::Any(false)); + xFilterDesc->setPropertyValue(u"Orientation"_ustr, css::uno::Any(TableOrientation_ROWS)); + xFilterDesc->setPropertyValue(u"ContainsHeader"_ustr, css::uno::Any(true)); + xFilterDesc->setPropertyValue(u"SaveOutputPosition"_ustr, css::uno::Any(false)); // resulting list of all UNO API filter fields ::std::vector<TableFilterField3> aFilterFields; @@ -750,7 +752,6 @@ void AutoFilter::finalizeImport( const Reference< XDatabaseRange >& rxDatabaseRa '(A1 and B1) or (B2 and C1)'. */ bool bHasOrConnection = false; - ScDocument& rDoc = getScDocument(); SCCOL nCol = maRange.aStart.Col(); SCROW nRow = maRange.aStart.Row(); SCTAB nTab = maRange.aStart.Tab(); @@ -806,7 +807,7 @@ void AutoFilter::finalizeImport( const Reference< XDatabaseRange >& rxDatabaseRa // regular expressions bool bUseRegExp = obNeedsRegExp.value_or( false ); - aDescProps.setProperty( PROP_UseRegularExpressions, bUseRegExp ); + xFilterDesc->setPropertyValue(u"RegularExpressions"_ustr, css::uno::Any(bUseRegExp)); // sort if (maSortConditions.empty()) @@ -866,7 +867,7 @@ void AutoFilter::finalizeImport( const Reference< XDatabaseRange >& rxDatabaseRa OSL_FAIL("AutoFilter::finalizeImport(): cannot find matching DBData"); } -Reference< XDatabaseRange > AutoFilter::createDatabaseObject(sal_Int16 nSheet) +rtl::Reference<ScDatabaseRangeObj> AutoFilter::createDatabaseObject(sal_Int16 nSheet) { ScRange aRangeCopy(maRange); aRangeCopy.aStart.SetTab(nSheet); @@ -894,7 +895,7 @@ void AutoFilterBuffer::finalizeImport( sal_Int16 nSheet ) std::shared_ptr<AutoFilter> xAutoFilter = maAutoFilters.front(); // use the same name for the database range as used for the defined name '_FilterDatabase' - Reference< XDatabaseRange > xDatabaseRange = xAutoFilter->createDatabaseObject(nSheet); + rtl::Reference<ScDatabaseRangeObj> xDatabaseRange = xAutoFilter->createDatabaseObject(nSheet); // first, try to create an auto filter bool bHasAutoFilter = finalizeImport( xDatabaseRange, nSheet ); // no success: try to create an advanced filter @@ -911,45 +912,50 @@ void AutoFilterBuffer::finalizeImport( sal_Int16 nSheet ) return; // set some common properties for the filter descriptor - PropertySet aDescProps( xDatabaseRange->getFilterDescriptor() ); - aDescProps.setProperty( PROP_IsCaseSensitive, false ); - aDescProps.setProperty( PROP_SkipDuplicates, false ); - aDescProps.setProperty( PROP_Orientation, TableOrientation_ROWS ); - aDescProps.setProperty( PROP_ContainsHeader, true ); + ScDocShell* pDocSh = getScDocument().GetDocumentShell(); + rtl::Reference<ScRangeFilterDescriptor> xFilterDesc = new ScRangeFilterDescriptor(pDocSh, xDatabaseRange.get()); + xFilterDesc->setPropertyValue(u"IsCaseSensitive"_ustr, css::uno::Any(false)); + xFilterDesc->setPropertyValue(u"SkipDuplicates"_ustr, css::uno::Any(false)); + xFilterDesc->setPropertyValue(u"Orientation"_ustr, css::uno::Any(TableOrientation_ROWS)); + xFilterDesc->setPropertyValue(u"ContainsHeader"_ustr, css::uno::Any(true)); // criteria range may contain wildcards, but these are incompatible with REs - aDescProps.setProperty( PROP_UseRegularExpressions, false ); + xFilterDesc->setPropertyValue(u"RegularExpressions"_ustr, css::uno::Any(false)); // position of output data (if built-in defined name 'Extract' exists) DefinedNameRef xExtractName = getDefinedNames().getByBuiltinId( BIFF_DEFNAME_EXTRACT, nSheet ); ScRange aOutputRange; bool bHasOutputRange = xExtractName && xExtractName->getAbsoluteRange( aOutputRange ); - aDescProps.setProperty( PROP_CopyOutputData, bHasOutputRange ); + xFilterDesc->setPropertyValue(u"CopyOutputData"_ustr, css::uno::Any(bHasOutputRange)); if( bHasOutputRange ) { - aDescProps.setProperty( PROP_SaveOutputPosition, true ); - aDescProps.setProperty( PROP_OutputPosition, CellAddress( aOutputRange.aStart.Tab(), aOutputRange.aStart.Col(), aOutputRange.aStart.Row() ) ); + xFilterDesc->setPropertyValue(u"SaveOutputPosition"_ustr, css::uno::Any(true)); + xFilterDesc->setPropertyValue(u"OutputPosition"_ustr, + css::uno::Any(CellAddress(aOutputRange.aStart.Tab(), + aOutputRange.aStart.Col(), + aOutputRange.aStart.Row()))); } /* Properties of the database range (must be set after modifying properties of the filter descriptor, otherwise the 'FilterCriteriaSource' property gets deleted). */ - PropertySet aRangeProps( xDatabaseRange ); - aRangeProps.setProperty( PROP_AutoFilter, false ); - aRangeProps.setProperty( PROP_FilterCriteriaSource, - CellRangeAddress( aCriteriaRange.aStart.Tab(), - aCriteriaRange.aStart.Col(), aCriteriaRange.aStart.Row(), - aCriteriaRange.aEnd.Col(), aCriteriaRange.aEnd.Row() )); + xDatabaseRange->setPropertyValue(u"AutoFilter"_ustr, css::uno::Any(false)); + xDatabaseRange->setPropertyValue(u"FilterCriteriaSource"_ustr, + css::uno::Any( CellRangeAddress(aCriteriaRange.aStart.Tab(), + aCriteriaRange.aStart.Col(), + aCriteriaRange.aStart.Row(), + aCriteriaRange.aEnd.Col(), + aCriteriaRange.aEnd.Row()))); } -bool AutoFilterBuffer::finalizeImport( const Reference< XDatabaseRange >& rxDatabaseRange, sal_Int16 nSheet ) +bool AutoFilterBuffer::finalizeImport(const rtl::Reference<ScDatabaseRangeObj>& rxDatabaseRange, + sal_Int16 nSheet) { AutoFilter* pAutoFilter = getActiveAutoFilter(); if( pAutoFilter && rxDatabaseRange.is() ) try { // the property 'AutoFilter' enables the drop-down buttons - PropertySet aRangeProps( rxDatabaseRange ); - aRangeProps.setProperty( PROP_AutoFilter, true ); + rxDatabaseRange->setPropertyValue(u"AutoFilter"_ustr, css::uno::Any(true)); pAutoFilter->finalizeImport( rxDatabaseRange, nSheet ); diff --git a/sc/source/filter/oox/tablebuffer.cxx b/sc/source/filter/oox/tablebuffer.cxx index a3d3d7627eab..cdbdf1da7fa1 100644 --- a/sc/source/filter/oox/tablebuffer.cxx +++ b/sc/source/filter/oox/tablebuffer.cxx @@ -182,9 +182,14 @@ void Table::applyAutoFilters() try { // get the range ( maybe we should cache the xDatabaseRange from finalizeImport ) - PropertySet aDocProps(( Reference< css::beans::XPropertySet >(getDocument()) )); - Reference< XDatabaseRanges > xDatabaseRanges( aDocProps.getAnyProperty( PROP_DatabaseRanges ), UNO_QUERY_THROW ); - Reference< XDatabaseRange > xDatabaseRange( xDatabaseRanges->getByName( maDBRangeName ), UNO_QUERY ); + rtl::Reference<ScDatabaseRangeObj> xDatabaseRange; + ScDocShell* pDocSh = getScDocument().GetDocumentShell(); + ScDBCollection* pNames = getScDocument().GetDBCollection(); + if ( pDocSh && pNames + && pNames->getNamedDBs().findByUpperName(ScGlobal::getCharClass().uppercase( maDBRangeName )) != nullptr) + xDatabaseRange = new ScDatabaseRangeObj(pDocSh, maDBRangeName); + else + throw css::container::NoSuchElementException(); maAutoFilters.finalizeImport( xDatabaseRange, maModel.maRange.aStart.Tab() ); } catch( Exception& ) diff --git a/sc/source/filter/oox/workbookhelper.cxx b/sc/source/filter/oox/workbookhelper.cxx index 4260c0c0063d..1a204aa97312 100644 --- a/sc/source/filter/oox/workbookhelper.cxx +++ b/sc/source/filter/oox/workbookhelper.cxx @@ -164,7 +164,7 @@ public: /** Creates and returns a database range on-the-fly in the Calc document. */ rtl::Reference<ScDatabaseRangeObj> createDatabaseRangeObject( OUString& orName, const ScRange& rRangeAddr ); /** Creates and returns an unnamed database range on-the-fly in the Calc document. */ - Reference< XDatabaseRange > createUnnamedDatabaseRangeObject( const ScRange& rRangeAddr ); + rtl::Reference<ScDatabaseRangeObj> createUnnamedDatabaseRangeObject(const ScRange& rRangeAddr); /** Finds the (already existing) database range of the given formula token index. */ ScDBData* findDatabaseRangeByIndex( sal_uInt16 nIndex ); /** Creates and returns a com.sun.star.style.Style object for cells or pages. */ @@ -481,14 +481,13 @@ rtl::Reference<ScDatabaseRangeObj> WorkbookGlobals::createDatabaseRangeObject( O return {}; } -Reference< XDatabaseRange > WorkbookGlobals::createUnnamedDatabaseRangeObject( const ScRange& rRangeAddr ) +rtl::Reference<ScDatabaseRangeObj> WorkbookGlobals::createUnnamedDatabaseRangeObject(const ScRange& rRangeAddr) { // validate cell range ScRange aDestRange = rRangeAddr; bool bValidRange = getAddressConverter().validateCellRange( aDestRange, true, true ); // create database range and insert it into the Calc document - Reference< XDatabaseRange > xDatabaseRange; if( bValidRange ) try { ScDocument& rDoc = getScDocument(); @@ -499,13 +498,13 @@ Reference< XDatabaseRange > WorkbookGlobals::createUnnamedDatabaseRangeObject( c aDestRange.aEnd.Col(), aDestRange.aEnd.Row() )); rDoc.SetAnonymousDBData( aDestRange.aStart.Tab() , std::move(pNewDBData) ); ScDocShell* pDocSh = rDoc.GetDocumentShell(); - xDatabaseRange.set(new ScDatabaseRangeObj(pDocSh, aDestRange.aStart.Tab())); + return new ScDatabaseRangeObj(pDocSh, aDestRange.aStart.Tab()); } catch( Exception& ) { + DBG_UNHANDLED_EXCEPTION("sc"); } - OSL_ENSURE( xDatabaseRange.is(), "WorkbookData::createDatabaseRangeObject - cannot create database range" ); - return xDatabaseRange; + return {}; } ScDBData* WorkbookGlobals::findDatabaseRangeByIndex( sal_uInt16 nIndex ) @@ -920,7 +919,7 @@ rtl::Reference<ScDatabaseRangeObj> WorkbookHelper::createDatabaseRangeObject( OU return mrBookGlob.createDatabaseRangeObject( orName, rRangeAddr ); } -Reference< XDatabaseRange > WorkbookHelper::createUnnamedDatabaseRangeObject( const ScRange& rRangeAddr ) const +rtl::Reference<ScDatabaseRangeObj> WorkbookHelper::createUnnamedDatabaseRangeObject(const ScRange& rRangeAddr) const { return mrBookGlob.createUnnamedDatabaseRangeObject( rRangeAddr ); }
