diff options
Diffstat (limited to 'oox/source/xls/defnamesbuffer.cxx')
-rw-r--r-- | oox/source/xls/defnamesbuffer.cxx | 184 |
1 files changed, 87 insertions, 97 deletions
diff --git a/oox/source/xls/defnamesbuffer.cxx b/oox/source/xls/defnamesbuffer.cxx index 96fcec0042f5..e69cc44c8a1d 100644 --- a/oox/source/xls/defnamesbuffer.cxx +++ b/oox/source/xls/defnamesbuffer.cxx @@ -189,32 +189,32 @@ void lclConvertRefFlags( sal_Int32& ornFlags, sal_Int32& ornAbsPos, sal_Int32& o } } -void lclConvertSingleRefFlags( SingleReference& orApiRef, const CellAddress& rBaseAddress, bool bColRel, bool bRowRel ) +void lclConvertSingleRefFlags( SingleReference& orApiRef, const CellAddress& rBaseAddr, bool bColRel, bool bRowRel ) { using namespace ::com::sun::star::sheet::ReferenceFlags; lclConvertRefFlags( orApiRef.Flags, orApiRef.Column, orApiRef.RelativeColumn, - rBaseAddress.Column, COLUMN_RELATIVE, bColRel ); + rBaseAddr.Column, COLUMN_RELATIVE, bColRel ); lclConvertRefFlags( orApiRef.Flags, orApiRef.Row, orApiRef.RelativeRow, - rBaseAddress.Row, ROW_RELATIVE, bRowRel ); + rBaseAddr.Row, ROW_RELATIVE, bRowRel ); } -Any lclConvertReference( const Any& rRefAny, const CellAddress& rBaseAddress, sal_uInt16 nRelFlags ) +Any lclConvertReference( const Any& rRefAny, const CellAddress& rBaseAddr, sal_uInt16 nRelFlags ) { if( rRefAny.has< SingleReference >() && !getFlag( nRelFlags, BIFF_REFFLAG_COL2REL ) && !getFlag( nRelFlags, BIFF_REFFLAG_ROW2REL ) ) { SingleReference aApiRef; rRefAny >>= aApiRef; - lclConvertSingleRefFlags( aApiRef, rBaseAddress, getFlag( nRelFlags, BIFF_REFFLAG_COL1REL ), getFlag( nRelFlags, BIFF_REFFLAG_ROW1REL ) ); + lclConvertSingleRefFlags( aApiRef, rBaseAddr, getFlag( nRelFlags, BIFF_REFFLAG_COL1REL ), getFlag( nRelFlags, BIFF_REFFLAG_ROW1REL ) ); return Any( aApiRef ); } if( rRefAny.has< ComplexReference >() ) { ComplexReference aApiRef; rRefAny >>= aApiRef; - lclConvertSingleRefFlags( aApiRef.Reference1, rBaseAddress, getFlag( nRelFlags, BIFF_REFFLAG_COL1REL ), getFlag( nRelFlags, BIFF_REFFLAG_ROW1REL ) ); - lclConvertSingleRefFlags( aApiRef.Reference2, rBaseAddress, getFlag( nRelFlags, BIFF_REFFLAG_COL2REL ), getFlag( nRelFlags, BIFF_REFFLAG_ROW2REL ) ); + lclConvertSingleRefFlags( aApiRef.Reference1, rBaseAddr, getFlag( nRelFlags, BIFF_REFFLAG_COL1REL ), getFlag( nRelFlags, BIFF_REFFLAG_ROW1REL ) ); + lclConvertSingleRefFlags( aApiRef.Reference2, rBaseAddr, getFlag( nRelFlags, BIFF_REFFLAG_COL2REL ), getFlag( nRelFlags, BIFF_REFFLAG_ROW2REL ) ); return Any( aApiRef ); } return Any(); @@ -248,7 +248,7 @@ const OUString& DefinedNameBase::getUpcaseModelName() const return maUpModelName; } -Any DefinedNameBase::getReference( const CellAddress& rBaseAddress ) const +Any DefinedNameBase::getReference( const CellAddress& rBaseAddr ) const { if( maRefAny.hasValue() && (maModel.maName.getLength() >= 2) && (maModel.maName[ 0 ] == '\x01') ) { @@ -260,7 +260,7 @@ Any DefinedNameBase::getReference( const CellAddress& rBaseAddress ) const { ExternalReference aApiExtRef; maRefAny >>= aApiExtRef; - Any aRefAny = lclConvertReference( aApiExtRef.Reference, rBaseAddress, nRelFlags ); + Any aRefAny = lclConvertReference( aApiExtRef.Reference, rBaseAddr, nRelFlags ); if( aRefAny.hasValue() ) { aApiExtRef.Reference <<= aRefAny; @@ -269,37 +269,30 @@ Any DefinedNameBase::getReference( const CellAddress& rBaseAddress ) const } else { - return lclConvertReference( maRefAny, rBaseAddress, nRelFlags ); + return lclConvertReference( maRefAny, rBaseAddr, nRelFlags ); } } } return Any(); } -void DefinedNameBase::importOoxFormula( FormulaContext& rContext, sal_Int16 nBaseSheet ) +ApiTokenSequence DefinedNameBase::importOoxFormula( sal_Int16 nBaseSheet ) { - if( maModel.maFormula.getLength() > 0 ) - { - rContext.setBaseAddress( CellAddress( nBaseSheet, 0, 0 ) ); - getFormulaParser().importFormula( rContext, maModel.maFormula ); - } - else - getFormulaParser().convertErrorToFormula( rContext, BIFF_ERR_NAME ); + return (maModel.maFormula.getLength() > 0) ? + getFormulaParser().importFormula( CellAddress( nBaseSheet, 0, 0 ), maModel.maFormula ) : + getFormulaParser().convertErrorToFormula( BIFF_ERR_NAME ); } -void DefinedNameBase::importBiff12Formula( FormulaContext& rContext, sal_Int16 nBaseSheet, SequenceInputStream& rStrm ) +ApiTokenSequence DefinedNameBase::importBiff12Formula( sal_Int16 nBaseSheet, SequenceInputStream& rStrm ) { - rContext.setBaseAddress( CellAddress( nBaseSheet, 0, 0 ) ); - getFormulaParser().importFormula( rContext, rStrm ); + return getFormulaParser().importFormula( CellAddress( nBaseSheet, 0, 0 ), FORMULATYPE_DEFINEDNAME, rStrm ); } -void DefinedNameBase::importBiffFormula( FormulaContext& rContext, sal_Int16 nBaseSheet, BiffInputStream& rStrm, const sal_uInt16* pnFmlaSize ) +ApiTokenSequence DefinedNameBase::importBiffFormula( sal_Int16 nBaseSheet, BiffInputStream& rStrm, const sal_uInt16* pnFmlaSize ) { - rContext.setBaseAddress( CellAddress( nBaseSheet, 0, 0 ) ); - if( !pnFmlaSize || (*pnFmlaSize > 0) ) - getFormulaParser().importFormula( rContext, rStrm, pnFmlaSize ); - else - getFormulaParser().convertErrorToFormula( rContext, BIFF_ERR_NAME ); + return (!pnFmlaSize || (*pnFmlaSize > 0)) ? + getFormulaParser().importFormula( CellAddress( nBaseSheet, 0, 0 ), FORMULATYPE_DEFINEDNAME, rStrm, pnFmlaSize ) : + getFormulaParser().convertErrorToFormula( BIFF_ERR_NAME ); } void DefinedNameBase::extractReference( const ApiTokenSequence& rTokens ) @@ -467,9 +460,8 @@ void DefinedName::importDefinedName( BiffInputStream& rStrm, sal_Int16 nCalcShee these names contain a simple cell reference or range reference. Other regular defined names and external names rely on existence of this reference. */ - TokensFormulaContext aContext( true, true ); - importBiffFormula( aContext, mnCalcSheet, rStrm, &mnFmlaSize ); - extractReference( aContext.getTokens() ); + ApiTokenSequence aTokens = importBiffFormula( mnCalcSheet, rStrm, &mnFmlaSize ); + extractReference( aTokens ); } else { @@ -488,6 +480,10 @@ void DefinedName::createNameObject() if( /*maModel.mbHidden ||*/ maModel.mbFunction || maModel.mbVBName ) return; + // skip BIFF names without stream position (e.g. BIFF3-BIFF4 internal 3D references) + if( (getFilterType() == FILTER_BIFF) && !mxBiffStrm.get() ) + return; + // convert original name to final Calc name (TODO: filter invalid characters from model name) maCalcName = isBuiltinName() ? lclGetPrefixedName( mcBuiltinId ) : maModel.maName; @@ -519,69 +515,83 @@ void DefinedName::createNameObject() void DefinedName::convertFormula() { Reference< XFormulaTokens > xTokens( mxNamedRange, UNO_QUERY ); - if( xTokens.is() ) + if( !xTokens.is() ) + return; + + // convert and set formula of the defined name + ApiTokenSequence aTokens; + switch( getFilterType() ) { - // convert and set formula of the defined name - switch( getFilterType() ) + case FILTER_OOXML: { - case FILTER_OOXML: + if( mxFormula.get() ) { - SimpleFormulaContext aContext( xTokens, true, false ); - implImportOoxFormula( aContext ); + SequenceInputStream aStrm( *mxFormula ); + aTokens = importBiff12Formula( mnCalcSheet, aStrm ); } - break; - case FILTER_BIFF: + else + aTokens = importOoxFormula( mnCalcSheet ); + } + break; + case FILTER_BIFF: + { + OSL_ENSURE( mxBiffStrm.get(), "DefinedName::convertFormula - missing BIFF stream" ); + if( mxBiffStrm.get() ) { - SimpleFormulaContext aContext( xTokens, true, getBiff() <= BIFF4 ); - implImportBiffFormula( aContext ); + BiffInputStream& rStrm = mxBiffStrm->getStream(); + BiffInputStreamPosGuard aStrmGuard( rStrm ); + if( mxBiffStrm->restorePosition() ) + aTokens = importBiffFormula( mnCalcSheet, rStrm, &mnFmlaSize ); } - break; - case FILTER_UNKNOWN: break; } + break; + case FILTER_UNKNOWN: + break; + } + xTokens->setTokens( aTokens ); - // set built-in names (print ranges, repeated titles, filter ranges) - if( !isGlobalName() ) switch( mcBuiltinId ) + // set built-in names (print ranges, repeated titles, filter ranges) + if( !isGlobalName() ) switch( mcBuiltinId ) + { + case BIFF_DEFNAME_PRINTAREA: { - case BIFF_DEFNAME_PRINTAREA: - { - Reference< XPrintAreas > xPrintAreas( getSheetFromDoc( mnCalcSheet ), UNO_QUERY ); - ApiCellRangeList aPrintRanges; - getFormulaParser().extractCellRangeList( aPrintRanges, xTokens->getTokens(), false, mnCalcSheet ); - if( xPrintAreas.is() && !aPrintRanges.empty() ) - xPrintAreas->setPrintAreas( ContainerHelper::vectorToSequence( aPrintRanges ) ); - } - break; - case BIFF_DEFNAME_PRINTTITLES: + Reference< XPrintAreas > xPrintAreas( getSheetFromDoc( mnCalcSheet ), UNO_QUERY ); + ApiCellRangeList aPrintRanges; + getFormulaParser().extractCellRangeList( aPrintRanges, xTokens->getTokens(), false, mnCalcSheet ); + if( xPrintAreas.is() && !aPrintRanges.empty() ) + xPrintAreas->setPrintAreas( ContainerHelper::vectorToSequence( aPrintRanges ) ); + } + break; + case BIFF_DEFNAME_PRINTTITLES: + { + Reference< XPrintAreas > xPrintAreas( getSheetFromDoc( mnCalcSheet ), UNO_QUERY ); + ApiCellRangeList aTitleRanges; + getFormulaParser().extractCellRangeList( aTitleRanges, xTokens->getTokens(), false, mnCalcSheet ); + if( xPrintAreas.is() && !aTitleRanges.empty() ) { - Reference< XPrintAreas > xPrintAreas( getSheetFromDoc( mnCalcSheet ), UNO_QUERY ); - ApiCellRangeList aTitleRanges; - getFormulaParser().extractCellRangeList( aTitleRanges, xTokens->getTokens(), false, mnCalcSheet ); - if( xPrintAreas.is() && !aTitleRanges.empty() ) + bool bHasRowTitles = false; + bool bHasColTitles = false; + const CellAddress& rMaxPos = getAddressConverter().getMaxAddress(); + for( ApiCellRangeList::const_iterator aIt = aTitleRanges.begin(), aEnd = aTitleRanges.end(); (aIt != aEnd) && (!bHasRowTitles || !bHasColTitles); ++aIt ) { - bool bHasRowTitles = false; - bool bHasColTitles = false; - const CellAddress& rMaxPos = getAddressConverter().getMaxAddress(); - for( ApiCellRangeList::const_iterator aIt = aTitleRanges.begin(), aEnd = aTitleRanges.end(); (aIt != aEnd) && (!bHasRowTitles || !bHasColTitles); ++aIt ) + bool bFullRow = (aIt->StartColumn == 0) && (aIt->EndColumn >= rMaxPos.Column); + bool bFullCol = (aIt->StartRow == 0) && (aIt->EndRow >= rMaxPos.Row); + if( !bHasRowTitles && bFullRow && !bFullCol ) { - bool bFullRow = (aIt->StartColumn == 0) && (aIt->EndColumn >= rMaxPos.Column); - bool bFullCol = (aIt->StartRow == 0) && (aIt->EndRow >= rMaxPos.Row); - if( !bHasRowTitles && bFullRow && !bFullCol ) - { - xPrintAreas->setTitleRows( *aIt ); - xPrintAreas->setPrintTitleRows( sal_True ); - bHasRowTitles = true; - } - else if( !bHasColTitles && bFullCol && !bFullRow ) - { - xPrintAreas->setTitleColumns( *aIt ); - xPrintAreas->setPrintTitleColumns( sal_True ); - bHasColTitles = true; - } + xPrintAreas->setTitleRows( *aIt ); + xPrintAreas->setPrintTitleRows( sal_True ); + bHasRowTitles = true; + } + else if( !bHasColTitles && bFullCol && !bFullRow ) + { + xPrintAreas->setTitleColumns( *aIt ); + xPrintAreas->setPrintTitleColumns( sal_True ); + bHasColTitles = true; } } } - break; } + break; } } @@ -593,26 +603,6 @@ bool DefinedName::getAbsoluteRange( CellRangeAddress& orRange ) const return xTokens.is() && getFormulaParser().extractCellRange( orRange, xTokens->getTokens(), false ); } -void DefinedName::implImportOoxFormula( FormulaContext& rContext ) -{ - if( mxFormula.get() ) - { - SequenceInputStream aStrm( *mxFormula ); - importBiff12Formula( rContext, mnCalcSheet, aStrm ); - } - else - importOoxFormula( rContext, mnCalcSheet ); -} - -void DefinedName::implImportBiffFormula( FormulaContext& rContext ) -{ - OSL_ENSURE( mxBiffStrm.get(), "DefinedName::implImportBiffFormula - missing BIFF stream" ); - BiffInputStream& rStrm = mxBiffStrm->getStream(); - BiffInputStreamPosGuard aStrmGuard( rStrm ); - if( mxBiffStrm->restorePosition() ) - importBiffFormula( rContext, mnCalcSheet, rStrm, &mnFmlaSize ); -} - // ============================================================================ DefinedNamesBuffer::DefinedNamesBuffer( const WorkbookHelper& rHelper ) : |