From f892be678a036cd0fea665eda529e9cc906e0cfa Mon Sep 17 00:00:00 2001 From: Daniel Bankston Date: Mon, 16 Apr 2012 09:34:32 -0500 Subject: Converting UNO calls to direct in WorkbookHelper --- sc/inc/tokenuno.hxx | 2 +- sc/source/filter/inc/defnamesbuffer.hxx | 4 ++-- sc/source/filter/inc/sheetdatabuffer.hxx | 1 - sc/source/filter/inc/workbookhelper.hxx | 7 +++---- sc/source/filter/oox/defnamesbuffer.cxx | 24 +++++++++++++----------- sc/source/filter/oox/sheetdatabuffer.cxx | 10 ++++------ sc/source/filter/oox/workbookhelper.cxx | 29 ++++++++++++++--------------- 7 files changed, 37 insertions(+), 40 deletions(-) diff --git a/sc/inc/tokenuno.hxx b/sc/inc/tokenuno.hxx index 36486c404dc1..a3d87324d46c 100644 --- a/sc/inc/tokenuno.hxx +++ b/sc/inc/tokenuno.hxx @@ -53,7 +53,7 @@ public: ScDocument& rDoc, ScTokenArray& rTokenArray, const com::sun::star::uno::Sequence< com::sun::star::sheet::FormulaToken >& rSequence ); - static bool ConvertToTokenSequence( + static SC_DLLPUBLIC bool ConvertToTokenSequence( ScDocument& rDoc, com::sun::star::uno::Sequence< com::sun::star::sheet::FormulaToken >& rSequence, const ScTokenArray& rTokenArray ); diff --git a/sc/source/filter/inc/defnamesbuffer.hxx b/sc/source/filter/inc/defnamesbuffer.hxx index 61803b19ee4e..d3269a4ae79d 100644 --- a/sc/source/filter/inc/defnamesbuffer.hxx +++ b/sc/source/filter/inc/defnamesbuffer.hxx @@ -30,6 +30,7 @@ #define OOX_XLS_DEFINEDNAMESBUFFER_HXX #include "formulabase.hxx" +#include "rangenam.hxx" namespace com { namespace sun { namespace star { namespace sheet { class XNamedRange; } @@ -155,8 +156,7 @@ private: typedef ::std::auto_ptr< StreamDataSequence > StreamDataSeqPtr; typedef ::std::auto_ptr< BiffInputStreamPos > BiffStreamPosPtr; - ::com::sun::star::uno::Reference< ::com::sun::star::sheet::XNamedRange > - mxNamedRange; /// XNamedRange interface of the defined name. + ScRangeData* mpScRangeData; /// ScRangeData of the defined name. sal_Int32 mnTokenIndex; /// Name index used in API token array. sal_Int16 mnCalcSheet; /// Calc sheet index for sheet-local names. sal_Unicode mcBuiltinId; /// Identifier for built-in defined names. diff --git a/sc/source/filter/inc/sheetdatabuffer.hxx b/sc/source/filter/inc/sheetdatabuffer.hxx index dcf42bcb3ec9..65612bc3f32b 100644 --- a/sc/source/filter/inc/sheetdatabuffer.hxx +++ b/sc/source/filter/inc/sheetdatabuffer.hxx @@ -35,7 +35,6 @@ #include "worksheethelper.hxx" namespace com { namespace sun { namespace star { - namespace sheet { class XNamedRange; } namespace util { struct DateTime; } } } } diff --git a/sc/source/filter/inc/workbookhelper.hxx b/sc/source/filter/inc/workbookhelper.hxx index 7a529844ed9c..c4a4ee19b0aa 100644 --- a/sc/source/filter/inc/workbookhelper.hxx +++ b/sc/source/filter/inc/workbookhelper.hxx @@ -33,6 +33,7 @@ #include #include "oox/helper/storagebase.hxx" #include "biffhelper.hxx" +#include "rangenam.hxx" namespace com { namespace sun { namespace star { namespace container { class XNameAccess; } @@ -183,8 +184,7 @@ public: /** Creates and returns a defined name on-the-fly in the Calc document. The name will not be buffered in the global defined names buffer. @param orName (in/out-parameter) Returns the resulting used name. */ - ::com::sun::star::uno::Reference< ::com::sun::star::sheet::XNamedRange > - createNamedRangeObject( + ScRangeData* createNamedRangeObject( ::rtl::OUString& orName, const ::com::sun::star::uno::Sequence< ::com::sun::star::sheet::FormulaToken>& rTokens, sal_Int32 nIndex, @@ -193,8 +193,7 @@ public: /** Creates and returns a defined name on-the-fly in the sheet. The name will not be buffered in the global defined names buffer. @param orName (in/out-parameter) Returns the resulting used name. */ - ::com::sun::star::uno::Reference< ::com::sun::star::sheet::XNamedRange > - createLocalNamedRangeObject( + ScRangeData* createLocalNamedRangeObject( ::rtl::OUString& orName, const ::com::sun::star::uno::Sequence< ::com::sun::star::sheet::FormulaToken>& rTokens, sal_Int32 nIndex, diff --git a/sc/source/filter/oox/defnamesbuffer.cxx b/sc/source/filter/oox/defnamesbuffer.cxx index 8d04f7ad20ae..4eafab759461 100644 --- a/sc/source/filter/oox/defnamesbuffer.cxx +++ b/sc/source/filter/oox/defnamesbuffer.cxx @@ -44,6 +44,8 @@ #include "externallinkbuffer.hxx" #include "formulaparser.hxx" #include "worksheetbuffer.hxx" +#include "tokenarray.hxx" +#include "tokenuno.hxx" namespace oox { namespace xls { @@ -380,9 +382,9 @@ void DefinedName::createNameObject( sal_Int32 nIndex ) // create the name and insert it into the document, maCalcName will be changed to the resulting name if (maModel.mnSheet >= 0) - mxNamedRange = createLocalNamedRangeObject( maCalcName, getTokens(), nIndex, nNameFlags, maModel.mnSheet ); + mpScRangeData = createLocalNamedRangeObject( maCalcName, getTokens(), nIndex, nNameFlags, maModel.mnSheet ); else - mxNamedRange = createNamedRangeObject( maCalcName, getTokens(), nIndex, nNameFlags ); + mpScRangeData = createNamedRangeObject( maCalcName, getTokens(), nIndex, nNameFlags ); mnTokenIndex = nIndex; } @@ -424,9 +426,9 @@ DefinedName::getTokens() void DefinedName::convertFormula() { - Reference< XFormulaTokens > xTokens( mxNamedRange, UNO_QUERY ); - if( !xTokens.is() ) - return; + ScTokenArray* pTokenArray = mpScRangeData->GetCode(); + Sequence< FormulaToken > aFTokenSeq; + (void)ScTokenConversion::ConvertToTokenSequence( this->getScDocument(), aFTokenSeq, *pTokenArray ); // set built-in names (print ranges, repeated titles, filter ranges) if( !isGlobalName() ) switch( mcBuiltinId ) { @@ -434,7 +436,7 @@ void DefinedName::convertFormula() { Reference< XPrintAreas > xPrintAreas( getSheetFromDoc( mnCalcSheet ), UNO_QUERY ); ApiCellRangeList aPrintRanges; - getFormulaParser().extractCellRangeList( aPrintRanges, xTokens->getTokens(), false, mnCalcSheet ); + getFormulaParser().extractCellRangeList( aPrintRanges, aFTokenSeq, false, mnCalcSheet ); if( xPrintAreas.is() && !aPrintRanges.empty() ) xPrintAreas->setPrintAreas( ContainerHelper::vectorToSequence( aPrintRanges ) ); } @@ -443,7 +445,7 @@ void DefinedName::convertFormula() { Reference< XPrintAreas > xPrintAreas( getSheetFromDoc( mnCalcSheet ), UNO_QUERY ); ApiCellRangeList aTitleRanges; - getFormulaParser().extractCellRangeList( aTitleRanges, xTokens->getTokens(), false, mnCalcSheet ); + getFormulaParser().extractCellRangeList( aTitleRanges, aFTokenSeq, false, mnCalcSheet ); if( xPrintAreas.is() && !aTitleRanges.empty() ) { bool bHasRowTitles = false; @@ -474,10 +476,10 @@ void DefinedName::convertFormula() bool DefinedName::getAbsoluteRange( CellRangeAddress& orRange ) const { - /* ScNamedRangeObj::XCellRangeReferrer::getReferredCells is buggy with - relative references, so we extract an absolute reference by hand. */ - Reference< XFormulaTokens > xTokens( mxNamedRange, UNO_QUERY ); - return xTokens.is() && getFormulaParser().extractCellRange( orRange, xTokens->getTokens(), false ); + ScTokenArray* pTokenArray = mpScRangeData->GetCode(); + Sequence< FormulaToken > aFTokenSeq; + ScTokenConversion::ConvertToTokenSequence( this->getScDocument(), aFTokenSeq, *pTokenArray ); + return getFormulaParser().extractCellRange( orRange, aFTokenSeq, false ); } // ============================================================================ diff --git a/sc/source/filter/oox/sheetdatabuffer.cxx b/sc/source/filter/oox/sheetdatabuffer.cxx index 4abf946ed500..245b1674f34b 100644 --- a/sc/source/filter/oox/sheetdatabuffer.cxx +++ b/sc/source/filter/oox/sheetdatabuffer.cxx @@ -588,15 +588,13 @@ void SheetDataBuffer::createSharedFormula( const BinAddress& rMapKey, const ApiT append( static_cast< sal_Int32 >( getSheetIndex() + 1 ) ). append( sal_Unicode( '_' ) ).append( rMapKey.mnRow ). append( sal_Unicode( '_' ) ).append( rMapKey.mnCol ).makeStringAndClear(); - Reference< XNamedRange > xNamedRange = createNamedRangeObject( aName, rTokens, 0 ); - OSL_ENSURE( xNamedRange.is(), "SheetDataBuffer::createSharedFormula - cannot create shared formula" ); - PropertySet aNameProps( xNamedRange ); - aNameProps.setProperty( PROP_IsSharedFormula, true ); + ScRangeData* pScRangeData = createNamedRangeObject( aName, rTokens, 0 ); + pScRangeData->SetType(RT_SHARED); // get and store the token index of the defined name OSL_ENSURE( maSharedFormulas.count( rMapKey ) == 0, "SheetDataBuffer::createSharedFormula - shared formula exists already" ); - sal_Int32 nTokenIndex = 0; - if( aNameProps.getProperty( nTokenIndex, PROP_TokenIndex ) && (nTokenIndex >= 0) ) try + sal_Int32 nTokenIndex = static_cast< sal_Int32 >( pScRangeData->GetIndex() ); + if( nTokenIndex >= 0 ) try { // store the token index in the map maSharedFormulas[ rMapKey ] = nTokenIndex; diff --git a/sc/source/filter/oox/workbookhelper.cxx b/sc/source/filter/oox/workbookhelper.cxx index 5a872c2e43c8..479f504e3c4f 100644 --- a/sc/source/filter/oox/workbookhelper.cxx +++ b/sc/source/filter/oox/workbookhelper.cxx @@ -165,9 +165,9 @@ public: /** Returns the specified cell or page style from the Calc document. */ Reference< XStyle > getStyleObject( const OUString& rStyleName, bool bPageStyle ) const; /** Creates and returns a defined name on-the-fly in the Calc document. */ - Reference< XNamedRange > createNamedRangeObject( OUString& orName, const Sequence< FormulaToken>& rTokens, sal_Int32 nIndex, sal_Int32 nNameFlags ) const; + ScRangeData* createNamedRangeObject( OUString& orName, const Sequence< FormulaToken>& rTokens, sal_Int32 nIndex, sal_Int32 nNameFlags ) const; /** Creates and returns a defined name on the-fly in the correct Calc sheet. */ - Reference< XNamedRange > createLocalNamedRangeObject( OUString& orName, const ::com::sun::star::uno::Sequence< ::com::sun::star::sheet::FormulaToken>& rTokens, sal_Int32 nIndex, sal_Int32 nNameFlags, sal_Int32 nTab ) const; + ScRangeData* createLocalNamedRangeObject( OUString& orName, const Sequence< FormulaToken>& rTokens, sal_Int32 nIndex, sal_Int32 nNameFlags, sal_Int32 nTab ) const; /** Creates and returns a database range on-the-fly in the Calc document. */ Reference< XDatabaseRange > createDatabaseRangeObject( OUString& orName, const CellRangeAddress& rRangeAddr ) const; /** Creates and returns an unnamed database range on-the-fly in the Calc document. */ @@ -358,7 +358,7 @@ Reference< XStyle > WorkbookGlobals::getStyleObject( const OUString& rStyleName, OSL_ENSURE( xStyle.is(), "WorkbookGlobals::getStyleObject - cannot access style object" ); return xStyle; } -void lcl_addNewByNameAndTokens( ScDocument& rDoc, ScRangeName* pNames, const OUString& rName, const Sequence& rTokens, sal_Int16 nIndex, sal_Int32 nUnoType ) +ScRangeData* lcl_addNewByNameAndTokens( ScDocument& rDoc, ScRangeName* pNames, const OUString& rName, const Sequence& rTokens, sal_Int16 nIndex, sal_Int32 nUnoType ) { bool bDone = false; sal_uInt16 nNewType = RT_NAME; @@ -376,12 +376,14 @@ void lcl_addNewByNameAndTokens( ScDocument& rDoc, ScRangeName* pNames, const OUS bDone = true; if (!bDone) throw RuntimeException(); + return pNew; } -Reference< XNamedRange > WorkbookGlobals::createNamedRangeObject( OUString& orName, const Sequence< FormulaToken>& rTokens, sal_Int32 nIndex, sal_Int32 nNameFlags ) const +ScRangeData* WorkbookGlobals::createNamedRangeObject( OUString& orName, const Sequence< FormulaToken>& rTokens, sal_Int32 nIndex, sal_Int32 nNameFlags ) const { // create the name and insert it into the Calc document Reference< XNamedRange > xNamedRange; + ScRangeData* pScRangeData; if( !orName.isEmpty() ) try { // find an unused name @@ -392,20 +394,19 @@ Reference< XNamedRange > WorkbookGlobals::createNamedRangeObject( OUString& orNa // create the named range ScDocument& rDoc = getScDocument(); ScRangeName* pNames = rDoc.GetRangeName(); - lcl_addNewByNameAndTokens( rDoc, pNames, orName, rTokens, nIndex, nNameFlags ); - xNamedRange.set( xNamedRanges->getByName( orName ), UNO_QUERY ); + pScRangeData = lcl_addNewByNameAndTokens( rDoc, pNames, orName, rTokens, nIndex, nNameFlags ); } catch( Exception& ) { } - OSL_ENSURE( xNamedRange.is(), "WorkbookGlobals::createNamedRangeObject - cannot create defined name" ); - return xNamedRange; + return pScRangeData; } -Reference< XNamedRange > WorkbookGlobals::createLocalNamedRangeObject( OUString& orName, const ::com::sun::star::uno::Sequence< ::com::sun::star::sheet::FormulaToken>& rTokens, sal_Int32 nIndex, sal_Int32 nNameFlags, sal_Int32 nTab ) const +ScRangeData* WorkbookGlobals::createLocalNamedRangeObject( OUString& orName, const Sequence< FormulaToken >& rTokens, sal_Int32 nIndex, sal_Int32 nNameFlags, sal_Int32 nTab ) const { // create the name and insert it into the Calc document Reference< XNamedRange > xNamedRange; + ScRangeData* pScRangeData; if( !orName.isEmpty() ) try { // find an unused name @@ -420,14 +421,12 @@ Reference< XNamedRange > WorkbookGlobals::createLocalNamedRangeObject( OUString& // create the named range ScDocument& rDoc = getScDocument(); ScRangeName* pNames = rDoc.GetRangeName( nTab ); - lcl_addNewByNameAndTokens( rDoc, pNames, orName, rTokens, nIndex, nNameFlags ); - xNamedRange.set( xNamedRanges->getByName( orName ), UNO_QUERY ); + pScRangeData = lcl_addNewByNameAndTokens( rDoc, pNames, orName, rTokens, nIndex, nNameFlags ); } catch( Exception& ) { } - OSL_ENSURE( xNamedRange.is(), "WorkbookGlobals::createLocalNamedRangeObject - cannot create defined name" ); - return xNamedRange; + return pScRangeData; } Reference< XDatabaseRange > WorkbookGlobals::createDatabaseRangeObject( OUString& orName, const CellRangeAddress& rRangeAddr ) const @@ -743,12 +742,12 @@ Reference< XStyle > WorkbookHelper::getStyleObject( const OUString& rStyleName, return mrBookGlob.getStyleObject( rStyleName, bPageStyle ); } -Reference< XNamedRange > WorkbookHelper::createNamedRangeObject( OUString& orName, const Sequence< FormulaToken>& rTokens, sal_Int32 nIndex, sal_Int32 nNameFlags ) const +ScRangeData* WorkbookHelper::createNamedRangeObject( OUString& orName, const Sequence< FormulaToken>& rTokens, sal_Int32 nIndex, sal_Int32 nNameFlags ) const { return mrBookGlob.createNamedRangeObject( orName, rTokens, nIndex, nNameFlags ); } -Reference< XNamedRange > WorkbookHelper::createLocalNamedRangeObject( OUString& orName, const ::com::sun::star::uno::Sequence< ::com::sun::star::sheet::FormulaToken>& rTokens, sal_Int32 nIndex, sal_Int32 nNameFlags, sal_Int32 nTab ) const +ScRangeData* WorkbookHelper::createLocalNamedRangeObject( OUString& orName, const Sequence< FormulaToken>& rTokens, sal_Int32 nIndex, sal_Int32 nNameFlags, sal_Int32 nTab ) const { return mrBookGlob.createLocalNamedRangeObject( orName, rTokens, nIndex, nNameFlags, nTab ); } -- cgit v1.2.3