diff options
Diffstat (limited to 'oox/source/xls')
58 files changed, 6261 insertions, 4711 deletions
diff --git a/oox/source/xls/addressconverter.cxx b/oox/source/xls/addressconverter.cxx index 5a379000fe9e..6d53be0c155b 100644 --- a/oox/source/xls/addressconverter.cxx +++ b/oox/source/xls/addressconverter.cxx @@ -26,37 +26,37 @@ ************************************************************************/ #include "oox/xls/addressconverter.hxx" -#include <osl/diagnose.h> -#include <rtl/ustrbuf.hxx> -#include <rtl/strbuf.hxx> + #include <com/sun/star/container/XIndexAccess.hpp> #include <com/sun/star/sheet/XCellRangeAddressable.hpp> #include <com/sun/star/sheet/XSpreadsheetDocument.hpp> -#include "oox/helper/recordinputstream.hxx" +#include <osl/diagnose.h> +#include <rtl/strbuf.hxx> +#include <rtl/ustrbuf.hxx> #include "oox/core/filterbase.hxx" #include "oox/xls/biffinputstream.hxx" #include "oox/xls/biffoutputstream.hxx" +namespace oox { +namespace xls { + +// ============================================================================ + +using namespace ::com::sun::star::container; +using namespace ::com::sun::star::sheet; +using namespace ::com::sun::star::table; +using namespace ::com::sun::star::uno; + +using ::rtl::OStringBuffer; using ::rtl::OUString; using ::rtl::OUStringBuffer; -using ::rtl::OStringBuffer; using ::rtl::OUStringToOString; -using ::com::sun::star::uno::UNO_QUERY_THROW; -using ::com::sun::star::uno::Reference; -using ::com::sun::star::uno::Exception; -using ::com::sun::star::container::XIndexAccess; -using ::com::sun::star::table::CellAddress; -using ::com::sun::star::table::CellRangeAddress; -using ::com::sun::star::sheet::XCellRangeAddressable; - -namespace oox { -namespace xls { // ============================================================================ namespace { -//! TODO: this limit may be changed +//! TODO: this limit may change, is there a way to obtain it via API? const sal_Int16 API_MAXTAB = 255; const sal_Int32 OOX_MAXCOL = static_cast< sal_Int32 >( (1 << 14) - 1 ); @@ -122,7 +122,7 @@ CellAddress ApiCellRangeList::getBaseAddress() const // ============================================================================ -void BinAddress::read( RecordInputStream& rStrm ) +void BinAddress::read( SequenceInputStream& rStrm ) { rStrm >> mnRow >> mnCol; } @@ -153,7 +153,7 @@ bool BinRange::contains( const BinAddress& rAddr ) const (maFirst.mnRow <= rAddr.mnRow) && (rAddr.mnRow <= maLast.mnRow); } -void BinRange::read( RecordInputStream& rStrm ) +void BinRange::read( SequenceInputStream& rStrm ) { rStrm >> maFirst.mnRow >> maLast.mnRow >> maFirst.mnCol >> maLast.mnCol; } @@ -198,7 +198,7 @@ BinRange BinRangeList::getEnclosingRange() const return aRange; } -void BinRangeList::read( RecordInputStream& rStrm ) +void BinRangeList::read( SequenceInputStream& rStrm ) { sal_Int32 nCount = rStrm.readInt32(); resize( getLimitedValue< size_t, sal_Int64 >( nCount, 0, rStrm.getRemaining() / 16 ) ); @@ -242,7 +242,7 @@ AddressConverter::AddressConverter( const WorkbookHelper& rHelper ) : maDConChars.set( 0xFFFF, '\x01', 0xFFFF, '\x02', 0xFFFF ); switch( getFilterType() ) { - case FILTER_OOX: + case FILTER_OOXML: initializeMaxPos( OOX_MAXTAB, OOX_MAXCOL, OOX_MAXROW ); break; case FILTER_BIFF: switch( getBiff() ) @@ -781,4 +781,3 @@ void AddressConverter::initializeMaxPos( } // namespace xls } // namespace oox - diff --git a/oox/source/xls/autofilterbuffer.cxx b/oox/source/xls/autofilterbuffer.cxx new file mode 100755 index 000000000000..7cf359f6d3c9 --- /dev/null +++ b/oox/source/xls/autofilterbuffer.cxx @@ -0,0 +1,853 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#include "oox/xls/autofilterbuffer.hxx" + +#include <com/sun/star/sheet/FilterConnection.hpp> +#include <com/sun/star/sheet/FilterOperator2.hpp> +#include <com/sun/star/sheet/TableFilterField2.hpp> +#include <com/sun/star/sheet/XDatabaseRange.hpp> +#include <com/sun/star/sheet/XSheetFilterDescriptor2.hpp> +#include <com/sun/star/table/TableOrientation.hpp> +#include <rtl/ustrbuf.hxx> +#include "oox/helper/attributelist.hxx" +#include "oox/helper/containerhelper.hxx" +#include "oox/helper/propertyset.hxx" +#include "oox/xls/addressconverter.hxx" +#include "oox/xls/biffinputstream.hxx" +#include "oox/xls/defnamesbuffer.hxx" + +namespace oox { +namespace xls { + +using namespace ::com::sun::star::sheet; +using namespace ::com::sun::star::table; +using namespace ::com::sun::star::uno; + +using ::rtl::OUString; +using ::rtl::OUStringBuffer; + +// ============================================================================ + +namespace { + +const sal_uInt8 BIFF12_TOP10FILTER_TOP = 0x01; +const sal_uInt8 BIFF12_TOP10FILTER_PERCENT = 0x02; + +const sal_uInt16 BIFF12_FILTERCOLUMN_HIDDENBUTTON = 0x0001; +const sal_uInt16 BIFF12_FILTERCOLUMN_SHOWBUTTON = 0x0002; + +const sal_uInt16 BIFF_FILTERCOLUMN_OR = 0x0001; +const sal_uInt16 BIFF_FILTERCOLUMN_TOP10FILTER = 0x0010; +const sal_uInt16 BIFF_FILTERCOLUMN_TOP = 0x0020; +const sal_uInt16 BIFF_FILTERCOLUMN_PERCENT = 0x0040; + +const sal_uInt8 BIFF_FILTER_DATATYPE_NONE = 0; +const sal_uInt8 BIFF_FILTER_DATATYPE_RK = 2; +const sal_uInt8 BIFF_FILTER_DATATYPE_DOUBLE = 4; +const sal_uInt8 BIFF_FILTER_DATATYPE_STRING = 6; +const sal_uInt8 BIFF_FILTER_DATATYPE_BOOLEAN = 8; +const sal_uInt8 BIFF_FILTER_DATATYPE_EMPTY = 12; +const sal_uInt8 BIFF_FILTER_DATATYPE_NOTEMPTY = 14; + +// ---------------------------------------------------------------------------- + +bool lclGetApiOperatorFromToken( sal_Int32& rnApiOperator, sal_Int32 nToken ) +{ + switch( nToken ) + { + case XML_lessThan: rnApiOperator = FilterOperator2::NOT_EQUAL; return true; + case XML_equal: rnApiOperator = FilterOperator2::EQUAL; return true; + case XML_lessThanOrEqual: rnApiOperator = FilterOperator2::LESS_EQUAL; return true; + case XML_greaterThan: rnApiOperator = FilterOperator2::GREATER; return true; + case XML_notEqual: rnApiOperator = FilterOperator2::NOT_EQUAL; return true; + case XML_greaterThanOrEqual: rnApiOperator = FilterOperator2::GREATER_EQUAL; return true; + } + return false; +} + +/** Removes leading asterisk characters from the passed string. + @return True = at least one asterisk character has been removed. */ +bool lclTrimLeadingAsterisks( OUString& rValue ) +{ + sal_Int32 nLength = rValue.getLength(); + sal_Int32 nPos = 0; + while( (nPos < nLength) && (rValue[ nPos ] == '*') ) + ++nPos; + if( nPos > 0 ) + { + rValue = rValue.copy( nPos ); + return true; + } + return false; +} + +/** Removes trailing asterisk characters from the passed string. + @return True = at least one asterisk character has been removed. */ +bool lclTrimTrailingAsterisks( OUString& rValue ) +{ + sal_Int32 nLength = rValue.getLength(); + sal_Int32 nPos = nLength; + while( (nPos > 0) && (rValue[ nPos - 1 ] == '*') ) + --nPos; + if( nPos < nLength ) + { + rValue = rValue.copy( 0, nPos ); + return true; + } + return false; +} + +/** Converts wildcard characters '*' and '?' to regular expressions and quotes + RE meta characters. + @return True = passed string has been changed (RE needs to be enabled). */ +bool lclConvertWildcardsToRegExp( OUString& rValue ) +{ + // check existence of the wildcard characters '*' and '?' + if( (rValue.getLength() > 0) && ((rValue.indexOf( '*' ) >= 0) || (rValue.indexOf( '?' ) >= 0)) ) + { + OUStringBuffer aBuffer; + aBuffer.ensureCapacity( rValue.getLength() + 5 ); + const sal_Unicode* pcChar = rValue.getStr(); + const sal_Unicode* pcEnd = pcChar + rValue.getLength(); + for( ; pcChar < pcEnd; ++pcChar ) + { + switch( *pcChar ) + { + case '?': + aBuffer.append( sal_Unicode( '.' ) ); + break; + case '*': + aBuffer.append( sal_Unicode( '.' ) ).append( sal_Unicode( '*' ) ); + break; + case '\\': case '.': case '|': case '(': case ')': case '^': case '$': + // quote RE meta characters + aBuffer.append( sal_Unicode( '\\' ) ).append( *pcChar ); + break; + default: + aBuffer.append( *pcChar ); + } + } + rValue = aBuffer.makeStringAndClear(); + return true; + } + return false; +} + +} // namespace + +// ============================================================================ + +ApiFilterSettings::ApiFilterSettings() +{ +} + +void ApiFilterSettings::appendField( bool bAnd, sal_Int32 nOperator, double fValue ) +{ + maFilterFields.resize( maFilterFields.size() + 1 ); + TableFilterField2& rFilterField = maFilterFields.back(); + rFilterField.Connection = bAnd ? FilterConnection_AND : FilterConnection_OR; + rFilterField.Operator = nOperator; + rFilterField.IsNumeric = sal_True; + rFilterField.NumericValue = fValue; +} + +void ApiFilterSettings::appendField( bool bAnd, sal_Int32 nOperator, const OUString& rValue ) +{ + maFilterFields.resize( maFilterFields.size() + 1 ); + TableFilterField2& rFilterField = maFilterFields.back(); + rFilterField.Connection = bAnd ? FilterConnection_AND : FilterConnection_OR; + rFilterField.Operator = nOperator; + rFilterField.IsNumeric = sal_False; + rFilterField.StringValue = rValue; +} + +// ============================================================================ + +FilterSettingsBase::FilterSettingsBase( const WorkbookHelper& rHelper ) : + WorkbookHelper( rHelper ) +{ +} + +void FilterSettingsBase::importAttribs( sal_Int32 /*nElement*/, const AttributeList& /*rAttribs*/ ) +{ +} + +void FilterSettingsBase::importRecord( sal_Int32 /*nRecId*/, SequenceInputStream& /*rStrm*/ ) +{ +} + +void FilterSettingsBase::importBiffRecord( BiffInputStream& /*rStrm*/, sal_uInt16 /*nFlags*/ ) +{ +} + +ApiFilterSettings FilterSettingsBase::finalizeImport( sal_Int32 /*nMaxCount*/ ) +{ + return ApiFilterSettings(); +} + +// ============================================================================ + +DiscreteFilter::DiscreteFilter( const WorkbookHelper& rHelper ) : + FilterSettingsBase( rHelper ), + mnCalendarType( XML_none ), + mbShowBlank( false ) +{ +} + +void DiscreteFilter::importAttribs( sal_Int32 nElement, const AttributeList& rAttribs ) +{ + switch( nElement ) + { + case XLS_TOKEN( filters ): + mnCalendarType = rAttribs.getToken( XML_calendarType, XML_none ); + mbShowBlank = rAttribs.getBool( XML_blank, false ); + break; + + case XLS_TOKEN( filter ): + { + OUString aValue = rAttribs.getXString( XML_val, OUString() ); + if( aValue.getLength() > 0 ) + maValues.push_back( aValue ); + } + break; + } +} + +void DiscreteFilter::importRecord( sal_Int32 nRecId, SequenceInputStream& rStrm ) +{ + switch( nRecId ) + { + case BIFF12_ID_DISCRETEFILTERS: + { + sal_Int32 nShowBlank, nCalendarType; + rStrm >> nShowBlank >> nCalendarType; + + static const sal_Int32 spnCalendarTypes[] = { + XML_none, XML_gregorian, XML_gregorianUs, XML_japan, XML_taiwan, XML_korea, XML_hijri, XML_thai, XML_hebrew, + XML_gregorianMeFrench, XML_gregorianArabic, XML_gregorianXlitEnglish, XML_gregorianXlitFrench }; + mnCalendarType = STATIC_ARRAY_SELECT( spnCalendarTypes, nCalendarType, XML_none ); + mbShowBlank = nShowBlank != 0; + } + break; + + case BIFF12_ID_DISCRETEFILTER: + { + OUString aValue = BiffHelper::readString( rStrm ); + if( aValue.getLength() > 0 ) + maValues.push_back( aValue ); + } + break; + } +} + +ApiFilterSettings DiscreteFilter::finalizeImport( sal_Int32 nMaxCount ) +{ + ApiFilterSettings aSettings; + if( static_cast< sal_Int32 >( maValues.size() ) <= nMaxCount ) + { + aSettings.maFilterFields.reserve( maValues.size() ); + + // insert all filter values + for( FilterValueVector::iterator aIt = maValues.begin(), aEnd = maValues.end(); aIt != aEnd; ++aIt ) + aSettings.appendField( false, FilterOperator2::EQUAL, *aIt ); + + // extra field for 'show empty' + if( mbShowBlank ) + aSettings.appendField( false, FilterOperator2::EMPTY, OUString() ); + + /* Require disabled regular expressions, filter entries may contain + any RE meta characters. */ + if( !maValues.empty() ) + aSettings.mobNeedsRegExp = false; + } + return aSettings; +} + +// ============================================================================ + +Top10Filter::Top10Filter( const WorkbookHelper& rHelper ) : + FilterSettingsBase( rHelper ), + mfValue( 0.0 ), + mbTop( true ), + mbPercent( false ) +{ +} + +void Top10Filter::importAttribs( sal_Int32 nElement, const AttributeList& rAttribs ) +{ + if( nElement == XLS_TOKEN( top10 ) ) + { + mfValue = rAttribs.getDouble( XML_val, 0.0 ); + mbTop = rAttribs.getBool( XML_top, true ); + mbPercent = rAttribs.getBool( XML_percent, false ); + } +} + +void Top10Filter::importRecord( sal_Int32 nRecId, SequenceInputStream& rStrm ) +{ + if( nRecId == BIFF12_ID_TOP10FILTER ) + { + sal_uInt8 nFlags; + rStrm >> nFlags >> mfValue; + mbTop = getFlag( nFlags, BIFF12_TOP10FILTER_TOP ); + mbPercent = getFlag( nFlags, BIFF12_TOP10FILTER_PERCENT ); + } +} + +void Top10Filter::importBiffRecord( BiffInputStream& /*rStrm*/, sal_uInt16 nFlags ) +{ + mfValue = extractValue< sal_uInt16 >( nFlags, 7, 9 ); + mbTop = getFlag( nFlags, BIFF_FILTERCOLUMN_TOP ); + mbPercent = getFlag( nFlags, BIFF_FILTERCOLUMN_PERCENT ); +} + +ApiFilterSettings Top10Filter::finalizeImport( sal_Int32 /*nMaxCount*/ ) +{ + sal_Int32 nOperator = mbTop ? + (mbPercent ? FilterOperator2::TOP_PERCENT : FilterOperator2::TOP_VALUES) : + (mbPercent ? FilterOperator2::BOTTOM_PERCENT : FilterOperator2::BOTTOM_VALUES); + ApiFilterSettings aSettings; + aSettings.appendField( true, nOperator, mfValue ); + return aSettings; +} + +// ============================================================================ + +FilterCriterionModel::FilterCriterionModel() : + mnOperator( XML_equal ), + mnDataType( BIFF_FILTER_DATATYPE_NONE ), + mnStrLen( 0 ) +{ +} + +void FilterCriterionModel::setBiffOperator( sal_uInt8 nOperator ) +{ + static const sal_Int32 spnOperators[] = { XML_TOKEN_INVALID, + XML_lessThan, XML_equal, XML_lessThanOrEqual, XML_greaterThan, XML_notEqual, XML_greaterThanOrEqual }; + mnOperator = STATIC_ARRAY_SELECT( spnOperators, nOperator, XML_TOKEN_INVALID ); +} + +void FilterCriterionModel::readBiffData( SequenceInputStream& rStrm ) +{ + sal_uInt8 nOperator; + rStrm >> mnDataType >> nOperator; + setBiffOperator( nOperator ); + + switch( mnDataType ) + { + case BIFF_FILTER_DATATYPE_DOUBLE: + maValue <<= rStrm.readDouble(); + break; + case BIFF_FILTER_DATATYPE_STRING: + { + rStrm.skip( 8 ); + OUString aValue = BiffHelper::readString( rStrm ).trim(); + if( aValue.getLength() > 0 ) + maValue <<= aValue; + } + break; + case BIFF_FILTER_DATATYPE_BOOLEAN: + maValue <<= (rStrm.readuInt8() != 0); + rStrm.skip( 7 ); + break; + case BIFF_FILTER_DATATYPE_EMPTY: + rStrm.skip( 8 ); + if( mnOperator == XML_equal ) + maValue <<= OUString(); + break; + case BIFF_FILTER_DATATYPE_NOTEMPTY: + rStrm.skip( 8 ); + if( mnOperator == XML_notEqual ) + maValue <<= OUString(); + break; + default: + OSL_ENSURE( false, "FilterCriterionModel::readBiffData - unexpected data type" ); + rStrm.skip( 8 ); + } +} + +void FilterCriterionModel::readBiffData( BiffInputStream& rStrm ) +{ + sal_uInt8 nOperator; + rStrm >> mnDataType >> nOperator; + setBiffOperator( nOperator ); + + switch( mnDataType ) + { + case BIFF_FILTER_DATATYPE_NONE: + rStrm.skip( 8 ); + break; + case BIFF_FILTER_DATATYPE_RK: + maValue <<= BiffHelper::calcDoubleFromRk( rStrm.readInt32() ); + rStrm.skip( 4 ); + break; + case BIFF_FILTER_DATATYPE_DOUBLE: + maValue <<= rStrm.readDouble(); + break; + case BIFF_FILTER_DATATYPE_STRING: + rStrm.skip( 4 ); + rStrm >> mnStrLen; + rStrm.skip( 3 ); + break; + case BIFF_FILTER_DATATYPE_BOOLEAN: + { + sal_uInt8 nValue, nType; + rStrm >> nValue >> nType; + rStrm.skip( 6 ); + switch( nType ) + { + case BIFF_BOOLERR_BOOL: maValue <<= (nValue != 0); break; + case BIFF_BOOLERR_ERROR: maValue <<= BiffHelper::calcDoubleFromError( nValue ); break; + default: OSL_ENSURE( false, "FilterCriterionModel::readBiffData - unknown type" ); + } + } + break; + case BIFF_FILTER_DATATYPE_EMPTY: + rStrm.skip( 8 ); + if( mnOperator == XML_equal ) + maValue <<= OUString(); + break; + case BIFF_FILTER_DATATYPE_NOTEMPTY: + rStrm.skip( 8 ); + if( mnOperator == XML_notEqual ) + maValue <<= OUString(); + break; + default: + OSL_ENSURE( false, "FilterCriterionModel::readBiffData - unexpected data type" ); + rStrm.skip( 8 ); + } +} + +void FilterCriterionModel::readString( BiffInputStream& rStrm, BiffType eBiff, rtl_TextEncoding eTextEnc ) +{ + if( (mnDataType == BIFF_FILTER_DATATYPE_STRING) && (mnStrLen > 0) ) + { + OUString aValue = (eBiff == BIFF8) ? + rStrm.readUniStringBody( mnStrLen, true ) : + rStrm.readCharArrayUC( mnStrLen, eTextEnc, true ); + aValue = aValue.trim(); + if( aValue.getLength() > 0 ) + maValue <<= aValue; + } +} + +// ---------------------------------------------------------------------------- + +CustomFilter::CustomFilter( const WorkbookHelper& rHelper ) : + FilterSettingsBase( rHelper ), + mbAnd( false ) +{ +} + +void CustomFilter::importAttribs( sal_Int32 nElement, const AttributeList& rAttribs ) +{ + switch( nElement ) + { + case XLS_TOKEN( customFilters ): + mbAnd = rAttribs.getBool( XML_and, false ); + break; + + case XLS_TOKEN( customFilter ): + { + FilterCriterionModel aCriterion; + aCriterion.mnOperator = rAttribs.getToken( XML_operator, XML_equal ); + OUString aValue = rAttribs.getXString( XML_val, OUString() ).trim(); + if( (aCriterion.mnOperator == XML_equal) || (aCriterion.mnOperator == XML_notEqual) || (aValue.getLength() > 0) ) + aCriterion.maValue <<= aValue; + appendCriterion( aCriterion ); + } + break; + } +} + +void CustomFilter::importRecord( sal_Int32 nRecId, SequenceInputStream& rStrm ) +{ + switch( nRecId ) + { + case BIFF12_ID_CUSTOMFILTERS: + mbAnd = rStrm.readInt32() == 0; + break; + + case BIFF12_ID_CUSTOMFILTER: + { + FilterCriterionModel aCriterion; + aCriterion.readBiffData( rStrm ); + appendCriterion( aCriterion ); + } + break; + } +} + +void CustomFilter::importBiffRecord( BiffInputStream& rStrm, sal_uInt16 nFlags ) +{ + mbAnd = !getFlag( nFlags, BIFF_FILTERCOLUMN_OR ); + + FilterCriterionModel aCriterion1, aCriterion2; + aCriterion1.readBiffData( rStrm ); + aCriterion2.readBiffData( rStrm ); + aCriterion1.readString( rStrm, getBiff(), getTextEncoding() ); + aCriterion2.readString( rStrm, getBiff(), getTextEncoding() ); + appendCriterion( aCriterion1 ); + appendCriterion( aCriterion2 ); +} + +ApiFilterSettings CustomFilter::finalizeImport( sal_Int32 /*nMaxCount*/ ) +{ + ApiFilterSettings aSettings; + OSL_ENSURE( maCriteria.size() <= 2, "CustomFilter::finalizeImport - too many filter criteria" ); + for( FilterCriterionVector::iterator aIt = maCriteria.begin(), aEnd = maCriteria.end(); aIt != aEnd; ++aIt ) + { + // first extract the filter operator + sal_Int32 nOperator = 0; + bool bValidOperator = lclGetApiOperatorFromToken( nOperator, aIt->mnOperator ); + if( bValidOperator ) + { + if( aIt->maValue.has< OUString >() ) + { + // string argument + OUString aValue; + aIt->maValue >>= aValue; + // check for 'empty', 'contains', 'begins with', or 'ends with' text filters + bool bEqual = nOperator == FilterOperator2::EQUAL; + bool bNotEqual = nOperator == FilterOperator2::NOT_EQUAL; + if( bEqual || bNotEqual ) + { + if( aValue.getLength() == 0 ) + { + // empty comparison string: create empty/not empty filters + nOperator = bNotEqual ? FilterOperator2::NOT_EMPTY : FilterOperator2::EMPTY; + } + else + { + // compare to something: try to find begins/ends/contains + bool bHasLeadingAsterisk = lclTrimLeadingAsterisks( aValue ); + bool bHasTrailingAsterisk = lclTrimTrailingAsterisks( aValue ); + // just '***' matches everything, do not create a filter field + bValidOperator = aValue.getLength() > 0; + if( bValidOperator ) + { + if( bHasLeadingAsterisk && bHasTrailingAsterisk ) + nOperator = bNotEqual ? FilterOperator2::DOES_NOT_CONTAIN : FilterOperator2::CONTAINS; + else if( bHasLeadingAsterisk ) + nOperator = bNotEqual ? FilterOperator2::DOES_NOT_END_WITH : FilterOperator2::ENDS_WITH; + else if( bHasTrailingAsterisk ) + nOperator = bNotEqual ? FilterOperator2::DOES_NOT_BEGIN_WITH : FilterOperator2::BEGINS_WITH; + // else: no asterisks, stick to equal/not equal + } + } + } + + if( bValidOperator ) + { + // if wildcards are present, require RE mode, otherwise keep don't care state + if( lclConvertWildcardsToRegExp( aValue ) ) + aSettings.mobNeedsRegExp = true; + // create a new UNO API filter field + aSettings.appendField( mbAnd, nOperator, aValue ); + } + } + else if( aIt->maValue.has< double >() ) + { + // floating-point argument + double fValue = 0.0; + aIt->maValue >>= fValue; + aSettings.appendField( mbAnd, nOperator, fValue ); + } + } + } + return aSettings; +} + +void CustomFilter::appendCriterion( const FilterCriterionModel& rCriterion ) +{ + if( (rCriterion.mnOperator != XML_TOKEN_INVALID) && rCriterion.maValue.hasValue() ) + maCriteria.push_back( rCriterion ); +} + +// ============================================================================ + +FilterColumn::FilterColumn( const WorkbookHelper& rHelper ) : + WorkbookHelper( rHelper ), + mnColId( -1 ), + mbHiddenButton( false ), + mbShowButton( true ) +{ +} + +void FilterColumn::importFilterColumn( const AttributeList& rAttribs ) +{ + mnColId = rAttribs.getInteger( XML_colId, -1 ); + mbHiddenButton = rAttribs.getBool( XML_hiddenButton, false ); + mbShowButton = rAttribs.getBool( XML_showButton, true ); +} + +void FilterColumn::importFilterColumn( SequenceInputStream& rStrm ) +{ + sal_uInt16 nFlags; + rStrm >> mnColId >> nFlags; + mbHiddenButton = getFlag( nFlags, BIFF12_FILTERCOLUMN_HIDDENBUTTON ); + mbShowButton = getFlag( nFlags, BIFF12_FILTERCOLUMN_SHOWBUTTON ); +} + +void FilterColumn::importFilterColumn( BiffInputStream& rStrm ) +{ + sal_uInt16 nFlags; + mnColId = rStrm.readuInt16(); + rStrm >> nFlags; + + // BIFF5/BIFF8 support top-10 filters and custom filters + if( getFlag( nFlags, BIFF_FILTERCOLUMN_TOP10FILTER ) ) + createFilterSettings< Top10Filter >().importBiffRecord( rStrm, nFlags ); + else + createFilterSettings< CustomFilter >().importBiffRecord( rStrm, nFlags ); +} + +ApiFilterSettings FilterColumn::finalizeImport( sal_Int32 nMaxCount ) +{ + ApiFilterSettings aSettings; + if( (0 <= mnColId) && mxSettings.get() ) + { + // filter settings object creates a sequence of filter fields + aSettings = mxSettings->finalizeImport( nMaxCount ); + // add column index to all filter fields + for( ApiFilterSettings::FilterFieldVector::iterator aIt = aSettings.maFilterFields.begin(), aEnd = aSettings.maFilterFields.end(); aIt != aEnd; ++aIt ) + aIt->Field = mnColId; + } + return aSettings; +} + +// ============================================================================ + +AutoFilter::AutoFilter( const WorkbookHelper& rHelper ) : + WorkbookHelper( rHelper ) +{ +} + +void AutoFilter::importAutoFilter( const AttributeList& rAttribs, sal_Int16 nSheet ) +{ + OUString aRangeStr = rAttribs.getString( XML_ref, OUString() ); + getAddressConverter().convertToCellRangeUnchecked( maRange, aRangeStr, nSheet ); +} + +void AutoFilter::importAutoFilter( SequenceInputStream& rStrm, sal_Int16 nSheet ) +{ + BinRange aBinRange; + rStrm >> aBinRange; + getAddressConverter().convertToCellRangeUnchecked( maRange, aBinRange, nSheet ); +} + +FilterColumn& AutoFilter::createFilterColumn() +{ + FilterColumnVector::value_type xFilterColumn( new FilterColumn( *this ) ); + maFilterColumns.push_back( xFilterColumn ); + return *xFilterColumn; +} + +void AutoFilter::finalizeImport( const Reference< XSheetFilterDescriptor2 >& rxFilterDesc ) +{ + if( rxFilterDesc.is() ) + { + // set some common properties for the auto filter range + PropertySet aDescProps( rxFilterDesc ); + 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 ); + + // maximum number of UNO API filter fields + sal_Int32 nMaxCount = 0; + aDescProps.getProperty( nMaxCount, PROP_MaxFieldCount ); + OSL_ENSURE( nMaxCount > 0, "AutoFilter::finalizeImport - invalid maximum filter field count" ); + + // resulting list of all UNO API filter fields + ::std::vector< TableFilterField2 > aFilterFields; + + // track if columns require to enable or disable regular expressions + OptValue< bool > obNeedsRegExp; + + /* Track whether the filter fields of the first filter column are + connected with 'or'. In this case, other filter fields cannot be + inserted without altering the result of the entire filter, due to + Calc's precedence for the 'and' connection operator. Example: + Excel's filter conditions 'A1 and (B1 or B2) and C1' where B1 and + B2 belong to filter column B, will be evaluated by Calc as + '(A1 and B1) or (B2 and C1)'. */ + bool bHasOrConnection = false; + + // process all filter column objects, exit when 'or' connection exists + for( FilterColumnVector::iterator aIt = maFilterColumns.begin(), aEnd = maFilterColumns.end(); !bHasOrConnection && (aIt != aEnd); ++aIt ) + { + // the filter settings object creates a list of filter fields + ApiFilterSettings aSettings = (*aIt)->finalizeImport( nMaxCount ); + ApiFilterSettings::FilterFieldVector& rColumnFields = aSettings.maFilterFields; + + // new total number of filter fields + sal_Int32 nNewCount = static_cast< sal_Int32 >( aFilterFields.size() + rColumnFields.size() ); + + /* Check whether mode for regular expressions is compatible with + the global mode in obNeedsRegExp. If either one is still in + don't-care state, all is fine. If both are set, they must be + equal. */ + bool bRegExpCompatible = !obNeedsRegExp || !aSettings.mobNeedsRegExp || (obNeedsRegExp.get() == aSettings.mobNeedsRegExp.get()); + + // check whether fields are connected by 'or' (see comments above). + if( rColumnFields.size() >= 2 ) + for( ApiFilterSettings::FilterFieldVector::iterator aSIt = rColumnFields.begin() + 1, aSEnd = rColumnFields.end(); !bHasOrConnection && (aSIt != aSEnd); ++aSIt ) + bHasOrConnection = aSIt->Connection == FilterConnection_OR; + + /* Skip the column filter, if no filter fields have been created, + if the number of new filter fields would exceed the total limit + of filter fields, or if the mode for regular expressions of the + filter column does not fit. */ + if( !rColumnFields.empty() && (nNewCount <= nMaxCount) && bRegExpCompatible ) + { + /* Add 'and' connection to the first filter field to connect + it to the existing filter fields of other columns. */ + rColumnFields[ 0 ].Connection = FilterConnection_AND; + + // insert the new filter fields + aFilterFields.insert( aFilterFields.end(), rColumnFields.begin(), rColumnFields.end() ); + + // update the regular expressions mode + obNeedsRegExp.assignIfUsed( aSettings.mobNeedsRegExp ); + } + } + + // insert all filter fields to the filter descriptor + if( !aFilterFields.empty() ) + rxFilterDesc->setFilterFields2( ContainerHelper::vectorToSequence( aFilterFields ) ); + + // regular expressions + bool bUseRegExp = obNeedsRegExp.get( false ); + aDescProps.setProperty( PROP_UseRegularExpressions, bUseRegExp ); + } +} + +// ============================================================================ + +AutoFilterBuffer::AutoFilterBuffer( const WorkbookHelper& rHelper ) : + WorkbookHelper( rHelper ) +{ +} + +AutoFilter& AutoFilterBuffer::createAutoFilter() +{ + AutoFilterVector::value_type xAutoFilter( new AutoFilter( *this ) ); + maAutoFilters.push_back( xAutoFilter ); + return *xAutoFilter; +} + +void AutoFilterBuffer::finalizeImport( sal_Int16 nSheet ) +{ + // rely on existence of the defined name '_FilterDatabase' containing the range address of the filtered area + if( const DefinedName* pFilterDBName = getDefinedNames().getByBuiltinId( BIFF_DEFNAME_FILTERDATABASE, nSheet ).get() ) + { + CellRangeAddress aFilterRange; + if( pFilterDBName->getAbsoluteRange( aFilterRange ) && (aFilterRange.Sheet == nSheet) ) + { + // use the same name for the database range as used for the defined name '_FilterDatabase' + OUString aDBRangeName = pFilterDBName->getCalcName(); + Reference< XDatabaseRange > xDatabaseRange = createDatabaseRangeObject( aDBRangeName, aFilterRange ); + // first, try to create an auto filter + bool bHasAutoFilter = finalizeImport( xDatabaseRange ); + // no success: try to create an advanced filter + if( !bHasAutoFilter && xDatabaseRange.is() ) + { + // the built-in defined name 'Criteria' must exist + if( const DefinedName* pCriteriaName = getDefinedNames().getByBuiltinId( BIFF_DEFNAME_CRITERIA, nSheet ).get() ) + { + CellRangeAddress aCriteriaRange; + if( pCriteriaName->getAbsoluteRange( aCriteriaRange ) ) + { + // 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 ); + // criteria range may contain wildcards, but these are incompatible with REs + aDescProps.setProperty( PROP_UseRegularExpressions, false ); + + // position of output data (if built-in defined name 'Extract' exists) + DefinedNameRef xExtractName = getDefinedNames().getByBuiltinId( BIFF_DEFNAME_EXTRACT, nSheet ); + CellRangeAddress aOutputRange; + bool bHasOutputRange = xExtractName.get() && xExtractName->getAbsoluteRange( aOutputRange ); + aDescProps.setProperty( PROP_CopyOutputData, bHasOutputRange ); + if( bHasOutputRange ) + { + aDescProps.setProperty( PROP_SaveOutputPosition, true ); + aDescProps.setProperty( PROP_OutputPosition, CellAddress( aOutputRange.Sheet, aOutputRange.StartColumn, aOutputRange.StartRow ) ); + } + + /* 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, aCriteriaRange ); + } + } + } + } + } +} + +bool AutoFilterBuffer::finalizeImport( const Reference< XDatabaseRange >& rxDatabaseRange ) +{ + AutoFilter* pAutoFilter = getActiveAutoFilter(); + if( pAutoFilter && rxDatabaseRange.is() ) try + { + // the property 'AutoFilter' enables the drop-down buttons + PropertySet aRangeProps( rxDatabaseRange ); + aRangeProps.setProperty( PROP_AutoFilter, true ); + // convert filter settings using the filter descriptor of the database range + Reference< XSheetFilterDescriptor2 > xFilterDesc( rxDatabaseRange->getFilterDescriptor(), UNO_QUERY_THROW ); + pAutoFilter->finalizeImport( xFilterDesc ); + // return true to indicate enabled autofilter + return true; + } + catch( Exception& ) + { + } + return false; +} + +AutoFilter* AutoFilterBuffer::getActiveAutoFilter() +{ + // Excel expects not more than one auto filter per sheet or table + OSL_ENSURE( maAutoFilters.size() == 1, "AutoFilterBuffer::getActiveAutoFilter - too many auto filters" ); + // stick to the last imported auto filter + return maAutoFilters.empty() ? 0 : maAutoFilters.back().get(); +} + +// ============================================================================ + +} // namespace xls +} // namespace oox diff --git a/oox/source/xls/autofiltercontext.cxx b/oox/source/xls/autofiltercontext.cxx index 4ae31fc94c56..81327944fc05 100644 --- a/oox/source/xls/autofiltercontext.cxx +++ b/oox/source/xls/autofiltercontext.cxx @@ -26,750 +26,158 @@ ************************************************************************/ #include "oox/xls/autofiltercontext.hxx" -#include <rtl/ustrbuf.hxx> -#include <com/sun/star/container/XNameAccess.hpp> -#include <com/sun/star/container/XNamed.hpp> -#include <com/sun/star/table/XCellRange.hpp> -#include <com/sun/star/sheet/XDatabaseRange.hpp> -#include <com/sun/star/sheet/XDatabaseRanges.hpp> -#include <com/sun/star/sheet/XSheetFilterDescriptor.hpp> -#include <com/sun/star/sheet/FilterOperator.hpp> -#include <com/sun/star/sheet/FilterConnection.hpp> -#include <com/sun/star/i18n/XLocaleData.hpp> -#include "properties.hxx" -#include "oox/helper/attributelist.hxx" -#include "oox/helper/propertyset.hxx" -#include "oox/core/filterbase.hxx" -#include "oox/xls/addressconverter.hxx" -#define DEBUG_OOX_AUTOFILTER 0 - -#if USE_SC_MULTI_STRING_FILTER_PATCH -#include <com/sun/star/sheet/XExtendedSheetFilterDescriptor.hpp> -#include <com/sun/star/sheet/TableFilterFieldNormal.hpp> -#include <com/sun/star/sheet/TableFilterFieldMultiString.hpp> -using ::com::sun::star::sheet::TableFilterFieldNormal; -using ::com::sun::star::sheet::TableFilterFieldMultiString; -using ::com::sun::star::sheet::XExtendedSheetFilterDescriptor; -#else -#include <com/sun/star/sheet/TableFilterField.hpp> -using ::com::sun::star::sheet::TableFilterField; -#endif - -#if DEBUG_OOX_AUTOFILTER -#include <stdio.h> -#endif - -using ::rtl::OUString; -using ::rtl::OUStringBuffer; -using ::com::sun::star::uno::Reference; -using ::com::sun::star::uno::Exception; -using ::com::sun::star::uno::Sequence; -using ::com::sun::star::uno::UNO_QUERY; -using ::com::sun::star::uno::UNO_QUERY_THROW; -using ::com::sun::star::container::XNameAccess; -using ::com::sun::star::container::XNamed; -using ::com::sun::star::table::CellRangeAddress; -using ::com::sun::star::table::XCellRange; -using ::com::sun::star::sheet::XDatabaseRange; -using ::com::sun::star::sheet::XDatabaseRanges; -using ::com::sun::star::sheet::XSheetFilterDescriptor; -using ::com::sun::star::i18n::LocaleDataItem; -using ::com::sun::star::i18n::XLocaleData; -using ::com::sun::star::lang::Locale; -using ::oox::core::ContextHandlerRef; +#include "oox/xls/autofilterbuffer.hxx" +#include "oox/xls/biffinputstream.hxx" namespace oox { namespace xls { -// ============================================================================ - -FilterFieldItem::FilterFieldItem() : -#if USE_SC_MULTI_STRING_FILTER_PATCH - mpField(new TableFilterFieldNormal), -#else - mpField(new TableFilterField), -#endif - meType(NORMAL) -{ -} - -FilterFieldItem::FilterFieldItem(Type eType) : - meType(eType) -{ -#if USE_SC_MULTI_STRING_FILTER_PATCH - switch ( eType ) - { - case MULTI_STRING: - mpField.reset(new TableFilterFieldMultiString); - break; - case NORMAL: - mpField.reset(new TableFilterFieldNormal); - break; - default: - mpField.reset(new TableFilterFieldNormal); - } -#else - mpField.reset(new TableFilterField); - meType = NORMAL; -#endif -} +using ::oox::core::ContextHandlerRef; +using ::rtl::OUString; // ============================================================================ -OoxAutoFilterContext::OoxAutoFilterContext( OoxWorksheetFragmentBase& rFragment ) : - OoxWorksheetContextBase( rFragment ), - mbValidAddress( false ), - mbUseRegex( false ), - mbShowBlank( false ), - mbConnectionAnd( false ) +FilterSettingsContext::FilterSettingsContext( WorksheetContextBase& rParent, FilterSettingsBase& rFilterSettings ) : + WorksheetContextBase( rParent ), + mrFilterSettings( rFilterSettings ) { } -// oox.core.ContextHandler2Helper interface ----------------------------------- - -ContextHandlerRef OoxAutoFilterContext::onCreateContext( sal_Int32 nElement, const AttributeList& ) +ContextHandlerRef FilterSettingsContext::onCreateContext( sal_Int32 nElement, const AttributeList& /*rAttribs*/ ) { switch( getCurrentElement() ) { - case XLS_TOKEN( autoFilter ): - switch( nElement ) - { - case XLS_TOKEN( filterColumn ): return this; - } - break; - - case XLS_TOKEN( filterColumn ): - switch( nElement ) - { - case XLS_TOKEN( filters ): - case XLS_TOKEN( customFilters ): - case XLS_TOKEN( top10 ): - case XLS_TOKEN( dynamicFilter ): return this; - } - break; - case XLS_TOKEN( filters ): - switch( nElement ) - { - case XLS_TOKEN( filter ): return this; - } + if( nElement == XLS_TOKEN( filter ) ) return this; break; - case XLS_TOKEN( customFilters ): - switch( nElement ) - { - case XLS_TOKEN( customFilter ): return this; - } + if( nElement == XLS_TOKEN( customFilter ) ) return this; break; } return 0; } -void OoxAutoFilterContext::onStartElement( const AttributeList& rAttribs ) +void FilterSettingsContext::onStartElement( const AttributeList& rAttribs ) { - switch( getCurrentElement() ) - { - case XLS_TOKEN( autoFilter ): - importAutoFilter( rAttribs ); - break; - case XLS_TOKEN( filterColumn ): - if ( mbValidAddress ) - importFilterColumn( rAttribs ); - break; - case XLS_TOKEN( filters ): - if ( mbValidAddress ) - importFilters( rAttribs ); - break; - case XLS_TOKEN( filter ): - if ( mbValidAddress ) - importFilter( rAttribs ); - break; - case XLS_TOKEN( customFilters ): - if ( mbValidAddress ) - importCustomFilters( rAttribs ); - break; - case XLS_TOKEN( customFilter ): - if ( mbValidAddress ) - importCustomFilter( rAttribs ); - break; - case XLS_TOKEN( top10 ): - if ( mbValidAddress ) - importTop10( rAttribs ); - break; - case XLS_TOKEN( dynamicFilter ): - if ( mbValidAddress ) - importDynamicFilter( rAttribs ); - break; - } + mrFilterSettings.importAttribs( getCurrentElement(), rAttribs ); } -void OoxAutoFilterContext::onEndElement( const OUString& /*rChars*/ ) +ContextHandlerRef FilterSettingsContext::onCreateRecordContext( sal_Int32 nRecId, SequenceInputStream& /*rStrm*/ ) { switch( getCurrentElement() ) { - case XLS_TOKEN( autoFilter ): - maybeShowBlank(); - setAutoFilter(); + case BIFF12_ID_DISCRETEFILTERS: + if( nRecId == BIFF12_ID_DISCRETEFILTER ) return this; break; - case XLS_TOKEN( filters ): - setFilterNames(); + case BIFF12_ID_CUSTOMFILTERS: + if( nRecId == BIFF12_ID_CUSTOMFILTER ) return this; break; } + return 0; } -#if DEBUG_OOX_AUTOFILTER -static void lclPrintNormalField( -#if USE_SC_MULTI_STRING_FILTER_PATCH - TableFilterFieldNormal* pField -#else - TableFilterField* pField -#endif -) +void FilterSettingsContext::onStartRecord( SequenceInputStream& rStrm ) { - using namespace ::com::sun::star::sheet; - - printf(" Operator: "); - switch ( pField->Operator ) - { - case FilterOperator_EQUAL: - printf("EQUAL"); - break; - case FilterOperator_NOT_EQUAL: - printf("NOT_EQUAL"); - break; - case com::sun::star::sheet::FilterOperator_GREATER: - printf("GREATER"); - break; - case com::sun::star::sheet::FilterOperator_GREATER_EQUAL: - printf("GREATER_EQUAL"); - break; - case FilterOperator_LESS: - printf("LESS"); - break; - case FilterOperator_LESS_EQUAL: - printf("LESS_EQUAL"); - break; - case FilterOperator_NOT_EMPTY: - printf("NOT_EMPTY"); - break; - case FilterOperator_EMPTY: - printf("EMPTY"); - break; - case FilterOperator_BOTTOM_PERCENT: - printf("BOTTOM_PERCENT"); - break; - case FilterOperator_BOTTOM_VALUES: - printf("BOTTOM_VALUES"); - break; - case FilterOperator_TOP_PERCENT: - printf("TOP_PERCENT"); - break; - case FilterOperator_TOP_VALUES: - printf("TOP_VALUES"); - break; - default: - printf("other"); - } - printf("\n"); - - printf(" StringValue: %s\n", - OUStringToOString(pField->StringValue, RTL_TEXTENCODING_UTF8).getStr()); - - printf(" NumericValue: %g\n", pField->NumericValue); - - printf(" IsNumeric: "); - if (pField->IsNumeric) - printf("yes\n"); - else - printf("no\n"); + mrFilterSettings.importRecord( getCurrentElement(), rStrm ); } -static void lclPrintFieldConnection( ::com::sun::star::sheet::FilterConnection eConn ) -{ - using namespace ::com::sun::star::sheet; +// ============================================================================ - printf(" Connection: "); - switch ( eConn ) - { - case FilterConnection_AND: - printf("AND"); - break; - case FilterConnection_OR: - printf("OR"); - break; - case FilterConnection_MAKE_FIXED_SIZE: - printf("MAKE_FIXED_SIZE"); - break; - default: - printf("other"); - } - printf("\n"); +FilterColumnContext::FilterColumnContext( WorksheetContextBase& rParent, FilterColumn& rFilterColumn ) : + WorksheetContextBase( rParent ), + mrFilterColumn( rFilterColumn ) +{ } -static void lclPrintFilterField( const FilterFieldItem& aItem ) +ContextHandlerRef FilterColumnContext::onCreateContext( sal_Int32 nElement, const AttributeList& /*rAttribs*/ ) { - using namespace ::com::sun::star::sheet; - - printf("----------------------------------------\n"); -#if USE_SC_MULTI_STRING_FILTER_PATCH + if( getCurrentElement() == XLS_TOKEN( filterColumn ) ) switch( nElement ) { - // Print common fields first. - - TableFilterFieldBase* pField = aItem.mpField.get(); - printf(" Field: %ld\n", pField->Field); - lclPrintFieldConnection(pField->Connection); - } - switch ( aItem.meType ) - { - case FilterFieldItem::NORMAL: - { - TableFilterFieldNormal* pField = static_cast<TableFilterFieldNormal*>(aItem.mpField.get()); - lclPrintNormalField(pField); - } - break; - case FilterFieldItem::MULTI_STRING: - { - TableFilterFieldMultiString* pMultiStrField = static_cast<TableFilterFieldMultiString*>(aItem.mpField.get()); - sal_Int32 nSize = pMultiStrField->StringSet.getLength(); - printf(" StringSet:\n"); - for ( sal_Int32 i = 0; i < nSize; ++i ) - { - printf(" * %s\n", - OUStringToOString(pMultiStrField->StringSet[i], RTL_TEXTENCODING_UTF8).getStr()); - } - } - break; + case XLS_TOKEN( filters ): + return new FilterSettingsContext( *this, mrFilterColumn.createFilterSettings< DiscreteFilter >() ); + case XLS_TOKEN( top10 ): + return new FilterSettingsContext( *this, mrFilterColumn.createFilterSettings< Top10Filter >() ); + case XLS_TOKEN( customFilters ): + return new FilterSettingsContext( *this, mrFilterColumn.createFilterSettings< CustomFilter >() ); } -#else - TableFilterField* pField = aItem.mpField.get(); - printf(" Field: %ld\n", pField->Field); - lclPrintFieldConnection(pField->Connection); - lclPrintNormalField(pField); - -#endif - fflush(stdout); + return 0; } -#endif -void OoxAutoFilterContext::initialize() +void FilterColumnContext::onStartElement( const AttributeList& rAttribs ) { - maFields.clear(); - maFilterNames.clear(); - mbValidAddress = mbShowBlank = mbUseRegex = mbConnectionAnd = false; + mrFilterColumn.importFilterColumn( rAttribs ); } -void OoxAutoFilterContext::setAutoFilter() +ContextHandlerRef FilterColumnContext::onCreateRecordContext( sal_Int32 nRecId, SequenceInputStream& /*rStrm*/ ) { - using namespace ::com::sun::star::sheet; - - // Name this built-in database. - OUStringBuffer sDataAreaNameBuf( CREATE_OUSTRING("Excel_BuiltIn__FilterDatabase_ ") ); - sDataAreaNameBuf.append( static_cast<sal_Int32>(getSheetIndex()+1) ); - - OUString sDataAreaName = sDataAreaNameBuf.makeStringAndClear(); - Reference< XCellRange > xCellRange = getCellRange( maAutoFilterRange ); - - // Create a new database range, add filters to it and refresh the database - // for that to take effect. - - Reference< XDatabaseRanges > xDBRanges = getDatabaseRanges(); - if ( !xDBRanges.is() ) + if( getCurrentElement() == BIFF12_ID_FILTERCOLUMN ) switch( nRecId ) { - OSL_ENSURE( false, "OoxAutoFilterContext::setAutoFilter: DBRange empty" ); - return; + case BIFF12_ID_DISCRETEFILTERS: + return new FilterSettingsContext( *this, mrFilterColumn.createFilterSettings< DiscreteFilter >() ); + case BIFF12_ID_TOP10FILTER: + return new FilterSettingsContext( *this, mrFilterColumn.createFilterSettings< Top10Filter >() ); + case BIFF12_ID_CUSTOMFILTERS: + return new FilterSettingsContext( *this, mrFilterColumn.createFilterSettings< CustomFilter >() ); } - - Reference< XNameAccess > xNA( xDBRanges, UNO_QUERY_THROW ); - if ( !xNA->hasByName( sDataAreaName ) ) - xDBRanges->addNewByName( sDataAreaName, maAutoFilterRange ); - - Reference< XDatabaseRange > xDB( xNA->getByName( sDataAreaName ), UNO_QUERY ); - if ( xDB.is() ) - { - PropertySet aProp( xDB ); - aProp.setProperty( PROP_AutoFilter, true ); - } - - sal_Int32 nSize = maFields.size(); - sal_Int32 nMaxFieldCount = nSize; - Reference< XSheetFilterDescriptor > xDescriptor = xDB->getFilterDescriptor(); - if ( xDescriptor.is() ) - { - PropertySet aProp( xDescriptor ); - aProp.setProperty( PROP_ContainsHeader, true ); - aProp.setProperty( PROP_UseRegularExpressions, mbUseRegex ); - aProp.getProperty( nMaxFieldCount, PROP_MaxFieldCount ); - } - else - { - OSL_ENSURE(false, "OoxAutoFilterContext::setAutoFilter: descriptor is empty"); - return; - } - - // Unpack all column field items into a sequence. -#if USE_SC_MULTI_STRING_FILTER_PATCH - Reference< XExtendedSheetFilterDescriptor > xExtDescriptor( xDescriptor, UNO_QUERY ); - if ( !xExtDescriptor.is() ) - { - OSL_ENSURE(false, "OoxAutoFilterContext::setAutoFilter: extended descriptor is empty"); - return; - } - - xExtDescriptor->begin(); - - ::std::list< FilterFieldItem >::const_iterator itr = maFields.begin(), itrEnd = maFields.end(); - for (sal_Int32 i = 0; itr != itrEnd && i < nMaxFieldCount; ++itr, ++i) - { -#if DEBUG_OOX_AUTOFILTER - lclPrintFilterField(*itr); -#endif - switch ( itr->meType ) - { - case oox::xls::FilterFieldItem::MULTI_STRING: - { - // multi-string filter type - TableFilterFieldMultiString* pField = static_cast<TableFilterFieldMultiString*>( itr->mpField.get() ); - xExtDescriptor->addFilterFieldMultiString( *pField ); - } - break; - case oox::xls::FilterFieldItem::NORMAL: - default: - // normal filter type - TableFilterFieldNormal* pField = static_cast<TableFilterFieldNormal*>( itr->mpField.get() ); - xExtDescriptor->addFilterFieldNormal( *pField ); - } - } - xExtDescriptor->commit(); - -#else - Sequence< TableFilterField > aFields(nSize); - ::std::list< FilterFieldItem >::const_iterator itr = maFields.begin(), itrEnd = maFields.end(); - for (sal_Int32 i = 0; itr != itrEnd && i < nMaxFieldCount; ++itr, ++i) - { -#if DEBUG_OOX_AUTOFILTER - lclPrintFilterField( *itr ); -#endif - aFields[i] = *itr->mpField; - } - xDescriptor->setFilterFields( aFields ); -#endif - xDB->refresh(); + return 0; } -void OoxAutoFilterContext::maybeShowBlank() +void FilterColumnContext::onStartRecord( SequenceInputStream& rStrm ) { - using namespace ::com::sun::star::sheet; - - if ( !mbShowBlank ) - return; - -#if USE_SC_MULTI_STRING_FILTER_PATCH - FilterFieldItem aItem(FilterFieldItem::NORMAL); - TableFilterFieldNormal* pField = static_cast<TableFilterFieldNormal*>(aItem.mpField.get()); - pField->Field = mnCurColID; - pField->Operator = FilterOperator_EMPTY; - pField->Connection = FilterConnection_AND; - pField->IsNumeric = false; -#else - FilterFieldItem aItem; - aItem.mpField->Field = mnCurColID; - aItem.mpField->Operator = FilterOperator_EMPTY; - aItem.mpField->Connection = FilterConnection_AND; - aItem.mpField->IsNumeric = false; -#endif - maFields.push_back(aItem); + mrFilterColumn.importFilterColumn( rStrm ); } -void OoxAutoFilterContext::setFilterNames() -{ - using namespace ::com::sun::star::sheet; - - - sal_Int32 size = maFilterNames.size(); - if ( !size ) - return; - -#if USE_SC_MULTI_STRING_FILTER_PATCH - Sequence< OUString > aStrList(size); - ::std::list< OUString >::const_iterator itr = maFilterNames.begin(), itrEnd = maFilterNames.end(); - for (sal_Int32 i = 0; itr != itrEnd; ++itr, ++i) - aStrList[i] = *itr; - - FilterFieldItem aItem(FilterFieldItem::MULTI_STRING); - TableFilterFieldMultiString* pField = static_cast<TableFilterFieldMultiString*>( aItem.mpField.get() ); - pField->Field = mnCurColID; - pField->Connection = FilterConnection_AND; - pField->StringSet = aStrList; - - maFields.push_back(aItem); -#else - static const OUString sSep = CREATE_OUSTRING("|"); - - OUStringBuffer buf; - if ( size > 1 ) - { - buf.append( CREATE_OUSTRING("^(") ); - mbUseRegex = true; - } - - ::std::list< OUString >::const_iterator itr = maFilterNames.begin(), itrEnd = maFilterNames.end(); - bool bFirst = true; - for (; itr != itrEnd; ++itr) - { - if (bFirst) - bFirst = false; - else - buf.append( sSep ); - buf.append( *itr ); - } - if ( size > 1 ) - buf.append( CREATE_OUSTRING(")$") ); - - FilterFieldItem aItem; - aItem.mpField->Field = mnCurColID; - aItem.mpField->StringValue = buf.makeStringAndClear(); - aItem.mpField->Operator = FilterOperator_EQUAL; - aItem.mpField->Connection = FilterConnection_AND; - aItem.mpField->IsNumeric = false; - maFields.push_back(aItem); -#endif -} +// ============================================================================ -void OoxAutoFilterContext::importAutoFilter( const AttributeList& rAttribs ) +AutoFilterContext::AutoFilterContext( WorksheetFragmentBase& rFragment, AutoFilter& rAutoFilter ) : + WorksheetContextBase( rFragment ), + mrAutoFilter( rAutoFilter ) { - initialize(); - - mbValidAddress = getAddressConverter().convertToCellRange( - maAutoFilterRange, rAttribs.getString( XML_ref, OUString() ), getSheetIndex(), true, true ); } -void OoxAutoFilterContext::importFilterColumn( const AttributeList& rAttribs ) +ContextHandlerRef AutoFilterContext::onCreateContext( sal_Int32 nElement, const AttributeList& /*rAttribs*/ ) { - // hiddenButton and showButton attributes are not used for now. - mnCurColID = rAttribs.getInteger( XML_colId, -1 ); + if( (getCurrentElement() == XLS_TOKEN( autoFilter )) && (nElement == XLS_TOKEN( filterColumn )) ) + return new FilterColumnContext( *this, mrAutoFilter.createFilterColumn() ); + return 0; } -void OoxAutoFilterContext::importTop10( const AttributeList& rAttribs ) +void AutoFilterContext::onStartElement( const AttributeList& rAttribs ) { - using namespace ::com::sun::star::sheet; - - // filterVal attribute is not necessarily, since Calc also supports top 10 - // and top 10% filter type. - FilterFieldItem aItem; -#if USE_SC_MULTI_STRING_FILTER_PATCH - TableFilterFieldNormal* pField = static_cast<TableFilterFieldNormal*>(aItem.mpField.get()); -#else - TableFilterField* pField = aItem.mpField.get(); -#endif - pField->Field = mnCurColID; - - bool bPercent = rAttribs.getBool( XML_percent, false ); - bool bTop = rAttribs.getBool( XML_top, true ); - pField->NumericValue = rAttribs.getDouble( XML_val, 0.0 ); - pField->IsNumeric = true; - - // When top10 filter item is present, that's the only filter item for that column. - if ( bTop ) - if ( bPercent ) - pField->Operator = FilterOperator_TOP_PERCENT; - else - pField->Operator = FilterOperator_TOP_VALUES; - else - if ( bPercent ) - pField->Operator = FilterOperator_BOTTOM_PERCENT; - else - pField->Operator = FilterOperator_BOTTOM_VALUES; - - maFields.push_back(aItem); + mrAutoFilter.importAutoFilter( rAttribs, getSheetIndex() ); } -void OoxAutoFilterContext::importCustomFilters( const AttributeList& rAttribs ) +ContextHandlerRef AutoFilterContext::onCreateRecordContext( sal_Int32 nRecId, SequenceInputStream& /*rStrm*/ ) { - // OR is default when the 'and' attribute is absent. - mbConnectionAnd = rAttribs.getBool( XML_and, false ); + if( (getCurrentElement() == BIFF12_ID_AUTOFILTER) && (nRecId == BIFF12_ID_FILTERCOLUMN) ) + return new FilterColumnContext( *this, mrAutoFilter.createFilterColumn() ); + return 0; } -/** Do a best-effort guess of whether or not the given string is numerical. */ -static bool lclIsNumeric( const OUString& _str, const LocaleDataItem& aLocaleItem ) +void AutoFilterContext::onStartRecord( SequenceInputStream& rStrm ) { - OUString str = _str.trim(); - sal_Int32 size = str.getLength(); - - if ( !size ) - // Empty string. This can't be a number. - return false; - - // Get the decimal separator for the current locale. - const OUString& sep = aLocaleItem.decimalSeparator; - - bool bDecimalSep = false; - for (sal_Int32 i = 0; i < size; ++i) - { - OUString c = str.copy(i, 1); - if ( !c.compareTo(sep) ) - { - if ( bDecimalSep ) - return false; - else - { - bDecimalSep = true; - continue; - } - } - if ( (0 > c.compareToAscii("0") || 0 < c.compareToAscii("9")) ) - return false; - } - - return true; + mrAutoFilter.importAutoFilter( rStrm, getSheetIndex() ); } -/** Convert wildcard characters to regex equivalent. Returns true if any - wildcard character is found. */ -static bool lclWildcard2Regex( OUString& str ) -{ - bool bWCFound = false; - OUStringBuffer buf; - sal_Int32 size = str.getLength(); - buf.ensureCapacity(size + 6); // pure heuristics. - - sal_Unicode dot = '.', star = '*', hat = '^', dollar = '$'; - buf.append(hat); - for (sal_Int32 i = 0; i < size; ++i) - { - OUString c = str.copy(i, 1); - if ( !c.compareToAscii("?") ) - { - buf.append(dot); - bWCFound = true; - } - else if ( !c.compareToAscii("*") ) - { - buf.append(dot); - buf.append(star); - bWCFound = true; - } - else - buf.append(c); - } - buf.append(dollar); - - if (bWCFound) - str = buf.makeStringAndClear(); - - return bWCFound; -} +// ============================================================================ -/** Translate Excel's filter operator to Calc's. */ -static ::com::sun::star::sheet::FilterOperator lclTranslateFilterOp( sal_Int32 nToken ) +BiffAutoFilterContext::BiffAutoFilterContext( const WorksheetHelper& rHelper, AutoFilter& rAutoFilter ) : + BiffWorksheetContextBase( rHelper ), + mrAutoFilter( rAutoFilter ) { - using namespace ::com::sun::star::sheet; - - switch ( nToken ) - { - case XML_equal: - return FilterOperator_EQUAL; - case XML_notEqual: - return FilterOperator_NOT_EQUAL; - case XML_greaterThan: - return FilterOperator_GREATER; - case XML_greaterThanOrEqual: - return FilterOperator_GREATER_EQUAL; - case XML_lessThan: - return FilterOperator_LESS; - case XML_lessThanOrEqual: - return FilterOperator_LESS_EQUAL; - } - return FilterOperator_EQUAL; } -void OoxAutoFilterContext::importCustomFilter( const AttributeList& rAttribs ) +void BiffAutoFilterContext::importRecord( BiffInputStream& rStrm ) { - using namespace ::com::sun::star::sheet; - - sal_Int32 nToken = rAttribs.getToken( XML_operator, XML_equal ); -#if USE_SC_MULTI_STRING_FILTER_PATCH - FilterFieldItem aItem(FilterFieldItem::NORMAL); - TableFilterFieldNormal* pField = static_cast<TableFilterFieldNormal*>(aItem.mpField.get()); -#else - FilterFieldItem aItem; - TableFilterField* pField = aItem.mpField.get(); -#endif - pField->Field = mnCurColID; - pField->StringValue = rAttribs.getString( XML_val, OUString() ); - pField->NumericValue = pField->StringValue.toDouble(); - pField->Operator = lclTranslateFilterOp( nToken ); - - if ( nToken == XML_notEqual && !pField->StringValue.compareToAscii(" ") ) + switch( rStrm.getRecId() ) { - // Special case for hiding blanks. Excel translates "hide blanks" to - // (filter if notEqual " "). So, we need to translate it back. - pField->Operator = FilterOperator_NOT_EMPTY; - pField->IsNumeric = false; - maFields.push_back(aItem); - return; + // nothing to read for BIFF_ID_AUTOFILTER + case BIFF_ID_FILTERCOLUMN: mrAutoFilter.createFilterColumn().importFilterColumn( rStrm ); break; } - - switch ( nToken ) - { - case XML_equal: - case XML_notEqual: - { - Reference< XLocaleData > xLocale( getGlobalFactory()->createInstance( - CREATE_OUSTRING("com.sun.star.i18n.LocaleData") ), UNO_QUERY ); - - if ( !xLocale.is() ) - return; - - LocaleDataItem aLocaleItem = xLocale->getLocaleItem( ::com::sun::star::lang::Locale() ); - pField->IsNumeric = lclIsNumeric(pField->StringValue, aLocaleItem); - - if ( !pField->IsNumeric && lclWildcard2Regex(pField->StringValue) ) - mbUseRegex = true; - - maFields.push_back(aItem); - } - break; - - case XML_greaterThan: - case XML_greaterThanOrEqual: - case XML_lessThan: - case XML_lessThanOrEqual: - { - pField->IsNumeric = true; - maFields.push_back(aItem); - } - break; - default: - OSL_ENSURE( false, "OoxAutoFilterContext::importCustomFilter: unhandled case" ); - } -} - -void OoxAutoFilterContext::importFilters( const AttributeList& rAttribs ) -{ - // blank (boolean) and calendarType attributes can be present, but not used for now. - - mbShowBlank = rAttribs.getBool( XML_blank, false ); - maFilterNames.clear(); -} - -void OoxAutoFilterContext::importFilter( const AttributeList& rAttribs ) -{ - if (mnCurColID == -1) - return; - - OUString value = rAttribs.getString( XML_val, OUString() ); - if ( value.getLength() ) - maFilterNames.push_back(value); -} - -void OoxAutoFilterContext::importDynamicFilter( const AttributeList& /*rAttribs*/ ) -{ - // not implemented yet - Calc doesn't support this. } // ============================================================================ } // namespace xls } // namespace oox - diff --git a/oox/source/xls/biffcodec.cxx b/oox/source/xls/biffcodec.cxx index 0872dcc654df..cb4829973fcc 100644 --- a/oox/source/xls/biffcodec.cxx +++ b/oox/source/xls/biffcodec.cxx @@ -26,20 +26,24 @@ ************************************************************************/ #include "oox/xls/biffcodec.hxx" + #include <osl/thread.h> #include <string.h> #include "oox/core/filterbase.hxx" #include "oox/xls/biffinputstream.hxx" +namespace oox { +namespace xls { + +// ============================================================================ + +using namespace ::com::sun::star::beans; +using namespace ::com::sun::star::uno; + +using ::oox::core::FilterBase; using ::rtl::OString; using ::rtl::OUString; using ::rtl::OStringToOUString; -using ::oox::core::FilterBase; - -using namespace ::com::sun::star; - -namespace oox { -namespace xls { // ============================================================================ @@ -52,14 +56,14 @@ BiffDecoderBase::~BiffDecoderBase() { } -::comphelper::DocPasswordVerifierResult BiffDecoderBase::verifyPassword( const ::rtl::OUString& rPassword, uno::Sequence< beans::NamedValue >& o_rEncryptionData ) +::comphelper::DocPasswordVerifierResult BiffDecoderBase::verifyPassword( const OUString& rPassword, Sequence< NamedValue >& o_rEncryptionData ) { o_rEncryptionData = implVerifyPassword( rPassword ); - mbValid = ( o_rEncryptionData.getLength() > 0 ); + mbValid = o_rEncryptionData.hasElements(); return mbValid ? ::comphelper::DocPasswordVerifierResult_OK : ::comphelper::DocPasswordVerifierResult_WRONG_PASSWORD; } -::comphelper::DocPasswordVerifierResult BiffDecoderBase::verifyEncryptionData( const uno::Sequence< beans::NamedValue >& rEncryptionData ) +::comphelper::DocPasswordVerifierResult BiffDecoderBase::verifyEncryptionData( const Sequence< NamedValue >& rEncryptionData ) { mbValid = implVerifyEncryptionData( rEncryptionData ); return mbValid ? ::comphelper::DocPasswordVerifierResult_OK : ::comphelper::DocPasswordVerifierResult_WRONG_PASSWORD; @@ -101,7 +105,7 @@ BiffDecoder_XOR* BiffDecoder_XOR::implClone() return new BiffDecoder_XOR( *this ); } -uno::Sequence< beans::NamedValue > BiffDecoder_XOR::implVerifyPassword( const ::rtl::OUString& rPassword ) +Sequence< NamedValue > BiffDecoder_XOR::implVerifyPassword( const OUString& rPassword ) { maEncryptionData.realloc( 0 ); @@ -112,29 +116,29 @@ uno::Sequence< beans::NamedValue > BiffDecoder_XOR::implVerifyPassword( const :: if( (0 < nLen) && (nLen < 16) ) { // init codec - maCodec.initKey( (sal_uInt8*)aBytePassword.getStr() ); + maCodec.initKey( reinterpret_cast< const sal_uInt8* >( aBytePassword.getStr() ) ); - if ( maCodec.verifyKey( mnKey, mnHash ) ) + if( maCodec.verifyKey( mnKey, mnHash ) ) maEncryptionData = maCodec.getEncryptionData(); } return maEncryptionData; } -bool BiffDecoder_XOR::implVerifyEncryptionData( const uno::Sequence< beans::NamedValue >& rEncryptionData ) +bool BiffDecoder_XOR::implVerifyEncryptionData( const Sequence< NamedValue >& rEncryptionData ) { maEncryptionData.realloc( 0 ); - if( rEncryptionData.getLength() ) + if( rEncryptionData.hasElements() ) { // init codec maCodec.initCodec( rEncryptionData ); - if ( maCodec.verifyKey( mnKey, mnHash ) ) + if( maCodec.verifyKey( mnKey, mnHash ) ) maEncryptionData = rEncryptionData; } - return maEncryptionData.getLength(); + return maEncryptionData.hasElements(); } void BiffDecoder_XOR::implDecode( sal_uInt8* pnDestData, const sal_uInt8* pnSrcData, sal_Int64 nStreamPos, sal_uInt16 nBytes ) @@ -187,7 +191,7 @@ BiffDecoder_RCF* BiffDecoder_RCF::implClone() return new BiffDecoder_RCF( *this ); } -uno::Sequence< beans::NamedValue > BiffDecoder_RCF::implVerifyPassword( const ::rtl::OUString& rPassword ) +Sequence< NamedValue > BiffDecoder_RCF::implVerifyPassword( const OUString& rPassword ) { maEncryptionData.realloc( 0 ); @@ -204,31 +208,29 @@ uno::Sequence< beans::NamedValue > BiffDecoder_RCF::implVerifyPassword( const :: // init codec maCodec.initKey( &aPassVect.front(), &maSalt.front() ); - if ( maCodec.verifyKey( &maVerifier.front(), &maVerifierHash.front() ) ) + if( maCodec.verifyKey( &maVerifier.front(), &maVerifierHash.front() ) ) maEncryptionData = maCodec.getEncryptionData(); } return maEncryptionData; } -bool BiffDecoder_RCF::implVerifyEncryptionData( const uno::Sequence< beans::NamedValue >& rEncryptionData ) +bool BiffDecoder_RCF::implVerifyEncryptionData( const Sequence< NamedValue >& rEncryptionData ) { maEncryptionData.realloc( 0 ); - if( rEncryptionData.getLength() ) + if( rEncryptionData.hasElements() ) { // init codec maCodec.initCodec( rEncryptionData ); - if ( maCodec.verifyKey( &maVerifier.front(), &maVerifierHash.front() ) ) + if( maCodec.verifyKey( &maVerifier.front(), &maVerifierHash.front() ) ) maEncryptionData = rEncryptionData; } - return maEncryptionData.getLength(); + return maEncryptionData.hasElements(); } - - void BiffDecoder_RCF::implDecode( sal_uInt8* pnDestData, const sal_uInt8* pnSrcData, sal_Int64 nStreamPos, sal_uInt16 nBytes ) { sal_uInt8* pnCurrDest = pnDestData; @@ -375,4 +377,3 @@ void BiffCodecHelper::cloneDecoder( BiffInputStream& rStrm ) } // namespace xls } // namespace oox - diff --git a/oox/source/xls/biffdetector.cxx b/oox/source/xls/biffdetector.cxx index fc3e1e710bcb..038d7d732425 100644 --- a/oox/source/xls/biffdetector.cxx +++ b/oox/source/xls/biffdetector.cxx @@ -26,31 +26,31 @@ ************************************************************************/ #include "oox/xls/biffdetector.hxx" + #include <algorithm> -#include <rtl/strbuf.hxx> #include <com/sun/star/io/XInputStream.hpp> +#include <com/sun/star/uno/XComponentContext.hpp> #include <comphelper/mediadescriptor.hxx> +#include <rtl/strbuf.hxx> #include "oox/helper/binaryinputstream.hxx" #include "oox/ole/olestorage.hxx" -using ::rtl::OUString; -using ::rtl::OStringBuffer; -using ::com::sun::star::uno::Reference; -using ::com::sun::star::uno::Sequence; -using ::com::sun::star::uno::Exception; -using ::com::sun::star::uno::RuntimeException; -using ::com::sun::star::uno::XInterface; -using ::com::sun::star::uno::UNO_QUERY; -using ::com::sun::star::lang::XMultiServiceFactory; -using ::com::sun::star::beans::PropertyValue; -using ::com::sun::star::io::XInputStream; -using ::comphelper::MediaDescriptor; - namespace oox { namespace xls { // ============================================================================ +using namespace ::com::sun::star::beans; +using namespace ::com::sun::star::io; +using namespace ::com::sun::star::lang; +using namespace ::com::sun::star::uno; + +using ::comphelper::MediaDescriptor; +using ::rtl::OStringBuffer; +using ::rtl::OUString; + +// ============================================================================ + Sequence< OUString > BiffDetector_getSupportedServiceNames() { Sequence< OUString > aServiceNames( 1 ); @@ -60,18 +60,18 @@ Sequence< OUString > BiffDetector_getSupportedServiceNames() OUString BiffDetector_getImplementationName() { - return CREATE_OUSTRING( "com.sun.star.comp.oox.BiffDetector" ); + return CREATE_OUSTRING( "com.sun.star.comp.oox.xls.BiffDetector" ); } -Reference< XInterface > SAL_CALL BiffDetector_createInstance( const Reference< XMultiServiceFactory >& rxFactory ) throw( Exception ) +Reference< XInterface > SAL_CALL BiffDetector_createInstance( const Reference< XComponentContext >& rxContext ) throw( Exception ) { - return static_cast< ::cppu::OWeakObject* >( new BiffDetector( rxFactory ) ); + return static_cast< ::cppu::OWeakObject* >( new BiffDetector( rxContext ) ); } // ============================================================================ -BiffDetector::BiffDetector( const Reference< XMultiServiceFactory >& rxFactory ) : - mxFactory( rxFactory ) +BiffDetector::BiffDetector( const Reference< XComponentContext >& rxContext ) throw( RuntimeException ) : + mxContext( rxContext, UNO_SET_THROW ) { } @@ -79,7 +79,7 @@ BiffDetector::~BiffDetector() { } -BiffType BiffDetector::detectStreamBiffVersion( BinaryInputStream& rInStream ) +/*static*/ BiffType BiffDetector::detectStreamBiffVersion( BinaryInputStream& rInStream ) { BiffType eBiff = BIFF_UNKNOWN; if( !rInStream.isEof() && rInStream.isSeekable() && (rInStream.getLength() > 4) ) @@ -132,36 +132,36 @@ BiffType BiffDetector::detectStreamBiffVersion( BinaryInputStream& rInStream ) return eBiff; } -BiffType BiffDetector::detectStorageBiffVersion( OUString& orWorkbookStreamName, StorageRef xStorage ) +/*static*/ BiffType BiffDetector::detectStorageBiffVersion( OUString& orWorkbookStreamName, const StorageRef& rxStorage ) { static const OUString saBookName = CREATE_OUSTRING( "Book" ); static const OUString saWorkbookName = CREATE_OUSTRING( "Workbook" ); BiffType eBiff = BIFF_UNKNOWN; - if( xStorage.get() ) + if( rxStorage.get() ) { - if( xStorage->isStorage() ) + if( rxStorage->isStorage() ) { // try to open the "Book" stream - BinaryXInputStream aBookStrm5( xStorage->openInputStream( saBookName ), true ); + BinaryXInputStream aBookStrm5( rxStorage->openInputStream( saBookName ), true ); BiffType eBookStrm5Biff = detectStreamBiffVersion( aBookStrm5 ); // try to open the "Workbook" stream - BinaryXInputStream aBookStrm8( xStorage->openInputStream( saWorkbookName ), true ); + BinaryXInputStream aBookStrm8( rxStorage->openInputStream( saWorkbookName ), true ); BiffType eBookStrm8Biff = detectStreamBiffVersion( aBookStrm8 ); // decide which stream to use if( (eBookStrm8Biff != BIFF_UNKNOWN) && ((eBookStrm5Biff == BIFF_UNKNOWN) || (eBookStrm8Biff > eBookStrm5Biff)) ) { - /* Only "Workbook" stream exists; or both streams exist, - and "Workbook" has higher BIFF version than "Book" stream. */ + /* Only "Workbook" stream exists; or both streams exist, and + "Workbook" has higher BIFF version than "Book" stream. */ eBiff = eBookStrm8Biff; orWorkbookStreamName = saWorkbookName; } else if( eBookStrm5Biff != BIFF_UNKNOWN ) { - /* Only "Book" stream exists; or both streams exist, - and "Book" has higher BIFF version than "Workbook" stream. */ + /* Only "Book" stream exists; or both streams exist, and + "Book" has higher BIFF version than "Workbook" stream. */ eBiff = eBookStrm5Biff; orWorkbookStreamName = saBookName; } @@ -169,7 +169,7 @@ BiffType BiffDetector::detectStorageBiffVersion( OUString& orWorkbookStreamName, else { // no storage, try plain input stream from medium (even for BIFF5+) - BinaryXInputStream aStrm( xStorage->openInputStream( OUString() ), false ); + BinaryXInputStream aStrm( rxStorage->openInputStream( OUString() ), false ); eBiff = detectStreamBiffVersion( aStrm ); orWorkbookStreamName = OUString(); } @@ -187,7 +187,7 @@ OUString SAL_CALL BiffDetector::getImplementationName() throw( RuntimeException sal_Bool SAL_CALL BiffDetector::supportsService( const OUString& rService ) throw( RuntimeException ) { - const Sequence< OUString > aServices( BiffDetector_getSupportedServiceNames() ); + const Sequence< OUString > aServices = BiffDetector_getSupportedServiceNames(); const OUString* pArray = aServices.getConstArray(); const OUString* pArrayEnd = pArray + aServices.getLength(); return ::std::find( pArray, pArrayEnd, rService ) != pArrayEnd; @@ -207,20 +207,19 @@ OUString SAL_CALL BiffDetector::detect( Sequence< PropertyValue >& rDescriptor ) MediaDescriptor aDescriptor( rDescriptor ); aDescriptor.addInputStream(); - Reference< XInputStream > xInStrm( aDescriptor[ MediaDescriptor::PROP_INPUTSTREAM() ], UNO_QUERY ); - if( xInStrm.is() ) + Reference< XMultiServiceFactory > xFactory( mxContext->getServiceManager(), UNO_QUERY_THROW ); + Reference< XInputStream > xInStrm( aDescriptor[ MediaDescriptor::PROP_INPUTSTREAM() ], UNO_QUERY_THROW ); + StorageRef xStorage( new ::oox::ole::OleStorage( xFactory, xInStrm, true ) ); + + OUString aWorkbookName; + switch( detectStorageBiffVersion( aWorkbookName, xStorage ) ) { - OUString aWorkbookName; - StorageRef xStorage( new ::oox::ole::OleStorage( mxFactory, xInStrm, true ) ); - switch( detectStorageBiffVersion( aWorkbookName, xStorage ) ) - { - case BIFF2: - case BIFF3: - case BIFF4: aTypeName = CREATE_OUSTRING( "calc_MS_Excel_40" ); break; - case BIFF5: aTypeName = CREATE_OUSTRING( "calc_MS_Excel_95" ); break; - case BIFF8: aTypeName = CREATE_OUSTRING( "calc_MS_Excel_97" ); break; - default:; - } + case BIFF2: + case BIFF3: + case BIFF4: aTypeName = CREATE_OUSTRING( "calc_MS_Excel_40" ); break; + case BIFF5: aTypeName = CREATE_OUSTRING( "calc_MS_Excel_95" ); break; + case BIFF8: aTypeName = CREATE_OUSTRING( "calc_MS_Excel_97" ); break; + default:; } return aTypeName; @@ -230,4 +229,3 @@ OUString SAL_CALL BiffDetector::detect( Sequence< PropertyValue >& rDescriptor ) } // namespace xls } // namespace oox - diff --git a/oox/source/xls/biffhelper.cxx b/oox/source/xls/biffhelper.cxx index afd7e04e6a08..55839043865e 100644 --- a/oox/source/xls/biffhelper.cxx +++ b/oox/source/xls/biffhelper.cxx @@ -26,20 +26,23 @@ ************************************************************************/ #include "oox/xls/biffhelper.hxx" + #include <rtl/math.hxx> #include <rtl/tencinfo.h> #include "oox/xls/biffinputstream.hxx" #include "oox/xls/biffoutputstream.hxx" #include "oox/xls/worksheethelper.hxx" -using ::rtl::OUString; -using ::rtl::OUStringBuffer; - namespace oox { namespace xls { // ============================================================================ +using ::rtl::OUString; +using ::rtl::OUStringBuffer; + +// ============================================================================ + namespace { const sal_Int32 BIFF_RK_100FLAG = 0x00000001; @@ -186,6 +189,8 @@ void lclImportImgDataDib( StreamDataSequence& orDataSeq, BiffInputStream& rStrm, // ============================================================================ +// conversion ----------------------------------------------------------------- + /*static*/ double BiffHelper::calcDoubleFromRk( sal_Int32 nRkValue ) { DecodedDouble aDecDbl( 0.0 ); @@ -262,6 +267,53 @@ void lclImportImgDataDib( StreamDataSequence& orDataSeq, BiffInputStream& rStrm, return static_cast< sal_uInt16 >( (nCodePage == 0) ? 1252 : nCodePage ); } +// BIFF12 import -------------------------------------------------------------- + +/*static*/ OUString BiffHelper::readString( SequenceInputStream& rStrm, bool b32BitLen ) +{ + OUString aString; + if( !rStrm.isEof() ) + { + sal_Int32 nCharCount = b32BitLen ? rStrm.readValue< sal_Int32 >() : rStrm.readValue< sal_Int16 >(); + // string length -1 is often used to indicate a missing string + OSL_ENSURE( !rStrm.isEof() && (nCharCount >= -1), "BiffHelper::readString - invalid string length" ); + if( !rStrm.isEof() && (nCharCount > 0) ) + { + ::std::vector< sal_Unicode > aBuffer; + aBuffer.reserve( getLimitedValue< size_t, sal_Int32 >( nCharCount + 1, 0, 0xFFFF ) ); + for( sal_Int32 nCharIdx = 0; !rStrm.isEof() && (nCharIdx < nCharCount); ++nCharIdx ) + { + sal_uInt16 nChar; + rStrm.readValue( nChar ); + aBuffer.push_back( static_cast< sal_Unicode >( nChar ) ); + } + aBuffer.push_back( 0 ); + aString = OUString( &aBuffer.front() ); + } + } + return aString; +} + +// BIFF2-BIFF8 import --------------------------------------------------------- + +/*static*/ bool BiffHelper::isBofRecord( BiffInputStream& rStrm ) +{ + return + (rStrm.getRecId() == BIFF2_ID_BOF) || + (rStrm.getRecId() == BIFF3_ID_BOF) || + (rStrm.getRecId() == BIFF4_ID_BOF) || + (rStrm.getRecId() == BIFF5_ID_BOF); +} + +/*static*/ bool BiffHelper::skipRecordBlock( BiffInputStream& rStrm, sal_uInt16 nEndRecId ) +{ + sal_uInt16 nStartRecId = rStrm.getRecId(); + while( rStrm.startNextRecord() && (rStrm.getRecId() != nEndRecId) ) + if( rStrm.getRecId() == nStartRecId ) + skipRecordBlock( rStrm, nEndRecId ); + return !rStrm.isEof() && (rStrm.getRecId() == nEndRecId); +} + /*static*/ void BiffHelper::importImgData( StreamDataSequence& orDataSeq, BiffInputStream& rStrm, BiffType eBiff ) { sal_uInt16 nFormat, nEnv; @@ -284,4 +336,3 @@ void lclImportImgDataDib( StreamDataSequence& orDataSeq, BiffInputStream& rStrm, } // namespace xls } // namespace oox - diff --git a/oox/source/xls/biffinputstream.cxx b/oox/source/xls/biffinputstream.cxx index fec36d4fa54d..6dfa8f755c25 100644 --- a/oox/source/xls/biffinputstream.cxx +++ b/oox/source/xls/biffinputstream.cxx @@ -26,17 +26,20 @@ ************************************************************************/ #include "oox/xls/biffinputstream.hxx" + #include <algorithm> #include <rtl/ustrbuf.hxx> +namespace oox { +namespace xls { + +// ============================================================================ + using ::rtl::OString; using ::rtl::OStringToOUString; using ::rtl::OUString; using ::rtl::OUStringBuffer; -namespace oox { -namespace xls { - // ============================================================================ namespace prv { @@ -628,4 +631,3 @@ BiffInputStreamPosGuard::~BiffInputStreamPosGuard() } // namespace xls } // namespace oox - diff --git a/oox/source/xls/biffoutputstream.cxx b/oox/source/xls/biffoutputstream.cxx index 5ec8834c5336..ba59f50bea4d 100644 --- a/oox/source/xls/biffoutputstream.cxx +++ b/oox/source/xls/biffoutputstream.cxx @@ -205,4 +205,3 @@ sal_uInt16 BiffOutputStream::prepareRawBlock( sal_Int32 nTotalSize ) } // namespace xls } // namespace oox - diff --git a/oox/source/xls/chartsheetfragment.cxx b/oox/source/xls/chartsheetfragment.cxx index 287518584cc3..c67768ef2f22 100644 --- a/oox/source/xls/chartsheetfragment.cxx +++ b/oox/source/xls/chartsheetfragment.cxx @@ -26,32 +26,32 @@ ************************************************************************/ #include "oox/xls/chartsheetfragment.hxx" + #include "oox/helper/attributelist.hxx" -#include "oox/helper/recordinputstream.hxx" #include "oox/xls/biffinputstream.hxx" #include "oox/xls/pagesettings.hxx" #include "oox/xls/viewsettings.hxx" #include "oox/xls/workbooksettings.hxx" #include "oox/xls/worksheetsettings.hxx" -using ::rtl::OUString; -using ::oox::core::ContextHandlerRef; -using ::oox::core::RecordInfo; - namespace oox { namespace xls { // ============================================================================ -OoxChartsheetFragment::OoxChartsheetFragment( const WorkbookHelper& rHelper, - const OUString& rFragmentPath, ISegmentProgressBarRef xProgressBar, sal_Int16 nSheet ) : - OoxWorksheetFragmentBase( rHelper, rFragmentPath, xProgressBar, SHEETTYPE_CHARTSHEET, nSheet ) +using namespace ::oox::core; + +using ::rtl::OUString; + +// ============================================================================ + +ChartsheetFragment::ChartsheetFragment( const WorkbookHelper& rHelper, + const OUString& rFragmentPath, const ISegmentProgressBarRef& rxProgressBar, sal_Int16 nSheet ) : + WorksheetFragmentBase( rHelper, rFragmentPath, rxProgressBar, SHEETTYPE_CHARTSHEET, nSheet ) { } -// oox.core.ContextHandler2Helper interface ----------------------------------- - -ContextHandlerRef OoxChartsheetFragment::onCreateContext( sal_Int32 nElement, const AttributeList& rAttribs ) +ContextHandlerRef ChartsheetFragment::onCreateContext( sal_Int32 nElement, const AttributeList& rAttribs ) { switch( getCurrentElement() ) { @@ -86,14 +86,14 @@ ContextHandlerRef OoxChartsheetFragment::onCreateContext( sal_Int32 nElement, co case XLS_TOKEN( oddHeader ): case XLS_TOKEN( oddFooter ): case XLS_TOKEN( evenHeader ): - case XLS_TOKEN( evenFooter ): return this; // collect contents in onEndElement() + case XLS_TOKEN( evenFooter ): return this; // collect contents in onCharacters() } break; } return 0; } -void OoxChartsheetFragment::onEndElement( const OUString& rChars ) +void ChartsheetFragment::onCharacters( const OUString& rChars ) { switch( getCurrentElement() ) { @@ -108,60 +108,58 @@ void OoxChartsheetFragment::onEndElement( const OUString& rChars ) } } -ContextHandlerRef OoxChartsheetFragment::onCreateRecordContext( sal_Int32 nRecId, RecordInputStream& rStrm ) +ContextHandlerRef ChartsheetFragment::onCreateRecordContext( sal_Int32 nRecId, SequenceInputStream& rStrm ) { switch( getCurrentElement() ) { case XML_ROOT_CONTEXT: - if( nRecId == OOBIN_ID_WORKSHEET ) return this; + if( nRecId == BIFF12_ID_WORKSHEET ) return this; break; - case OOBIN_ID_WORKSHEET: + case BIFF12_ID_WORKSHEET: switch( nRecId ) { - case OOBIN_ID_CHARTSHEETVIEWS: return this; - - case OOBIN_ID_CHARTSHEETPR: getWorksheetSettings().importChartSheetPr( rStrm ); break; - case OOBIN_ID_CHARTPROTECTION: getWorksheetSettings().importChartProtection( rStrm ); break; - case OOBIN_ID_PAGEMARGINS: getPageSettings().importPageMargins( rStrm ); break; - case OOBIN_ID_CHARTPAGESETUP: getPageSettings().importChartPageSetup( getRelations(), rStrm ); break; - case OOBIN_ID_HEADERFOOTER: getPageSettings().importHeaderFooter( rStrm ); break; - case OOBIN_ID_PICTURE: getPageSettings().importPicture( getRelations(), rStrm ); break; - case OOBIN_ID_DRAWING: importDrawing( rStrm ); break; + case BIFF12_ID_CHARTSHEETVIEWS: return this; + + case BIFF12_ID_CHARTSHEETPR: getWorksheetSettings().importChartSheetPr( rStrm ); break; + case BIFF12_ID_CHARTPROTECTION: getWorksheetSettings().importChartProtection( rStrm ); break; + case BIFF12_ID_PAGEMARGINS: getPageSettings().importPageMargins( rStrm ); break; + case BIFF12_ID_CHARTPAGESETUP: getPageSettings().importChartPageSetup( getRelations(), rStrm ); break; + case BIFF12_ID_HEADERFOOTER: getPageSettings().importHeaderFooter( rStrm ); break; + case BIFF12_ID_PICTURE: getPageSettings().importPicture( getRelations(), rStrm ); break; + case BIFF12_ID_DRAWING: importDrawing( rStrm ); break; } break; - case OOBIN_ID_CHARTSHEETVIEWS: - if( nRecId == OOBIN_ID_CHARTSHEETVIEW ) getSheetViewSettings().importChartSheetView( rStrm ); + case BIFF12_ID_CHARTSHEETVIEWS: + if( nRecId == BIFF12_ID_CHARTSHEETVIEW ) getSheetViewSettings().importChartSheetView( rStrm ); break; } return 0; } -// oox.core.FragmentHandler2 interface ---------------------------------------- - -const RecordInfo* OoxChartsheetFragment::getRecordInfos() const +const RecordInfo* ChartsheetFragment::getRecordInfos() const { static const RecordInfo spRecInfos[] = { - { OOBIN_ID_CHARTSHEETVIEW, OOBIN_ID_CHARTSHEETVIEW + 1 }, - { OOBIN_ID_CHARTSHEETVIEWS, OOBIN_ID_CHARTSHEETVIEWS + 1 }, - { OOBIN_ID_CUSTOMCHARTVIEW, OOBIN_ID_CUSTOMCHARTVIEW + 1 }, - { OOBIN_ID_CUSTOMCHARTVIEWS, OOBIN_ID_CUSTOMCHARTVIEWS + 1 }, - { OOBIN_ID_HEADERFOOTER, OOBIN_ID_HEADERFOOTER + 1 }, - { OOBIN_ID_WORKSHEET, OOBIN_ID_WORKSHEET + 1 }, + { BIFF12_ID_CHARTSHEETVIEW, BIFF12_ID_CHARTSHEETVIEW + 1 }, + { BIFF12_ID_CHARTSHEETVIEWS, BIFF12_ID_CHARTSHEETVIEWS + 1 }, + { BIFF12_ID_CUSTOMCHARTVIEW, BIFF12_ID_CUSTOMCHARTVIEW + 1 }, + { BIFF12_ID_CUSTOMCHARTVIEWS, BIFF12_ID_CUSTOMCHARTVIEWS + 1 }, + { BIFF12_ID_HEADERFOOTER, BIFF12_ID_HEADERFOOTER + 1 }, + { BIFF12_ID_WORKSHEET, BIFF12_ID_WORKSHEET + 1 }, { -1, -1 } }; return spRecInfos; } -void OoxChartsheetFragment::initializeImport() +void ChartsheetFragment::initializeImport() { // initial processing in base class WorksheetHelper initializeWorksheetImport(); } -void OoxChartsheetFragment::finalizeImport() +void ChartsheetFragment::finalizeImport() { // final processing in base class WorksheetHelper finalizeWorksheetImport(); @@ -169,21 +167,21 @@ void OoxChartsheetFragment::finalizeImport() // private -------------------------------------------------------------------- -void OoxChartsheetFragment::importDrawing( const AttributeList& rAttribs ) +void ChartsheetFragment::importDrawing( const AttributeList& rAttribs ) { setDrawingPath( getFragmentPathFromRelId( rAttribs.getString( R_TOKEN( id ), OUString() ) ) ); } -void OoxChartsheetFragment::importDrawing( RecordInputStream& rStrm ) +void ChartsheetFragment::importDrawing( SequenceInputStream& rStrm ) { - setDrawingPath( getFragmentPathFromRelId( rStrm.readString() ) ); + setDrawingPath( getFragmentPathFromRelId( BiffHelper::readString( rStrm ) ) ); } // ============================================================================ BiffChartsheetFragment::BiffChartsheetFragment( const BiffWorkbookFragmentBase& rParent, - ISegmentProgressBarRef xProgressBar, sal_Int16 nSheet ) : - BiffWorksheetFragmentBase( rParent, xProgressBar, SHEETTYPE_CHARTSHEET, nSheet ) + const ISegmentProgressBarRef& rxProgressBar, sal_Int16 nSheet ) : + BiffWorksheetFragmentBase( rParent, rxProgressBar, SHEETTYPE_CHARTSHEET, nSheet ) { } @@ -197,80 +195,82 @@ bool BiffChartsheetFragment::importFragment() PageSettings& rPageSett = getPageSettings(); // process all record in this sheet fragment - while( mrStrm.startNextRecord() && (mrStrm.getRecId() != BIFF_ID_EOF) ) + BiffInputStream& rStrm = getInputStream(); + while( rStrm.startNextRecord() && (rStrm.getRecId() != BIFF_ID_EOF) ) { - if( isBofRecord() ) + if( BiffHelper::isBofRecord( rStrm ) ) { // skip unknown embedded fragments (BOF/EOF blocks) skipFragment(); } else { - sal_uInt16 nRecId = mrStrm.getRecId(); + sal_uInt16 nRecId = rStrm.getRecId(); switch( nRecId ) { // records in all BIFF versions - case BIFF_ID_BOTTOMMARGIN: rPageSett.importBottomMargin( mrStrm ); break; - case BIFF_ID_CHBEGIN: skipRecordBlock( BIFF_ID_CHEND ); break; - case BIFF_ID_FOOTER: rPageSett.importFooter( mrStrm ); break; - case BIFF_ID_HEADER: rPageSett.importHeader( mrStrm ); break; - case BIFF_ID_LEFTMARGIN: rPageSett.importLeftMargin( mrStrm ); break; - case BIFF_ID_PASSWORD: rWorksheetSett.importPassword( mrStrm ); break; - case BIFF_ID_PROTECT: rWorksheetSett.importProtect( mrStrm ); break; - case BIFF_ID_RIGHTMARGIN: rPageSett.importRightMargin( mrStrm ); break; - case BIFF_ID_TOPMARGIN: rPageSett.importTopMargin( mrStrm ); break; + case BIFF_ID_BOTTOMMARGIN: rPageSett.importBottomMargin( rStrm ); break; + case BIFF_ID_CHBEGIN: BiffHelper::skipRecordBlock( rStrm, BIFF_ID_CHEND ); break; + case BIFF_ID_FOOTER: rPageSett.importFooter( rStrm ); break; + case BIFF_ID_HEADER: rPageSett.importHeader( rStrm ); break; + case BIFF_ID_LEFTMARGIN: rPageSett.importLeftMargin( rStrm ); break; + case BIFF_ID_PASSWORD: rWorksheetSett.importPassword( rStrm ); break; + case BIFF_ID_PROTECT: rWorksheetSett.importProtect( rStrm ); break; + case BIFF_ID_RIGHTMARGIN: rPageSett.importRightMargin( rStrm ); break; + case BIFF_ID_TOPMARGIN: rPageSett.importTopMargin( rStrm ); break; // BIFF specific records default: switch( getBiff() ) { case BIFF2: switch( nRecId ) { - case BIFF2_ID_WINDOW2: rSheetViewSett.importWindow2( mrStrm ); break; + case BIFF2_ID_WINDOW2: rSheetViewSett.importWindow2( rStrm ); break; } break; case BIFF3: switch( nRecId ) { - case BIFF_ID_HCENTER: rPageSett.importHorCenter( mrStrm ); break; - case BIFF_ID_OBJECTPROTECT: rWorksheetSett.importObjectProtect( mrStrm ); break; - case BIFF_ID_VCENTER: rPageSett.importVerCenter( mrStrm ); break; - case BIFF3_ID_WINDOW2: rSheetViewSett.importWindow2( mrStrm ); break; + case BIFF_ID_HCENTER: rPageSett.importHorCenter( rStrm ); break; + case BIFF_ID_OBJECTPROTECT: rWorksheetSett.importObjectProtect( rStrm ); break; + case BIFF_ID_VCENTER: rPageSett.importVerCenter( rStrm ); break; + case BIFF3_ID_WINDOW2: rSheetViewSett.importWindow2( rStrm ); break; } break; case BIFF4: switch( nRecId ) { - case BIFF_ID_HCENTER: rPageSett.importHorCenter( mrStrm ); break; - case BIFF_ID_OBJECTPROTECT: rWorksheetSett.importObjectProtect( mrStrm ); break; - case BIFF_ID_PAGESETUP: rPageSett.importPageSetup( mrStrm ); break; - case BIFF_ID_VCENTER: rPageSett.importVerCenter( mrStrm ); break; - case BIFF3_ID_WINDOW2: rSheetViewSett.importWindow2( mrStrm ); break; + case BIFF_ID_HCENTER: rPageSett.importHorCenter( rStrm ); break; + case BIFF_ID_OBJECTPROTECT: rWorksheetSett.importObjectProtect( rStrm ); break; + case BIFF_ID_PAGESETUP: rPageSett.importPageSetup( rStrm ); break; + case BIFF_ID_VCENTER: rPageSett.importVerCenter( rStrm ); break; + case BIFF3_ID_WINDOW2: rSheetViewSett.importWindow2( rStrm ); break; } break; case BIFF5: switch( nRecId ) { - case BIFF_ID_HCENTER: rPageSett.importHorCenter( mrStrm ); break; - case BIFF_ID_OBJECTPROTECT: rWorksheetSett.importObjectProtect( mrStrm ); break; - case BIFF_ID_PAGESETUP: rPageSett.importPageSetup( mrStrm ); break; - case BIFF_ID_SCENPROTECT: rWorksheetSett.importScenProtect( mrStrm ); break; - case BIFF_ID_SCL: rSheetViewSett.importScl( mrStrm ); break; - case BIFF_ID_VCENTER: rPageSett.importVerCenter( mrStrm ); break; - case BIFF3_ID_WINDOW2: rSheetViewSett.importWindow2( mrStrm ); break; + case BIFF_ID_HCENTER: rPageSett.importHorCenter( rStrm ); break; + case BIFF_ID_OBJECTPROTECT: rWorksheetSett.importObjectProtect( rStrm ); break; + case BIFF_ID_PAGESETUP: rPageSett.importPageSetup( rStrm ); break; + case BIFF_ID_SCENPROTECT: rWorksheetSett.importScenProtect( rStrm ); break; + case BIFF_ID_SCL: rSheetViewSett.importScl( rStrm ); break; + case BIFF_ID_VCENTER: rPageSett.importVerCenter( rStrm ); break; + case BIFF3_ID_WINDOW2: rSheetViewSett.importWindow2( rStrm ); break; } break; case BIFF8: switch( nRecId ) { - case BIFF_ID_CODENAME: rWorksheetSett.importCodeName( mrStrm ); break; - case BIFF_ID_HCENTER: rPageSett.importHorCenter( mrStrm ); break; - case BIFF_ID_OBJECTPROTECT: rWorksheetSett.importObjectProtect( mrStrm ); break; - case BIFF_ID_PICTURE: rPageSett.importPicture( mrStrm ); break; - case BIFF_ID_PAGESETUP: rPageSett.importPageSetup( mrStrm ); break; - case BIFF_ID_SCL: rSheetViewSett.importScl( mrStrm ); break; - case BIFF_ID_VCENTER: rPageSett.importVerCenter( mrStrm ); break; - case BIFF3_ID_WINDOW2: rSheetViewSett.importWindow2( mrStrm ); break; + case BIFF_ID_CODENAME: rWorksheetSett.importCodeName( rStrm ); break; + case BIFF_ID_HCENTER: rPageSett.importHorCenter( rStrm ); break; + case BIFF_ID_OBJECTPROTECT: rWorksheetSett.importObjectProtect( rStrm ); break; + case BIFF_ID_PICTURE: rPageSett.importPicture( rStrm ); break; + case BIFF_ID_PAGESETUP: rPageSett.importPageSetup( rStrm ); break; + case BIFF_ID_SCL: rSheetViewSett.importScl( rStrm ); break; + case BIFF_ID_SHEETEXT: rWorksheetSett.importSheetExt( rStrm ); break; + case BIFF_ID_VCENTER: rPageSett.importVerCenter( rStrm ); break; + case BIFF3_ID_WINDOW2: rSheetViewSett.importWindow2( rStrm ); break; } break; @@ -282,11 +282,10 @@ bool BiffChartsheetFragment::importFragment() // final processing in base class WorksheetHelper finalizeWorksheetImport(); - return mrStrm.getRecId() == BIFF_ID_EOF; + return rStrm.getRecId() == BIFF_ID_EOF; } // ============================================================================ } // namespace xls } // namespace oox - diff --git a/oox/source/xls/commentsbuffer.cxx b/oox/source/xls/commentsbuffer.cxx index 190309649789..78d5fe044fe8 100644 --- a/oox/source/xls/commentsbuffer.cxx +++ b/oox/source/xls/commentsbuffer.cxx @@ -26,34 +26,30 @@ ************************************************************************/ #include "oox/xls/commentsbuffer.hxx" + #include <com/sun/star/sheet/XSheetAnnotationAnchor.hpp> #include <com/sun/star/sheet/XSheetAnnotationShapeSupplier.hpp> #include <com/sun/star/sheet/XSheetAnnotations.hpp> #include <com/sun/star/sheet/XSheetAnnotationsSupplier.hpp> #include "oox/helper/attributelist.hxx" -#include "oox/helper/recordinputstream.hxx" #include "oox/vml/vmlshape.hxx" #include "oox/xls/addressconverter.hxx" #include "oox/xls/drawingfragment.hxx" -using ::rtl::OUString; -using ::com::sun::star::uno::Reference; -using ::com::sun::star::uno::Exception; -using ::com::sun::star::uno::UNO_QUERY_THROW; -using ::com::sun::star::uno::UNO_SET_THROW; -using ::com::sun::star::drawing::XShape; -using ::com::sun::star::table::CellAddress; -using ::com::sun::star::sheet::XSheetAnnotation; -using ::com::sun::star::sheet::XSheetAnnotationAnchor; -using ::com::sun::star::sheet::XSheetAnnotationShapeSupplier; -using ::com::sun::star::sheet::XSheetAnnotations; -using ::com::sun::star::sheet::XSheetAnnotationsSupplier; - namespace oox { namespace xls { // ============================================================================ +using namespace ::com::sun::star::drawing; +using namespace ::com::sun::star::sheet; +using namespace ::com::sun::star::table; +using namespace ::com::sun::star::uno; + +using ::rtl::OUString; + +// ============================================================================ + CommentModel::CommentModel() : mnAuthorId( -1 ) { @@ -73,7 +69,7 @@ void Comment::importComment( const AttributeList& rAttribs ) getAddressConverter().convertToCellRangeUnchecked( maModel.maRange, rAttribs.getString( XML_ref, OUString() ), getSheetIndex() ); } -void Comment::importComment( RecordInputStream& rStrm ) +void Comment::importComment( SequenceInputStream& rStrm ) { BinRange aBinRange; rStrm >> maModel.mnAuthorId >> aBinRange; @@ -89,7 +85,7 @@ RichStringRef Comment::createText() void Comment::finalizeImport() { - // OOBIN format stores cell range instead of cell address, use first cell of this range + // BIFF12 stores cell range instead of cell address, use first cell of this range OSL_ENSURE( (maModel.maRange.StartColumn == maModel.maRange.EndColumn) && (maModel.maRange.StartRow == maModel.maRange.EndRow), "Comment::finalizeImport - comment anchor should be a single cell" ); @@ -115,9 +111,8 @@ void Comment::finalizeImport() // position and formatting pNoteShape->convertFormatting( xAnnoShape ); // visibility - const ::oox::vml::ShapeModel::ShapeClientDataPtr& rxClientData = pNoteShape->getShapeModel().mxClientData; - bool bVisible = rxClientData.get() && rxClientData->mbVisible; - xAnno->setIsVisible( bVisible ); + const ::oox::vml::ClientData* pClientData = pNoteShape->getClientData(); + xAnno->setIsVisible( pClientData && pClientData->mbVisible ); } } } @@ -154,4 +149,3 @@ void CommentsBuffer::finalizeImport() } // namespace xls } // namespace oox - diff --git a/oox/source/xls/commentsfragment.cxx b/oox/source/xls/commentsfragment.cxx index c87d3028b7cb..b37860c4553e 100644 --- a/oox/source/xls/commentsfragment.cxx +++ b/oox/source/xls/commentsfragment.cxx @@ -26,25 +26,26 @@ ************************************************************************/ #include "oox/xls/commentsfragment.hxx" -#include "oox/xls/richstringcontext.hxx" -using ::rtl::OUString; -using ::oox::core::ContextHandlerRef; -using ::oox::core::RecordInfo; +#include "oox/xls/richstringcontext.hxx" namespace oox { namespace xls { // ============================================================================ -OoxCommentsFragment::OoxCommentsFragment( const WorksheetHelper& rHelper, const OUString& rFragmentPath ) : - OoxWorksheetFragmentBase( rHelper, rFragmentPath ) +using namespace ::oox::core; + +using ::rtl::OUString; + +// ============================================================================ + +CommentsFragment::CommentsFragment( const WorksheetHelper& rHelper, const OUString& rFragmentPath ) : + WorksheetFragmentBase( rHelper, rFragmentPath ) { } -// oox.core.ContextHandler2Helper interface ----------------------------------- - -ContextHandlerRef OoxCommentsFragment::onCreateContext( sal_Int32 nElement, const AttributeList& rAttribs ) +ContextHandlerRef CommentsFragment::onCreateContext( sal_Int32 nElement, const AttributeList& rAttribs ) { switch( getCurrentElement() ) { @@ -56,91 +57,84 @@ ContextHandlerRef OoxCommentsFragment::onCreateContext( sal_Int32 nElement, cons if( nElement == XLS_TOKEN( commentList ) ) return this; break; case XLS_TOKEN( authors ): - if( nElement == XLS_TOKEN( author ) ) return this; // collect author in onEndElement() + if( nElement == XLS_TOKEN( author ) ) return this; // collect author in onCharacters() break; case XLS_TOKEN( commentList ): if( nElement == XLS_TOKEN( comment ) ) { importComment( rAttribs ); return this; } break; case XLS_TOKEN( comment ): if( (nElement == XLS_TOKEN( text )) && mxComment.get() ) - return new OoxRichStringContext( *this, mxComment->createText() ); + return new RichStringContext( *this, mxComment->createText() ); break; } return 0; } -void OoxCommentsFragment::onEndElement( const OUString& rChars ) +void CommentsFragment::onCharacters( const OUString& rChars ) { - switch( getCurrentElement() ) - { - case XLS_TOKEN( author ): - getComments().appendAuthor( rChars ); - break; - case XLS_TOKEN( comment ): - mxComment.reset(); - break; - } + if( isCurrentElement( XLS_TOKEN( author ) ) ) + getComments().appendAuthor( rChars ); +} + +void CommentsFragment::onEndElement() +{ + if( isCurrentElement( XLS_TOKEN( comment ) ) ) + mxComment.reset(); } -ContextHandlerRef OoxCommentsFragment::onCreateRecordContext( sal_Int32 nRecId, RecordInputStream& rStrm ) +ContextHandlerRef CommentsFragment::onCreateRecordContext( sal_Int32 nRecId, SequenceInputStream& rStrm ) { switch( getCurrentElement() ) { case XML_ROOT_CONTEXT: - if( nRecId == OOBIN_ID_COMMENTS ) return this; + if( nRecId == BIFF12_ID_COMMENTS ) return this; break; - case OOBIN_ID_COMMENTS: - if( nRecId == OOBIN_ID_COMMENTAUTHORS ) return this; - if( nRecId == OOBIN_ID_COMMENTLIST ) return this; + case BIFF12_ID_COMMENTS: + if( nRecId == BIFF12_ID_COMMENTAUTHORS ) return this; + if( nRecId == BIFF12_ID_COMMENTLIST ) return this; break; - case OOBIN_ID_COMMENTAUTHORS: - if( nRecId == OOBIN_ID_COMMENTAUTHOR ) getComments().appendAuthor( rStrm.readString() ); + case BIFF12_ID_COMMENTAUTHORS: + if( nRecId == BIFF12_ID_COMMENTAUTHOR ) getComments().appendAuthor( BiffHelper::readString( rStrm ) ); break; - case OOBIN_ID_COMMENTLIST: - if( nRecId == OOBIN_ID_COMMENT ) { importComment( rStrm ); return this; } + case BIFF12_ID_COMMENTLIST: + if( nRecId == BIFF12_ID_COMMENT ) { importComment( rStrm ); return this; } break; - case OOBIN_ID_COMMENT: - if( (nRecId == OOBIN_ID_COMMENTTEXT) && mxComment.get() ) + case BIFF12_ID_COMMENT: + if( (nRecId == BIFF12_ID_COMMENTTEXT) && mxComment.get() ) mxComment->createText()->importString( rStrm, true ); break; } return 0; } -void OoxCommentsFragment::onEndRecord() +void CommentsFragment::onEndRecord() { - switch( getCurrentElement() ) - { - case OOBIN_ID_COMMENT: - mxComment.reset(); - break; - } + if( isCurrentElement( BIFF12_ID_COMMENT ) ) + mxComment.reset(); } -// oox.core.FragmentHandler2 interface ---------------------------------------- - -const RecordInfo* OoxCommentsFragment::getRecordInfos() const +const RecordInfo* CommentsFragment::getRecordInfos() const { static const RecordInfo spRecInfos[] = { - { OOBIN_ID_COMMENT, OOBIN_ID_COMMENT + 1 }, - { OOBIN_ID_COMMENTAUTHORS, OOBIN_ID_COMMENTAUTHORS + 1 }, - { OOBIN_ID_COMMENTLIST, OOBIN_ID_COMMENTLIST + 1 }, - { OOBIN_ID_COMMENTS, OOBIN_ID_COMMENTS + 1 }, - { -1, -1 } + { BIFF12_ID_COMMENT, BIFF12_ID_COMMENT + 1 }, + { BIFF12_ID_COMMENTAUTHORS, BIFF12_ID_COMMENTAUTHORS + 1 }, + { BIFF12_ID_COMMENTLIST, BIFF12_ID_COMMENTLIST + 1 }, + { BIFF12_ID_COMMENTS, BIFF12_ID_COMMENTS + 1 }, + { -1, -1 } }; return spRecInfos; } // private -------------------------------------------------------------------- -void OoxCommentsFragment::importComment( const AttributeList& rAttribs ) +void CommentsFragment::importComment( const AttributeList& rAttribs ) { mxComment = getComments().createComment(); mxComment->importComment( rAttribs ); } -void OoxCommentsFragment::importComment( RecordInputStream& rStrm ) +void CommentsFragment::importComment( SequenceInputStream& rStrm ) { mxComment = getComments().createComment(); mxComment->importComment( rStrm ); @@ -150,4 +144,3 @@ void OoxCommentsFragment::importComment( RecordInputStream& rStrm ) } // namespace xls } // namespace oox - diff --git a/oox/source/xls/condformatbuffer.cxx b/oox/source/xls/condformatbuffer.cxx index 317476f25635..51d9170e1794 100644 --- a/oox/source/xls/condformatbuffer.cxx +++ b/oox/source/xls/condformatbuffer.cxx @@ -26,109 +26,98 @@ ************************************************************************/ #include "oox/xls/condformatbuffer.hxx" -#include <rtl/ustrbuf.hxx> + #include <com/sun/star/beans/PropertyValue.hpp> #include <com/sun/star/container/XIndexAccess.hpp> #include <com/sun/star/container/XNameContainer.hpp> -#include <com/sun/star/table/CellAddress.hpp> -#include <com/sun/star/table/CellRangeAddress.hpp> -#include <com/sun/star/table/XCellRange.hpp> #include <com/sun/star/sheet/ConditionOperator.hpp> +#include <com/sun/star/sheet/XSheetCellRanges.hpp> #include <com/sun/star/sheet/XSheetConditionalEntries.hpp> +#include <com/sun/star/sheet/XSpreadsheet.hpp> #include <com/sun/star/sheet/XSpreadsheetDocument.hpp> #include <com/sun/star/sheet/XSpreadsheets.hpp> -#include <com/sun/star/sheet/XSpreadsheet.hpp> #include <com/sun/star/style/XStyle.hpp> #include <com/sun/star/style/XStyleFamiliesSupplier.hpp> -#include "properties.hxx" +#include <com/sun/star/table/CellAddress.hpp> +#include <com/sun/star/table/CellRangeAddress.hpp> +#include <com/sun/star/table/XCellRange.hpp> +#include <rtl/ustrbuf.hxx> #include "oox/helper/attributelist.hxx" +#include "oox/helper/containerhelper.hxx" #include "oox/helper/propertyset.hxx" -#include "oox/helper/recordinputstream.hxx" #include "oox/xls/addressconverter.hxx" #include "oox/xls/biffinputstream.hxx" #include "oox/xls/stylesbuffer.hxx" -using ::rtl::OUString; -using ::rtl::OUStringBuffer; -using ::com::sun::star::uno::Any; -using ::com::sun::star::uno::Reference; -using ::com::sun::star::uno::Sequence; -using ::com::sun::star::uno::Exception; -using ::com::sun::star::uno::UNO_QUERY; -using ::com::sun::star::uno::UNO_QUERY_THROW; -using ::com::sun::star::beans::PropertyValue; -using ::com::sun::star::style::XStyleFamiliesSupplier; -using ::com::sun::star::container::XNameAccess; -using ::com::sun::star::container::XIndexAccess; -using ::com::sun::star::container::XNameContainer; -using ::com::sun::star::table::CellAddress; -using ::com::sun::star::table::CellRangeAddress; -using ::com::sun::star::sheet::ConditionOperator; -using ::com::sun::star::table::XCellRange; -using ::com::sun::star::sheet::XSheetCellRanges; -using ::com::sun::star::sheet::XSheetConditionalEntries; -using ::com::sun::star::sheet::XSpreadsheetDocument; -using ::com::sun::star::sheet::XSpreadsheets; -using ::com::sun::star::sheet::XSpreadsheet; -using ::com::sun::star::style::XStyle; - namespace oox { namespace xls { // ============================================================================ +using namespace ::com::sun::star::beans; +using namespace ::com::sun::star::container; +using namespace ::com::sun::star::sheet; +using namespace ::com::sun::star::style; +using namespace ::com::sun::star::table; +using namespace ::com::sun::star::uno; + +using ::rtl::OUString; +using ::rtl::OUStringBuffer; + +// ============================================================================ + namespace { -const sal_Int32 OOBIN_CFRULE_TYPE_CELLIS = 1; -const sal_Int32 OOBIN_CFRULE_TYPE_EXPRESSION = 2; -const sal_Int32 OOBIN_CFRULE_TYPE_COLORSCALE = 3; -const sal_Int32 OOBIN_CFRULE_TYPE_DATABAR = 4; -const sal_Int32 OOBIN_CFRULE_TYPE_TOPTEN = 5; -const sal_Int32 OOBIN_CFRULE_TYPE_ICONSET = 6; - -const sal_Int32 OOBIN_CFRULE_SUB_CELLIS = 0; -const sal_Int32 OOBIN_CFRULE_SUB_EXPRESSION = 1; -const sal_Int32 OOBIN_CFRULE_SUB_COLORSCALE = 2; -const sal_Int32 OOBIN_CFRULE_SUB_DATABAR = 3; -const sal_Int32 OOBIN_CFRULE_SUB_ICONSET = 4; -const sal_Int32 OOBIN_CFRULE_SUB_TOPTEN = 5; -const sal_Int32 OOBIN_CFRULE_SUB_UNIQUE = 7; -const sal_Int32 OOBIN_CFRULE_SUB_TEXT = 8; -const sal_Int32 OOBIN_CFRULE_SUB_BLANK = 9; -const sal_Int32 OOBIN_CFRULE_SUB_NOTBLANK = 10; -const sal_Int32 OOBIN_CFRULE_SUB_ERROR = 11; -const sal_Int32 OOBIN_CFRULE_SUB_NOTERROR = 12; -const sal_Int32 OOBIN_CFRULE_SUB_TODAY = 15; -const sal_Int32 OOBIN_CFRULE_SUB_TOMORROW = 16; -const sal_Int32 OOBIN_CFRULE_SUB_YESTERDAY = 17; -const sal_Int32 OOBIN_CFRULE_SUB_LAST7DAYS = 18; -const sal_Int32 OOBIN_CFRULE_SUB_LASTMONTH = 19; -const sal_Int32 OOBIN_CFRULE_SUB_NEXTMONTH = 20; -const sal_Int32 OOBIN_CFRULE_SUB_THISWEEK = 21; -const sal_Int32 OOBIN_CFRULE_SUB_NEXTWEEK = 22; -const sal_Int32 OOBIN_CFRULE_SUB_LASTWEEK = 23; -const sal_Int32 OOBIN_CFRULE_SUB_THISMONTH = 24; -const sal_Int32 OOBIN_CFRULE_SUB_ABOVEAVERAGE = 25; -const sal_Int32 OOBIN_CFRULE_SUB_BELOWAVERAGE = 26; -const sal_Int32 OOBIN_CFRULE_SUB_DUPLICATE = 27; -const sal_Int32 OOBIN_CFRULE_SUB_EQABOVEAVERAGE = 29; -const sal_Int32 OOBIN_CFRULE_SUB_EQBELOWAVERAGE = 30; - -const sal_Int32 OOBIN_CFRULE_TIMEOP_TODAY = 0; -const sal_Int32 OOBIN_CFRULE_TIMEOP_YESTERDAY = 1; -const sal_Int32 OOBIN_CFRULE_TIMEOP_LAST7DAYS = 2; -const sal_Int32 OOBIN_CFRULE_TIMEOP_THISWEEK = 3; -const sal_Int32 OOBIN_CFRULE_TIMEOP_LASTWEEK = 4; -const sal_Int32 OOBIN_CFRULE_TIMEOP_LASTMONTH = 5; -const sal_Int32 OOBIN_CFRULE_TIMEOP_TOMORROW = 6; -const sal_Int32 OOBIN_CFRULE_TIMEOP_NEXTWEEK = 7; -const sal_Int32 OOBIN_CFRULE_TIMEOP_NEXTMONTH = 8; -const sal_Int32 OOBIN_CFRULE_TIMEOP_THISMONTH = 9; - -const sal_uInt16 OOBIN_CFRULE_STOPIFTRUE = 0x0002; -const sal_uInt16 OOBIN_CFRULE_ABOVEAVERAGE = 0x0004; -const sal_uInt16 OOBIN_CFRULE_BOTTOM = 0x0008; -const sal_uInt16 OOBIN_CFRULE_PERCENT = 0x0010; +const sal_Int32 BIFF12_CFRULE_TYPE_CELLIS = 1; +const sal_Int32 BIFF12_CFRULE_TYPE_EXPRESSION = 2; +const sal_Int32 BIFF12_CFRULE_TYPE_COLORSCALE = 3; +const sal_Int32 BIFF12_CFRULE_TYPE_DATABAR = 4; +const sal_Int32 BIFF12_CFRULE_TYPE_TOPTEN = 5; +const sal_Int32 BIFF12_CFRULE_TYPE_ICONSET = 6; + +const sal_Int32 BIFF12_CFRULE_SUB_CELLIS = 0; +const sal_Int32 BIFF12_CFRULE_SUB_EXPRESSION = 1; +const sal_Int32 BIFF12_CFRULE_SUB_COLORSCALE = 2; +const sal_Int32 BIFF12_CFRULE_SUB_DATABAR = 3; +const sal_Int32 BIFF12_CFRULE_SUB_ICONSET = 4; +const sal_Int32 BIFF12_CFRULE_SUB_TOPTEN = 5; +const sal_Int32 BIFF12_CFRULE_SUB_UNIQUE = 7; +const sal_Int32 BIFF12_CFRULE_SUB_TEXT = 8; +const sal_Int32 BIFF12_CFRULE_SUB_BLANK = 9; +const sal_Int32 BIFF12_CFRULE_SUB_NOTBLANK = 10; +const sal_Int32 BIFF12_CFRULE_SUB_ERROR = 11; +const sal_Int32 BIFF12_CFRULE_SUB_NOTERROR = 12; +const sal_Int32 BIFF12_CFRULE_SUB_TODAY = 15; +const sal_Int32 BIFF12_CFRULE_SUB_TOMORROW = 16; +const sal_Int32 BIFF12_CFRULE_SUB_YESTERDAY = 17; +const sal_Int32 BIFF12_CFRULE_SUB_LAST7DAYS = 18; +const sal_Int32 BIFF12_CFRULE_SUB_LASTMONTH = 19; +const sal_Int32 BIFF12_CFRULE_SUB_NEXTMONTH = 20; +const sal_Int32 BIFF12_CFRULE_SUB_THISWEEK = 21; +const sal_Int32 BIFF12_CFRULE_SUB_NEXTWEEK = 22; +const sal_Int32 BIFF12_CFRULE_SUB_LASTWEEK = 23; +const sal_Int32 BIFF12_CFRULE_SUB_THISMONTH = 24; +const sal_Int32 BIFF12_CFRULE_SUB_ABOVEAVERAGE = 25; +const sal_Int32 BIFF12_CFRULE_SUB_BELOWAVERAGE = 26; +const sal_Int32 BIFF12_CFRULE_SUB_DUPLICATE = 27; +const sal_Int32 BIFF12_CFRULE_SUB_EQABOVEAVERAGE = 29; +const sal_Int32 BIFF12_CFRULE_SUB_EQBELOWAVERAGE = 30; + +const sal_Int32 BIFF12_CFRULE_TIMEOP_TODAY = 0; +const sal_Int32 BIFF12_CFRULE_TIMEOP_YESTERDAY = 1; +const sal_Int32 BIFF12_CFRULE_TIMEOP_LAST7DAYS = 2; +const sal_Int32 BIFF12_CFRULE_TIMEOP_THISWEEK = 3; +const sal_Int32 BIFF12_CFRULE_TIMEOP_LASTWEEK = 4; +const sal_Int32 BIFF12_CFRULE_TIMEOP_LASTMONTH = 5; +const sal_Int32 BIFF12_CFRULE_TIMEOP_TOMORROW = 6; +const sal_Int32 BIFF12_CFRULE_TIMEOP_NEXTWEEK = 7; +const sal_Int32 BIFF12_CFRULE_TIMEOP_NEXTMONTH = 8; +const sal_Int32 BIFF12_CFRULE_TIMEOP_THISMONTH = 9; + +const sal_uInt16 BIFF12_CFRULE_STOPIFTRUE = 0x0002; +const sal_uInt16 BIFF12_CFRULE_ABOVEAVERAGE = 0x0004; +const sal_uInt16 BIFF12_CFRULE_BOTTOM = 0x0008; +const sal_uInt16 BIFF12_CFRULE_PERCENT = 0x0010; // ---------------------------------------------------------------------------- @@ -160,7 +149,7 @@ CondFormatRuleModel::CondFormatRuleModel() : { } -void CondFormatRuleModel::setBinOperator( sal_Int32 nOperator ) +void CondFormatRuleModel::setBiffOperator( sal_Int32 nOperator ) { static const sal_Int32 spnOperators[] = { XML_TOKEN_INVALID, XML_between, XML_notBetween, XML_equal, XML_notEqual, @@ -168,7 +157,7 @@ void CondFormatRuleModel::setBinOperator( sal_Int32 nOperator ) mnOperator = STATIC_ARRAY_SELECT( spnOperators, nOperator, XML_TOKEN_INVALID ); } -void CondFormatRuleModel::setOobTextType( sal_Int32 nOperator ) +void CondFormatRuleModel::setBiff12TextType( sal_Int32 nOperator ) { // note: type XML_notContainsText vs. operator XML_notContains static const sal_Int32 spnTypes[] = { XML_containsText, XML_notContainsText, XML_beginsWith, XML_endsWith }; @@ -210,7 +199,7 @@ void CondFormatRule::appendFormula( const OUString& rFormula ) maModel.maFormulas.push_back( aContext ); } -void CondFormatRule::importCfRule( RecordInputStream& rStrm ) +void CondFormatRule::importCfRule( SequenceInputStream& rStrm ) { sal_Int32 nType, nSubType, nOperator, nFmla1Size, nFmla2Size, nFmla3Size; sal_uInt16 nFlags; @@ -251,129 +240,129 @@ void CondFormatRule::importCfRule( RecordInputStream& rStrm ) } // flags - maModel.mbStopIfTrue = getFlag( nFlags, OOBIN_CFRULE_STOPIFTRUE ); - maModel.mbBottom = getFlag( nFlags, OOBIN_CFRULE_BOTTOM ); - maModel.mbPercent = getFlag( nFlags, OOBIN_CFRULE_PERCENT ); - maModel.mbAboveAverage = getFlag( nFlags, OOBIN_CFRULE_ABOVEAVERAGE ); + maModel.mbStopIfTrue = getFlag( nFlags, BIFF12_CFRULE_STOPIFTRUE ); + maModel.mbBottom = getFlag( nFlags, BIFF12_CFRULE_BOTTOM ); + maModel.mbPercent = getFlag( nFlags, BIFF12_CFRULE_PERCENT ); + maModel.mbAboveAverage = getFlag( nFlags, BIFF12_CFRULE_ABOVEAVERAGE ); // no flag for equalAverage, must be determined from subtype below... // Convert the type/operator settings. This is a real mess... switch( nType ) { - case OOBIN_CFRULE_TYPE_CELLIS: - OSL_ENSURE( nSubType == OOBIN_CFRULE_SUB_CELLIS, "CondFormatRule::importCfRule - rule type/subtype mismatch" ); + case BIFF12_CFRULE_TYPE_CELLIS: + OSL_ENSURE( nSubType == BIFF12_CFRULE_SUB_CELLIS, "CondFormatRule::importCfRule - rule type/subtype mismatch" ); maModel.mnType = XML_cellIs; - maModel.setBinOperator( nOperator ); + maModel.setBiffOperator( nOperator ); OSL_ENSURE( maModel.mnOperator != XML_TOKEN_INVALID, "CondFormatRule::importCfRule - unknown operator" ); break; - case OOBIN_CFRULE_TYPE_EXPRESSION: + case BIFF12_CFRULE_TYPE_EXPRESSION: // here we have to look at the subtype to find the real type... switch( nSubType ) { - case OOBIN_CFRULE_SUB_EXPRESSION: + case BIFF12_CFRULE_SUB_EXPRESSION: OSL_ENSURE( nOperator == 0, "CondFormatRule::importCfRule - unexpected operator value" ); maModel.mnType = XML_expression; break; - case OOBIN_CFRULE_SUB_UNIQUE: + case BIFF12_CFRULE_SUB_UNIQUE: OSL_ENSURE( nOperator == 0, "CondFormatRule::importCfRule - unexpected operator value" ); maModel.mnType = XML_uniqueValues; break; - case OOBIN_CFRULE_SUB_TEXT: - maModel.setOobTextType( nOperator ); + case BIFF12_CFRULE_SUB_TEXT: + maModel.setBiff12TextType( nOperator ); OSL_ENSURE( maModel.mnType != XML_TOKEN_INVALID, "CondFormatRule::importCfRule - unexpected operator value" ); break; - case OOBIN_CFRULE_SUB_BLANK: + case BIFF12_CFRULE_SUB_BLANK: OSL_ENSURE( nOperator == 0, "CondFormatRule::importCfRule - unexpected operator value" ); maModel.mnType = XML_containsBlanks; break; - case OOBIN_CFRULE_SUB_NOTBLANK: + case BIFF12_CFRULE_SUB_NOTBLANK: OSL_ENSURE( nOperator == 0, "CondFormatRule::importCfRule - unexpected operator value" ); maModel.mnType = XML_notContainsBlanks; break; - case OOBIN_CFRULE_SUB_ERROR: + case BIFF12_CFRULE_SUB_ERROR: OSL_ENSURE( nOperator == 0, "CondFormatRule::importCfRule - unexpected operator value" ); maModel.mnType = XML_containsErrors; break; - case OOBIN_CFRULE_SUB_NOTERROR: + case BIFF12_CFRULE_SUB_NOTERROR: OSL_ENSURE( nOperator == 0, "CondFormatRule::importCfRule - unexpected operator value" ); maModel.mnType = XML_notContainsErrors; break; - case OOBIN_CFRULE_SUB_TODAY: - OSL_ENSURE( nOperator == OOBIN_CFRULE_TIMEOP_TODAY, "CondFormatRule::importCfRule - unexpected time operator value" ); + case BIFF12_CFRULE_SUB_TODAY: + OSL_ENSURE( nOperator == BIFF12_CFRULE_TIMEOP_TODAY, "CondFormatRule::importCfRule - unexpected time operator value" ); maModel.mnType = XML_timePeriod; maModel.mnTimePeriod = XML_today; break; - case OOBIN_CFRULE_SUB_TOMORROW: - OSL_ENSURE( nOperator == OOBIN_CFRULE_TIMEOP_TOMORROW, "CondFormatRule::importCfRule - unexpected time operator value" ); + case BIFF12_CFRULE_SUB_TOMORROW: + OSL_ENSURE( nOperator == BIFF12_CFRULE_TIMEOP_TOMORROW, "CondFormatRule::importCfRule - unexpected time operator value" ); maModel.mnType = XML_timePeriod; maModel.mnTimePeriod = XML_tomorrow; break; - case OOBIN_CFRULE_SUB_YESTERDAY: - OSL_ENSURE( nOperator == OOBIN_CFRULE_TIMEOP_YESTERDAY, "CondFormatRule::importCfRule - unexpected time operator value" ); + case BIFF12_CFRULE_SUB_YESTERDAY: + OSL_ENSURE( nOperator == BIFF12_CFRULE_TIMEOP_YESTERDAY, "CondFormatRule::importCfRule - unexpected time operator value" ); maModel.mnType = XML_timePeriod; maModel.mnTimePeriod = XML_yesterday; break; - case OOBIN_CFRULE_SUB_LAST7DAYS: - OSL_ENSURE( nOperator == OOBIN_CFRULE_TIMEOP_LAST7DAYS, "CondFormatRule::importCfRule - unexpected time operator value" ); + case BIFF12_CFRULE_SUB_LAST7DAYS: + OSL_ENSURE( nOperator == BIFF12_CFRULE_TIMEOP_LAST7DAYS, "CondFormatRule::importCfRule - unexpected time operator value" ); maModel.mnType = XML_timePeriod; maModel.mnTimePeriod = XML_last7Days; break; - case OOBIN_CFRULE_SUB_LASTMONTH: - OSL_ENSURE( nOperator == OOBIN_CFRULE_TIMEOP_LASTMONTH, "CondFormatRule::importCfRule - unexpected time operator value" ); + case BIFF12_CFRULE_SUB_LASTMONTH: + OSL_ENSURE( nOperator == BIFF12_CFRULE_TIMEOP_LASTMONTH, "CondFormatRule::importCfRule - unexpected time operator value" ); maModel.mnType = XML_timePeriod; maModel.mnTimePeriod = XML_lastMonth; break; - case OOBIN_CFRULE_SUB_NEXTMONTH: - OSL_ENSURE( nOperator == OOBIN_CFRULE_TIMEOP_NEXTMONTH, "CondFormatRule::importCfRule - unexpected time operator value" ); + case BIFF12_CFRULE_SUB_NEXTMONTH: + OSL_ENSURE( nOperator == BIFF12_CFRULE_TIMEOP_NEXTMONTH, "CondFormatRule::importCfRule - unexpected time operator value" ); maModel.mnType = XML_timePeriod; maModel.mnTimePeriod = XML_nextMonth; break; - case OOBIN_CFRULE_SUB_THISWEEK: - OSL_ENSURE( nOperator == OOBIN_CFRULE_TIMEOP_THISWEEK, "CondFormatRule::importCfRule - unexpected time operator value" ); + case BIFF12_CFRULE_SUB_THISWEEK: + OSL_ENSURE( nOperator == BIFF12_CFRULE_TIMEOP_THISWEEK, "CondFormatRule::importCfRule - unexpected time operator value" ); maModel.mnType = XML_timePeriod; maModel.mnTimePeriod = XML_thisWeek; break; - case OOBIN_CFRULE_SUB_NEXTWEEK: - OSL_ENSURE( nOperator == OOBIN_CFRULE_TIMEOP_NEXTWEEK, "CondFormatRule::importCfRule - unexpected time operator value" ); + case BIFF12_CFRULE_SUB_NEXTWEEK: + OSL_ENSURE( nOperator == BIFF12_CFRULE_TIMEOP_NEXTWEEK, "CondFormatRule::importCfRule - unexpected time operator value" ); maModel.mnType = XML_timePeriod; maModel.mnTimePeriod = XML_nextWeek; break; - case OOBIN_CFRULE_SUB_LASTWEEK: - OSL_ENSURE( nOperator == OOBIN_CFRULE_TIMEOP_LASTWEEK, "CondFormatRule::importCfRule - unexpected time operator value" ); + case BIFF12_CFRULE_SUB_LASTWEEK: + OSL_ENSURE( nOperator == BIFF12_CFRULE_TIMEOP_LASTWEEK, "CondFormatRule::importCfRule - unexpected time operator value" ); maModel.mnType = XML_timePeriod; maModel.mnTimePeriod = XML_lastWeek; break; - case OOBIN_CFRULE_SUB_THISMONTH: - OSL_ENSURE( nOperator == OOBIN_CFRULE_TIMEOP_THISMONTH, "CondFormatRule::importCfRule - unexpected time operator value" ); + case BIFF12_CFRULE_SUB_THISMONTH: + OSL_ENSURE( nOperator == BIFF12_CFRULE_TIMEOP_THISMONTH, "CondFormatRule::importCfRule - unexpected time operator value" ); maModel.mnType = XML_timePeriod; maModel.mnTimePeriod = XML_thisMonth; break; - case OOBIN_CFRULE_SUB_ABOVEAVERAGE: + case BIFF12_CFRULE_SUB_ABOVEAVERAGE: OSL_ENSURE( maModel.mbAboveAverage, "CondFormatRule::importCfRule - wrong above-average flag" ); maModel.mnType = XML_aboveAverage; maModel.mnStdDev = nOperator; // operator field used for standard deviation maModel.mbAboveAverage = true; maModel.mbEqualAverage = false; // does not exist as real flag... break; - case OOBIN_CFRULE_SUB_BELOWAVERAGE: + case BIFF12_CFRULE_SUB_BELOWAVERAGE: OSL_ENSURE( !maModel.mbAboveAverage, "CondFormatRule::importCfRule - wrong above-average flag" ); maModel.mnType = XML_aboveAverage; maModel.mnStdDev = nOperator; // operator field used for standard deviation maModel.mbAboveAverage = false; maModel.mbEqualAverage = false; // does not exist as real flag... break; - case OOBIN_CFRULE_SUB_DUPLICATE: + case BIFF12_CFRULE_SUB_DUPLICATE: OSL_ENSURE( nOperator == 0, "CondFormatRule::importCfRule - unexpected operator value" ); maModel.mnType = XML_duplicateValues; break; - case OOBIN_CFRULE_SUB_EQABOVEAVERAGE: + case BIFF12_CFRULE_SUB_EQABOVEAVERAGE: OSL_ENSURE( maModel.mbAboveAverage, "CondFormatRule::importCfRule - wrong above-average flag" ); maModel.mnType = XML_aboveAverage; maModel.mnStdDev = nOperator; // operator field used for standard deviation maModel.mbAboveAverage = true; maModel.mbEqualAverage = true; // does not exist as real flag... break; - case OOBIN_CFRULE_SUB_EQBELOWAVERAGE: + case BIFF12_CFRULE_SUB_EQBELOWAVERAGE: OSL_ENSURE( !maModel.mbAboveAverage, "CondFormatRule::importCfRule - wrong above-average flag" ); maModel.mnType = XML_aboveAverage; maModel.mnStdDev = nOperator; // operator field used for standard deviation @@ -382,23 +371,23 @@ void CondFormatRule::importCfRule( RecordInputStream& rStrm ) break; } break; - case OOBIN_CFRULE_TYPE_COLORSCALE: - OSL_ENSURE( nSubType == OOBIN_CFRULE_SUB_COLORSCALE, "CondFormatRule::importCfRule - rule type/subtype mismatch" ); + case BIFF12_CFRULE_TYPE_COLORSCALE: + OSL_ENSURE( nSubType == BIFF12_CFRULE_SUB_COLORSCALE, "CondFormatRule::importCfRule - rule type/subtype mismatch" ); OSL_ENSURE( nOperator == 0, "CondFormatRule::importCfRule - unexpected operator value" ); maModel.mnType = XML_colorScale; break; - case OOBIN_CFRULE_TYPE_DATABAR: - OSL_ENSURE( nSubType == OOBIN_CFRULE_SUB_DATABAR, "CondFormatRule::importCfRule - rule type/subtype mismatch" ); + case BIFF12_CFRULE_TYPE_DATABAR: + OSL_ENSURE( nSubType == BIFF12_CFRULE_SUB_DATABAR, "CondFormatRule::importCfRule - rule type/subtype mismatch" ); OSL_ENSURE( nOperator == 0, "CondFormatRule::importCfRule - unexpected operator value" ); maModel.mnType = XML_dataBar; break; - case OOBIN_CFRULE_TYPE_TOPTEN: - OSL_ENSURE( nSubType == OOBIN_CFRULE_SUB_TOPTEN, "CondFormatRule::importCfRule - rule type/subtype mismatch" ); + case BIFF12_CFRULE_TYPE_TOPTEN: + OSL_ENSURE( nSubType == BIFF12_CFRULE_SUB_TOPTEN, "CondFormatRule::importCfRule - rule type/subtype mismatch" ); maModel.mnType = XML_top10; maModel.mnRank = nOperator; // operator field used for rank value break; - case OOBIN_CFRULE_TYPE_ICONSET: - OSL_ENSURE( nSubType == OOBIN_CFRULE_SUB_ICONSET, "CondFormatRule::importCfRule - rule type/subtype mismatch" ); + case BIFF12_CFRULE_TYPE_ICONSET: + OSL_ENSURE( nSubType == BIFF12_CFRULE_SUB_ICONSET, "CondFormatRule::importCfRule - rule type/subtype mismatch" ); OSL_ENSURE( nOperator == 0, "CondFormatRule::importCfRule - unexpected operator value" ); maModel.mnType = XML_iconSet; break; @@ -418,7 +407,7 @@ void CondFormatRule::importCfRule( BiffInputStream& rStrm, sal_Int32 nPriority ) static const sal_Int32 spnTypeIds[] = { XML_TOKEN_INVALID, XML_cellIs, XML_expression }; maModel.mnType = STATIC_ARRAY_SELECT( spnTypeIds, nType, XML_TOKEN_INVALID ); - maModel.setBinOperator( nOperator ); + maModel.setBiffOperator( nOperator ); maModel.mnPriority = nPriority; maModel.mbStopIfTrue = true; @@ -658,7 +647,7 @@ CondFormatRuleRef CondFormat::importCfRule( const AttributeList& rAttribs ) return xRule; } -void CondFormat::importCondFormatting( RecordInputStream& rStrm ) +void CondFormat::importCondFormatting( SequenceInputStream& rStrm ) { BinRangeList aRanges; rStrm.skip( 8 ); @@ -666,7 +655,7 @@ void CondFormat::importCondFormatting( RecordInputStream& rStrm ) getAddressConverter().convertToCellRangeList( maModel.maRanges, aRanges, getSheetIndex(), true ); } -void CondFormat::importCfRule( RecordInputStream& rStrm ) +void CondFormat::importCfRule( SequenceInputStream& rStrm ) { CondFormatRuleRef xRule = createRule(); xRule->importCfRule( rStrm ); @@ -694,18 +683,17 @@ void CondFormat::importCfHeader( BiffInputStream& rStrm ) void CondFormat::finalizeImport() { - Reference< XSheetCellRanges > xRanges = getCellRangeList( maModel.maRanges ); - if( xRanges.is() ) + try { + Reference< XSheetCellRanges > xRanges( getCellRangeList( maModel.maRanges ), UNO_SET_THROW ); PropertySet aPropSet( xRanges ); - Reference< XSheetConditionalEntries > xEntries; - aPropSet.getProperty( xEntries, PROP_ConditionalFormat ); - if( xEntries.is() ) - { - // maRules is sorted by rule priority - maRules.forEachMem( &CondFormatRule::finalizeImport, ::boost::cref( xEntries ) ); - aPropSet.setProperty( PROP_ConditionalFormat, xEntries ); - } + Reference< XSheetConditionalEntries > xEntries( aPropSet.getAnyProperty( PROP_ConditionalFormat ), UNO_QUERY_THROW ); + // maRules is sorted by rule priority + maRules.forEachMem( &CondFormatRule::finalizeImport, ::boost::cref( xEntries ) ); + aPropSet.setProperty( PROP_ConditionalFormat, xEntries ); + } + catch( Exception& ) + { } } @@ -737,7 +725,7 @@ CondFormatRef CondFormatBuffer::importConditionalFormatting( const AttributeList return xCondFmt; } -CondFormatRef CondFormatBuffer::importCondFormatting( RecordInputStream& rStrm ) +CondFormatRef CondFormatBuffer::importCondFormatting( SequenceInputStream& rStrm ) { CondFormatRef xCondFmt = createCondFormat(); xCondFmt->importCondFormatting( rStrm ); @@ -784,4 +772,3 @@ CondFormatRef CondFormatBuffer::createCondFormat() } // namespace xls } // namespace oox - diff --git a/oox/source/xls/condformatcontext.cxx b/oox/source/xls/condformatcontext.cxx index 8cd3a33615fc..091dc11fb614 100644 --- a/oox/source/xls/condformatcontext.cxx +++ b/oox/source/xls/condformatcontext.cxx @@ -27,22 +27,22 @@ #include "oox/xls/condformatcontext.hxx" -using ::rtl::OUString; -using ::oox::core::ContextHandlerRef; - namespace oox { namespace xls { // ============================================================================ -OoxCondFormatContext::OoxCondFormatContext( OoxWorksheetFragmentBase& rFragment ) : - OoxWorksheetContextBase( rFragment ) +using ::oox::core::ContextHandlerRef; +using ::rtl::OUString; + +// ============================================================================ + +CondFormatContext::CondFormatContext( WorksheetFragmentBase& rFragment ) : + WorksheetContextBase( rFragment ) { } -// oox.core.ContextHandler2Helper interface ----------------------------------- - -ContextHandlerRef OoxCondFormatContext::onCreateContext( sal_Int32 nElement, const AttributeList& ) +ContextHandlerRef CondFormatContext::onCreateContext( sal_Int32 nElement, const AttributeList& ) { switch( getCurrentElement() ) { @@ -54,7 +54,7 @@ ContextHandlerRef OoxCondFormatContext::onCreateContext( sal_Int32 nElement, con return 0; } -void OoxCondFormatContext::onStartElement( const AttributeList& rAttribs ) +void CondFormatContext::onStartElement( const AttributeList& rAttribs ) { switch( getCurrentElement() ) { @@ -67,34 +67,30 @@ void OoxCondFormatContext::onStartElement( const AttributeList& rAttribs ) } } -void OoxCondFormatContext::onEndElement( const OUString& rChars ) +void CondFormatContext::onCharacters( const OUString& rChars ) { - switch( getCurrentElement() ) - { - case XLS_TOKEN( formula ): - if( mxCondFmt.get() && mxRule.get() ) mxRule->appendFormula( rChars ); - break; - } + if( isCurrentElement( XLS_TOKEN( formula ) ) && mxCondFmt.get() && mxRule.get() ) + mxRule->appendFormula( rChars ); } -ContextHandlerRef OoxCondFormatContext::onCreateRecordContext( sal_Int32 nRecId, RecordInputStream& ) +ContextHandlerRef CondFormatContext::onCreateRecordContext( sal_Int32 nRecId, SequenceInputStream& ) { switch( getCurrentElement() ) { - case OOBIN_ID_CONDFORMATTING: - return (nRecId == OOBIN_ID_CFRULE) ? this : 0; + case BIFF12_ID_CONDFORMATTING: + return (nRecId == BIFF12_ID_CFRULE) ? this : 0; } return 0; } -void OoxCondFormatContext::onStartRecord( RecordInputStream& rStrm ) +void CondFormatContext::onStartRecord( SequenceInputStream& rStrm ) { switch( getCurrentElement() ) { - case OOBIN_ID_CONDFORMATTING: + case BIFF12_ID_CONDFORMATTING: mxCondFmt = getCondFormats().importCondFormatting( rStrm ); break; - case OOBIN_ID_CFRULE: + case BIFF12_ID_CFRULE: if( mxCondFmt.get() ) mxCondFmt->importCfRule( rStrm ); break; } @@ -104,4 +100,3 @@ void OoxCondFormatContext::onStartRecord( RecordInputStream& rStrm ) } // namespace xls } // namespace oox - diff --git a/oox/source/xls/connectionsbuffer.cxx b/oox/source/xls/connectionsbuffer.cxx new file mode 100755 index 000000000000..6d0fcd65122f --- /dev/null +++ b/oox/source/xls/connectionsbuffer.cxx @@ -0,0 +1,501 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#include "oox/xls/connectionsbuffer.hxx" + +#include "oox/helper/attributelist.hxx" +#include "oox/xls/biffinputstream.hxx" + +namespace oox { +namespace xls { + +// ============================================================================ + +using namespace ::com::sun::star::uno; + +using ::rtl::OUString; +using ::rtl::OUStringBuffer; + +// ============================================================================ + +namespace { + +const sal_Int32 BIFF12_RECONNECT_AS_REQUIRED = 1; +const sal_Int32 BIFF12_RECONNECT_ALWAYS = 2; +const sal_Int32 BIFF12_RECONNECT_NEVER = 3; + +const sal_uInt8 BIFF12_CONNECTION_SAVEPASSWORD_ON = 1; +const sal_uInt8 BIFF12_CONNECTION_SAVEPASSWORD_OFF = 2; + +const sal_uInt16 BIFF12_CONNECTION_KEEPALIVE = 0x0001; +const sal_uInt16 BIFF12_CONNECTION_NEW = 0x0002; +const sal_uInt16 BIFF12_CONNECTION_DELETED = 0x0004; +const sal_uInt16 BIFF12_CONNECTION_ONLYUSECONNFILE = 0x0008; +const sal_uInt16 BIFF12_CONNECTION_BACKGROUND = 0x0010; +const sal_uInt16 BIFF12_CONNECTION_REFRESHONLOAD = 0x0020; +const sal_uInt16 BIFF12_CONNECTION_SAVEDATA = 0x0040; + +const sal_uInt16 BIFF12_CONNECTION_HAS_SOURCEFILE = 0x0001; +const sal_uInt16 BIFF12_CONNECTION_HAS_SOURCECONNFILE = 0x0002; +const sal_uInt16 BIFF12_CONNECTION_HAS_DESCRIPTION = 0x0004; +const sal_uInt16 BIFF12_CONNECTION_HAS_NAME = 0x0008; +const sal_uInt16 BIFF12_CONNECTION_HAS_SSOID = 0x0010; + +const sal_uInt32 BIFF12_WEBPR_XML = 0x00000100; +const sal_uInt32 BIFF12_WEBPR_SOURCEDATA = 0x00000200; +const sal_uInt32 BIFF12_WEBPR_PARSEPRE = 0x00000400; +const sal_uInt32 BIFF12_WEBPR_CONSECUTIVE = 0x00000800; +const sal_uInt32 BIFF12_WEBPR_FIRSTROW = 0x00001000; +const sal_uInt32 BIFF12_WEBPR_XL97CREATED = 0x00002000; +const sal_uInt32 BIFF12_WEBPR_TEXTDATES = 0x00004000; +const sal_uInt32 BIFF12_WEBPR_XL2000REFRESHED = 0x00008000; +const sal_uInt32 BIFF12_WEBPR_HTMLTABLES = 0x00010000; + +const sal_uInt8 BIFF12_WEBPR_HAS_POSTMETHOD = 0x01; +const sal_uInt8 BIFF12_WEBPR_HAS_EDITPAGE = 0x02; +const sal_uInt8 BIFF12_WEBPR_HAS_URL = 0x04; + +const sal_uInt16 BIFF_DBQUERY_ODBC = 0x0008; +const sal_uInt16 BIFF_DBQUERY_SQLQUERY = 0x0010; +const sal_uInt16 BIFF_DBQUERY_SERVERBASEDSQL = 0x0020; +const sal_uInt16 BIFF_DBQUERY_HTML = 0x0040; +const sal_uInt16 BIFF_DBQUERY_SAVEPASSWORD = 0x0080; +const sal_uInt16 BIFF_DBQUERY_HTMLTABLES = 0x0100; + +const sal_uInt16 BIFF_QTSETTINGS_KEEPALIVE = 0x0001; +const sal_uInt16 BIFF_QTSETTINGS_NEW = 0x0002; +const sal_uInt16 BIFF_QTSETTINGS_SOURCEDATA = 0x0004; +const sal_uInt16 BIFF_QTSETTINGS_WEBBASEDPROV = 0x0008; +const sal_uInt16 BIFF_QTSETTINGS_REINITLIST = 0x0010; +const sal_uInt16 BIFF_QTSETTINGS_XML = 0x0080; + +const sal_uInt16 BIFF_QTSETTINGS_PARSEPRE = 0x0001; +const sal_uInt16 BIFF_QTSETTINGS_CONSECUTIVE = 0x0002; +const sal_uInt16 BIFF_QTSETTINGS_FIRSTROW = 0x0004; +const sal_uInt16 BIFF_QTSETTINGS_XL97CREATED = 0x0008; +const sal_uInt16 BIFF_QTSETTINGS_TEXTDATES = 0x0010; +const sal_uInt16 BIFF_QTSETTINGS_XL2000REFRESHED = 0x0020; + +const sal_uInt16 BIFF_QTSETTINGS_TEXTQUERY = 0x0001; +const sal_uInt16 BIFF_QTSETTINGS_TABLENAMES = 0x0002; + +// ---------------------------------------------------------------------------- + +OUString lclReadQueryString( BiffInputStream& rStrm, sal_uInt16 nCount ) +{ + bool bValidRec = true; + OUStringBuffer aBuffer; + for( sal_uInt16 nIndex = 0; bValidRec && (nIndex < nCount); ++nIndex ) + { + bValidRec = (rStrm.getNextRecId() == BIFF_ID_PCITEM_STRING) && rStrm.startNextRecord(); + if( bValidRec ) + aBuffer.append( rStrm.readUniString() ); + } + OSL_ENSURE( bValidRec, "lclReadQueryString - missing PCITEM_STRING records" ); + return aBuffer.makeStringAndClear(); +} + +void lclParseTables( WebPrModel::TablesVector& rTables, const OUString& rTableNames ) +{ + rTables.clear(); + OUString aTableNames = rTableNames.trim(); + while( aTableNames.getLength() > 0 ) + { + sal_Int32 nSep = -1; + // table names are enclosed in double quotes + if( aTableNames[ 0 ] == '"' ) + { + // search closing quote character + sal_Int32 nEndQuote = aTableNames.indexOf( '"', 1 ); + OSL_ENSURE( nEndQuote >= 1, "lclParseTables - invalid syntax" ); + if( nEndQuote < 0 ) + nEndQuote = aTableNames.getLength(); + else + nSep = aTableNames.indexOf( ',', nEndQuote + 1 ); + // extract text between quote characters + OUString aTableName = aTableNames.copy( 1, nEndQuote - 1 ).trim(); + if( aTableName.getLength() > 0 ) + rTables.push_back( Any( aTableName ) ); + else + rTables.push_back( Any() ); + } + else + { + nSep = aTableNames.indexOf( ',' ); + if( nSep < 0 ) + nSep = aTableNames.getLength(); + OUString aTableIndex = aTableNames.copy( 0, nSep ).trim(); + if( (aTableIndex.getLength() > 0) && (aTableIndex[ 0 ] >= '1') && (aTableIndex[ 0 ] <= '9') ) + rTables.push_back( Any( aTableIndex.toInt32() ) ); + else + rTables.push_back( Any() ); + } + + // remove processed item from aTableNames + if( (nSep < 0) || (nSep >= aTableNames.getLength()) ) + aTableNames = OUString(); + else + aTableNames = aTableNames.copy( nSep + 1 ).trim(); + } +} + +} // namespace + +// ============================================================================ + +WebPrModel::WebPrModel() : + mnHtmlFormat( XML_none ), + mbXml( false ), + mbSourceData( false ), + mbParsePre( false ), + mbConsecutive( false ), + mbFirstRow( false ), + mbXl97Created( false ), + mbTextDates( false ), + mbXl2000Refreshed( false ), + mbHtmlTables( false ) +{ +} + +// ---------------------------------------------------------------------------- + +ConnectionModel::ConnectionModel() : + mnId( -1 ), + mnType( BIFF12_CONNECTION_UNKNOWN ), + mnReconnectMethod( BIFF12_RECONNECT_AS_REQUIRED ), + mnCredentials( XML_integrated ), + mnInterval( 0 ), + mbKeepAlive( false ), + mbNew( false ), + mbDeleted( false ), + mbOnlyUseConnFile( false ), + mbBackground( false ), + mbRefreshOnLoad( false ), + mbSaveData( false ), + mbSavePassword( false ) +{ +} + +WebPrModel& ConnectionModel::createWebPr() +{ + OSL_ENSURE( !mxWebPr.get(), "ConnectionModel::createWebPr - multiple call" ); + mxWebPr.reset( new WebPrModel ); + return *mxWebPr; +} + +// ---------------------------------------------------------------------------- + +Connection::Connection( const WorkbookHelper& rHelper, sal_Int32 nConnId ) : + WorkbookHelper( rHelper ) +{ + maModel.mnId = nConnId; +} + +void Connection::importConnection( const AttributeList& rAttribs ) +{ + maModel.maName = rAttribs.getXString( XML_name, OUString() ); + maModel.maDescription = rAttribs.getXString( XML_description, OUString() ); + maModel.maSourceFile = rAttribs.getXString( XML_sourceFile, OUString() ); + maModel.maSourceConnFile = rAttribs.getXString( XML_odcFile, OUString() ); + maModel.maSsoId = rAttribs.getXString( XML_singleSignOnId, OUString() ); + maModel.mnId = rAttribs.getInteger( XML_id, -1 ); + // type and reconnectionMethod are using the BIFF12 constants instead of XML tokens + maModel.mnType = rAttribs.getInteger( XML_type, BIFF12_CONNECTION_UNKNOWN ); + maModel.mnReconnectMethod = rAttribs.getInteger( XML_reconnectionMethod, BIFF12_RECONNECT_AS_REQUIRED ); + maModel.mnCredentials = rAttribs.getToken( XML_credentials, XML_integrated ); + maModel.mnInterval = rAttribs.getInteger( XML_interval, 0 ); + maModel.mbKeepAlive = rAttribs.getBool( XML_keepAlive, false ); + maModel.mbNew = rAttribs.getBool( XML_new, false ); + maModel.mbDeleted = rAttribs.getBool( XML_deleted, false ); + maModel.mbOnlyUseConnFile = rAttribs.getBool( XML_onlyUseConnectionFile, false ); + maModel.mbBackground = rAttribs.getBool( XML_background, false ); + maModel.mbRefreshOnLoad = rAttribs.getBool( XML_refreshOnLoad, false ); + maModel.mbSaveData = rAttribs.getBool( XML_saveData, false ); + maModel.mbSavePassword = rAttribs.getBool( XML_savePassword, false ); +} + +void Connection::importWebPr( const AttributeList& rAttribs ) +{ + WebPrModel& rWebPr = maModel.createWebPr(); + + rWebPr.maUrl = rAttribs.getXString( XML_url, OUString() ); + rWebPr.maPostMethod = rAttribs.getXString( XML_post, OUString() ); + rWebPr.maEditPage = rAttribs.getXString( XML_editPage, OUString() ); + rWebPr.mnHtmlFormat = rAttribs.getToken( XML_htmlFormat, XML_none ); + rWebPr.mbXml = rAttribs.getBool( XML_xml, false ); + rWebPr.mbSourceData = rAttribs.getBool( XML_sourceData, false ); + rWebPr.mbParsePre = rAttribs.getBool( XML_parsePre, false ); + rWebPr.mbConsecutive = rAttribs.getBool( XML_consecutive, false ); + rWebPr.mbFirstRow = rAttribs.getBool( XML_firstRow, false ); + rWebPr.mbXl97Created = rAttribs.getBool( XML_xl97, false ); + rWebPr.mbTextDates = rAttribs.getBool( XML_textDates, false ); + rWebPr.mbXl2000Refreshed = rAttribs.getBool( XML_xl2000, false ); + rWebPr.mbHtmlTables = rAttribs.getBool( XML_htmlTables, false ); +} + +void Connection::importTables( const AttributeList& /*rAttribs*/ ) +{ + if( maModel.mxWebPr.get() ) + { + OSL_ENSURE( maModel.mxWebPr->maTables.empty(), "Connection::importTables - multiple calls" ); + maModel.mxWebPr->maTables.clear(); + } +} + +void Connection::importTable( const AttributeList& rAttribs, sal_Int32 nElement ) +{ + if( maModel.mxWebPr.get() ) + { + Any aTableAny; + switch( nElement ) + { + case XLS_TOKEN( m ): break; + case XLS_TOKEN( s ): aTableAny <<= rAttribs.getXString( XML_v, OUString() ); break; + case XLS_TOKEN( x ): aTableAny <<= rAttribs.getInteger( XML_v, -1 ); break; + default: + OSL_ENSURE( false, "Connection::importTable - unexpected element" ); + return; + } + maModel.mxWebPr->maTables.push_back( aTableAny ); + } +} + +void Connection::importConnection( SequenceInputStream& rStrm ) +{ + sal_uInt16 nFlags, nStrFlags; + sal_uInt8 nSavePassword, nCredentials; + rStrm.skip( 2 ); + rStrm >> nSavePassword; + rStrm.skip( 1 ); + maModel.mnInterval = rStrm.readuInt16(); + rStrm >> nFlags >> nStrFlags >> maModel.mnType >> maModel.mnReconnectMethod >> maModel.mnId >> nCredentials; + + if( getFlag( nStrFlags, BIFF12_CONNECTION_HAS_SOURCEFILE ) ) + rStrm >> maModel.maSourceFile; + if( getFlag( nStrFlags, BIFF12_CONNECTION_HAS_SOURCECONNFILE ) ) + rStrm >> maModel.maSourceConnFile; + if( getFlag( nStrFlags, BIFF12_CONNECTION_HAS_DESCRIPTION ) ) + rStrm >> maModel.maDescription; + if( getFlag( nStrFlags, BIFF12_CONNECTION_HAS_NAME ) ) + rStrm >> maModel.maName; + if( getFlag( nStrFlags, BIFF12_CONNECTION_HAS_SSOID ) ) + rStrm >> maModel.maSsoId; + + static const sal_Int32 spnCredentials[] = { XML_integrated, XML_none, XML_stored, XML_prompt }; + maModel.mnCredentials = STATIC_ARRAY_SELECT( spnCredentials, nCredentials, XML_integrated ); + + maModel.mbKeepAlive = getFlag( nFlags, BIFF12_CONNECTION_KEEPALIVE ); + maModel.mbNew = getFlag( nFlags, BIFF12_CONNECTION_NEW ); + maModel.mbDeleted = getFlag( nFlags, BIFF12_CONNECTION_DELETED ); + maModel.mbOnlyUseConnFile = getFlag( nFlags, BIFF12_CONNECTION_ONLYUSECONNFILE ); + maModel.mbBackground = getFlag( nFlags, BIFF12_CONNECTION_BACKGROUND ); + maModel.mbRefreshOnLoad = getFlag( nFlags, BIFF12_CONNECTION_REFRESHONLOAD ); + maModel.mbSaveData = getFlag( nFlags, BIFF12_CONNECTION_SAVEDATA ); + maModel.mbSavePassword = nSavePassword == BIFF12_CONNECTION_SAVEPASSWORD_ON; +} + +void Connection::importWebPr( SequenceInputStream& rStrm ) +{ + WebPrModel& rWebPr = maModel.createWebPr(); + + sal_uInt32 nFlags; + sal_uInt8 nStrFlags; + rStrm >> nFlags >> nStrFlags; + + if( getFlag( nStrFlags, BIFF12_WEBPR_HAS_URL ) ) + rStrm >> rWebPr.maUrl; + if( getFlag( nStrFlags, BIFF12_WEBPR_HAS_POSTMETHOD ) ) + rStrm >> rWebPr.maPostMethod; + if( getFlag( nStrFlags, BIFF12_WEBPR_HAS_EDITPAGE ) ) + rStrm >> rWebPr.maEditPage; + + static const sal_Int32 spnHmlFormats[] = { XML_none, XML_rtf, XML_all }; + rWebPr.mnHtmlFormat = STATIC_ARRAY_SELECT( spnHmlFormats, extractValue< sal_uInt8 >( nFlags, 0, 8 ), XML_none ); + + rWebPr.mbXml = getFlag( nFlags, BIFF12_WEBPR_XML ); + rWebPr.mbSourceData = getFlag( nFlags, BIFF12_WEBPR_SOURCEDATA ); + rWebPr.mbParsePre = getFlag( nFlags, BIFF12_WEBPR_PARSEPRE ); + rWebPr.mbConsecutive = getFlag( nFlags, BIFF12_WEBPR_CONSECUTIVE ); + rWebPr.mbFirstRow = getFlag( nFlags, BIFF12_WEBPR_FIRSTROW ); + rWebPr.mbXl97Created = getFlag( nFlags, BIFF12_WEBPR_XL97CREATED ); + rWebPr.mbTextDates = getFlag( nFlags, BIFF12_WEBPR_TEXTDATES ); + rWebPr.mbXl2000Refreshed = getFlag( nFlags, BIFF12_WEBPR_XL2000REFRESHED ); + rWebPr.mbHtmlTables = getFlag( nFlags, BIFF12_WEBPR_HTMLTABLES ); +} + +void Connection::importWebPrTables( SequenceInputStream& /*rStrm*/ ) +{ + if( maModel.mxWebPr.get() ) + { + OSL_ENSURE( maModel.mxWebPr->maTables.empty(), "Connection::importWebPrTables - multiple calls" ); + maModel.mxWebPr->maTables.clear(); + } +} + +void Connection::importWebPrTable( SequenceInputStream& rStrm, sal_Int32 nRecId ) +{ + if( maModel.mxWebPr.get() ) + { + Any aTableAny; + switch( nRecId ) + { + case BIFF12_ID_PCITEM_MISSING: break; + case BIFF12_ID_PCITEM_STRING: aTableAny <<= BiffHelper::readString( rStrm ); break; + case BIFF12_ID_PCITEM_INDEX: aTableAny <<= rStrm.readInt32(); break; + default: + OSL_ENSURE( false, "Connection::importWebPrTable - unexpected record" ); + return; + } + maModel.mxWebPr->maTables.push_back( aTableAny ); + } +} + +void Connection::importDbQuery( BiffInputStream& rStrm ) +{ + sal_uInt16 nFlags, nSqlParamCount, nCommandCount, nPostMethodCount, nServerSqlCount, nOdbcConnCount; + rStrm >> nFlags >> nSqlParamCount >> nCommandCount >> nPostMethodCount >> nServerSqlCount >> nOdbcConnCount; + + // same type constants in all BIFF versions + maModel.mnType = extractValue< sal_Int32 >( nFlags, 0, 3 ); + maModel.mbSavePassword = getFlag( nFlags, BIFF_DBQUERY_SAVEPASSWORD ); + + OSL_ENSURE( getFlag( nFlags, BIFF_DBQUERY_ODBC ) == (maModel.mnType == BIFF12_CONNECTION_ODBC), "Connection::importDbQuery - wrong ODBC flag" ); + OSL_ENSURE( getFlag( nFlags, BIFF_DBQUERY_SQLQUERY ) != (maModel.mnType == BIFF12_CONNECTION_HTML), "Connection::importDbQuery - wrong SQL query flag" ); + OSL_ENSURE( getFlag( nFlags, BIFF_DBQUERY_HTML ) == (maModel.mnType == BIFF12_CONNECTION_HTML), "Connection::importDbQuery - wrong HTML flag" ); + + if( (maModel.mnType == BIFF12_CONNECTION_HTML) && getFlag( nFlags, BIFF_DBQUERY_HTML ) ) + { + WebPrModel& rWebPr = maModel.createWebPr(); + rWebPr.mbHtmlTables = getFlag( nFlags, BIFF_DBQUERY_HTMLTABLES ); + + // read HTML query URL and post method + rWebPr.maUrl = lclReadQueryString( rStrm, nCommandCount ); + rWebPr.maPostMethod = lclReadQueryString( rStrm, nPostMethodCount ); + } +} + +void Connection::importQueryTableSettings( BiffInputStream& rStrm ) +{ + rStrm.skip( 4 ); + // source data type, again + sal_uInt16 nType = rStrm.readuInt16(); + OSL_ENSURE( nType == maModel.mnType, "Connection::importQueryTableSettings - source data type mismatch" ); + if( nType == maModel.mnType ) + { + sal_uInt16 nFlags1, nFlags2, nFlags3, nHtmlFormat; + rStrm >> nFlags1 >> nFlags2 >> nFlags3; + rStrm.skip( 10 ); + maModel.mnInterval = rStrm.readuInt16(); + rStrm >> nHtmlFormat; + + // first flags field: generic connection flags + maModel.mbKeepAlive = getFlag( nFlags1, BIFF_QTSETTINGS_KEEPALIVE ); + maModel.mbNew = getFlag( nFlags1, BIFF_QTSETTINGS_NEW ); + + // meaning of second flags field is dependent on source data type + if( (maModel.mnType == BIFF12_CONNECTION_HTML) && maModel.mxWebPr.get() ) + { + WebPrModel& rWebPr = *maModel.mxWebPr; + + // HTML format is one-based in BIFF8 (but zero-based in BIFF12) + static const sal_Int32 spnHmlFormats[] = { XML_none, XML_none, XML_rtf, XML_all }; + rWebPr.mnHtmlFormat = STATIC_ARRAY_SELECT( spnHmlFormats, nHtmlFormat, XML_none ); + + rWebPr.mbXml = getFlag( nFlags1, BIFF_QTSETTINGS_XML ); + rWebPr.mbSourceData = getFlag( nFlags1, BIFF_QTSETTINGS_SOURCEDATA ); + rWebPr.mbParsePre = getFlag( nFlags2, BIFF_QTSETTINGS_PARSEPRE ); + rWebPr.mbConsecutive = getFlag( nFlags2, BIFF_QTSETTINGS_CONSECUTIVE ); + rWebPr.mbFirstRow = getFlag( nFlags2, BIFF_QTSETTINGS_FIRSTROW ); + rWebPr.mbXl97Created = getFlag( nFlags2, BIFF_QTSETTINGS_XL97CREATED ); + rWebPr.mbTextDates = getFlag( nFlags2, BIFF_QTSETTINGS_TEXTDATES ); + rWebPr.mbXl2000Refreshed = getFlag( nFlags2, BIFF_QTSETTINGS_XL2000REFRESHED ); + + // list of HTML table names or indexes + if( getFlag( nFlags3, BIFF_QTSETTINGS_TABLENAMES ) ) + { + // a QUERYTABLESTRING record containing the table names must follow + bool bHasQTString = (rStrm.getNextRecId() == BIFF_ID_QUERYTABLESTRING) && rStrm.startNextRecord(); + OSL_ENSURE( bHasQTString, "Connection::importQueryTableSettings - missing QUERYTABLESTRING record" ); + if( bHasQTString ) + { + rStrm.skip( 4 ); + lclParseTables( rWebPr.maTables, rStrm.readUniString() ); + } + } + } + } +} + +// ============================================================================ + +ConnectionsBuffer::ConnectionsBuffer( const WorkbookHelper& rHelper ) : + WorkbookHelper( rHelper ), + mnUnusedId( 1 ) +{ +} + +Connection& ConnectionsBuffer::createConnection() +{ + ConnectionRef xConnection( new Connection( *this ) ); + maConnections.push_back( xConnection ); + return *xConnection; +} + +Connection& ConnectionsBuffer::createConnectionWithId() +{ + ConnectionRef xConnection( new Connection( *this, mnUnusedId ) ); + maConnections.push_back( xConnection ); + insertConnectionToMap( xConnection ); + return *xConnection; +} + +void ConnectionsBuffer::finalizeImport() +{ + for( ConnectionVector::iterator aIt = maConnections.begin(), aEnd = maConnections.end(); aIt != aEnd; ++aIt ) + insertConnectionToMap( *aIt ); +} + +ConnectionRef ConnectionsBuffer::getConnection( sal_Int32 nConnId ) const +{ + return maConnectionsById.get( nConnId ); +} + +void ConnectionsBuffer::insertConnectionToMap( const ConnectionRef& rxConnection ) +{ + sal_Int32 nConnId = rxConnection->getConnectionId(); + if( nConnId > 0 ) + { + OSL_ENSURE( !maConnectionsById.has( nConnId ), "ConnectionsBuffer::insertConnectionToMap - multiple connection identifier" ); + maConnectionsById[ nConnId ] = rxConnection; + mnUnusedId = ::std::max< sal_Int32 >( mnUnusedId, nConnId + 1 ); + } +} + +// ============================================================================ + +} // namespace xls +} // namespace oox diff --git a/oox/source/xls/connectionsfragment.cxx b/oox/source/xls/connectionsfragment.cxx index f19204306d1b..7aafcd84cd7e 100644 --- a/oox/source/xls/connectionsfragment.cxx +++ b/oox/source/xls/connectionsfragment.cxx @@ -26,88 +26,154 @@ ************************************************************************/ #include "oox/xls/connectionsfragment.hxx" -#include "oox/helper/attributelist.hxx" -#include "oox/xls/webquerybuffer.hxx" -using ::rtl::OUString; -using ::oox::core::ContextHandlerRef; +#include "oox/helper/attributelist.hxx" +#include "oox/xls/biffhelper.hxx" +#include "oox/xls/connectionsbuffer.hxx" namespace oox { namespace xls { -OoxConnectionsFragment::OoxConnectionsFragment( const WorkbookHelper& rHelper, const OUString& rFragmentPath ) : - OoxWorkbookFragmentBase( rHelper, rFragmentPath ) +// ============================================================================ + +using namespace ::oox::core; + +using ::rtl::OUString; + +// ============================================================================ + +ConnectionContext::ConnectionContext( WorkbookFragmentBase& rParent, Connection& rConnection ) : + WorkbookContextBase( rParent ), + mrConnection( rConnection ) { } -ContextHandlerRef OoxConnectionsFragment::onCreateContext( sal_Int32 nElement, const AttributeList& rAttribs ) +ContextHandlerRef ConnectionContext::onCreateContext( sal_Int32 nElement, const AttributeList& rAttribs ) { switch( getCurrentElement() ) { - case XML_ROOT_CONTEXT: - if( nElement == XLS_TOKEN( connections ) ) return this; - break; - - case XLS_TOKEN( connections ): - switch( nElement ) + case XLS_TOKEN( connection ): + if( nElement == XLS_TOKEN( webPr ) ) { - case XLS_TOKEN( connection ): importConnection( rAttribs ); return this; + mrConnection.importWebPr( rAttribs ); + return this; } break; - case XLS_TOKEN( connection ): - switch( nElement ) + case XLS_TOKEN( webPr ): + if( nElement == XLS_TOKEN( tables ) ) { - case XLS_TOKEN( webPr ): importWebPr( rAttribs ); return this; + mrConnection.importTables( rAttribs ); + return this; } break; - case XLS_TOKEN( webPr ): - switch( nElement ) + case XLS_TOKEN( tables ): + mrConnection.importTable( rAttribs, nElement ); + break; + } + return 0; +} + +void ConnectionContext::onStartElement( const AttributeList& rAttribs ) +{ + if( getCurrentElement() == XLS_TOKEN( connection ) ) + mrConnection.importConnection( rAttribs ); +} + +ContextHandlerRef ConnectionContext::onCreateRecordContext( sal_Int32 nRecId, SequenceInputStream& rStrm ) +{ + switch( getCurrentElement() ) + { + case BIFF12_ID_CONNECTION: + if( nRecId == BIFF12_ID_WEBPR ) { - case XLS_TOKEN( tables ): importTables( rAttribs ); return this; + mrConnection.importWebPr( rStrm ); + return this; } break; - case XLS_TOKEN( tables ): - switch( nElement ) + case BIFF12_ID_WEBPR: + if( nRecId == BIFF12_ID_WEBPRTABLES ) { - case XLS_TOKEN( s ): importS( rAttribs ); break; - case XLS_TOKEN( x ): importX( rAttribs ); break; + mrConnection.importWebPrTables( rStrm ); + return this; } break; + + case BIFF12_ID_WEBPRTABLES: + mrConnection.importWebPrTable( rStrm, nRecId ); + break; } return 0; } -void OoxConnectionsFragment::importConnection( const AttributeList& rAttribs ) +void ConnectionContext::onStartRecord( SequenceInputStream& rStrm ) +{ + if( getCurrentElement() == BIFF12_ID_CONNECTION ) + mrConnection.importConnection( rStrm ); +} + +// ============================================================================ + +ConnectionsFragment::ConnectionsFragment( const WorkbookHelper& rHelper, const OUString& rFragmentPath ) : + WorkbookFragmentBase( rHelper, rFragmentPath ) { - if ( rAttribs.getInteger( XML_type, 0 ) == Connection::CONNECTION_WEBQUERY ) - { - getWebQueries().importConnection( rAttribs ); - } } -void OoxConnectionsFragment::importWebPr( const AttributeList& rAttribs ) +ContextHandlerRef ConnectionsFragment::onCreateContext( sal_Int32 nElement, const AttributeList& /*rAttribs*/ ) { - getWebQueries().importWebPr( rAttribs ); + switch( getCurrentElement() ) + { + case XML_ROOT_CONTEXT: + if( nElement == XLS_TOKEN( connections ) ) + return this; + break; + + case XLS_TOKEN( connections ): + if( nElement == XLS_TOKEN( connection ) ) + return new ConnectionContext( *this, getConnections().createConnection() ); + break; + } + return 0; } -void OoxConnectionsFragment::importTables( const AttributeList& /*rAttribs*/ ) +ContextHandlerRef ConnectionsFragment::onCreateRecordContext( sal_Int32 nRecId, SequenceInputStream& /*rStrm*/ ) { -// sal_Int32 nCount = rAttribs.getInteger( XML_count, 0 ); + switch( getCurrentElement() ) + { + case XML_ROOT_CONTEXT: + if( nRecId == BIFF12_ID_CONNECTIONS ) + return this; + break; + + case BIFF12_ID_CONNECTIONS: + if( nRecId == BIFF12_ID_CONNECTION ) + return new ConnectionContext( *this, getConnections().createConnection() ); + break; + } + return 0; } -void OoxConnectionsFragment::importS( const AttributeList& /*rAttribs*/ ) +const RecordInfo* ConnectionsFragment::getRecordInfos() const { -// OUString aName = rAttribs.getString( XML_v ); + static const RecordInfo spRecInfos[] = + { + { BIFF12_ID_CONNECTIONS, BIFF12_ID_CONNECTIONS + 1 }, + { BIFF12_ID_CONNECTION, BIFF12_ID_CONNECTION + 1 }, + { BIFF12_ID_WEBPR, BIFF12_ID_WEBPR + 1 }, + { BIFF12_ID_WEBPRTABLES, BIFF12_ID_WEBPRTABLES + 1 }, + { -1, -1 } + }; + return spRecInfos; } -void OoxConnectionsFragment::importX( const AttributeList& /*rAttribs*/ ) +void ConnectionsFragment::finalizeImport() { -// sal_Int32 nSharedId = rAttribs.getInteger( XML_v, 0 ); + getConnections().finalizeImport(); } +// ============================================================================ + } // namespace xls } // namespace oox - diff --git a/oox/source/xls/defnamesbuffer.cxx b/oox/source/xls/defnamesbuffer.cxx index a02375e2b869..96fcec0042f5 100644 --- a/oox/source/xls/defnamesbuffer.cxx +++ b/oox/source/xls/defnamesbuffer.cxx @@ -26,7 +26,7 @@ ************************************************************************/ #include "oox/xls/defnamesbuffer.hxx" -#include <rtl/ustrbuf.hxx> + #include <com/sun/star/sheet/ComplexReference.hpp> #include <com/sun/star/sheet/ExternalReference.hpp> #include <com/sun/star/sheet/NamedRangeFlag.hpp> @@ -34,8 +34,9 @@ #include <com/sun/star/sheet/SingleReference.hpp> #include <com/sun/star/sheet/XFormulaTokens.hpp> #include <com/sun/star/sheet/XPrintAreas.hpp> -#include "properties.hxx" +#include <rtl/ustrbuf.hxx> #include "oox/helper/attributelist.hxx" +#include "oox/helper/containerhelper.hxx" #include "oox/helper/propertyset.hxx" #include "oox/xls/addressconverter.hxx" #include "oox/xls/biffinputstream.hxx" @@ -43,34 +44,30 @@ #include "oox/xls/formulaparser.hxx" #include "oox/xls/worksheetbuffer.hxx" -using ::rtl::OUString; -using ::rtl::OUStringBuffer; -using ::com::sun::star::uno::Any; -using ::com::sun::star::uno::Reference; -using ::com::sun::star::uno::UNO_QUERY; -using ::com::sun::star::table::CellAddress; -using ::com::sun::star::table::CellRangeAddress; -using ::com::sun::star::sheet::ComplexReference; -using ::com::sun::star::sheet::ExternalReference; -using ::com::sun::star::sheet::SingleReference; -using ::com::sun::star::sheet::XFormulaTokens; -using ::com::sun::star::sheet::XPrintAreas; - namespace oox { namespace xls { // ============================================================================ +using namespace ::com::sun::star::sheet; +using namespace ::com::sun::star::table; +using namespace ::com::sun::star::uno; + +using ::rtl::OUString; +using ::rtl::OUStringBuffer; + +// ============================================================================ + namespace { -const sal_uInt32 OOBIN_DEFNAME_HIDDEN = 0x00000001; -const sal_uInt32 OOBIN_DEFNAME_FUNC = 0x00000002; -const sal_uInt32 OOBIN_DEFNAME_VBNAME = 0x00000004; -const sal_uInt32 OOBIN_DEFNAME_MACRO = 0x00000008; -const sal_uInt32 OOBIN_DEFNAME_CALCEXP = 0x00000010; -const sal_uInt32 OOBIN_DEFNAME_BUILTIN = 0x00000020; -const sal_uInt32 OOBIN_DEFNAME_PUBLISHED = 0x00008000; -const sal_uInt32 OOBIN_DEFNAME_WBPARAM = 0x00010000; +const sal_uInt32 BIFF12_DEFNAME_HIDDEN = 0x00000001; +const sal_uInt32 BIFF12_DEFNAME_FUNC = 0x00000002; +const sal_uInt32 BIFF12_DEFNAME_VBNAME = 0x00000004; +const sal_uInt32 BIFF12_DEFNAME_MACRO = 0x00000008; +const sal_uInt32 BIFF12_DEFNAME_CALCEXP = 0x00000010; +const sal_uInt32 BIFF12_DEFNAME_BUILTIN = 0x00000020; +const sal_uInt32 BIFF12_DEFNAME_PUBLISHED = 0x00008000; +const sal_uInt32 BIFF12_DEFNAME_WBPARAM = 0x00010000; const sal_uInt16 BIFF_DEFNAME_HIDDEN = 0x0001; const sal_uInt16 BIFF_DEFNAME_FUNC = 0x0002; @@ -84,6 +81,11 @@ const sal_uInt8 BIFF2_DEFNAME_FUNC = 0x02; /// BIFF2 function/comma const sal_uInt16 BIFF_DEFNAME_GLOBAL = 0; /// 0 = Globally defined name. +const sal_uInt16 BIFF_REFFLAG_COL1REL = 0x0001; +const sal_uInt16 BIFF_REFFLAG_ROW1REL = 0x0002; +const sal_uInt16 BIFF_REFFLAG_COL2REL = 0x0004; +const sal_uInt16 BIFF_REFFLAG_ROW2REL = 0x0008; + // ---------------------------------------------------------------------------- const sal_Char* const spcLegacyPrefix = "Excel_BuiltIn_"; @@ -91,20 +93,20 @@ const sal_Char* const spcOoxPrefix = "_xlnm."; const sal_Char* const sppcBaseNames[] = { - "Consolidate_Area", /* OOX */ + "Consolidate_Area", "Auto_Open", "Auto_Close", - "Extract", /* OOX */ - "Database", /* OOX */ - "Criteria", /* OOX */ - "Print_Area", /* OOX */ - "Print_Titles", /* OOX */ + "Extract", + "Database", + "Criteria", + "Print_Area", + "Print_Titles", "Recorder", "Data_Form", "Auto_Activate", "Auto_Deactivate", - "Sheet_Title", /* OOX */ - "_FilterDatabase" /* OOX */ + "Sheet_Title", + "_FilterDatabase" }; /** Localized names for _xlnm._FilterDatabase as used in BIFF5. */ @@ -116,7 +118,7 @@ const sal_Char* const sppcFilterDbNames[] = OUString lclGetBaseName( sal_Unicode cBuiltinId ) { - OSL_ENSURE( cBuiltinId < STATIC_ARRAY_SIZE( sppcBaseNames ), "lclGetBaseName - unknown builtin name" ); + OSL_ENSURE( cBuiltinId < STATIC_ARRAY_SIZE( sppcBaseNames ), "lclGetBaseName - unsupported built-in identifier" ); OUStringBuffer aBuffer; if( cBuiltinId < STATIC_ARRAY_SIZE( sppcBaseNames ) ) aBuffer.appendAscii( sppcBaseNames[ cBuiltinId ] ); @@ -125,67 +127,52 @@ OUString lclGetBaseName( sal_Unicode cBuiltinId ) return aBuffer.makeStringAndClear(); } -OUString lclGetBuiltinName( sal_Unicode cBuiltinId ) +OUString lclGetPrefixedName( sal_Unicode cBuiltinId ) { return OUStringBuffer().appendAscii( spcOoxPrefix ).append( lclGetBaseName( cBuiltinId ) ).makeStringAndClear(); } -sal_Unicode lclGetBuiltinIdFromOox( const OUString& rOoxName ) +/** returns the built-in name identifier from a perfixed built-in name, e.g. '_xlnm.Print_Area'. */ +sal_Unicode lclGetBuiltinIdFromPrefixedName( const OUString& rModelName ) { OUString aPrefix = OUString::createFromAscii( spcOoxPrefix ); sal_Int32 nPrefixLen = aPrefix.getLength(); - if( rOoxName.matchIgnoreAsciiCase( aPrefix ) ) + if( rModelName.matchIgnoreAsciiCase( aPrefix ) ) { for( sal_Unicode cBuiltinId = 0; cBuiltinId < STATIC_ARRAY_SIZE( sppcBaseNames ); ++cBuiltinId ) { OUString aBaseName = lclGetBaseName( cBuiltinId ); sal_Int32 nBaseNameLen = aBaseName.getLength(); - if( (rOoxName.getLength() == nPrefixLen + nBaseNameLen) && rOoxName.matchIgnoreAsciiCase( aBaseName, nPrefixLen ) ) + if( (rModelName.getLength() == nPrefixLen + nBaseNameLen) && rModelName.matchIgnoreAsciiCase( aBaseName, nPrefixLen ) ) return cBuiltinId; } } - return OOX_DEFNAME_UNKNOWN; + return BIFF_DEFNAME_UNKNOWN; } -sal_Unicode lclGetBuiltinIdFromOob( const OUString& rOobName ) +/** returns the built-in name identifier from a built-in base name, e.g. 'Print_Area'. */ +sal_Unicode lclGetBuiltinIdFromBaseName( const OUString& rModelName ) { for( sal_Unicode cBuiltinId = 0; cBuiltinId < STATIC_ARRAY_SIZE( sppcBaseNames ); ++cBuiltinId ) - if( rOobName.equalsIgnoreAsciiCaseAscii( sppcBaseNames[ cBuiltinId ] ) ) + if( rModelName.equalsIgnoreAsciiCaseAscii( sppcBaseNames[ cBuiltinId ] ) ) return cBuiltinId; - return OOX_DEFNAME_UNKNOWN; + return BIFF_DEFNAME_UNKNOWN; } -bool lclIsFilterDatabaseName( const OUString& rName ) +bool lclIsFilterDatabaseName( const OUString& rModelName ) { for( const sal_Char* const* ppcName = sppcFilterDbNames; ppcName < STATIC_ARRAY_END( sppcFilterDbNames ); ++ppcName ) - if( rName.equalsIgnoreAsciiCaseAscii( *ppcName ) ) + if( rModelName.equalsIgnoreAsciiCaseAscii( *ppcName ) ) return true; return false; } -} // namespace - -// ============================================================================ - -DefinedNameModel::DefinedNameModel() : - mnSheet( -1 ), - mnFuncGroupId( -1 ), - mbMacro( false ), - mbFunction( false ), - mbVBName( false ), - mbHidden( false ) +OUString lclGetUpcaseModelName( const OUString& rModelName ) { + // TODO: i18n? + return rModelName.toAsciiUpperCase(); } -// ============================================================================ - -namespace { - -const sal_uInt16 BIFF_REFFLAG_COL1REL = 0x0001; -const sal_uInt16 BIFF_REFFLAG_ROW1REL = 0x0002; -const sal_uInt16 BIFF_REFFLAG_COL2REL = 0x0004; -const sal_uInt16 BIFF_REFFLAG_ROW2REL = 0x0008; - void lclConvertRefFlags( sal_Int32& ornFlags, sal_Int32& ornAbsPos, sal_Int32& ornRelPos, sal_Int32 nBasePos, sal_Int32 nApiRelFlag, bool bRel ) { if( getFlag( ornFlags, nApiRelFlag ) && !bRel ) @@ -235,7 +222,19 @@ Any lclConvertReference( const Any& rRefAny, const CellAddress& rBaseAddress, sa } // namespace -// ---------------------------------------------------------------------------- +// ============================================================================ + +DefinedNameModel::DefinedNameModel() : + mnSheet( -1 ), + mnFuncGroupId( -1 ), + mbMacro( false ), + mbFunction( false ), + mbVBName( false ), + mbHidden( false ) +{ +} + +// ============================================================================ DefinedNameBase::DefinedNameBase( const WorkbookHelper& rHelper ) : WorkbookHelper( rHelper ) @@ -245,7 +244,7 @@ DefinedNameBase::DefinedNameBase( const WorkbookHelper& rHelper ) : const OUString& DefinedNameBase::getUpcaseModelName() const { if( maUpModelName.getLength() == 0 ) - maUpModelName = maModel.maName.toAsciiUpperCase(); + maUpModelName = lclGetUpcaseModelName( maModel.maName ); return maUpModelName; } @@ -288,7 +287,7 @@ void DefinedNameBase::importOoxFormula( FormulaContext& rContext, sal_Int16 nBas getFormulaParser().convertErrorToFormula( rContext, BIFF_ERR_NAME ); } -void DefinedNameBase::importOobFormula( FormulaContext& rContext, sal_Int16 nBaseSheet, RecordInputStream& rStrm ) +void DefinedNameBase::importBiff12Formula( FormulaContext& rContext, sal_Int16 nBaseSheet, SequenceInputStream& rStrm ) { rContext.setBaseAddress( CellAddress( nBaseSheet, 0, 0 ) ); getFormulaParser().importFormula( rContext, rStrm ); @@ -314,7 +313,7 @@ void DefinedNameBase::extractReference( const ApiTokenSequence& rTokens ) DefinedName::DefinedName( const WorkbookHelper& rHelper ) : DefinedNameBase( rHelper ), mnTokenIndex( -1 ), - mcBuiltinId( OOX_DEFNAME_UNKNOWN ), + mcBuiltinId( BIFF_DEFNAME_UNKNOWN ), mnFmlaSize( 0 ) { } @@ -328,8 +327,11 @@ void DefinedName::importDefinedName( const AttributeList& rAttribs ) maModel.mbFunction = rAttribs.getBool( XML_function, false ); maModel.mbVBName = rAttribs.getBool( XML_vbProcedure, false ); maModel.mbHidden = rAttribs.getBool( XML_hidden, false ); - mcBuiltinId = lclGetBuiltinIdFromOox( maModel.maName ); mnCalcSheet = (maModel.mnSheet >= 0) ? getWorksheets().getCalcSheetIndex( maModel.mnSheet ) : -1; + + /* Detect built-in state from name itself, there is no built-in flag. + Built-in names are prexixed with '_xlnm.' instead. */ + mcBuiltinId = lclGetBuiltinIdFromPrefixedName( maModel.maName ); } void DefinedName::setFormula( const OUString& rFormula ) @@ -337,7 +339,7 @@ void DefinedName::setFormula( const OUString& rFormula ) maModel.maFormula = rFormula; } -void DefinedName::importDefinedName( RecordInputStream& rStrm ) +void DefinedName::importDefinedName( SequenceInputStream& rStrm ) { sal_uInt32 nFlags; rStrm >> nFlags; @@ -347,17 +349,14 @@ void DefinedName::importDefinedName( RecordInputStream& rStrm ) // macro function/command, hidden flag maModel.mnFuncGroupId = extractValue< sal_Int32 >( nFlags, 6, 9 ); - maModel.mbMacro = getFlag( nFlags, OOBIN_DEFNAME_MACRO ); - maModel.mbFunction = getFlag( nFlags, OOBIN_DEFNAME_FUNC ); - maModel.mbVBName = getFlag( nFlags, OOBIN_DEFNAME_VBNAME ); - maModel.mbHidden = getFlag( nFlags, OOBIN_DEFNAME_HIDDEN ); - - // get builtin name index from name - if( getFlag( nFlags, OOBIN_DEFNAME_BUILTIN ) ) - mcBuiltinId = lclGetBuiltinIdFromOob( maModel.maName ); - // unhide built-in names (_xlnm._FilterDatabase is always hidden) - if( isBuiltinName() ) - maModel.mbHidden = false; + maModel.mbMacro = getFlag( nFlags, BIFF12_DEFNAME_MACRO ); + maModel.mbFunction = getFlag( nFlags, BIFF12_DEFNAME_FUNC ); + maModel.mbVBName = getFlag( nFlags, BIFF12_DEFNAME_VBNAME ); + maModel.mbHidden = getFlag( nFlags, BIFF12_DEFNAME_HIDDEN ); + + // get built-in name index from name + if( getFlag( nFlags, BIFF12_DEFNAME_BUILTIN ) ) + mcBuiltinId = lclGetBuiltinIdFromBaseName( maModel.maName ); // store token array data sal_Int64 nRecPos = rStrm.tell(); @@ -419,24 +418,22 @@ void DefinedName::importDefinedName( BiffInputStream& rStrm, sal_Int16 nCalcShee maModel.mbVBName = getFlag( nFlags, BIFF_DEFNAME_VBNAME ); maModel.mbHidden = getFlag( nFlags, BIFF_DEFNAME_HIDDEN ); - // get builtin name index from name + // get built-in name index from name if( getFlag( nFlags, BIFF_DEFNAME_BUILTIN ) ) { - OSL_ENSURE( maModel.maName.getLength() == 1, "DefinedName::importDefinedName - wrong builtin name" ); - if( maModel.maName.getLength() > 0 ) + // name may be the built-in identifier or the built-in base name + if( maModel.maName.getLength() == 1 ) mcBuiltinId = maModel.maName[ 0 ]; + else + mcBuiltinId = lclGetBuiltinIdFromBaseName( maModel.maName ); } - /* In BIFF5, _xlnm._FilterDatabase appears as hidden user name without + /* In BIFF5, '_FilterDatabase' appears as hidden user name without built-in flag, and even worse, localized. */ else if( (eBiff == BIFF5) && lclIsFilterDatabaseName( maModel.maName ) ) { - mcBuiltinId = OOX_DEFNAME_FILTERDATABASE; + mcBuiltinId = BIFF_DEFNAME_FILTERDATABASE; } - // unhide built-in names (_xlnm._FilterDatabase is always hidden) - if( isBuiltinName() ) - maModel.mbHidden = false; - // get sheet index for sheet-local names in BIFF5-BIFF8 switch( getBiff() ) { @@ -486,18 +483,13 @@ void DefinedName::importDefinedName( BiffInputStream& rStrm, sal_Int16 nCalcShee void DefinedName::createNameObject() { - // do not create names for (macro) functions + // do not create names for (macro) functions or VBA procedures // #163146# do not ignore hidden names (may be regular names created by VBA scripts) - if( /*maModel.mbHidden ||*/ maModel.mbFunction ) + if( /*maModel.mbHidden ||*/ maModel.mbFunction || maModel.mbVBName ) return; - // convert original name to final Calc name - if( maModel.mbVBName ) - maCalcName = maModel.maName; - else if( isBuiltinName() ) - maCalcName = lclGetBuiltinName( mcBuiltinId ); - else - maCalcName = maModel.maName; //! TODO convert to valid name + // convert original name to final Calc name (TODO: filter invalid characters from model name) + maCalcName = isBuiltinName() ? lclGetPrefixedName( mcBuiltinId ) : maModel.maName; // #163146# do not rename sheet-local names by default, this breaks VBA scripts #if 0 @@ -512,9 +504,9 @@ void DefinedName::createNameObject() using namespace ::com::sun::star::sheet::NamedRangeFlag; if( !isGlobalName() ) switch( mcBuiltinId ) { - case OOX_DEFNAME_CRITERIA: nNameFlags = FILTER_CRITERIA; break; - case OOX_DEFNAME_PRINTAREA: nNameFlags = PRINT_AREA; break; - case OOX_DEFNAME_PRINTTITLES: nNameFlags = COLUMN_HEADER | ROW_HEADER; break; + case BIFF_DEFNAME_CRITERIA: nNameFlags = FILTER_CRITERIA; break; + case BIFF_DEFNAME_PRINTAREA: nNameFlags = PRINT_AREA; break; + case BIFF_DEFNAME_PRINTTITLES: nNameFlags = COLUMN_HEADER | ROW_HEADER; break; } // create the name and insert it into the document, maCalcName will be changed to the resulting name @@ -532,7 +524,7 @@ void DefinedName::convertFormula() // convert and set formula of the defined name switch( getFilterType() ) { - case FILTER_OOX: + case FILTER_OOXML: { SimpleFormulaContext aContext( xTokens, true, false ); implImportOoxFormula( aContext ); @@ -547,10 +539,10 @@ void DefinedName::convertFormula() case FILTER_UNKNOWN: break; } - // set builtin names (print ranges, repeated titles, filter ranges) + // set built-in names (print ranges, repeated titles, filter ranges) if( !isGlobalName() ) switch( mcBuiltinId ) { - case OOX_DEFNAME_PRINTAREA: + case BIFF_DEFNAME_PRINTAREA: { Reference< XPrintAreas > xPrintAreas( getSheetFromDoc( mnCalcSheet ), UNO_QUERY ); ApiCellRangeList aPrintRanges; @@ -559,7 +551,7 @@ void DefinedName::convertFormula() xPrintAreas->setPrintAreas( ContainerHelper::vectorToSequence( aPrintRanges ) ); } break; - case OOX_DEFNAME_PRINTTITLES: + case BIFF_DEFNAME_PRINTTITLES: { Reference< XPrintAreas > xPrintAreas( getSheetFromDoc( mnCalcSheet ), UNO_QUERY ); ApiCellRangeList aTitleRanges; @@ -605,8 +597,8 @@ void DefinedName::implImportOoxFormula( FormulaContext& rContext ) { if( mxFormula.get() ) { - RecordInputStream aStrm( *mxFormula ); - importOobFormula( rContext, mnCalcSheet, aStrm ); + SequenceInputStream aStrm( *mxFormula ); + importBiff12Formula( rContext, mnCalcSheet, aStrm ); } else importOoxFormula( rContext, mnCalcSheet ); @@ -643,7 +635,7 @@ DefinedNameRef DefinedNamesBuffer::importDefinedName( const AttributeList& rAttr return xDefName; } -void DefinedNamesBuffer::importDefinedName( RecordInputStream& rStrm ) +void DefinedNamesBuffer::importDefinedName( SequenceInputStream& rStrm ) { createDefinedName()->importDefinedName( rStrm ); } @@ -655,14 +647,20 @@ void DefinedNamesBuffer::importDefinedName( BiffInputStream& rStrm ) void DefinedNamesBuffer::finalizeImport() { - // first insert all names without formula definition into the document + // first insert all names without formula definition into the document, and insert them into the maps for( DefNameVector::iterator aIt = maDefNames.begin(), aEnd = maDefNames.end(); aIt != aEnd; ++aIt ) { DefinedNameRef xDefName = *aIt; xDefName->createNameObject(); + // map by sheet index and original model name + maModelNameMap[ SheetNameKey( xDefName->getLocalCalcSheet(), xDefName->getUpcaseModelName() ) ] = xDefName; + // map by sheet index and built-in identifier + if( !xDefName->isGlobalName() && xDefName->isBuiltinName() ) + maBuiltinMap[ BuiltinKey( xDefName->getLocalCalcSheet(), xDefName->getBuiltinId() ) ] = xDefName; + // map by API formula token identifier sal_Int32 nTokenIndex = xDefName->getTokenIndex(); if( nTokenIndex >= 0 ) - maDefNameMap[ nTokenIndex ] = xDefName; + maTokenIdMap[ nTokenIndex ] = xDefName; } /* Now convert all name formulas, so that the formula parser can find all @@ -677,25 +675,22 @@ DefinedNameRef DefinedNamesBuffer::getByIndex( sal_Int32 nIndex ) const DefinedNameRef DefinedNamesBuffer::getByTokenIndex( sal_Int32 nIndex ) const { - return maDefNameMap.get( nIndex ); + return maTokenIdMap.get( nIndex ); } DefinedNameRef DefinedNamesBuffer::getByModelName( const OUString& rModelName, sal_Int16 nCalcSheet ) const { - DefinedNameRef xGlobalName; // a found global name - DefinedNameRef xLocalName; // a found local name - for( DefNameVector::const_iterator aIt = maDefNames.begin(), aEnd = maDefNames.end(); (aIt != aEnd) && !xLocalName; ++aIt ) - { - DefinedNameRef xCurrName = *aIt; - if( xCurrName->getModelName() == rModelName ) - { - if( xCurrName->getLocalCalcSheet() == nCalcSheet ) - xLocalName = xCurrName; - else if( xCurrName->isGlobalName() ) - xGlobalName = xCurrName; - } - } - return xLocalName.get() ? xLocalName : xGlobalName; + OUString aUpcaseName = lclGetUpcaseModelName( rModelName ); + DefinedNameRef xDefName = maModelNameMap.get( SheetNameKey( nCalcSheet, aUpcaseName ) ); + // lookup global name, if no local name exists + if( !xDefName && (nCalcSheet >= 0) ) + xDefName = maModelNameMap.get( SheetNameKey( -1, aUpcaseName ) ); + return xDefName; +} + +DefinedNameRef DefinedNamesBuffer::getByBuiltinId( sal_Unicode cBuiltinId, sal_Int16 nCalcSheet ) const +{ + return maBuiltinMap.get( BuiltinKey( nCalcSheet, cBuiltinId ) ); } DefinedNameRef DefinedNamesBuffer::createDefinedName() @@ -709,4 +704,3 @@ DefinedNameRef DefinedNamesBuffer::createDefinedName() } // namespace xls } // namespace oox - diff --git a/oox/source/xls/drawingfragment.cxx b/oox/source/xls/drawingfragment.cxx index 172530692923..e28608f728c6 100644 --- a/oox/source/xls/drawingfragment.cxx +++ b/oox/source/xls/drawingfragment.cxx @@ -26,19 +26,18 @@ ************************************************************************/ #include "oox/xls/drawingfragment.hxx" -#include <com/sun/star/awt/Point.hpp> -#include <com/sun/star/beans/NamedValue.hpp> -#include <com/sun/star/form/binding/XBindableValue.hpp> -#include <com/sun/star/form/binding/XListEntrySink.hpp> -#include <com/sun/star/form/binding/XListEntrySource.hpp> -#include <com/sun/star/form/binding/XValueBinding.hpp> -#include "properties.hxx" -#include "oox/helper/attributelist.hxx" -#include "oox/helper/propertyset.hxx" + +#include <com/sun/star/beans/PropertyValue.hpp> +#include <com/sun/star/container/XNameReplace.hpp> +#include <com/sun/star/document/XEventsSupplier.hpp> +#include <com/sun/star/drawing/XControlShape.hpp> +#include <com/sun/star/script/ScriptEventDescriptor.hpp> +#include <com/sun/star/script/XEventAttacherManager.hpp> +#include <rtl/strbuf.hxx> #include "oox/drawingml/connectorshapecontext.hxx" #include "oox/drawingml/graphicshapecontext.hxx" -#include "oox/drawingml/shapecontext.hxx" -#include "oox/drawingml/shapegroupcontext.hxx" +#include "oox/helper/attributelist.hxx" +#include "oox/helper/propertyset.hxx" #include "oox/vml/vmlshape.hxx" #include "oox/vml/vmlshapecontainer.hxx" #include "oox/xls/formulaparser.hxx" @@ -46,40 +45,33 @@ #include "oox/xls/themebuffer.hxx" #include "oox/xls/unitconverter.hxx" -using ::rtl::OUString; -using ::com::sun::star::uno::Any; -using ::com::sun::star::uno::Exception; -using ::com::sun::star::uno::Reference; -using ::com::sun::star::uno::Sequence; -using ::com::sun::star::uno::UNO_QUERY; -using ::com::sun::star::uno::UNO_QUERY_THROW; -using ::com::sun::star::beans::NamedValue; -using ::com::sun::star::awt::Point; -using ::com::sun::star::awt::Rectangle; -using ::com::sun::star::awt::Size; -using ::com::sun::star::awt::XControlModel; -using ::com::sun::star::form::binding::XBindableValue; -using ::com::sun::star::form::binding::XListEntrySink; -using ::com::sun::star::form::binding::XListEntrySource; -using ::com::sun::star::form::binding::XValueBinding; -using ::com::sun::star::drawing::XShape; -using ::com::sun::star::table::CellAddress; -using ::com::sun::star::table::CellRangeAddress; -using ::oox::core::ContextHandlerRef; -using ::oox::drawingml::ConnectorShapeContext; -using ::oox::drawingml::GraphicalObjectFrameContext; -using ::oox::drawingml::GraphicShapeContext; -using ::oox::drawingml::Shape; -using ::oox::drawingml::ShapePtr; -using ::oox::drawingml::ShapeContext; -using ::oox::drawingml::ShapeGroupContext; -// no using's for ::oox::vml, that may clash with ::oox::drawingml types - namespace oox { namespace xls { // ============================================================================ +using namespace ::com::sun::star::awt; +using namespace ::com::sun::star::beans; +using namespace ::com::sun::star::container; +using namespace ::com::sun::star::document; +using namespace ::com::sun::star::drawing; +using namespace ::com::sun::star::script; +using namespace ::com::sun::star::table; +using namespace ::com::sun::star::uno; +using namespace ::com::sun::star::xml::sax; +using namespace ::oox::core; +using namespace ::oox::drawingml; +using namespace ::oox::ole; + +using ::rtl::OStringBuffer; +using ::rtl::OUString; +using ::rtl::OUStringToOString; +// no using's for ::oox::vml, that may clash with ::oox::drawingml types + +// ============================================================================ +// DrawingML +// ============================================================================ + namespace { /** Converts the passed 64-bit integer value from the passed unit to EMUs. */ @@ -418,19 +410,120 @@ Rectangle ShapeAnchor::calcEmuLocation( const AnchorSizeModel& rEmuSheetSize ) c // ============================================================================ -OoxDrawingFragment::OoxDrawingFragment( const WorksheetHelper& rHelper, const OUString& rFragmentPath ) : - OoxWorksheetFragmentBase( rHelper, rFragmentPath ), +ShapeMacroAttacher::ShapeMacroAttacher( const OUString& rMacroName, const Reference< XShape >& rxShape ) : + VbaMacroAttacherBase( rMacroName ), + mxShape( rxShape ) +{ +} + +void ShapeMacroAttacher::attachMacro( const OUString& rMacroUrl ) +{ + try + { + Reference< XEventsSupplier > xSupplier( mxShape, UNO_QUERY_THROW ); + Reference< XNameReplace > xEvents( xSupplier->getEvents(), UNO_SET_THROW ); + Sequence< PropertyValue > aEventProps( 2 ); + aEventProps[ 0 ].Name = CREATE_OUSTRING( "EventType" ); + aEventProps[ 0 ].Value <<= CREATE_OUSTRING( "Script" ); + aEventProps[ 1 ].Name = CREATE_OUSTRING( "Script" ); + aEventProps[ 1 ].Value <<= rMacroUrl; + xEvents->replaceByName( CREATE_OUSTRING( "OnClick" ), Any( aEventProps ) ); + } + catch( Exception& ) + { + } +} + +// ============================================================================ + +Shape::Shape( const WorksheetHelper& rHelper, const AttributeList& rAttribs, const sal_Char* pcServiceName ) : + ::oox::drawingml::Shape( pcServiceName ), + WorksheetHelper( rHelper ) +{ + OUString aMacro = rAttribs.getXString( XML_macro, OUString() ); + if( aMacro.getLength() > 0 ) + maMacroName = getFormulaParser().importMacroName( aMacro ); +} + +void Shape::finalizeXShape( XmlFilterBase& rFilter, const Reference< XShapes >& rxShapes ) +{ + if( (maMacroName.getLength() > 0) && mxShape.is() ) + { + VbaMacroAttacherRef xAttacher( new ShapeMacroAttacher( maMacroName, mxShape ) ); + getBaseFilter().getVbaProject().registerMacroAttacher( xAttacher ); + } + ::oox::drawingml::Shape::finalizeXShape( rFilter, rxShapes ); +} + +// ============================================================================ + +GroupShapeContext::GroupShapeContext( ContextHandler& rParent, + const WorksheetHelper& rHelper, const ShapePtr& rxParentShape, const ShapePtr& rxShape ) : + ShapeGroupContext( rParent, rxParentShape, rxShape ), + WorksheetHelper( rHelper ) +{ +} + +/*static*/ ContextHandlerRef GroupShapeContext::createShapeContext( ContextHandler& rParent, + const WorksheetHelper& rHelper, sal_Int32 nElement, const AttributeList& rAttribs, + const ShapePtr& rxParentShape, ShapePtr* pxShape ) +{ + switch( nElement ) + { + case XDR_TOKEN( sp ): + { + ShapePtr xShape( new Shape( rHelper, rAttribs, "com.sun.star.drawing.CustomShape" ) ); + if( pxShape ) *pxShape = xShape; + return new ShapeContext( rParent, rxParentShape, xShape ); + } + case XDR_TOKEN( cxnSp ): + { + ShapePtr xShape( new Shape( rHelper, rAttribs, "com.sun.star.drawing.ConnectorShape" ) ); + if( pxShape ) *pxShape = xShape; + return new ConnectorShapeContext( rParent, rxParentShape, xShape ); + } + case XDR_TOKEN( pic ): + { + ShapePtr xShape( new Shape( rHelper, rAttribs, "com.sun.star.drawing.GraphicObjectShape" ) ); + if( pxShape ) *pxShape = xShape; + return new GraphicShapeContext( rParent, rxParentShape, xShape ); + } + case XDR_TOKEN( graphicFrame ): + { + ShapePtr xShape( new Shape( rHelper, rAttribs, "com.sun.star.drawing.GraphicObjectShape" ) ); + if( pxShape ) *pxShape = xShape; + return new GraphicalObjectFrameContext( rParent, rxParentShape, xShape, rHelper.getSheetType() != SHEETTYPE_CHARTSHEET ); + } + case XDR_TOKEN( grpSp ): + { + ShapePtr xShape( new Shape( rHelper, rAttribs, "com.sun.star.drawing.GroupShape" ) ); + if( pxShape ) *pxShape = xShape; + return new GroupShapeContext( rParent, rHelper, rxParentShape, xShape ); + } + } + return 0; +} + +Reference< XFastContextHandler > SAL_CALL GroupShapeContext::createFastChildContext( + sal_Int32 nElement, const Reference< XFastAttributeList >& rxAttribs ) throw (SAXException, RuntimeException) +{ + ContextHandlerRef xContext = createShapeContext( *this, *this, nElement, AttributeList( rxAttribs ), mpGroupShapePtr ); + return xContext.get() ? xContext.get() : ShapeGroupContext::createFastChildContext( nElement, rxAttribs ); +} + +// ============================================================================ + +DrawingFragment::DrawingFragment( const WorksheetHelper& rHelper, const OUString& rFragmentPath ) : + WorksheetFragmentBase( rHelper, rFragmentPath ), mxDrawPage( rHelper.getDrawPage(), UNO_QUERY ) { - OSL_ENSURE( mxDrawPage.is(), "OoxDrawingFragment::OoxDrawingFragment - missing drawing page" ); + OSL_ENSURE( mxDrawPage.is(), "DrawingFragment::DrawingFragment - missing drawing page" ); maApiSheetSize = getDrawPageSize(); maEmuSheetSize.Width = static_cast< sal_Int64 >( getUnitConverter().scaleFromMm100( maApiSheetSize.Width, UNIT_EMU ) ); maEmuSheetSize.Height = static_cast< sal_Int64 >( getUnitConverter().scaleFromMm100( maApiSheetSize.Height, UNIT_EMU ) ); } -// oox.core.ContextHandler2Helper interface ----------------------------------- - -ContextHandlerRef OoxDrawingFragment::onCreateContext( sal_Int32 nElement, const AttributeList& rAttribs ) +ContextHandlerRef DrawingFragment::onCreateContext( sal_Int32 nElement, const AttributeList& rAttribs ) { switch( getCurrentElement() ) { @@ -453,31 +546,19 @@ ContextHandlerRef OoxDrawingFragment::onCreateContext( sal_Int32 nElement, const case XDR_TOKEN( absoluteAnchor ): case XDR_TOKEN( oneCellAnchor ): case XDR_TOKEN( twoCellAnchor ): + { switch( nElement ) { - case XDR_TOKEN( sp ): - mxShape.reset( new Shape( "com.sun.star.drawing.CustomShape" ) ); - return new ShapeContext( *this, ShapePtr(), mxShape ); - case XDR_TOKEN( cxnSp ): - mxShape.reset( new Shape( "com.sun.star.drawing.ConnectorShape" ) ); - return new ConnectorShapeContext( *this, ShapePtr(), mxShape ); - case XDR_TOKEN( pic ): - mxShape.reset( new Shape( "com.sun.star.drawing.GraphicObjectShape" ) ); - return new GraphicShapeContext( *this, ShapePtr(), mxShape ); - case XDR_TOKEN( graphicFrame ): - mxShape.reset( new Shape( "com.sun.star.drawing.OLE2Shape" ) ); - return new GraphicalObjectFrameContext( *this, ShapePtr(), mxShape, getSheetType() != SHEETTYPE_CHARTSHEET ); - case XDR_TOKEN( grpSp ): - mxShape.reset( new Shape( "com.sun.star.drawing.GroupShape" ) ); - return new ShapeGroupContext( *this, ShapePtr(), mxShape ); - case XDR_TOKEN( from ): case XDR_TOKEN( to ): return this; case XDR_TOKEN( pos ): if( mxAnchor.get() ) mxAnchor->importPos( rAttribs ); break; case XDR_TOKEN( ext ): if( mxAnchor.get() ) mxAnchor->importExt( rAttribs ); break; case XDR_TOKEN( clientData ): if( mxAnchor.get() ) mxAnchor->importClientData( rAttribs ); break; + + default: return GroupShapeContext::createShapeContext( *this, *this, nElement, rAttribs, ShapePtr(), &mxShape ); } + } break; case XDR_TOKEN( from ): @@ -487,14 +568,14 @@ ContextHandlerRef OoxDrawingFragment::onCreateContext( sal_Int32 nElement, const case XDR_TOKEN( col ): case XDR_TOKEN( row ): case XDR_TOKEN( colOff ): - case XDR_TOKEN( rowOff ): return this; // collect index in onEndElement() + case XDR_TOKEN( rowOff ): return this; // collect index in onCharacters() } break; } return 0; } -void OoxDrawingFragment::onEndElement( const OUString& rChars ) +void DrawingFragment::onCharacters( const OUString& rChars ) { switch( getCurrentElement() ) { @@ -502,8 +583,15 @@ void OoxDrawingFragment::onEndElement( const OUString& rChars ) case XDR_TOKEN( row ): case XDR_TOKEN( colOff ): case XDR_TOKEN( rowOff ): - if( mxAnchor.get() ) mxAnchor->setCellPos( getCurrentElement(), getPreviousElement(), rChars ); + if( mxAnchor.get() ) mxAnchor->setCellPos( getCurrentElement(), getParentElement(), rChars ); break; + } +} + +void DrawingFragment::onEndElement() +{ + switch( getCurrentElement() ) + { case XDR_TOKEN( absoluteAnchor ): case XDR_TOKEN( oneCellAnchor ): case XDR_TOKEN( twoCellAnchor ): @@ -513,8 +601,15 @@ void OoxDrawingFragment::onEndElement( const OUString& rChars ) if( (aShapeRect.X >= 0) && (aShapeRect.Y >= 0) && (aShapeRect.Width >= 0) && (aShapeRect.Height >= 0) ) { mxShape->addShape( getOoxFilter(), &getTheme(), mxDrawPage, &aShapeRect ); - // collect all shape positions in the WorksheetHelper base class - extendShapeBoundingBox( aShapeRect ); + /* Collect all shape positions in the WorksheetHelper base + class. But first, scale EMUs to 1/100 mm. */ + const UnitConverter& rUnitConv = getUnitConverter(); + Rectangle aShapeRectHmm( + rUnitConv.scaleToMm100( aShapeRect.X, UNIT_EMU ), + rUnitConv.scaleToMm100( aShapeRect.Y, UNIT_EMU ), + rUnitConv.scaleToMm100( aShapeRect.Width, UNIT_EMU ), + rUnitConv.scaleToMm100( aShapeRect.Height, UNIT_EMU ) ); + extendShapeBoundingBox( aShapeRectHmm ); } } mxShape.reset(); @@ -524,6 +619,8 @@ void OoxDrawingFragment::onEndElement( const OUString& rChars ) } // ============================================================================ +// VML +// ============================================================================ namespace { @@ -538,6 +635,8 @@ private: sal_Int32 mnRow; }; +// ---------------------------------------------------------------------------- + VmlFindNoteFunc::VmlFindNoteFunc( const CellAddress& rPos ) : mnCol( rPos.Column ), mnRow( rPos.Row ) @@ -546,18 +645,88 @@ VmlFindNoteFunc::VmlFindNoteFunc( const CellAddress& rPos ) : bool VmlFindNoteFunc::operator()( const ::oox::vml::ShapeBase& rShape ) const { - const ::oox::vml::ShapeModel::ShapeClientDataPtr& rxClientData = rShape.getShapeModel().mxClientData; - return rxClientData.get() && (rxClientData->mnCol == mnCol) && (rxClientData->mnRow == mnRow); + const ::oox::vml::ClientData* pClientData = rShape.getClientData(); + return pClientData && (pClientData->mnCol == mnCol) && (pClientData->mnRow == mnRow); } } // namespace -// ---------------------------------------------------------------------------- +// ============================================================================ + +VmlControlMacroAttacher::VmlControlMacroAttacher( const OUString& rMacroName, + const Reference< XIndexContainer >& rxCtrlFormIC, sal_Int32 nCtrlIndex, sal_Int32 nCtrlType, sal_Int32 nDropStyle ) : + VbaMacroAttacherBase( rMacroName ), + mxCtrlFormIC( rxCtrlFormIC ), + mnCtrlIndex( nCtrlIndex ), + mnCtrlType( nCtrlType ), + mnDropStyle( nDropStyle ) +{ +} + +void VmlControlMacroAttacher::attachMacro( const OUString& rMacroUrl ) +{ + ScriptEventDescriptor aEventDesc; + aEventDesc.ScriptType = CREATE_OUSTRING( "Script" ); + aEventDesc.ScriptCode = rMacroUrl; + + // editable drop downs are treated like edit boxes + bool bEditDropDown = (mnCtrlType == XML_Drop) && (mnDropStyle == XML_ComboEdit); + sal_Int32 nCtrlType = bEditDropDown ? XML_Edit : mnCtrlType; + + switch( nCtrlType ) + { + case XML_Button: + case XML_Checkbox: + case XML_Radio: + aEventDesc.ListenerType = CREATE_OUSTRING( "XActionListener" ); + aEventDesc.EventMethod = CREATE_OUSTRING( "actionPerformed" ); + break; + case XML_Label: + case XML_GBox: + case XML_Dialog: + aEventDesc.ListenerType = CREATE_OUSTRING( "XMouseListener" ); + aEventDesc.EventMethod = CREATE_OUSTRING( "mouseReleased" ); + break; + case XML_Edit: + aEventDesc.ListenerType = CREATE_OUSTRING( "XTextListener" ); + aEventDesc.EventMethod = CREATE_OUSTRING( "textChanged" ); + break; + case XML_Spin: + case XML_Scroll: + aEventDesc.ListenerType = CREATE_OUSTRING( "XAdjustmentListener" ); + aEventDesc.EventMethod = CREATE_OUSTRING( "adjustmentValueChanged" ); + break; + case XML_List: + case XML_Drop: + aEventDesc.ListenerType = CREATE_OUSTRING( "XChangeListener" ); + aEventDesc.EventMethod = CREATE_OUSTRING( "changed" ); + break; + default: + OSL_ENSURE( false, "VmlControlMacroAttacher::attachMacro - unexpected object type" ); + return; + } + + try + { + Reference< XEventAttacherManager > xEventMgr( mxCtrlFormIC, UNO_QUERY_THROW ); + xEventMgr->registerScriptEvent( mnCtrlIndex, aEventDesc ); + } + catch( Exception& ) + { + } +} + +// ============================================================================ VmlDrawing::VmlDrawing( const WorksheetHelper& rHelper ) : ::oox::vml::Drawing( rHelper.getOoxFilter(), rHelper.getDrawPage(), ::oox::vml::VMLDRAWING_EXCEL ), - WorksheetHelper( rHelper ) + WorksheetHelper( rHelper ), + maControlConv( rHelper.getBaseFilter().getModel(), rHelper.getBaseFilter().getGraphicHelper() ) { + // default font for legacy listboxes and dropdowns: Tahoma, 8pt + maListBoxFont.moName = CREATE_OUSTRING( "Tahoma" ); + maListBoxFont.moColor = CREATE_OUSTRING( "auto" ); + maListBoxFont.monSize = 160; } const ::oox::vml::ShapeBase* VmlDrawing::getNoteShape( const CellAddress& rPos ) const @@ -567,11 +736,35 @@ const ::oox::vml::ShapeBase* VmlDrawing::getNoteShape( const CellAddress& rPos ) bool VmlDrawing::isShapeSupported( const ::oox::vml::ShapeBase& rShape ) const { - const ::oox::vml::ShapeModel::ShapeClientDataPtr& rxClientData = rShape.getShapeModel().mxClientData; - return !rxClientData.get() || (rxClientData->mnObjType != XML_Note); + const ::oox::vml::ClientData* pClientData = rShape.getClientData(); + return !pClientData || (pClientData->mnObjType != XML_Note); +} + +OUString VmlDrawing::getShapeBaseName( const ::oox::vml::ShapeBase& rShape ) const +{ + if( const ::oox::vml::ClientData* pClientData = rShape.getClientData() ) + { + switch( pClientData->mnObjType ) + { + case XML_Button: return CREATE_OUSTRING( "Button" ); + case XML_Checkbox: return CREATE_OUSTRING( "Check Box" ); + case XML_Dialog: return CREATE_OUSTRING( "Dialog Frame" ); + case XML_Drop: return CREATE_OUSTRING( "Drop Down" ); + case XML_Edit: return CREATE_OUSTRING( "Edit Box" ); + case XML_GBox: return CREATE_OUSTRING( "Group Box" ); + case XML_Label: return CREATE_OUSTRING( "Label" ); + case XML_List: return CREATE_OUSTRING( "List Box" ); + case XML_Note: return CREATE_OUSTRING( "Comment" ); + case XML_Pict: return (pClientData->mbDde || getOleObjectInfo( rShape.getShapeId() )) ? CREATE_OUSTRING( "Object" ) : CREATE_OUSTRING( "Picture" ); + case XML_Radio: return CREATE_OUSTRING( "Option Button" ); + case XML_Scroll: return CREATE_OUSTRING( "Scroll Bar" ); + case XML_Spin: return CREATE_OUSTRING( "Spinner" ); + } + } + return ::oox::vml::Drawing::getShapeBaseName( rShape ); } -bool VmlDrawing::convertShapeClientAnchor( Rectangle& orShapeRect, const OUString& rShapeAnchor ) const +bool VmlDrawing::convertClientAnchor( Rectangle& orShapeRect, const OUString& rShapeAnchor ) const { if( rShapeAnchor.getLength() == 0 ) return false; @@ -581,71 +774,206 @@ bool VmlDrawing::convertShapeClientAnchor( Rectangle& orShapeRect, const OUStrin return (orShapeRect.Width >= 0) && (orShapeRect.Height >= 0); } -void VmlDrawing::convertControlClientData( const Reference< XControlModel >& rxCtrlModel, - const ::oox::vml::ShapeClientData& rClientData ) const +Reference< XShape > VmlDrawing::createAndInsertClientXShape( const ::oox::vml::ShapeBase& rShape, + const Reference< XShapes >& rxShapes, const Rectangle& rShapeRect ) const { - if( rxCtrlModel.is() ) + // simulate the legacy drawing controls with OLE form controls + OUString aShapeName = rShape.getShapeName(); + const ::oox::vml::ClientData* pClientData = rShape.getClientData(); + if( (aShapeName.getLength() > 0) && pClientData ) { - PropertySet aPropSet( rxCtrlModel ); + Rectangle aShapeRect = rShapeRect; + const ::oox::vml::TextBox* pTextBox = rShape.getTextBox(); + EmbeddedControl aControl( aShapeName ); + switch( pClientData->mnObjType ) + { + case XML_Button: + { + AxCommandButtonModel& rAxModel = aControl.createModel< AxCommandButtonModel >(); + convertControlText( rAxModel.maFontData, rAxModel.mnTextColor, rAxModel.maCaption, pTextBox, pClientData->mnTextHAlign ); + rAxModel.mnFlags = AX_FLAGS_ENABLED | AX_FLAGS_OPAQUE | AX_FLAGS_WORDWRAP; + rAxModel.mnVerticalAlign = pClientData->mnTextVAlign; + } + break; - // printable - aPropSet.setProperty( PROP_Printable, rClientData.mbPrintObject ); + case XML_Label: + { + AxLabelModel& rAxModel = aControl.createModel< AxLabelModel >(); + convertControlText( rAxModel.maFontData, rAxModel.mnTextColor, rAxModel.maCaption, pTextBox, pClientData->mnTextHAlign ); + rAxModel.mnFlags = AX_FLAGS_ENABLED | AX_FLAGS_WORDWRAP; + rAxModel.mnBorderStyle = AX_BORDERSTYLE_NONE; + rAxModel.mnSpecialEffect = AX_SPECIALEFFECT_FLAT; + rAxModel.mnVerticalAlign = pClientData->mnTextVAlign; + } + break; - // linked cell - if( rClientData.maLinkedCell.getLength() > 0 ) try - { - Reference< XBindableValue > xBindable( rxCtrlModel, UNO_QUERY_THROW ); - - // convert formula string to cell address - FormulaParser& rParser = getFormulaParser(); - TokensFormulaContext aContext( true, false ); - aContext.setBaseAddress( CellAddress( getSheetIndex(), 0, 0 ) ); - rParser.importFormula( aContext, rClientData.maLinkedCell ); - CellAddress aAddress; - if( rParser.extractCellAddress( aAddress, aContext.getTokens(), true ) ) + case XML_Edit: { - // create argument sequence for createInstanceWithArguments() - NamedValue aValue; - aValue.Name = CREATE_OUSTRING( "BoundCell" ); - aValue.Value <<= aAddress; - Sequence< Any > aArgs( 1 ); - aArgs[ 0 ] <<= aValue; - - // create the CellValueBinding instance and set at the control model - Reference< XValueBinding > xBinding( getDocumentFactory()->createInstanceWithArguments( - CREATE_OUSTRING( "com.sun.star.table.CellValueBinding" ), aArgs ), UNO_QUERY_THROW ); - xBindable->setValueBinding( xBinding ); + bool bNumeric = (pClientData->mnVTEdit == ::oox::vml::VML_CLIENTDATA_INTEGER) || (pClientData->mnVTEdit == ::oox::vml::VML_CLIENTDATA_NUMBER); + AxMorphDataModelBase& rAxModel = bNumeric ? + static_cast< AxMorphDataModelBase& >( aControl.createModel< AxNumericFieldModel >() ) : + static_cast< AxMorphDataModelBase& >( aControl.createModel< AxTextBoxModel >() ); + convertControlText( rAxModel.maFontData, rAxModel.mnTextColor, rAxModel.maValue, pTextBox, pClientData->mnTextHAlign ); + setFlag( rAxModel.mnFlags, AX_FLAGS_MULTILINE, pClientData->mbMultiLine ); + setFlag( rAxModel.mnScrollBars, AX_SCROLLBAR_VERTICAL, pClientData->mbVScroll ); + if( pClientData->mbSecretEdit ) + rAxModel.mnPasswordChar = '*'; } - } - catch( Exception& ) - { + break; + + case XML_GBox: + { + AxFrameModel& rAxModel = aControl.createModel< AxFrameModel >(); + convertControlText( rAxModel.maFontData, rAxModel.mnTextColor, rAxModel.maCaption, pTextBox, pClientData->mnTextHAlign ); + rAxModel.mnBorderStyle = pClientData->mbNo3D ? AX_BORDERSTYLE_SINGLE : AX_BORDERSTYLE_NONE; + rAxModel.mnSpecialEffect = pClientData->mbNo3D ? AX_SPECIALEFFECT_FLAT : AX_SPECIALEFFECT_BUMPED; + + /* Move top border of groupbox up by half font height, because + Excel specifies Y position of the groupbox border line + instead the top border of the caption text. */ + if( const ::oox::vml::TextFontModel* pFontModel = pTextBox ? pTextBox->getFirstFont() : 0 ) + { + sal_Int32 nFontHeightHmm = getUnitConverter().scaleToMm100( pFontModel->monSize.get( 160 ), UNIT_TWIP ); + sal_Int32 nYDiff = ::std::min< sal_Int32 >( nFontHeightHmm / 2, aShapeRect.Y ); + aShapeRect.Y -= nYDiff; + aShapeRect.Height += nYDiff; + } + } + break; + + case XML_Checkbox: + { + AxCheckBoxModel& rAxModel = aControl.createModel< AxCheckBoxModel >(); + convertControlText( rAxModel.maFontData, rAxModel.mnTextColor, rAxModel.maCaption, pTextBox, pClientData->mnTextHAlign ); + convertControlBackground( rAxModel, rShape ); + rAxModel.maValue = OUString::valueOf( pClientData->mnChecked ); + rAxModel.mnSpecialEffect = pClientData->mbNo3D ? AX_SPECIALEFFECT_FLAT : AX_SPECIALEFFECT_SUNKEN; + rAxModel.mnVerticalAlign = pClientData->mnTextVAlign; + bool bTriState = (pClientData->mnChecked != ::oox::vml::VML_CLIENTDATA_UNCHECKED) && (pClientData->mnChecked != ::oox::vml::VML_CLIENTDATA_CHECKED); + rAxModel.mnMultiSelect = bTriState ? AX_SELCTION_MULTI : AX_SELCTION_SINGLE; + } + break; + + case XML_Radio: + { + AxOptionButtonModel& rAxModel = aControl.createModel< AxOptionButtonModel >(); + convertControlText( rAxModel.maFontData, rAxModel.mnTextColor, rAxModel.maCaption, pTextBox, pClientData->mnTextHAlign ); + convertControlBackground( rAxModel, rShape ); + rAxModel.maValue = OUString::valueOf( pClientData->mnChecked ); + rAxModel.mnSpecialEffect = pClientData->mbNo3D ? AX_SPECIALEFFECT_FLAT : AX_SPECIALEFFECT_SUNKEN; + rAxModel.mnVerticalAlign = pClientData->mnTextVAlign; + } + break; + + case XML_List: + { + AxListBoxModel& rAxModel = aControl.createModel< AxListBoxModel >(); + convertControlFontData( rAxModel.maFontData, rAxModel.mnTextColor, maListBoxFont ); + rAxModel.mnBorderStyle = pClientData->mbNo3D2 ? AX_BORDERSTYLE_SINGLE : AX_BORDERSTYLE_NONE; + rAxModel.mnSpecialEffect = pClientData->mbNo3D2 ? AX_SPECIALEFFECT_FLAT : AX_SPECIALEFFECT_SUNKEN; + switch( pClientData->mnSelType ) + { + case XML_Single: rAxModel.mnMultiSelect = AX_SELCTION_SINGLE; break; + case XML_Multi: rAxModel.mnMultiSelect = AX_SELCTION_MULTI; break; + case XML_Extend: rAxModel.mnMultiSelect = AX_SELCTION_EXTENDED; break; + } + } + break; + + case XML_Drop: + { + AxComboBoxModel& rAxModel = aControl.createModel< AxComboBoxModel >(); + convertControlFontData( rAxModel.maFontData, rAxModel.mnTextColor, maListBoxFont ); + rAxModel.mnDisplayStyle = AX_DISPLAYSTYLE_DROPDOWN; + rAxModel.mnShowDropButton = AX_SHOWDROPBUTTON_ALWAYS; + rAxModel.mnBorderStyle = pClientData->mbNo3D2 ? AX_BORDERSTYLE_SINGLE : AX_BORDERSTYLE_NONE; + rAxModel.mnSpecialEffect = pClientData->mbNo3D2 ? AX_SPECIALEFFECT_FLAT : AX_SPECIALEFFECT_SUNKEN; + rAxModel.mnListRows = pClientData->mnDropLines; + } + break; + + case XML_Spin: + { + AxSpinButtonModel& rAxModel = aControl.createModel< AxSpinButtonModel >(); + rAxModel.mnMin = pClientData->mnMin; + rAxModel.mnMax = pClientData->mnMax; + rAxModel.mnPosition = pClientData->mnVal; + rAxModel.mnSmallChange = pClientData->mnInc; + } + break; + + case XML_Scroll: + { + AxScrollBarModel& rAxModel = aControl.createModel< AxScrollBarModel >(); + rAxModel.mnMin = pClientData->mnMin; + rAxModel.mnMax = pClientData->mnMax; + rAxModel.mnPosition = pClientData->mnVal; + rAxModel.mnSmallChange = pClientData->mnInc; + rAxModel.mnLargeChange = pClientData->mnPage; + } + break; + + case XML_Dialog: + { + // fake with a group box + AxFrameModel& rAxModel = aControl.createModel< AxFrameModel >(); + convertControlText( rAxModel.maFontData, rAxModel.mnTextColor, rAxModel.maCaption, pTextBox, XML_Left ); + rAxModel.mnBorderStyle = AX_BORDERSTYLE_SINGLE; + rAxModel.mnSpecialEffect = AX_SPECIALEFFECT_FLAT; + } + break; } - // source range - if( rClientData.maSourceRange.getLength() > 0 ) try + if( ControlModelBase* pAxModel = aControl.getModel() ) { - Reference< XListEntrySink > xEntrySink( rxCtrlModel, UNO_QUERY_THROW ); - - // convert formula string to cell range - FormulaParser& rParser = getFormulaParser(); - TokensFormulaContext aContext( true, false ); - aContext.setBaseAddress( CellAddress( getSheetIndex(), 0, 0 ) ); - rParser.importFormula( aContext, rClientData.maSourceRange ); - CellRangeAddress aRange; - if( rParser.extractCellRange( aRange, aContext.getTokens(), true ) ) + // create the control shape + pAxModel->maSize.first = aShapeRect.Width; + pAxModel->maSize.second = aShapeRect.Height; + sal_Int32 nCtrlIndex = -1; + Reference< XShape > xShape = createAndInsertXControlShape( aControl, rxShapes, aShapeRect, nCtrlIndex ); + + // control shape macro + if( xShape.is() && (nCtrlIndex >= 0) && (pClientData->maFmlaMacro.getLength() > 0) ) { - // create argument sequence for createInstanceWithArguments() - NamedValue aValue; - aValue.Name = CREATE_OUSTRING( "CellRange" ); - aValue.Value <<= aRange; - Sequence< Any > aArgs( 1 ); - aArgs[ 0 ] <<= aValue; - - // create the EntrySource instance and set at the control model - Reference< XListEntrySource > xEntrySource( getDocumentFactory()->createInstanceWithArguments( - CREATE_OUSTRING( "com.sun.star.table.CellRangeListSource" ), aArgs ), UNO_QUERY_THROW ); - xEntrySink->setListEntrySource( xEntrySource ); + OUString aMacroName = getFormulaParser().importMacroName( pClientData->maFmlaMacro ); + if( aMacroName.getLength() > 0 ) + { + Reference< XIndexContainer > xFormIC = getControlForm().getXForm(); + VbaMacroAttacherRef xAttacher( new VmlControlMacroAttacher( aMacroName, xFormIC, nCtrlIndex, pClientData->mnObjType, pClientData->mnDropStyle ) ); + getBaseFilter().getVbaProject().registerMacroAttacher( xAttacher ); + } } + + return xShape; + } + } + + return Reference< XShape >(); +} + +void VmlDrawing::notifyXShapeInserted( const Reference< XShape >& rxShape, + const Rectangle& rShapeRect, const ::oox::vml::ShapeBase& rShape, bool bGroupChild ) +{ + // collect all shape positions in the WorksheetHelper base class (but not children of group shapes) + if( !bGroupChild ) + extendShapeBoundingBox( rShapeRect ); + + // convert settings from VML client data + if( const ::oox::vml::ClientData* pClientData = rShape.getClientData() ) + { + // specific settings for embedded form controls + try + { + Reference< XControlShape > xCtrlShape( rxShape, UNO_QUERY_THROW ); + Reference< XControlModel > xCtrlModel( xCtrlShape->getControl(), UNO_SET_THROW ); + PropertySet aPropSet( xCtrlModel ); + + // printable + aPropSet.setProperty( PROP_Printable, pClientData->mbPrintObject ); + + // control source links + if( (pClientData->maFmlaLink.getLength() > 0) || (pClientData->maFmlaRange.getLength() > 0) ) + maControlConv.bindToSources( xCtrlModel, pClientData->maFmlaLink, pClientData->maFmlaRange, getSheetIndex() ); } catch( Exception& ) { @@ -653,21 +981,113 @@ void VmlDrawing::convertControlClientData( const Reference< XControlModel >& rxC } } -void VmlDrawing::notifyShapeInserted( const Reference< XShape >& /*rxShape*/, const Rectangle& rShapeRect ) +// private -------------------------------------------------------------------- + +sal_uInt32 VmlDrawing::convertControlTextColor( const OUString& rTextColor ) const { - // collect all shape positions in the WorksheetHelper base class - extendShapeBoundingBox( rShapeRect ); + // color attribute not present or 'auto' - use passed default color + if( (rTextColor.getLength() == 0) || rTextColor.equalsIgnoreAsciiCaseAsciiL( RTL_CONSTASCII_STRINGPARAM( "auto" ) ) ) + return AX_SYSCOLOR_WINDOWTEXT; + + if( rTextColor[ 0 ] == '#' ) + { + // RGB colors in the format '#RRGGBB' + if( rTextColor.getLength() == 7 ) + return OleHelper::encodeOleColor( rTextColor.copy( 1 ).toInt32( 16 ) ); + + // RGB colors in the format '#RGB' + if( rTextColor.getLength() == 4 ) + { + sal_Int32 nR = rTextColor.copy( 1, 1 ).toInt32( 16 ) * 0x11; + sal_Int32 nG = rTextColor.copy( 2, 1 ).toInt32( 16 ) * 0x11; + sal_Int32 nB = rTextColor.copy( 3, 1 ).toInt32( 16 ) * 0x11; + return OleHelper::encodeOleColor( (nR << 16) | (nG << 8) | nB ); + } + + OSL_ENSURE( false, OStringBuffer( "VmlDrawing::convertControlTextColor - invalid color name '" ). + append( OUStringToOString( rTextColor, RTL_TEXTENCODING_ASCII_US ) ).append( '\'' ).getStr() ); + return AX_SYSCOLOR_WINDOWTEXT; + } + + const GraphicHelper& rGraphicHelper = getBaseFilter().getGraphicHelper(); + + /* Predefined color names or system color names (resolve to RGB to detect + valid color name). */ + sal_Int32 nColorToken = AttributeConversion::decodeToken( rTextColor ); + sal_Int32 nRgbValue = Color::getVmlPresetColor( nColorToken, API_RGB_TRANSPARENT ); + if( nRgbValue == API_RGB_TRANSPARENT ) + nRgbValue = rGraphicHelper.getSystemColor( nColorToken, API_RGB_TRANSPARENT ); + if( nRgbValue != API_RGB_TRANSPARENT ) + return OleHelper::encodeOleColor( nRgbValue ); + + // try palette color + return OleHelper::encodeOleColor( rGraphicHelper.getPaletteColor( rTextColor.toInt32() ) ); +} + +void VmlDrawing::convertControlFontData( AxFontData& rAxFontData, sal_uInt32& rnOleTextColor, const ::oox::vml::TextFontModel& rFontModel ) const +{ + if( rFontModel.moName.has() ) + rAxFontData.maFontName = rFontModel.moName.get(); + + // font height: convert from twips to points, then to internal representation of AX controls + rAxFontData.setHeightPoints( static_cast< sal_Int16 >( (rFontModel.monSize.get( 200 ) + 10) / 20 ) ); + + // font effects + rAxFontData.mnFontEffects = 0; + setFlag( rAxFontData.mnFontEffects, AX_FONTDATA_BOLD, rFontModel.mobBold.get( false ) ); + setFlag( rAxFontData.mnFontEffects, AX_FONTDATA_ITALIC, rFontModel.mobItalic.get( false ) ); + setFlag( rAxFontData.mnFontEffects, AX_FONTDATA_STRIKEOUT, rFontModel.mobStrikeout.get( false ) ); + sal_Int32 nUnderline = rFontModel.monUnderline.get( XML_none ); + setFlag( rAxFontData.mnFontEffects, AX_FONTDATA_UNDERLINE, nUnderline != XML_none ); + rAxFontData.mbDblUnderline = nUnderline == XML_double; + + // font color + rnOleTextColor = convertControlTextColor( rFontModel.moColor.get( OUString() ) ); +} + +void VmlDrawing::convertControlText( AxFontData& rAxFontData, sal_uInt32& rnOleTextColor, + OUString& rCaption, const ::oox::vml::TextBox* pTextBox, sal_Int32 nTextHAlign ) const +{ + if( pTextBox ) + { + rCaption = pTextBox->getText(); + if( const ::oox::vml::TextFontModel* pFontModel = pTextBox->getFirstFont() ) + convertControlFontData( rAxFontData, rnOleTextColor, *pFontModel ); + } + + switch( nTextHAlign ) + { + case XML_Left: rAxFontData.mnHorAlign = AX_FONTDATA_LEFT; break; + case XML_Center: rAxFontData.mnHorAlign = AX_FONTDATA_CENTER; break; + case XML_Right: rAxFontData.mnHorAlign = AX_FONTDATA_RIGHT; break; + default: rAxFontData.mnHorAlign = AX_FONTDATA_LEFT; + } +} + +void VmlDrawing::convertControlBackground( AxMorphDataModelBase& rAxModel, const ::oox::vml::ShapeBase& rShape ) const +{ + const ::oox::vml::FillModel& rFillModel = rShape.getTypeModel().maFillModel; + bool bHasFill = rFillModel.moFilled.get( true ); + setFlag( rAxModel.mnFlags, AX_FLAGS_OPAQUE, bHasFill ); + if( bHasFill ) + { + const GraphicHelper& rGraphicHelper = getBaseFilter().getGraphicHelper(); + sal_Int32 nSysWindowColor = rGraphicHelper.getSystemColor( XML_window, API_RGB_WHITE ); + ::oox::drawingml::Color aColor = ::oox::vml::ConversionHelper::decodeColor( rGraphicHelper, rFillModel.moColor, rFillModel.moOpacity, nSysWindowColor ); + sal_Int32 nRgbValue = aColor.getColor( rGraphicHelper ); + rAxModel.mnBackColor = OleHelper::encodeOleColor( nRgbValue ); + } } // ============================================================================ -OoxVmlDrawingFragment::OoxVmlDrawingFragment( const WorksheetHelper& rHelper, const OUString& rFragmentPath ) : +VmlDrawingFragment::VmlDrawingFragment( const WorksheetHelper& rHelper, const OUString& rFragmentPath ) : ::oox::vml::DrawingFragment( rHelper.getOoxFilter(), rFragmentPath, rHelper.getVmlDrawing() ), WorksheetHelper( rHelper ) { } -void OoxVmlDrawingFragment::finalizeImport() +void VmlDrawingFragment::finalizeImport() { ::oox::vml::DrawingFragment::finalizeImport(); getVmlDrawing().convertAndInsert(); @@ -677,4 +1097,3 @@ void OoxVmlDrawingFragment::finalizeImport() } // namespace xls } // namespace oox - diff --git a/oox/source/xls/excelchartconverter.cxx b/oox/source/xls/excelchartconverter.cxx index bde3dd65d723..53c0a3b83bf2 100644 --- a/oox/source/xls/excelchartconverter.cxx +++ b/oox/source/xls/excelchartconverter.cxx @@ -26,30 +26,30 @@ ************************************************************************/ #include "oox/xls/excelchartconverter.hxx" + #include <com/sun/star/lang/XMultiServiceFactory.hpp> #include <com/sun/star/chart2/data/XDataProvider.hpp> #include <com/sun/star/chart2/data/XDataReceiver.hpp> #include "oox/drawingml/chart/datasourcemodel.hxx" +#include "oox/helper/containerhelper.hxx" #include "oox/xls/formulaparser.hxx" -using ::rtl::OUString; -using ::com::sun::star::uno::Any; -using ::com::sun::star::uno::Reference; -using ::com::sun::star::uno::Exception; -using ::com::sun::star::uno::UNO_QUERY_THROW; -using ::com::sun::star::lang::XMultiServiceFactory; -using ::com::sun::star::table::CellAddress; -using ::com::sun::star::chart2::XChartDocument; -using ::com::sun::star::chart2::data::XDataProvider; -using ::com::sun::star::chart2::data::XDataReceiver; -using ::com::sun::star::chart2::data::XDataSequence; -using ::oox::drawingml::chart::DataSequenceModel; - namespace oox { namespace xls { // ============================================================================ +using namespace ::com::sun::star::chart2; +using namespace ::com::sun::star::chart2::data; +using namespace ::com::sun::star::lang; +using namespace ::com::sun::star::table; +using namespace ::com::sun::star::uno; + +using ::oox::drawingml::chart::DataSequenceModel; +using ::rtl::OUString; + +// ============================================================================ + ExcelChartConverter::ExcelChartConverter( const WorkbookHelper& rHelper ) : WorkbookHelper( rHelper ) { @@ -122,4 +122,3 @@ Reference< XDataSequence > ExcelChartConverter::createDataSequence( } // namespace xls } // namespace oox - diff --git a/oox/source/xls/excelfilter.cxx b/oox/source/xls/excelfilter.cxx index 5affbfff44a7..aeac1494c338 100644 --- a/oox/source/xls/excelfilter.cxx +++ b/oox/source/xls/excelfilter.cxx @@ -26,36 +26,35 @@ ************************************************************************/ #include "oox/xls/excelfilter.hxx" + +#include <com/sun/star/sheet/XSpreadsheetDocument.hpp> +#include "oox/dump/biffdumper.hxx" +#include "oox/dump/xlsbdumper.hxx" #include "oox/helper/binaryinputstream.hxx" #include "oox/xls/biffdetector.hxx" #include "oox/xls/biffinputstream.hxx" #include "oox/xls/excelchartconverter.hxx" +#include "oox/xls/excelvbaproject.hxx" #include "oox/xls/stylesbuffer.hxx" #include "oox/xls/themebuffer.hxx" #include "oox/xls/workbookfragment.hxx" -#include "oox/dump/biffdumper.hxx" -#include "oox/dump/xlsbdumper.hxx" - -using ::rtl::OUString; -using ::com::sun::star::uno::Any; -using ::com::sun::star::uno::Reference; -using ::com::sun::star::uno::Sequence; -using ::com::sun::star::uno::Exception; -using ::com::sun::star::uno::XInterface; -using ::com::sun::star::lang::XMultiServiceFactory; -using ::com::sun::star::xml::sax::XFastDocumentHandler; -using ::oox::core::BinaryFilterBase; -using ::oox::core::FragmentHandlerRef; -using ::oox::core::Relation; -using ::oox::core::Relations; -using ::oox::core::XmlFilterBase; -using ::oox::drawingml::table::TableStyleListPtr; namespace oox { namespace xls { // ============================================================================ +using namespace ::com::sun::star::lang; +using namespace ::com::sun::star::sheet; +using namespace ::com::sun::star::uno; +using namespace ::com::sun::star::xml::sax; +using namespace ::oox::core; + +using ::rtl::OUString; +using ::oox::drawingml::table::TableStyleListPtr; + +// ============================================================================ + ExcelFilterBase::ExcelFilterBase() : mpData( 0 ) { @@ -86,26 +85,27 @@ void ExcelFilterBase::unregisterWorkbookData() OUString SAL_CALL ExcelFilter_getImplementationName() throw() { - return CREATE_OUSTRING( "com.sun.star.comp.oox.ExcelFilter" ); + return CREATE_OUSTRING( "com.sun.star.comp.oox.xls.ExcelFilter" ); } Sequence< OUString > SAL_CALL ExcelFilter_getSupportedServiceNames() throw() { - OUString aServiceName = CREATE_OUSTRING( "com.sun.star.comp.oox.ExcelFilter" ); - Sequence< OUString > aSeq( &aServiceName, 1 ); + Sequence< OUString > aSeq( 2 ); + aSeq[ 0 ] = CREATE_OUSTRING( "com.sun.star.document.ImportFilter" ); + aSeq[ 1 ] = CREATE_OUSTRING( "com.sun.star.document.ExportFilter" ); return aSeq; } Reference< XInterface > SAL_CALL ExcelFilter_createInstance( - const Reference< XMultiServiceFactory >& rxGlobalFactory ) throw( Exception ) + const Reference< XComponentContext >& rxContext ) throw( Exception ) { - return static_cast< ::cppu::OWeakObject* >( new ExcelFilter( rxGlobalFactory ) ); + return static_cast< ::cppu::OWeakObject* >( new ExcelFilter( rxContext ) ); } // ---------------------------------------------------------------------------- -ExcelFilter::ExcelFilter( const Reference< XMultiServiceFactory >& rxGlobalFactory ) : - XmlFilterBase( rxGlobalFactory ) +ExcelFilter::ExcelFilter( const Reference< XComponentContext >& rxContext ) throw( RuntimeException ) : + XmlFilterBase( rxContext ) { } @@ -121,12 +121,12 @@ bool ExcelFilter::importDocument() throw() this variable (nonpro only). */ OOX_DUMP_FILE( ::oox::dump::xlsb::Dumper ); - OUString aWorkbookPath = getFragmentPathFromFirstType( CREATE_OFFICEDOC_RELATIONSTYPE( "officeDocument" ) ); + OUString aWorkbookPath = getFragmentPathFromFirstType( CREATE_OFFICEDOC_RELATION_TYPE( "officeDocument" ) ); if( aWorkbookPath.getLength() == 0 ) return false; WorkbookHelperRoot aHelper( *this ); - return aHelper.isValid() && importFragment( new OoxWorkbookFragment( aHelper, aWorkbookPath ) ); + return aHelper.isValid() && importFragment( new WorkbookFragment( aHelper, aWorkbookPath ) ); } bool ExcelFilter::exportDocument() throw() @@ -159,6 +159,11 @@ GraphicHelper* ExcelFilter::implCreateGraphicHelper() const return new ExcelGraphicHelper( getWorkbookData() ); } +::oox::ole::VbaProject* ExcelFilter::implCreateVbaProject() const +{ + return new ExcelVbaProject( getComponentContext(), Reference< XSpreadsheetDocument >( getModel(), UNO_QUERY ) ); +} + OUString ExcelFilter::implGetImplementationName() const { return ExcelFilter_getImplementationName(); @@ -168,26 +173,27 @@ OUString ExcelFilter::implGetImplementationName() const OUString SAL_CALL ExcelBiffFilter_getImplementationName() throw() { - return CREATE_OUSTRING( "com.sun.star.comp.oox.ExcelBiffFilter" ); + return CREATE_OUSTRING( "com.sun.star.comp.oox.xls.ExcelBiffFilter" ); } Sequence< OUString > SAL_CALL ExcelBiffFilter_getSupportedServiceNames() throw() { - OUString aServiceName = CREATE_OUSTRING( "com.sun.star.comp.oox.ExcelBiffFilter" ); - Sequence< OUString > aSeq( &aServiceName, 1 ); + Sequence< OUString > aSeq( 2 ); + aSeq[ 0 ] = CREATE_OUSTRING( "com.sun.star.document.ImportFilter" ); + aSeq[ 1 ] = CREATE_OUSTRING( "com.sun.star.document.ExportFilter" ); return aSeq; } Reference< XInterface > SAL_CALL ExcelBiffFilter_createInstance( - const Reference< XMultiServiceFactory >& rxGlobalFactory ) throw( Exception ) + const Reference< XComponentContext >& rxContext ) throw( Exception ) { - return static_cast< ::cppu::OWeakObject* >( new ExcelBiffFilter( rxGlobalFactory ) ); + return static_cast< ::cppu::OWeakObject* >( new ExcelBiffFilter( rxContext ) ); } // ---------------------------------------------------------------------------- -ExcelBiffFilter::ExcelBiffFilter( const Reference< XMultiServiceFactory >& rxGlobalFactory ) : - BinaryFilterBase( rxGlobalFactory ) +ExcelBiffFilter::ExcelBiffFilter( const Reference< XComponentContext >& rxContext ) throw( RuntimeException ) : + BinaryFilterBase( rxContext ) { } @@ -233,6 +239,11 @@ GraphicHelper* ExcelBiffFilter::implCreateGraphicHelper() const return new ExcelGraphicHelper( getWorkbookData() ); } +::oox::ole::VbaProject* ExcelBiffFilter::implCreateVbaProject() const +{ + return new ExcelVbaProject( getComponentContext(), Reference< XSpreadsheetDocument >( getModel(), UNO_QUERY ) ); +} + OUString ExcelBiffFilter::implGetImplementationName() const { return ExcelBiffFilter_getImplementationName(); @@ -240,5 +251,64 @@ OUString ExcelBiffFilter::implGetImplementationName() const // ============================================================================ +OUString SAL_CALL ExcelVbaProjectFilter_getImplementationName() throw() +{ + return CREATE_OUSTRING( "com.sun.star.comp.oox.xls.ExcelVbaProjectFilter" ); +} + +Sequence< OUString > SAL_CALL ExcelVbaProjectFilter_getSupportedServiceNames() throw() +{ + Sequence< OUString > aSeq( 1 ); + aSeq[ 0 ] = CREATE_OUSTRING( "com.sun.star.document.ImportFilter" ); + return aSeq; +} + +Reference< XInterface > SAL_CALL ExcelVbaProjectFilter_createInstance( + const Reference< XComponentContext >& rxContext ) throw( Exception ) +{ + return static_cast< ::cppu::OWeakObject* >( new ExcelVbaProjectFilter( rxContext ) ); +} + +// ---------------------------------------------------------------------------- + +ExcelVbaProjectFilter::ExcelVbaProjectFilter( const Reference< XComponentContext >& rxContext ) throw( RuntimeException ) : + ExcelBiffFilter( rxContext ) +{ +} + +bool ExcelVbaProjectFilter::importDocument() throw() +{ + // detect BIFF version and workbook stream name + OUString aWorkbookName; + BiffType eBiff = BiffDetector::detectStorageBiffVersion( aWorkbookName, getStorage() ); + OSL_ENSURE( eBiff == BIFF8, "ExcelVbaProjectFilter::ExcelVbaProjectFilter - invalid file format" ); + if( eBiff != BIFF8 ) + return false; + + StorageRef xVbaPrjStrg = openSubStorage( CREATE_OUSTRING( "_VBA_PROJECT_CUR" ), false ); + if( !xVbaPrjStrg || !xVbaPrjStrg->isStorage() ) + return false; + + WorkbookHelperRoot aHelper( *this, eBiff ); + // set palette colors passed in service constructor + Any aPalette = getArgument( CREATE_OUSTRING( "ColorPalette" ) ); + aHelper.getStyles().importPalette( aPalette ); + // import the VBA project + getVbaProject().importVbaProject( *xVbaPrjStrg, getGraphicHelper() ); + return true; +} + +bool ExcelVbaProjectFilter::exportDocument() throw() +{ + return false; +} + +OUString ExcelVbaProjectFilter::implGetImplementationName() const +{ + return ExcelVbaProjectFilter_getImplementationName(); +} + +// ============================================================================ + } // namespace xls } // namespace oox diff --git a/oox/source/xls/excelhandlers.cxx b/oox/source/xls/excelhandlers.cxx index aaf551424483..1ffad94d52f1 100644 --- a/oox/source/xls/excelhandlers.cxx +++ b/oox/source/xls/excelhandlers.cxx @@ -26,20 +26,23 @@ ************************************************************************/ #include "oox/xls/excelhandlers.hxx" + #include "oox/core/filterbase.hxx" #include "oox/xls/biffinputstream.hxx" -using ::rtl::OUString; -using ::oox::core::FilterBase; -using ::oox::core::FragmentHandler2; - namespace oox { namespace xls { // ============================================================================ + +using ::oox::core::FilterBase; +using ::oox::core::FragmentHandler2; +using ::rtl::OUString; + +// ============================================================================ // ============================================================================ -OoxWorkbookFragmentBase::OoxWorkbookFragmentBase( +WorkbookFragmentBase::WorkbookFragmentBase( const WorkbookHelper& rHelper, const OUString& rFragmentPath ) : FragmentHandler2( rHelper.getOoxFilter(), rFragmentPath ), WorkbookHelper( rHelper ) @@ -48,14 +51,14 @@ OoxWorkbookFragmentBase::OoxWorkbookFragmentBase( // ============================================================================ -OoxWorksheetFragmentBase::OoxWorksheetFragmentBase( const WorkbookHelper& rHelper, - const OUString& rFragmentPath, ISegmentProgressBarRef xProgressBar, WorksheetType eSheetType, sal_Int16 nSheet ) : +WorksheetFragmentBase::WorksheetFragmentBase( const WorkbookHelper& rHelper, + const OUString& rFragmentPath, const ISegmentProgressBarRef& rxProgressBar, WorksheetType eSheetType, sal_Int16 nSheet ) : FragmentHandler2( rHelper.getOoxFilter(), rFragmentPath ), - WorksheetHelperRoot( rHelper, xProgressBar, eSheetType, nSheet ) + WorksheetHelperRoot( rHelper, rxProgressBar, eSheetType, nSheet ) { } -OoxWorksheetFragmentBase::OoxWorksheetFragmentBase( +WorksheetFragmentBase::WorksheetFragmentBase( const WorksheetHelper& rHelper, const OUString& rFragmentPath ) : FragmentHandler2( rHelper.getOoxFilter(), rFragmentPath ), WorksheetHelperRoot( rHelper ) @@ -65,108 +68,52 @@ OoxWorksheetFragmentBase::OoxWorksheetFragmentBase( // ============================================================================ // ============================================================================ -namespace { - -const sal_uInt16 BIFF_BOF_GLOBALS = 0x0005; /// BIFF5-BIFF8 workbook globals. -const sal_uInt16 BIFF_BOF_MODULE = 0x0006; /// BIFF5-BIFF8 Visual Basic module. -const sal_uInt16 BIFF_BOF_SHEET = 0x0010; /// BIFF2-BIFF8 worksheet/dialog sheet. -const sal_uInt16 BIFF_BOF_CHART = 0x0020; /// BIFF2-BIFF8 chart sheet. -const sal_uInt16 BIFF_BOF_MACRO = 0x0040; /// BIFF4-BIFF8 macro sheet. -const sal_uInt16 BIFF_BOF_WORKSPACE = 0x0100; /// BIFF3-BIFF8 workspace. - -} // namespace - -// ============================================================================ - -BiffHandlerBase::~BiffHandlerBase() -{ -} - -bool BiffHandlerBase::skipRecordBlock( sal_uInt16 nEndRecId ) -{ - sal_uInt16 nStartRecId = mrStrm.getRecId(); - while( mrStrm.startNextRecord() && (mrStrm.getRecId() != nEndRecId) ) - if( mrStrm.getRecId() == nStartRecId ) - skipRecordBlock( nEndRecId ); - return !mrStrm.isEof() && (mrStrm.getRecId() == nEndRecId); -} - -bool BiffHandlerBase::isBofRecord() const -{ - return - (mrStrm.getRecId() == BIFF2_ID_BOF) || - (mrStrm.getRecId() == BIFF3_ID_BOF) || - (mrStrm.getRecId() == BIFF4_ID_BOF) || - (mrStrm.getRecId() == BIFF5_ID_BOF); -} - -// ============================================================================ - -BiffContextHandler::BiffContextHandler( const BiffHandlerBase& rParent ) : - BiffHandlerBase( rParent ) +BiffContextHandler::~BiffContextHandler() { } -// ============================================================================ - -namespace prv { - -BiffFragmentStreamOwner::BiffFragmentStreamOwner( const FilterBase& rFilter, const OUString& rStrmName ) -{ - // do not automatically close the root stream (indicated by empty stream name) - mxXInStrm.reset( new BinaryXInputStream( rFilter.openInputStream( rStrmName ), rStrmName.getLength() > 0 ) ); - mxBiffStrm.reset( new BiffInputStream( *mxXInStrm ) ); -} +// ---------------------------------------------------------------------------- -BiffFragmentStreamOwner::~BiffFragmentStreamOwner() +BiffWorkbookContextBase::BiffWorkbookContextBase( const WorkbookHelper& rHelper ) : + WorkbookHelper( rHelper ) { } -} // namespace prv - // ---------------------------------------------------------------------------- -BiffFragmentHandler::BiffFragmentHandler( const FilterBase& rFilter, const OUString& rStrmName ) : - prv::BiffFragmentStreamOwner( rFilter, rStrmName ), - BiffHandlerBase( *mxBiffStrm ) +BiffWorksheetContextBase::BiffWorksheetContextBase( const WorkbookHelper& rHelper, + const ISegmentProgressBarRef& rxProgressBar, WorksheetType eSheetType, sal_Int16 nSheet ) : + WorksheetHelperRoot( rHelper, rxProgressBar, eSheetType, nSheet ) { } -BiffFragmentHandler::BiffFragmentHandler( const BiffFragmentHandler& rHandler ) : - prv::BiffFragmentStreamOwner( rHandler ), - BiffHandlerBase( rHandler ) +BiffWorksheetContextBase::BiffWorksheetContextBase( const WorksheetHelper& rHelper ) : + WorksheetHelperRoot( rHelper ) { } -BiffFragmentType BiffFragmentHandler::startFragment( BiffType eBiff ) -{ - return mrStrm.startNextRecord() ? implStartFragment( eBiff ) : BIFF_FRAGMENT_UNKNOWN; -} +// ============================================================================ -BiffFragmentType BiffFragmentHandler::startFragment( BiffType eBiff, sal_Int64 nRecHandle ) -{ - return mrStrm.startRecordByHandle( nRecHandle ) ? implStartFragment( eBiff ) : BIFF_FRAGMENT_UNKNOWN; -} +namespace { -bool BiffFragmentHandler::skipFragment() -{ - while( mrStrm.startNextRecord() && (mrStrm.getRecId() != BIFF_ID_EOF) ) - if( isBofRecord() ) - skipFragment(); - return !mrStrm.isEof() && (mrStrm.getRecId() == BIFF_ID_EOF); -} +const sal_uInt16 BIFF_BOF_GLOBALS = 0x0005; /// BIFF5-BIFF8 workbook globals. +const sal_uInt16 BIFF_BOF_MODULE = 0x0006; /// BIFF5-BIFF8 Visual Basic module. +const sal_uInt16 BIFF_BOF_SHEET = 0x0010; /// BIFF2-BIFF8 worksheet/dialog sheet. +const sal_uInt16 BIFF_BOF_CHART = 0x0020; /// BIFF2-BIFF8 chart sheet. +const sal_uInt16 BIFF_BOF_MACRO = 0x0040; /// BIFF4-BIFF8 macro sheet. +const sal_uInt16 BIFF_BOF_WORKSPACE = 0x0100; /// BIFF3-BIFF8 workspace. -BiffFragmentType BiffFragmentHandler::implStartFragment( BiffType eBiff ) +BiffFragmentType lclStartFragment( BiffInputStream& rStrm, BiffType eBiff ) { BiffFragmentType eFragment = BIFF_FRAGMENT_UNKNOWN; /* #i23425# Don't rely on BOF record ID to read BOF contents, but on the detected BIFF version. */ - if( isBofRecord() ) + if( BiffHelper::isBofRecord( rStrm ) ) { // BOF is always written unencrypted - mrStrm.enableDecoder( false ); - mrStrm.skip( 2 ); - sal_uInt16 nType = mrStrm.readuInt16(); + rStrm.enableDecoder( false ); + rStrm.skip( 2 ); + sal_uInt16 nType = rStrm.readuInt16(); // decide which fragment types are valid for current BIFF version switch( eBiff ) @@ -219,30 +166,64 @@ BiffFragmentType BiffFragmentHandler::implStartFragment( BiffType eBiff ) return eFragment; } -// ============================================================================ +} // namespace + +// ---------------------------------------------------------------------------- + +BiffFragmentHandler::BiffFragmentHandler( const FilterBase& rFilter, const OUString& rStrmName ) +{ + // do not automatically close the root stream (indicated by empty stream name) + bool bRootStrm = rStrmName.getLength() == 0; + mxXInStrm.reset( new BinaryXInputStream( rFilter.openInputStream( rStrmName ), !bRootStrm ) ); + mxBiffStrm.reset( new BiffInputStream( *mxXInStrm ) ); +} + +BiffFragmentHandler::~BiffFragmentHandler() +{ +} + +BiffFragmentType BiffFragmentHandler::startFragment( BiffType eBiff ) +{ + return mxBiffStrm->startNextRecord() ? lclStartFragment( *mxBiffStrm, eBiff ) : BIFF_FRAGMENT_UNKNOWN; +} + +BiffFragmentType BiffFragmentHandler::startFragment( BiffType eBiff, sal_Int64 nRecHandle ) +{ + return mxBiffStrm->startRecordByHandle( nRecHandle ) ? lclStartFragment( *mxBiffStrm, eBiff ) : BIFF_FRAGMENT_UNKNOWN; +} + +bool BiffFragmentHandler::skipFragment() +{ + while( mxBiffStrm->startNextRecord() && (mxBiffStrm->getRecId() != BIFF_ID_EOF) ) + if( BiffHelper::isBofRecord( *mxBiffStrm ) ) + skipFragment(); + return !mxBiffStrm->isEof() && (mxBiffStrm->getRecId() == BIFF_ID_EOF); +} + +// ---------------------------------------------------------------------------- BiffWorkbookFragmentBase::BiffWorkbookFragmentBase( const WorkbookHelper& rHelper, const OUString& rStrmName, bool bCloneDecoder ) : BiffFragmentHandler( rHelper.getBaseFilter(), rStrmName ), WorkbookHelper( rHelper ) { if( bCloneDecoder ) - getCodecHelper().cloneDecoder( mrStrm ); + getCodecHelper().cloneDecoder( getInputStream() ); } -// ============================================================================ +// ---------------------------------------------------------------------------- BiffWorksheetFragmentBase::BiffWorksheetFragmentBase( const BiffWorkbookFragmentBase& rParent, - ISegmentProgressBarRef xProgressBar, WorksheetType eSheetType, sal_Int16 nSheet ) : + const ISegmentProgressBarRef& rxProgressBar, WorksheetType eSheetType, sal_Int16 nSheet ) : BiffFragmentHandler( rParent ), - WorksheetHelperRoot( rParent, xProgressBar, eSheetType, nSheet ) + WorksheetHelperRoot( rParent, rxProgressBar, eSheetType, nSheet ) { } -// ============================================================================ +// ---------------------------------------------------------------------------- -BiffSkipWorksheetFragment::BiffSkipWorksheetFragment( - const BiffWorkbookFragmentBase& rParent, ISegmentProgressBarRef xProgressBar, sal_Int16 nSheet ) : - BiffWorksheetFragmentBase( rParent, xProgressBar, SHEETTYPE_EMPTYSHEET, nSheet ) +BiffSkipWorksheetFragment::BiffSkipWorksheetFragment( const BiffWorkbookFragmentBase& rParent, + const ISegmentProgressBarRef& rxProgressBar, sal_Int16 nSheet ) : + BiffWorksheetFragmentBase( rParent, rxProgressBar, SHEETTYPE_EMPTYSHEET, nSheet ) { } @@ -256,4 +237,3 @@ bool BiffSkipWorksheetFragment::importFragment() } // namespace xls } // namespace oox - diff --git a/oox/source/xls/excelvbaproject.cxx b/oox/source/xls/excelvbaproject.cxx index ee22dc8398ba..7fc8115cc680 100755 --- a/oox/source/xls/excelvbaproject.cxx +++ b/oox/source/xls/excelvbaproject.cxx @@ -38,7 +38,6 @@ #include <rtl/ustrbuf.hxx> #include "oox/helper/helper.hxx" #include "oox/helper/propertyset.hxx" -#include "properties.hxx" namespace oox { namespace xls { @@ -58,25 +57,12 @@ using ::rtl::OUStringBuffer; // ============================================================================ -ExcelVbaProject::ExcelVbaProject( const Reference< XMultiServiceFactory >& rxGlobalFactory, const Reference< XSpreadsheetDocument >& rxDocument ) : - ::oox::ole::VbaProject( rxGlobalFactory, Reference< XModel >( rxDocument, UNO_QUERY ), CREATE_OUSTRING( "Calc" ) ), +ExcelVbaProject::ExcelVbaProject( const Reference< XComponentContext >& rxContext, const Reference< XSpreadsheetDocument >& rxDocument ) : + ::oox::ole::VbaProject( rxContext, Reference< XModel >( rxDocument, UNO_QUERY ), CREATE_OUSTRING( "Calc" ) ), mxDocument( rxDocument ) { } -void ExcelVbaProject::createMissingModules() -{ - /* !! HACK !! This function is called from old XLS filter only, must be - removed when this filter uses the OOX VBA import instead of the old SVX - VBA import. - */ - - // collect and register all sheets without codenames - prepareImport(); - // manually create the registered dummy modules - createDummyModules(); -} - // protected ------------------------------------------------------------------ namespace { diff --git a/oox/source/xls/externallinkbuffer.cxx b/oox/source/xls/externallinkbuffer.cxx index 04fcd2f84648..683ac3582071 100644 --- a/oox/source/xls/externallinkbuffer.cxx +++ b/oox/source/xls/externallinkbuffer.cxx @@ -26,7 +26,7 @@ ************************************************************************/ #include "oox/xls/externallinkbuffer.hxx" -#include <rtl/strbuf.hxx> + #include <com/sun/star/sheet/ComplexReference.hpp> #include <com/sun/star/sheet/DDELinkInfo.hpp> #include <com/sun/star/sheet/ExternalLinkType.hpp> @@ -38,53 +38,44 @@ #include <com/sun/star/sheet/XDDELinkResults.hpp> #include <com/sun/star/sheet/XExternalDocLink.hpp> #include <com/sun/star/sheet/XExternalDocLinks.hpp> -#include "oox/helper/attributelist.hxx" +#include <rtl/strbuf.hxx> #include "oox/core/filterbase.hxx" +#include "oox/helper/attributelist.hxx" #include "oox/xls/addressconverter.hxx" #include "oox/xls/biffinputstream.hxx" #include "oox/xls/excelhandlers.hxx" #include "oox/xls/formulaparser.hxx" #include "oox/xls/worksheetbuffer.hxx" +namespace oox { +namespace xls { + +// ============================================================================ + +using namespace ::com::sun::star::sheet; +using namespace ::com::sun::star::table; +using namespace ::com::sun::star::uno; + +using ::oox::core::Relation; +using ::oox::core::Relations; using ::rtl::OString; using ::rtl::OStringBuffer; using ::rtl::OStringToOUString; using ::rtl::OUString; -using ::com::sun::star::uno::Any; -using ::com::sun::star::uno::Reference; -using ::com::sun::star::uno::Sequence; -using ::com::sun::star::uno::Exception; -using ::com::sun::star::uno::UNO_QUERY_THROW; -using ::com::sun::star::table::CellAddress; -using ::com::sun::star::sheet::ComplexReference; -using ::com::sun::star::sheet::DDEItemInfo; -using ::com::sun::star::sheet::DDELinkInfo; -using ::com::sun::star::sheet::ExternalLinkInfo; -using ::com::sun::star::sheet::ExternalReference; -using ::com::sun::star::sheet::SingleReference; -using ::com::sun::star::sheet::XDDELinks; -using ::com::sun::star::sheet::XDDELinkResults; -using ::com::sun::star::sheet::XExternalDocLinks; -using ::com::sun::star::sheet::XExternalSheetCache; -using ::oox::core::Relation; -using ::oox::core::Relations; - -namespace oox { -namespace xls { // ============================================================================ namespace { -const sal_uInt16 OOBIN_EXTERNALBOOK_BOOK = 0; -const sal_uInt16 OOBIN_EXTERNALBOOK_DDE = 1; -const sal_uInt16 OOBIN_EXTERNALBOOK_OLE = 2; +const sal_uInt16 BIFF12_EXTERNALBOOK_BOOK = 0; +const sal_uInt16 BIFF12_EXTERNALBOOK_DDE = 1; +const sal_uInt16 BIFF12_EXTERNALBOOK_OLE = 2; -const sal_uInt16 OOBIN_EXTNAME_AUTOMATIC = 0x0002; -const sal_uInt16 OOBIN_EXTNAME_PREFERPIC = 0x0004; -const sal_uInt16 OOBIN_EXTNAME_STDDOCNAME = 0x0008; -const sal_uInt16 OOBIN_EXTNAME_OLEOBJECT = 0x0010; -const sal_uInt16 OOBIN_EXTNAME_ICONIFIED = 0x0020; +const sal_uInt16 BIFF12_EXTNAME_AUTOMATIC = 0x0002; +const sal_uInt16 BIFF12_EXTNAME_PREFERPIC = 0x0004; +const sal_uInt16 BIFF12_EXTNAME_STDDOCNAME = 0x0008; +const sal_uInt16 BIFF12_EXTNAME_OLEOBJECT = 0x0010; +const sal_uInt16 BIFF12_EXTNAME_ICONIFIED = 0x0020; const sal_uInt16 BIFF_EXTNAME_BUILTIN = 0x0001; const sal_uInt16 BIFF_EXTNAME_AUTOMATIC = 0x0002; @@ -150,54 +141,54 @@ void ExternalName::importOleItem( const AttributeList& rAttribs ) maExtNameModel.mbIconified = rAttribs.getBool( XML_icon, false ); } -void ExternalName::importExternalName( RecordInputStream& rStrm ) +void ExternalName::importExternalName( SequenceInputStream& rStrm ) { rStrm >> maModel.maName; OSL_ENSURE( maModel.maName.getLength() > 0, "ExternalName::importExternalName - empty name" ); } -void ExternalName::importExternalNameFlags( RecordInputStream& rStrm ) +void ExternalName::importExternalNameFlags( SequenceInputStream& rStrm ) { sal_uInt16 nFlags; sal_Int32 nSheetId; rStrm >> nFlags >> nSheetId; - // index into sheet list of EXTSHEETNAMES (one-based in OOBIN) + // index into sheet list of EXTSHEETNAMES (one-based in BIFF12) maModel.mnSheet = nSheetId - 1; - // no flag for built-in names, as in OOX... - maExtNameModel.mbNotify = getFlag( nFlags, OOBIN_EXTNAME_AUTOMATIC ); - maExtNameModel.mbPreferPic = getFlag( nFlags, OOBIN_EXTNAME_PREFERPIC ); - maExtNameModel.mbStdDocName = getFlag( nFlags, OOBIN_EXTNAME_STDDOCNAME ); - maExtNameModel.mbOleObj = getFlag( nFlags, OOBIN_EXTNAME_OLEOBJECT ); - maExtNameModel.mbIconified = getFlag( nFlags, OOBIN_EXTNAME_ICONIFIED ); + // no flag for built-in names, as in OOXML... + maExtNameModel.mbNotify = getFlag( nFlags, BIFF12_EXTNAME_AUTOMATIC ); + maExtNameModel.mbPreferPic = getFlag( nFlags, BIFF12_EXTNAME_PREFERPIC ); + maExtNameModel.mbStdDocName = getFlag( nFlags, BIFF12_EXTNAME_STDDOCNAME ); + maExtNameModel.mbOleObj = getFlag( nFlags, BIFF12_EXTNAME_OLEOBJECT ); + maExtNameModel.mbIconified = getFlag( nFlags, BIFF12_EXTNAME_ICONIFIED ); OSL_ENSURE( (mrParentLink.getLinkType() == LINKTYPE_OLE) == maExtNameModel.mbOleObj, "ExternalName::importExternalNameFlags - wrong OLE flag in external name" ); } -void ExternalName::importDdeItemValues( RecordInputStream& rStrm ) +void ExternalName::importDdeItemValues( SequenceInputStream& rStrm ) { sal_Int32 nRows, nCols; rStrm >> nRows >> nCols; setResultSize( nCols, nRows ); } -void ExternalName::importDdeItemBool( RecordInputStream& rStrm ) +void ExternalName::importDdeItemBool( SequenceInputStream& rStrm ) { appendResultValue< double >( (rStrm.readuInt8() == 0) ? 0.0 : 1.0 ); } -void ExternalName::importDdeItemDouble( RecordInputStream& rStrm ) +void ExternalName::importDdeItemDouble( SequenceInputStream& rStrm ) { appendResultValue( rStrm.readDouble() ); } -void ExternalName::importDdeItemError( RecordInputStream& rStrm ) +void ExternalName::importDdeItemError( SequenceInputStream& rStrm ) { appendResultValue( BiffHelper::calcDoubleFromError( rStrm.readuInt8() ) ); } -void ExternalName::importDdeItemString( RecordInputStream& rStrm ) +void ExternalName::importDdeItemString( SequenceInputStream& rStrm ) { - appendResultValue( rStrm.readString() ); + appendResultValue( BiffHelper::readString( rStrm ) ); } void ExternalName::importExternalName( BiffInputStream& rStrm ) @@ -322,8 +313,8 @@ sal_Int32 ExternalName::getSheetCacheIndex() const sal_Int32 nCacheIdx = -1; switch( getFilterType() ) { - case FILTER_OOX: - // OOXML/OOBIN: zero-based index into sheet list, -1 means global name + case FILTER_OOXML: + // OOXML/BIFF12: zero-based index into sheet list, -1 means global name if( maModel.mnSheet >= 0 ) nCacheIdx = mrParentLink.getSheetIndex( maModel.mnSheet ); break; @@ -373,14 +364,15 @@ bool ExternalName::getDdeLinkData( OUString& orDdeServer, OUString& orDdeTopic, // try to create a DDE link and to set the imported link results if( !mbDdeLinkCreated ) try { - Reference< XDDELinks > xDdeLinks( getDdeLinks(), UNO_QUERY_THROW ); + PropertySet aDocProps( getDocument() ); + Reference< XDDELinks > xDdeLinks( aDocProps.getAnyProperty( PROP_DDELinks ), UNO_QUERY_THROW ); mxDdeLink = xDdeLinks->addDDELink( mrParentLink.getClassName(), mrParentLink.getTargetUrl(), maModel.maName, ::com::sun::star::sheet::DDELinkMode_DEFAULT ); + mbDdeLinkCreated = true; // ignore if setting results fails if( !maResults.empty() ) { Reference< XDDELinkResults > xResults( mxDdeLink, UNO_QUERY_THROW ); xResults->setResults( ContainerHelper::matrixToSequenceSequence( maResults ) ); } - mbDdeLinkCreated = true; } catch( Exception& ) { @@ -551,44 +543,44 @@ ExternalNameRef ExternalLink::importOleItem( const AttributeList& rAttribs ) return xExtName; } -void ExternalLink::importExternalRef( RecordInputStream& rStrm ) +void ExternalLink::importExternalRef( SequenceInputStream& rStrm ) { rStrm >> maRelId; } -void ExternalLink::importExternalSelf( RecordInputStream& ) +void ExternalLink::importExternalSelf( SequenceInputStream& ) { meLinkType = LINKTYPE_SELF; } -void ExternalLink::importExternalSame( RecordInputStream& ) +void ExternalLink::importExternalSame( SequenceInputStream& ) { meLinkType = LINKTYPE_SAME; } -void ExternalLink::importExternalAddin( RecordInputStream& ) +void ExternalLink::importExternalAddin( SequenceInputStream& ) { meLinkType = LINKTYPE_UNKNOWN; } -void ExternalLink::importExternalBook( const Relations& rRelations, RecordInputStream& rStrm ) +void ExternalLink::importExternalBook( const Relations& rRelations, SequenceInputStream& rStrm ) { switch( rStrm.readuInt16() ) { - case OOBIN_EXTERNALBOOK_BOOK: - parseExternalReference( rRelations, rStrm.readString() ); + case BIFF12_EXTERNALBOOK_BOOK: + parseExternalReference( rRelations, BiffHelper::readString( rStrm ) ); break; - case OOBIN_EXTERNALBOOK_DDE: + case BIFF12_EXTERNALBOOK_DDE: { OUString aDdeService, aDdeTopic; rStrm >> aDdeService >> aDdeTopic; setDdeOleTargetUrl( aDdeService, aDdeTopic, LINKTYPE_DDE ); } break; - case OOBIN_EXTERNALBOOK_OLE: + case BIFF12_EXTERNALBOOK_OLE: { - OUString aTargetUrl = rRelations.getExternalTargetFromRelId( rStrm.readString() ); - OUString aProgId = rStrm.readString(); + OUString aTargetUrl = rRelations.getExternalTargetFromRelId( BiffHelper::readString( rStrm ) ); + OUString aProgId = BiffHelper::readString( rStrm ); setDdeOleTargetUrl( aProgId, aTargetUrl, LINKTYPE_OLE ); } break; @@ -597,17 +589,17 @@ void ExternalLink::importExternalBook( const Relations& rRelations, RecordInputS } } -void ExternalLink::importExtSheetNames( RecordInputStream& rStrm ) +void ExternalLink::importExtSheetNames( SequenceInputStream& rStrm ) { // load external sheet names and create the sheet caches in the Calc document OSL_ENSURE( (meLinkType == LINKTYPE_EXTERNAL) || (meLinkType == LINKTYPE_LIBRARY), "ExternalLink::importExtSheetNames - invalid link type" ); if( meLinkType == LINKTYPE_EXTERNAL ) // ignore sheets of external libraries for( sal_Int32 nSheet = 0, nCount = rStrm.readInt32(); !rStrm.isEof() && (nSheet < nCount); ++nSheet ) - insertExternalSheet( rStrm.readString() ); + insertExternalSheet( BiffHelper::readString( rStrm ) ); } -ExternalNameRef ExternalLink::importExternalName( RecordInputStream& rStrm ) +ExternalNameRef ExternalLink::importExternalName( SequenceInputStream& rStrm ) { ExternalNameRef xExtName = createExternalName(); xExtName->importExternalName( rStrm ); @@ -724,9 +716,9 @@ FunctionLibraryType ExternalLink::getFuncLibraryType() const sal_Int16 ExternalLink::getCalcSheetIndex( sal_Int32 nTabId ) const { OSL_ENSURE( meLinkType == LINKTYPE_INTERNAL, "ExternalLink::getCalcSheetIndex - invalid link type" ); - OSL_ENSURE( (nTabId == 0) || (getFilterType() == FILTER_OOX) || (getBiff() == BIFF8), + OSL_ENSURE( (nTabId == 0) || (getFilterType() == FILTER_OOXML) || (getBiff() == BIFF8), "ExternalLink::getCalcSheetIndex - invalid sheet index" ); - return ContainerHelper::getVectorElement< sal_Int16 >( maCalcSheets, nTabId, -1 ); + return ContainerHelper::getVectorElement( maCalcSheets, nTabId, -1 ); } sal_Int32 ExternalLink::getDocumentLinkIndex() const @@ -738,9 +730,9 @@ sal_Int32 ExternalLink::getDocumentLinkIndex() const sal_Int32 ExternalLink::getSheetCacheIndex( sal_Int32 nTabId ) const { OSL_ENSURE( meLinkType == LINKTYPE_EXTERNAL, "ExternalLink::getSheetCacheIndex - invalid link type" ); - OSL_ENSURE( (nTabId == 0) || (getFilterType() == FILTER_OOX) || (getBiff() == BIFF8), + OSL_ENSURE( (nTabId == 0) || (getFilterType() == FILTER_OOXML) || (getBiff() == BIFF8), "ExternalLink::getSheetCacheIndex - invalid sheet index" ); - return ContainerHelper::getVectorElement< sal_Int32 >( maSheetCaches, nTabId, -1 ); + return ContainerHelper::getVectorElement( maSheetCaches, nTabId, -1 ); } Reference< XExternalSheetCache > ExternalLink::getSheetCache( sal_Int32 nTabId ) const @@ -776,8 +768,8 @@ void ExternalLink::getSheetRange( LinkSheetRange& orSheetRange, sal_Int32 nTabId sal_Int32 nDocLinkIdx = getDocumentLinkIndex(); switch( getFilterType() ) { - case FILTER_OOX: - // OOBIN: passed indexes point into sheet list of EXTSHEETLIST + case FILTER_OOXML: + // BIFF12: passed indexes point into sheet list of EXTSHEETLIST orSheetRange.setExternalRange( nDocLinkIdx, getSheetCacheIndex( nTabId1 ), getSheetCacheIndex( nTabId2 ) ); break; case FILTER_BIFF: @@ -819,8 +811,8 @@ ExternalNameRef ExternalLink::getNameByIndex( sal_Int32 nIndex ) const // private -------------------------------------------------------------------- -#define OOX_TARGETTYPE_EXTLINK CREATE_OFFICEDOC_RELATIONSTYPE( "externalLinkPath" ) -#define OOX_TARGETTYPE_LIBRARY CREATE_MSOFFICE_RELATIONSTYPE( "xlExternalLinkPath/xlLibrary" ) +#define OOX_TARGETTYPE_EXTLINK CREATE_OFFICEDOC_RELATION_TYPE( "externalLinkPath" ) +#define OOX_TARGETTYPE_LIBRARY CREATE_MSOFFICE_RELATION_TYPE( "xlExternalLinkPath/xlLibrary" ) void ExternalLink::setExternalTargetUrl( const OUString& rTargetUrl, const OUString& rTargetType ) { @@ -839,11 +831,14 @@ void ExternalLink::setExternalTargetUrl( const OUString& rTargetUrl, const OUStr OSL_ENSURE( meLinkType != LINKTYPE_UNKNOWN, "ExternalLink::setExternalTargetUrl - empty target URL or unknown target type" ); // create the external document link API object that will contain the sheet caches - if( meLinkType == LINKTYPE_EXTERNAL ) + if( meLinkType == LINKTYPE_EXTERNAL ) try + { + PropertySet aDocProps( getDocument() ); + Reference< XExternalDocLinks > xDocLinks( aDocProps.getAnyProperty( PROP_ExternalDocLinks ), UNO_QUERY_THROW ); + mxDocLink = xDocLinks->addDocLink( maTargetUrl ); + } + catch( Exception& ) { - Reference< XExternalDocLinks > xDocLinks = getExternalDocLinks(); - if( xDocLinks.is() ) - mxDocLink = xDocLinks->addDocLink( maTargetUrl ); } } @@ -931,7 +926,7 @@ RefSheetsModel::RefSheetsModel() : { } -void RefSheetsModel::readOobData( RecordInputStream& rStrm ) +void RefSheetsModel::readBiff12Data( SequenceInputStream& rStrm ) { rStrm >> mnExtRefId >> mnTabId1 >> mnTabId2; } @@ -947,8 +942,10 @@ void RefSheetsModel::readBiff8Data( BiffInputStream& rStrm ) ExternalLinkBuffer::ExternalLinkBuffer( const WorkbookHelper& rHelper ) : WorkbookHelper( rHelper ), + mxSelfRef( new ExternalLink( rHelper ) ), mbUseRefSheets( false ) { + mxSelfRef->setSelfLinkType(); } ExternalLinkRef ExternalLinkBuffer::importExternalReference( const AttributeList& rAttribs ) @@ -959,7 +956,7 @@ ExternalLinkRef ExternalLinkBuffer::importExternalReference( const AttributeList return xExtLink; } -ExternalLinkRef ExternalLinkBuffer::importExternalRef( RecordInputStream& rStrm ) +ExternalLinkRef ExternalLinkBuffer::importExternalRef( SequenceInputStream& rStrm ) { mbUseRefSheets = true; ExternalLinkRef xExtLink = createExternalLink(); @@ -968,25 +965,25 @@ ExternalLinkRef ExternalLinkBuffer::importExternalRef( RecordInputStream& rStrm return xExtLink; } -void ExternalLinkBuffer::importExternalSelf( RecordInputStream& rStrm ) +void ExternalLinkBuffer::importExternalSelf( SequenceInputStream& rStrm ) { mbUseRefSheets = true; createExternalLink()->importExternalSelf( rStrm ); } -void ExternalLinkBuffer::importExternalSame( RecordInputStream& rStrm ) +void ExternalLinkBuffer::importExternalSame( SequenceInputStream& rStrm ) { mbUseRefSheets = true; createExternalLink()->importExternalSame( rStrm ); } -void ExternalLinkBuffer::importExternalAddin( RecordInputStream& rStrm ) +void ExternalLinkBuffer::importExternalAddin( SequenceInputStream& rStrm ) { mbUseRefSheets = true; createExternalLink()->importExternalAddin( rStrm ); } -void ExternalLinkBuffer::importExternalSheets( RecordInputStream& rStrm ) +void ExternalLinkBuffer::importExternalSheets( SequenceInputStream& rStrm ) { OSL_ENSURE( mbUseRefSheets, "ExternalLinkBuffer::importExternalSheets - missing EXTERNALREFS records" ); mbUseRefSheets = true; @@ -999,7 +996,7 @@ void ExternalLinkBuffer::importExternalSheets( RecordInputStream& rStrm ) for( size_t nRefId = 0; !rStrm.isEof() && (nRefId < nMaxCount); ++nRefId ) { RefSheetsModel aRefSheets; - aRefSheets.readOobData( rStrm ); + aRefSheets.readBiff12Data( rStrm ); maRefSheets.push_back( aRefSheets ); } } @@ -1039,30 +1036,32 @@ void ExternalLinkBuffer::importExternSheet8( BiffInputStream& rStrm ) insert the entries of the second record before the entries of the first record. */ maRefSheets.insert( maRefSheets.begin(), nRefCount, RefSheetsModel() ); - for( RefSheetsModelVec::iterator aIt = maRefSheets.begin(); !rStrm.isEof() && (nRefCount > 0); --nRefCount ) + for( RefSheetsModelVec::iterator aIt = maRefSheets.begin(), aEnd = aIt + nRefCount; !rStrm.isEof() && (aIt != aEnd); ++aIt ) aIt->readBiff8Data( rStrm ); } Sequence< ExternalLinkInfo > ExternalLinkBuffer::getLinkInfos() const { ::std::vector< ExternalLinkInfo > aLinkInfos; - // dummy entry for index 0 - aLinkInfos.push_back( ExternalLinkInfo( ::com::sun::star::sheet::ExternalLinkType::UNKNOWN, Any() ) ); + // should not be used for BIFF12 documents + OSL_ENSURE( (getFilterType() == FILTER_OOXML) && !mbUseRefSheets, "ExternalLinkBuffer::getLinkInfos - unexpected file format" ); + // add entry for implicit index 0 (self reference to this document) + aLinkInfos.push_back( mxSelfRef->getLinkInfo() ); for( ExternalLinkVec::const_iterator aIt = maExtLinks.begin(), aEnd = maExtLinks.end(); aIt != aEnd; ++aIt ) aLinkInfos.push_back( (*aIt)->getLinkInfo() ); return ContainerHelper::vectorToSequence( aLinkInfos ); } -ExternalLinkRef ExternalLinkBuffer::getExternalLink( sal_Int32 nRefId ) const +ExternalLinkRef ExternalLinkBuffer::getExternalLink( sal_Int32 nRefId, bool bUseRefSheets ) const { ExternalLinkRef xExtLink; switch( getFilterType() ) { - case FILTER_OOX: - // OOXML: one-based index - if( !mbUseRefSheets ) - xExtLink = maLinks.get( nRefId - 1 ); - // OOBIN: zero-based index into ref-sheets list + case FILTER_OOXML: + // OOXML: 0 = this document, otherwise one-based index into link list + if( !bUseRefSheets || !mbUseRefSheets ) + xExtLink = (nRefId == 0) ? mxSelfRef : maLinks.get( nRefId - 1 ); + // BIFF12: zero-based index into ref-sheets list else if( const RefSheetsModel* pRefSheets = getRefSheets( nRefId ) ) xExtLink = maLinks.get( pRefSheets->mnExtRefId ); break; @@ -1113,7 +1112,7 @@ LinkSheetRange ExternalLinkBuffer::getSheetRange( sal_Int32 nRefId, sal_Int16 nT LinkSheetRange ExternalLinkBuffer::getSheetRange( sal_Int32 nRefId ) const { - OSL_ENSURE( ((getFilterType() == FILTER_OOX) && mbUseRefSheets) || (getBiff() == BIFF8), "ExternalLinkBuffer::getSheetRange - wrong BIFF version" ); + OSL_ENSURE( ((getFilterType() == FILTER_OOXML) && mbUseRefSheets) || (getBiff() == BIFF8), "ExternalLinkBuffer::getSheetRange - wrong BIFF version" ); LinkSheetRange aSheetRange; if( const ExternalLink* pExtLink = getExternalLink( nRefId ).get() ) if( const RefSheetsModel* pRefSheets = getRefSheets( nRefId ) ) @@ -1140,4 +1139,3 @@ const RefSheetsModel* ExternalLinkBuffer::getRefSheets( sal_Int32 nRefId ) const } // namespace xls } // namespace oox - diff --git a/oox/source/xls/externallinkfragment.cxx b/oox/source/xls/externallinkfragment.cxx index e1bff95ff724..094b192b817c 100644 --- a/oox/source/xls/externallinkfragment.cxx +++ b/oox/source/xls/externallinkfragment.cxx @@ -26,6 +26,7 @@ ************************************************************************/ #include "oox/xls/externallinkfragment.hxx" + #include <com/sun/star/sheet/XExternalSheetCache.hpp> #include "oox/helper/attributelist.hxx" #include "oox/xls/biffinputstream.hxx" @@ -33,32 +34,30 @@ #include "oox/xls/sheetdatacontext.hxx" #include "oox/xls/unitconverter.hxx" -using ::rtl::OUString; -using ::com::sun::star::uno::Any; -using ::com::sun::star::uno::Reference; -using ::com::sun::star::uno::Exception; -using ::com::sun::star::table::CellAddress; -using ::com::sun::star::sheet::XExternalSheetCache; -using ::oox::core::ContextHandlerRef; -using ::oox::core::RecordInfo; -using ::oox::core::Relation; - namespace oox { namespace xls { // ============================================================================ -OoxExternalSheetDataContext::OoxExternalSheetDataContext( - OoxWorkbookFragmentBase& rFragment, const Reference< XExternalSheetCache >& rxSheetCache ) : - OoxWorkbookContextBase( rFragment ), +using namespace ::com::sun::star::sheet; +using namespace ::com::sun::star::table; +using namespace ::com::sun::star::uno; +using namespace ::oox::core; + +using ::rtl::OUString; + +// ============================================================================ +// ============================================================================ + +ExternalSheetDataContext::ExternalSheetDataContext( + WorkbookFragmentBase& rFragment, const Reference< XExternalSheetCache >& rxSheetCache ) : + WorkbookContextBase( rFragment ), mxSheetCache( rxSheetCache ) { - OSL_ENSURE( mxSheetCache.is(), "OoxExternalSheetDataContext::OoxExternalSheetDataContext - missing sheet cache" ); + OSL_ENSURE( mxSheetCache.is(), "ExternalSheetDataContext::ExternalSheetDataContext - missing sheet cache" ); } -// oox.core.ContextHandler2Helper interface ----------------------------------- - -ContextHandlerRef OoxExternalSheetDataContext::onCreateContext( sal_Int32 nElement, const AttributeList& rAttribs ) +ContextHandlerRef ExternalSheetDataContext::onCreateContext( sal_Int32 nElement, const AttributeList& rAttribs ) { switch( getCurrentElement() ) { @@ -69,50 +68,48 @@ ContextHandlerRef OoxExternalSheetDataContext::onCreateContext( sal_Int32 nEleme if( nElement == XLS_TOKEN( cell ) ) { importCell( rAttribs ); return this; } break; case XLS_TOKEN( cell ): - if( nElement == XLS_TOKEN( v ) ) return this; // collect characters in onEndElement() + if( nElement == XLS_TOKEN( v ) ) return this; // collect characters in onCharacters() break; } return 0; } -void OoxExternalSheetDataContext::onEndElement( const OUString& rChars ) +void ExternalSheetDataContext::onCharacters( const OUString& rChars ) { - switch( getCurrentElement() ) + if( isCurrentElement( XLS_TOKEN( v ) ) ) { - case XLS_TOKEN( v ): - switch( mnCurrType ) - { - case XML_b: - case XML_n: - setCellValue( Any( rChars.toDouble() ) ); - break; - case XML_e: - setCellValue( Any( BiffHelper::calcDoubleFromError( getUnitConverter().calcBiffErrorCode( rChars ) ) ) ); - break; - case XML_str: - setCellValue( Any( rChars ) ); - break; - } - mnCurrType = XML_TOKEN_INVALID; - break; + switch( mnCurrType ) + { + case XML_b: + case XML_n: + setCellValue( Any( rChars.toDouble() ) ); + break; + case XML_e: + setCellValue( Any( BiffHelper::calcDoubleFromError( getUnitConverter().calcBiffErrorCode( rChars ) ) ) ); + break; + case XML_str: + setCellValue( Any( rChars ) ); + break; + } + mnCurrType = XML_TOKEN_INVALID; } } -ContextHandlerRef OoxExternalSheetDataContext::onCreateRecordContext( sal_Int32 nRecId, RecordInputStream& rStrm ) +ContextHandlerRef ExternalSheetDataContext::onCreateRecordContext( sal_Int32 nRecId, SequenceInputStream& rStrm ) { switch( getCurrentElement() ) { - case OOBIN_ID_EXTSHEETDATA: - if( nRecId == OOBIN_ID_EXTROW ) { maCurrPos.Row = rStrm.readInt32(); return this; } + case BIFF12_ID_EXTSHEETDATA: + if( nRecId == BIFF12_ID_EXTROW ) { maCurrPos.Row = rStrm.readInt32(); return this; } break; - case OOBIN_ID_EXTROW: + case BIFF12_ID_EXTROW: switch( nRecId ) { - case OOBIN_ID_EXTCELL_BLANK: importExtCellBlank( rStrm ); break; - case OOBIN_ID_EXTCELL_BOOL: importExtCellBool( rStrm ); break; - case OOBIN_ID_EXTCELL_DOUBLE: importExtCellDouble( rStrm ); break; - case OOBIN_ID_EXTCELL_ERROR: importExtCellError( rStrm ); break; - case OOBIN_ID_EXTCELL_STRING: importExtCellString( rStrm ); break; + case BIFF12_ID_EXTCELL_BLANK: importExtCellBlank( rStrm ); break; + case BIFF12_ID_EXTCELL_BOOL: importExtCellBool( rStrm ); break; + case BIFF12_ID_EXTCELL_DOUBLE: importExtCellDouble( rStrm ); break; + case BIFF12_ID_EXTCELL_ERROR: importExtCellError( rStrm ); break; + case BIFF12_ID_EXTCELL_STRING: importExtCellString( rStrm ); break; } break; } @@ -121,7 +118,7 @@ ContextHandlerRef OoxExternalSheetDataContext::onCreateRecordContext( sal_Int32 // private -------------------------------------------------------------------- -void OoxExternalSheetDataContext::importCell( const AttributeList& rAttribs ) +void ExternalSheetDataContext::importCell( const AttributeList& rAttribs ) { if( getAddressConverter().convertToCellAddress( maCurrPos, rAttribs.getString( XML_r, OUString() ), 0, false ) ) mnCurrType = rAttribs.getToken( XML_t, XML_n ); @@ -129,38 +126,38 @@ void OoxExternalSheetDataContext::importCell( const AttributeList& rAttribs ) mnCurrType = XML_TOKEN_INVALID; } -void OoxExternalSheetDataContext::importExtCellBlank( RecordInputStream& rStrm ) +void ExternalSheetDataContext::importExtCellBlank( SequenceInputStream& rStrm ) { maCurrPos.Column = rStrm.readInt32(); setCellValue( Any( OUString() ) ); } -void OoxExternalSheetDataContext::importExtCellBool( RecordInputStream& rStrm ) +void ExternalSheetDataContext::importExtCellBool( SequenceInputStream& rStrm ) { maCurrPos.Column = rStrm.readInt32(); double fValue = (rStrm.readuInt8() == 0) ? 0.0 : 1.0; setCellValue( Any( fValue ) ); } -void OoxExternalSheetDataContext::importExtCellDouble( RecordInputStream& rStrm ) +void ExternalSheetDataContext::importExtCellDouble( SequenceInputStream& rStrm ) { maCurrPos.Column = rStrm.readInt32(); setCellValue( Any( rStrm.readDouble() ) ); } -void OoxExternalSheetDataContext::importExtCellError( RecordInputStream& rStrm ) +void ExternalSheetDataContext::importExtCellError( SequenceInputStream& rStrm ) { maCurrPos.Column = rStrm.readInt32(); setCellValue( Any( BiffHelper::calcDoubleFromError( rStrm.readuInt8() ) ) ); } -void OoxExternalSheetDataContext::importExtCellString( RecordInputStream& rStrm ) +void ExternalSheetDataContext::importExtCellString( SequenceInputStream& rStrm ) { maCurrPos.Column = rStrm.readInt32(); - setCellValue( Any( rStrm.readString() ) ); + setCellValue( Any( BiffHelper::readString( rStrm ) ) ); } -void OoxExternalSheetDataContext::setCellValue( const Any& rValue ) +void ExternalSheetDataContext::setCellValue( const Any& rValue ) { if( mxSheetCache.is() && getAddressConverter().checkCellAddress( maCurrPos, false ) ) try { @@ -173,17 +170,15 @@ void OoxExternalSheetDataContext::setCellValue( const Any& rValue ) // ============================================================================ -OoxExternalLinkFragment::OoxExternalLinkFragment( const WorkbookHelper& rHelper, +ExternalLinkFragment::ExternalLinkFragment( const WorkbookHelper& rHelper, const OUString& rFragmentPath, ExternalLink& rExtLink ) : - OoxWorkbookFragmentBase( rHelper, rFragmentPath ), + WorkbookFragmentBase( rHelper, rFragmentPath ), mrExtLink( rExtLink ), mnResultType( XML_TOKEN_INVALID ) { } -// oox.core.ContextHandler2Helper interface ----------------------------------- - -ContextHandlerRef OoxExternalLinkFragment::onCreateContext( sal_Int32 nElement, const AttributeList& rAttribs ) +ContextHandlerRef ExternalLinkFragment::onCreateContext( sal_Int32 nElement, const AttributeList& rAttribs ) { switch( getCurrentElement() ) { @@ -245,7 +240,7 @@ ContextHandlerRef OoxExternalLinkFragment::onCreateContext( sal_Int32 nElement, } break; case XLS_TOKEN( value ): - if( nElement == XLS_TOKEN( val ) ) return this; // collect value in onEndElement() + if( nElement == XLS_TOKEN( val ) ) return this; // collect value in onCharacters() break; case XLS_TOKEN( oleLink ): @@ -258,209 +253,188 @@ ContextHandlerRef OoxExternalLinkFragment::onCreateContext( sal_Int32 nElement, return 0; } -void OoxExternalLinkFragment::onEndElement( const OUString& rChars ) +void ExternalLinkFragment::onCharacters( const OUString& rChars ) { - switch( getCurrentElement() ) + if( isCurrentElement( XLS_TOKEN( val ) ) ) + maResultValue = rChars; +} + +void ExternalLinkFragment::onEndElement() +{ + if( isCurrentElement( XLS_TOKEN( value ) ) && mxExtName.get() ) switch( mnResultType ) { - case XLS_TOKEN( val ): - maResultValue = rChars; + case XML_b: + mxExtName->appendResultValue( maResultValue.toDouble() ); break; - case XLS_TOKEN( value ): - if( mxExtName.get() ) switch( mnResultType ) - { - case XML_b: - mxExtName->appendResultValue( maResultValue.toDouble() ); - break; - case XML_e: - mxExtName->appendResultValue( BiffHelper::calcDoubleFromError( getUnitConverter().calcBiffErrorCode( maResultValue ) ) ); - break; - case XML_n: - mxExtName->appendResultValue( maResultValue.toDouble() ); - break; - case XML_str: - mxExtName->appendResultValue( maResultValue ); - break; - default: - mxExtName->appendResultValue( BiffHelper::calcDoubleFromError( BIFF_ERR_NA ) ); - } + case XML_e: + mxExtName->appendResultValue( BiffHelper::calcDoubleFromError( getUnitConverter().calcBiffErrorCode( maResultValue ) ) ); + break; + case XML_n: + mxExtName->appendResultValue( maResultValue.toDouble() ); + break; + case XML_str: + mxExtName->appendResultValue( maResultValue ); break; + default: + mxExtName->appendResultValue( BiffHelper::calcDoubleFromError( BIFF_ERR_NA ) ); } } -ContextHandlerRef OoxExternalLinkFragment::onCreateRecordContext( sal_Int32 nRecId, RecordInputStream& rStrm ) +ContextHandlerRef ExternalLinkFragment::onCreateRecordContext( sal_Int32 nRecId, SequenceInputStream& rStrm ) { switch( getCurrentElement() ) { case XML_ROOT_CONTEXT: - if( nRecId == OOBIN_ID_EXTERNALBOOK ) + if( nRecId == BIFF12_ID_EXTERNALBOOK ) { mrExtLink.importExternalBook( getRelations(), rStrm ); return this; } break; - case OOBIN_ID_EXTERNALBOOK: + case BIFF12_ID_EXTERNALBOOK: switch( nRecId ) { - case OOBIN_ID_EXTSHEETDATA: + case BIFF12_ID_EXTSHEETDATA: if( mrExtLink.getLinkType() == LINKTYPE_EXTERNAL ) return createSheetDataContext( rStrm.readInt32() ); break; - case OOBIN_ID_EXTSHEETNAMES: mrExtLink.importExtSheetNames( rStrm ); break; - case OOBIN_ID_EXTERNALNAME: mxExtName = mrExtLink.importExternalName( rStrm ); return this; + case BIFF12_ID_EXTSHEETNAMES: mrExtLink.importExtSheetNames( rStrm ); break; + case BIFF12_ID_EXTERNALNAME: mxExtName = mrExtLink.importExternalName( rStrm ); return this; } break; - case OOBIN_ID_EXTERNALNAME: + case BIFF12_ID_EXTERNALNAME: switch( nRecId ) { - case OOBIN_ID_EXTERNALNAMEFLAGS: if( mxExtName.get() ) mxExtName->importExternalNameFlags( rStrm ); break; - case OOBIN_ID_DDEITEMVALUES: if( mxExtName.get() ) mxExtName->importDdeItemValues( rStrm ); return this; + case BIFF12_ID_EXTERNALNAMEFLAGS: if( mxExtName.get() ) mxExtName->importExternalNameFlags( rStrm ); break; + case BIFF12_ID_DDEITEMVALUES: if( mxExtName.get() ) mxExtName->importDdeItemValues( rStrm ); return this; } break; - case OOBIN_ID_DDEITEMVALUES: + case BIFF12_ID_DDEITEMVALUES: switch( nRecId ) { - case OOBIN_ID_DDEITEM_BOOL: if( mxExtName.get() ) mxExtName->importDdeItemBool( rStrm ); break; - case OOBIN_ID_DDEITEM_DOUBLE: if( mxExtName.get() ) mxExtName->importDdeItemDouble( rStrm ); break; - case OOBIN_ID_DDEITEM_ERROR: if( mxExtName.get() ) mxExtName->importDdeItemError( rStrm ); break; - case OOBIN_ID_DDEITEM_STRING: if( mxExtName.get() ) mxExtName->importDdeItemString( rStrm ); break; + case BIFF12_ID_DDEITEM_BOOL: if( mxExtName.get() ) mxExtName->importDdeItemBool( rStrm ); break; + case BIFF12_ID_DDEITEM_DOUBLE: if( mxExtName.get() ) mxExtName->importDdeItemDouble( rStrm ); break; + case BIFF12_ID_DDEITEM_ERROR: if( mxExtName.get() ) mxExtName->importDdeItemError( rStrm ); break; + case BIFF12_ID_DDEITEM_STRING: if( mxExtName.get() ) mxExtName->importDdeItemString( rStrm ); break; } break; } return 0; } -ContextHandlerRef OoxExternalLinkFragment::createSheetDataContext( sal_Int32 nSheetId ) +ContextHandlerRef ExternalLinkFragment::createSheetDataContext( sal_Int32 nSheetId ) { - return new OoxExternalSheetDataContext( *this, mrExtLink.getSheetCache( nSheetId ) ); + return new ExternalSheetDataContext( *this, mrExtLink.getSheetCache( nSheetId ) ); } -// oox.core.FragmentHandler2 interface ---------------------------------------- - -const RecordInfo* OoxExternalLinkFragment::getRecordInfos() const +const RecordInfo* ExternalLinkFragment::getRecordInfos() const { static const RecordInfo spRecInfos[] = { - { OOBIN_ID_DDEITEMVALUES, OOBIN_ID_DDEITEMVALUES + 1 }, - { OOBIN_ID_EXTERNALBOOK, OOBIN_ID_EXTERNALBOOK + 228 }, - { OOBIN_ID_EXTERNALNAME, OOBIN_ID_EXTERNALNAME + 10 }, - { OOBIN_ID_EXTROW, -1 }, - { OOBIN_ID_EXTSHEETDATA, OOBIN_ID_EXTSHEETDATA + 1 }, - { -1, -1 } + { BIFF12_ID_DDEITEMVALUES, BIFF12_ID_DDEITEMVALUES + 1 }, + { BIFF12_ID_EXTERNALBOOK, BIFF12_ID_EXTERNALBOOK + 228 }, + { BIFF12_ID_EXTERNALNAME, BIFF12_ID_EXTERNALNAME + 10 }, + { BIFF12_ID_EXTROW, -1 }, + { BIFF12_ID_EXTSHEETDATA, BIFF12_ID_EXTSHEETDATA + 1 }, + { -1, -1 } }; return spRecInfos; } // ============================================================================ +// ============================================================================ -BiffExternalLinkFragment::BiffExternalLinkFragment( const BiffWorkbookFragmentBase& rParent, bool bImportDefNames ) : - BiffWorkbookFragmentBase( rParent ), +BiffExternalSheetDataContext::BiffExternalSheetDataContext( const WorkbookHelper& rHelper, bool bImportDefNames ) : + BiffWorkbookContextBase( rHelper ), mbImportDefNames( bImportDefNames ) { } -BiffExternalLinkFragment::~BiffExternalLinkFragment() +BiffExternalSheetDataContext::~BiffExternalSheetDataContext() { } -bool BiffExternalLinkFragment::importFragment() +void BiffExternalSheetDataContext::importRecord( BiffInputStream& rStrm ) { - // process all record in this sheet fragment - while( mrStrm.startNextRecord() && (mrStrm.getRecId() != BIFF_ID_EOF) ) - { - if( isBofRecord() ) - skipFragment(); // skip unknown embedded fragments - else - importRecord(); - } - return !mrStrm.isEof() && (mrStrm.getRecId() == BIFF_ID_EOF); -} - -void BiffExternalLinkFragment::importRecord() -{ - sal_uInt16 nRecId = mrStrm.getRecId(); + sal_uInt16 nRecId = rStrm.getRecId(); switch( getBiff() ) { case BIFF2: switch( nRecId ) { - case BIFF2_ID_EXTERNALNAME: importExternalName(); break; - case BIFF_ID_EXTERNSHEET: importExternSheet(); break; - case BIFF2_ID_DEFINEDNAME: importDefinedName(); break; + case BIFF2_ID_EXTERNALNAME: importExternalName( rStrm ); break; + case BIFF_ID_EXTERNSHEET: importExternSheet( rStrm ); break; + case BIFF2_ID_DEFINEDNAME: importDefinedName( rStrm ); break; } break; case BIFF3: switch( nRecId ) { - case BIFF_ID_CRN: importCrn(); break; - case BIFF3_ID_EXTERNALNAME: importExternalName(); break; - case BIFF_ID_EXTERNSHEET: importExternSheet(); break; - case BIFF3_ID_DEFINEDNAME: importDefinedName(); break; - case BIFF_ID_XCT: importXct(); break; + case BIFF_ID_CRN: importCrn( rStrm ); break; + case BIFF3_ID_EXTERNALNAME: importExternalName( rStrm ); break; + case BIFF_ID_EXTERNSHEET: importExternSheet( rStrm ); break; + case BIFF3_ID_DEFINEDNAME: importDefinedName( rStrm ); break; + case BIFF_ID_XCT: importXct( rStrm ); break; } break; case BIFF4: switch( nRecId ) { - case BIFF_ID_CRN: importCrn(); break; - case BIFF3_ID_EXTERNALNAME: importExternalName(); break; - case BIFF_ID_EXTERNSHEET: importExternSheet(); break; - case BIFF3_ID_DEFINEDNAME: importDefinedName(); break; - case BIFF_ID_XCT: importXct(); break; + case BIFF_ID_CRN: importCrn( rStrm ); break; + case BIFF3_ID_EXTERNALNAME: importExternalName( rStrm ); break; + case BIFF_ID_EXTERNSHEET: importExternSheet( rStrm ); break; + case BIFF3_ID_DEFINEDNAME: importDefinedName( rStrm ); break; + case BIFF_ID_XCT: importXct( rStrm ); break; } break; case BIFF5: switch( nRecId ) { - case BIFF_ID_CRN: importCrn(); break; - case BIFF5_ID_EXTERNALNAME: importExternalName(); break; - case BIFF_ID_EXTERNSHEET: importExternSheet(); break; - case BIFF5_ID_DEFINEDNAME: importDefinedName(); break; - case BIFF_ID_XCT: importXct(); break; + case BIFF_ID_CRN: importCrn( rStrm ); break; + case BIFF5_ID_EXTERNALNAME: importExternalName( rStrm ); break; + case BIFF_ID_EXTERNSHEET: importExternSheet( rStrm ); break; + case BIFF5_ID_DEFINEDNAME: importDefinedName( rStrm ); break; + case BIFF_ID_XCT: importXct( rStrm ); break; } break; case BIFF8: switch( nRecId ) { - case BIFF_ID_CRN: importCrn(); break; - case BIFF_ID_EXTERNALBOOK: importExternalBook(); break; - case BIFF5_ID_EXTERNALNAME: importExternalName(); break; - case BIFF_ID_EXTERNSHEET: importExternSheet(); break; - case BIFF5_ID_DEFINEDNAME: importDefinedName(); break; - case BIFF_ID_XCT: importXct(); break; + case BIFF_ID_CRN: importCrn( rStrm ); break; + case BIFF_ID_EXTERNALBOOK: importExternalBook( rStrm ); break; + case BIFF5_ID_EXTERNALNAME: importExternalName( rStrm ); break; + case BIFF_ID_EXTERNSHEET: importExternSheet( rStrm ); break; + case BIFF5_ID_DEFINEDNAME: importDefinedName( rStrm ); break; + case BIFF_ID_XCT: importXct( rStrm ); break; } break; case BIFF_UNKNOWN: break; } } -void BiffExternalLinkFragment::finalizeImport() -{ - getDefinedNames().finalizeImport(); -} - // private -------------------------------------------------------------------- -void BiffExternalLinkFragment::importExternSheet() +void BiffExternalSheetDataContext::importExternSheet( BiffInputStream& rStrm ) { mxSheetCache.clear(); if( getBiff() == BIFF8 ) - getExternalLinks().importExternSheet8( mrStrm ); + getExternalLinks().importExternSheet8( rStrm ); else - mxExtLink = getExternalLinks().importExternSheet( mrStrm ); + mxExtLink = getExternalLinks().importExternSheet( rStrm ); } -void BiffExternalLinkFragment::importExternalBook() +void BiffExternalSheetDataContext::importExternalBook( BiffInputStream& rStrm ) { mxSheetCache.clear(); - mxExtLink = getExternalLinks().importExternalBook( mrStrm ); + mxExtLink = getExternalLinks().importExternalBook( rStrm ); } -void BiffExternalLinkFragment::importExternalName() +void BiffExternalSheetDataContext::importExternalName( BiffInputStream& rStrm ) { if( mxExtLink.get() ) - mxExtLink->importExternalName( mrStrm ); + mxExtLink->importExternalName( rStrm ); } -void BiffExternalLinkFragment::importXct() +void BiffExternalSheetDataContext::importXct( BiffInputStream& rStrm ) { mxSheetCache.clear(); if( mxExtLink.get() && (mxExtLink->getLinkType() == LINKTYPE_EXTERNAL) ) @@ -475,64 +449,65 @@ void BiffExternalLinkFragment::importXct() mxSheetCache = mxExtLink->getSheetCache( 0 ); break; case BIFF8: - mrStrm.skip( 2 ); - mxSheetCache = mxExtLink->getSheetCache( mrStrm.readInt16() ); + rStrm.skip( 2 ); + mxSheetCache = mxExtLink->getSheetCache( rStrm.readInt16() ); + break; + case BIFF_UNKNOWN: break; - case BIFF_UNKNOWN: break; } } } -void BiffExternalLinkFragment::importCrn() +void BiffExternalSheetDataContext::importCrn( BiffInputStream& rStrm ) { if( !mxSheetCache.is() ) return; sal_uInt8 nCol2, nCol1; sal_uInt16 nRow; - mrStrm >> nCol2 >> nCol1 >> nRow; + rStrm >> nCol2 >> nCol1 >> nRow; bool bLoop = true; - for( BinAddress aBinAddr( nCol1, nRow ); bLoop && !mrStrm.isEof() && (aBinAddr.mnCol <= nCol2); ++aBinAddr.mnCol ) + for( BinAddress aBinAddr( nCol1, nRow ); bLoop && !rStrm.isEof() && (aBinAddr.mnCol <= nCol2); ++aBinAddr.mnCol ) { - switch( mrStrm.readuInt8() ) + switch( rStrm.readuInt8() ) { case BIFF_DATATYPE_EMPTY: - mrStrm.skip( 8 ); + rStrm.skip( 8 ); setCellValue( aBinAddr, Any( OUString() ) ); break; case BIFF_DATATYPE_DOUBLE: - setCellValue( aBinAddr, Any( mrStrm.readDouble() ) ); + setCellValue( aBinAddr, Any( rStrm.readDouble() ) ); break; case BIFF_DATATYPE_STRING: { - OUString aText = (getBiff() == BIFF8) ? mrStrm.readUniString() : mrStrm.readByteStringUC( false, getTextEncoding() ); + OUString aText = (getBiff() == BIFF8) ? rStrm.readUniString() : rStrm.readByteStringUC( false, getTextEncoding() ); setCellValue( aBinAddr, Any( aText ) ); } break; case BIFF_DATATYPE_BOOL: { - double fValue = (mrStrm.readuInt8() == 0) ? 0.0 : 1.0; + double fValue = (rStrm.readuInt8() == 0) ? 0.0 : 1.0; setCellValue( aBinAddr, Any( fValue ) ); - mrStrm.skip( 7 ); + rStrm.skip( 7 ); } break; case BIFF_DATATYPE_ERROR: - setCellValue( aBinAddr, Any( BiffHelper::calcDoubleFromError( mrStrm.readuInt8() ) ) ); - mrStrm.skip( 7 ); + setCellValue( aBinAddr, Any( BiffHelper::calcDoubleFromError( rStrm.readuInt8() ) ) ); + rStrm.skip( 7 ); break; default: - OSL_ENSURE( false, "BiffExternalLinkFragment::importCrn - unknown data type" ); + OSL_ENSURE( false, "BiffExternalSheetDataContext::importCrn - unknown data type" ); bLoop = false; } } } -void BiffExternalLinkFragment::importDefinedName() +void BiffExternalSheetDataContext::importDefinedName( BiffInputStream& rStrm ) { if( mbImportDefNames ) - getDefinedNames().importDefinedName( mrStrm ); + getDefinedNames().importDefinedName( rStrm ); } -void BiffExternalLinkFragment::setCellValue( const BinAddress& rBinAddr, const Any& rValue ) +void BiffExternalSheetDataContext::setCellValue( const BinAddress& rBinAddr, const Any& rValue ) { CellAddress aCellPos; if( mxSheetCache.is() && getAddressConverter().convertToCellAddress( aCellPos, rBinAddr, 0, false ) ) try @@ -546,6 +521,28 @@ void BiffExternalLinkFragment::setCellValue( const BinAddress& rBinAddr, const A // ============================================================================ +BiffExternalLinkFragment::BiffExternalLinkFragment( const BiffWorkbookFragmentBase& rParent ) : + BiffWorkbookFragmentBase( rParent ) +{ +} + +bool BiffExternalLinkFragment::importFragment() +{ + // process all record in this sheet fragment + BiffExternalSheetDataContext aSheetContext( *this, false ); + BiffInputStream& rStrm = getInputStream(); + while( rStrm.startNextRecord() && (rStrm.getRecId() != BIFF_ID_EOF) ) + { + if( BiffHelper::isBofRecord( rStrm ) ) + skipFragment(); // skip unknown embedded fragments + else + aSheetContext.importRecord( rStrm ); + } + return !rStrm.isEof() && (rStrm.getRecId() == BIFF_ID_EOF); +} + +// ============================================================================ +// ============================================================================ + } // namespace xls } // namespace oox - diff --git a/oox/source/xls/formulabase.cxx b/oox/source/xls/formulabase.cxx index ea353bb48558..ba8485d1f42b 100644..100755 --- a/oox/source/xls/formulabase.cxx +++ b/oox/source/xls/formulabase.cxx @@ -26,9 +26,8 @@ ************************************************************************/ #include "oox/xls/formulabase.hxx" + #include <map> -#include <rtl/strbuf.hxx> -#include <rtl/ustrbuf.hxx> #include <com/sun/star/lang/XMultiServiceFactory.hpp> #include <com/sun/star/table/XCellRange.hpp> #include <com/sun/star/sheet/AddressConvention.hpp> @@ -41,37 +40,28 @@ #include <com/sun/star/sheet/XFormulaOpCodeMapper.hpp> #include <com/sun/star/sheet/XFormulaParser.hpp> #include <com/sun/star/sheet/XFormulaTokens.hpp> -#include "properties.hxx" -#include "oox/helper/recordinputstream.hxx" +#include <rtl/strbuf.hxx> +#include <rtl/ustrbuf.hxx> #include "oox/core/filterbase.hxx" +#include "oox/helper/containerhelper.hxx" #include "oox/xls/biffinputstream.hxx" +namespace oox { +namespace xls { + +// ============================================================================ + +using namespace ::com::sun::star::lang; +using namespace ::com::sun::star::sheet; +using namespace ::com::sun::star::table; +using namespace ::com::sun::star::uno; + using ::rtl::OString; using ::rtl::OStringBuffer; +using ::rtl::OStringToOUString; using ::rtl::OUString; using ::rtl::OUStringBuffer; -using ::rtl::OStringToOUString; using ::rtl::OUStringToOString; -using ::com::sun::star::lang::XMultiServiceFactory; -using ::com::sun::star::uno::Any; -using ::com::sun::star::uno::Reference; -using ::com::sun::star::uno::Sequence; -using ::com::sun::star::uno::Exception; -using ::com::sun::star::uno::UNO_QUERY; -using ::com::sun::star::uno::UNO_QUERY_THROW; -using ::com::sun::star::table::CellAddress; -using ::com::sun::star::table::CellRangeAddress; -using ::com::sun::star::table::XCellRange; -using ::com::sun::star::sheet::SingleReference; -using ::com::sun::star::sheet::ComplexReference; -using ::com::sun::star::sheet::FormulaToken; -using ::com::sun::star::sheet::FormulaOpCodeMapEntry; -using ::com::sun::star::sheet::XSpreadsheetDocument; -using ::com::sun::star::sheet::XFormulaOpCodeMapper; -using ::com::sun::star::sheet::XFormulaTokens; - -namespace oox { -namespace xls { // reference helpers ========================================================== @@ -83,16 +73,16 @@ BinSingleRef2d::BinSingleRef2d() : { } -void BinSingleRef2d::setOobData( sal_uInt16 nCol, sal_Int32 nRow, bool bRelativeAsOffset ) +void BinSingleRef2d::setBiff12Data( sal_uInt16 nCol, sal_Int32 nRow, bool bRelativeAsOffset ) { - mnCol = nCol & OOBIN_TOK_REF_COLMASK; - mnRow = nRow & OOBIN_TOK_REF_ROWMASK; - mbColRel = getFlag( nCol, OOBIN_TOK_REF_COLREL ); - mbRowRel = getFlag( nCol, OOBIN_TOK_REF_ROWREL ); - if( bRelativeAsOffset && mbColRel && (mnCol > (OOBIN_TOK_REF_COLMASK >> 1)) ) - mnCol -= (OOBIN_TOK_REF_COLMASK + 1); - if( bRelativeAsOffset && mbRowRel && (mnRow > (OOBIN_TOK_REF_ROWMASK >> 1)) ) - mnRow -= (OOBIN_TOK_REF_ROWMASK + 1); + mnCol = nCol & BIFF12_TOK_REF_COLMASK; + mnRow = nRow & BIFF12_TOK_REF_ROWMASK; + mbColRel = getFlag( nCol, BIFF12_TOK_REF_COLREL ); + mbRowRel = getFlag( nCol, BIFF12_TOK_REF_ROWREL ); + if( bRelativeAsOffset && mbColRel && (mnCol > (BIFF12_TOK_REF_COLMASK >> 1)) ) + mnCol -= (BIFF12_TOK_REF_COLMASK + 1); + if( bRelativeAsOffset && mbRowRel && (mnRow > (BIFF12_TOK_REF_ROWMASK >> 1)) ) + mnRow -= (BIFF12_TOK_REF_ROWMASK + 1); } void BinSingleRef2d::setBiff2Data( sal_uInt8 nCol, sal_uInt16 nRow, bool bRelativeAsOffset ) @@ -119,12 +109,12 @@ void BinSingleRef2d::setBiff8Data( sal_uInt16 nCol, sal_uInt16 nRow, bool bRelat mnRow -= 0x10000; } -void BinSingleRef2d::readOobData( RecordInputStream& rStrm, bool bRelativeAsOffset ) +void BinSingleRef2d::readBiff12Data( SequenceInputStream& rStrm, bool bRelativeAsOffset ) { sal_Int32 nRow; sal_uInt16 nCol; rStrm >> nRow >> nCol; - setOobData( nCol, nRow, bRelativeAsOffset ); + setBiff12Data( nCol, nRow, bRelativeAsOffset ); } void BinSingleRef2d::readBiff2Data( BiffInputStream& rStrm, bool bRelativeAsOffset ) @@ -144,13 +134,13 @@ void BinSingleRef2d::readBiff8Data( BiffInputStream& rStrm, bool bRelativeAsOffs // ---------------------------------------------------------------------------- -void BinComplexRef2d::readOobData( RecordInputStream& rStrm, bool bRelativeAsOffset ) +void BinComplexRef2d::readBiff12Data( SequenceInputStream& rStrm, bool bRelativeAsOffset ) { sal_Int32 nRow1, nRow2; sal_uInt16 nCol1, nCol2; rStrm >> nRow1 >> nRow2 >> nCol1 >> nCol2; - maRef1.setOobData( nCol1, nRow1, bRelativeAsOffset ); - maRef2.setOobData( nCol2, nRow2, bRelativeAsOffset ); + maRef1.setBiff12Data( nCol1, nRow1, bRelativeAsOffset ); + maRef2.setBiff12Data( nCol2, nRow2, bRelativeAsOffset ); } void BinComplexRef2d::readBiff2Data( BiffInputStream& rStrm, bool bRelativeAsOffset ) @@ -246,8 +236,8 @@ struct FunctionData { const sal_Char* mpcOdfFuncName; /// ODF function name. const sal_Char* mpcOoxFuncName; /// OOXML function name. - sal_uInt16 mnOobFuncId; /// OOBIN function identifier. - sal_uInt16 mnBiffFuncId; /// BIFF function identifier. + sal_uInt16 mnBiff12FuncId; /// BIFF12 function identifier. + sal_uInt16 mnBiffFuncId; /// BIFF2-BIFF8 function identifier. sal_uInt8 mnMinParamCount; /// Minimum number of parameters. sal_uInt8 mnMaxParamCount; /// Maximum number of parameters. sal_uInt8 mnRetClass; /// BIFF token class of the return value. @@ -264,7 +254,7 @@ inline bool FunctionData::isSupported( bool bImportFilter ) const return !getFlag( mnFlags, bImportFilter ? FUNCFLAG_EXPORTONLY : FUNCFLAG_IMPORTONLY ); } -const sal_uInt16 NOID = SAL_MAX_UINT16; /// No BIFF/OOBIN function identifier available. +const sal_uInt16 NOID = SAL_MAX_UINT16; /// No BIFF function identifier available. const sal_uInt8 MX = SAL_MAX_UINT8; /// Maximum parameter count. // abbreviations for function return token class @@ -678,8 +668,8 @@ static const FunctionData saFuncTableBiff5[] = { "COUNTBLANK", "COUNTBLANK", 347, 347, 1, 1, V, { RO }, 0 }, { "ISPMT", "ISPMT", 350, 350, 4, 4, V, { VR }, 0 }, { 0, "DATEDIF", 351, 351, 3, 3, V, { VR }, FUNCFLAG_IMPORTONLY }, // not supported in Calc - { 0, "DATESTRING", 352, 352, 1, 1, V, { VR }, FUNCFLAG_IMPORTONLY }, // not supported in Calc, missing in OOX spec - { 0, "NUMBERSTRING", 353, 353, 2, 2, V, { VR }, FUNCFLAG_IMPORTONLY }, // not supported in Calc, missing in OOX spec + { 0, "DATESTRING", 352, 352, 1, 1, V, { VR }, FUNCFLAG_IMPORTONLY }, // not supported in Calc, missing in OOXML spec + { 0, "NUMBERSTRING", 353, 353, 2, 2, V, { VR }, FUNCFLAG_IMPORTONLY }, // not supported in Calc, missing in OOXML spec { "ROMAN", "ROMAN", 354, 354, 1, 2, V, { VR }, 0 }, // *** EuroTool add-in *** @@ -722,7 +712,7 @@ static const FunctionData saFuncTableBiff8[] = { 0, "RTD", 379, 379, 3, 3, A, { VR, VR, RO }, 0 } }; -/** Functions new in OOX. */ +/** Functions new in OOXML. */ static const FunctionData saFuncTableOox[] = { { 0, "CUBEVALUE", 380, NOID, 1, MX, V, { VR, RX }, 0 }, @@ -769,7 +759,7 @@ static const FunctionData saFuncTableOdf[] = { "PERMUTATIONA", 0, NOID, NOID, 2, 2, V, { VR }, FUNCFLAG_MACROCALLODF }, { "PHI", 0, NOID, NOID, 1, 1, V, { VR }, FUNCFLAG_MACROCALLODF }, { "RRI", 0, NOID, NOID, 3, 3, V, { VR }, FUNCFLAG_MACROCALLODF }, - { "SHEET", 0, NOID, NOID, 1, 1, V, { RO }, FUNCFLAG_MACROCALLODF }, + { "SHEET", 0, NOID, NOID, 0, 1, V, { RO }, FUNCFLAG_MACROCALLODF }, { "SHEETS", 0, NOID, NOID, 0, 1, V, { RO }, FUNCFLAG_MACROCALLODF }, { "SKEWP", 0, NOID, NOID, 1, MX, V, { RX }, FUNCFLAG_MACROCALLODF }, { "UNICHAR", 0, NOID, NOID, 1, 1, V, { VR }, FUNCFLAG_MACROCALLODF }, @@ -845,8 +835,8 @@ struct FunctionProviderImpl FunctionInfoVector maFuncs; /// All function infos in one list. FuncNameMap maOdfFuncs; /// Maps ODF function names to function data. FuncNameMap maOoxFuncs; /// Maps OOXML function names to function data. - FuncIdMap maOobFuncs; /// Maps OOBIN function indexes to function data. - FuncIdMap maBiffFuncs; /// Maps BIFF function indexes to function data. + FuncIdMap maBiff12Funcs; /// Maps BIFF12 function indexes to function data. + FuncIdMap maBiffFuncs; /// Maps BIFF2-BIFF8 function indexes to function data. FuncNameMap maMacroFuncs; /// Maps macro function names to function data. explicit FunctionProviderImpl( FilterType eFilter, BiffType eBiff, bool bImportFilter ); @@ -869,9 +859,9 @@ FunctionProviderImpl::FunctionProviderImpl( FilterType eFilter, BiffType eBiff, sal_uInt8 nMaxParam = 0; switch( eFilter ) { - case FILTER_OOX: + case FILTER_OOXML: nMaxParam = OOX_MAX_PARAMCOUNT; - eBiff = BIFF8; // insert all BIFF function tables, then the OOX table + eBiff = BIFF8; // insert all BIFF function tables, then the OOXML table break; case FILTER_BIFF: nMaxParam = BIFF_MAX_PARAMCOUNT; @@ -895,7 +885,7 @@ FunctionProviderImpl::FunctionProviderImpl( FilterType eFilter, BiffType eBiff, initFuncs( saFuncTableBiff5, STATIC_ARRAY_END( saFuncTableBiff5 ), nMaxParam, bImportFilter ); if( eBiff >= BIFF8 ) initFuncs( saFuncTableBiff8, STATIC_ARRAY_END( saFuncTableBiff8 ), nMaxParam, bImportFilter ); - if( eFilter == FILTER_OOX ) + if( eFilter == FILTER_OOXML ) initFuncs( saFuncTableOox, STATIC_ARRAY_END( saFuncTableOox ), nMaxParam, bImportFilter ); initFuncs( saFuncTableOdf, STATIC_ARRAY_END( saFuncTableOdf ), nMaxParam, bImportFilter ); } @@ -928,7 +918,7 @@ void FunctionProviderImpl::initFunc( const FunctionData& rFuncData, sal_uInt8 nM } xFuncInfo->mnApiOpCode = -1; - xFuncInfo->mnOobFuncId = rFuncData.mnOobFuncId; + xFuncInfo->mnBiff12FuncId = rFuncData.mnBiff12FuncId; xFuncInfo->mnBiffFuncId = rFuncData.mnBiffFuncId; xFuncInfo->mnMinParamCount = rFuncData.mnMinParamCount; xFuncInfo->mnMaxParamCount = (rFuncData.mnMaxParamCount == MX) ? nMaxParam : rFuncData.mnMaxParamCount; @@ -941,7 +931,7 @@ void FunctionProviderImpl::initFunc( const FunctionData& rFuncData, sal_uInt8 nM xFuncInfo->mbMacroFunc = bMacroCmd || getFlag( rFuncData.mnFlags, FUNCFLAG_MACROFUNC ); xFuncInfo->mbVarParam = bMacroCmd || (rFuncData.mnMinParamCount != rFuncData.mnMaxParamCount) || getFlag( rFuncData.mnFlags, FUNCFLAG_ALWAYSVAR ); - setFlag( xFuncInfo->mnOobFuncId, BIFF_TOK_FUNCVAR_CMD, bMacroCmd ); + setFlag( xFuncInfo->mnBiff12FuncId, BIFF_TOK_FUNCVAR_CMD, bMacroCmd ); setFlag( xFuncInfo->mnBiffFuncId, BIFF_TOK_FUNCVAR_CMD, bMacroCmd ); // insert the function info into the member maps @@ -950,8 +940,8 @@ void FunctionProviderImpl::initFunc( const FunctionData& rFuncData, sal_uInt8 nM maOdfFuncs[ xFuncInfo->maOdfFuncName ] = xFuncInfo; if( xFuncInfo->maOoxFuncName.getLength() > 0 ) maOoxFuncs[ xFuncInfo->maOoxFuncName ] = xFuncInfo; - if( xFuncInfo->mnOobFuncId != NOID ) - maOobFuncs[ xFuncInfo->mnOobFuncId ] = xFuncInfo; + if( xFuncInfo->mnBiff12FuncId != NOID ) + maBiff12Funcs[ xFuncInfo->mnBiff12FuncId ] = xFuncInfo; if( xFuncInfo->mnBiffFuncId != NOID ) maBiffFuncs[ xFuncInfo->mnBiffFuncId ] = xFuncInfo; if( xFuncInfo->maBiffMacroName.getLength() > 0 ) @@ -986,9 +976,9 @@ const FunctionInfo* FunctionProvider::getFuncInfoFromOoxFuncName( const OUString return mxFuncImpl->maOoxFuncs.get( rFuncName ).get(); } -const FunctionInfo* FunctionProvider::getFuncInfoFromOobFuncId( sal_uInt16 nFuncId ) const +const FunctionInfo* FunctionProvider::getFuncInfoFromBiff12FuncId( sal_uInt16 nFuncId ) const { - return mxFuncImpl->maOobFuncs.get( nFuncId ).get(); + return mxFuncImpl->maBiff12Funcs.get( nFuncId ).get(); } const FunctionInfo* FunctionProvider::getFuncInfoFromBiffFuncId( sal_uInt16 nFuncId ) const @@ -1252,7 +1242,7 @@ bool OpCodeProviderImpl::initFuncOpCode( FunctionInfo& orFuncInfo, const ApiToke append( '"' ).getStr() ); } - // add to parser map, if OOX function name exists + // add to parser map, if OOXML function name exists if( bIsValid && (orFuncInfo.maOoxFuncName.getLength() > 0) ) { // create the parser map entry @@ -1747,4 +1737,3 @@ void FormulaProcessorBase::convertStringToStringList( } // namespace xls } // namespace oox - diff --git a/oox/source/xls/formulaparser.cxx b/oox/source/xls/formulaparser.cxx index 12deadecd695..8b1f1b809d88 100644 --- a/oox/source/xls/formulaparser.cxx +++ b/oox/source/xls/formulaparser.cxx @@ -26,14 +26,13 @@ ************************************************************************/ #include "oox/xls/formulaparser.hxx" + #include <com/sun/star/lang/XMultiServiceFactory.hpp> #include <com/sun/star/sheet/ComplexReference.hpp> #include <com/sun/star/sheet/ExternalReference.hpp> #include <com/sun/star/sheet/FormulaToken.hpp> #include <com/sun/star/sheet/ReferenceFlags.hpp> #include <com/sun/star/sheet/SingleReference.hpp> -#include "properties.hxx" -#include "oox/helper/recordinputstream.hxx" #include "oox/core/filterbase.hxx" #include "oox/xls/addressconverter.hxx" #include "oox/xls/biffinputstream.hxx" @@ -42,26 +41,20 @@ #include "oox/xls/tablebuffer.hxx" #include "oox/xls/worksheethelper.hxx" -using ::rtl::OUString; -using ::com::sun::star::uno::Any; -using ::com::sun::star::uno::Reference; -using ::com::sun::star::uno::Sequence; -using ::com::sun::star::uno::Exception; -using ::com::sun::star::uno::UNO_QUERY; -using ::com::sun::star::uno::UNO_QUERY_THROW; -using ::com::sun::star::table::CellAddress; -using ::com::sun::star::table::CellRangeAddress; -using ::com::sun::star::sheet::ComplexReference; -using ::com::sun::star::sheet::ExternalReference; -using ::com::sun::star::sheet::SingleReference; -using ::com::sun::star::sheet::XFormulaParser; -using namespace ::com::sun::star::sheet::ReferenceFlags; - namespace oox { namespace xls { // ============================================================================ +using namespace ::com::sun::star::sheet; +using namespace ::com::sun::star::sheet::ReferenceFlags; +using namespace ::com::sun::star::table; +using namespace ::com::sun::star::uno; + +using ::rtl::OUString; + +// ============================================================================ + namespace { sal_uInt16 lclReadFmlaSize( BiffInputStream& rStrm, BiffType eBiff, const sal_uInt16* pnFmlaSize ) @@ -249,7 +242,7 @@ const ApiToken* FormulaFinalizer::processParameters( if( !aParamInfoIt.isExcelOnlyParam() ) { // replace empty second and third parameter in IF function with zeros - if( (pRealFuncInfo->mnOobFuncId == OOBIN_FUNC_IF) && ((nParam == 1) || (nParam == 2)) && bIsEmpty ) + if( (pRealFuncInfo->mnBiff12FuncId == BIFF_FUNC_IF) && ((nParam == 1) || (nParam == 2)) && bIsEmpty ) { maTokens.append< double >( OPCODE_PUSH, 0.0 ); bIsEmpty = false; @@ -368,10 +361,10 @@ const ApiToken* FormulaFinalizer::findParameters( ParameterPosVector& rParams, void FormulaFinalizer::appendCalcOnlyParameter( const FunctionInfo& rFuncInfo, size_t nParam ) { (void)nParam; // prevent 'unused' warning - switch( rFuncInfo.mnOobFuncId ) + switch( rFuncInfo.mnBiff12FuncId ) { - case OOBIN_FUNC_FLOOR: - case OOBIN_FUNC_CEILING: + case BIFF_FUNC_FLOOR: + case BIFF_FUNC_CEILING: OSL_ENSURE( nParam == 2, "FormulaFinalizer::appendCalcOnlyParameter - unexpected parameter index" ); maTokens.append< double >( OPCODE_PUSH, 1.0 ); maTokens.append( OPCODE_SEP ); @@ -381,9 +374,9 @@ void FormulaFinalizer::appendCalcOnlyParameter( const FunctionInfo& rFuncInfo, s void FormulaFinalizer::appendRequiredParameters( const FunctionInfo& rFuncInfo, size_t nParamCount ) { - switch( rFuncInfo.mnOobFuncId ) + switch( rFuncInfo.mnBiff12FuncId ) { - case OOBIN_FUNC_WEEKNUM: + case BIFF_FUNC_WEEKNUM: if( nParamCount == 1 ) { maTokens.append< double >( OPCODE_PUSH, 1.0 ); @@ -422,12 +415,12 @@ public: FormulaContext& rContext, const OUString& rFormulaString ); - /** Imports and converts a OOBIN token array from the passed stream. */ - virtual void importOobFormula( + /** Imports and converts a BIFF12 token array from the passed stream. */ + virtual void importBiff12Formula( FormulaContext& rContext, - RecordInputStream& rStrm ); + SequenceInputStream& rStrm ); - /** Imports and converts a BIFF token array from the passed stream. */ + /** Imports and converts a BIFF2-BIFF8 token array from the passed stream. */ virtual void importBiffFormula( FormulaContext& rContext, BiffInputStream& rStrm, const sal_uInt16* pnFmlaSize ); @@ -439,7 +432,7 @@ public: const ApiTokenSequence& rTokens ); /** Tries to resolve the passed ref-id to an OLE target URL. */ - OUString resolveOleTarget( sal_Int32 nRefId ) const; + OUString resolveOleTarget( sal_Int32 nRefId, bool bUseRefSheets ) const; protected: typedef ::std::pair< sal_Int32, bool > WhiteSpace; @@ -589,9 +582,9 @@ void FormulaParserImpl::importOoxFormula( FormulaContext&, const OUString& ) OSL_ENSURE( false, "FormulaParserImpl::importOoxFormula - not implemented" ); } -void FormulaParserImpl::importOobFormula( FormulaContext&, RecordInputStream& ) +void FormulaParserImpl::importBiff12Formula( FormulaContext&, SequenceInputStream& ) { - OSL_ENSURE( false, "FormulaParserImpl::importOobFormula - not implemented" ); + OSL_ENSURE( false, "FormulaParserImpl::importBiff12Formula - not implemented" ); } void FormulaParserImpl::importBiffFormula( FormulaContext&, BiffInputStream&, const sal_uInt16* ) @@ -605,9 +598,9 @@ void FormulaParserImpl::setFormula( FormulaContext& rContext, const ApiTokenSequ finalizeImport( rTokens ); } -OUString FormulaParserImpl::resolveOleTarget( sal_Int32 nRefId ) const +OUString FormulaParserImpl::resolveOleTarget( sal_Int32 nRefId, bool bUseRefSheets ) const { - const ExternalLink* pExtLink = getExternalLinks().getExternalLink( nRefId ).get(); + const ExternalLink* pExtLink = getExternalLinks().getExternalLink( nRefId, bUseRefSheets ).get(); OSL_ENSURE( pExtLink && (pExtLink->getLinkType() == LINKTYPE_OLE), "FormulaParserImpl::resolveOleTarget - missing or wrong link" ); if( pExtLink && (pExtLink->getLinkType() == LINKTYPE_OLE) ) return getBaseFilter().getAbsoluteUrl( pExtLink->getTargetUrl() ); @@ -903,7 +896,7 @@ bool FormulaParserImpl::pushValueOperand( const Type& rValue, sal_Int32 nOpCode bool FormulaParserImpl::pushBoolOperand( bool bValue ) { - if( const FunctionInfo* pFuncInfo = getFuncInfoFromOobFuncId( bValue ? OOBIN_FUNC_TRUE : OOBIN_FUNC_FALSE ) ) + if( const FunctionInfo* pFuncInfo = getFuncInfoFromBiff12FuncId( bValue ? BIFF_FUNC_TRUE : BIFF_FUNC_FALSE ) ) return pushFunctionOperator( pFuncInfo->mnApiOpCode, 0 ); return pushValueOperand< double >( bValue ? 1.0 : 0.0 ); } @@ -1234,7 +1227,7 @@ OUString FormulaParserImpl::resolveDefinedName( sal_Int32 nTokenIndex ) const return OUString(); } -// OOX parser implementation ================================================== +// OOXML/BIFF12 parser implementation ========================================= class OoxFormulaParserImpl : public FormulaParserImpl { @@ -1245,40 +1238,40 @@ public: FormulaContext& rContext, const OUString& rFormulaString ); - virtual void importOobFormula( + virtual void importBiff12Formula( FormulaContext& rContext, - RecordInputStream& rStrm ); + SequenceInputStream& rStrm ); private: // import token contents and create API formula token --------------------- - bool importAttrToken( RecordInputStream& rStrm ); - bool importSpaceToken( RecordInputStream& rStrm ); - bool importTableToken( RecordInputStream& rStrm ); - bool importArrayToken( RecordInputStream& rStrm ); - bool importRefToken( RecordInputStream& rStrm, bool bDeleted, bool bRelativeAsOffset ); - bool importAreaToken( RecordInputStream& rStrm, bool bDeleted, bool bRelativeAsOffset ); - bool importRef3dToken( RecordInputStream& rStrm, bool bDeleted, bool bRelativeAsOffset ); - bool importArea3dToken( RecordInputStream& rStrm, bool bDeleted, bool bRelativeAsOffset ); - bool importMemAreaToken( RecordInputStream& rStrm, bool bAddData ); - bool importMemFuncToken( RecordInputStream& rStrm ); - bool importNameToken( RecordInputStream& rStrm ); - bool importNameXToken( RecordInputStream& rStrm ); - bool importFuncToken( RecordInputStream& rStrm ); - bool importFuncVarToken( RecordInputStream& rStrm ); - bool importExpToken( RecordInputStream& rStrm ); - - LinkSheetRange readSheetRange( RecordInputStream& rStrm ); - - void swapStreamPosition( RecordInputStream& rStrm ); - void skipMemAreaAddData( RecordInputStream& rStrm ); + bool importAttrToken( SequenceInputStream& rStrm ); + bool importSpaceToken( SequenceInputStream& rStrm ); + bool importTableToken( SequenceInputStream& rStrm ); + bool importArrayToken( SequenceInputStream& rStrm ); + bool importRefToken( SequenceInputStream& rStrm, bool bDeleted, bool bRelativeAsOffset ); + bool importAreaToken( SequenceInputStream& rStrm, bool bDeleted, bool bRelativeAsOffset ); + bool importRef3dToken( SequenceInputStream& rStrm, bool bDeleted, bool bRelativeAsOffset ); + bool importArea3dToken( SequenceInputStream& rStrm, bool bDeleted, bool bRelativeAsOffset ); + bool importMemAreaToken( SequenceInputStream& rStrm, bool bAddData ); + bool importMemFuncToken( SequenceInputStream& rStrm ); + bool importNameToken( SequenceInputStream& rStrm ); + bool importNameXToken( SequenceInputStream& rStrm ); + bool importFuncToken( SequenceInputStream& rStrm ); + bool importFuncVarToken( SequenceInputStream& rStrm ); + bool importExpToken( SequenceInputStream& rStrm ); + + LinkSheetRange readSheetRange( SequenceInputStream& rStrm ); + + void swapStreamPosition( SequenceInputStream& rStrm ); + void skipMemAreaAddData( SequenceInputStream& rStrm ); // convert BIN token and push API operand or operator --------------------- - bool pushOobName( sal_Int32 nNameId ); - bool pushOobExtName( sal_Int32 nRefId, sal_Int32 nNameId ); - bool pushOobFunction( sal_uInt16 nFuncId ); - bool pushOobFunction( sal_uInt16 nFuncId, sal_uInt8 nParamCount ); + bool pushBiff12Name( sal_Int32 nNameId ); + bool pushBiff12ExtName( sal_Int32 nRefId, sal_Int32 nNameId ); + bool pushBiff12Function( sal_uInt16 nFuncId ); + bool pushBiff12Function( sal_uInt16 nFuncId, sal_uInt8 nParamCount ); private: ApiParserWrapper maApiParser; /// Wrapper for the API formula parser object. @@ -1307,7 +1300,7 @@ void OoxFormulaParserImpl::importOoxFormula( FormulaContext& rContext, const OUS finalizeImport( maApiParser.parseFormula( rFormulaString, rContext.getBaseAddress() ) ); } -void OoxFormulaParserImpl::importOobFormula( FormulaContext& rContext, RecordInputStream& rStrm ) +void OoxFormulaParserImpl::importBiff12Formula( FormulaContext& rContext, SequenceInputStream& rStrm ) { initializeImport( rContext ); @@ -1336,34 +1329,34 @@ void OoxFormulaParserImpl::importOobFormula( FormulaContext& rContext, RecordInp // base tokens switch( nBaseId ) { - case BIFF_TOKID_EXP: bOk = importExpToken( rStrm ); break; - case BIFF_TOKID_ADD: bOk = pushBinaryOperator( OPCODE_ADD ); break; - case BIFF_TOKID_SUB: bOk = pushBinaryOperator( OPCODE_SUB ); break; - case BIFF_TOKID_MUL: bOk = pushBinaryOperator( OPCODE_MULT ); break; - case BIFF_TOKID_DIV: bOk = pushBinaryOperator( OPCODE_DIV ); break; - case BIFF_TOKID_POWER: bOk = pushBinaryOperator( OPCODE_POWER ); break; - case BIFF_TOKID_CONCAT: bOk = pushBinaryOperator( OPCODE_CONCAT ); break; - case BIFF_TOKID_LT: bOk = pushBinaryOperator( OPCODE_LESS ); break; - case BIFF_TOKID_LE: bOk = pushBinaryOperator( OPCODE_LESS_EQUAL ); break; - case BIFF_TOKID_EQ: bOk = pushBinaryOperator( OPCODE_EQUAL ); break; - case BIFF_TOKID_GE: bOk = pushBinaryOperator( OPCODE_GREATER_EQUAL ); break; - case BIFF_TOKID_GT: bOk = pushBinaryOperator( OPCODE_GREATER ); break; - case BIFF_TOKID_NE: bOk = pushBinaryOperator( OPCODE_NOT_EQUAL ); break; - case BIFF_TOKID_ISECT: bOk = pushBinaryOperator( OPCODE_INTERSECT ); break; - case BIFF_TOKID_LIST: bOk = pushBinaryOperator( OPCODE_LIST ); break; - case BIFF_TOKID_RANGE: bOk = pushBinaryOperator( OPCODE_RANGE ); break; - case BIFF_TOKID_UPLUS: bOk = pushUnaryPreOperator( OPCODE_PLUS_SIGN ); break; - case BIFF_TOKID_UMINUS: bOk = pushUnaryPreOperator( OPCODE_MINUS_SIGN ); break; - case BIFF_TOKID_PERCENT: bOk = pushUnaryPostOperator( OPCODE_PERCENT ); break; - case BIFF_TOKID_PAREN: bOk = pushParenthesesOperator(); break; - case BIFF_TOKID_MISSARG: bOk = pushOperand( OPCODE_MISSING ); break; - case BIFF_TOKID_STR: bOk = pushValueOperand( rStrm.readString( false ) ); break; - case BIFF_TOKID_NLR: bOk = importTableToken( rStrm ); break; - case BIFF_TOKID_ATTR: bOk = importAttrToken( rStrm ); break; - case BIFF_TOKID_ERR: bOk = pushBiffErrorOperand( rStrm.readuInt8() ); break; - case BIFF_TOKID_BOOL: bOk = pushBiffBoolOperand( rStrm.readuInt8() ); break; - case BIFF_TOKID_INT: bOk = pushValueOperand< double >( rStrm.readuInt16() ); break; - case BIFF_TOKID_NUM: bOk = pushValueOperand( rStrm.readDouble() ); break; + case BIFF_TOKID_EXP: bOk = importExpToken( rStrm ); break; + case BIFF_TOKID_ADD: bOk = pushBinaryOperator( OPCODE_ADD ); break; + case BIFF_TOKID_SUB: bOk = pushBinaryOperator( OPCODE_SUB ); break; + case BIFF_TOKID_MUL: bOk = pushBinaryOperator( OPCODE_MULT ); break; + case BIFF_TOKID_DIV: bOk = pushBinaryOperator( OPCODE_DIV ); break; + case BIFF_TOKID_POWER: bOk = pushBinaryOperator( OPCODE_POWER ); break; + case BIFF_TOKID_CONCAT: bOk = pushBinaryOperator( OPCODE_CONCAT ); break; + case BIFF_TOKID_LT: bOk = pushBinaryOperator( OPCODE_LESS ); break; + case BIFF_TOKID_LE: bOk = pushBinaryOperator( OPCODE_LESS_EQUAL ); break; + case BIFF_TOKID_EQ: bOk = pushBinaryOperator( OPCODE_EQUAL ); break; + case BIFF_TOKID_GE: bOk = pushBinaryOperator( OPCODE_GREATER_EQUAL ); break; + case BIFF_TOKID_GT: bOk = pushBinaryOperator( OPCODE_GREATER ); break; + case BIFF_TOKID_NE: bOk = pushBinaryOperator( OPCODE_NOT_EQUAL ); break; + case BIFF_TOKID_ISECT: bOk = pushBinaryOperator( OPCODE_INTERSECT ); break; + case BIFF_TOKID_LIST: bOk = pushBinaryOperator( OPCODE_LIST ); break; + case BIFF_TOKID_RANGE: bOk = pushBinaryOperator( OPCODE_RANGE ); break; + case BIFF_TOKID_UPLUS: bOk = pushUnaryPreOperator( OPCODE_PLUS_SIGN ); break; + case BIFF_TOKID_UMINUS: bOk = pushUnaryPreOperator( OPCODE_MINUS_SIGN ); break; + case BIFF_TOKID_PERCENT: bOk = pushUnaryPostOperator( OPCODE_PERCENT ); break; + case BIFF_TOKID_PAREN: bOk = pushParenthesesOperator(); break; + case BIFF_TOKID_MISSARG: bOk = pushOperand( OPCODE_MISSING ); break; + case BIFF_TOKID_STR: bOk = pushValueOperand( BiffHelper::readString( rStrm, false ) ); break; + case BIFF_TOKID_NLR: bOk = importTableToken( rStrm ); break; + case BIFF_TOKID_ATTR: bOk = importAttrToken( rStrm ); break; + case BIFF_TOKID_ERR: bOk = pushBiffErrorOperand( rStrm.readuInt8() ); break; + case BIFF_TOKID_BOOL: bOk = pushBiffBoolOperand( rStrm.readuInt8() ); break; + case BIFF_TOKID_INT: bOk = pushValueOperand< double >( rStrm.readuInt16() ); break; + case BIFF_TOKID_NUM: bOk = pushValueOperand( rStrm.readDouble() ); break; default: bOk = false; } } @@ -1409,31 +1402,31 @@ void OoxFormulaParserImpl::importOobFormula( FormulaContext& rContext, RecordInp // import token contents and create API formula token ------------------------- -bool OoxFormulaParserImpl::importAttrToken( RecordInputStream& rStrm ) +bool OoxFormulaParserImpl::importAttrToken( SequenceInputStream& rStrm ) { bool bOk = true; sal_uInt8 nType; rStrm >> nType; - // equal flags in BIFF and OOBIN + // equal flags in all BIFFs switch( nType ) { case 0: // sometimes, tAttrSkip tokens miss the type flag - case OOBIN_TOK_ATTR_VOLATILE: - case OOBIN_TOK_ATTR_IF: - case OOBIN_TOK_ATTR_SKIP: - case OOBIN_TOK_ATTR_ASSIGN: - case OOBIN_TOK_ATTR_IFERROR: + case BIFF_TOK_ATTR_VOLATILE: + case BIFF_TOK_ATTR_IF: + case BIFF_TOK_ATTR_SKIP: + case BIFF_TOK_ATTR_ASSIGN: + case BIFF_TOK_ATTR_IFERROR: rStrm.skip( 2 ); break; - case OOBIN_TOK_ATTR_CHOOSE: + case BIFF_TOK_ATTR_CHOOSE: rStrm.skip( 2 * rStrm.readuInt16() + 2 ); break; - case OOBIN_TOK_ATTR_SUM: + case BIFF_TOK_ATTR_SUM: rStrm.skip( 2 ); - bOk = pushOobFunction( OOBIN_FUNC_SUM, 1 ); + bOk = pushBiff12Function( BIFF_FUNC_SUM, 1 ); break; - case OOBIN_TOK_ATTR_SPACE: - case OOBIN_TOK_ATTR_SPACE_VOLATILE: + case BIFF_TOK_ATTR_SPACE: + case BIFF_TOK_ATTR_SPACE_VOLATILE: bOk = importSpaceToken( rStrm ); break; default: @@ -1442,7 +1435,7 @@ bool OoxFormulaParserImpl::importAttrToken( RecordInputStream& rStrm ) return bOk; } -bool OoxFormulaParserImpl::importSpaceToken( RecordInputStream& rStrm ) +bool OoxFormulaParserImpl::importSpaceToken( SequenceInputStream& rStrm ) { // equal constants in BIFF and OOX sal_uInt8 nType, nCount; @@ -1471,7 +1464,7 @@ bool OoxFormulaParserImpl::importSpaceToken( RecordInputStream& rStrm ) return true; } -bool OoxFormulaParserImpl::importTableToken( RecordInputStream& rStrm ) +bool OoxFormulaParserImpl::importTableToken( SequenceInputStream& rStrm ) { sal_uInt16 nFlags, nTableId, nCol1, nCol2; rStrm.skip( 3 ); @@ -1491,8 +1484,8 @@ bool OoxFormulaParserImpl::importTableToken( RecordInputStream& rStrm ) bool bFixedStartRow = true; bool bFixedHeight = false; - bool bSingleCol = getFlag( nFlags, OOBIN_TOK_TABLE_COLUMN ); - bool bColRange = getFlag( nFlags, OOBIN_TOK_TABLE_COLRANGE ); + bool bSingleCol = getFlag( nFlags, BIFF12_TOK_TABLE_COLUMN ); + bool bColRange = getFlag( nFlags, BIFF12_TOK_TABLE_COLRANGE ); bool bValidRef = !bSingleCol || !bColRange; OSL_ENSURE( bValidRef, "OoxFormulaParserImpl::importTableToken - illegal combination of single column and column range" ); if( bValidRef ) @@ -1507,11 +1500,11 @@ bool OoxFormulaParserImpl::importTableToken( RecordInputStream& rStrm ) if( bValidRef ) { - bool bAllRows = getFlag( nFlags, OOBIN_TOK_TABLE_ALL ); - bool bHeaderRows = getFlag( nFlags, OOBIN_TOK_TABLE_HEADERS ); - bool bDataRows = getFlag( nFlags, OOBIN_TOK_TABLE_DATA ); - bool bTotalsRows = getFlag( nFlags, OOBIN_TOK_TABLE_TOTALS ); - bool bThisRow = getFlag( nFlags, OOBIN_TOK_TABLE_THISROW ); + bool bAllRows = getFlag( nFlags, BIFF12_TOK_TABLE_ALL ); + bool bHeaderRows = getFlag( nFlags, BIFF12_TOK_TABLE_HEADERS ); + bool bDataRows = getFlag( nFlags, BIFF12_TOK_TABLE_DATA ); + bool bTotalsRows = getFlag( nFlags, BIFF12_TOK_TABLE_TOTALS ); + bool bThisRow = getFlag( nFlags, BIFF12_TOK_TABLE_THISROW ); sal_Int32 nStartDataRow = xTable->getHeaderRows(); sal_Int32 nEndDataRow = nEndRow - xTable->getTotalsRows(); @@ -1567,8 +1560,8 @@ bool OoxFormulaParserImpl::importTableToken( RecordInputStream& rStrm ) if( (nStartCol == 0) && (nEndCol + 1 == nWidth) && (nStartRow == 0) && (nEndRow + 1 == nHeight) ) return pushValueOperand( nTokenIndex, OPCODE_DBAREA ); // create an OFFSET function call to refer to a subrange of the table - const FunctionInfo* pRowsInfo = getFuncInfoFromOobFuncId( OOBIN_FUNC_ROWS ); - const FunctionInfo* pColumnsInfo = getFuncInfoFromOobFuncId( OOBIN_FUNC_COLUMNS ); + const FunctionInfo* pRowsInfo = getFuncInfoFromBiff12FuncId( BIFF_FUNC_ROWS ); + const FunctionInfo* pColumnsInfo = getFuncInfoFromBiff12FuncId( BIFF_FUNC_COLUMNS ); return pRowsInfo && pColumnsInfo && pushValueOperandToken( nTokenIndex, OPCODE_DBAREA ) && @@ -1590,13 +1583,13 @@ bool OoxFormulaParserImpl::importTableToken( RecordInputStream& rStrm ) (pushValueOperandToken( nTokenIndex, OPCODE_DBAREA ) && pushFunctionOperatorToken( *pColumnsInfo, 1 )) : pushValueOperandToken< double >( nEndCol - nStartCol + 1 )) && - pushOobFunction( OOBIN_FUNC_OFFSET, 5 ); + pushBiff12Function( BIFF_FUNC_OFFSET, 5 ); } } return pushBiffErrorOperand( BIFF_ERR_REF ); } -bool OoxFormulaParserImpl::importArrayToken( RecordInputStream& rStrm ) +bool OoxFormulaParserImpl::importArrayToken( SequenceInputStream& rStrm ) { rStrm.skip( 14 ); @@ -1622,16 +1615,16 @@ bool OoxFormulaParserImpl::importArrayToken( RecordInputStream& rStrm ) appendRawToken( OPCODE_ARRAY_COLSEP ); switch( rStrm.readuInt8() ) { - case OOBIN_TOK_ARRAY_DOUBLE: + case BIFF_TOK_ARRAY_DOUBLE: appendRawToken( OPCODE_PUSH ) <<= rStrm.readDouble(); break; - case OOBIN_TOK_ARRAY_STRING: - appendRawToken( OPCODE_PUSH ) <<= rStrm.readString( false ); + case BIFF_TOK_ARRAY_STRING: + appendRawToken( OPCODE_PUSH ) <<= BiffHelper::readString( rStrm, false ); break; - case OOBIN_TOK_ARRAY_BOOL: + case BIFF_TOK_ARRAY_BOOL: appendRawToken( OPCODE_PUSH ) <<= static_cast< double >( (rStrm.readuInt8() == BIFF_TOK_BOOL_FALSE) ? 0.0 : 1.0 ); break; - case OOBIN_TOK_ARRAY_ERROR: + case BIFF_TOK_ARRAY_ERROR: appendRawToken( OPCODE_PUSH ) <<= BiffHelper::calcDoubleFromError( rStrm.readuInt8() ); rStrm.skip( 3 ); break; @@ -1649,37 +1642,37 @@ bool OoxFormulaParserImpl::importArrayToken( RecordInputStream& rStrm ) return true; } -bool OoxFormulaParserImpl::importRefToken( RecordInputStream& rStrm, bool bDeleted, bool bRelativeAsOffset ) +bool OoxFormulaParserImpl::importRefToken( SequenceInputStream& rStrm, bool bDeleted, bool bRelativeAsOffset ) { BinSingleRef2d aRef; - aRef.readOobData( rStrm, bRelativeAsOffset ); + aRef.readBiff12Data( rStrm, bRelativeAsOffset ); return pushReferenceOperand( aRef, bDeleted, bRelativeAsOffset ); } -bool OoxFormulaParserImpl::importAreaToken( RecordInputStream& rStrm, bool bDeleted, bool bRelativeAsOffset ) +bool OoxFormulaParserImpl::importAreaToken( SequenceInputStream& rStrm, bool bDeleted, bool bRelativeAsOffset ) { BinComplexRef2d aRef; - aRef.readOobData( rStrm, bRelativeAsOffset ); + aRef.readBiff12Data( rStrm, bRelativeAsOffset ); return pushReferenceOperand( aRef, bDeleted, bRelativeAsOffset ); } -bool OoxFormulaParserImpl::importRef3dToken( RecordInputStream& rStrm, bool bDeleted, bool bRelativeAsOffset ) +bool OoxFormulaParserImpl::importRef3dToken( SequenceInputStream& rStrm, bool bDeleted, bool bRelativeAsOffset ) { LinkSheetRange aSheetRange = readSheetRange( rStrm ); BinSingleRef2d aRef; - aRef.readOobData( rStrm, bRelativeAsOffset ); + aRef.readBiff12Data( rStrm, bRelativeAsOffset ); return pushReferenceOperand( aSheetRange, aRef, bDeleted, bRelativeAsOffset ); } -bool OoxFormulaParserImpl::importArea3dToken( RecordInputStream& rStrm, bool bDeleted, bool bRelativeAsOffset ) +bool OoxFormulaParserImpl::importArea3dToken( SequenceInputStream& rStrm, bool bDeleted, bool bRelativeAsOffset ) { LinkSheetRange aSheetRange = readSheetRange( rStrm ); BinComplexRef2d aRef; - aRef.readOobData( rStrm, bRelativeAsOffset ); + aRef.readBiff12Data( rStrm, bRelativeAsOffset ); return pushReferenceOperand( aSheetRange, aRef, bDeleted, bRelativeAsOffset ); } -bool OoxFormulaParserImpl::importMemAreaToken( RecordInputStream& rStrm, bool bAddData ) +bool OoxFormulaParserImpl::importMemAreaToken( SequenceInputStream& rStrm, bool bAddData ) { rStrm.skip( 6 ); if( bAddData ) @@ -1687,40 +1680,40 @@ bool OoxFormulaParserImpl::importMemAreaToken( RecordInputStream& rStrm, bool bA return true; } -bool OoxFormulaParserImpl::importMemFuncToken( RecordInputStream& rStrm ) +bool OoxFormulaParserImpl::importMemFuncToken( SequenceInputStream& rStrm ) { rStrm.skip( 2 ); return true; } -bool OoxFormulaParserImpl::importNameToken( RecordInputStream& rStrm ) +bool OoxFormulaParserImpl::importNameToken( SequenceInputStream& rStrm ) { - return pushOobName( rStrm.readInt32() ); + return pushBiff12Name( rStrm.readInt32() ); } -bool OoxFormulaParserImpl::importNameXToken( RecordInputStream& rStrm ) +bool OoxFormulaParserImpl::importNameXToken( SequenceInputStream& rStrm ) { sal_Int32 nRefId = rStrm.readInt16(); sal_Int32 nNameId = rStrm.readInt32(); - return pushOobExtName( nRefId, nNameId ); + return pushBiff12ExtName( nRefId, nNameId ); } -bool OoxFormulaParserImpl::importFuncToken( RecordInputStream& rStrm ) +bool OoxFormulaParserImpl::importFuncToken( SequenceInputStream& rStrm ) { sal_uInt16 nFuncId; rStrm >> nFuncId; - return pushOobFunction( nFuncId ); + return pushBiff12Function( nFuncId ); } -bool OoxFormulaParserImpl::importFuncVarToken( RecordInputStream& rStrm ) +bool OoxFormulaParserImpl::importFuncVarToken( SequenceInputStream& rStrm ) { sal_uInt8 nParamCount; sal_uInt16 nFuncId; rStrm >> nParamCount >> nFuncId; - return pushOobFunction( nFuncId, nParamCount ); + return pushBiff12Function( nFuncId, nParamCount ); } -bool OoxFormulaParserImpl::importExpToken( RecordInputStream& rStrm ) +bool OoxFormulaParserImpl::importExpToken( SequenceInputStream& rStrm ) { BinAddress aBaseAddr; rStrm >> aBaseAddr.mnRow; @@ -1732,19 +1725,19 @@ bool OoxFormulaParserImpl::importExpToken( RecordInputStream& rStrm ) return false; } -LinkSheetRange OoxFormulaParserImpl::readSheetRange( RecordInputStream& rStrm ) +LinkSheetRange OoxFormulaParserImpl::readSheetRange( SequenceInputStream& rStrm ) { return getExternalLinks().getSheetRange( rStrm.readInt16() ); } -void OoxFormulaParserImpl::swapStreamPosition( RecordInputStream& rStrm ) +void OoxFormulaParserImpl::swapStreamPosition( SequenceInputStream& rStrm ) { sal_Int64 nRecPos = rStrm.tell(); rStrm.seek( mnAddDataPos ); mnAddDataPos = nRecPos; } -void OoxFormulaParserImpl::skipMemAreaAddData( RecordInputStream& rStrm ) +void OoxFormulaParserImpl::skipMemAreaAddData( SequenceInputStream& rStrm ) { swapStreamPosition( rStrm ); rStrm.skip( 16 * rStrm.readInt32() ); @@ -1753,38 +1746,38 @@ void OoxFormulaParserImpl::skipMemAreaAddData( RecordInputStream& rStrm ) // convert BIN token and push API operand or operator ------------------------- -bool OoxFormulaParserImpl::pushOobName( sal_Int32 nNameId ) +bool OoxFormulaParserImpl::pushBiff12Name( sal_Int32 nNameId ) { - // one-based in OOBIN formulas + // one-based in BIFF12 formulas return pushDefinedNameOperand( getDefinedNames().getByIndex( nNameId - 1 ) ); } -bool OoxFormulaParserImpl::pushOobExtName( sal_Int32 nRefId, sal_Int32 nNameId ) +bool OoxFormulaParserImpl::pushBiff12ExtName( sal_Int32 nRefId, sal_Int32 nNameId ) { if( const ExternalLink* pExtLink = getExternalLinks().getExternalLink( nRefId ).get() ) { if( pExtLink->getLinkType() == LINKTYPE_SELF ) - return pushOobName( nNameId ); - // external name indexes are one-based in OOBIN + return pushBiff12Name( nNameId ); + // external name indexes are one-based in BIFF12 ExternalNameRef xExtName = pExtLink->getNameByIndex( nNameId - 1 ); return pushExternalNameOperand( xExtName, *pExtLink ); } return pushBiffErrorOperand( BIFF_ERR_NAME ); } -bool OoxFormulaParserImpl::pushOobFunction( sal_uInt16 nFuncId ) +bool OoxFormulaParserImpl::pushBiff12Function( sal_uInt16 nFuncId ) { - if( const FunctionInfo* pFuncInfo = getFuncInfoFromOobFuncId( nFuncId ) ) + if( const FunctionInfo* pFuncInfo = getFuncInfoFromBiff12FuncId( nFuncId ) ) if( pFuncInfo->mnMinParamCount == pFuncInfo->mnMaxParamCount ) return pushFunctionOperator( *pFuncInfo, pFuncInfo->mnMinParamCount ); return pushFunctionOperator( OPCODE_NONAME, 0 ); } -bool OoxFormulaParserImpl::pushOobFunction( sal_uInt16 nFuncId, sal_uInt8 nParamCount ) +bool OoxFormulaParserImpl::pushBiff12Function( sal_uInt16 nFuncId, sal_uInt8 nParamCount ) { if( getFlag( nFuncId, BIFF_TOK_FUNCVAR_CMD ) ) nParamCount &= BIFF_TOK_FUNCVAR_COUNTMASK; - if( const FunctionInfo* pFuncInfo = getFuncInfoFromOobFuncId( nFuncId ) ) + if( const FunctionInfo* pFuncInfo = getFuncInfoFromBiff12FuncId( nFuncId ) ) return pushFunctionOperator( *pFuncInfo, nParamCount ); return pushFunctionOperator( OPCODE_NONAME, nParamCount ); } @@ -2734,12 +2727,35 @@ bool BiffFormulaParserImpl::pushBiffFunction( sal_uInt16 nFuncId, sal_uInt8 nPar // ============================================================================ +namespace { + +/** Extracts the reference identifier and the remaining data from a formula in + the format '[RefID]Remaining'. */ +bool lclExtractRefId( sal_Int32& rnRefId, OUString& rRemainder, const OUString& rFormulaString ) +{ + if( (rFormulaString.getLength() >= 4) && (rFormulaString[ 0 ] == '[') ) + { + sal_Int32 nBracketClose = rFormulaString.indexOf( ']', 1 ); + if( nBracketClose >= 2 ) + { + rnRefId = rFormulaString.copy( 1, nBracketClose - 1 ).toInt32(); + rRemainder = rFormulaString.copy( nBracketClose + 1 ); + return rRemainder.getLength() > 0; + } + } + return false; +} + +} + +// ---------------------------------------------------------------------------- + FormulaParser::FormulaParser( const WorkbookHelper& rHelper ) : FormulaProcessorBase( rHelper ) { switch( getFilterType() ) { - case FILTER_OOX: mxImpl.reset( new OoxFormulaParserImpl( *this ) ); break; + case FILTER_OOXML: mxImpl.reset( new OoxFormulaParserImpl( *this ) ); break; case FILTER_BIFF: mxImpl.reset( new BiffFormulaParserImpl( *this ) ); break; case FILTER_UNKNOWN: break; } @@ -2754,9 +2770,9 @@ void FormulaParser::importFormula( FormulaContext& rContext, const OUString& rFo mxImpl->importOoxFormula( rContext, rFormulaString ); } -void FormulaParser::importFormula( FormulaContext& rContext, RecordInputStream& rStrm ) const +void FormulaParser::importFormula( FormulaContext& rContext, SequenceInputStream& rStrm ) const { - mxImpl->importOobFormula( rContext, rStrm ); + mxImpl->importBiff12Formula( rContext, rStrm ); } void FormulaParser::importFormula( FormulaContext& rContext, BiffInputStream& rStrm, const sal_uInt16* pnFmlaSize ) const @@ -2791,7 +2807,7 @@ void FormulaParser::convertNameToFormula( FormulaContext& rContext, sal_Int32 nT void FormulaParser::convertNumberToHyperlink( FormulaContext& rContext, const OUString& rUrl, double fValue ) const { OSL_ENSURE( rUrl.getLength() > 0, "FormulaParser::convertNumberToHyperlink - missing URL" ); - if( const FunctionInfo* pFuncInfo = getFuncInfoFromOobFuncId( OOBIN_FUNC_HYPERLINK ) ) + if( const FunctionInfo* pFuncInfo = getFuncInfoFromBiff12FuncId( BIFF_FUNC_HYPERLINK ) ) { ApiTokenSequence aTokens( 6 ); aTokens[ 0 ].OpCode = pFuncInfo->mnApiOpCode; @@ -2808,27 +2824,15 @@ void FormulaParser::convertNumberToHyperlink( FormulaContext& rContext, const OU OUString FormulaParser::importOleTargetLink( const OUString& rFormulaString ) { - // obviously, this would overburden our formula parser, so we parse it manually - OUString aTargetLink; - sal_Int32 nFmlaLen = rFormulaString.getLength(); - if( (nFmlaLen >= 8) && (rFormulaString[ 0 ] == '[') ) - { - // passed string is trimmed already - sal_Int32 nBracketClose = rFormulaString.indexOf( ']' ); - sal_Int32 nExclamation = rFormulaString.indexOf( '!' ); - if( (nBracketClose >= 2) && - (nBracketClose + 1 == nExclamation) && - (rFormulaString[ nExclamation + 1 ] == '\'') && - (rFormulaString[ nFmlaLen - 1 ] == '\'') ) - { - sal_Int32 nRefId = rFormulaString.copy( 1, nBracketClose - 1 ).toInt32(); - aTargetLink = mxImpl->resolveOleTarget( nRefId ); - } - } - return aTargetLink; + sal_Int32 nRefId = -1; + OUString aRemainder; + if( lclExtractRefId( nRefId, aRemainder, rFormulaString ) && (aRemainder.getLength() >= 3) && + (aRemainder[ 0 ] == '!') && (aRemainder[ 1 ] == '\'') && (aRemainder[ aRemainder.getLength() - 1 ] == '\'') ) + return mxImpl->resolveOleTarget( nRefId, false ); + return OUString(); } -OUString FormulaParser::importOleTargetLink( RecordInputStream& rStrm ) +OUString FormulaParser::importOleTargetLink( SequenceInputStream& rStrm ) { OUString aTargetLink; sal_Int32 nFmlaSize = rStrm.readInt32(); @@ -2840,7 +2844,7 @@ OUString FormulaParser::importOleTargetLink( RecordInputStream& rStrm ) sal_Int32 nNameId; rStrm >> nToken >> nRefId >> nNameId; if( nToken == (BIFF_TOKCLASS_VAL|BIFF_TOKID_NAMEX) ) - aTargetLink = mxImpl->resolveOleTarget( nRefId ); + aTargetLink = mxImpl->resolveOleTarget( nRefId, true ); } rStrm.seek( nFmlaEndPos ); return aTargetLink; @@ -2854,8 +2858,60 @@ OUString FormulaParser::importOleTargetLink( BiffInputStream& rStrm, const sal_u return aTargetLink; } +OUString FormulaParser::importMacroName( const OUString& rFormulaString ) +{ + /* Valid macros are either sheet macros or VBA macros. OOXML and all BIFF + documents store defined names for sheet macros, but OOXML documents do + not store any defined name for VBA macros (while BIFF documents do). + Sheet macros may be defined locally to a sheet, or globally to the + document. As a result, all of the following macro specifiers are valid: + + 1) Macros located in the own document: + [0]!MySheetMacro (global sheet macro 'MySheetMacro') + Macro1!MyMacro (sheet-local sheet macro 'MyMacro') + [0]!MyVBAProc (VBA macro 'MyVBAProc') + [0]!Mod1.MyVBAProc (VBA macro 'MyVBAProc' from code module 'Mod1') + + 2) Macros from an external document: + [2]!MySheetMacro (global external sheet macro 'MySheetMacro') + [2]Macro1!MyMacro (sheet-local external sheet macro 'MyMacro') + [2]!MyVBAProc (external VBA macro 'MyVBAProc') + [2]!Mod1.MyVBAProc (external VBA macro from code module 'Mod1') + + This implementation is only interested in VBA macros from the own + document, ignoring the valid syntax 'Macro1!MyMacro' for sheet-local + sheet macros. + */ + sal_Int32 nRefId = -1; + OUString aRemainder; + if( lclExtractRefId( nRefId, aRemainder, rFormulaString ) && (aRemainder.getLength() > 1) && (aRemainder[ 0 ] == '!') ) + { + /* In BIFF12 documents, the reference identifier is always the + one-based index of the external link as it is in OOXML documents + (it is not an index into the list of reference sheets as used in + cell formulas). Index 0 is an implicit placeholder for the own + document. In BIFF12 documents, the reference to the own document is + stored explicitly, mostly at the top of the list, so index 1 may + resolve to the own document too. + Passing 'false' to getExternalLink() specifies to ignore the + reference sheets list (if existing) and to access the list of + external links directly. */ + const ExternalLink* pExtLink = getExternalLinks().getExternalLink( nRefId, false ).get(); + OSL_ENSURE( pExtLink, "FormulaParser::importMacroName - missing link" ); + // do not accept macros in external documents (not supported) + if( pExtLink && (pExtLink->getLinkType() == LINKTYPE_SELF) ) + { + // ignore sheet macros (defined name for VBA macros may not exist, see above) + OUString aMacroName = aRemainder.copy( 1 ); + const DefinedName* pDefName = getDefinedNames().getByModelName( aMacroName ).get(); + if( !pDefName || pDefName->isVBName() ) + return aMacroName; + } + } + return OUString(); +} + // ============================================================================ } // namespace xls } // namespace oox - diff --git a/oox/source/xls/makefile.mk b/oox/source/xls/makefile.mk index b5ede953bbfe..6ca6e6a271b9 100644 --- a/oox/source/xls/makefile.mk +++ b/oox/source/xls/makefile.mk @@ -42,6 +42,7 @@ ENABLE_EXCEPTIONS=TRUE SLOFILES = \ $(SLO)$/addressconverter.obj \ + $(SLO)$/autofilterbuffer.obj \ $(SLO)$/autofiltercontext.obj \ $(SLO)$/biffcodec.obj \ $(SLO)$/biffdetector.obj \ @@ -53,6 +54,7 @@ SLOFILES = \ $(SLO)$/commentsfragment.obj \ $(SLO)$/condformatbuffer.obj \ $(SLO)$/condformatcontext.obj \ + $(SLO)$/connectionsbuffer.obj \ $(SLO)$/connectionsfragment.obj \ $(SLO)$/defnamesbuffer.obj \ $(SLO)$/drawingfragment.obj \ @@ -71,6 +73,7 @@ SLOFILES = \ $(SLO)$/pivotcachefragment.obj \ $(SLO)$/pivottablebuffer.obj \ $(SLO)$/pivottablefragment.obj \ + $(SLO)$/querytablebuffer.obj \ $(SLO)$/querytablefragment.obj \ $(SLO)$/richstring.obj \ $(SLO)$/richstringcontext.obj \ @@ -87,13 +90,12 @@ SLOFILES = \ $(SLO)$/themebuffer.obj \ $(SLO)$/unitconverter.obj \ $(SLO)$/viewsettings.obj \ - $(SLO)$/webquerybuffer.obj \ $(SLO)$/workbookfragment.obj \ $(SLO)$/workbookhelper.obj \ $(SLO)$/workbooksettings.obj \ $(SLO)$/worksheetbuffer.obj \ $(SLO)$/worksheetfragment.obj \ - $(SLO)$/worksheethelper.obj \ + $(SLO)$/worksheethelper.obj \ $(SLO)$/worksheetsettings.obj # --- Targets ------------------------------------------------------- diff --git a/oox/source/xls/numberformatsbuffer.cxx b/oox/source/xls/numberformatsbuffer.cxx index 4dfb00abeb59..c77381b2a1c8 100644 --- a/oox/source/xls/numberformatsbuffer.cxx +++ b/oox/source/xls/numberformatsbuffer.cxx @@ -26,43 +26,37 @@ ************************************************************************/ #include "oox/xls/numberformatsbuffer.hxx" + #include <com/sun/star/container/XNameAccess.hpp> +#include <com/sun/star/i18n/NumberFormatIndex.hpp> #include <com/sun/star/lang/XMultiServiceFactory.hpp> -#include <com/sun/star/util/XNumberFormatsSupplier.hpp> -#include <com/sun/star/util/XNumberFormats.hpp> #include <com/sun/star/util/XNumberFormatTypes.hpp> -#include <com/sun/star/i18n/NumberFormatIndex.hpp> -#include <osl/thread.h> -#include <rtl/string.hxx> +#include <com/sun/star/util/XNumberFormats.hpp> +#include <com/sun/star/util/XNumberFormatsSupplier.hpp> #include <rtl/strbuf.hxx> +#include <rtl/string.hxx> +#include <osl/thread.h> #include <rtl/ustrbuf.hxx> -#include "properties.hxx" +#include "oox/core/filterbase.hxx" #include "oox/helper/attributelist.hxx" #include "oox/helper/propertymap.hxx" -#include "oox/helper/recordinputstream.hxx" -#include "oox/core/filterbase.hxx" #include "oox/xls/biffinputstream.hxx" +namespace oox { +namespace xls { + +// ============================================================================ + +using namespace ::com::sun::star::container; +using namespace ::com::sun::star::lang; +using namespace ::com::sun::star::uno; +using namespace ::com::sun::star::util; + using ::rtl::OString; using ::rtl::OStringBuffer; +using ::rtl::OStringToOUString; using ::rtl::OUString; using ::rtl::OUStringBuffer; -using ::rtl::OStringToOUString; -using ::com::sun::star::uno::Any; -using ::com::sun::star::uno::Reference; -using ::com::sun::star::uno::Sequence; -using ::com::sun::star::uno::Exception; -using ::com::sun::star::uno::UNO_QUERY; -using ::com::sun::star::uno::UNO_QUERY_THROW; -using ::com::sun::star::container::XNameAccess; -using ::com::sun::star::lang::Locale; -using ::com::sun::star::lang::XMultiServiceFactory; -using ::com::sun::star::util::XNumberFormatsSupplier; -using ::com::sun::star::util::XNumberFormats; -using ::com::sun::star::util::XNumberFormatTypes; - -namespace oox { -namespace xls { // ============================================================================ @@ -2003,10 +1997,10 @@ NumberFormatRef NumberFormatsBuffer::importNumFmt( const AttributeList& rAttribs return createNumFmt( nNumFmtId, aFmtCode ); } -void NumberFormatsBuffer::importNumFmt( RecordInputStream& rStrm ) +void NumberFormatsBuffer::importNumFmt( SequenceInputStream& rStrm ) { sal_Int32 nNumFmtId = rStrm.readuInt16(); - OUString aFmtCode = rStrm.readString(); + OUString aFmtCode = BiffHelper::readString( rStrm ); createNumFmt( nNumFmtId, aFmtCode ); } @@ -2120,4 +2114,3 @@ void NumberFormatsBuffer::insertBuiltinFormats() } // namespace xls } // namespace oox - diff --git a/oox/source/xls/ooxformulaparser.cxx b/oox/source/xls/ooxformulaparser.cxx index ec2668aef0f2..efa69abcb750 100644 --- a/oox/source/xls/ooxformulaparser.cxx +++ b/oox/source/xls/ooxformulaparser.cxx @@ -26,27 +26,24 @@ ************************************************************************/ #include "oox/xls/ooxformulaparser.hxx" + #include <com/sun/star/uno/XComponentContext.hpp> #include "oox/xls/formulaparser.hxx" -using ::rtl::OUString; -using ::com::sun::star::uno::Any; -using ::com::sun::star::uno::Exception; -using ::com::sun::star::uno::Reference; -using ::com::sun::star::uno::RuntimeException; -using ::com::sun::star::uno::Sequence; -using ::com::sun::star::uno::UNO_QUERY_THROW; -using ::com::sun::star::uno::XComponentContext; -using ::com::sun::star::uno::XInterface; -using ::com::sun::star::lang::XMultiServiceFactory; -using ::com::sun::star::table::CellAddress; -using ::com::sun::star::sheet::FormulaToken; - namespace oox { namespace xls { // ============================================================================ +using namespace ::com::sun::star::lang; +using namespace ::com::sun::star::sheet; +using namespace ::com::sun::star::table; +using namespace ::com::sun::star::uno; + +using ::rtl::OUString; + +// ============================================================================ + class OOXMLFormulaParserImpl : private FormulaFinalizer { public: @@ -64,7 +61,7 @@ private: // ---------------------------------------------------------------------------- OOXMLFormulaParserImpl::OOXMLFormulaParserImpl( const Reference< XMultiServiceFactory >& rxFactory ) : - FormulaFinalizer( OpCodeProvider( rxFactory, FILTER_OOX, BIFF_UNKNOWN, true ) ), + FormulaFinalizer( OpCodeProvider( rxFactory, FILTER_OOXML, BIFF_UNKNOWN, true ) ), maApiParser( rxFactory, *this ) { } @@ -127,7 +124,7 @@ private: // ---------------------------------------------------------------------------- OOXMLFormulaPrinterImpl::OOXMLFormulaPrinterImpl( const Reference< XMultiServiceFactory >& rxFactory ) : - OpCodeProvider( rxFactory, FILTER_OOX, BIFF_UNKNOWN, false ), + OpCodeProvider( rxFactory, FILTER_OOXML, BIFF_UNKNOWN, false ), maApiParser( rxFactory, *this ) { } @@ -143,7 +140,7 @@ Sequence< OUString > OOXMLFormulaParser_getSupportedServiceNames() OUString OOXMLFormulaParser_getImplementationName() { - return CREATE_OUSTRING( "com.sun.star.comp.oox.OOXMLFormulaParser" ); + return CREATE_OUSTRING( "com.sun.star.comp.oox.xls.FormulaParser" ); } Reference< XInterface > SAL_CALL OOXMLFormulaParser_createInstance( const Reference< XComponentContext >& ) throw( Exception ) @@ -222,4 +219,3 @@ OUString SAL_CALL OOXMLFormulaParser::printFormula( } // namespace xls } // namespace oox - diff --git a/oox/source/xls/pagesettings.cxx b/oox/source/xls/pagesettings.cxx index 0a5ce05a37df..188bf78544ec 100644 --- a/oox/source/xls/pagesettings.cxx +++ b/oox/source/xls/pagesettings.cxx @@ -26,10 +26,9 @@ ************************************************************************/ #include "oox/xls/pagesettings.hxx" -#include <set> + #include <algorithm> -#include <rtl/strbuf.hxx> -#include <rtl/ustrbuf.hxx> +#include <set> #include <com/sun/star/awt/Size.hpp> #include <com/sun/star/container/XNamed.hpp> #include <com/sun/star/sheet/XHeaderFooterContent.hpp> @@ -38,39 +37,36 @@ #include <com/sun/star/text/XText.hpp> #include <com/sun/star/text/XTextContent.hpp> #include <com/sun/star/text/XTextCursor.hpp> -#include "properties.hxx" +#include <rtl/strbuf.hxx> +#include <rtl/ustrbuf.hxx> +#include "oox/core/xmlfilterbase.hxx" #include "oox/helper/attributelist.hxx" #include "oox/helper/graphichelper.hxx" #include "oox/helper/propertymap.hxx" #include "oox/helper/propertyset.hxx" -#include "oox/helper/recordinputstream.hxx" -#include "oox/core/xmlfilterbase.hxx" #include "oox/xls/biffinputstream.hxx" #include "oox/xls/excelhandlers.hxx" #include "oox/xls/stylesbuffer.hxx" #include "oox/xls/unitconverter.hxx" +namespace oox { +namespace xls { + +// ============================================================================ + +using namespace ::com::sun::star::awt; +using namespace ::com::sun::star::container; +using namespace ::com::sun::star::lang; +using namespace ::com::sun::star::sheet; +using namespace ::com::sun::star::style; +using namespace ::com::sun::star::text; +using namespace ::com::sun::star::uno; + +using ::oox::core::Relations; using ::rtl::OString; using ::rtl::OStringBuffer; using ::rtl::OUString; using ::rtl::OUStringBuffer; -using ::com::sun::star::uno::Exception; -using ::com::sun::star::uno::Reference; -using ::com::sun::star::uno::UNO_QUERY; -using ::com::sun::star::uno::UNO_QUERY_THROW; -using ::com::sun::star::container::XNamed; -using ::com::sun::star::lang::XMultiServiceFactory; -using ::com::sun::star::awt::Size; -using ::com::sun::star::sheet::XHeaderFooterContent; -using ::com::sun::star::style::XStyle; -using ::com::sun::star::text::XText; -using ::com::sun::star::text::XTextCursor; -using ::com::sun::star::text::XTextContent; -using ::com::sun::star::text::XTextRange; -using ::oox::core::Relations; - -namespace oox { -namespace xls { // ============================================================================ @@ -80,32 +76,32 @@ const double OOX_MARGIN_DEFAULT_LR = 0.748; /// Left/right d const double OOX_MARGIN_DEFAULT_TB = 0.984; /// Top/bottom default margin in inches. const double OOX_MARGIN_DEFAULT_HF = 0.512; /// Header/footer default margin in inches. -const sal_uInt16 OOBIN_PRINTOPT_HORCENTER = 0x0001; -const sal_uInt16 OOBIN_PRINTOPT_VERCENTER = 0x0002; -const sal_uInt16 OOBIN_PRINTOPT_PRINTHEADING = 0x0004; -const sal_uInt16 OOBIN_PRINTOPT_PRINTGRID = 0x0008; - -const sal_uInt16 OOBIN_HEADERFOOTER_DIFFEVEN = 0x0001; -const sal_uInt16 OOBIN_HEADERFOOTER_DIFFFIRST = 0x0002; -const sal_uInt16 OOBIN_HEADERFOOTER_SCALEDOC = 0x0004; -const sal_uInt16 OOBIN_HEADERFOOTER_ALIGNMARGIN = 0x0008; - -const sal_uInt16 OOBIN_PAGESETUP_INROWS = 0x0001; -const sal_uInt16 OOBIN_PAGESETUP_LANDSCAPE = 0x0002; -const sal_uInt16 OOBIN_PAGESETUP_INVALID = 0x0004; -const sal_uInt16 OOBIN_PAGESETUP_BLACKWHITE = 0x0008; -const sal_uInt16 OOBIN_PAGESETUP_DRAFTQUALITY = 0x0010; -const sal_uInt16 OOBIN_PAGESETUP_PRINTNOTES = 0x0020; -const sal_uInt16 OOBIN_PAGESETUP_DEFAULTORIENT = 0x0040; -const sal_uInt16 OOBIN_PAGESETUP_USEFIRSTPAGE = 0x0080; -const sal_uInt16 OOBIN_PAGESETUP_NOTES_END = 0x0100; // different to BIFF flag - -const sal_uInt16 OOBIN_CHARTPAGESETUP_LANDSCAPE = 0x0001; -const sal_uInt16 OOBIN_CHARTPAGESETUP_INVALID = 0x0002; -const sal_uInt16 OOBIN_CHARTPAGESETUP_BLACKWHITE = 0x0004; -const sal_uInt16 OOBIN_CHARTPAGESETUP_DEFAULTORIENT = 0x0008; -const sal_uInt16 OOBIN_CHARTPAGESETUP_USEFIRSTPAGE = 0x0010; -const sal_uInt16 OOBIN_CHARTPAGESETUP_DRAFTQUALITY = 0x0020; +const sal_uInt16 BIFF12_PRINTOPT_HORCENTER = 0x0001; +const sal_uInt16 BIFF12_PRINTOPT_VERCENTER = 0x0002; +const sal_uInt16 BIFF12_PRINTOPT_PRINTHEADING = 0x0004; +const sal_uInt16 BIFF12_PRINTOPT_PRINTGRID = 0x0008; + +const sal_uInt16 BIFF12_HEADERFOOTER_DIFFEVEN = 0x0001; +const sal_uInt16 BIFF12_HEADERFOOTER_DIFFFIRST = 0x0002; +const sal_uInt16 BIFF12_HEADERFOOTER_SCALEDOC = 0x0004; +const sal_uInt16 BIFF12_HEADERFOOTER_ALIGNMARGIN = 0x0008; + +const sal_uInt16 BIFF12_PAGESETUP_INROWS = 0x0001; +const sal_uInt16 BIFF12_PAGESETUP_LANDSCAPE = 0x0002; +const sal_uInt16 BIFF12_PAGESETUP_INVALID = 0x0004; +const sal_uInt16 BIFF12_PAGESETUP_BLACKWHITE = 0x0008; +const sal_uInt16 BIFF12_PAGESETUP_DRAFTQUALITY = 0x0010; +const sal_uInt16 BIFF12_PAGESETUP_PRINTNOTES = 0x0020; +const sal_uInt16 BIFF12_PAGESETUP_DEFAULTORIENT = 0x0040; +const sal_uInt16 BIFF12_PAGESETUP_USEFIRSTPAGE = 0x0080; +const sal_uInt16 BIFF12_PAGESETUP_NOTES_END = 0x0100; // different to BIFF flag + +const sal_uInt16 BIFF12_CHARTPAGESETUP_LANDSCAPE = 0x0001; +const sal_uInt16 BIFF12_CHARTPAGESETUP_INVALID = 0x0002; +const sal_uInt16 BIFF12_CHARTPAGESETUP_BLACKWHITE = 0x0004; +const sal_uInt16 BIFF12_CHARTPAGESETUP_DEFAULTORIENT= 0x0008; +const sal_uInt16 BIFF12_CHARTPAGESETUP_USEFIRSTPAGE = 0x0010; +const sal_uInt16 BIFF12_CHARTPAGESETUP_DRAFTQUALITY = 0x0020; const sal_uInt16 BIFF_PAGESETUP_INROWS = 0x0001; const sal_uInt16 BIFF_PAGESETUP_PORTRAIT = 0x0002; @@ -154,7 +150,7 @@ PageSettingsModel::PageSettingsModel() : { } -void PageSettingsModel::setBinPrintErrors( sal_uInt8 nPrintErrors ) +void PageSettingsModel::setBiffPrintErrors( sal_uInt8 nPrintErrors ) { static const sal_Int32 spnErrorIds[] = { XML_displayed, XML_none, XML_dash, XML_NA }; mnPrintErrors = STATIC_ARRAY_SELECT( spnErrorIds, nPrintErrors, XML_none ); @@ -245,24 +241,24 @@ void PageSettings::importPicture( const Relations& rRelations, const AttributeLi importPictureData( rRelations, rAttribs.getString( R_TOKEN( id ), OUString() ) ); } -void PageSettings::importPageMargins( RecordInputStream& rStrm ) +void PageSettings::importPageMargins( SequenceInputStream& rStrm ) { rStrm >> maModel.mfLeftMargin >> maModel.mfRightMargin >> maModel.mfTopMargin >> maModel.mfBottomMargin >> maModel.mfHeaderMargin >> maModel.mfFooterMargin; } -void PageSettings::importPrintOptions( RecordInputStream& rStrm ) +void PageSettings::importPrintOptions( SequenceInputStream& rStrm ) { sal_uInt16 nFlags; rStrm >> nFlags; - maModel.mbHorCenter = getFlag( nFlags, OOBIN_PRINTOPT_HORCENTER ); - maModel.mbVerCenter = getFlag( nFlags, OOBIN_PRINTOPT_VERCENTER ); - maModel.mbPrintGrid = getFlag( nFlags, OOBIN_PRINTOPT_PRINTGRID ); - maModel.mbPrintHeadings = getFlag( nFlags, OOBIN_PRINTOPT_PRINTHEADING ); + maModel.mbHorCenter = getFlag( nFlags, BIFF12_PRINTOPT_HORCENTER ); + maModel.mbVerCenter = getFlag( nFlags, BIFF12_PRINTOPT_VERCENTER ); + maModel.mbPrintGrid = getFlag( nFlags, BIFF12_PRINTOPT_PRINTGRID ); + maModel.mbPrintHeadings = getFlag( nFlags, BIFF12_PRINTOPT_PRINTHEADING ); } -void PageSettings::importPageSetup( const Relations& rRelations, RecordInputStream& rStrm ) +void PageSettings::importPageSetup( const Relations& rRelations, SequenceInputStream& rStrm ) { OUString aRelId; sal_uInt16 nFlags; @@ -271,18 +267,18 @@ void PageSettings::importPageSetup( const Relations& rRelations, RecordInputStre >> maModel.mnCopies >> maModel.mnFirstPage >> maModel.mnFitToWidth >> maModel.mnFitToHeight >> nFlags >> aRelId; - maModel.setBinPrintErrors( extractValue< sal_uInt8 >( nFlags, 9, 2 ) ); + maModel.setBiffPrintErrors( extractValue< sal_uInt8 >( nFlags, 9, 2 ) ); maModel.maBinSettPath = rRelations.getFragmentPathFromRelId( aRelId ); - maModel.mnOrientation = getFlagValue( nFlags, OOBIN_PAGESETUP_DEFAULTORIENT, XML_default, getFlagValue( nFlags, OOBIN_PAGESETUP_LANDSCAPE, XML_landscape, XML_portrait ) ); - maModel.mnPageOrder = getFlagValue( nFlags, OOBIN_PAGESETUP_INROWS, XML_overThenDown, XML_downThenOver ); - maModel.mnCellComments = getFlagValue( nFlags, OOBIN_PAGESETUP_PRINTNOTES, getFlagValue( nFlags, OOBIN_PAGESETUP_NOTES_END, XML_atEnd, XML_asDisplayed ), XML_none ); - maModel.mbValidSettings = !getFlag( nFlags, OOBIN_PAGESETUP_INVALID ); - maModel.mbUseFirstPage = getFlag( nFlags, OOBIN_PAGESETUP_USEFIRSTPAGE ); - maModel.mbBlackWhite = getFlag( nFlags, OOBIN_PAGESETUP_BLACKWHITE ); - maModel.mbDraftQuality = getFlag( nFlags, OOBIN_PAGESETUP_DRAFTQUALITY ); + maModel.mnOrientation = getFlagValue( nFlags, BIFF12_PAGESETUP_DEFAULTORIENT, XML_default, getFlagValue( nFlags, BIFF12_PAGESETUP_LANDSCAPE, XML_landscape, XML_portrait ) ); + maModel.mnPageOrder = getFlagValue( nFlags, BIFF12_PAGESETUP_INROWS, XML_overThenDown, XML_downThenOver ); + maModel.mnCellComments = getFlagValue( nFlags, BIFF12_PAGESETUP_PRINTNOTES, getFlagValue( nFlags, BIFF12_PAGESETUP_NOTES_END, XML_atEnd, XML_asDisplayed ), XML_none ); + maModel.mbValidSettings = !getFlag( nFlags, BIFF12_PAGESETUP_INVALID ); + maModel.mbUseFirstPage = getFlag( nFlags, BIFF12_PAGESETUP_USEFIRSTPAGE ); + maModel.mbBlackWhite = getFlag( nFlags, BIFF12_PAGESETUP_BLACKWHITE ); + maModel.mbDraftQuality = getFlag( nFlags, BIFF12_PAGESETUP_DRAFTQUALITY ); } -void PageSettings::importChartPageSetup( const Relations& rRelations, RecordInputStream& rStrm ) +void PageSettings::importChartPageSetup( const Relations& rRelations, SequenceInputStream& rStrm ) { OUString aRelId; sal_uInt16 nFirstPage, nFlags; @@ -290,27 +286,27 @@ void PageSettings::importChartPageSetup( const Relations& rRelations, RecordInpu >> maModel.mnCopies >> nFirstPage >> nFlags >> aRelId; maModel.maBinSettPath = rRelations.getFragmentPathFromRelId( aRelId ); maModel.mnFirstPage = nFirstPage; // 16-bit in CHARTPAGESETUP - maModel.mnOrientation = getFlagValue( nFlags, OOBIN_CHARTPAGESETUP_DEFAULTORIENT, XML_default, getFlagValue( nFlags, OOBIN_CHARTPAGESETUP_LANDSCAPE, XML_landscape, XML_portrait ) ); - maModel.mbValidSettings = !getFlag( nFlags, OOBIN_CHARTPAGESETUP_INVALID ); - maModel.mbUseFirstPage = getFlag( nFlags, OOBIN_CHARTPAGESETUP_USEFIRSTPAGE ); - maModel.mbBlackWhite = getFlag( nFlags, OOBIN_CHARTPAGESETUP_BLACKWHITE ); - maModel.mbDraftQuality = getFlag( nFlags, OOBIN_CHARTPAGESETUP_DRAFTQUALITY ); + maModel.mnOrientation = getFlagValue( nFlags, BIFF12_CHARTPAGESETUP_DEFAULTORIENT, XML_default, getFlagValue( nFlags, BIFF12_CHARTPAGESETUP_LANDSCAPE, XML_landscape, XML_portrait ) ); + maModel.mbValidSettings = !getFlag( nFlags, BIFF12_CHARTPAGESETUP_INVALID ); + maModel.mbUseFirstPage = getFlag( nFlags, BIFF12_CHARTPAGESETUP_USEFIRSTPAGE ); + maModel.mbBlackWhite = getFlag( nFlags, BIFF12_CHARTPAGESETUP_BLACKWHITE ); + maModel.mbDraftQuality = getFlag( nFlags, BIFF12_CHARTPAGESETUP_DRAFTQUALITY ); } -void PageSettings::importHeaderFooter( RecordInputStream& rStrm ) +void PageSettings::importHeaderFooter( SequenceInputStream& rStrm ) { sal_uInt16 nFlags; rStrm >> nFlags >> maModel.maOddHeader >> maModel.maOddFooter >> maModel.maEvenHeader >> maModel.maEvenFooter >> maModel.maFirstHeader >> maModel.maFirstFooter; - maModel.mbUseEvenHF = getFlag( nFlags, OOBIN_HEADERFOOTER_DIFFEVEN ); - maModel.mbUseFirstHF = getFlag( nFlags, OOBIN_HEADERFOOTER_DIFFFIRST ); + maModel.mbUseEvenHF = getFlag( nFlags, BIFF12_HEADERFOOTER_DIFFEVEN ); + maModel.mbUseFirstHF = getFlag( nFlags, BIFF12_HEADERFOOTER_DIFFFIRST ); } -void PageSettings::importPicture( const Relations& rRelations, RecordInputStream& rStrm ) +void PageSettings::importPicture( const Relations& rRelations, SequenceInputStream& rStrm ) { - importPictureData( rRelations, rStrm.readString() ); + importPictureData( rRelations, BiffHelper::readString( rStrm ) ); } void PageSettings::importLeftMargin( BiffInputStream& rStrm ) @@ -364,7 +360,7 @@ void PageSettings::importPageSetup( BiffInputStream& rStrm ) if( getBiff() == BIFF8 ) { - maModel.setBinPrintErrors( extractValue< sal_uInt8 >( nFlags, 10, 2 ) ); + maModel.setBiffPrintErrors( extractValue< sal_uInt8 >( nFlags, 10, 2 ) ); maModel.mnCellComments = getFlagValue( nFlags, BIFF_PAGESETUP_PRINTNOTES, getFlagValue( nFlags, BIFF_PAGESETUP_NOTES_END, XML_atEnd, XML_asDisplayed ), XML_none ); } } @@ -680,8 +676,8 @@ double HeaderFooterParser::parse( const Reference< XHeaderFooterContent >& rxCon appendField( xContent ); } break; - case 'Z': // file path (without file name), BIFF8 and OOX only - if( (getFilterType() == FILTER_OOX) || ((getFilterType() == FILTER_BIFF) && (getBiff() == BIFF8)) ) + case 'Z': // file path (without file name), OOXML, BIFF12, and BIFF8 only + if( (getFilterType() == FILTER_OOXML) || ((getFilterType() == FILTER_BIFF) && (getBiff() == BIFF8)) ) { Reference< XTextContent > xContent = createField( maFileNameService ); PropertySet aPropSet( xContent ); @@ -749,7 +745,7 @@ double HeaderFooterParser::parse( const Reference< XHeaderFooterContent >& rxCon break; case 'K': // text color (not in BIFF) - if( (getFilterType() == FILTER_OOX) && (pcChar + 6 < pcEnd) ) + if( (getFilterType() == FILTER_OOXML) && (pcChar + 6 < pcEnd) ) { setAttributes(); // eat the following 6 characters @@ -1237,8 +1233,8 @@ sal_Int32 PageSettingsConverter::writeHeaderFooter( sal_Int32 nHeight = 0; if( rContent.getLength() > 0 ) { - Reference< XHeaderFooterContent > xHFContent; - if( rPropSet.getProperty( xHFContent, nPropId ) && xHFContent.is() ) + Reference< XHeaderFooterContent > xHFContent( rPropSet.getAnyProperty( nPropId ), UNO_QUERY ); + if( xHFContent.is() ) { double fTotalHeight = mxHFParser->parse( xHFContent, rContent ); rPropSet.setProperty( nPropId, xHFContent ); @@ -1252,4 +1248,3 @@ sal_Int32 PageSettingsConverter::writeHeaderFooter( } // namespace xls } // namespace oox - diff --git a/oox/source/xls/pivotcachebuffer.cxx b/oox/source/xls/pivotcachebuffer.cxx index d76ab81d07c4..e8ca3539e167 100644 --- a/oox/source/xls/pivotcachebuffer.cxx +++ b/oox/source/xls/pivotcachebuffer.cxx @@ -26,20 +26,20 @@ ************************************************************************/ #include "oox/xls/pivotcachebuffer.hxx" + #include <set> -#include <rtl/ustrbuf.hxx> #include <com/sun/star/container/XIndexAccess.hpp> #include <com/sun/star/container/XNameAccess.hpp> #include <com/sun/star/container/XNamed.hpp> -#include <com/sun/star/table/XCell.hpp> #include <com/sun/star/sheet/DataPilotFieldGroupBy.hpp> #include <com/sun/star/sheet/DataPilotFieldGroupInfo.hpp> #include <com/sun/star/sheet/XDataPilotFieldGrouping.hpp> -#include "properties.hxx" +#include <com/sun/star/table/XCell.hpp> +#include <rtl/ustrbuf.hxx> +#include "oox/core/filterbase.hxx" #include "oox/helper/attributelist.hxx" +#include "oox/helper/containerhelper.hxx" #include "oox/helper/propertyset.hxx" -#include "oox/helper/recordinputstream.hxx" -#include "oox/core/filterbase.hxx" #include "oox/xls/biffinputstream.hxx" #include "oox/xls/defnamesbuffer.hxx" #include "oox/xls/excelhandlers.hxx" @@ -48,75 +48,71 @@ #include "oox/xls/unitconverter.hxx" #include "oox/xls/worksheetbuffer.hxx" -using ::rtl::OUString; -using ::rtl::OUStringBuffer; -using ::com::sun::star::uno::Any; -using ::com::sun::star::uno::Exception; -using ::com::sun::star::uno::Reference; -using ::com::sun::star::uno::UNO_QUERY; -using ::com::sun::star::uno::UNO_QUERY_THROW; -using ::com::sun::star::container::XIndexAccess; -using ::com::sun::star::container::XNameAccess; -using ::com::sun::star::container::XNamed; -using ::com::sun::star::util::DateTime; -using ::com::sun::star::table::CellAddress; -using ::com::sun::star::sheet::DataPilotFieldGroupInfo; -using ::com::sun::star::table::XCell; -using ::com::sun::star::sheet::XDataPilotField; -using ::com::sun::star::sheet::XDataPilotFieldGrouping; -using ::oox::core::Relations; - namespace oox { namespace xls { // ============================================================================ +using namespace ::com::sun::star::container; +using namespace ::com::sun::star::sheet; +using namespace ::com::sun::star::table; +using namespace ::com::sun::star::uno; +using namespace ::com::sun::star::util; + +using ::oox::core::Relations; +using ::rtl::OUString; +using ::rtl::OUStringBuffer; + +// ============================================================================ + namespace { -const sal_uInt16 OOBIN_PCDFIELD_SERVERFIELD = 0x0001; -const sal_uInt16 OOBIN_PCDFIELD_NOUNIQUEITEMS = 0x0002; -const sal_uInt16 OOBIN_PCDFIELD_DATABASEFIELD = 0x0004; -const sal_uInt16 OOBIN_PCDFIELD_HASCAPTION = 0x0008; -const sal_uInt16 OOBIN_PCDFIELD_MEMBERPROPFIELD = 0x0010; -const sal_uInt16 OOBIN_PCDFIELD_HASFORMULA = 0x0100; -const sal_uInt16 OOBIN_PCDFIELD_HASPROPERTYNAME = 0x0200; - -const sal_uInt16 OOBIN_PCDFSITEMS_HASSEMIMIXED = 0x0001; -const sal_uInt16 OOBIN_PCDFSITEMS_HASNONDATE = 0x0002; -const sal_uInt16 OOBIN_PCDFSITEMS_HASDATE = 0x0004; -const sal_uInt16 OOBIN_PCDFSITEMS_HASSTRING = 0x0008; -const sal_uInt16 OOBIN_PCDFSITEMS_HASBLANK = 0x0010; -const sal_uInt16 OOBIN_PCDFSITEMS_HASMIXED = 0x0020; -const sal_uInt16 OOBIN_PCDFSITEMS_ISNUMERIC = 0x0040; -const sal_uInt16 OOBIN_PCDFSITEMS_ISINTEGER = 0x0080; -const sal_uInt16 OOBIN_PCDFSITEMS_HASMINMAX = 0x0100; -const sal_uInt16 OOBIN_PCDFSITEMS_HASLONGTEXT = 0x0200; - -const sal_uInt16 OOBIN_PCITEM_ARRAY_DOUBLE = 0x0001; -const sal_uInt16 OOBIN_PCITEM_ARRAY_STRING = 0x0002; -const sal_uInt16 OOBIN_PCITEM_ARRAY_ERROR = 0x0010; -const sal_uInt16 OOBIN_PCITEM_ARRAY_DATE = 0x0020; - -const sal_uInt8 OOBIN_PCDFRANGEPR_AUTOSTART = 0x01; -const sal_uInt8 OOBIN_PCDFRANGEPR_AUTOEND = 0x02; -const sal_uInt8 OOBIN_PCDFRANGEPR_DATEGROUP = 0x04; - -const sal_uInt8 OOBIN_PCDEFINITION_SAVEDATA = 0x01; -const sal_uInt8 OOBIN_PCDEFINITION_INVALID = 0x02; -const sal_uInt8 OOBIN_PCDEFINITION_REFRESHONLOAD = 0x04; -const sal_uInt8 OOBIN_PCDEFINITION_OPTIMIZEMEMORY = 0x08; -const sal_uInt8 OOBIN_PCDEFINITION_ENABLEREFRESH = 0x10; -const sal_uInt8 OOBIN_PCDEFINITION_BACKGROUNDQUERY = 0x20; -const sal_uInt8 OOBIN_PCDEFINITION_UPGRADEONREFR = 0x40; -const sal_uInt8 OOBIN_PCDEFINITION_TUPELCACHE = 0x80; - -const sal_uInt8 OOBIN_PCDEFINITION_HASUSERNAME = 0x01; -const sal_uInt8 OOBIN_PCDEFINITION_HASRELID = 0x02; -const sal_uInt8 OOBIN_PCDEFINITION_SUPPORTSUBQUERY = 0x04; -const sal_uInt8 OOBIN_PCDEFINITION_SUPPORTDRILL = 0x08; - -const sal_uInt8 OOBIN_PCDWBSOURCE_HASRELID = 0x01; -const sal_uInt8 OOBIN_PCDWBSOURCE_HASSHEET = 0x02; +const sal_uInt16 BIFF12_PCDFIELD_SERVERFIELD = 0x0001; +const sal_uInt16 BIFF12_PCDFIELD_NOUNIQUEITEMS = 0x0002; +const sal_uInt16 BIFF12_PCDFIELD_DATABASEFIELD = 0x0004; +const sal_uInt16 BIFF12_PCDFIELD_HASCAPTION = 0x0008; +const sal_uInt16 BIFF12_PCDFIELD_MEMBERPROPFIELD = 0x0010; +const sal_uInt16 BIFF12_PCDFIELD_HASFORMULA = 0x0100; +const sal_uInt16 BIFF12_PCDFIELD_HASPROPERTYNAME = 0x0200; + +const sal_uInt16 BIFF12_PCDFSITEMS_HASSEMIMIXED = 0x0001; +const sal_uInt16 BIFF12_PCDFSITEMS_HASNONDATE = 0x0002; +const sal_uInt16 BIFF12_PCDFSITEMS_HASDATE = 0x0004; +const sal_uInt16 BIFF12_PCDFSITEMS_HASSTRING = 0x0008; +const sal_uInt16 BIFF12_PCDFSITEMS_HASBLANK = 0x0010; +const sal_uInt16 BIFF12_PCDFSITEMS_HASMIXED = 0x0020; +const sal_uInt16 BIFF12_PCDFSITEMS_ISNUMERIC = 0x0040; +const sal_uInt16 BIFF12_PCDFSITEMS_ISINTEGER = 0x0080; +const sal_uInt16 BIFF12_PCDFSITEMS_HASMINMAX = 0x0100; +const sal_uInt16 BIFF12_PCDFSITEMS_HASLONGTEXT = 0x0200; + +const sal_uInt16 BIFF12_PCITEM_ARRAY_DOUBLE = 0x0001; +const sal_uInt16 BIFF12_PCITEM_ARRAY_STRING = 0x0002; +const sal_uInt16 BIFF12_PCITEM_ARRAY_ERROR = 0x0010; +const sal_uInt16 BIFF12_PCITEM_ARRAY_DATE = 0x0020; + +const sal_uInt8 BIFF12_PCDFRANGEPR_AUTOSTART = 0x01; +const sal_uInt8 BIFF12_PCDFRANGEPR_AUTOEND = 0x02; +const sal_uInt8 BIFF12_PCDFRANGEPR_DATEGROUP = 0x04; + +const sal_uInt8 BIFF12_PCDEFINITION_SAVEDATA = 0x01; +const sal_uInt8 BIFF12_PCDEFINITION_INVALID = 0x02; +const sal_uInt8 BIFF12_PCDEFINITION_REFRESHONLOAD = 0x04; +const sal_uInt8 BIFF12_PCDEFINITION_OPTIMIZEMEMORY = 0x08; +const sal_uInt8 BIFF12_PCDEFINITION_ENABLEREFRESH = 0x10; +const sal_uInt8 BIFF12_PCDEFINITION_BACKGROUNDQUERY = 0x20; +const sal_uInt8 BIFF12_PCDEFINITION_UPGRADEONREFR = 0x40; +const sal_uInt8 BIFF12_PCDEFINITION_TUPELCACHE = 0x80; + +const sal_uInt8 BIFF12_PCDEFINITION_HASUSERNAME = 0x01; +const sal_uInt8 BIFF12_PCDEFINITION_HASRELID = 0x02; +const sal_uInt8 BIFF12_PCDEFINITION_SUPPORTSUBQUERY = 0x04; +const sal_uInt8 BIFF12_PCDEFINITION_SUPPORTDRILL = 0x08; + +const sal_uInt8 BIFF12_PCDWBSOURCE_HASRELID = 0x01; +const sal_uInt8 BIFF12_PCDWBSOURCE_HASSHEET = 0x02; + +// ---------------------------------------------------------------------------- const sal_uInt16 BIFF_PCDSOURCE_WORKSHEET = 0x0001; const sal_uInt16 BIFF_PCDSOURCE_EXTERNAL = 0x0002; @@ -216,19 +212,19 @@ void PivotCacheItem::readIndex( const AttributeList& rAttribs ) mnType = XML_x; } -void PivotCacheItem::readString( RecordInputStream& rStrm ) +void PivotCacheItem::readString( SequenceInputStream& rStrm ) { - maValue <<= rStrm.readString(); + maValue <<= BiffHelper::readString( rStrm ); mnType = XML_s; } -void PivotCacheItem::readDouble( RecordInputStream& rStrm ) +void PivotCacheItem::readDouble( SequenceInputStream& rStrm ) { maValue <<= rStrm.readDouble(); mnType = XML_n; } -void PivotCacheItem::readDate( RecordInputStream& rStrm ) +void PivotCacheItem::readDate( SequenceInputStream& rStrm ) { DateTime aDateTime; aDateTime.Year = rStrm.readuInt16(); @@ -242,19 +238,19 @@ void PivotCacheItem::readDate( RecordInputStream& rStrm ) mnType = XML_d; } -void PivotCacheItem::readBool( RecordInputStream& rStrm ) +void PivotCacheItem::readBool( SequenceInputStream& rStrm ) { maValue <<= (rStrm.readuInt8() != 0); mnType = XML_b; } -void PivotCacheItem::readError( RecordInputStream& rStrm ) +void PivotCacheItem::readError( SequenceInputStream& rStrm ) { maValue <<= static_cast< sal_Int32 >( rStrm.readuInt8() ); mnType = XML_e; } -void PivotCacheItem::readIndex( RecordInputStream& rStrm ) +void PivotCacheItem::readIndex( SequenceInputStream& rStrm ) { maValue <<= rStrm.readInt32(); mnType = XML_x; @@ -342,9 +338,9 @@ void PivotCacheItemList::importItem( sal_Int32 nElement, const AttributeList& rA } } -void PivotCacheItemList::importItem( sal_Int32 nRecId, RecordInputStream& rStrm ) +void PivotCacheItemList::importItem( sal_Int32 nRecId, SequenceInputStream& rStrm ) { - if( nRecId == OOBIN_ID_PCITEM_ARRAY ) + if( nRecId == BIFF12_ID_PCITEM_ARRAY ) { importArray( rStrm ); return; @@ -353,18 +349,18 @@ void PivotCacheItemList::importItem( sal_Int32 nRecId, RecordInputStream& rStrm PivotCacheItem& rItem = createItem(); switch( nRecId ) { - case OOBIN_ID_PCITEM_MISSING: - case OOBIN_ID_PCITEMA_MISSING: break; - case OOBIN_ID_PCITEM_STRING: - case OOBIN_ID_PCITEMA_STRING: rItem.readString( rStrm ); break; - case OOBIN_ID_PCITEM_DOUBLE: - case OOBIN_ID_PCITEMA_DOUBLE: rItem.readDouble( rStrm ); break; - case OOBIN_ID_PCITEM_DATE: - case OOBIN_ID_PCITEMA_DATE: rItem.readDate( rStrm ); break; - case OOBIN_ID_PCITEM_BOOL: - case OOBIN_ID_PCITEMA_BOOL: rItem.readBool( rStrm ); break; - case OOBIN_ID_PCITEM_ERROR: - case OOBIN_ID_PCITEMA_ERROR: rItem.readError( rStrm ); break; + case BIFF12_ID_PCITEM_MISSING: + case BIFF12_ID_PCITEMA_MISSING: break; + case BIFF12_ID_PCITEM_STRING: + case BIFF12_ID_PCITEMA_STRING: rItem.readString( rStrm ); break; + case BIFF12_ID_PCITEM_DOUBLE: + case BIFF12_ID_PCITEMA_DOUBLE: rItem.readDouble( rStrm ); break; + case BIFF12_ID_PCITEM_DATE: + case BIFF12_ID_PCITEMA_DATE: rItem.readDate( rStrm ); break; + case BIFF12_ID_PCITEM_BOOL: + case BIFF12_ID_PCITEMA_BOOL: rItem.readBool( rStrm ); break; + case BIFF12_ID_PCITEM_ERROR: + case BIFF12_ID_PCITEMA_ERROR: rItem.readError( rStrm ); break; default: OSL_ENSURE( false, "PivotCacheItemList::importItem - unknown record type" ); } } @@ -411,7 +407,7 @@ PivotCacheItem& PivotCacheItemList::createItem() return maItems.back(); } -void PivotCacheItemList::importArray( RecordInputStream& rStrm ) +void PivotCacheItemList::importArray( SequenceInputStream& rStrm ) { sal_uInt16 nType = rStrm.readuInt16(); sal_Int32 nCount = rStrm.readInt32(); @@ -419,10 +415,10 @@ void PivotCacheItemList::importArray( RecordInputStream& rStrm ) { switch( nType ) { - case OOBIN_PCITEM_ARRAY_DOUBLE: createItem().readDouble( rStrm ); break; - case OOBIN_PCITEM_ARRAY_STRING: createItem().readString( rStrm ); break; - case OOBIN_PCITEM_ARRAY_ERROR: createItem().readError( rStrm ); break; - case OOBIN_PCITEM_ARRAY_DATE: createItem().readDate( rStrm ); break; + case BIFF12_PCITEM_ARRAY_DOUBLE: createItem().readDouble( rStrm ); break; + case BIFF12_PCITEM_ARRAY_STRING: createItem().readString( rStrm ); break; + case BIFF12_PCITEM_ARRAY_ERROR: createItem().readError( rStrm ); break; + case BIFF12_PCITEM_ARRAY_DATE: createItem().readDate( rStrm ); break; default: OSL_ENSURE( false, "PivotCacheItemList::importArray - unknown data type" ); nIdx = nCount; @@ -477,7 +473,7 @@ PCFieldGroupModel::PCFieldGroupModel() : { } -void PCFieldGroupModel::setBinGroupBy( sal_uInt8 nGroupBy ) +void PCFieldGroupModel::setBiffGroupBy( sal_uInt8 nGroupBy ) { static const sal_Int32 spnGroupBy[] = { XML_range, XML_seconds, XML_minutes, XML_hours, XML_days, XML_months, XML_quarters, XML_years }; @@ -562,62 +558,62 @@ void PivotCacheField::importGroupItem( sal_Int32 nElement, const AttributeList& maGroupItems.importItem( nElement, rAttribs ); } -void PivotCacheField::importPCDField( RecordInputStream& rStrm ) +void PivotCacheField::importPCDField( SequenceInputStream& rStrm ) { sal_uInt16 nFlags; rStrm >> nFlags >> maFieldModel.mnNumFmtId; maFieldModel.mnSqlType = rStrm.readInt16(); rStrm >> maFieldModel.mnHierarchy >> maFieldModel.mnLevel >> maFieldModel.mnMappingCount >> maFieldModel.maName; - if( getFlag( nFlags, OOBIN_PCDFIELD_HASCAPTION ) ) + if( getFlag( nFlags, BIFF12_PCDFIELD_HASCAPTION ) ) rStrm >> maFieldModel.maCaption; - if( getFlag( nFlags, OOBIN_PCDFIELD_HASFORMULA ) ) + if( getFlag( nFlags, BIFF12_PCDFIELD_HASFORMULA ) ) rStrm.skip( ::std::max< sal_Int32 >( rStrm.readInt32(), 0 ) ); if( maFieldModel.mnMappingCount > 0 ) rStrm.skip( ::std::max< sal_Int32 >( rStrm.readInt32(), 0 ) ); - if( getFlag( nFlags, OOBIN_PCDFIELD_HASPROPERTYNAME ) ) + if( getFlag( nFlags, BIFF12_PCDFIELD_HASPROPERTYNAME ) ) rStrm >> maFieldModel.maPropertyName; - maFieldModel.mbDatabaseField = getFlag( nFlags, OOBIN_PCDFIELD_DATABASEFIELD ); - maFieldModel.mbServerField = getFlag( nFlags, OOBIN_PCDFIELD_SERVERFIELD ); - maFieldModel.mbUniqueList = !getFlag( nFlags, OOBIN_PCDFIELD_NOUNIQUEITEMS ); - maFieldModel.mbMemberPropField = getFlag( nFlags, OOBIN_PCDFIELD_MEMBERPROPFIELD ); + maFieldModel.mbDatabaseField = getFlag( nFlags, BIFF12_PCDFIELD_DATABASEFIELD ); + maFieldModel.mbServerField = getFlag( nFlags, BIFF12_PCDFIELD_SERVERFIELD ); + maFieldModel.mbUniqueList = !getFlag( nFlags, BIFF12_PCDFIELD_NOUNIQUEITEMS ); + maFieldModel.mbMemberPropField = getFlag( nFlags, BIFF12_PCDFIELD_MEMBERPROPFIELD ); } -void PivotCacheField::importPCDFSharedItems( RecordInputStream& rStrm ) +void PivotCacheField::importPCDFSharedItems( SequenceInputStream& rStrm ) { sal_uInt16 nFlags; rStrm >> nFlags; - maSharedItemsModel.mbHasSemiMixed = getFlag( nFlags, OOBIN_PCDFSITEMS_HASSEMIMIXED ); - maSharedItemsModel.mbHasNonDate = getFlag( nFlags, OOBIN_PCDFSITEMS_HASNONDATE ); - maSharedItemsModel.mbHasDate = getFlag( nFlags, OOBIN_PCDFSITEMS_HASDATE ); - maSharedItemsModel.mbHasString = getFlag( nFlags, OOBIN_PCDFSITEMS_HASSTRING ); - maSharedItemsModel.mbHasBlank = getFlag( nFlags, OOBIN_PCDFSITEMS_HASBLANK ); - maSharedItemsModel.mbHasMixed = getFlag( nFlags, OOBIN_PCDFSITEMS_HASMIXED ); - maSharedItemsModel.mbIsNumeric = getFlag( nFlags, OOBIN_PCDFSITEMS_ISNUMERIC ); - maSharedItemsModel.mbIsInteger = getFlag( nFlags, OOBIN_PCDFSITEMS_ISINTEGER ); - maSharedItemsModel.mbHasLongText = getFlag( nFlags, OOBIN_PCDFSITEMS_HASLONGTEXT ); + maSharedItemsModel.mbHasSemiMixed = getFlag( nFlags, BIFF12_PCDFSITEMS_HASSEMIMIXED ); + maSharedItemsModel.mbHasNonDate = getFlag( nFlags, BIFF12_PCDFSITEMS_HASNONDATE ); + maSharedItemsModel.mbHasDate = getFlag( nFlags, BIFF12_PCDFSITEMS_HASDATE ); + maSharedItemsModel.mbHasString = getFlag( nFlags, BIFF12_PCDFSITEMS_HASSTRING ); + maSharedItemsModel.mbHasBlank = getFlag( nFlags, BIFF12_PCDFSITEMS_HASBLANK ); + maSharedItemsModel.mbHasMixed = getFlag( nFlags, BIFF12_PCDFSITEMS_HASMIXED ); + maSharedItemsModel.mbIsNumeric = getFlag( nFlags, BIFF12_PCDFSITEMS_ISNUMERIC ); + maSharedItemsModel.mbIsInteger = getFlag( nFlags, BIFF12_PCDFSITEMS_ISINTEGER ); + maSharedItemsModel.mbHasLongText = getFlag( nFlags, BIFF12_PCDFSITEMS_HASLONGTEXT ); } -void PivotCacheField::importPCDFSharedItem( sal_Int32 nRecId, RecordInputStream& rStrm ) +void PivotCacheField::importPCDFSharedItem( sal_Int32 nRecId, SequenceInputStream& rStrm ) { maSharedItems.importItem( nRecId, rStrm ); } -void PivotCacheField::importPCDFieldGroup( RecordInputStream& rStrm ) +void PivotCacheField::importPCDFieldGroup( SequenceInputStream& rStrm ) { rStrm >> maFieldGroupModel.mnParentField >> maFieldGroupModel.mnBaseField; } -void PivotCacheField::importPCDFRangePr( RecordInputStream& rStrm ) +void PivotCacheField::importPCDFRangePr( SequenceInputStream& rStrm ) { sal_uInt8 nGroupBy, nFlags; rStrm >> nGroupBy >> nFlags >> maFieldGroupModel.mfStartValue >> maFieldGroupModel.mfEndValue >> maFieldGroupModel.mfInterval; - maFieldGroupModel.setBinGroupBy( nGroupBy ); + maFieldGroupModel.setBiffGroupBy( nGroupBy ); maFieldGroupModel.mbRangeGroup = true; - maFieldGroupModel.mbDateGroup = getFlag( nFlags, OOBIN_PCDFRANGEPR_DATEGROUP ); - maFieldGroupModel.mbAutoStart = getFlag( nFlags, OOBIN_PCDFRANGEPR_AUTOSTART ); - maFieldGroupModel.mbAutoEnd = getFlag( nFlags, OOBIN_PCDFRANGEPR_AUTOEND ); + maFieldGroupModel.mbDateGroup = getFlag( nFlags, BIFF12_PCDFRANGEPR_DATEGROUP ); + maFieldGroupModel.mbAutoStart = getFlag( nFlags, BIFF12_PCDFRANGEPR_AUTOSTART ); + maFieldGroupModel.mbAutoEnd = getFlag( nFlags, BIFF12_PCDFRANGEPR_AUTOEND ); OSL_ENSURE( maFieldGroupModel.mbDateGroup == (maFieldGroupModel.mnGroupBy != XML_range), "PivotCacheField::importPCDFRangePr - wrong date flag" ); if( maFieldGroupModel.mbDateGroup ) @@ -627,14 +623,14 @@ void PivotCacheField::importPCDFRangePr( RecordInputStream& rStrm ) } } -void PivotCacheField::importPCDFDiscretePrItem( sal_Int32 nRecId, RecordInputStream& rStrm ) +void PivotCacheField::importPCDFDiscretePrItem( sal_Int32 nRecId, SequenceInputStream& rStrm ) { - OSL_ENSURE( nRecId == OOBIN_ID_PCITEM_INDEX, "PivotCacheField::importPCDFDiscretePrItem - unexpected record" ); - if( nRecId == OOBIN_ID_PCITEM_INDEX ) + OSL_ENSURE( nRecId == BIFF12_ID_PCITEM_INDEX, "PivotCacheField::importPCDFDiscretePrItem - unexpected record" ); + if( nRecId == BIFF12_ID_PCITEM_INDEX ) maDiscreteItems.push_back( rStrm.readInt32() ); } -void PivotCacheField::importPCDFGroupItem( sal_Int32 nRecId, RecordInputStream& rStrm ) +void PivotCacheField::importPCDFGroupItem( sal_Int32 nRecId, SequenceInputStream& rStrm ) { maGroupItems.importItem( nRecId, rStrm ); } @@ -696,7 +692,7 @@ void PivotCacheField::importPCDFRangePr( BiffInputStream& rStrm ) { sal_uInt16 nFlags; rStrm >> nFlags; - maFieldGroupModel.setBinGroupBy( extractValue< sal_uInt8 >( nFlags, 2, 3 ) ); + maFieldGroupModel.setBiffGroupBy( extractValue< sal_uInt8 >( nFlags, 2, 3 ) ); maFieldGroupModel.mbRangeGroup = true; maFieldGroupModel.mbDateGroup = maFieldGroupModel.mnGroupBy != XML_range; maFieldGroupModel.mbAutoStart = getFlag( nFlags, BIFF_PCDFRANGEPR_AUTOSTART ); @@ -837,7 +833,7 @@ OUString PivotCacheField::createParentGroupField( const Reference< XDataPilotFie typedef ::std::vector< GroupItemList > GroupItemMap; GroupItemMap aItemMap( maGroupItems.size() ); for( IndexVector::const_iterator aBeg = maDiscreteItems.begin(), aIt = aBeg, aEnd = maDiscreteItems.end(); aIt != aEnd; ++aIt ) - if( GroupItemList* pItems = ContainerHelper::getVectorElement( aItemMap, *aIt ) ) + if( GroupItemList* pItems = ContainerHelper::getVectorElementAccess( aItemMap, *aIt ) ) pItems->push_back( static_cast< sal_Int32 >( aIt - aBeg ) ); // process all groups @@ -924,7 +920,7 @@ OUString PivotCacheField::createParentGroupField( const Reference< XDataPilotFie } // replace original item names in passed vector with group name for( GroupItemList::iterator aIt2 = aIt->begin(), aEnd2 = aIt->end(); aIt2 != aEnd2; ++aIt2 ) - if( PivotCacheGroupItem* pName = ContainerHelper::getVectorElement( orItemNames, *aIt2 ) ) + if( PivotCacheGroupItem* pName = ContainerHelper::getVectorElementAccess( orItemNames, *aIt2 ) ) pName->maGroupName = aGroupName; } } @@ -953,7 +949,7 @@ void PivotCacheField::writeSourceDataCell( WorksheetHelper& rSheetHelper, sal_In writeItemToSourceDataCell( rSheetHelper, nCol, nRow, rItem ); } -void PivotCacheField::importPCRecordItem( RecordInputStream& rStrm, WorksheetHelper& rSheetHelper, sal_Int32 nCol, sal_Int32 nRow ) const +void PivotCacheField::importPCRecordItem( SequenceInputStream& rStrm, WorksheetHelper& rSheetHelper, sal_Int32 nCol, sal_Int32 nRow ) const { if( hasSharedItems() ) { @@ -1088,29 +1084,29 @@ void PivotCache::importWorksheetSource( const AttributeList& rAttribs, const Rel getAddressConverter().convertToCellRangeUnchecked( maSheetSrcModel.maRange, rAttribs.getString( XML_ref, OUString() ), 0 ); } -void PivotCache::importPCDefinition( RecordInputStream& rStrm ) +void PivotCache::importPCDefinition( SequenceInputStream& rStrm ) { sal_uInt8 nFlags1, nFlags2; rStrm.skip( 3 ); // create/refresh version id's rStrm >> nFlags1 >> maDefModel.mnMissItemsLimit >> maDefModel.mfRefreshedDate >> nFlags2 >> maDefModel.mnRecords; - if( getFlag( nFlags2, OOBIN_PCDEFINITION_HASUSERNAME ) ) + if( getFlag( nFlags2, BIFF12_PCDEFINITION_HASUSERNAME ) ) rStrm >> maDefModel.maRefreshedBy; - if( getFlag( nFlags2, OOBIN_PCDEFINITION_HASRELID ) ) + if( getFlag( nFlags2, BIFF12_PCDEFINITION_HASRELID ) ) rStrm >> maDefModel.maRelId; - maDefModel.mbInvalid = getFlag( nFlags1, OOBIN_PCDEFINITION_INVALID ); - maDefModel.mbSaveData = getFlag( nFlags1, OOBIN_PCDEFINITION_SAVEDATA ); - maDefModel.mbRefreshOnLoad = getFlag( nFlags1, OOBIN_PCDEFINITION_REFRESHONLOAD ); - maDefModel.mbOptimizeMemory = getFlag( nFlags1, OOBIN_PCDEFINITION_OPTIMIZEMEMORY ); - maDefModel.mbEnableRefresh = getFlag( nFlags1, OOBIN_PCDEFINITION_ENABLEREFRESH ); - maDefModel.mbBackgroundQuery = getFlag( nFlags1, OOBIN_PCDEFINITION_BACKGROUNDQUERY ); - maDefModel.mbUpgradeOnRefresh = getFlag( nFlags1, OOBIN_PCDEFINITION_UPGRADEONREFR ); - maDefModel.mbTupleCache = getFlag( nFlags1, OOBIN_PCDEFINITION_TUPELCACHE ); - maDefModel.mbSupportSubquery = getFlag( nFlags2, OOBIN_PCDEFINITION_SUPPORTSUBQUERY ); - maDefModel.mbSupportDrill = getFlag( nFlags2, OOBIN_PCDEFINITION_SUPPORTDRILL ); + maDefModel.mbInvalid = getFlag( nFlags1, BIFF12_PCDEFINITION_INVALID ); + maDefModel.mbSaveData = getFlag( nFlags1, BIFF12_PCDEFINITION_SAVEDATA ); + maDefModel.mbRefreshOnLoad = getFlag( nFlags1, BIFF12_PCDEFINITION_REFRESHONLOAD ); + maDefModel.mbOptimizeMemory = getFlag( nFlags1, BIFF12_PCDEFINITION_OPTIMIZEMEMORY ); + maDefModel.mbEnableRefresh = getFlag( nFlags1, BIFF12_PCDEFINITION_ENABLEREFRESH ); + maDefModel.mbBackgroundQuery = getFlag( nFlags1, BIFF12_PCDEFINITION_BACKGROUNDQUERY ); + maDefModel.mbUpgradeOnRefresh = getFlag( nFlags1, BIFF12_PCDEFINITION_UPGRADEONREFR ); + maDefModel.mbTupleCache = getFlag( nFlags1, BIFF12_PCDEFINITION_TUPELCACHE ); + maDefModel.mbSupportSubquery = getFlag( nFlags2, BIFF12_PCDEFINITION_SUPPORTSUBQUERY ); + maDefModel.mbSupportDrill = getFlag( nFlags2, BIFF12_PCDEFINITION_SUPPORTDRILL ); } -void PivotCache::importPCDSource( RecordInputStream& rStrm ) +void PivotCache::importPCDSource( SequenceInputStream& rStrm ) { sal_Int32 nSourceType; rStrm >> nSourceType >> maSourceModel.mnConnectionId; @@ -1118,13 +1114,13 @@ void PivotCache::importPCDSource( RecordInputStream& rStrm ) maSourceModel.mnSourceType = STATIC_ARRAY_SELECT( spnSourceTypes, nSourceType, XML_TOKEN_INVALID ); } -void PivotCache::importPCDSheetSource( RecordInputStream& rStrm, const Relations& rRelations ) +void PivotCache::importPCDSheetSource( SequenceInputStream& rStrm, const Relations& rRelations ) { sal_uInt8 nIsDefName, nIsBuiltinName, nFlags; rStrm >> nIsDefName >> nIsBuiltinName >> nFlags; - if( getFlag( nFlags, OOBIN_PCDWBSOURCE_HASSHEET ) ) + if( getFlag( nFlags, BIFF12_PCDWBSOURCE_HASSHEET ) ) rStrm >> maSheetSrcModel.maSheet; - if( getFlag( nFlags, OOBIN_PCDWBSOURCE_HASRELID ) ) + if( getFlag( nFlags, BIFF12_PCDWBSOURCE_HASRELID ) ) rStrm >> maSheetSrcModel.maRelId; // read cell range or defined name @@ -1268,7 +1264,7 @@ const PivotCacheField* PivotCache::getCacheField( sal_Int32 nFieldIdx ) const sal_Int32 PivotCache::getCacheDatabaseIndex( sal_Int32 nFieldIdx ) const { - return ContainerHelper::getVectorElement< sal_Int32 >( maDatabaseIndexes, nFieldIdx, -1 ); + return ContainerHelper::getVectorElement( maDatabaseIndexes, nFieldIdx, -1 ); } void PivotCache::writeSourceHeaderCells( WorksheetHelper& rSheetHelper ) const @@ -1290,7 +1286,7 @@ void PivotCache::writeSourceDataCell( WorksheetHelper& rSheetHelper, sal_Int32 n pCacheField->writeSourceDataCell( rSheetHelper, maSheetSrcModel.maRange.StartColumn + nCol, maSheetSrcModel.maRange.StartRow + nRow, rItem ); } -void PivotCache::importPCRecord( RecordInputStream& rStrm, WorksheetHelper& rSheetHelper, sal_Int32 nRow ) const +void PivotCache::importPCRecord( SequenceInputStream& rStrm, WorksheetHelper& rSheetHelper, sal_Int32 nRow ) const { OSL_ENSURE( (0 < nRow) && (nRow <= maSheetSrcModel.maRange.EndRow - maSheetSrcModel.maRange.StartRow), "PivotCache::importPCRecord - invalid row index" ); sal_Int32 nCol = maSheetSrcModel.maRange.StartColumn; @@ -1411,7 +1407,7 @@ void PivotCache::finalizeExternalSheetSource() { /* If pivot cache is based on external sheet data, try to restore sheet data from cache records. No support for external defined names or tables, - sheet name and path to cache records fragment (OOX only) are required. */ + sheet name and path to cache records fragment (OOXML only) are required. */ bool bHasRelation = (getFilterType() == FILTER_BIFF) || (maDefModel.maRelId.getLength() > 0); if( bHasRelation && (maSheetSrcModel.maDefName.getLength() == 0) && (maSheetSrcModel.maSheet.getLength() > 0) ) prepareSourceDataSheet(); @@ -1471,6 +1467,29 @@ PivotCache* PivotCacheBuffer::importPivotCacheFragment( sal_Int32 nCacheId ) { switch( getFilterType() ) { + /* OOXML/BIFF12 filter: On first call for the cache ID, the pivot + cache object is created and inserted into maCaches. Then, the cache + definition fragment is read and the cache is returned. On + subsequent calls, the created cache will be found in maCaches and + returned immediately. */ + case FILTER_OOXML: + { + // try to find an imported pivot cache + if( PivotCache* pCache = maCaches.get( nCacheId ).get() ) + return pCache; + + // check if a fragment path exists for the passed cache identifier + FragmentPathMap::iterator aIt = maFragmentPaths.find( nCacheId ); + if( aIt == maFragmentPaths.end() ) + return 0; + + /* Import the cache fragment. This may create a dummy data sheet + for external sheet sources. */ + PivotCache& rCache = createPivotCache( nCacheId ); + importOoxFragment( new PivotCacheDefinitionFragment( *this, aIt->second, rCache ) ); + return &rCache; + } + /* BIFF filter: Pivot table provides 0-based index into list of pivot cache source links (PIVOTCACHE/PCDSOURCE/... record blocks in workbook stream). First, this index has to be resolved to the cache @@ -1485,7 +1504,7 @@ PivotCache* PivotCacheBuffer::importPivotCacheFragment( sal_Int32 nCacheId ) { /* Resolve cache index to cache identifier and try to find pivot cache. Cache must exist already for a valid cache index. */ - nCacheId = ContainerHelper::getVectorElement< sal_Int32 >( maCacheIds, nCacheId, -1 ); + nCacheId = ContainerHelper::getVectorElement( maCacheIds, nCacheId, -1 ); PivotCache* pCache = maCaches.get( nCacheId ).get(); if( !pCache ) return 0; @@ -1504,29 +1523,6 @@ PivotCache* PivotCacheBuffer::importPivotCacheFragment( sal_Int32 nCacheId ) return pCache; } - /* OOX/OOBIN filter: On first call for the cache ID, the pivot cache - object is created and inserted into maCaches. Then, the cache - definition fragment is read and the cache is returned. On - subsequent calls, the created cache will be found in maCaches and - returned immediately. */ - case FILTER_OOX: - { - // try to find an imported pivot cache - if( PivotCache* pCache = maCaches.get( nCacheId ).get() ) - return pCache; - - // check if a fragment path exists for the passed cache identifier - FragmentPathMap::iterator aIt = maFragmentPaths.find( nCacheId ); - if( aIt == maFragmentPaths.end() ) - return 0; - - /* Import the cache fragment. This may create a dummy data sheet - for external sheet sources. */ - PivotCache& rCache = createPivotCache( nCacheId ); - importOoxFragment( new OoxPivotCacheDefinitionFragment( *this, aIt->second, rCache ) ); - return &rCache; - } - case FILTER_UNKNOWN: OSL_ENSURE( false, "PivotCacheBuffer::importPivotCacheFragment - unknown filter type" ); } @@ -1545,4 +1541,3 @@ PivotCache& PivotCacheBuffer::createPivotCache( sal_Int32 nCacheId ) } // namespace xls } // namespace oox - diff --git a/oox/source/xls/pivotcachefragment.cxx b/oox/source/xls/pivotcachefragment.cxx index 440fcd1e0903..d49077af4f91 100644 --- a/oox/source/xls/pivotcachefragment.cxx +++ b/oox/source/xls/pivotcachefragment.cxx @@ -26,29 +26,31 @@ ************************************************************************/ #include "oox/xls/pivotcachefragment.hxx" + #include "oox/helper/attributelist.hxx" -#include "oox/helper/recordinputstream.hxx" #include "oox/xls/addressconverter.hxx" #include "oox/xls/biffinputstream.hxx" #include "oox/xls/pivotcachebuffer.hxx" -using ::rtl::OUString; -using ::com::sun::star::uno::Any; -using ::oox::core::ContextHandlerRef; -using ::oox::core::RecordInfo; - namespace oox { namespace xls { // ============================================================================ -OoxPivotCacheFieldContext::OoxPivotCacheFieldContext( OoxWorkbookFragmentBase& rFragment, PivotCacheField& rCacheField ) : - OoxWorkbookContextBase( rFragment ), +using namespace ::com::sun::star::uno; +using namespace ::oox::core; + +using ::rtl::OUString; + +// ============================================================================ + +PivotCacheFieldContext::PivotCacheFieldContext( WorkbookFragmentBase& rFragment, PivotCacheField& rCacheField ) : + WorkbookContextBase( rFragment ), mrCacheField( rCacheField ) { } -ContextHandlerRef OoxPivotCacheFieldContext::onCreateContext( sal_Int32 nElement, const AttributeList& rAttribs ) +ContextHandlerRef PivotCacheFieldContext::onCreateContext( sal_Int32 nElement, const AttributeList& rAttribs ) { switch( getCurrentElement() ) { @@ -73,41 +75,41 @@ ContextHandlerRef OoxPivotCacheFieldContext::onCreateContext( sal_Int32 nElement return 0; } -void OoxPivotCacheFieldContext::onStartElement( const AttributeList& rAttribs ) +void PivotCacheFieldContext::onStartElement( const AttributeList& rAttribs ) { if( isRootElement() ) mrCacheField.importCacheField( rAttribs ); } -ContextHandlerRef OoxPivotCacheFieldContext::onCreateRecordContext( sal_Int32 nRecId, RecordInputStream& rStrm ) +ContextHandlerRef PivotCacheFieldContext::onCreateRecordContext( sal_Int32 nRecId, SequenceInputStream& rStrm ) { switch( getCurrentElement() ) { - case OOBIN_ID_PCDFIELD: + case BIFF12_ID_PCDFIELD: switch( nRecId ) { - case OOBIN_ID_PCDFSHAREDITEMS: mrCacheField.importPCDFSharedItems( rStrm ); return this; - case OOBIN_ID_PCDFIELDGROUP: mrCacheField.importPCDFieldGroup( rStrm ); return this; + case BIFF12_ID_PCDFSHAREDITEMS: mrCacheField.importPCDFSharedItems( rStrm ); return this; + case BIFF12_ID_PCDFIELDGROUP: mrCacheField.importPCDFieldGroup( rStrm ); return this; } break; - case OOBIN_ID_PCDFIELDGROUP: + case BIFF12_ID_PCDFIELDGROUP: switch( nRecId ) { - case OOBIN_ID_PCDFRANGEPR: mrCacheField.importPCDFRangePr( rStrm ); break; - case OOBIN_ID_PCDFDISCRETEPR: return this; - case OOBIN_ID_PCDFGROUPITEMS: return this; + case BIFF12_ID_PCDFRANGEPR: mrCacheField.importPCDFRangePr( rStrm ); break; + case BIFF12_ID_PCDFDISCRETEPR: return this; + case BIFF12_ID_PCDFGROUPITEMS: return this; } break; - case OOBIN_ID_PCDFSHAREDITEMS: mrCacheField.importPCDFSharedItem( nRecId, rStrm ); break; - case OOBIN_ID_PCDFDISCRETEPR: mrCacheField.importPCDFDiscretePrItem( nRecId, rStrm ); break; - case OOBIN_ID_PCDFGROUPITEMS: mrCacheField.importPCDFGroupItem( nRecId, rStrm ); break; + case BIFF12_ID_PCDFSHAREDITEMS: mrCacheField.importPCDFSharedItem( nRecId, rStrm ); break; + case BIFF12_ID_PCDFDISCRETEPR: mrCacheField.importPCDFDiscretePrItem( nRecId, rStrm ); break; + case BIFF12_ID_PCDFGROUPITEMS: mrCacheField.importPCDFGroupItem( nRecId, rStrm ); break; } return 0; } -void OoxPivotCacheFieldContext::onStartRecord( RecordInputStream& rStrm ) +void PivotCacheFieldContext::onStartRecord( SequenceInputStream& rStrm ) { if( isRootElement() ) mrCacheField.importPCDField( rStrm ); @@ -115,14 +117,14 @@ void OoxPivotCacheFieldContext::onStartRecord( RecordInputStream& rStrm ) // ============================================================================ -OoxPivotCacheDefinitionFragment::OoxPivotCacheDefinitionFragment( +PivotCacheDefinitionFragment::PivotCacheDefinitionFragment( const WorkbookHelper& rHelper, const OUString& rFragmentPath, PivotCache& rPivotCache ) : - OoxWorkbookFragmentBase( rHelper, rFragmentPath ), + WorkbookFragmentBase( rHelper, rFragmentPath ), mrPivotCache( rPivotCache ) { } -ContextHandlerRef OoxPivotCacheDefinitionFragment::onCreateContext( sal_Int32 nElement, const AttributeList& rAttribs ) +ContextHandlerRef PivotCacheDefinitionFragment::onCreateContext( sal_Int32 nElement, const AttributeList& rAttribs ) { switch( getCurrentElement() ) { @@ -143,60 +145,60 @@ ContextHandlerRef OoxPivotCacheDefinitionFragment::onCreateContext( sal_Int32 nE break; case XLS_TOKEN( cacheFields ): - if( nElement == XLS_TOKEN( cacheField ) ) return new OoxPivotCacheFieldContext( *this, mrPivotCache.createCacheField() ); + if( nElement == XLS_TOKEN( cacheField ) ) return new PivotCacheFieldContext( *this, mrPivotCache.createCacheField() ); break; } return 0; } -ContextHandlerRef OoxPivotCacheDefinitionFragment::onCreateRecordContext( sal_Int32 nRecId, RecordInputStream& rStrm ) +ContextHandlerRef PivotCacheDefinitionFragment::onCreateRecordContext( sal_Int32 nRecId, SequenceInputStream& rStrm ) { switch( getCurrentElement() ) { case XML_ROOT_CONTEXT: - if( nRecId == OOBIN_ID_PCDEFINITION ) { mrPivotCache.importPCDefinition( rStrm ); return this; } + if( nRecId == BIFF12_ID_PCDEFINITION ) { mrPivotCache.importPCDefinition( rStrm ); return this; } break; - case OOBIN_ID_PCDEFINITION: + case BIFF12_ID_PCDEFINITION: switch( nRecId ) { - case OOBIN_ID_PCDSOURCE: mrPivotCache.importPCDSource( rStrm ); return this; - case OOBIN_ID_PCDFIELDS: return this; + case BIFF12_ID_PCDSOURCE: mrPivotCache.importPCDSource( rStrm ); return this; + case BIFF12_ID_PCDFIELDS: return this; } break; - case OOBIN_ID_PCDSOURCE: - if( nRecId == OOBIN_ID_PCDSHEETSOURCE ) mrPivotCache.importPCDSheetSource( rStrm, getRelations() ); + case BIFF12_ID_PCDSOURCE: + if( nRecId == BIFF12_ID_PCDSHEETSOURCE ) mrPivotCache.importPCDSheetSource( rStrm, getRelations() ); break; - case OOBIN_ID_PCDFIELDS: - if( nRecId == OOBIN_ID_PCDFIELD ) return new OoxPivotCacheFieldContext( *this, mrPivotCache.createCacheField() ); + case BIFF12_ID_PCDFIELDS: + if( nRecId == BIFF12_ID_PCDFIELD ) return new PivotCacheFieldContext( *this, mrPivotCache.createCacheField() ); break; } return 0; } -const RecordInfo* OoxPivotCacheDefinitionFragment::getRecordInfos() const +const RecordInfo* PivotCacheDefinitionFragment::getRecordInfos() const { static const RecordInfo spRecInfos[] = { - { OOBIN_ID_PCDEFINITION, OOBIN_ID_PCDEFINITION + 1 }, - { OOBIN_ID_PCDFDISCRETEPR, OOBIN_ID_PCDFDISCRETEPR + 1 }, - { OOBIN_ID_PCDFGROUPITEMS, OOBIN_ID_PCDFGROUPITEMS + 1 }, - { OOBIN_ID_PCDFIELD, OOBIN_ID_PCDFIELD + 1 }, - { OOBIN_ID_PCDFIELDGROUP, OOBIN_ID_PCDFIELDGROUP + 1 }, - { OOBIN_ID_PCDFIELDS, OOBIN_ID_PCDFIELDS + 1 }, - { OOBIN_ID_PCDFRANGEPR, OOBIN_ID_PCDFRANGEPR + 1 }, - { OOBIN_ID_PCDFSHAREDITEMS, OOBIN_ID_PCDFSHAREDITEMS + 1 }, - { OOBIN_ID_PCITEM_ARRAY, OOBIN_ID_PCITEM_ARRAY + 1 }, - { OOBIN_ID_PCDSHEETSOURCE, OOBIN_ID_PCDSHEETSOURCE + 1 }, - { OOBIN_ID_PCDSOURCE, OOBIN_ID_PCDSOURCE + 1 }, - { -1, -1 } + { BIFF12_ID_PCDEFINITION, BIFF12_ID_PCDEFINITION + 1 }, + { BIFF12_ID_PCDFDISCRETEPR, BIFF12_ID_PCDFDISCRETEPR + 1 }, + { BIFF12_ID_PCDFGROUPITEMS, BIFF12_ID_PCDFGROUPITEMS + 1 }, + { BIFF12_ID_PCDFIELD, BIFF12_ID_PCDFIELD + 1 }, + { BIFF12_ID_PCDFIELDGROUP, BIFF12_ID_PCDFIELDGROUP + 1 }, + { BIFF12_ID_PCDFIELDS, BIFF12_ID_PCDFIELDS + 1 }, + { BIFF12_ID_PCDFRANGEPR, BIFF12_ID_PCDFRANGEPR + 1 }, + { BIFF12_ID_PCDFSHAREDITEMS, BIFF12_ID_PCDFSHAREDITEMS + 1 }, + { BIFF12_ID_PCITEM_ARRAY, BIFF12_ID_PCITEM_ARRAY + 1 }, + { BIFF12_ID_PCDSHEETSOURCE, BIFF12_ID_PCDSHEETSOURCE + 1 }, + { BIFF12_ID_PCDSOURCE, BIFF12_ID_PCDSOURCE + 1 }, + { -1, -1 } }; return spRecInfos; } -void OoxPivotCacheDefinitionFragment::finalizeImport() +void PivotCacheDefinitionFragment::finalizeImport() { // finalize the cache (check source range etc.) mrPivotCache.finalizeImport(); @@ -206,15 +208,15 @@ void OoxPivotCacheDefinitionFragment::finalizeImport() { OUString aRecFragmentPath = getRelations().getFragmentPathFromRelId( mrPivotCache.getRecordsRelId() ); if( aRecFragmentPath.getLength() > 0 ) - importOoxFragment( new OoxPivotCacheRecordsFragment( *this, aRecFragmentPath, mrPivotCache ) ); + importOoxFragment( new PivotCacheRecordsFragment( *this, aRecFragmentPath, mrPivotCache ) ); } } // ============================================================================ -OoxPivotCacheRecordsFragment::OoxPivotCacheRecordsFragment( const WorkbookHelper& rHelper, +PivotCacheRecordsFragment::PivotCacheRecordsFragment( const WorkbookHelper& rHelper, const OUString& rFragmentPath, const PivotCache& rPivotCache ) : - OoxWorksheetFragmentBase( rHelper, rFragmentPath, ISegmentProgressBarRef(), SHEETTYPE_WORKSHEET, rPivotCache.getSourceRange().Sheet ), + WorksheetFragmentBase( rHelper, rFragmentPath, ISegmentProgressBarRef(), SHEETTYPE_WORKSHEET, rPivotCache.getSourceRange().Sheet ), mrPivotCache( rPivotCache ), mnCol( 0 ), mnRow( 0 ), @@ -224,7 +226,7 @@ OoxPivotCacheRecordsFragment::OoxPivotCacheRecordsFragment( const WorkbookHelper rPivotCache.writeSourceHeaderCells( *this ); } -ContextHandlerRef OoxPivotCacheRecordsFragment::onCreateContext( sal_Int32 nElement, const AttributeList& rAttribs ) +ContextHandlerRef PivotCacheRecordsFragment::onCreateContext( sal_Int32 nElement, const AttributeList& rAttribs ) { switch( getCurrentElement() ) { @@ -248,7 +250,7 @@ ContextHandlerRef OoxPivotCacheRecordsFragment::onCreateContext( sal_Int32 nElem case XLS_TOKEN( b ): aItem.readBool( rAttribs ); break; case XLS_TOKEN( e ): aItem.readError( rAttribs, getUnitConverter() ); break; case XLS_TOKEN( x ): aItem.readIndex( rAttribs ); break; - default: OSL_ENSURE( false, "OoxPivotCacheRecordsFragment::onCreateContext - unexpected element" ); + default: OSL_ENSURE( false, "PivotCacheRecordsFragment::onCreateContext - unexpected element" ); } mrPivotCache.writeSourceDataCell( *this, mnCol, mnRow, aItem ); ++mnCol; @@ -258,19 +260,19 @@ ContextHandlerRef OoxPivotCacheRecordsFragment::onCreateContext( sal_Int32 nElem return 0; } -ContextHandlerRef OoxPivotCacheRecordsFragment::onCreateRecordContext( sal_Int32 nRecId, RecordInputStream& rStrm ) +ContextHandlerRef PivotCacheRecordsFragment::onCreateRecordContext( sal_Int32 nRecId, SequenceInputStream& rStrm ) { switch( getCurrentElement() ) { case XML_ROOT_CONTEXT: - if( nRecId == OOBIN_ID_PCRECORDS ) return this; + if( nRecId == BIFF12_ID_PCRECORDS ) return this; break; - case OOBIN_ID_PCRECORDS: + case BIFF12_ID_PCRECORDS: switch( nRecId ) { - case OOBIN_ID_PCRECORD: importPCRecord( rStrm ); break; - case OOBIN_ID_PCRECORDDT: startCacheRecord(); break; + case BIFF12_ID_PCRECORD: importPCRecord( rStrm ); break; + case BIFF12_ID_PCRECORDDT: startCacheRecord(); break; default: importPCRecordItem( nRecId, rStrm ); break; } break; @@ -278,11 +280,11 @@ ContextHandlerRef OoxPivotCacheRecordsFragment::onCreateRecordContext( sal_Int32 return 0; } -const RecordInfo* OoxPivotCacheRecordsFragment::getRecordInfos() const +const RecordInfo* PivotCacheRecordsFragment::getRecordInfos() const { static const RecordInfo spRecInfos[] = { - { OOBIN_ID_PCRECORDS, OOBIN_ID_PCRECORDS + 1 }, + { BIFF12_ID_PCRECORDS, BIFF12_ID_PCRECORDS + 1 }, { -1, -1 } }; return spRecInfos; @@ -290,35 +292,35 @@ const RecordInfo* OoxPivotCacheRecordsFragment::getRecordInfos() const // private -------------------------------------------------------------------- -void OoxPivotCacheRecordsFragment::startCacheRecord() +void PivotCacheRecordsFragment::startCacheRecord() { mnCol = 0; ++mnRow; mbInRecord = true; } -void OoxPivotCacheRecordsFragment::importPCRecord( RecordInputStream& rStrm ) +void PivotCacheRecordsFragment::importPCRecord( SequenceInputStream& rStrm ) { startCacheRecord(); mrPivotCache.importPCRecord( rStrm, *this, mnRow ); mbInRecord = false; } -void OoxPivotCacheRecordsFragment::importPCRecordItem( sal_Int32 nRecId, RecordInputStream& rStrm ) +void PivotCacheRecordsFragment::importPCRecordItem( sal_Int32 nRecId, SequenceInputStream& rStrm ) { if( mbInRecord ) { PivotCacheItem aItem; switch( nRecId ) { - case OOBIN_ID_PCITEM_MISSING: break; - case OOBIN_ID_PCITEM_STRING: aItem.readString( rStrm ); break; - case OOBIN_ID_PCITEM_DOUBLE: aItem.readDouble( rStrm ); break; - case OOBIN_ID_PCITEM_DATE: aItem.readDate( rStrm ); break; - case OOBIN_ID_PCITEM_BOOL: aItem.readBool( rStrm ); break; - case OOBIN_ID_PCITEM_ERROR: aItem.readError( rStrm ); break; - case OOBIN_ID_PCITEM_INDEX: aItem.readIndex( rStrm ); break; - default: OSL_ENSURE( false, "OoxPivotCacheRecordsFragment::importPCRecordItem - unexpected record" ); + case BIFF12_ID_PCITEM_MISSING: break; + case BIFF12_ID_PCITEM_STRING: aItem.readString( rStrm ); break; + case BIFF12_ID_PCITEM_DOUBLE: aItem.readDouble( rStrm ); break; + case BIFF12_ID_PCITEM_DATE: aItem.readDate( rStrm ); break; + case BIFF12_ID_PCITEM_BOOL: aItem.readBool( rStrm ); break; + case BIFF12_ID_PCITEM_ERROR: aItem.readError( rStrm ); break; + case BIFF12_ID_PCITEM_INDEX: aItem.readIndex( rStrm ); break; + default: OSL_ENSURE( false, "PivotCacheRecordsFragment::importPCRecordItem - unexpected record" ); } mrPivotCache.writeSourceDataCell( *this, mnCol, mnRow, aItem ); ++mnCol; @@ -345,7 +347,7 @@ bool lclSeekToPCDField( BiffInputStream& rStrm ) // ---------------------------------------------------------------------------- BiffPivotCacheFragment::BiffPivotCacheFragment( - const WorkbookHelper& rHelper, const ::rtl::OUString& rStrmName, PivotCache& rPivotCache ) : + const WorkbookHelper& rHelper, const OUString& rStrmName, PivotCache& rPivotCache ) : BiffWorkbookFragmentBase( rHelper, rStrmName, true ), mrPivotCache( rPivotCache ) { @@ -353,14 +355,15 @@ BiffPivotCacheFragment::BiffPivotCacheFragment( bool BiffPivotCacheFragment::importFragment() { - if( mrStrm.startNextRecord() && (mrStrm.getRecId() == BIFF_ID_PCDEFINITION) ) + BiffInputStream& rStrm = getInputStream(); + if( rStrm.startNextRecord() && (rStrm.getRecId() == BIFF_ID_PCDEFINITION) ) { // read PCDEFINITION and optional PCDEFINITION2 records - mrPivotCache.importPCDefinition( mrStrm ); + mrPivotCache.importPCDefinition( rStrm ); // read cache fields as long as another PCDFIELD record can be found - while( lclSeekToPCDField( mrStrm ) ) - mrPivotCache.createCacheField( true ).importPCDField( mrStrm ); + while( lclSeekToPCDField( rStrm ) ) + mrPivotCache.createCacheField( true ).importPCDField( rStrm ); // finalize the cache (check source range etc.) mrPivotCache.finalizeImport(); @@ -372,19 +375,18 @@ bool BiffPivotCacheFragment::importFragment() unchanged. Stream should point to source data table now. */ BiffPivotCacheRecordsContext aContext( *this, mrPivotCache ); if( aContext.isValidSheet() ) - while( mrStrm.startNextRecord() && (mrStrm.getRecId() != BIFF_ID_EOF) ) - aContext.importRecord(); + while( rStrm.startNextRecord() && (rStrm.getRecId() != BIFF_ID_EOF) ) + aContext.importRecord( rStrm ); } } - return mrStrm.getRecId() == BIFF_ID_EOF; + return rStrm.getRecId() == BIFF_ID_EOF; } // ============================================================================ -BiffPivotCacheRecordsContext::BiffPivotCacheRecordsContext( - const BiffWorkbookFragmentBase& rFragment, const PivotCache& rPivotCache ) : - BiffWorksheetContextBase( rFragment, ISegmentProgressBarRef(), SHEETTYPE_WORKSHEET, rPivotCache.getSourceRange().Sheet ), +BiffPivotCacheRecordsContext::BiffPivotCacheRecordsContext( const WorkbookHelper& rHelper, const PivotCache& rPivotCache ) : + BiffWorksheetContextBase( rHelper, ISegmentProgressBarRef(), SHEETTYPE_WORKSHEET, rPivotCache.getSourceRange().Sheet ), mrPivotCache( rPivotCache ), mnColIdx( 0 ), mnRow( 0 ), @@ -409,28 +411,28 @@ BiffPivotCacheRecordsContext::BiffPivotCacheRecordsContext( } } -void BiffPivotCacheRecordsContext::importRecord() +void BiffPivotCacheRecordsContext::importRecord( BiffInputStream& rStrm ) { - if( mrStrm.getRecId() == BIFF_ID_PCITEM_INDEXLIST ) + if( rStrm.getRecId() == BIFF_ID_PCITEM_INDEXLIST ) { OSL_ENSURE( mbHasShared, "BiffPivotCacheRecordsContext::importRecord - unexpected PCITEM_INDEXLIST record" ); // PCITEM_INDEXLIST record always in front of a new data row startNextRow(); - mrPivotCache.importPCItemIndexList( mrStrm, *this, mnRow ); + mrPivotCache.importPCItemIndexList( rStrm, *this, mnRow ); mbInRow = !maUnsharedCols.empty(); // mbInRow remains true, if unshared items are expected return; } PivotCacheItem aItem; - switch( mrStrm.getRecId() ) + switch( rStrm.getRecId() ) { case BIFF_ID_PCITEM_MISSING: break; - case BIFF_ID_PCITEM_STRING: aItem.readString( mrStrm, *this ); break; - case BIFF_ID_PCITEM_DOUBLE: aItem.readDouble( mrStrm ); break; - case BIFF_ID_PCITEM_INTEGER: aItem.readInteger( mrStrm ); break; - case BIFF_ID_PCITEM_DATE: aItem.readDate( mrStrm ); break; - case BIFF_ID_PCITEM_BOOL: aItem.readBool( mrStrm ); break; - case BIFF_ID_PCITEM_ERROR: aItem.readError( mrStrm ); break; + case BIFF_ID_PCITEM_STRING: aItem.readString( rStrm, *this ); break; + case BIFF_ID_PCITEM_DOUBLE: aItem.readDouble( rStrm ); break; + case BIFF_ID_PCITEM_INTEGER: aItem.readInteger( rStrm ); break; + case BIFF_ID_PCITEM_DATE: aItem.readDate( rStrm ); break; + case BIFF_ID_PCITEM_BOOL: aItem.readBool( rStrm ); break; + case BIFF_ID_PCITEM_ERROR: aItem.readError( rStrm ); break; default: return; // unknown record, ignore } @@ -462,4 +464,3 @@ void BiffPivotCacheRecordsContext::startNextRow() } // namespace xls } // namespace oox - diff --git a/oox/source/xls/pivottablebuffer.cxx b/oox/source/xls/pivottablebuffer.cxx index b4e3e1c52a65..7cdeddaa879b 100644 --- a/oox/source/xls/pivottablebuffer.cxx +++ b/oox/source/xls/pivottablebuffer.cxx @@ -26,6 +26,7 @@ ************************************************************************/ #include "oox/xls/pivottablebuffer.hxx" + #include <set> #include <com/sun/star/container/XIndexAccess.hpp> #include <com/sun/star/container/XNameAccess.hpp> @@ -45,37 +46,26 @@ #include <com/sun/star/sheet/XDataPilotField.hpp> #include <com/sun/star/sheet/XDataPilotTablesSupplier.hpp> #include <com/sun/star/sheet/XSheetOperation.hpp> -#include "properties.hxx" #include "oox/helper/attributelist.hxx" +#include "oox/helper/containerhelper.hxx" #include "oox/helper/propertyset.hxx" -#include "oox/helper/recordinputstream.hxx" #include "oox/xls/addressconverter.hxx" #include "oox/xls/biffinputstream.hxx" -using ::rtl::OUString; -using ::com::sun::star::uno::Exception; -using ::com::sun::star::uno::Reference; -using ::com::sun::star::uno::UNO_QUERY; -using ::com::sun::star::uno::UNO_QUERY_THROW; -using ::com::sun::star::uno::UNO_SET_THROW; -using ::com::sun::star::beans::XPropertySet; -using ::com::sun::star::container::XIndexAccess; -using ::com::sun::star::container::XNameAccess; -using ::com::sun::star::container::XNamed; -using ::com::sun::star::table::CellAddress; -using ::com::sun::star::sheet::DataPilotFieldOrientation; -using ::com::sun::star::sheet::XDataPilotDataLayoutFieldSupplier; -using ::com::sun::star::sheet::XDataPilotDescriptor; -using ::com::sun::star::sheet::XDataPilotField; -using ::com::sun::star::sheet::XDataPilotTables; -using ::com::sun::star::sheet::XDataPilotTablesSupplier; -using ::com::sun::star::sheet::XSheetOperation; - namespace oox { namespace xls { // ============================================================================ +using namespace ::com::sun::star::container; +using namespace ::com::sun::star::sheet; +using namespace ::com::sun::star::table; +using namespace ::com::sun::star::uno; + +using ::rtl::OUString; + +// ============================================================================ + namespace { const sal_Int32 OOX_PT_DATALAYOUTFIELD = -2; /// Placeholder index of data layout field. @@ -85,83 +75,90 @@ const sal_Int32 OOX_PT_NEXT_ITEM = 0x001000FD; /// Calculat // ---------------------------------------------------------------------------- -const sal_uInt32 OOBIN_PTFIELD_DATAFIELD = 0x00000008; -const sal_uInt32 OOBIN_PTFIELD_DEFAULT = 0x00000100; -const sal_uInt32 OOBIN_PTFIELD_SUM = 0x00000200; -const sal_uInt32 OOBIN_PTFIELD_COUNTA = 0x00000400; -const sal_uInt32 OOBIN_PTFIELD_AVERAGE = 0x00000800; -const sal_uInt32 OOBIN_PTFIELD_MAX = 0x00001000; -const sal_uInt32 OOBIN_PTFIELD_MIN = 0x00002000; -const sal_uInt32 OOBIN_PTFIELD_PRODUCT = 0x00004000; -const sal_uInt32 OOBIN_PTFIELD_COUNT = 0x00008000; -const sal_uInt32 OOBIN_PTFIELD_STDDEV = 0x00010000; -const sal_uInt32 OOBIN_PTFIELD_STDDEVP = 0x00020000; -const sal_uInt32 OOBIN_PTFIELD_VAR = 0x00040000; -const sal_uInt32 OOBIN_PTFIELD_VARP = 0x00080000; - -const sal_uInt32 OOBIN_PTFIELD_SHOWALL = 0x00000020; -const sal_uInt32 OOBIN_PTFIELD_OUTLINE = 0x00000040; -const sal_uInt32 OOBIN_PTFIELD_INSERTBLANKROW = 0x00000080; -const sal_uInt32 OOBIN_PTFIELD_SUBTOTALTOP = 0x00000100; -const sal_uInt32 OOBIN_PTFIELD_INSERTPAGEBREAK = 0x00000800; -const sal_uInt32 OOBIN_PTFIELD_AUTOSORT = 0x00001000; -const sal_uInt32 OOBIN_PTFIELD_SORTASCENDING = 0x00002000; -const sal_uInt32 OOBIN_PTFIELD_AUTOSHOW = 0x00004000; -const sal_uInt32 OOBIN_PTFIELD_AUTOSHOWTOP = 0x00008000; -const sal_uInt32 OOBIN_PTFIELD_MULTIPAGEITEMS = 0x00080000; - -const sal_uInt16 OOBIN_PTFITEM_HIDDEN = 0x0001; -const sal_uInt16 OOBIN_PTFITEM_HIDEDETAILS = 0x0002; - -const sal_uInt8 OOBIN_PTPAGEFIELD_HASNAME = 0x01; -const sal_uInt8 OOBIN_PTPAGEFIELD_HASOLAPCAPTION = 0x02; -const sal_Int32 OOBIN_PTPAGEFIELD_MULTIITEMS = 0x001000FE; - -const sal_uInt16 OOBIN_PTFILTER_HASNAME = 0x0001; -const sal_uInt16 OOBIN_PTFILTER_HASDESCRIPTION = 0x0002; -const sal_uInt16 OOBIN_PTFILTER_HASSTRVALUE1 = 0x0004; -const sal_uInt16 OOBIN_PTFILTER_HASSTRVALUE2 = 0x0008; - -const sal_uInt8 OOBIN_TOP10FILTER_TOP = 0x01; -const sal_uInt8 OOBIN_TOP10FILTER_PERCENT = 0x02; - -const sal_uInt32 OOBIN_PTDEF_SHOWITEMS = 0x00000100; -const sal_uInt32 OOBIN_PTDEF_DISABLEFIELDLIST = 0x00000400; -const sal_uInt32 OOBIN_PTDEF_HIDECALCMEMBERS = 0x00001000; -const sal_uInt32 OOBIN_PTDEF_WITHHIDDENTOTALS = 0x00002000; -const sal_uInt32 OOBIN_PTDEF_HIDEDRILL = 0x00100000; -const sal_uInt32 OOBIN_PTDEF_PRINTDRILL = 0x00200000; -const sal_uInt32 OOBIN_PTDEF_HIDEHEADERS = 0x80000000; - -const sal_uInt32 OOBIN_PTDEF_SHOWEMPTYROW = 0x00000004; -const sal_uInt32 OOBIN_PTDEF_SHOWEMPTYCOL = 0x00000008; -const sal_uInt32 OOBIN_PTDEF_ENABLEDRILL = 0x00000020; -const sal_uInt32 OOBIN_PTDEF_PRESERVEFORMATTING = 0x00000080; -const sal_uInt32 OOBIN_PTDEF_SHOWERROR = 0x00000200; -const sal_uInt32 OOBIN_PTDEF_SHOWMISSING = 0x00000400; -const sal_uInt32 OOBIN_PTDEF_PAGEOVERTHENDOWN = 0x00000800; -const sal_uInt32 OOBIN_PTDEF_SUBTOTALHIDDENITEMS = 0x00001000; -const sal_uInt32 OOBIN_PTDEF_ROWGRANDTOTALS = 0x00002000; -const sal_uInt32 OOBIN_PTDEF_COLGRANDTOTALS = 0x00004000; -const sal_uInt32 OOBIN_PTDEF_FIELDPRINTTITLES = 0x00008000; -const sal_uInt32 OOBIN_PTDEF_ITEMPRINTTITLES = 0x00020000; -const sal_uInt32 OOBIN_PTDEF_MERGEITEM = 0x00040000; -const sal_uInt32 OOBIN_PTDEF_HASDATACAPTION = 0x00080000; -const sal_uInt32 OOBIN_PTDEF_HASGRANDTOTALCAPTION = 0x00100000; -const sal_uInt32 OOBIN_PTDEF_HASPAGESTYLE = 0x00200000; -const sal_uInt32 OOBIN_PTDEF_HASPIVOTTABLESTYLE = 0x00400000; -const sal_uInt32 OOBIN_PTDEF_HASVACATEDSTYLE = 0x00800000; -const sal_uInt32 OOBIN_PTDEF_HASTAG = 0x40000000; - -const sal_uInt32 OOBIN_PTDEF_NOERRORCAPTION = 0x00000040; -const sal_uInt32 OOBIN_PTDEF_NOMISSINGCAPTION = 0x00000080; -const sal_uInt32 OOBIN_PTDEF_HASROWHEADERCAPTION = 0x00000400; -const sal_uInt32 OOBIN_PTDEF_HASCOLHEADERCAPTION = 0x00000800; -const sal_uInt32 OOBIN_PTDEF_FIELDLISTSORTASC = 0x00001000; -const sal_uInt32 OOBIN_PTDEF_NOCUSTOMLISTSORT = 0x00004000; - -const sal_uInt8 OOBIN_PTDEF_ROWAXIS = 1; -const sal_uInt8 OOBIN_PTDEF_COLAXIS = 2; +const sal_uInt32 BIFF12_PTFIELD_DATAFIELD = 0x00000008; +const sal_uInt32 BIFF12_PTFIELD_DEFAULT = 0x00000100; +const sal_uInt32 BIFF12_PTFIELD_SUM = 0x00000200; +const sal_uInt32 BIFF12_PTFIELD_COUNTA = 0x00000400; +const sal_uInt32 BIFF12_PTFIELD_AVERAGE = 0x00000800; +const sal_uInt32 BIFF12_PTFIELD_MAX = 0x00001000; +const sal_uInt32 BIFF12_PTFIELD_MIN = 0x00002000; +const sal_uInt32 BIFF12_PTFIELD_PRODUCT = 0x00004000; +const sal_uInt32 BIFF12_PTFIELD_COUNT = 0x00008000; +const sal_uInt32 BIFF12_PTFIELD_STDDEV = 0x00010000; +const sal_uInt32 BIFF12_PTFIELD_STDDEVP = 0x00020000; +const sal_uInt32 BIFF12_PTFIELD_VAR = 0x00040000; +const sal_uInt32 BIFF12_PTFIELD_VARP = 0x00080000; + +const sal_uInt32 BIFF12_PTFIELD_SHOWALL = 0x00000020; +const sal_uInt32 BIFF12_PTFIELD_OUTLINE = 0x00000040; +const sal_uInt32 BIFF12_PTFIELD_INSERTBLANKROW = 0x00000080; +const sal_uInt32 BIFF12_PTFIELD_SUBTOTALTOP = 0x00000100; +const sal_uInt32 BIFF12_PTFIELD_INSERTPAGEBREAK = 0x00000800; +const sal_uInt32 BIFF12_PTFIELD_AUTOSORT = 0x00001000; +const sal_uInt32 BIFF12_PTFIELD_SORTASCENDING = 0x00002000; +const sal_uInt32 BIFF12_PTFIELD_AUTOSHOW = 0x00004000; +const sal_uInt32 BIFF12_PTFIELD_AUTOSHOWTOP = 0x00008000; +const sal_uInt32 BIFF12_PTFIELD_MULTIPAGEITEMS = 0x00080000; + +const sal_uInt16 BIFF12_PTFITEM_HIDDEN = 0x0001; +const sal_uInt16 BIFF12_PTFITEM_HIDEDETAILS = 0x0002; + +const sal_uInt8 BIFF12_PTPAGEFIELD_HASNAME = 0x01; +const sal_uInt8 BIFF12_PTPAGEFIELD_HASOLAPCAPTION = 0x02; +const sal_Int32 BIFF12_PTPAGEFIELD_MULTIITEMS = 0x001000FE; + +const sal_uInt16 BIFF12_PTFILTER_HASNAME = 0x0001; +const sal_uInt16 BIFF12_PTFILTER_HASDESCRIPTION = 0x0002; +const sal_uInt16 BIFF12_PTFILTER_HASSTRVALUE1 = 0x0004; +const sal_uInt16 BIFF12_PTFILTER_HASSTRVALUE2 = 0x0008; + +const sal_uInt8 BIFF12_TOP10FILTER_TOP = 0x01; +const sal_uInt8 BIFF12_TOP10FILTER_PERCENT = 0x02; + +const sal_uInt32 BIFF12_PTDEF_SHOWITEMS = 0x00000100; +const sal_uInt32 BIFF12_PTDEF_DISABLEFIELDLIST = 0x00000400; +const sal_uInt32 BIFF12_PTDEF_HIDECALCMEMBERS = 0x00001000; +const sal_uInt32 BIFF12_PTDEF_WITHHIDDENTOTALS = 0x00002000; +const sal_uInt32 BIFF12_PTDEF_HIDEDRILL = 0x00100000; +const sal_uInt32 BIFF12_PTDEF_PRINTDRILL = 0x00200000; +const sal_uInt32 BIFF12_PTDEF_HIDEHEADERS = 0x80000000; + +const sal_uInt32 BIFF12_PTDEF_SHOWEMPTYROW = 0x00000004; +const sal_uInt32 BIFF12_PTDEF_SHOWEMPTYCOL = 0x00000008; +const sal_uInt32 BIFF12_PTDEF_ENABLEDRILL = 0x00000020; +const sal_uInt32 BIFF12_PTDEF_PRESERVEFORMATTING = 0x00000080; +const sal_uInt32 BIFF12_PTDEF_USEAUTOFORMAT = 0x00000100; +const sal_uInt32 BIFF12_PTDEF_SHOWERROR = 0x00000200; +const sal_uInt32 BIFF12_PTDEF_SHOWMISSING = 0x00000400; +const sal_uInt32 BIFF12_PTDEF_PAGEOVERTHENDOWN = 0x00000800; +const sal_uInt32 BIFF12_PTDEF_SUBTOTALHIDDENITEMS = 0x00001000; +const sal_uInt32 BIFF12_PTDEF_ROWGRANDTOTALS = 0x00002000; +const sal_uInt32 BIFF12_PTDEF_COLGRANDTOTALS = 0x00004000; +const sal_uInt32 BIFF12_PTDEF_FIELDPRINTTITLES = 0x00008000; +const sal_uInt32 BIFF12_PTDEF_ITEMPRINTTITLES = 0x00020000; +const sal_uInt32 BIFF12_PTDEF_MERGEITEM = 0x00040000; +const sal_uInt32 BIFF12_PTDEF_HASDATACAPTION = 0x00080000; +const sal_uInt32 BIFF12_PTDEF_HASGRANDTOTALCAPTION = 0x00100000; +const sal_uInt32 BIFF12_PTDEF_HASPAGESTYLE = 0x00200000; +const sal_uInt32 BIFF12_PTDEF_HASPIVOTTABLESTYLE = 0x00400000; +const sal_uInt32 BIFF12_PTDEF_HASVACATEDSTYLE = 0x00800000; +const sal_uInt32 BIFF12_PTDEF_APPLYNUMFMT = 0x01000000; +const sal_uInt32 BIFF12_PTDEF_APPLYFONT = 0x02000000; +const sal_uInt32 BIFF12_PTDEF_APPLYALIGNMENT = 0x04000000; +const sal_uInt32 BIFF12_PTDEF_APPLYBORDER = 0x08000000; +const sal_uInt32 BIFF12_PTDEF_APPLYFILL = 0x10000000; +const sal_uInt32 BIFF12_PTDEF_APPLYPROTECTION = 0x20000000; +const sal_uInt32 BIFF12_PTDEF_HASTAG = 0x40000000; + +const sal_uInt32 BIFF12_PTDEF_NOERRORCAPTION = 0x00000040; +const sal_uInt32 BIFF12_PTDEF_NOMISSINGCAPTION = 0x00000080; +const sal_uInt32 BIFF12_PTDEF_HASROWHEADERCAPTION = 0x00000400; +const sal_uInt32 BIFF12_PTDEF_HASCOLHEADERCAPTION = 0x00000800; +const sal_uInt32 BIFF12_PTDEF_FIELDLISTSORTASC = 0x00001000; +const sal_uInt32 BIFF12_PTDEF_NOCUSTOMLISTSORT = 0x00004000; + +const sal_uInt8 BIFF12_PTDEF_ROWAXIS = 1; +const sal_uInt8 BIFF12_PTDEF_COLAXIS = 2; // ---------------------------------------------------------------------------- @@ -233,7 +230,7 @@ PTFieldItemModel::PTFieldItemModel() : { } -void PTFieldItemModel::setBinType( sal_uInt16 nType ) +void PTFieldItemModel::setBiffType( sal_uInt16 nType ) { static const sal_Int32 spnTypes[] = { XML_data, XML_default, XML_sum, XML_countA, XML_avg, XML_max, XML_min, XML_product, XML_count, @@ -275,7 +272,7 @@ PTFieldModel::PTFieldModel() : { } -void PTFieldModel::setBinAxis( sal_uInt8 nAxis ) +void PTFieldModel::setBiffAxis( sal_uInt8 nAxis ) { /* Weird. The axis field is organized as bit field, but only one of the row/col/page flags are allowed at the same time and refer to the values @@ -293,7 +290,7 @@ void PTFieldModel::setBinAxis( sal_uInt8 nAxis ) PTPageFieldModel::PTPageFieldModel() : mnField( -1 ), - mnItem( OOBIN_PTPAGEFIELD_MULTIITEMS ) + mnItem( BIFF12_PTPAGEFIELD_MULTIITEMS ) { } @@ -309,13 +306,13 @@ PTDataFieldModel::PTDataFieldModel() : { } -void PTDataFieldModel::setBinSubtotal( sal_Int32 nSubtotal ) +void PTDataFieldModel::setBiffSubtotal( sal_Int32 nSubtotal ) { static sal_Int32 spnSubtotals[] = { XML_sum, XML_count, XML_average, XML_max, XML_min, XML_product, XML_countNums, XML_stdDev, XML_stdDevp, XML_var, XML_varp }; mnSubtotal = STATIC_ARRAY_SELECT( spnSubtotals, nSubtotal, XML_TOKEN_INVALID ); } -void PTDataFieldModel::setBinShowDataAs( sal_Int32 nShowDataAs ) +void PTDataFieldModel::setBiffShowDataAs( sal_Int32 nShowDataAs ) { static sal_Int32 spnShowDataAs[] = { XML_normal, XML_difference, XML_percent, XML_percentDiff, XML_runTotal, XML_percentOfRow, XML_percentOfCol, XML_percentOfTotal, XML_index }; mnShowDataAs = STATIC_ARRAY_SELECT( spnShowDataAs, nShowDataAs, XML_TOKEN_INVALID ); @@ -386,60 +383,60 @@ void PivotTableField::importReferenceItem( const AttributeList& rAttribs ) maModel.mnSortRefItem = rAttribs.getInteger( XML_v, -1 ); } -void PivotTableField::importPTField( RecordInputStream& rStrm ) +void PivotTableField::importPTField( SequenceInputStream& rStrm ) { sal_uInt32 nFlags1, nFlags2; rStrm >> nFlags1 >> maModel.mnNumFmtId >> nFlags2 >> maModel.mnAutoShowItems >> maModel.mnAutoShowRankBy; - maModel.setBinAxis( extractValue< sal_uInt8 >( nFlags1, 0, 3 ) ); - maModel.mbDataField = getFlag( nFlags1, OOBIN_PTFIELD_DATAFIELD ); - maModel.mbDefaultSubtotal = getFlag( nFlags1, OOBIN_PTFIELD_DEFAULT ); - maModel.mbSumSubtotal = getFlag( nFlags1, OOBIN_PTFIELD_SUM ); - maModel.mbCountASubtotal = getFlag( nFlags1, OOBIN_PTFIELD_COUNTA ); - maModel.mbAverageSubtotal = getFlag( nFlags1, OOBIN_PTFIELD_AVERAGE ); - maModel.mbMaxSubtotal = getFlag( nFlags1, OOBIN_PTFIELD_MAX ); - maModel.mbMinSubtotal = getFlag( nFlags1, OOBIN_PTFIELD_MIN ); - maModel.mbProductSubtotal = getFlag( nFlags1, OOBIN_PTFIELD_PRODUCT ); - maModel.mbCountSubtotal = getFlag( nFlags1, OOBIN_PTFIELD_COUNT ); - maModel.mbStdDevSubtotal = getFlag( nFlags1, OOBIN_PTFIELD_STDDEV ); - maModel.mbStdDevPSubtotal = getFlag( nFlags1, OOBIN_PTFIELD_STDDEVP ); - maModel.mbVarSubtotal = getFlag( nFlags1, OOBIN_PTFIELD_VAR ); - maModel.mbVarPSubtotal = getFlag( nFlags1, OOBIN_PTFIELD_VARP ); - - maModel.mbShowAll = getFlag( nFlags2, OOBIN_PTFIELD_SHOWALL ); - maModel.mbOutline = getFlag( nFlags2, OOBIN_PTFIELD_OUTLINE ); - maModel.mbSubtotalTop = getFlag( nFlags2, OOBIN_PTFIELD_SUBTOTALTOP ); - maModel.mbInsertBlankRow = getFlag( nFlags2, OOBIN_PTFIELD_INSERTBLANKROW ); - maModel.mbInsertPageBreak = getFlag( nFlags2, OOBIN_PTFIELD_INSERTPAGEBREAK ); - maModel.mbAutoShow = getFlag( nFlags2, OOBIN_PTFIELD_AUTOSHOW ); - maModel.mbTopAutoShow = getFlag( nFlags2, OOBIN_PTFIELD_AUTOSHOWTOP ); - maModel.mbMultiPageItems = getFlag( nFlags2, OOBIN_PTFIELD_MULTIPAGEITEMS ); - - bool bAutoSort = getFlag( nFlags2, OOBIN_PTFIELD_AUTOSORT ); - bool bAscending = getFlag( nFlags2, OOBIN_PTFIELD_SORTASCENDING ); + maModel.setBiffAxis( extractValue< sal_uInt8 >( nFlags1, 0, 3 ) ); + maModel.mbDataField = getFlag( nFlags1, BIFF12_PTFIELD_DATAFIELD ); + maModel.mbDefaultSubtotal = getFlag( nFlags1, BIFF12_PTFIELD_DEFAULT ); + maModel.mbSumSubtotal = getFlag( nFlags1, BIFF12_PTFIELD_SUM ); + maModel.mbCountASubtotal = getFlag( nFlags1, BIFF12_PTFIELD_COUNTA ); + maModel.mbAverageSubtotal = getFlag( nFlags1, BIFF12_PTFIELD_AVERAGE ); + maModel.mbMaxSubtotal = getFlag( nFlags1, BIFF12_PTFIELD_MAX ); + maModel.mbMinSubtotal = getFlag( nFlags1, BIFF12_PTFIELD_MIN ); + maModel.mbProductSubtotal = getFlag( nFlags1, BIFF12_PTFIELD_PRODUCT ); + maModel.mbCountSubtotal = getFlag( nFlags1, BIFF12_PTFIELD_COUNT ); + maModel.mbStdDevSubtotal = getFlag( nFlags1, BIFF12_PTFIELD_STDDEV ); + maModel.mbStdDevPSubtotal = getFlag( nFlags1, BIFF12_PTFIELD_STDDEVP ); + maModel.mbVarSubtotal = getFlag( nFlags1, BIFF12_PTFIELD_VAR ); + maModel.mbVarPSubtotal = getFlag( nFlags1, BIFF12_PTFIELD_VARP ); + + maModel.mbShowAll = getFlag( nFlags2, BIFF12_PTFIELD_SHOWALL ); + maModel.mbOutline = getFlag( nFlags2, BIFF12_PTFIELD_OUTLINE ); + maModel.mbSubtotalTop = getFlag( nFlags2, BIFF12_PTFIELD_SUBTOTALTOP ); + maModel.mbInsertBlankRow = getFlag( nFlags2, BIFF12_PTFIELD_INSERTBLANKROW ); + maModel.mbInsertPageBreak = getFlag( nFlags2, BIFF12_PTFIELD_INSERTPAGEBREAK ); + maModel.mbAutoShow = getFlag( nFlags2, BIFF12_PTFIELD_AUTOSHOW ); + maModel.mbTopAutoShow = getFlag( nFlags2, BIFF12_PTFIELD_AUTOSHOWTOP ); + maModel.mbMultiPageItems = getFlag( nFlags2, BIFF12_PTFIELD_MULTIPAGEITEMS ); + + bool bAutoSort = getFlag( nFlags2, BIFF12_PTFIELD_AUTOSORT ); + bool bAscending = getFlag( nFlags2, BIFF12_PTFIELD_SORTASCENDING ); maModel.mnSortType = bAutoSort ? (bAscending ? XML_ascending : XML_descending) : XML_manual; } -void PivotTableField::importPTFItem( RecordInputStream& rStrm ) +void PivotTableField::importPTFItem( SequenceInputStream& rStrm ) { PTFieldItemModel aModel; sal_uInt8 nType; sal_uInt16 nFlags; rStrm >> nType >> nFlags >> aModel.mnCacheItem; - aModel.setBinType( nType ); - aModel.mbShowDetails = !getFlag( nFlags, OOBIN_PTFITEM_HIDEDETAILS ); - aModel.mbHidden = getFlag( nFlags, OOBIN_PTFITEM_HIDDEN ); + aModel.setBiffType( nType ); + aModel.mbShowDetails = !getFlag( nFlags, BIFF12_PTFITEM_HIDEDETAILS ); + aModel.mbHidden = getFlag( nFlags, BIFF12_PTFITEM_HIDDEN ); maItems.push_back( aModel ); } -void PivotTableField::importPTReference( RecordInputStream& rStrm ) +void PivotTableField::importPTReference( SequenceInputStream& rStrm ) { rStrm >> maModel.mnSortRefField; } -void PivotTableField::importPTReferenceItem( RecordInputStream& rStrm ) +void PivotTableField::importPTReferenceItem( SequenceInputStream& rStrm ) { rStrm >> maModel.mnSortRefItem; } @@ -450,7 +447,7 @@ void PivotTableField::importPTField( BiffInputStream& rStrm ) rStrm >> nAxis >> nSubtCount >> nSubtotals; rStrm.skip( 2 ); // item count - maModel.setBinAxis( extractValue< sal_uInt8 >( nAxis, 0, 3 ) ); + maModel.setBiffAxis( extractValue< sal_uInt8 >( nAxis, 0, 3 ) ); maModel.mbDataField = getFlag( nAxis, BIFF_PTFIELD_DATAFIELD ); maModel.mbDefaultSubtotal = getFlag( nSubtotals, BIFF_PTFIELD_DEFAULT ); @@ -509,7 +506,7 @@ void PivotTableField::importPTFItem( BiffInputStream& rStrm ) sal_Int16 nCacheItem; rStrm >> nType >> nFlags >> nCacheItem; - aModel.setBinType( nType ); + aModel.setBiffType( nType ); aModel.mnCacheItem = nCacheItem; aModel.mbShowDetails = !getFlag( nFlags, BIFF_PTFITEM_HIDEDETAILS ); aModel.mbHidden = getFlag( nFlags, BIFF_PTFITEM_HIDDEN ); @@ -627,7 +624,7 @@ void PivotTableField::convertPageField( const PTPageFieldModel& rPageField ) if( maModel.mbMultiPageItems ) { // multiple items may be selected - OSL_ENSURE( rPageField.mnItem == OOBIN_PTPAGEFIELD_MULTIITEMS, "PivotTableField::convertPageField - unexpected cache item index" ); + OSL_ENSURE( rPageField.mnItem == BIFF12_PTPAGEFIELD_MULTIITEMS, "PivotTableField::convertPageField - unexpected cache item index" ); // try to find a single visible item bool bHasMultiItems = false; for( ItemModelVector::iterator aIt = maItems.begin(), aEnd = maItems.end(); (aIt != aEnd) && !bHasMultiItems; ++aIt ) @@ -799,7 +796,7 @@ Reference< XDataPilotField > PivotTableField::convertRowColPageField( sal_Int32 aPropSet.setProperty( PROP_LayoutInfo, aLayoutInfo ); aPropSet.setProperty( PROP_ShowEmpty, maModel.mbShowAll ); - // auto show (OOXML3/OOBIN3 only) + // auto show (OOXML/BIFF12 only) if( maModel.mbAutoShow ) { DataPilotFieldAutoShowInfo aAutoShowInfo; @@ -909,20 +906,20 @@ void PivotTableFilter::importTop10( const AttributeList& rAttribs ) maModel.mbTopFilter = rAttribs.getBool( XML_top, true ); } -void PivotTableFilter::importPTFilter( RecordInputStream& rStrm ) +void PivotTableFilter::importPTFilter( SequenceInputStream& rStrm ) { sal_Int32 nType; sal_uInt16 nFlags; rStrm >> maModel.mnField >> maModel.mnMemPropField >> nType; rStrm.skip( 4 ); // unused rStrm >> maModel.mnId >> maModel.mnMeasureField >> maModel.mnMeasureHier >> nFlags; - if( getFlag( nFlags, OOBIN_PTFILTER_HASNAME ) ) + if( getFlag( nFlags, BIFF12_PTFILTER_HASNAME ) ) rStrm >> maModel.maName; - if( getFlag( nFlags, OOBIN_PTFILTER_HASDESCRIPTION ) ) + if( getFlag( nFlags, BIFF12_PTFILTER_HASDESCRIPTION ) ) rStrm >> maModel.maDescription; - if( getFlag( nFlags, OOBIN_PTFILTER_HASSTRVALUE1 ) ) + if( getFlag( nFlags, BIFF12_PTFILTER_HASSTRVALUE1 ) ) rStrm >> maModel.maStrValue1; - if( getFlag( nFlags, OOBIN_PTFILTER_HASSTRVALUE2 ) ) + if( getFlag( nFlags, BIFF12_PTFILTER_HASSTRVALUE2 ) ) rStrm >> maModel.maStrValue2; static sal_Int32 spnTypes[] = @@ -949,14 +946,14 @@ void PivotTableFilter::importPTFilter( RecordInputStream& rStrm ) maModel.mnType = STATIC_ARRAY_SELECT( spnTypes, nType, XML_TOKEN_INVALID ); } -void PivotTableFilter::importTop10Filter( RecordInputStream& rStrm ) +void PivotTableFilter::importTop10Filter( SequenceInputStream& rStrm ) { sal_uInt8 nFlags; rStrm >> nFlags >> maModel.mfValue; - OSL_ENSURE( getFlag( nFlags, OOBIN_TOP10FILTER_PERCENT ) == (maModel.mnType == XML_percent), + OSL_ENSURE( getFlag( nFlags, BIFF12_TOP10FILTER_PERCENT ) == (maModel.mnType == XML_percent), "PivotTableFilter::importTop10 - unexpected value of percent attribute" ); - maModel.mbTopFilter = getFlag( nFlags, OOBIN_TOP10FILTER_TOP ); + maModel.mbTopFilter = getFlag( nFlags, BIFF12_TOP10FILTER_TOP ); } void PivotTableFilter::finalizeImport() @@ -1000,6 +997,7 @@ PTDefinitionModel::PTDefinitionModel() : mbPrintDrill( false ), mbEnableDrill( true ), mbPreserveFormatting( true ), + mbUseAutoFormat( false ), mbPageOverThenDown( false ), mbSubtotalHiddenItems( false ), mbRowGrandTotals( true ), @@ -1053,6 +1051,7 @@ void PivotTable::importPivotTableDefinition( const AttributeList& rAttribs ) maDefModel.mnPageWrap = rAttribs.getInteger( XML_pageWrap, 0 ); maDefModel.mnIndent = rAttribs.getInteger( XML_indent, 1 ); maDefModel.mnChartFormat = rAttribs.getInteger( XML_chartFormat, 0 ); + maDefModel.mnAutoFormatId = rAttribs.getInteger( XML_autoFormatId, 0 ); maDefModel.mbDataOnRows = rAttribs.getBool( XML_dataOnRows, false ); maDefModel.mbShowError = rAttribs.getBool( XML_showError, false ); maDefModel.mbShowMissing = rAttribs.getBool( XML_showMissing, true ); @@ -1064,6 +1063,7 @@ void PivotTable::importPivotTableDefinition( const AttributeList& rAttribs ) maDefModel.mbPrintDrill = rAttribs.getBool( XML_printDrill, false ); maDefModel.mbEnableDrill = rAttribs.getBool( XML_enableDrill, true ); maDefModel.mbPreserveFormatting = rAttribs.getBool( XML_preserveFormatting, true ); + maDefModel.mbUseAutoFormat = rAttribs.getBool( XML_useAutoFormatting, false ); maDefModel.mbPageOverThenDown = rAttribs.getBool( XML_pageOverThenDown, false ); maDefModel.mbSubtotalHiddenItems = rAttribs.getBool( XML_subtotalHiddenItems, false ); maDefModel.mbRowGrandTotals = rAttribs.getBool( XML_rowGrandTotals, true ); @@ -1076,6 +1076,13 @@ void PivotTable::importPivotTableDefinition( const AttributeList& rAttribs ) maDefModel.mbShowHeaders = rAttribs.getBool( XML_showHeaders, true ); maDefModel.mbFieldListSortAsc = rAttribs.getBool( XML_fieldListSortAscending, false ); maDefModel.mbCustomListSort = rAttribs.getBool( XML_customListSort, true ); + maDefModel.mbApplyNumFmt = rAttribs.getBool( XML_applyNumberFormats, false ); + maDefModel.mbApplyFont = rAttribs.getBool( XML_applyFontFormats, false ); + maDefModel.mbApplyAlignment = rAttribs.getBool( XML_applyAlignmentFormats, false ); + maDefModel.mbApplyBorder = rAttribs.getBool( XML_applyBorderFormats, false ); + maDefModel.mbApplyFill = rAttribs.getBool( XML_applyPatternFormats, false ); + // OOXML and BIFF12 documentation differ: OOXML mentions width/height, BIFF12 mentions protection + maDefModel.mbApplyProtection = rAttribs.getBool( XML_applyWidthHeightFormats, false ); } void PivotTable::importLocation( const AttributeList& rAttribs, sal_Int16 nSheet ) @@ -1104,7 +1111,7 @@ void PivotTable::importPageField( const AttributeList& rAttribs ) aModel.maName = rAttribs.getXString( XML_name, OUString() ); aModel.mnField = rAttribs.getInteger( XML_fld, -1 ); // specification is wrong, XML_item is not the cache item, but the field item - aModel.mnItem = rAttribs.getInteger( XML_item, OOBIN_PTPAGEFIELD_MULTIITEMS ); + aModel.mnItem = rAttribs.getInteger( XML_item, BIFF12_PTPAGEFIELD_MULTIITEMS ); maPageFields.push_back( aModel ); } @@ -1121,7 +1128,7 @@ void PivotTable::importDataField( const AttributeList& rAttribs ) maDataFields.push_back( aModel ); } -void PivotTable::importPTDefinition( RecordInputStream& rStrm ) +void PivotTable::importPTDefinition( SequenceInputStream& rStrm ) { sal_uInt32 nFlags1, nFlags2, nFlags3; sal_uInt8 nDataAxis; @@ -1129,59 +1136,67 @@ void PivotTable::importPTDefinition( RecordInputStream& rStrm ) maDefModel.mnPageWrap = rStrm.readuInt8(); rStrm.skip( 2 ); // refresh versions rStrm >> maDefModel.mnDataPosition; - rStrm.skip( 4 ); // 2 bytes autoformat id, 2 bytes unused + maDefModel.mnAutoFormatId = rStrm.readuInt16(); + rStrm.skip( 2 ); // unused rStrm >> maDefModel.mnChartFormat >> maDefModel.mnCacheId >> maDefModel.maName; - if( getFlag( nFlags2, OOBIN_PTDEF_HASDATACAPTION ) ) + if( getFlag( nFlags2, BIFF12_PTDEF_HASDATACAPTION ) ) rStrm >> maDefModel.maDataCaption; - if( getFlag( nFlags2, OOBIN_PTDEF_HASGRANDTOTALCAPTION ) ) + if( getFlag( nFlags2, BIFF12_PTDEF_HASGRANDTOTALCAPTION ) ) rStrm >> maDefModel.maGrandTotalCaption; - if( !getFlag( nFlags3, OOBIN_PTDEF_NOERRORCAPTION ) ) // missing flag indicates existing string + if( !getFlag( nFlags3, BIFF12_PTDEF_NOERRORCAPTION ) ) // missing flag indicates existing string rStrm >> maDefModel.maErrorCaption; - if( !getFlag( nFlags3, OOBIN_PTDEF_NOMISSINGCAPTION ) ) // missing flag indicates existing string + if( !getFlag( nFlags3, BIFF12_PTDEF_NOMISSINGCAPTION ) ) // missing flag indicates existing string rStrm >> maDefModel.maMissingCaption; - if( getFlag( nFlags2, OOBIN_PTDEF_HASPAGESTYLE ) ) + if( getFlag( nFlags2, BIFF12_PTDEF_HASPAGESTYLE ) ) rStrm >> maDefModel.maPageStyle; - if( getFlag( nFlags2, OOBIN_PTDEF_HASPIVOTTABLESTYLE ) ) + if( getFlag( nFlags2, BIFF12_PTDEF_HASPIVOTTABLESTYLE ) ) rStrm >> maDefModel.maPivotTableStyle; - if( getFlag( nFlags2, OOBIN_PTDEF_HASVACATEDSTYLE ) ) + if( getFlag( nFlags2, BIFF12_PTDEF_HASVACATEDSTYLE ) ) rStrm >> maDefModel.maVacatedStyle; - if( getFlag( nFlags2, OOBIN_PTDEF_HASTAG ) ) + if( getFlag( nFlags2, BIFF12_PTDEF_HASTAG ) ) rStrm >> maDefModel.maTag; - if( getFlag( nFlags3, OOBIN_PTDEF_HASCOLHEADERCAPTION ) ) // TODO: right order (col/row)? spec is unclear + if( getFlag( nFlags3, BIFF12_PTDEF_HASCOLHEADERCAPTION ) ) // TODO: right order (col/row)? spec is unclear rStrm >> maDefModel.maColHeaderCaption; - if( getFlag( nFlags3, OOBIN_PTDEF_HASROWHEADERCAPTION ) ) + if( getFlag( nFlags3, BIFF12_PTDEF_HASROWHEADERCAPTION ) ) rStrm >> maDefModel.maRowHeaderCaption; - OSL_ENSURE( (nDataAxis == OOBIN_PTDEF_ROWAXIS) || (nDataAxis == OOBIN_PTDEF_COLAXIS), + OSL_ENSURE( (nDataAxis == BIFF12_PTDEF_ROWAXIS) || (nDataAxis == BIFF12_PTDEF_COLAXIS), "PivotTable::importPTDefinition - unexpected axis position for data field" ); maDefModel.mnIndent = extractValue< sal_uInt8 >( nFlags1, 24, 7 ); - maDefModel.mbDataOnRows = nDataAxis == OOBIN_PTDEF_ROWAXIS; - maDefModel.mbShowError = getFlag( nFlags2, OOBIN_PTDEF_SHOWERROR ); - maDefModel.mbShowMissing = getFlag( nFlags2, OOBIN_PTDEF_SHOWMISSING ); - maDefModel.mbShowItems = getFlag( nFlags1, OOBIN_PTDEF_SHOWITEMS ); - maDefModel.mbDisableFieldList = getFlag( nFlags1, OOBIN_PTDEF_DISABLEFIELDLIST ); - maDefModel.mbShowCalcMembers = !getFlag( nFlags1, OOBIN_PTDEF_HIDECALCMEMBERS ); - maDefModel.mbVisualTotals = !getFlag( nFlags1, OOBIN_PTDEF_WITHHIDDENTOTALS ); - maDefModel.mbShowDrill = !getFlag( nFlags1, OOBIN_PTDEF_HIDEDRILL ); - maDefModel.mbPrintDrill = getFlag( nFlags1, OOBIN_PTDEF_PRINTDRILL ); - maDefModel.mbEnableDrill = getFlag( nFlags2, OOBIN_PTDEF_ENABLEDRILL ); - maDefModel.mbPreserveFormatting = getFlag( nFlags2, OOBIN_PTDEF_PRESERVEFORMATTING ); - maDefModel.mbPageOverThenDown = getFlag( nFlags2, OOBIN_PTDEF_PAGEOVERTHENDOWN ); - maDefModel.mbSubtotalHiddenItems = getFlag( nFlags2, OOBIN_PTDEF_SUBTOTALHIDDENITEMS ); - maDefModel.mbRowGrandTotals = getFlag( nFlags2, OOBIN_PTDEF_ROWGRANDTOTALS ); - maDefModel.mbColGrandTotals = getFlag( nFlags2, OOBIN_PTDEF_COLGRANDTOTALS ); - maDefModel.mbFieldPrintTitles = getFlag( nFlags2, OOBIN_PTDEF_FIELDPRINTTITLES ); - maDefModel.mbItemPrintTitles = getFlag( nFlags2, OOBIN_PTDEF_ITEMPRINTTITLES ); - maDefModel.mbMergeItem = getFlag( nFlags2, OOBIN_PTDEF_MERGEITEM ); - maDefModel.mbShowEmptyRow = getFlag( nFlags2, OOBIN_PTDEF_SHOWEMPTYROW ); - maDefModel.mbShowEmptyCol = getFlag( nFlags2, OOBIN_PTDEF_SHOWEMPTYCOL ); - maDefModel.mbShowHeaders = !getFlag( nFlags1, OOBIN_PTDEF_HIDEHEADERS ); - maDefModel.mbFieldListSortAsc = getFlag( nFlags3, OOBIN_PTDEF_FIELDLISTSORTASC ); - maDefModel.mbCustomListSort = !getFlag( nFlags3, OOBIN_PTDEF_NOCUSTOMLISTSORT ); -} - -void PivotTable::importPTLocation( RecordInputStream& rStrm, sal_Int16 nSheet ) + maDefModel.mbDataOnRows = nDataAxis == BIFF12_PTDEF_ROWAXIS; + maDefModel.mbShowError = getFlag( nFlags2, BIFF12_PTDEF_SHOWERROR ); + maDefModel.mbShowMissing = getFlag( nFlags2, BIFF12_PTDEF_SHOWMISSING ); + maDefModel.mbShowItems = getFlag( nFlags1, BIFF12_PTDEF_SHOWITEMS ); + maDefModel.mbDisableFieldList = getFlag( nFlags1, BIFF12_PTDEF_DISABLEFIELDLIST ); + maDefModel.mbShowCalcMembers = !getFlag( nFlags1, BIFF12_PTDEF_HIDECALCMEMBERS ); + maDefModel.mbVisualTotals = !getFlag( nFlags1, BIFF12_PTDEF_WITHHIDDENTOTALS ); + maDefModel.mbShowDrill = !getFlag( nFlags1, BIFF12_PTDEF_HIDEDRILL ); + maDefModel.mbPrintDrill = getFlag( nFlags1, BIFF12_PTDEF_PRINTDRILL ); + maDefModel.mbEnableDrill = getFlag( nFlags2, BIFF12_PTDEF_ENABLEDRILL ); + maDefModel.mbPreserveFormatting = getFlag( nFlags2, BIFF12_PTDEF_PRESERVEFORMATTING ); + maDefModel.mbUseAutoFormat = getFlag( nFlags2, BIFF12_PTDEF_USEAUTOFORMAT ); + maDefModel.mbPageOverThenDown = getFlag( nFlags2, BIFF12_PTDEF_PAGEOVERTHENDOWN ); + maDefModel.mbSubtotalHiddenItems = getFlag( nFlags2, BIFF12_PTDEF_SUBTOTALHIDDENITEMS ); + maDefModel.mbRowGrandTotals = getFlag( nFlags2, BIFF12_PTDEF_ROWGRANDTOTALS ); + maDefModel.mbColGrandTotals = getFlag( nFlags2, BIFF12_PTDEF_COLGRANDTOTALS ); + maDefModel.mbFieldPrintTitles = getFlag( nFlags2, BIFF12_PTDEF_FIELDPRINTTITLES ); + maDefModel.mbItemPrintTitles = getFlag( nFlags2, BIFF12_PTDEF_ITEMPRINTTITLES ); + maDefModel.mbMergeItem = getFlag( nFlags2, BIFF12_PTDEF_MERGEITEM ); + maDefModel.mbApplyNumFmt = getFlag( nFlags2, BIFF12_PTDEF_APPLYNUMFMT ); + maDefModel.mbApplyFont = getFlag( nFlags2, BIFF12_PTDEF_APPLYFONT ); + maDefModel.mbApplyAlignment = getFlag( nFlags2, BIFF12_PTDEF_APPLYALIGNMENT ); + maDefModel.mbApplyBorder = getFlag( nFlags2, BIFF12_PTDEF_APPLYBORDER ); + maDefModel.mbApplyFill = getFlag( nFlags2, BIFF12_PTDEF_APPLYFILL ); + maDefModel.mbApplyProtection = getFlag( nFlags2, BIFF12_PTDEF_APPLYPROTECTION ); + maDefModel.mbShowEmptyRow = getFlag( nFlags2, BIFF12_PTDEF_SHOWEMPTYROW ); + maDefModel.mbShowEmptyCol = getFlag( nFlags2, BIFF12_PTDEF_SHOWEMPTYCOL ); + maDefModel.mbShowHeaders = !getFlag( nFlags1, BIFF12_PTDEF_HIDEHEADERS ); + maDefModel.mbFieldListSortAsc = getFlag( nFlags3, BIFF12_PTDEF_FIELDLISTSORTASC ); + maDefModel.mbCustomListSort = !getFlag( nFlags3, BIFF12_PTDEF_NOCUSTOMLISTSORT ); +} + +void PivotTable::importPTLocation( SequenceInputStream& rStrm, sal_Int16 nSheet ) { BinRange aBinRange; rStrm >> aBinRange >> maLocationModel.mnFirstHeaderRow @@ -1190,29 +1205,29 @@ void PivotTable::importPTLocation( RecordInputStream& rStrm, sal_Int16 nSheet ) getAddressConverter().convertToCellRangeUnchecked( maLocationModel.maRange, aBinRange, nSheet ); } -void PivotTable::importPTRowFields( RecordInputStream& rStrm ) +void PivotTable::importPTRowFields( SequenceInputStream& rStrm ) { importFields( maRowFields, rStrm ); } -void PivotTable::importPTColFields( RecordInputStream& rStrm ) +void PivotTable::importPTColFields( SequenceInputStream& rStrm ) { importFields( maColFields, rStrm ); } -void PivotTable::importPTPageField( RecordInputStream& rStrm ) +void PivotTable::importPTPageField( SequenceInputStream& rStrm ) { PTPageFieldModel aModel; sal_uInt8 nFlags; rStrm >> aModel.mnField >> aModel.mnItem; rStrm.skip( 4 ); // hierarchy rStrm >> nFlags; - if( getFlag( nFlags, OOBIN_PTPAGEFIELD_HASNAME ) ) + if( getFlag( nFlags, BIFF12_PTPAGEFIELD_HASNAME ) ) rStrm >> aModel.maName; maPageFields.push_back( aModel ); } -void PivotTable::importPTDataField( RecordInputStream& rStrm ) +void PivotTable::importPTDataField( SequenceInputStream& rStrm ) { PTDataFieldModel aModel; sal_Int32 nSubtotal, nShowDataAs; @@ -1220,8 +1235,8 @@ void PivotTable::importPTDataField( RecordInputStream& rStrm ) rStrm >> aModel.mnField >> nSubtotal >> nShowDataAs >> aModel.mnBaseField >> aModel.mnBaseItem >> aModel.mnNumFmtId >> nHasName; if( nHasName == 1 ) rStrm >> aModel.maName; - aModel.setBinSubtotal( nSubtotal ); - aModel.setBinShowDataAs( nShowDataAs ); + aModel.setBiffSubtotal( nSubtotal ); + aModel.setBiffShowDataAs( nShowDataAs ); maDataFields.push_back( aModel ); } @@ -1297,7 +1312,7 @@ void PivotTable::importPTPageFields( BiffInputStream& rStrm ) rStrm >> nField >> nItem; rStrm.skip( 2 ); // dropdown object ID aModel.mnField = nField; - aModel.mnItem = (nItem == BIFF_PTPAGEFIELDS_ALLITEMS) ? OOBIN_PTPAGEFIELD_MULTIITEMS : nItem; + aModel.mnItem = (nItem == BIFF_PTPAGEFIELDS_ALLITEMS) ? BIFF12_PTPAGEFIELD_MULTIITEMS : nItem; maPageFields.push_back( aModel ); } } @@ -1311,8 +1326,8 @@ void PivotTable::importPTDataField( BiffInputStream& rStrm ) aModel.maName = lclReadPivotString( *this, rStrm, nNameLen ); aModel.mnField = nField; - aModel.setBinSubtotal( nSubtotal ); - aModel.setBinShowDataAs( nShowDataAs ); + aModel.setBiffSubtotal( nSubtotal ); + aModel.setBiffShowDataAs( nShowDataAs ); aModel.mnBaseField = nBaseField; switch( nBaseItem ) { @@ -1506,7 +1521,7 @@ void PivotTable::importField( IndexVector& orFields, const AttributeList& rAttri orFields.push_back( rAttribs.getInteger( XML_x, -1 ) ); } -void PivotTable::importFields( IndexVector& orFields, RecordInputStream& rStrm ) +void PivotTable::importFields( IndexVector& orFields, SequenceInputStream& rStrm ) { OSL_ENSURE( orFields.empty(), "PivotTable::importFields - multiple record instances" ); orFields.clear(); @@ -1550,4 +1565,3 @@ void PivotTableBuffer::finalizeImport() } // namespace xls } // namespace oox - diff --git a/oox/source/xls/pivottablefragment.cxx b/oox/source/xls/pivottablefragment.cxx index 9b34e1bda593..6e28118711c9 100644 --- a/oox/source/xls/pivottablefragment.cxx +++ b/oox/source/xls/pivottablefragment.cxx @@ -26,25 +26,28 @@ ************************************************************************/ #include "oox/xls/pivottablefragment.hxx" + #include "oox/xls/biffinputstream.hxx" #include "oox/xls/pivottablebuffer.hxx" -using ::rtl::OUString; -using ::oox::core::ContextHandlerRef; -using ::oox::core::RecordInfo; - namespace oox { namespace xls { // ============================================================================ -OoxPivotTableFieldContext::OoxPivotTableFieldContext( OoxWorksheetFragmentBase& rFragment, PivotTableField& rTableField ) : - OoxWorksheetContextBase( rFragment ), +using namespace ::oox::core; + +using ::rtl::OUString; + +// ============================================================================ + +PivotTableFieldContext::PivotTableFieldContext( WorksheetFragmentBase& rFragment, PivotTableField& rTableField ) : + WorksheetContextBase( rFragment ), mrTableField( rTableField ) { } -ContextHandlerRef OoxPivotTableFieldContext::onCreateContext( sal_Int32 nElement, const AttributeList& rAttribs ) +ContextHandlerRef PivotTableFieldContext::onCreateContext( sal_Int32 nElement, const AttributeList& rAttribs ) { switch( getCurrentElement() ) { @@ -74,43 +77,43 @@ ContextHandlerRef OoxPivotTableFieldContext::onCreateContext( sal_Int32 nElement return 0; } -void OoxPivotTableFieldContext::onStartElement( const AttributeList& rAttribs ) +void PivotTableFieldContext::onStartElement( const AttributeList& rAttribs ) { if( isRootElement() ) mrTableField.importPivotField( rAttribs ); } -ContextHandlerRef OoxPivotTableFieldContext::onCreateRecordContext( sal_Int32 nRecId, RecordInputStream& rStrm ) +ContextHandlerRef PivotTableFieldContext::onCreateRecordContext( sal_Int32 nRecId, SequenceInputStream& rStrm ) { switch( getCurrentElement() ) { - case OOBIN_ID_PTFIELD: + case BIFF12_ID_PTFIELD: switch( nRecId ) { - case OOBIN_ID_PTFITEMS: return this; - case OOBIN_ID_AUTOSORTSCOPE: return this; + case BIFF12_ID_PTFITEMS: return this; + case BIFF12_ID_AUTOSORTSCOPE: return this; } break; - case OOBIN_ID_PTFITEMS: - if( nRecId == OOBIN_ID_PTFITEM ) mrTableField.importPTFItem( rStrm ); + case BIFF12_ID_PTFITEMS: + if( nRecId == BIFF12_ID_PTFITEM ) mrTableField.importPTFItem( rStrm ); break; - case OOBIN_ID_AUTOSORTSCOPE: - if( nRecId == OOBIN_ID_PIVOTAREA ) return this; + case BIFF12_ID_AUTOSORTSCOPE: + if( nRecId == BIFF12_ID_PIVOTAREA ) return this; break; - case OOBIN_ID_PIVOTAREA: - if( nRecId == OOBIN_ID_PTREFERENCES ) return this; + case BIFF12_ID_PIVOTAREA: + if( nRecId == BIFF12_ID_PTREFERENCES ) return this; break; - case OOBIN_ID_PTREFERENCES: - if( nRecId == OOBIN_ID_PTREFERENCE ) { mrTableField.importPTReference( rStrm ); return this; } + case BIFF12_ID_PTREFERENCES: + if( nRecId == BIFF12_ID_PTREFERENCE ) { mrTableField.importPTReference( rStrm ); return this; } break; - case OOBIN_ID_PTREFERENCE: - if( nRecId == OOBIN_ID_PTREFERENCEITEM ) mrTableField.importPTReferenceItem( rStrm ); + case BIFF12_ID_PTREFERENCE: + if( nRecId == BIFF12_ID_PTREFERENCEITEM ) mrTableField.importPTReferenceItem( rStrm ); break; } return 0; } -void OoxPivotTableFieldContext::onStartRecord( RecordInputStream& rStrm ) +void PivotTableFieldContext::onStartRecord( SequenceInputStream& rStrm ) { if( isRootElement() ) mrTableField.importPTField( rStrm ); @@ -118,13 +121,13 @@ void OoxPivotTableFieldContext::onStartRecord( RecordInputStream& rStrm ) // ============================================================================ -OoxPivotTableFilterContext::OoxPivotTableFilterContext( OoxWorksheetFragmentBase& rFragment, PivotTableFilter& rTableFilter ) : - OoxWorksheetContextBase( rFragment ), +PivotTableFilterContext::PivotTableFilterContext( WorksheetFragmentBase& rFragment, PivotTableFilter& rTableFilter ) : + WorksheetContextBase( rFragment ), mrTableFilter( rTableFilter ) { } -ContextHandlerRef OoxPivotTableFilterContext::onCreateContext( sal_Int32 nElement, const AttributeList& rAttribs ) +ContextHandlerRef PivotTableFilterContext::onCreateContext( sal_Int32 nElement, const AttributeList& rAttribs ) { switch( getCurrentElement() ) { @@ -141,30 +144,30 @@ ContextHandlerRef OoxPivotTableFilterContext::onCreateContext( sal_Int32 nElemen return 0; } -void OoxPivotTableFilterContext::onStartElement( const AttributeList& rAttribs ) +void PivotTableFilterContext::onStartElement( const AttributeList& rAttribs ) { if( isRootElement() ) mrTableFilter.importFilter( rAttribs ); } -ContextHandlerRef OoxPivotTableFilterContext::onCreateRecordContext( sal_Int32 nRecId, RecordInputStream& rStrm ) +ContextHandlerRef PivotTableFilterContext::onCreateRecordContext( sal_Int32 nRecId, SequenceInputStream& rStrm ) { switch( getCurrentElement() ) { - case OOBIN_ID_PTFILTER: - if( nRecId == OOBIN_ID_AUTOFILTER ) return this; + case BIFF12_ID_PTFILTER: + if( nRecId == BIFF12_ID_AUTOFILTER ) return this; break; - case OOBIN_ID_AUTOFILTER: - if( nRecId == OOBIN_ID_FILTERCOLUMN ) return this; + case BIFF12_ID_AUTOFILTER: + if( nRecId == BIFF12_ID_FILTERCOLUMN ) return this; break; - case OOBIN_ID_FILTERCOLUMN: - if( nRecId == OOBIN_ID_TOP10FILTER ) mrTableFilter.importTop10Filter( rStrm ); + case BIFF12_ID_FILTERCOLUMN: + if( nRecId == BIFF12_ID_TOP10FILTER ) mrTableFilter.importTop10Filter( rStrm ); break; } return 0; } -void OoxPivotTableFilterContext::onStartRecord( RecordInputStream& rStrm ) +void PivotTableFilterContext::onStartRecord( SequenceInputStream& rStrm ) { if( isRootElement() ) mrTableFilter.importPTFilter( rStrm ); @@ -172,13 +175,13 @@ void OoxPivotTableFilterContext::onStartRecord( RecordInputStream& rStrm ) // ============================================================================ -OoxPivotTableFragment::OoxPivotTableFragment( const WorksheetHelper& rHelper, const OUString& rFragmentPath ) : - OoxWorksheetFragmentBase( rHelper, rFragmentPath ), - mrPivotTable( rHelper.getPivotTables().createPivotTable() ) +PivotTableFragment::PivotTableFragment( const WorksheetHelper& rHelper, const OUString& rFragmentPath ) : + WorksheetFragmentBase( rHelper, rFragmentPath ), + mrPivotTable( getPivotTables().createPivotTable() ) { } -ContextHandlerRef OoxPivotTableFragment::onCreateContext( sal_Int32 nElement, const AttributeList& rAttribs ) +ContextHandlerRef PivotTableFragment::onCreateContext( sal_Int32 nElement, const AttributeList& rAttribs ) { switch( getCurrentElement() ) { @@ -200,7 +203,7 @@ ContextHandlerRef OoxPivotTableFragment::onCreateContext( sal_Int32 nElement, co break; case XLS_TOKEN( pivotFields ): - if( nElement == XLS_TOKEN( pivotField ) ) return new OoxPivotTableFieldContext( *this, mrPivotTable.createTableField() ); + if( nElement == XLS_TOKEN( pivotField ) ) return new PivotTableFieldContext( *this, mrPivotTable.createTableField() ); break; case XLS_TOKEN( rowFields ): if( nElement == XLS_TOKEN( field ) ) mrPivotTable.importRowField( rAttribs ); @@ -215,75 +218,75 @@ ContextHandlerRef OoxPivotTableFragment::onCreateContext( sal_Int32 nElement, co if( nElement == XLS_TOKEN( dataField ) ) mrPivotTable.importDataField( rAttribs ); break; case XLS_TOKEN( filters ): - if( nElement == XLS_TOKEN( filter ) ) return new OoxPivotTableFilterContext( *this, mrPivotTable.createTableFilter() ); + if( nElement == XLS_TOKEN( filter ) ) return new PivotTableFilterContext( *this, mrPivotTable.createTableFilter() ); break; } return 0; } -ContextHandlerRef OoxPivotTableFragment::onCreateRecordContext( sal_Int32 nRecId, RecordInputStream& rStrm ) +ContextHandlerRef PivotTableFragment::onCreateRecordContext( sal_Int32 nRecId, SequenceInputStream& rStrm ) { switch( getCurrentElement() ) { case XML_ROOT_CONTEXT: - if( nRecId == OOBIN_ID_PTDEFINITION ) { mrPivotTable.importPTDefinition( rStrm ); return this; } + if( nRecId == BIFF12_ID_PTDEFINITION ) { mrPivotTable.importPTDefinition( rStrm ); return this; } break; - case OOBIN_ID_PTDEFINITION: + case BIFF12_ID_PTDEFINITION: switch( nRecId ) { - case OOBIN_ID_PTLOCATION: mrPivotTable.importPTLocation( rStrm, getSheetIndex() ); break; - case OOBIN_ID_PTFIELDS: return this; - case OOBIN_ID_PTROWFIELDS: mrPivotTable.importPTRowFields( rStrm ); break; - case OOBIN_ID_PTCOLFIELDS: mrPivotTable.importPTColFields( rStrm ); break; - case OOBIN_ID_PTPAGEFIELDS: return this; - case OOBIN_ID_PTDATAFIELDS: return this; - case OOBIN_ID_PTFILTERS: return this; + case BIFF12_ID_PTLOCATION: mrPivotTable.importPTLocation( rStrm, getSheetIndex() ); break; + case BIFF12_ID_PTFIELDS: return this; + case BIFF12_ID_PTROWFIELDS: mrPivotTable.importPTRowFields( rStrm ); break; + case BIFF12_ID_PTCOLFIELDS: mrPivotTable.importPTColFields( rStrm ); break; + case BIFF12_ID_PTPAGEFIELDS: return this; + case BIFF12_ID_PTDATAFIELDS: return this; + case BIFF12_ID_PTFILTERS: return this; } break; - case OOBIN_ID_PTFIELDS: - if( nRecId == OOBIN_ID_PTFIELD ) return new OoxPivotTableFieldContext( *this, mrPivotTable.createTableField() ); + case BIFF12_ID_PTFIELDS: + if( nRecId == BIFF12_ID_PTFIELD ) return new PivotTableFieldContext( *this, mrPivotTable.createTableField() ); break; - case OOBIN_ID_PTPAGEFIELDS: - if( nRecId == OOBIN_ID_PTPAGEFIELD ) mrPivotTable.importPTPageField( rStrm ); + case BIFF12_ID_PTPAGEFIELDS: + if( nRecId == BIFF12_ID_PTPAGEFIELD ) mrPivotTable.importPTPageField( rStrm ); break; - case OOBIN_ID_PTDATAFIELDS: - if( nRecId == OOBIN_ID_PTDATAFIELD ) mrPivotTable.importPTDataField( rStrm ); + case BIFF12_ID_PTDATAFIELDS: + if( nRecId == BIFF12_ID_PTDATAFIELD ) mrPivotTable.importPTDataField( rStrm ); break; - case OOBIN_ID_PTFILTERS: - if( nRecId == OOBIN_ID_PTFILTER ) return new OoxPivotTableFilterContext( *this, mrPivotTable.createTableFilter() ); + case BIFF12_ID_PTFILTERS: + if( nRecId == BIFF12_ID_PTFILTER ) return new PivotTableFilterContext( *this, mrPivotTable.createTableFilter() ); break; } return 0; } -const RecordInfo* OoxPivotTableFragment::getRecordInfos() const +const RecordInfo* PivotTableFragment::getRecordInfos() const { static const RecordInfo spRecInfos[] = { - { OOBIN_ID_AUTOFILTER, OOBIN_ID_AUTOFILTER + 1 }, - { OOBIN_ID_AUTOSORTSCOPE, OOBIN_ID_AUTOSORTSCOPE + 1 }, - { OOBIN_ID_FILTERCOLUMN, OOBIN_ID_FILTERCOLUMN + 1 }, - { OOBIN_ID_PIVOTAREA, OOBIN_ID_PIVOTAREA + 1 }, - { OOBIN_ID_PTCOLFIELDS, OOBIN_ID_PTCOLFIELDS + 1 }, - { OOBIN_ID_PTDATAFIELD, OOBIN_ID_PTDATAFIELD + 1 }, - { OOBIN_ID_PTDATAFIELDS, OOBIN_ID_PTDATAFIELDS + 1 }, - { OOBIN_ID_PTDEFINITION, OOBIN_ID_PTDEFINITION + 35 }, - { OOBIN_ID_PTFIELD, OOBIN_ID_PTFIELD + 1 }, - { OOBIN_ID_PTFIELDS, OOBIN_ID_PTFIELDS + 1 }, - { OOBIN_ID_PTFILTER, OOBIN_ID_PTFILTER + 1 }, - { OOBIN_ID_PTFILTERS, OOBIN_ID_PTFILTERS + 1 }, - { OOBIN_ID_PTFITEM, OOBIN_ID_PTFITEM - 1 }, - { OOBIN_ID_PTFITEMS, OOBIN_ID_PTFITEMS + 1 }, - { OOBIN_ID_PTLOCATION, OOBIN_ID_PTLOCATION - 1 }, - { OOBIN_ID_PTPAGEFIELD, OOBIN_ID_PTPAGEFIELD + 1 }, - { OOBIN_ID_PTPAGEFIELDS, OOBIN_ID_PTPAGEFIELDS + 1 }, - { OOBIN_ID_PTREFERENCE, OOBIN_ID_PTREFERENCE + 1 }, - { OOBIN_ID_PTREFERENCEITEM, OOBIN_ID_PTREFERENCEITEM + 1 }, - { OOBIN_ID_PTREFERENCES, OOBIN_ID_PTREFERENCES + 1 }, - { OOBIN_ID_PTROWFIELDS, OOBIN_ID_PTROWFIELDS + 1 }, - { -1, -1 } + { BIFF12_ID_AUTOFILTER, BIFF12_ID_AUTOFILTER + 1 }, + { BIFF12_ID_AUTOSORTSCOPE, BIFF12_ID_AUTOSORTSCOPE + 1 }, + { BIFF12_ID_FILTERCOLUMN, BIFF12_ID_FILTERCOLUMN + 1 }, + { BIFF12_ID_PIVOTAREA, BIFF12_ID_PIVOTAREA + 1 }, + { BIFF12_ID_PTCOLFIELDS, BIFF12_ID_PTCOLFIELDS + 1 }, + { BIFF12_ID_PTDATAFIELD, BIFF12_ID_PTDATAFIELD + 1 }, + { BIFF12_ID_PTDATAFIELDS, BIFF12_ID_PTDATAFIELDS + 1 }, + { BIFF12_ID_PTDEFINITION, BIFF12_ID_PTDEFINITION + 35 }, + { BIFF12_ID_PTFIELD, BIFF12_ID_PTFIELD + 1 }, + { BIFF12_ID_PTFIELDS, BIFF12_ID_PTFIELDS + 1 }, + { BIFF12_ID_PTFILTER, BIFF12_ID_PTFILTER + 1 }, + { BIFF12_ID_PTFILTERS, BIFF12_ID_PTFILTERS + 1 }, + { BIFF12_ID_PTFITEM, BIFF12_ID_PTFITEM - 1 }, + { BIFF12_ID_PTFITEMS, BIFF12_ID_PTFITEMS + 1 }, + { BIFF12_ID_PTLOCATION, BIFF12_ID_PTLOCATION - 1 }, + { BIFF12_ID_PTPAGEFIELD, BIFF12_ID_PTPAGEFIELD + 1 }, + { BIFF12_ID_PTPAGEFIELDS, BIFF12_ID_PTPAGEFIELDS + 1 }, + { BIFF12_ID_PTREFERENCE, BIFF12_ID_PTREFERENCE + 1 }, + { BIFF12_ID_PTREFERENCEITEM, BIFF12_ID_PTREFERENCEITEM + 1 }, + { BIFF12_ID_PTREFERENCES, BIFF12_ID_PTREFERENCES + 1 }, + { BIFF12_ID_PTROWFIELDS, BIFF12_ID_PTROWFIELDS + 1 }, + { -1, -1 } }; return spRecInfos; } @@ -291,22 +294,22 @@ const RecordInfo* OoxPivotTableFragment::getRecordInfos() const // ============================================================================ // ============================================================================ -BiffPivotTableContext::BiffPivotTableContext( const BiffWorksheetFragmentBase& rFragment, PivotTable& rPivotTable ) : - BiffWorksheetContextBase( rFragment ), - mrPivotTable( rPivotTable ) +BiffPivotTableContext::BiffPivotTableContext( const WorksheetHelper& rHelper ) : + BiffWorksheetContextBase( rHelper ), + mrPivotTable( getPivotTables().createPivotTable() ) { } -void BiffPivotTableContext::importRecord() +void BiffPivotTableContext::importRecord( BiffInputStream& rStrm ) { - switch( mrStrm.getRecId() ) + switch( rStrm.getRecId() ) { - case BIFF_ID_PTDEFINITION: mrPivotTable.importPTDefinition( mrStrm, getSheetIndex() ); break; - case BIFF_ID_PTDEFINITION2: mrPivotTable.importPTDefinition2( mrStrm ); break; - case BIFF_ID_PTFIELD: mrPivotTable.createTableField().importPTField( mrStrm ); break; - case BIFF_ID_PTROWCOLFIELDS: mrPivotTable.importPTRowColFields( mrStrm ); break; - case BIFF_ID_PTPAGEFIELDS: mrPivotTable.importPTPageFields( mrStrm ); break; - case BIFF_ID_PTDATAFIELD: mrPivotTable.importPTDataField( mrStrm ); break; + case BIFF_ID_PTDEFINITION: mrPivotTable.importPTDefinition( rStrm, getSheetIndex() ); break; + case BIFF_ID_PTDEFINITION2: mrPivotTable.importPTDefinition2( rStrm ); break; + case BIFF_ID_PTFIELD: mrPivotTable.createTableField().importPTField( rStrm ); break; + case BIFF_ID_PTROWCOLFIELDS: mrPivotTable.importPTRowColFields( rStrm ); break; + case BIFF_ID_PTPAGEFIELDS: mrPivotTable.importPTPageFields( rStrm ); break; + case BIFF_ID_PTDATAFIELD: mrPivotTable.importPTDataField( rStrm ); break; } } @@ -314,4 +317,3 @@ void BiffPivotTableContext::importRecord() } // namespace xls } // namespace oox - diff --git a/oox/source/xls/querytablebuffer.cxx b/oox/source/xls/querytablebuffer.cxx new file mode 100644 index 000000000000..28ace4de52d8 --- /dev/null +++ b/oox/source/xls/querytablebuffer.cxx @@ -0,0 +1,390 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#include "oox/xls/querytablebuffer.hxx" + +#include <com/sun/star/container/XEnumerationAccess.hpp> +#include <com/sun/star/sheet/XAreaLink.hpp> +#include <com/sun/star/sheet/XAreaLinks.hpp> +#include "oox/core/filterbase.hxx" +#include "oox/helper/attributelist.hxx" +#include "oox/xls/addressconverter.hxx" +#include "oox/xls/biffinputstream.hxx" +#include "oox/xls/connectionsbuffer.hxx" +#include "oox/xls/defnamesbuffer.hxx" + +namespace oox { +namespace xls { + +// ============================================================================ + +using namespace ::com::sun::star::container; +using namespace ::com::sun::star::sheet; +using namespace ::com::sun::star::table; +using namespace ::com::sun::star::uno; + +using ::rtl::OUString; +using ::rtl::OUStringBuffer; + +// ============================================================================ + +namespace { + +const sal_uInt32 BIFF12_QUERYTABLE_HEADERS = 0x00000001; +const sal_uInt32 BIFF12_QUERYTABLE_ROWNUMBERS = 0x00000002; +const sal_uInt32 BIFF12_QUERYTABLE_DISABLEREFRESH = 0x00000004; +const sal_uInt32 BIFF12_QUERYTABLE_BACKGROUND = 0x00000008; +const sal_uInt32 BIFF12_QUERYTABLE_FIRSTBACKGROUND = 0x00000010; +const sal_uInt32 BIFF12_QUERYTABLE_REFRESHONLOAD = 0x00000020; +const sal_uInt32 BIFF12_QUERYTABLE_FILLFORMULAS = 0x00000100; +const sal_uInt32 BIFF12_QUERYTABLE_SAVEDATA = 0x00000200; +const sal_uInt32 BIFF12_QUERYTABLE_DISABLEEDIT = 0x00000400; +const sal_uInt32 BIFF12_QUERYTABLE_PRESERVEFORMAT = 0x00000800; +const sal_uInt32 BIFF12_QUERYTABLE_ADJUSTCOLWIDTH = 0x00001000; +const sal_uInt32 BIFF12_QUERYTABLE_INTERMEDIATE = 0x00002000; +const sal_uInt32 BIFF12_QUERYTABLE_APPLYNUMFMT = 0x00004000; +const sal_uInt32 BIFF12_QUERYTABLE_APPLYFONT = 0x00008000; +const sal_uInt32 BIFF12_QUERYTABLE_APPLYALIGNMENT = 0x00010000; +const sal_uInt32 BIFF12_QUERYTABLE_APPLYBORDER = 0x00020000; +const sal_uInt32 BIFF12_QUERYTABLE_APPLYFILL = 0x00040000; +const sal_uInt32 BIFF12_QUERYTABLE_APPLYPROTECTION = 0x00080000; + +const sal_uInt16 BIFF_QUERYTABLE_HEADERS = 0x0001; +const sal_uInt16 BIFF_QUERYTABLE_ROWNUMBERS = 0x0002; +const sal_uInt16 BIFF_QUERYTABLE_DISABLEREFRESH = 0x0004; +const sal_uInt16 BIFF_QUERYTABLE_BACKGROUND = 0x0008; +const sal_uInt16 BIFF_QUERYTABLE_FIRSTBACKGROUND = 0x0010; +const sal_uInt16 BIFF_QUERYTABLE_REFRESHONLOAD = 0x0020; +const sal_uInt16 BIFF_QUERYTABLE_DELETEUNUSED = 0x0040; +const sal_uInt16 BIFF_QUERYTABLE_FILLFORMULAS = 0x0080; +const sal_uInt16 BIFF_QUERYTABLE_ADJUSTCOLWIDTH = 0x0100; +const sal_uInt16 BIFF_QUERYTABLE_SAVEDATA = 0x0200; +const sal_uInt16 BIFF_QUERYTABLE_DISABLEEDIT = 0x0400; +const sal_uInt16 BIFF_QUERYTABLE_OVERWRITEEXISTING = 0x2000; + +const sal_uInt16 BIFF_QUERYTABLE_APPLYNUMFMT = 0x0001; +const sal_uInt16 BIFF_QUERYTABLE_APPLYFONT = 0x0002; +const sal_uInt16 BIFF_QUERYTABLE_APPLYALIGNMENT = 0x0004; +const sal_uInt16 BIFF_QUERYTABLE_APPLYBORDER = 0x0008; +const sal_uInt16 BIFF_QUERYTABLE_APPLYFILL = 0x0010; +const sal_uInt16 BIFF_QUERYTABLE_APPLYPROTECTION = 0x0020; + +const sal_uInt32 BIFF_QTREFRESH_PRESERVEFORMAT = 0x00000001; +const sal_uInt32 BIFF_QTREFRESH_ADJUSTCOLWIDTH = 0x00000002; + +// ---------------------------------------------------------------------------- + +void lclAppendWebQueryTableName( OUStringBuffer& rTables, const OUString& rTableName ) +{ + if( rTableName.getLength() > 0 ) + { + if( rTables.getLength() > 0 ) + rTables.append( sal_Unicode( ';' ) ); + rTables.appendAscii( RTL_CONSTASCII_STRINGPARAM( "HTML__" ) ).append( rTableName ); + } +} + +void lclAppendWebQueryTableIndex( OUStringBuffer& rTables, sal_Int32 nTableIndex ) +{ + if( nTableIndex > 0 ) + { + if( rTables.getLength() > 0 ) + rTables.append( sal_Unicode( ';' ) ); + rTables.appendAscii( RTL_CONSTASCII_STRINGPARAM( "HTML_" ) ).append( nTableIndex ); + } +} + +OUString lclBuildWebQueryTables( const WebPrModel::TablesVector& rTables ) +{ + if( rTables.empty() ) + return CREATE_OUSTRING( "HTML_tables" ); + + OUStringBuffer aTables; + for( WebPrModel::TablesVector::const_iterator aIt = rTables.begin(), aEnd = rTables.end(); aIt != aEnd; ++aIt ) + { + if( aIt->has< OUString >() ) + lclAppendWebQueryTableName( aTables, aIt->get< OUString >() ); + else if( aIt->has< sal_Int32 >() ) + lclAppendWebQueryTableIndex( aTables, aIt->get< sal_Int32 >() ); + } + return aTables.makeStringAndClear(); +} + +Reference< XAreaLink > lclFindAreaLink( + const Reference< XAreaLinks >& rxAreaLinks, const CellAddress& rDestPos, + const OUString& rFileUrl, const OUString& rTables, const OUString& rFilterName, const OUString& rFilterOptions ) +{ + try + { + Reference< XEnumerationAccess > xAreaLinksEA( rxAreaLinks, UNO_QUERY_THROW ); + Reference< XEnumeration > xAreaLinksEnum( xAreaLinksEA->createEnumeration(), UNO_SET_THROW ); + while( xAreaLinksEnum->hasMoreElements() ) + { + Reference< XAreaLink > xAreaLink( xAreaLinksEnum->nextElement(), UNO_QUERY_THROW ); + PropertySet aPropSet( xAreaLink ); + CellRangeAddress aDestArea = xAreaLink->getDestArea(); + OUString aString; + if( (rDestPos.Sheet == aDestArea.Sheet) && (rDestPos.Column == aDestArea.StartColumn) && (rDestPos.Row == aDestArea.StartRow) && + (rTables == xAreaLink->getSourceArea()) && + aPropSet.getProperty( aString, PROP_Url ) && (rFileUrl == aString) && + aPropSet.getProperty( aString, PROP_Filter ) && (rFilterName == aString) && + aPropSet.getProperty( aString, PROP_FilterOptions ) && (rFilterOptions == aString) ) + return xAreaLink; + } + } + catch( Exception& ) + { + } + return Reference< XAreaLink >(); +} + +} // namespace + +// ============================================================================ + +QueryTableModel::QueryTableModel() : + mnConnId( -1 ), + mnGrowShrinkType( XML_insertDelete ), + mbHeaders( true ), + mbRowNumbers( false ), + mbDisableRefresh( false ), + mbBackground( true ), + mbFirstBackground( false ), + mbRefreshOnLoad( false ), + mbFillFormulas( false ), + mbRemoveDataOnSave( false ), + mbDisableEdit( false ), + mbPreserveFormat( true ), + mbAdjustColWidth( true ), + mbIntermediate( false ) +{ +} + +// ---------------------------------------------------------------------------- + +QueryTable::QueryTable( const WorksheetHelper& rHelper ) : + WorksheetHelper( rHelper ) +{ +} + +void QueryTable::importQueryTable( const AttributeList& rAttribs ) +{ + maModel.maDefName = rAttribs.getXString( XML_name, OUString() ); + maModel.mnConnId = rAttribs.getInteger( XML_connectionId, -1 ); + maModel.mnGrowShrinkType = rAttribs.getToken( XML_growShrinkType, XML_insertDelete ); + maModel.mnAutoFormatId = rAttribs.getInteger( XML_autoFormatId, 0 ); + maModel.mbHeaders = rAttribs.getBool( XML_headers, true ); + maModel.mbRowNumbers = rAttribs.getBool( XML_rowNumbers, false ); + maModel.mbDisableRefresh = rAttribs.getBool( XML_disableRefresh, false ); + maModel.mbBackground = rAttribs.getBool( XML_backgroundRefresh, true ); + maModel.mbFirstBackground = rAttribs.getBool( XML_firstBackgroundRefresh, false ); + maModel.mbRefreshOnLoad = rAttribs.getBool( XML_refreshOnLoad, false ); + maModel.mbFillFormulas = rAttribs.getBool( XML_fillFormulas, false ); + maModel.mbRemoveDataOnSave = rAttribs.getBool( XML_removeDataOnSave, false ); + maModel.mbDisableEdit = rAttribs.getBool( XML_disableEdit, false ); + maModel.mbPreserveFormat = rAttribs.getBool( XML_preserveFormatting, true ); + maModel.mbAdjustColWidth = rAttribs.getBool( XML_adjustColumnWidth, true ); + maModel.mbIntermediate = rAttribs.getBool( XML_intermediate, false ); + maModel.mbApplyNumFmt = rAttribs.getBool( XML_applyNumberFormats, false ); + maModel.mbApplyFont = rAttribs.getBool( XML_applyFontFormats, false ); + maModel.mbApplyAlignment = rAttribs.getBool( XML_applyAlignmentFormats, false ); + maModel.mbApplyBorder = rAttribs.getBool( XML_applyBorderFormats, false ); + maModel.mbApplyFill = rAttribs.getBool( XML_applyPatternFormats, false ); + // OOXML and BIFF12 documentation differ: OOXML mentions width/height, BIFF12 mentions protection + maModel.mbApplyProtection = rAttribs.getBool( XML_applyWidthHeightFormats, false ); +} + +void QueryTable::importQueryTable( SequenceInputStream& rStrm ) +{ + sal_uInt32 nFlags; + rStrm >> nFlags; + maModel.mnAutoFormatId = rStrm.readuInt16(); + rStrm >> maModel.mnConnId >> maModel.maDefName; + + static const sal_Int32 spnGrowShrinkTypes[] = { XML_insertClear, XML_insertDelete, XML_overwriteClear }; + maModel.mnGrowShrinkType = STATIC_ARRAY_SELECT( spnGrowShrinkTypes, extractValue< sal_uInt8 >( nFlags, 6, 2 ), XML_insertDelete ); + + maModel.mbHeaders = getFlag( nFlags, BIFF12_QUERYTABLE_HEADERS ); + maModel.mbRowNumbers = getFlag( nFlags, BIFF12_QUERYTABLE_ROWNUMBERS ); + maModel.mbDisableRefresh = getFlag( nFlags, BIFF12_QUERYTABLE_DISABLEREFRESH ); + maModel.mbBackground = getFlag( nFlags, BIFF12_QUERYTABLE_BACKGROUND ); + maModel.mbFirstBackground = getFlag( nFlags, BIFF12_QUERYTABLE_FIRSTBACKGROUND ); + maModel.mbRefreshOnLoad = getFlag( nFlags, BIFF12_QUERYTABLE_REFRESHONLOAD ); + maModel.mbFillFormulas = getFlag( nFlags, BIFF12_QUERYTABLE_FILLFORMULAS ); + maModel.mbRemoveDataOnSave = !getFlag( nFlags, BIFF12_QUERYTABLE_SAVEDATA ); // flag negated in BIFF12 + maModel.mbDisableEdit = getFlag( nFlags, BIFF12_QUERYTABLE_DISABLEEDIT ); + maModel.mbPreserveFormat = getFlag( nFlags, BIFF12_QUERYTABLE_PRESERVEFORMAT ); + maModel.mbAdjustColWidth = getFlag( nFlags, BIFF12_QUERYTABLE_ADJUSTCOLWIDTH ); + maModel.mbIntermediate = getFlag( nFlags, BIFF12_QUERYTABLE_INTERMEDIATE ); + maModel.mbApplyNumFmt = getFlag( nFlags, BIFF12_QUERYTABLE_APPLYNUMFMT ); + maModel.mbApplyFont = getFlag( nFlags, BIFF12_QUERYTABLE_APPLYFONT ); + maModel.mbApplyAlignment = getFlag( nFlags, BIFF12_QUERYTABLE_APPLYALIGNMENT ); + maModel.mbApplyBorder = getFlag( nFlags, BIFF12_QUERYTABLE_APPLYBORDER ); + maModel.mbApplyFill = getFlag( nFlags, BIFF12_QUERYTABLE_APPLYFILL ); + maModel.mbApplyProtection = getFlag( nFlags, BIFF12_QUERYTABLE_APPLYPROTECTION ); +} + +void QueryTable::importQueryTable( BiffInputStream& rStrm ) +{ + sal_uInt16 nFlags, nAutoFormatFlags; + rStrm >> nFlags; + maModel.mnAutoFormatId = rStrm.readuInt16(); + rStrm >> nAutoFormatFlags; + rStrm.skip( 4 ); + maModel.maDefName = rStrm.readUniString(); + + bool bDeleteUnused = getFlag( nFlags, BIFF_QUERYTABLE_DELETEUNUSED ); + bool bOverwriteExisting = getFlag( nFlags, BIFF_QUERYTABLE_OVERWRITEEXISTING ); + OSL_ENSURE( !bDeleteUnused || !bOverwriteExisting, "QueryTable::importQueryTable - invalid flags" ); + maModel.mnGrowShrinkType = bDeleteUnused ? XML_insertDelete : (bOverwriteExisting ? XML_overwriteClear : XML_insertClear); + + maModel.mbHeaders = getFlag( nFlags, BIFF_QUERYTABLE_HEADERS ); + maModel.mbRowNumbers = getFlag( nFlags, BIFF_QUERYTABLE_ROWNUMBERS ); + maModel.mbDisableRefresh = getFlag( nFlags, BIFF_QUERYTABLE_DISABLEREFRESH ); + maModel.mbBackground = getFlag( nFlags, BIFF_QUERYTABLE_BACKGROUND ); + maModel.mbFirstBackground = getFlag( nFlags, BIFF_QUERYTABLE_FIRSTBACKGROUND ); + maModel.mbRefreshOnLoad = getFlag( nFlags, BIFF_QUERYTABLE_REFRESHONLOAD ); + maModel.mbFillFormulas = getFlag( nFlags, BIFF_QUERYTABLE_FILLFORMULAS ); + maModel.mbRemoveDataOnSave = !getFlag( nFlags, BIFF_QUERYTABLE_SAVEDATA ); // flag negated in BIFF + maModel.mbDisableEdit = getFlag( nFlags, BIFF_QUERYTABLE_DISABLEEDIT ); + maModel.mbAdjustColWidth = getFlag( nFlags, BIFF_QUERYTABLE_ADJUSTCOLWIDTH ); + maModel.mbApplyNumFmt = getFlag( nAutoFormatFlags, BIFF_QUERYTABLE_APPLYNUMFMT ); + maModel.mbApplyFont = getFlag( nAutoFormatFlags, BIFF_QUERYTABLE_APPLYFONT ); + maModel.mbApplyAlignment = getFlag( nAutoFormatFlags, BIFF_QUERYTABLE_APPLYALIGNMENT ); + maModel.mbApplyBorder = getFlag( nAutoFormatFlags, BIFF_QUERYTABLE_APPLYBORDER ); + maModel.mbApplyFill = getFlag( nAutoFormatFlags, BIFF_QUERYTABLE_APPLYFILL ); + maModel.mbApplyProtection = getFlag( nAutoFormatFlags, BIFF_QUERYTABLE_APPLYPROTECTION ); + + // create a new connection object that will store settings from following records + OSL_ENSURE( maModel.mnConnId == -1, "QueryTable::importQueryTable - multiple call" ); + Connection& rConnection = getConnections().createConnectionWithId(); + maModel.mnConnId = rConnection.getConnectionId(); + + // a DBQUERY record with some PCITEM_STRING records must follow + bool bHasDbQuery = (rStrm.getNextRecId() == BIFF_ID_DBQUERY) && rStrm.startNextRecord(); + OSL_ENSURE( bHasDbQuery, "QueryTable::importQueryTable - missing DBQUERY record" ); + if( bHasDbQuery ) + rConnection.importDbQuery( rStrm ); +} + +void QueryTable::importQueryTableRefresh( BiffInputStream& rStrm ) +{ + rStrm.skip( 4 ); + bool bPivot = rStrm.readuInt16() != 0; + OSL_ENSURE( !bPivot, "QueryTable::importQueryTableRefresh - unexpected pivot flag" ); + if( !bPivot ) + { + rStrm.skip( 2 ); + sal_uInt32 nFlags = rStrm.readuInt32(); + maModel.mbPreserveFormat = getFlag( nFlags, BIFF_QTREFRESH_PRESERVEFORMAT ); + maModel.mbAdjustColWidth = getFlag( nFlags, BIFF_QTREFRESH_ADJUSTCOLWIDTH ); + } +} + +void QueryTable::importQueryTableSettings( BiffInputStream& rStrm ) +{ + ConnectionRef xConnection = getConnections().getConnection( maModel.mnConnId ); + OSL_ENSURE( xConnection.get(), "QueryTable::importQueryTableSettings - missing connection object" ); + if( xConnection.get() ) + xConnection->importQueryTableSettings( rStrm ); +} + +void QueryTable::finalizeImport() +{ + ConnectionRef xConnection = getConnections().getConnection( maModel.mnConnId ); + OSL_ENSURE( xConnection.get(), "QueryTable::finalizeImport - missing connection object" ); + if( xConnection.get() && (xConnection->getConnectionType() == BIFF12_CONNECTION_HTML) ) + { + // check that valid web query properties exist + const WebPrModel* pWebPr = xConnection->getModel().mxWebPr.get(); + if( pWebPr && !pWebPr->mbXml ) + { + OUString aFileUrl = getBaseFilter().getAbsoluteUrl( pWebPr->maUrl ); + if( aFileUrl.getLength() > 0 ) + { + // resolve destination cell range (stored as defined name containing the range) + OUString aDefName = maModel.maDefName.replace( ' ', '_' ).replace( '-', '_' ); + DefinedNameRef xDefName = getDefinedNames().getByModelName( aDefName, getSheetIndex() ); + OSL_ENSURE( xDefName.get(), "QueryTable::finalizeImport - missing defined name" ); + if( xDefName.get() ) + { + CellRangeAddress aDestRange; + bool bIsRange = xDefName->getAbsoluteRange( aDestRange ) && (aDestRange.Sheet == getSheetIndex()); + OSL_ENSURE( bIsRange, "QueryTable::finalizeImport - defined name does not contain valid cell range" ); + if( bIsRange && getAddressConverter().checkCellRange( aDestRange, false, true ) ) + { + CellAddress aDestPos( aDestRange.Sheet, aDestRange.StartColumn, aDestRange.StartRow ); + // find tables mode: entire document, all tables, or specific tables + OUString aTables = pWebPr->mbHtmlTables ? lclBuildWebQueryTables( pWebPr->maTables ) : CREATE_OUSTRING( "HTML_all" ); + if( aTables.getLength() > 0 ) try + { + PropertySet aDocProps( getDocument() ); + Reference< XAreaLinks > xAreaLinks( aDocProps.getAnyProperty( PROP_AreaLinks ), UNO_QUERY_THROW ); + OUString aFilterName = CREATE_OUSTRING( "calc_HTML_WebQuery" ); + OUString aFilterOptions; + xAreaLinks->insertAtPosition( aDestPos, aFileUrl, aTables, aFilterName, aFilterOptions ); + // set refresh interval (convert minutes to seconds) + sal_Int32 nRefreshPeriod = xConnection->getModel().mnInterval * 60; + if( nRefreshPeriod > 0 ) + { + PropertySet aPropSet( lclFindAreaLink( xAreaLinks, aDestPos, aFileUrl, aTables, aFilterName, aFilterOptions ) ); + aPropSet.setProperty( PROP_RefreshPeriod, nRefreshPeriod ); + } + } + catch( Exception& ) + { + } + } + } + } + } + } +} + +// ============================================================================ + +QueryTableBuffer::QueryTableBuffer( const WorksheetHelper& rHelper ) : + WorksheetHelper( rHelper ) +{ +} + +QueryTable& QueryTableBuffer::createQueryTable() +{ + QueryTableVector::value_type xQueryTable( new QueryTable( *this ) ); + maQueryTables.push_back( xQueryTable ); + return *xQueryTable; +} + +void QueryTableBuffer::finalizeImport() +{ + maQueryTables.forEachMem( &QueryTable::finalizeImport ); +} + +// ============================================================================ + +} // namespace xls +} // namespace oox diff --git a/oox/source/xls/querytablefragment.cxx b/oox/source/xls/querytablefragment.cxx index 303852b8492b..c74aa53a581e 100644 --- a/oox/source/xls/querytablefragment.cxx +++ b/oox/source/xls/querytablefragment.cxx @@ -26,31 +26,81 @@ ************************************************************************/ #include "oox/xls/querytablefragment.hxx" -#include "oox/xls/webquerybuffer.hxx" -using ::rtl::OUString; -using ::oox::core::ContextHandlerRef; +#include "oox/xls/biffinputstream.hxx" +#include "oox/xls/querytablebuffer.hxx" namespace oox { namespace xls { -OoxQueryTableFragment::OoxQueryTableFragment( - const WorkbookHelper& rHelper, const OUString& rFragmentPath ) : - OoxWorkbookFragmentBase( rHelper, rFragmentPath ) +// ============================================================================ + +using namespace ::oox::core; + +using ::rtl::OUString; + +// ============================================================================ + +QueryTableFragment::QueryTableFragment( const WorksheetHelper& rHelper, const OUString& rFragmentPath ) : + WorksheetFragmentBase( rHelper, rFragmentPath ), + mrQueryTable( getQueryTables().createQueryTable() ) { } -ContextHandlerRef OoxQueryTableFragment::onCreateContext( sal_Int32 nElement, const AttributeList& rAttribs ) +ContextHandlerRef QueryTableFragment::onCreateContext( sal_Int32 nElement, const AttributeList& rAttribs ) +{ + switch( getCurrentElement() ) + { + case XML_ROOT_CONTEXT: + if( nElement == XLS_TOKEN( queryTable ) ) + mrQueryTable.importQueryTable( rAttribs ); + break; + } + return 0; +} + +ContextHandlerRef QueryTableFragment::onCreateRecordContext( sal_Int32 nRecId, SequenceInputStream& rStrm ) { switch( getCurrentElement() ) { case XML_ROOT_CONTEXT: - if( nElement == XLS_TOKEN( queryTable ) ) getWebQueries().importQueryTable( rAttribs ); + if( nRecId == BIFF12_ID_QUERYTABLE ) + mrQueryTable.importQueryTable( rStrm ); break; } return 0; } +const RecordInfo* QueryTableFragment::getRecordInfos() const +{ + static const RecordInfo spRecInfos[] = + { + { BIFF12_ID_QUERYTABLE, BIFF12_ID_QUERYTABLE + 1 }, + { BIFF12_ID_QUERYTABLEREFRESH, BIFF12_ID_QUERYTABLEREFRESH + 1 }, + { -1, -1 } + }; + return spRecInfos; +} + +// ============================================================================ + +BiffQueryTableContext::BiffQueryTableContext( const WorksheetHelper& rHelper ) : + BiffWorksheetContextBase( rHelper ), + mrQueryTable( getQueryTables().createQueryTable() ) +{ +} + +void BiffQueryTableContext::importRecord( BiffInputStream& rStrm ) +{ + switch( rStrm.getRecId() ) + { + case BIFF_ID_QUERYTABLE: mrQueryTable.importQueryTable( rStrm ); break; + case BIFF_ID_QUERYTABLEREFRESH: mrQueryTable.importQueryTableRefresh( rStrm ); break; + case BIFF_ID_QUERYTABLESETTINGS: mrQueryTable.importQueryTableSettings( rStrm ); break; + } +} + +// ============================================================================ + } // namespace xls } // namespace oox - diff --git a/oox/source/xls/richstring.cxx b/oox/source/xls/richstring.cxx index 4e82b1e696f0..5c79373b09b2 100644 --- a/oox/source/xls/richstring.cxx +++ b/oox/source/xls/richstring.cxx @@ -26,29 +26,31 @@ ************************************************************************/ #include "oox/xls/richstring.hxx" -#include <rtl/ustrbuf.hxx> + #include <com/sun/star/text/XText.hpp> +#include <rtl/ustrbuf.hxx> #include "oox/helper/attributelist.hxx" #include "oox/helper/propertyset.hxx" -#include "oox/helper/recordinputstream.hxx" #include "oox/xls/biffinputstream.hxx" +namespace oox { +namespace xls { + +// ============================================================================ + +using namespace ::com::sun::star::text; +using namespace ::com::sun::star::uno; + using ::rtl::OString; using ::rtl::OUString; using ::rtl::OUStringBuffer; -using ::com::sun::star::uno::Reference; -using ::com::sun::star::text::XText; -using ::com::sun::star::text::XTextRange; - -namespace oox { -namespace xls { // ============================================================================ namespace { -const sal_uInt8 OOBIN_STRINGFLAG_FONTS = 0x01; -const sal_uInt8 OOBIN_STRINGFLAG_PHONETICS = 0x02; +const sal_uInt8 BIFF12_STRINGFLAG_FONTS = 0x01; +const sal_uInt8 BIFF12_STRINGFLAG_PHONETICS = 0x02; } // namespace @@ -105,7 +107,7 @@ void RichStringPortion::convert( const Reference< XText >& rxText, sal_Int32 nXf // ---------------------------------------------------------------------------- -void FontPortionModel::read( RecordInputStream& rStrm ) +void FontPortionModel::read( SequenceInputStream& rStrm ) { mnPos = rStrm.readuInt16(); mnFontId = rStrm.readuInt16(); @@ -143,7 +145,7 @@ void FontPortionModelList::appendPortion( const FontPortionModel& rPortion ) back().mnFontId = rPortion.mnFontId; } -void FontPortionModelList::importPortions( RecordInputStream& rStrm ) +void FontPortionModelList::importPortions( SequenceInputStream& rStrm ) { sal_Int32 nCount = rStrm.readInt32(); clear(); @@ -190,7 +192,7 @@ PhoneticDataModel::PhoneticDataModel() : { } -void PhoneticDataModel::setBinData( sal_Int32 nType, sal_Int32 nAlignment ) +void PhoneticDataModel::setBiffData( sal_Int32 nType, sal_Int32 nAlignment ) { static const sal_Int32 spnTypeIds[] = { XML_halfwidthKatakana, XML_fullwidthKatakana, XML_hiragana, XML_noConversion }; mnType = STATIC_ARRAY_SELECT( spnTypeIds, nType, XML_fullwidthKatakana ); @@ -213,13 +215,13 @@ void PhoneticSettings::importPhoneticPr( const AttributeList& rAttribs ) maModel.mnAlignment = rAttribs.getToken( XML_alignment, XML_left ); } -void PhoneticSettings::importPhoneticPr( RecordInputStream& rStrm ) +void PhoneticSettings::importPhoneticPr( SequenceInputStream& rStrm ) { sal_uInt16 nFontId; sal_Int32 nType, nAlignment; rStrm >> nFontId >> nType >> nAlignment; maModel.mnFontId = nFontId; - maModel.setBinData( nType, nAlignment ); + maModel.setBiffData( nType, nAlignment ); } void PhoneticSettings::importPhoneticPr( BiffInputStream& rStrm ) @@ -227,16 +229,16 @@ void PhoneticSettings::importPhoneticPr( BiffInputStream& rStrm ) sal_uInt16 nFontId, nFlags; rStrm >> nFontId >> nFlags; maModel.mnFontId = nFontId; - maModel.setBinData( extractValue< sal_Int32 >( nFlags, 0, 2 ), extractValue< sal_Int32 >( nFlags, 2, 2 ) ); + maModel.setBiffData( extractValue< sal_Int32 >( nFlags, 0, 2 ), extractValue< sal_Int32 >( nFlags, 2, 2 ) ); // following: range list with cells showing phonetic text } -void PhoneticSettings::importStringData( RecordInputStream& rStrm ) +void PhoneticSettings::importStringData( SequenceInputStream& rStrm ) { sal_uInt16 nFontId, nFlags; rStrm >> nFontId >> nFlags; maModel.mnFontId = nFontId; - maModel.setBinData( extractValue< sal_Int32 >( nFlags, 0, 2 ), extractValue< sal_Int32 >( nFlags, 2, 2 ) ); + maModel.setBiffData( extractValue< sal_Int32 >( nFlags, 0, 2 ), extractValue< sal_Int32 >( nFlags, 2, 2 ) ); } void PhoneticSettings::importStringData( BiffInputStream& rStrm ) @@ -244,7 +246,7 @@ void PhoneticSettings::importStringData( BiffInputStream& rStrm ) sal_uInt16 nFontId, nFlags; rStrm >> nFontId >> nFlags; maModel.mnFontId = nFontId; - maModel.setBinData( extractValue< sal_Int32 >( nFlags, 0, 2 ), extractValue< sal_Int32 >( nFlags, 2, 2 ) ); + maModel.setBiffData( extractValue< sal_Int32 >( nFlags, 0, 2 ), extractValue< sal_Int32 >( nFlags, 2, 2 ) ); } // ============================================================================ @@ -275,7 +277,7 @@ void RichStringPhonetic::setBaseRange( sal_Int32 nBasePos, sal_Int32 nBaseEnd ) // ---------------------------------------------------------------------------- -void PhoneticPortionModel::read( RecordInputStream& rStrm ) +void PhoneticPortionModel::read( SequenceInputStream& rStrm ) { mnPos = rStrm.readuInt16(); mnBasePos = rStrm.readuInt16(); @@ -308,7 +310,7 @@ void PhoneticPortionModelList::appendPortion( const PhoneticPortionModel& rPorti } } -void PhoneticPortionModelList::importPortions( RecordInputStream& rStrm ) +void PhoneticPortionModelList::importPortions( SequenceInputStream& rStrm ) { sal_Int32 nCount = rStrm.readInt32(); clear(); @@ -380,12 +382,12 @@ void RichString::importPhoneticPr( const AttributeList& rAttribs ) maPhonSettings.importPhoneticPr( rAttribs ); } -void RichString::importString( RecordInputStream& rStrm, bool bRich ) +void RichString::importString( SequenceInputStream& rStrm, bool bRich ) { sal_uInt8 nFlags = bRich ? rStrm.readuInt8() : 0; - OUString aBaseText = rStrm.readString(); + OUString aBaseText = BiffHelper::readString( rStrm ); - if( !rStrm.isEof() && getFlag( nFlags, OOBIN_STRINGFLAG_FONTS ) ) + if( !rStrm.isEof() && getFlag( nFlags, BIFF12_STRINGFLAG_FONTS ) ) { FontPortionModelList aPortions; aPortions.importPortions( rStrm ); @@ -396,9 +398,9 @@ void RichString::importString( RecordInputStream& rStrm, bool bRich ) createPortion()->setText( aBaseText ); } - if( !rStrm.isEof() && getFlag( nFlags, OOBIN_STRINGFLAG_PHONETICS ) ) + if( !rStrm.isEof() && getFlag( nFlags, BIFF12_STRINGFLAG_PHONETICS ) ) { - OUString aPhoneticText = rStrm.readString(); + OUString aPhoneticText = BiffHelper::readString( rStrm ); PhoneticPortionModelList aPortions; aPortions.importPortions( rStrm ); maPhonSettings.importStringData( rStrm ); @@ -610,4 +612,3 @@ void RichString::createPhoneticPortions( const ::rtl::OUString& rText, PhoneticP } // namespace xls } // namespace oox - diff --git a/oox/source/xls/richstringcontext.cxx b/oox/source/xls/richstringcontext.cxx index 4eb3f5e91a4f..a3cfbe054406 100644 --- a/oox/source/xls/richstringcontext.cxx +++ b/oox/source/xls/richstringcontext.cxx @@ -26,28 +26,37 @@ ************************************************************************/ #include "oox/xls/richstringcontext.hxx" -#include "oox/xls/stylesfragment.hxx" -using ::rtl::OUString; -using ::oox::core::ContextHandlerRef; +#include "oox/xls/stylesfragment.hxx" namespace oox { namespace xls { // ============================================================================ -// oox.core.ContextHandler2Helper interface ----------------------------------- +using ::oox::core::ContextHandlerRef; +using ::rtl::OUString; -ContextHandlerRef OoxRichStringContext::onCreateContext( sal_Int32 nElement, const AttributeList& rAttribs ) +// ============================================================================ + +ContextHandlerRef RichStringContext::onCreateContext( sal_Int32 nElement, const AttributeList& rAttribs ) { if( isRootElement() ) { switch( nElement ) { - case XLS_TOKEN( t ): mxPortion = mxString->importText( rAttribs ); return this; // collect text in onEndElement() - case XLS_TOKEN( r ): mxPortion = mxString->importRun( rAttribs ); return this; - case XLS_TOKEN( rPh ): mxPhonetic = mxString->importPhoneticRun( rAttribs ); return this; - case XLS_TOKEN( phoneticPr ): mxString->importPhoneticPr( rAttribs ); break; + case XLS_TOKEN( t ): + mxPortion = mxString->importText( rAttribs ); + return this; // collect text in onCharacters() + case XLS_TOKEN( r ): + mxPortion = mxString->importRun( rAttribs ); + return this; + case XLS_TOKEN( rPh ): + mxPhonetic = mxString->importPhoneticRun( rAttribs ); + return this; + case XLS_TOKEN( phoneticPr ): + mxString->importPhoneticPr( rAttribs ); + break; } } else switch( getCurrentElement() ) @@ -57,11 +66,11 @@ ContextHandlerRef OoxRichStringContext::onCreateContext( sal_Int32 nElement, con { case XLS_TOKEN( rPr ): if( mxPortion.get() ) - return new OoxFontContext( *this, mxPortion->createFont() ); + return new FontContext( *this, mxPortion->createFont() ); break; case XLS_TOKEN( t ): - return this; // collect portion text in onEndElement() + return this; // collect portion text in onCharacters() } break; @@ -69,22 +78,24 @@ ContextHandlerRef OoxRichStringContext::onCreateContext( sal_Int32 nElement, con switch( nElement ) { case XLS_TOKEN( t ): - return this; // collect phonetic text in onEndElement() + return this; // collect phonetic text in onCharacters() } break; } return 0; } -void OoxRichStringContext::onEndElement( const OUString& rChars ) +void RichStringContext::onCharacters( const OUString& rChars ) { - if( getCurrentElement() == XLS_TOKEN( t ) ) + if( isCurrentElement( XLS_TOKEN( t ) ) ) switch( getParentElement() ) { - switch( getPreviousElement() ) - { - case XLS_TOKEN( rPh ): if( mxPhonetic.get() ) mxPhonetic->setText( rChars ); break; - default: if( mxPortion.get() ) mxPortion->setText( rChars ); break; - } + case XLS_TOKEN( rPh ): + if( mxPhonetic.get() ) + mxPhonetic->setText( rChars ); + break; + default: + if( mxPortion.get() ) + mxPortion->setText( rChars ); } } @@ -92,4 +103,3 @@ void OoxRichStringContext::onEndElement( const OUString& rChars ) } // namespace xls } // namespace oox - diff --git a/oox/source/xls/scenariobuffer.cxx b/oox/source/xls/scenariobuffer.cxx index a4a2627f3efb..8915f1ae0c7b 100644 --- a/oox/source/xls/scenariobuffer.cxx +++ b/oox/source/xls/scenariobuffer.cxx @@ -26,39 +26,33 @@ ************************************************************************/ #include "oox/xls/scenariobuffer.hxx" + #include <com/sun/star/container/XIndexAccess.hpp> #include <com/sun/star/sheet/XScenario.hpp> #include <com/sun/star/sheet/XScenarios.hpp> #include <com/sun/star/sheet/XScenariosSupplier.hpp> #include <com/sun/star/sheet/XSpreadsheet.hpp> #include <com/sun/star/sheet/XSpreadsheetDocument.hpp> -#include "properties.hxx" #include "oox/helper/attributelist.hxx" +#include "oox/helper/containerhelper.hxx" #include "oox/helper/propertyset.hxx" -#include "oox/helper/recordinputstream.hxx" #include "oox/xls/addressconverter.hxx" #include "oox/xls/biffinputstream.hxx" -using ::rtl::OUString; -using ::com::sun::star::uno::Exception; -using ::com::sun::star::uno::Reference; -using ::com::sun::star::uno::UNO_QUERY_THROW; -using ::com::sun::star::uno::UNO_SET_THROW; -using ::com::sun::star::container::XIndexAccess; -using ::com::sun::star::container::XNameAccess; -using ::com::sun::star::table::CellAddress; -using ::com::sun::star::table::CellRangeAddress; -using ::com::sun::star::table::XCell; -using ::com::sun::star::sheet::XScenario; -using ::com::sun::star::sheet::XScenarios; -using ::com::sun::star::sheet::XScenariosSupplier; -using ::com::sun::star::sheet::XSpreadsheet; - namespace oox { namespace xls { // ============================================================================ +using namespace ::com::sun::star::container; +using namespace ::com::sun::star::sheet; +using namespace ::com::sun::star::table; +using namespace ::com::sun::star::uno; + +using ::rtl::OUString; + +// ============================================================================ + namespace { const sal_Int32 BIFF_SCENARIO_DELETED = 0x4000; @@ -108,7 +102,7 @@ void Scenario::importInputCells( const AttributeList& rAttribs ) maCells.push_back( aModel ); } -void Scenario::importScenario( RecordInputStream& rStrm ) +void Scenario::importScenario( SequenceInputStream& rStrm ) { rStrm.skip( 2 ); // cell count // two longs instead of flag field @@ -117,7 +111,7 @@ void Scenario::importScenario( RecordInputStream& rStrm ) rStrm >> maModel.maName >> maModel.maComment >> maModel.maUser; } -void Scenario::importInputCells( RecordInputStream& rStrm ) +void Scenario::importInputCells( SequenceInputStream& rStrm ) { // TODO: where is the deleted flag? ScenarioCellModel aModel; @@ -238,7 +232,7 @@ void SheetScenarios::importScenarios( const AttributeList& rAttribs ) maModel.mnShown = rAttribs.getInteger( XML_show, 0 ); } -void SheetScenarios::importScenarios( RecordInputStream& rStrm ) +void SheetScenarios::importScenarios( SequenceInputStream& rStrm ) { maModel.mnCurrent = rStrm.readuInt16(); maModel.mnShown = rStrm.readuInt16(); @@ -303,4 +297,3 @@ void ScenarioBuffer::finalizeImport() } // namespace xls } // namespace oox - diff --git a/oox/source/xls/scenariocontext.cxx b/oox/source/xls/scenariocontext.cxx index 8d1341688a74..be44bc8545f2 100644 --- a/oox/source/xls/scenariocontext.cxx +++ b/oox/source/xls/scenariocontext.cxx @@ -26,22 +26,25 @@ ************************************************************************/ #include "oox/xls/scenariocontext.hxx" -#include "oox/xls/scenariobuffer.hxx" -using ::oox::core::ContextHandlerRef; +#include "oox/xls/scenariobuffer.hxx" namespace oox { namespace xls { // ============================================================================ -OoxScenarioContext::OoxScenarioContext( OoxWorksheetContextBase& rParent, SheetScenarios& rSheetScenarios ) : - OoxWorksheetContextBase( rParent ), +using ::oox::core::ContextHandlerRef; + +// ============================================================================ + +ScenarioContext::ScenarioContext( WorksheetContextBase& rParent, SheetScenarios& rSheetScenarios ) : + WorksheetContextBase( rParent ), mrScenario( rSheetScenarios.createScenario() ) { } -ContextHandlerRef OoxScenarioContext::onCreateContext( sal_Int32 nElement, const AttributeList& rAttribs ) +ContextHandlerRef ScenarioContext::onCreateContext( sal_Int32 nElement, const AttributeList& rAttribs ) { switch( getCurrentElement() ) { @@ -52,24 +55,24 @@ ContextHandlerRef OoxScenarioContext::onCreateContext( sal_Int32 nElement, const return 0; } -void OoxScenarioContext::onStartElement( const AttributeList& rAttribs ) +void ScenarioContext::onStartElement( const AttributeList& rAttribs ) { if( isRootElement() ) mrScenario.importScenario( rAttribs ); } -ContextHandlerRef OoxScenarioContext::onCreateRecordContext( sal_Int32 nRecId, RecordInputStream& rStrm ) +ContextHandlerRef ScenarioContext::onCreateRecordContext( sal_Int32 nRecId, SequenceInputStream& rStrm ) { switch( getCurrentElement() ) { - case OOBIN_ID_SCENARIO: - if( nRecId == OOBIN_ID_INPUTCELLS ) mrScenario.importInputCells( rStrm ); + case BIFF12_ID_SCENARIO: + if( nRecId == BIFF12_ID_INPUTCELLS ) mrScenario.importInputCells( rStrm ); break; } return 0; } -void OoxScenarioContext::onStartRecord( RecordInputStream& rStrm ) +void ScenarioContext::onStartRecord( SequenceInputStream& rStrm ) { if( isRootElement() ) mrScenario.importScenario( rStrm ); @@ -77,41 +80,41 @@ void OoxScenarioContext::onStartRecord( RecordInputStream& rStrm ) // ============================================================================ -OoxScenariosContext::OoxScenariosContext( OoxWorksheetFragmentBase& rFragment ) : - OoxWorksheetContextBase( rFragment ), +ScenariosContext::ScenariosContext( WorksheetFragmentBase& rFragment ) : + WorksheetContextBase( rFragment ), mrSheetScenarios( getScenarios().createSheetScenarios( getSheetIndex() ) ) { } -ContextHandlerRef OoxScenariosContext::onCreateContext( sal_Int32 nElement, const AttributeList& ) +ContextHandlerRef ScenariosContext::onCreateContext( sal_Int32 nElement, const AttributeList& ) { switch( getCurrentElement() ) { case XLS_TOKEN( scenarios ): - if( nElement == XLS_TOKEN( scenario ) ) return new OoxScenarioContext( *this, mrSheetScenarios ); + if( nElement == XLS_TOKEN( scenario ) ) return new ScenarioContext( *this, mrSheetScenarios ); break; } return 0; } -void OoxScenariosContext::onStartElement( const AttributeList& rAttribs ) +void ScenariosContext::onStartElement( const AttributeList& rAttribs ) { if( isRootElement() ) mrSheetScenarios.importScenarios( rAttribs ); } -ContextHandlerRef OoxScenariosContext::onCreateRecordContext( sal_Int32 nRecId, RecordInputStream& ) +ContextHandlerRef ScenariosContext::onCreateRecordContext( sal_Int32 nRecId, SequenceInputStream& ) { switch( getCurrentElement() ) { - case OOBIN_ID_SCENARIOS: - if( nRecId == OOBIN_ID_SCENARIO ) return new OoxScenarioContext( *this, mrSheetScenarios ); + case BIFF12_ID_SCENARIOS: + if( nRecId == BIFF12_ID_SCENARIO ) return new ScenarioContext( *this, mrSheetScenarios ); break; } return 0; } -void OoxScenariosContext::onStartRecord( RecordInputStream& rStrm ) +void ScenariosContext::onStartRecord( SequenceInputStream& rStrm ) { if( isRootElement() ) mrSheetScenarios.importScenarios( rStrm ); @@ -121,4 +124,3 @@ void OoxScenariosContext::onStartRecord( RecordInputStream& rStrm ) } // namespace xls } // namespace oox - diff --git a/oox/source/xls/sharedformulabuffer.cxx b/oox/source/xls/sharedformulabuffer.cxx index c95d52910bec..efdfe801f784 100644 --- a/oox/source/xls/sharedformulabuffer.cxx +++ b/oox/source/xls/sharedformulabuffer.cxx @@ -26,30 +26,28 @@ ************************************************************************/ #include "oox/xls/sharedformulabuffer.hxx" -#include <rtl/ustrbuf.hxx> + #include <com/sun/star/sheet/XFormulaTokens.hpp> -#include "properties.hxx" +#include <rtl/ustrbuf.hxx> #include "oox/helper/propertyset.hxx" -#include "oox/helper/recordinputstream.hxx" #include "oox/xls/addressconverter.hxx" #include "oox/xls/biffinputstream.hxx" #include "oox/xls/formulaparser.hxx" -using ::rtl::OUString; -using ::rtl::OUStringBuffer; -using ::com::sun::star::uno::Reference; -using ::com::sun::star::uno::Exception; -using ::com::sun::star::uno::UNO_QUERY; -using ::com::sun::star::table::CellAddress; -using ::com::sun::star::table::CellRangeAddress; -using ::com::sun::star::sheet::XFormulaTokens; -using ::com::sun::star::sheet::XNamedRange; - namespace oox { namespace xls { // ============================================================================ +using namespace ::com::sun::star::uno; +using namespace ::com::sun::star::sheet; +using namespace ::com::sun::star::table; + +using ::rtl::OUString; +using ::rtl::OUStringBuffer; + +// ============================================================================ + namespace { bool operator==( const CellAddress& rAddr1, const CellAddress& rAddr2 ) @@ -113,7 +111,7 @@ void SharedFormulaBuffer::importSharedFmla( const OUString& rFormula, const OUSt } } -void SharedFormulaBuffer::importSharedFmla( RecordInputStream& rStrm, const CellAddress& rBaseAddr ) +void SharedFormulaBuffer::importSharedFmla( SequenceInputStream& rStrm, const CellAddress& rBaseAddr ) { BinRange aRange; rStrm >> aRange; @@ -212,4 +210,3 @@ void SharedFormulaBuffer::updateCachedCell( const CellAddress& rBaseAddr, const } // namespace xls } // namespace oox - diff --git a/oox/source/xls/sharedstringsbuffer.cxx b/oox/source/xls/sharedstringsbuffer.cxx index f2a92ef06c0a..59d3a905bc40 100644 --- a/oox/source/xls/sharedstringsbuffer.cxx +++ b/oox/source/xls/sharedstringsbuffer.cxx @@ -26,16 +26,19 @@ ************************************************************************/ #include "oox/xls/sharedstringsbuffer.hxx" -#include "oox/xls/biffinputstream.hxx" -using ::com::sun::star::uno::Reference; -using ::com::sun::star::text::XText; +#include "oox/xls/biffinputstream.hxx" namespace oox { namespace xls { // ============================================================================ +using namespace ::com::sun::star::text; +using namespace ::com::sun::star::uno; + +// ============================================================================ + SharedStringsBuffer::SharedStringsBuffer( const WorkbookHelper& rHelper ) : WorkbookHelper( rHelper ) { @@ -81,4 +84,3 @@ void SharedStringsBuffer::convertString( const Reference< XText >& rxText, sal_I } // namespace xls } // namespace oox - diff --git a/oox/source/xls/sharedstringsfragment.cxx b/oox/source/xls/sharedstringsfragment.cxx index b868ca08523d..bdb60f6962b8 100644 --- a/oox/source/xls/sharedstringsfragment.cxx +++ b/oox/source/xls/sharedstringsfragment.cxx @@ -26,27 +26,28 @@ ************************************************************************/ #include "oox/xls/sharedstringsfragment.hxx" -#include "oox/xls/sharedstringsbuffer.hxx" -#include "oox/xls/richstringcontext.hxx" -using ::rtl::OUString; -using ::oox::core::ContextHandlerRef; -using ::oox::core::RecordInfo; +#include "oox/xls/richstringcontext.hxx" +#include "oox/xls/sharedstringsbuffer.hxx" namespace oox { namespace xls { // ============================================================================ -OoxSharedStringsFragment::OoxSharedStringsFragment( +using namespace ::oox::core; + +using ::rtl::OUString; + +// ============================================================================ + +SharedStringsFragment::SharedStringsFragment( const WorkbookHelper& rHelper, const OUString& rFragmentPath ) : - OoxWorkbookFragmentBase( rHelper, rFragmentPath ) + WorkbookFragmentBase( rHelper, rFragmentPath ) { } -// oox.core.ContextHandler2Helper interface ----------------------------------- - -ContextHandlerRef OoxSharedStringsFragment::onCreateContext( sal_Int32 nElement, const AttributeList& ) +ContextHandlerRef SharedStringsFragment::onCreateContext( sal_Int32 nElement, const AttributeList& ) { switch( getCurrentElement() ) { @@ -57,42 +58,40 @@ ContextHandlerRef OoxSharedStringsFragment::onCreateContext( sal_Int32 nElement, case XLS_TOKEN( sst ): if( nElement == XLS_TOKEN( si ) ) - return new OoxRichStringContext( *this, getSharedStrings().createRichString() ); + return new RichStringContext( *this, getSharedStrings().createRichString() ); break; } return 0; } -ContextHandlerRef OoxSharedStringsFragment::onCreateRecordContext( sal_Int32 nRecId, RecordInputStream& rStrm ) +ContextHandlerRef SharedStringsFragment::onCreateRecordContext( sal_Int32 nRecId, SequenceInputStream& rStrm ) { switch( getCurrentElement() ) { case XML_ROOT_CONTEXT: - if( nRecId == OOBIN_ID_SST ) + if( nRecId == BIFF12_ID_SST ) return this; break; - case OOBIN_ID_SST: - if( nRecId == OOBIN_ID_SI ) + case BIFF12_ID_SST: + if( nRecId == BIFF12_ID_SI ) getSharedStrings().createRichString()->importString( rStrm, true ); break; } return 0; } -// oox.core.FragmentHandler2 interface ---------------------------------------- - -const RecordInfo* OoxSharedStringsFragment::getRecordInfos() const +const RecordInfo* SharedStringsFragment::getRecordInfos() const { static const RecordInfo spRecInfos[] = { - { OOBIN_ID_SST, OOBIN_ID_SST + 1 }, + { BIFF12_ID_SST, BIFF12_ID_SST + 1 }, { -1, -1 } }; return spRecInfos; } -void OoxSharedStringsFragment::finalizeImport() +void SharedStringsFragment::finalizeImport() { getSharedStrings().finalizeImport(); } @@ -101,4 +100,3 @@ void OoxSharedStringsFragment::finalizeImport() } // namespace xls } // namespace oox - diff --git a/oox/source/xls/sheetdatacontext.cxx b/oox/source/xls/sheetdatacontext.cxx index 05e4c5bfe767..c515ec02bfbe 100644 --- a/oox/source/xls/sheetdatacontext.cxx +++ b/oox/source/xls/sheetdatacontext.cxx @@ -26,15 +26,15 @@ ************************************************************************/ #include "oox/xls/sheetdatacontext.hxx" + +#include <com/sun/star/sheet/XArrayFormulaTokens.hpp> +#include <com/sun/star/sheet/XFormulaTokens.hpp> #include <com/sun/star/table/CellContentType.hpp> #include <com/sun/star/table/XCell.hpp> #include <com/sun/star/table/XCellRange.hpp> -#include <com/sun/star/sheet/XFormulaTokens.hpp> -#include <com/sun/star/sheet/XArrayFormulaTokens.hpp> #include <com/sun/star/text/XText.hpp> #include "oox/helper/attributelist.hxx" #include "oox/helper/propertyset.hxx" -#include "oox/helper/recordinputstream.hxx" #include "oox/xls/addressconverter.hxx" #include "oox/xls/biffinputstream.hxx" #include "oox/xls/formulaparser.hxx" @@ -42,47 +42,39 @@ #include "oox/xls/sharedformulabuffer.hxx" #include "oox/xls/unitconverter.hxx" -using ::rtl::OUString; -using ::com::sun::star::uno::Reference; -using ::com::sun::star::uno::Exception; -using ::com::sun::star::uno::UNO_QUERY; -using ::com::sun::star::uno::UNO_QUERY_THROW; -using ::com::sun::star::table::CellAddress; -using ::com::sun::star::table::CellRangeAddress; -using ::com::sun::star::table::CellContentType_EMPTY; -using ::com::sun::star::table::XCell; -using ::com::sun::star::table::XCellRange; -using ::com::sun::star::sheet::XFormulaTokens; -using ::com::sun::star::sheet::XArrayFormulaTokens; -using ::com::sun::star::text::XText; -using ::oox::core::ContextHandlerRef; - namespace oox { namespace xls { // ============================================================================ +using namespace ::com::sun::star::sheet; +using namespace ::com::sun::star::table; +using namespace ::com::sun::star::text; +using namespace ::com::sun::star::uno; + +using ::oox::core::ContextHandlerRef; +using ::rtl::OUString; + +// ============================================================================ + namespace { // record constants ----------------------------------------------------------- -const sal_uInt32 OOBIN_CELL_SHOWPHONETIC = 0x01000000; - -const sal_uInt8 OOBIN_DATATABLE_ROW = 0x01; -const sal_uInt8 OOBIN_DATATABLE_2D = 0x02; -const sal_uInt8 OOBIN_DATATABLE_REF1DEL = 0x04; -const sal_uInt8 OOBIN_DATATABLE_REF2DEL = 0x08; +const sal_uInt32 BIFF12_CELL_SHOWPHONETIC = 0x01000000; -const sal_uInt16 OOBIN_ROW_THICKTOP = 0x0001; -const sal_uInt16 OOBIN_ROW_THICKBOTTOM = 0x0002; -const sal_uInt16 OOBIN_ROW_COLLAPSED = 0x0800; -const sal_uInt16 OOBIN_ROW_HIDDEN = 0x1000; -const sal_uInt16 OOBIN_ROW_CUSTOMHEIGHT = 0x2000; -const sal_uInt16 OOBIN_ROW_CUSTOMFORMAT = 0x4000; -const sal_uInt8 OOBIN_ROW_SHOWPHONETIC = 0x01; +const sal_uInt8 BIFF12_DATATABLE_ROW = 0x01; +const sal_uInt8 BIFF12_DATATABLE_2D = 0x02; +const sal_uInt8 BIFF12_DATATABLE_REF1DEL = 0x04; +const sal_uInt8 BIFF12_DATATABLE_REF2DEL = 0x08; -const sal_uInt8 BIFF_BOOLERR_BOOL = 0; -const sal_uInt8 BIFF_BOOLERR_ERROR = 1; +const sal_uInt16 BIFF12_ROW_THICKTOP = 0x0001; +const sal_uInt16 BIFF12_ROW_THICKBOTTOM = 0x0002; +const sal_uInt16 BIFF12_ROW_COLLAPSED = 0x0800; +const sal_uInt16 BIFF12_ROW_HIDDEN = 0x1000; +const sal_uInt16 BIFF12_ROW_CUSTOMHEIGHT = 0x2000; +const sal_uInt16 BIFF12_ROW_CUSTOMFORMAT = 0x4000; +const sal_uInt8 BIFF12_ROW_SHOWPHONETIC = 0x01; const sal_uInt16 BIFF_DATATABLE_ROW = 0x0004; const sal_uInt16 BIFF_DATATABLE_2D = 0x0008; @@ -162,14 +154,12 @@ void ArrayFormulaContext::setTokens( const ApiTokenSequence& rTokens ) // ============================================================================ -OoxSheetDataContext::OoxSheetDataContext( OoxWorksheetFragmentBase& rFragment ) : - OoxWorksheetContextBase( rFragment ) +SheetDataContext::SheetDataContext( WorksheetFragmentBase& rFragment ) : + WorksheetContextBase( rFragment ) { } -// oox.core.ContextHandler2Helper interface ----------------------------------- - -ContextHandlerRef OoxSheetDataContext::onCreateContext( sal_Int32 nElement, const AttributeList& rAttribs ) +ContextHandlerRef SheetDataContext::onCreateContext( sal_Int32 nElement, const AttributeList& rAttribs ) { switch( getCurrentElement() ) { @@ -186,7 +176,7 @@ ContextHandlerRef OoxSheetDataContext::onCreateContext( sal_Int32 nElement, cons { case XLS_TOKEN( is ): mxInlineStr.reset( new RichString( *this ) ); - return new OoxRichStringContext( *this, mxInlineStr ); + return new RichStringContext( *this, mxInlineStr ); case XLS_TOKEN( v ): return this; case XLS_TOKEN( f ): @@ -198,7 +188,7 @@ ContextHandlerRef OoxSheetDataContext::onCreateContext( sal_Int32 nElement, cons return 0; } -void OoxSheetDataContext::onEndElement( const OUString& rChars ) +void SheetDataContext::onCharacters( const OUString& rChars ) { switch( getCurrentElement() ) { @@ -252,84 +242,85 @@ void OoxSheetDataContext::onEndElement( const OUString& rChars ) break; default: - OSL_ENSURE( false, "OoxSheetDataContext::onEndElement - unknown formula type" ); + OSL_ENSURE( false, "SheetDataContext::onCharacters - unknown formula type" ); } } catch( Exception& ) { } break; + } +} - case XLS_TOKEN( c ): - if( maCurrCell.mxCell.is() ) +void SheetDataContext::onEndElement() +{ + if( isCurrentElement( XLS_TOKEN( c ) ) && maCurrCell.mxCell.is() ) + { + if( maCurrCell.mxCell->getType() == CellContentType_EMPTY ) + { + if( maCurrCell.mbHasValueStr ) { - if( maCurrCell.mxCell->getType() == CellContentType_EMPTY ) - { - if( maCurrCell.mbHasValueStr ) - { - // implemented in WorksheetHelper class - setCell( maCurrCell ); - } - else if( (maCurrCell.mnCellType == XML_inlineStr) && mxInlineStr.get() ) - { - // convert font settings - mxInlineStr->finalizeImport(); - // write string to cell - Reference< XText > xText( maCurrCell.mxCell, UNO_QUERY ); - if( xText.is() ) - mxInlineStr->convert( xText, maCurrCell.mnXfId ); - } - else - { - // empty cell, update cell type - maCurrCell.mnCellType = XML_TOKEN_INVALID; - } - } - - // store the cell formatting data - setCellFormat( maCurrCell ); + // implemented in WorksheetHelper class + setCell( maCurrCell ); } - break; + else if( (maCurrCell.mnCellType == XML_inlineStr) && mxInlineStr.get() ) + { + // convert font settings + mxInlineStr->finalizeImport(); + // write string to cell + Reference< XText > xText( maCurrCell.mxCell, UNO_QUERY ); + if( xText.is() ) + mxInlineStr->convert( xText, maCurrCell.mnXfId ); + } + else + { + // empty cell, update cell type + maCurrCell.mnCellType = XML_TOKEN_INVALID; + } + } + + // store the cell formatting data + setCellFormat( maCurrCell ); } } -ContextHandlerRef OoxSheetDataContext::onCreateRecordContext( sal_Int32 nRecId, RecordInputStream& rStrm ) +ContextHandlerRef SheetDataContext::onCreateRecordContext( sal_Int32 nRecId, SequenceInputStream& rStrm ) { switch( getCurrentElement() ) { - case OOBIN_ID_SHEETDATA: + case BIFF12_ID_SHEETDATA: switch( nRecId ) { - case OOBIN_ID_ROW: importRow( rStrm ); return this; + case BIFF12_ID_ROW: importRow( rStrm ); return this; } break; - case OOBIN_ID_ROW: + case BIFF12_ID_ROW: switch( nRecId ) { - case OOBIN_ID_ARRAY: importArray( rStrm ); break; - case OOBIN_ID_CELL_BOOL: importCellBool( rStrm, CELLTYPE_VALUE ); break; - case OOBIN_ID_CELL_BLANK: importCellBlank( rStrm, CELLTYPE_VALUE ); break; - case OOBIN_ID_CELL_DOUBLE: importCellDouble( rStrm, CELLTYPE_VALUE ); break; - case OOBIN_ID_CELL_ERROR: importCellError( rStrm, CELLTYPE_VALUE ); break; - case OOBIN_ID_CELL_RK: importCellRk( rStrm, CELLTYPE_VALUE ); break; - case OOBIN_ID_CELL_RSTRING: importCellRString( rStrm, CELLTYPE_VALUE ); break; - case OOBIN_ID_CELL_SI: importCellSi( rStrm, CELLTYPE_VALUE ); break; - case OOBIN_ID_CELL_STRING: importCellString( rStrm, CELLTYPE_VALUE ); break; - case OOBIN_ID_DATATABLE: importDataTable( rStrm ); break; - case OOBIN_ID_FORMULA_BOOL: importCellBool( rStrm, CELLTYPE_FORMULA ); break; - case OOBIN_ID_FORMULA_DOUBLE: importCellDouble( rStrm, CELLTYPE_FORMULA ); break; - case OOBIN_ID_FORMULA_ERROR: importCellError( rStrm, CELLTYPE_FORMULA ); break; - case OOBIN_ID_FORMULA_STRING: importCellString( rStrm, CELLTYPE_FORMULA ); break; - case OOBIN_ID_MULTCELL_BOOL: importCellBool( rStrm, CELLTYPE_MULTI ); break; - case OOBIN_ID_MULTCELL_BLANK: importCellBlank( rStrm, CELLTYPE_MULTI ); break; - case OOBIN_ID_MULTCELL_DOUBLE: importCellDouble( rStrm, CELLTYPE_MULTI ); break; - case OOBIN_ID_MULTCELL_ERROR: importCellError( rStrm, CELLTYPE_MULTI ); break; - case OOBIN_ID_MULTCELL_RK: importCellRk( rStrm, CELLTYPE_MULTI ); break; - case OOBIN_ID_MULTCELL_RSTRING: importCellRString( rStrm, CELLTYPE_MULTI ); break; - case OOBIN_ID_MULTCELL_SI: importCellSi( rStrm, CELLTYPE_MULTI ); break; - case OOBIN_ID_MULTCELL_STRING: importCellString( rStrm, CELLTYPE_MULTI ); break; - case OOBIN_ID_SHAREDFMLA: importSharedFmla( rStrm ); break; + case BIFF12_ID_ARRAY: importArray( rStrm ); break; + case BIFF12_ID_CELL_BOOL: importCellBool( rStrm, CELLTYPE_VALUE ); break; + case BIFF12_ID_CELL_BLANK: importCellBlank( rStrm, CELLTYPE_VALUE ); break; + case BIFF12_ID_CELL_DOUBLE: importCellDouble( rStrm, CELLTYPE_VALUE ); break; + case BIFF12_ID_CELL_ERROR: importCellError( rStrm, CELLTYPE_VALUE ); break; + case BIFF12_ID_CELL_RK: importCellRk( rStrm, CELLTYPE_VALUE ); break; + case BIFF12_ID_CELL_RSTRING: importCellRString( rStrm, CELLTYPE_VALUE ); break; + case BIFF12_ID_CELL_SI: importCellSi( rStrm, CELLTYPE_VALUE ); break; + case BIFF12_ID_CELL_STRING: importCellString( rStrm, CELLTYPE_VALUE ); break; + case BIFF12_ID_DATATABLE: importDataTable( rStrm ); break; + case BIFF12_ID_FORMULA_BOOL: importCellBool( rStrm, CELLTYPE_FORMULA ); break; + case BIFF12_ID_FORMULA_DOUBLE: importCellDouble( rStrm, CELLTYPE_FORMULA ); break; + case BIFF12_ID_FORMULA_ERROR: importCellError( rStrm, CELLTYPE_FORMULA ); break; + case BIFF12_ID_FORMULA_STRING: importCellString( rStrm, CELLTYPE_FORMULA ); break; + case BIFF12_ID_MULTCELL_BOOL: importCellBool( rStrm, CELLTYPE_MULTI ); break; + case BIFF12_ID_MULTCELL_BLANK: importCellBlank( rStrm, CELLTYPE_MULTI ); break; + case BIFF12_ID_MULTCELL_DOUBLE: importCellDouble( rStrm, CELLTYPE_MULTI ); break; + case BIFF12_ID_MULTCELL_ERROR: importCellError( rStrm, CELLTYPE_MULTI ); break; + case BIFF12_ID_MULTCELL_RK: importCellRk( rStrm, CELLTYPE_MULTI ); break; + case BIFF12_ID_MULTCELL_RSTRING:importCellRString( rStrm, CELLTYPE_MULTI ); break; + case BIFF12_ID_MULTCELL_SI: importCellSi( rStrm, CELLTYPE_MULTI ); break; + case BIFF12_ID_MULTCELL_STRING: importCellString( rStrm, CELLTYPE_MULTI ); break; + case BIFF12_ID_SHAREDFMLA: importSharedFmla( rStrm ); break; } break; } @@ -338,7 +329,7 @@ ContextHandlerRef OoxSheetDataContext::onCreateRecordContext( sal_Int32 nRecId, // private -------------------------------------------------------------------- -void OoxSheetDataContext::importRow( const AttributeList& rAttribs ) +void SheetDataContext::importRow( const AttributeList& rAttribs ) { RowModel aModel; aModel.mnFirstRow = aModel.mnLastRow = rAttribs.getInteger( XML_r, -1 ); @@ -356,7 +347,7 @@ void OoxSheetDataContext::importRow( const AttributeList& rAttribs ) setRowModel( aModel ); } -void OoxSheetDataContext::importCell( const AttributeList& rAttribs ) +void SheetDataContext::importCell( const AttributeList& rAttribs ) { maCurrCell.reset(); maCurrCell.mxCell = getCell( rAttribs.getString( XML_r, OUString() ), &maCurrCell.maAddress ); @@ -370,7 +361,7 @@ void OoxSheetDataContext::importCell( const AttributeList& rAttribs ) extendUsedArea( maCurrCell.maAddress ); } -void OoxSheetDataContext::importFormula( const AttributeList& rAttribs ) +void SheetDataContext::importFormula( const AttributeList& rAttribs ) { maCurrCell.maFormulaRef = rAttribs.getString( XML_ref, OUString() ); maCurrCell.mnFormulaType = rAttribs.getToken( XML_t, XML_normal ); @@ -383,7 +374,7 @@ void OoxSheetDataContext::importFormula( const AttributeList& rAttribs ) maTableData.mbRef2Deleted = rAttribs.getBool( XML_del2, false ); } -void OoxSheetDataContext::importCellHeader( RecordInputStream& rStrm, CellType eCellType ) +void SheetDataContext::importCellHeader( SequenceInputStream& rStrm, CellType eCellType ) { maCurrCell.reset(); @@ -399,14 +390,14 @@ void OoxSheetDataContext::importCellHeader( RecordInputStream& rStrm, CellType e maCurrCell.mxCell = getCell( maCurrPos, &maCurrCell.maAddress ); maCurrCell.mnXfId = extractValue< sal_Int32 >( nXfId, 0, 24 ); - maCurrCell.mbShowPhonetic = getFlag( nXfId, OOBIN_CELL_SHOWPHONETIC ); + maCurrCell.mbShowPhonetic = getFlag( nXfId, BIFF12_CELL_SHOWPHONETIC ); // update used area of the sheet if( maCurrCell.mxCell.is() ) extendUsedArea( maCurrCell.maAddress ); } -void OoxSheetDataContext::importCellBool( RecordInputStream& rStrm, CellType eCellType ) +void SheetDataContext::importCellBool( SequenceInputStream& rStrm, CellType eCellType ) { importCellHeader( rStrm, eCellType ); maCurrCell.mnCellType = XML_b; @@ -427,14 +418,14 @@ void OoxSheetDataContext::importCellBool( RecordInputStream& rStrm, CellType eCe setCellFormat( maCurrCell ); } -void OoxSheetDataContext::importCellBlank( RecordInputStream& rStrm, CellType eCellType ) +void SheetDataContext::importCellBlank( SequenceInputStream& rStrm, CellType eCellType ) { - OSL_ENSURE( eCellType != CELLTYPE_FORMULA, "OoxSheetDataContext::importCellBlank - no formula cells supported" ); + OSL_ENSURE( eCellType != CELLTYPE_FORMULA, "SheetDataContext::importCellBlank - no formula cells supported" ); importCellHeader( rStrm, eCellType ); setCellFormat( maCurrCell ); } -void OoxSheetDataContext::importCellDouble( RecordInputStream& rStrm, CellType eCellType ) +void SheetDataContext::importCellDouble( SequenceInputStream& rStrm, CellType eCellType ) { importCellHeader( rStrm, eCellType ); maCurrCell.mnCellType = XML_n; @@ -449,7 +440,7 @@ void OoxSheetDataContext::importCellDouble( RecordInputStream& rStrm, CellType e setCellFormat( maCurrCell ); } -void OoxSheetDataContext::importCellError( RecordInputStream& rStrm, CellType eCellType ) +void SheetDataContext::importCellError( SequenceInputStream& rStrm, CellType eCellType ) { importCellHeader( rStrm, eCellType ); maCurrCell.mnCellType = XML_e; @@ -464,9 +455,9 @@ void OoxSheetDataContext::importCellError( RecordInputStream& rStrm, CellType eC setCellFormat( maCurrCell ); } -void OoxSheetDataContext::importCellRk( RecordInputStream& rStrm, CellType eCellType ) +void SheetDataContext::importCellRk( SequenceInputStream& rStrm, CellType eCellType ) { - OSL_ENSURE( eCellType != CELLTYPE_FORMULA, "OoxSheetDataContext::importCellRk - no formula cells supported" ); + OSL_ENSURE( eCellType != CELLTYPE_FORMULA, "SheetDataContext::importCellRk - no formula cells supported" ); importCellHeader( rStrm, eCellType ); maCurrCell.mnCellType = XML_n; if( maCurrCell.mxCell.is() && (maCurrCell.mxCell->getType() == CellContentType_EMPTY) ) @@ -474,9 +465,9 @@ void OoxSheetDataContext::importCellRk( RecordInputStream& rStrm, CellType eCell setCellFormat( maCurrCell ); } -void OoxSheetDataContext::importCellRString( RecordInputStream& rStrm, CellType eCellType ) +void SheetDataContext::importCellRString( SequenceInputStream& rStrm, CellType eCellType ) { - OSL_ENSURE( eCellType != CELLTYPE_FORMULA, "OoxSheetDataContext::importCellRString - no formula cells supported" ); + OSL_ENSURE( eCellType != CELLTYPE_FORMULA, "SheetDataContext::importCellRString - no formula cells supported" ); importCellHeader( rStrm, eCellType ); maCurrCell.mnCellType = XML_inlineStr; Reference< XText > xText( maCurrCell.mxCell, UNO_QUERY ); @@ -490,9 +481,9 @@ void OoxSheetDataContext::importCellRString( RecordInputStream& rStrm, CellType setCellFormat( maCurrCell ); } -void OoxSheetDataContext::importCellSi( RecordInputStream& rStrm, CellType eCellType ) +void SheetDataContext::importCellSi( SequenceInputStream& rStrm, CellType eCellType ) { - OSL_ENSURE( eCellType != CELLTYPE_FORMULA, "OoxSheetDataContext::importCellSi - no formula cells supported" ); + OSL_ENSURE( eCellType != CELLTYPE_FORMULA, "SheetDataContext::importCellSi - no formula cells supported" ); importCellHeader( rStrm, eCellType ); maCurrCell.mnCellType = XML_s; if( maCurrCell.mxCell.is() && (maCurrCell.mxCell->getType() == CellContentType_EMPTY) ) @@ -500,7 +491,7 @@ void OoxSheetDataContext::importCellSi( RecordInputStream& rStrm, CellType eCell setCellFormat( maCurrCell ); } -void OoxSheetDataContext::importCellString( RecordInputStream& rStrm, CellType eCellType ) +void SheetDataContext::importCellString( SequenceInputStream& rStrm, CellType eCellType ) { importCellHeader( rStrm, eCellType ); maCurrCell.mnCellType = XML_inlineStr; @@ -518,7 +509,7 @@ void OoxSheetDataContext::importCellString( RecordInputStream& rStrm, CellType e setCellFormat( maCurrCell ); } -void OoxSheetDataContext::importCellFormula( RecordInputStream& rStrm ) +void SheetDataContext::importCellFormula( SequenceInputStream& rStrm ) { rStrm.skip( 2 ); Reference< XFormulaTokens > xTokens( maCurrCell.mxCell, UNO_QUERY ); @@ -529,7 +520,7 @@ void OoxSheetDataContext::importCellFormula( RecordInputStream& rStrm ) } } -void OoxSheetDataContext::importRow( RecordInputStream& rStrm ) +void SheetDataContext::importRow( SequenceInputStream& rStrm ) { RowModel aModel; @@ -537,23 +528,23 @@ void OoxSheetDataContext::importRow( RecordInputStream& rStrm ) sal_uInt8 nFlags2; rStrm >> maCurrPos.mnRow >> aModel.mnXfId >> nHeight >> nFlags1 >> nFlags2; - // row index is 0-based in OOBIN, but RowModel expects 1-based + // row index is 0-based in BIFF12, but RowModel expects 1-based aModel.mnFirstRow = aModel.mnLastRow = maCurrPos.mnRow + 1; - // row height is in twips in OOBIN, convert to points + // row height is in twips in BIFF12, convert to points aModel.mfHeight = nHeight / 20.0; aModel.mnLevel = extractValue< sal_Int32 >( nFlags1, 8, 3 ); - aModel.mbCustomHeight = getFlag( nFlags1, OOBIN_ROW_CUSTOMHEIGHT ); - aModel.mbCustomFormat = getFlag( nFlags1, OOBIN_ROW_CUSTOMFORMAT ); - aModel.mbShowPhonetic = getFlag( nFlags2, OOBIN_ROW_SHOWPHONETIC ); - aModel.mbHidden = getFlag( nFlags1, OOBIN_ROW_HIDDEN ); - aModel.mbCollapsed = getFlag( nFlags1, OOBIN_ROW_COLLAPSED ); - aModel.mbThickTop = getFlag( nFlags1, OOBIN_ROW_THICKTOP ); - aModel.mbThickBottom = getFlag( nFlags1, OOBIN_ROW_THICKBOTTOM ); + aModel.mbCustomHeight = getFlag( nFlags1, BIFF12_ROW_CUSTOMHEIGHT ); + aModel.mbCustomFormat = getFlag( nFlags1, BIFF12_ROW_CUSTOMFORMAT ); + aModel.mbShowPhonetic = getFlag( nFlags2, BIFF12_ROW_SHOWPHONETIC ); + aModel.mbHidden = getFlag( nFlags1, BIFF12_ROW_HIDDEN ); + aModel.mbCollapsed = getFlag( nFlags1, BIFF12_ROW_COLLAPSED ); + aModel.mbThickTop = getFlag( nFlags1, BIFF12_ROW_THICKTOP ); + aModel.mbThickBottom = getFlag( nFlags1, BIFF12_ROW_THICKBOTTOM ); // set row properties in the current sheet setRowModel( aModel ); } -void OoxSheetDataContext::importArray( RecordInputStream& rStrm ) +void SheetDataContext::importArray( SequenceInputStream& rStrm ) { BinRange aRange; rStrm >> aRange; @@ -568,12 +559,12 @@ void OoxSheetDataContext::importArray( RecordInputStream& rStrm ) } } -void OoxSheetDataContext::importSharedFmla( RecordInputStream& rStrm ) +void SheetDataContext::importSharedFmla( SequenceInputStream& rStrm ) { getSharedFormulas().importSharedFmla( rStrm, maCurrCell.maAddress ); } -void OoxSheetDataContext::importDataTable( RecordInputStream& rStrm ) +void SheetDataContext::importDataTable( SequenceInputStream& rStrm ) { BinRange aRange; rStrm >> aRange; @@ -586,18 +577,18 @@ void OoxSheetDataContext::importDataTable( RecordInputStream& rStrm ) rStrm >> aRef1 >> aRef2 >> nFlags; aModel.maRef1 = FormulaProcessorBase::generateAddress2dString( aRef1, false ); aModel.maRef2 = FormulaProcessorBase::generateAddress2dString( aRef2, false ); - aModel.mbRowTable = getFlag( nFlags, OOBIN_DATATABLE_ROW ); - aModel.mb2dTable = getFlag( nFlags, OOBIN_DATATABLE_2D ); - aModel.mbRef1Deleted = getFlag( nFlags, OOBIN_DATATABLE_REF1DEL ); - aModel.mbRef2Deleted = getFlag( nFlags, OOBIN_DATATABLE_REF2DEL ); + aModel.mbRowTable = getFlag( nFlags, BIFF12_DATATABLE_ROW ); + aModel.mb2dTable = getFlag( nFlags, BIFF12_DATATABLE_2D ); + aModel.mbRef1Deleted = getFlag( nFlags, BIFF12_DATATABLE_REF1DEL ); + aModel.mbRef2Deleted = getFlag( nFlags, BIFF12_DATATABLE_REF2DEL ); setTableOperation( aTableRange, aModel ); } } // ============================================================================ -BiffSheetDataContext::BiffSheetDataContext( const BiffWorksheetFragmentBase& rParent ) : - BiffWorksheetContextBase( rParent ), +BiffSheetDataContext::BiffSheetDataContext( const WorksheetHelper& rHelper ) : + BiffWorksheetContextBase( rHelper ), mnBiff2XfId( 0 ) { mnArrayIgnoreSize = (getBiff() == BIFF2) ? 1 : ((getBiff() <= BIFF4) ? 2 : 6); @@ -621,80 +612,80 @@ BiffSheetDataContext::BiffSheetDataContext( const BiffWorksheetFragmentBase& rPa } } -void BiffSheetDataContext::importRecord() +void BiffSheetDataContext::importRecord( BiffInputStream& rStrm ) { - sal_uInt16 nRecId = mrStrm.getRecId(); + sal_uInt16 nRecId = rStrm.getRecId(); switch( nRecId ) { // records in all BIFF versions case BIFF2_ID_ARRAY: // #i72713# - case BIFF3_ID_ARRAY: importArray(); break; + case BIFF3_ID_ARRAY: importArray( rStrm ); break; case BIFF2_ID_BLANK: - case BIFF3_ID_BLANK: importBlank(); break; + case BIFF3_ID_BLANK: importBlank( rStrm ); break; case BIFF2_ID_BOOLERR: - case BIFF3_ID_BOOLERR: importBoolErr(); break; - case BIFF2_ID_INTEGER: importInteger(); break; - case BIFF_ID_IXFE: mrStrm >> mnBiff2XfId; break; + case BIFF3_ID_BOOLERR: importBoolErr( rStrm ); break; + case BIFF2_ID_INTEGER: importInteger( rStrm ); break; + case BIFF_ID_IXFE: rStrm >> mnBiff2XfId; break; case BIFF2_ID_LABEL: - case BIFF3_ID_LABEL: importLabel(); break; + case BIFF3_ID_LABEL: importLabel( rStrm ); break; case BIFF2_ID_NUMBER: - case BIFF3_ID_NUMBER: importNumber(); break; - case BIFF_ID_RK: importRk(); break; + case BIFF3_ID_NUMBER: importNumber( rStrm ); break; + case BIFF_ID_RK: importRk( rStrm ); break; // BIFF specific records default: switch( getBiff() ) { case BIFF2: switch( nRecId ) { - case BIFF2_ID_DATATABLE: importDataTable(); break; - case BIFF2_ID_DATATABLE2: importDataTable(); break; - case BIFF2_ID_FORMULA: importFormula(); break; - case BIFF2_ID_ROW: importRow(); break; + case BIFF2_ID_DATATABLE: importDataTable( rStrm ); break; + case BIFF2_ID_DATATABLE2: importDataTable( rStrm ); break; + case BIFF2_ID_FORMULA: importFormula( rStrm ); break; + case BIFF2_ID_ROW: importRow( rStrm ); break; } break; case BIFF3: switch( nRecId ) { - case BIFF3_ID_DATATABLE: importDataTable(); break; - case BIFF3_ID_FORMULA: importFormula(); break; - case BIFF3_ID_ROW: importRow(); break; + case BIFF3_ID_DATATABLE: importDataTable( rStrm ); break; + case BIFF3_ID_FORMULA: importFormula( rStrm ); break; + case BIFF3_ID_ROW: importRow( rStrm ); break; } break; case BIFF4: switch( nRecId ) { - case BIFF3_ID_DATATABLE: importDataTable(); break; - case BIFF4_ID_FORMULA: importFormula(); break; - case BIFF3_ID_ROW: importRow(); break; + case BIFF3_ID_DATATABLE: importDataTable( rStrm ); break; + case BIFF4_ID_FORMULA: importFormula( rStrm ); break; + case BIFF3_ID_ROW: importRow( rStrm ); break; } break; case BIFF5: switch( nRecId ) { - case BIFF3_ID_DATATABLE: importDataTable(); break; + case BIFF3_ID_DATATABLE: importDataTable( rStrm ); break; case BIFF3_ID_FORMULA: case BIFF4_ID_FORMULA: - case BIFF5_ID_FORMULA: importFormula(); break; - case BIFF_ID_MULTBLANK: importMultBlank(); break; - case BIFF_ID_MULTRK: importMultRk(); break; - case BIFF3_ID_ROW: importRow(); break; - case BIFF_ID_RSTRING: importLabel(); break; - case BIFF_ID_SHAREDFMLA: importSharedFmla(); break; + case BIFF5_ID_FORMULA: importFormula( rStrm ); break; + case BIFF_ID_MULTBLANK: importMultBlank( rStrm ); break; + case BIFF_ID_MULTRK: importMultRk( rStrm ); break; + case BIFF3_ID_ROW: importRow( rStrm ); break; + case BIFF_ID_RSTRING: importLabel( rStrm ); break; + case BIFF_ID_SHAREDFMLA: importSharedFmla( rStrm ); break; } break; case BIFF8: switch( nRecId ) { - case BIFF3_ID_DATATABLE: importDataTable(); break; + case BIFF3_ID_DATATABLE: importDataTable( rStrm ); break; case BIFF3_ID_FORMULA: case BIFF4_ID_FORMULA: - case BIFF5_ID_FORMULA: importFormula(); break; - case BIFF_ID_LABELSST: importLabelSst(); break; - case BIFF_ID_MULTBLANK: importMultBlank(); break; - case BIFF_ID_MULTRK: importMultRk(); break; - case BIFF3_ID_ROW: importRow(); break; - case BIFF_ID_RSTRING: importLabel(); break; - case BIFF_ID_SHAREDFMLA: importSharedFmla(); break; + case BIFF5_ID_FORMULA: importFormula( rStrm ); break; + case BIFF_ID_LABELSST: importLabelSst( rStrm ); break; + case BIFF_ID_MULTBLANK: importMultBlank( rStrm ); break; + case BIFF_ID_MULTRK: importMultRk( rStrm ); break; + case BIFF3_ID_ROW: importRow( rStrm ); break; + case BIFF_ID_RSTRING: importLabel( rStrm ); break; + case BIFF_ID_SHAREDFMLA: importSharedFmla( rStrm ); break; } break; @@ -714,44 +705,44 @@ void BiffSheetDataContext::setCurrCell( const BinAddress& rAddr ) extendUsedArea( maCurrCell.maAddress ); } -void BiffSheetDataContext::importXfId( bool bBiff2 ) +void BiffSheetDataContext::importXfId( BiffInputStream& rStrm, bool bBiff2 ) { if( bBiff2 ) { sal_uInt8 nBiff2XfId; - mrStrm >> nBiff2XfId; - mrStrm.skip( 2 ); + rStrm >> nBiff2XfId; + rStrm.skip( 2 ); maCurrCell.mnXfId = nBiff2XfId & BIFF2_XF_MASK; if( maCurrCell.mnXfId == BIFF2_XF_EXTENDED_IDS ) maCurrCell.mnXfId = mnBiff2XfId; } else { - maCurrCell.mnXfId = mrStrm.readuInt16(); + maCurrCell.mnXfId = rStrm.readuInt16(); } } -void BiffSheetDataContext::importCellHeader( bool bBiff2 ) +void BiffSheetDataContext::importCellHeader( BiffInputStream& rStrm, bool bBiff2 ) { BinAddress aAddr; - mrStrm >> aAddr; + rStrm >> aAddr; setCurrCell( aAddr ); - importXfId( bBiff2 ); + importXfId( rStrm, bBiff2 ); } -void BiffSheetDataContext::importBlank() +void BiffSheetDataContext::importBlank( BiffInputStream& rStrm ) { - importCellHeader( mrStrm.getRecId() == BIFF2_ID_BLANK ); + importCellHeader( rStrm, rStrm.getRecId() == BIFF2_ID_BLANK ); setCellFormat( maCurrCell ); } -void BiffSheetDataContext::importBoolErr() +void BiffSheetDataContext::importBoolErr( BiffInputStream& rStrm ) { - importCellHeader( mrStrm.getRecId() == BIFF2_ID_BOOLERR ); + importCellHeader( rStrm, rStrm.getRecId() == BIFF2_ID_BOOLERR ); if( maCurrCell.mxCell.is() ) { sal_uInt8 nValue, nType; - mrStrm >> nValue >> nType; + rStrm >> nValue >> nType; switch( nType ) { case BIFF_BOOLERR_BOOL: @@ -771,33 +762,33 @@ void BiffSheetDataContext::importBoolErr() setCellFormat( maCurrCell ); } -void BiffSheetDataContext::importFormula() +void BiffSheetDataContext::importFormula( BiffInputStream& rStrm ) { - importCellHeader( getBiff() == BIFF2 ); + importCellHeader( rStrm, getBiff() == BIFF2 ); maCurrCell.mnCellType = XML_n; Reference< XFormulaTokens > xTokens( maCurrCell.mxCell, UNO_QUERY ); if( xTokens.is() ) { - mrStrm.skip( mnFormulaIgnoreSize ); + rStrm.skip( mnFormulaIgnoreSize ); ExtCellFormulaContext aContext( *this, xTokens, maCurrCell.maAddress ); - getFormulaParser().importFormula( aContext, mrStrm ); + getFormulaParser().importFormula( aContext, rStrm ); } setCellFormat( maCurrCell ); } -void BiffSheetDataContext::importInteger() +void BiffSheetDataContext::importInteger( BiffInputStream& rStrm ) { - importCellHeader( true ); + importCellHeader( rStrm, true ); maCurrCell.mnCellType = XML_n; if( maCurrCell.mxCell.is() ) - maCurrCell.mxCell->setValue( mrStrm.readuInt16() ); + maCurrCell.mxCell->setValue( rStrm.readuInt16() ); setCellFormat( maCurrCell ); } -void BiffSheetDataContext::importLabel() +void BiffSheetDataContext::importLabel( BiffInputStream& rStrm ) { - bool bBiff2Xf = mrStrm.getRecId() == BIFF2_ID_LABEL; - importCellHeader( bBiff2Xf ); + bool bBiff2Xf = rStrm.getRecId() == BIFF2_ID_LABEL; + importCellHeader( rStrm, bBiff2Xf ); maCurrCell.mnCellType = XML_inlineStr; Reference< XText > xText( maCurrCell.mxCell, UNO_QUERY ); if( xText.is() ) @@ -812,7 +803,7 @@ void BiffSheetDataContext::importLabel() RichString aString( *this ); if( getBiff() == BIFF8 ) { - aString.importUniString( mrStrm ); + aString.importUniString( rStrm ); } else { @@ -821,8 +812,8 @@ void BiffSheetDataContext::importLabel() if( const Font* pFont = getStyles().getFontFromCellXf( maCurrCell.mnXfId ).get() ) eTextEnc = pFont->getFontEncoding(); BiffStringFlags nFlags = bBiff2Xf ? BIFF_STR_8BITLENGTH : BIFF_STR_DEFAULT; - setFlag( nFlags, BIFF_STR_EXTRAFONTS, mrStrm.getRecId() == BIFF_ID_RSTRING ); - aString.importByteString( mrStrm, eTextEnc, nFlags ); + setFlag( nFlags, BIFF_STR_EXTRAFONTS, rStrm.getRecId() == BIFF_ID_RSTRING ); + aString.importByteString( rStrm, eTextEnc, nFlags ); } aString.finalizeImport(); aString.convert( xText, maCurrCell.mnXfId ); @@ -830,81 +821,81 @@ void BiffSheetDataContext::importLabel() setCellFormat( maCurrCell ); } -void BiffSheetDataContext::importLabelSst() +void BiffSheetDataContext::importLabelSst( BiffInputStream& rStrm ) { - importCellHeader( false ); + importCellHeader( rStrm, false ); maCurrCell.mnCellType = XML_s; if( maCurrCell.mxCell.is() ) - setSharedStringCell( maCurrCell.mxCell, mrStrm.readInt32(), maCurrCell.mnXfId ); + setSharedStringCell( maCurrCell.mxCell, rStrm.readInt32(), maCurrCell.mnXfId ); setCellFormat( maCurrCell ); } -void BiffSheetDataContext::importMultBlank() +void BiffSheetDataContext::importMultBlank( BiffInputStream& rStrm ) { BinAddress aAddr; - for( mrStrm >> aAddr; mrStrm.getRemaining() > 2; ++aAddr.mnCol ) + for( rStrm >> aAddr; rStrm.getRemaining() > 2; ++aAddr.mnCol ) { setCurrCell( aAddr ); - importXfId( false ); + importXfId( rStrm, false ); setCellFormat( maCurrCell ); } } -void BiffSheetDataContext::importMultRk() +void BiffSheetDataContext::importMultRk( BiffInputStream& rStrm ) { BinAddress aAddr; - for( mrStrm >> aAddr; mrStrm.getRemaining() > 2; ++aAddr.mnCol ) + for( rStrm >> aAddr; rStrm.getRemaining() > 2; ++aAddr.mnCol ) { setCurrCell( aAddr ); maCurrCell.mnCellType = XML_n; - importXfId( false ); - sal_Int32 nRkValue = mrStrm.readInt32(); + importXfId( rStrm, false ); + sal_Int32 nRkValue = rStrm.readInt32(); if( maCurrCell.mxCell.is() ) maCurrCell.mxCell->setValue( BiffHelper::calcDoubleFromRk( nRkValue ) ); setCellFormat( maCurrCell ); } } -void BiffSheetDataContext::importNumber() +void BiffSheetDataContext::importNumber( BiffInputStream& rStrm ) { - importCellHeader( mrStrm.getRecId() == BIFF2_ID_NUMBER ); + importCellHeader( rStrm, rStrm.getRecId() == BIFF2_ID_NUMBER ); maCurrCell.mnCellType = XML_n; if( maCurrCell.mxCell.is() ) - maCurrCell.mxCell->setValue( mrStrm.readDouble() ); + maCurrCell.mxCell->setValue( rStrm.readDouble() ); setCellFormat( maCurrCell ); } -void BiffSheetDataContext::importRk() +void BiffSheetDataContext::importRk( BiffInputStream& rStrm ) { - importCellHeader( false ); + importCellHeader( rStrm, false ); maCurrCell.mnCellType = XML_n; if( maCurrCell.mxCell.is() ) - maCurrCell.mxCell->setValue( BiffHelper::calcDoubleFromRk( mrStrm.readInt32() ) ); + maCurrCell.mxCell->setValue( BiffHelper::calcDoubleFromRk( rStrm.readInt32() ) ); setCellFormat( maCurrCell ); } -void BiffSheetDataContext::importRow() +void BiffSheetDataContext::importRow( BiffInputStream& rStrm ) { RowModel aModel; sal_uInt16 nRow, nHeight; - mrStrm >> nRow; - mrStrm.skip( 4 ); - mrStrm >> nHeight; + rStrm >> nRow; + rStrm.skip( 4 ); + rStrm >> nHeight; if( getBiff() == BIFF2 ) { - mrStrm.skip( 2 ); - aModel.mbCustomFormat = mrStrm.readuInt8() == BIFF2_ROW_CUSTOMFORMAT; + rStrm.skip( 2 ); + aModel.mbCustomFormat = rStrm.readuInt8() == BIFF2_ROW_CUSTOMFORMAT; if( aModel.mbCustomFormat ) { - mrStrm.skip( 5 ); - aModel.mnXfId = mrStrm.readuInt16(); + rStrm.skip( 5 ); + aModel.mnXfId = rStrm.readuInt16(); } } else { - mrStrm.skip( 4 ); - sal_uInt32 nFlags = mrStrm.readuInt32(); + rStrm.skip( 4 ); + sal_uInt32 nFlags = rStrm.readuInt32(); aModel.mnXfId = extractValue< sal_Int32 >( nFlags, 16, 12 ); aModel.mnLevel = extractValue< sal_Int32 >( nFlags, 0, 3 ); aModel.mbCustomFormat = getFlag( nFlags, BIFF_ROW_CUSTOMFORMAT ); @@ -924,52 +915,52 @@ void BiffSheetDataContext::importRow() setRowModel( aModel ); } -void BiffSheetDataContext::importArray() +void BiffSheetDataContext::importArray( BiffInputStream& rStrm ) { BinRange aRange; - aRange.read( mrStrm, false ); // columns always 8-bit + aRange.read( rStrm, false ); // columns always 8-bit CellRangeAddress aArrayRange; Reference< XCellRange > xRange = getCellRange( aRange, &aArrayRange ); Reference< XArrayFormulaTokens > xTokens( xRange, UNO_QUERY ); if( xRange.is() && xTokens.is() ) { - mrStrm.skip( mnArrayIgnoreSize ); + rStrm.skip( mnArrayIgnoreSize ); ArrayFormulaContext aContext( xTokens, aArrayRange ); - getFormulaParser().importFormula( aContext, mrStrm ); + getFormulaParser().importFormula( aContext, rStrm ); } } -void BiffSheetDataContext::importSharedFmla() +void BiffSheetDataContext::importSharedFmla( BiffInputStream& rStrm ) { - getSharedFormulas().importSharedFmla( mrStrm, maCurrCell.maAddress ); + getSharedFormulas().importSharedFmla( rStrm, maCurrCell.maAddress ); } -void BiffSheetDataContext::importDataTable() +void BiffSheetDataContext::importDataTable( BiffInputStream& rStrm ) { BinRange aRange; - aRange.read( mrStrm, false ); // columns always 8-bit + aRange.read( rStrm, false ); // columns always 8-bit CellRangeAddress aTableRange; if( getAddressConverter().convertToCellRange( aTableRange, aRange, getSheetIndex(), true, true ) ) { DataTableModel aModel; BinAddress aRef1, aRef2; - switch( mrStrm.getRecId() ) + switch( rStrm.getRecId() ) { case BIFF2_ID_DATATABLE: - mrStrm.skip( 1 ); - aModel.mbRowTable = mrStrm.readuInt8() != 0; + rStrm.skip( 1 ); + aModel.mbRowTable = rStrm.readuInt8() != 0; aModel.mb2dTable = false; - mrStrm >> aRef1; + rStrm >> aRef1; break; case BIFF2_ID_DATATABLE2: - mrStrm.skip( 2 ); + rStrm.skip( 2 ); aModel.mb2dTable = true; - mrStrm >> aRef1 >> aRef2; + rStrm >> aRef1 >> aRef2; break; case BIFF3_ID_DATATABLE: { sal_uInt16 nFlags; - mrStrm >> nFlags >> aRef1 >> aRef2; + rStrm >> nFlags >> aRef1 >> aRef2; aModel.mbRowTable = getFlag( nFlags, BIFF_DATATABLE_ROW ); aModel.mb2dTable = getFlag( nFlags, BIFF_DATATABLE_2D ); aModel.mbRef1Deleted = getFlag( nFlags, BIFF_DATATABLE_REF1DEL ); @@ -989,4 +980,3 @@ void BiffSheetDataContext::importDataTable() } // namespace xls } // namespace oox - diff --git a/oox/source/xls/stylesbuffer.cxx b/oox/source/xls/stylesbuffer.cxx index 5a149961c0e2..56c26d8b9f67 100644 --- a/oox/source/xls/stylesbuffer.cxx +++ b/oox/source/xls/stylesbuffer.cxx @@ -26,8 +26,7 @@ ************************************************************************/ #include "oox/xls/stylesbuffer.hxx" -#include <com/sun/star/container/XIndexAccess.hpp> -#include <com/sun/star/container/XNameAccess.hpp> + #include <com/sun/star/awt/FontDescriptor.hpp> #include <com/sun/star/awt/FontFamily.hpp> #include <com/sun/star/awt/FontPitch.hpp> @@ -38,56 +37,51 @@ #include <com/sun/star/awt/FontUnderline.hpp> #include <com/sun/star/awt/XDevice.hpp> #include <com/sun/star/awt/XFont2.hpp> +#include <com/sun/star/container/XIndexAccess.hpp> +#include <com/sun/star/container/XNameAccess.hpp> #include <com/sun/star/style/XStyle.hpp> #include <com/sun/star/text/WritingMode2.hpp> #include <com/sun/star/text/XText.hpp> #include <rtl/tencinfo.h> #include <rtl/ustrbuf.hxx> -#include "properties.hxx" +#include "oox/core/filterbase.hxx" #include "oox/helper/attributelist.hxx" +#include "oox/helper/containerhelper.hxx" #include "oox/helper/propertymap.hxx" #include "oox/helper/propertyset.hxx" -#include "oox/helper/recordinputstream.hxx" -#include "oox/core/filterbase.hxx" #include "oox/xls/biffinputstream.hxx" #include "oox/xls/condformatbuffer.hxx" #include "oox/xls/excelhandlers.hxx" #include "oox/xls/themebuffer.hxx" #include "oox/xls/unitconverter.hxx" -using ::rtl::OUString; -using ::rtl::OUStringBuffer; -using ::com::sun::star::uno::Exception; -using ::com::sun::star::uno::Reference; -using ::com::sun::star::uno::UNO_QUERY; -using ::com::sun::star::uno::UNO_QUERY_THROW; -using ::com::sun::star::uno::UNO_SET_THROW; -using ::com::sun::star::container::XIndexAccess; -using ::com::sun::star::container::XNameAccess; -using ::com::sun::star::container::XNamed; -using ::com::sun::star::awt::FontDescriptor; -using ::com::sun::star::awt::XDevice; -using ::com::sun::star::awt::XFont2; -using ::com::sun::star::table::BorderLine; -using ::com::sun::star::table::TableBorder; -using ::com::sun::star::text::XText; -using ::com::sun::star::style::XStyle; -using ::oox::core::FilterBase; - namespace oox { namespace xls { // ============================================================================ +using namespace ::com::sun::star::awt; +using namespace ::com::sun::star::container; +using namespace ::com::sun::star::style; +using namespace ::com::sun::star::table; +using namespace ::com::sun::star::text; +using namespace ::com::sun::star::uno; + +using ::oox::core::FilterBase; +using ::rtl::OUString; +using ::rtl::OUStringBuffer; + +// ============================================================================ + namespace { // OOXML constants ------------------------------------------------------------ -// OOX predefined color indexes (also used in BIFF3-BIFF8) -const sal_Int32 OOX_COLOR_USEROFFSET = 0; /// First user defined color in palette (OOX). -const sal_Int32 BIFF_COLOR_USEROFFSET = 8; /// First user defined color in palette (BIFF). +// OOXML predefined color indexes (also used in BIFF3-BIFF8) +const sal_Int32 OOX_COLOR_USEROFFSET = 0; /// First user defined color in palette (OOXML/BIFF12). +const sal_Int32 BIFF_COLOR_USEROFFSET = 8; /// First user defined color in palette (BIFF3-BIFF8). -// OOX font family (also used in BIFF) +// OOXML font family (also used in BIFF) const sal_Int32 OOX_FONTFAMILY_NONE = 0; const sal_Int32 OOX_FONTFAMILY_ROMAN = 1; const sal_Int32 OOX_FONTFAMILY_SWISS = 2; @@ -95,102 +89,102 @@ const sal_Int32 OOX_FONTFAMILY_MODERN = 3; const sal_Int32 OOX_FONTFAMILY_SCRIPT = 4; const sal_Int32 OOX_FONTFAMILY_DECORATIVE = 5; -// OOX cell text direction (also used in BIFF) +// OOXML cell text direction (also used in BIFF) const sal_Int32 OOX_XF_TEXTDIR_CONTEXT = 0; const sal_Int32 OOX_XF_TEXTDIR_LTR = 1; const sal_Int32 OOX_XF_TEXTDIR_RTL = 2; -// OOX cell rotation (also used in BIFF) +// OOXML cell rotation (also used in BIFF) const sal_Int32 OOX_XF_ROTATION_NONE = 0; const sal_Int32 OOX_XF_ROTATION_90CCW = 90; const sal_Int32 OOX_XF_ROTATION_90CW = 180; const sal_Int32 OOX_XF_ROTATION_STACKED = 255; -// OOX cell indentation +// OOXML cell indentation const sal_Int32 OOX_XF_INDENT_NONE = 0; -// OOX built-in cell styles (also used in BIFF) +// OOXML built-in cell styles (also used in BIFF) const sal_Int32 OOX_STYLE_NORMAL = 0; /// Default cell style. const sal_Int32 OOX_STYLE_ROWLEVEL = 1; /// RowLevel_x cell style. const sal_Int32 OOX_STYLE_COLLEVEL = 2; /// ColLevel_x cell style. const sal_Int32 OOX_STYLE_LEVELCOUNT = 7; /// Number of outline level styles. -// OOBIN constants ------------------------------------------------------------ - -// OOBIN color types -const sal_uInt8 OOBIN_COLOR_AUTO = 0; -const sal_uInt8 OOBIN_COLOR_INDEXED = 1; -const sal_uInt8 OOBIN_COLOR_RGB = 2; -const sal_uInt8 OOBIN_COLOR_THEME = 3; - -// OOBIN diagonal borders -const sal_uInt8 OOBIN_BORDER_DIAG_TLBR = 0x01; /// Top-left to bottom-right. -const sal_uInt8 OOBIN_BORDER_DIAG_BLTR = 0x02; /// Bottom-left to top-right. - -// OOBIN gradient fill -const sal_Int32 OOBIN_FILL_GRADIENT = 40; - -// OOBIN XF flags -const sal_uInt32 OOBIN_XF_WRAPTEXT = 0x00400000; -const sal_uInt32 OOBIN_XF_JUSTLASTLINE = 0x00800000; -const sal_uInt32 OOBIN_XF_SHRINK = 0x01000000; -const sal_uInt32 OOBIN_XF_LOCKED = 0x10000000; -const sal_uInt32 OOBIN_XF_HIDDEN = 0x20000000; - -// OOBIN XF attribute used flags -const sal_uInt16 OOBIN_XF_NUMFMT_USED = 0x0001; -const sal_uInt16 OOBIN_XF_FONT_USED = 0x0002; -const sal_uInt16 OOBIN_XF_ALIGN_USED = 0x0004; -const sal_uInt16 OOBIN_XF_BORDER_USED = 0x0008; -const sal_uInt16 OOBIN_XF_AREA_USED = 0x0010; -const sal_uInt16 OOBIN_XF_PROT_USED = 0x0020; - -// OOBIN DXF constants -const sal_uInt16 OOBIN_DXF_FILL_PATTERN = 0; -const sal_uInt16 OOBIN_DXF_FILL_FGCOLOR = 1; -const sal_uInt16 OOBIN_DXF_FILL_BGCOLOR = 2; -const sal_uInt16 OOBIN_DXF_FILL_GRADIENT = 3; -const sal_uInt16 OOBIN_DXF_FILL_STOP = 4; -const sal_uInt16 OOBIN_DXF_FONT_COLOR = 5; -const sal_uInt16 OOBIN_DXF_BORDER_TOP = 6; -const sal_uInt16 OOBIN_DXF_BORDER_BOTTOM = 7; -const sal_uInt16 OOBIN_DXF_BORDER_LEFT = 8; -const sal_uInt16 OOBIN_DXF_BORDER_RIGHT = 9; -const sal_uInt16 OOBIN_DXF_BORDER_DIAG = 10; -const sal_uInt16 OOBIN_DXF_BORDER_VERT = 11; -const sal_uInt16 OOBIN_DXF_BORDER_HOR = 12; -const sal_uInt16 OOBIN_DXF_BORDER_DIAGUP = 13; -const sal_uInt16 OOBIN_DXF_BORDER_DIAGDOWN = 14; -const sal_uInt16 OOBIN_DXF_FONT_NAME = 24; -const sal_uInt16 OOBIN_DXF_FONT_WEIGHT = 25; -const sal_uInt16 OOBIN_DXF_FONT_UNDERLINE = 26; -const sal_uInt16 OOBIN_DXF_FONT_ESCAPEMENT = 27; -const sal_uInt16 OOBIN_DXF_FONT_ITALIC = 28; -const sal_uInt16 OOBIN_DXF_FONT_STRIKE = 29; -const sal_uInt16 OOBIN_DXF_FONT_OUTLINE = 30; -const sal_uInt16 OOBIN_DXF_FONT_SHADOW = 31; -const sal_uInt16 OOBIN_DXF_FONT_CONDENSE = 32; -const sal_uInt16 OOBIN_DXF_FONT_EXTEND = 33; -const sal_uInt16 OOBIN_DXF_FONT_CHARSET = 34; -const sal_uInt16 OOBIN_DXF_FONT_FAMILY = 35; -const sal_uInt16 OOBIN_DXF_FONT_HEIGHT = 36; -const sal_uInt16 OOBIN_DXF_FONT_SCHEME = 37; -const sal_uInt16 OOBIN_DXF_NUMFMT_CODE = 38; -const sal_uInt16 OOBIN_DXF_NUMFMT_ID = 41; - -// OOBIN CELLSTYLE flags -const sal_uInt16 OOBIN_CELLSTYLE_BUILTIN = 0x0001; -const sal_uInt16 OOBIN_CELLSTYLE_HIDDEN = 0x0002; -const sal_uInt16 OOBIN_CELLSTYLE_CUSTOM = 0x0004; - -// OOBIN and BIFF constants --------------------------------------------------- +// BIFF12 constants ----------------------------------------------------------- + +// BIFF12 color types +const sal_uInt8 BIFF12_COLOR_AUTO = 0; +const sal_uInt8 BIFF12_COLOR_INDEXED = 1; +const sal_uInt8 BIFF12_COLOR_RGB = 2; +const sal_uInt8 BIFF12_COLOR_THEME = 3; + +// BIFF12 diagonal borders +const sal_uInt8 BIFF12_BORDER_DIAG_TLBR = 0x01; /// Top-left to bottom-right. +const sal_uInt8 BIFF12_BORDER_DIAG_BLTR = 0x02; /// Bottom-left to top-right. + +// BIFF12 gradient fill +const sal_Int32 BIFF12_FILL_GRADIENT = 40; + +// BIFF12 XF flags +const sal_uInt32 BIFF12_XF_WRAPTEXT = 0x00400000; +const sal_uInt32 BIFF12_XF_JUSTLASTLINE = 0x00800000; +const sal_uInt32 BIFF12_XF_SHRINK = 0x01000000; +const sal_uInt32 BIFF12_XF_LOCKED = 0x10000000; +const sal_uInt32 BIFF12_XF_HIDDEN = 0x20000000; + +// BIFF12 XF attribute used flags +const sal_uInt16 BIFF12_XF_NUMFMT_USED = 0x0001; +const sal_uInt16 BIFF12_XF_FONT_USED = 0x0002; +const sal_uInt16 BIFF12_XF_ALIGN_USED = 0x0004; +const sal_uInt16 BIFF12_XF_BORDER_USED = 0x0008; +const sal_uInt16 BIFF12_XF_AREA_USED = 0x0010; +const sal_uInt16 BIFF12_XF_PROT_USED = 0x0020; + +// BIFF12 DXF constants +const sal_uInt16 BIFF12_DXF_FILL_PATTERN = 0; +const sal_uInt16 BIFF12_DXF_FILL_FGCOLOR = 1; +const sal_uInt16 BIFF12_DXF_FILL_BGCOLOR = 2; +const sal_uInt16 BIFF12_DXF_FILL_GRADIENT = 3; +const sal_uInt16 BIFF12_DXF_FILL_STOP = 4; +const sal_uInt16 BIFF12_DXF_FONT_COLOR = 5; +const sal_uInt16 BIFF12_DXF_BORDER_TOP = 6; +const sal_uInt16 BIFF12_DXF_BORDER_BOTTOM = 7; +const sal_uInt16 BIFF12_DXF_BORDER_LEFT = 8; +const sal_uInt16 BIFF12_DXF_BORDER_RIGHT = 9; +const sal_uInt16 BIFF12_DXF_BORDER_DIAG = 10; +const sal_uInt16 BIFF12_DXF_BORDER_VERT = 11; +const sal_uInt16 BIFF12_DXF_BORDER_HOR = 12; +const sal_uInt16 BIFF12_DXF_BORDER_DIAGUP = 13; +const sal_uInt16 BIFF12_DXF_BORDER_DIAGDOWN = 14; +const sal_uInt16 BIFF12_DXF_FONT_NAME = 24; +const sal_uInt16 BIFF12_DXF_FONT_WEIGHT = 25; +const sal_uInt16 BIFF12_DXF_FONT_UNDERLINE = 26; +const sal_uInt16 BIFF12_DXF_FONT_ESCAPEMENT = 27; +const sal_uInt16 BIFF12_DXF_FONT_ITALIC = 28; +const sal_uInt16 BIFF12_DXF_FONT_STRIKE = 29; +const sal_uInt16 BIFF12_DXF_FONT_OUTLINE = 30; +const sal_uInt16 BIFF12_DXF_FONT_SHADOW = 31; +const sal_uInt16 BIFF12_DXF_FONT_CONDENSE = 32; +const sal_uInt16 BIFF12_DXF_FONT_EXTEND = 33; +const sal_uInt16 BIFF12_DXF_FONT_CHARSET = 34; +const sal_uInt16 BIFF12_DXF_FONT_FAMILY = 35; +const sal_uInt16 BIFF12_DXF_FONT_HEIGHT = 36; +const sal_uInt16 BIFF12_DXF_FONT_SCHEME = 37; +const sal_uInt16 BIFF12_DXF_NUMFMT_CODE = 38; +const sal_uInt16 BIFF12_DXF_NUMFMT_ID = 41; + +// BIFF12 CELLSTYLE flags +const sal_uInt16 BIFF12_CELLSTYLE_BUILTIN = 0x0001; +const sal_uInt16 BIFF12_CELLSTYLE_HIDDEN = 0x0002; +const sal_uInt16 BIFF12_CELLSTYLE_CUSTOM = 0x0004; + +// BIFF constants ------------------------------------------------------------- // BIFF predefined color indexes const sal_uInt16 BIFF2_COLOR_BLACK = 0; /// Black (text) in BIFF2. const sal_uInt16 BIFF2_COLOR_WHITE = 1; /// White (background) in BIFF2. -// BIFF font flags, also used in OOBIN +// BIFF font flags, also used in BIFF12 const sal_uInt16 BIFF_FONTFLAG_BOLD = 0x0001; const sal_uInt16 BIFF_FONTFLAG_ITALIC = 0x0002; const sal_uInt16 BIFF_FONTFLAG_UNDERLINE = 0x0004; @@ -202,7 +196,7 @@ const sal_uInt16 BIFF_FONTFLAG_CONDENSE = 0x0040; // BIFF font weight const sal_uInt16 BIFF_FONTWEIGHT_BOLD = 450; -// BIFF font underline, also used in OOBIN +// BIFF font underline, also used in BIFF12 const sal_uInt8 BIFF_FONTUNDERL_NONE = 0; const sal_uInt8 BIFF_FONTUNDERL_SINGLE = 1; const sal_uInt8 BIFF_FONTUNDERL_DOUBLE = 2; @@ -306,14 +300,14 @@ sal_Int32 lclReadRgbColor( BinaryInputStream& rStrm ) // ============================================================================ ExcelGraphicHelper::ExcelGraphicHelper( const WorkbookHelper& rHelper ) : - GraphicHelper( rHelper.getGlobalFactory(), rHelper.getBaseFilter().getTargetFrame(), rHelper.getBaseFilter().getStorage() ), + GraphicHelper( rHelper.getBaseFilter().getComponentContext(), rHelper.getBaseFilter().getTargetFrame(), rHelper.getBaseFilter().getStorage() ), WorkbookHelper( rHelper ) { } sal_Int32 ExcelGraphicHelper::getSchemeColor( sal_Int32 nToken ) const { - if( getFilterType() == FILTER_OOX ) + if( getFilterType() == FILTER_OOXML ) return getTheme().getColorByToken( nToken ); return GraphicHelper::getSchemeColor( nToken ); } @@ -372,7 +366,7 @@ void Color::importColor( const AttributeList& rAttribs ) } } -void Color::importColor( RecordInputStream& rStrm ) +void Color::importColor( SequenceInputStream& rStrm ) { sal_uInt8 nFlags, nIndex; sal_Int16 nTint; @@ -387,18 +381,18 @@ void Color::importColor( RecordInputStream& rStrm ) switch( extractValue< sal_uInt8 >( nFlags, 1, 7 ) ) { - case OOBIN_COLOR_AUTO: + case BIFF12_COLOR_AUTO: setAuto(); rStrm.skip( 4 ); break; - case OOBIN_COLOR_INDEXED: + case BIFF12_COLOR_INDEXED: setIndexed( nIndex, fTint ); rStrm.skip( 4 ); break; - case OOBIN_COLOR_RGB: + case BIFF12_COLOR_RGB: setRgb( lclReadRgbColor( rStrm ), fTint ); break; - case OOBIN_COLOR_THEME: + case BIFF12_COLOR_THEME: setTheme( nIndex, fTint ); rStrm.skip( 4 ); break; @@ -409,12 +403,12 @@ void Color::importColor( RecordInputStream& rStrm ) } } -void Color::importColorId( RecordInputStream& rStrm ) +void Color::importColorId( SequenceInputStream& rStrm ) { setIndexed( rStrm.readInt32() ); } -void Color::importColorRgb( RecordInputStream& rStrm ) +void Color::importColorRgb( SequenceInputStream& rStrm ) { setRgb( lclReadRgbColor( rStrm ) ); } @@ -429,7 +423,7 @@ void Color::importColorRgb( BiffInputStream& rStrm ) setRgb( lclReadRgbColor( rStrm ) ); } -RecordInputStream& operator>>( RecordInputStream& rStrm, Color& orColor ) +SequenceInputStream& operator>>( SequenceInputStream& rStrm, Color& orColor ) { orColor.importColor( rStrm ); return rStrm; @@ -473,7 +467,7 @@ static const sal_Int32 spnDefColors5[] = /* 56 */ 0x1D2FBE, 0x286676, 0x004500, 0x453E01, 0x6A2813, 0x85396A, 0x4A3285, 0x424242 }; -/** Default color table for BIFF8/OOX. */ +/** Default color table for BIFF8/BIFF12/OOXML. */ static const sal_Int32 spnDefColors8[] = { /* 0 */ PALETTE_EGA_COLORS_LIGHT, @@ -499,7 +493,7 @@ ColorPalette::ColorPalette( const WorkbookHelper& rHelper ) : // default colors switch( getFilterType() ) { - case FILTER_OOX: + case FILTER_OOXML: maColors.insert( maColors.begin(), spnDefColors8, STATIC_ARRAY_END( spnDefColors8 ) ); mnAppendIndex = OOX_COLOR_USEROFFSET; break; @@ -524,7 +518,7 @@ void ColorPalette::importPaletteColor( const AttributeList& rAttribs ) appendColor( rAttribs.getIntegerHex( XML_rgb, API_RGB_WHITE ) ); } -void ColorPalette::importPaletteColor( RecordInputStream& rStrm ) +void ColorPalette::importPaletteColor( SequenceInputStream& rStrm ) { sal_Int32 nRgb = lclReadRgbColor( rStrm ); appendColor( nRgb & 0xFFFFFF ); @@ -545,6 +539,18 @@ void ColorPalette::importPalette( BiffInputStream& rStrm ) } } +void ColorPalette::importPalette( const Any& rPalette ) +{ + Sequence< sal_Int32 > rColorSeq; + if( (rPalette >>= rColorSeq) && rColorSeq.hasElements() ) + { + const sal_Int32* pnColor = rColorSeq.getConstArray(); + const sal_Int32* pnColorEnd = pnColor + rColorSeq.getLength(); + for( ; pnColor < pnColorEnd; ++pnColor ) + appendColor( *pnColor & 0xFFFFFF ); + } +} + sal_Int32 ColorPalette::getColor( sal_Int32 nPaletteIdx ) const { sal_Int32 nColor = API_RGB_TRANSPARENT; @@ -617,7 +623,7 @@ FontModel::FontModel() : { } -void FontModel::setBinScheme( sal_uInt8 nScheme ) +void FontModel::setBiff12Scheme( sal_uInt8 nScheme ) { static const sal_Int32 spnSchemes[] = { XML_none, XML_major, XML_minor }; mnScheme = STATIC_ARRAY_SELECT( spnSchemes, nScheme, XML_none ); @@ -785,7 +791,7 @@ void Font::importAttribs( sal_Int32 nElement, const AttributeList& rAttribs ) } } -void Font::importFont( RecordInputStream& rStrm ) +void Font::importFont( SequenceInputStream& rStrm ) { OSL_ENSURE( !mbDxf, "Font::importFont - unexpected conditional formatting flag" ); @@ -795,71 +801,71 @@ void Font::importFont( RecordInputStream& rStrm ) rStrm.skip( 1 ); rStrm >> maModel.maColor >> nScheme >> maModel.maName; - // equal constants in BIFF and OOBIN for weight, underline, and escapement - maModel.setBinScheme( nScheme ); + // equal constants in all BIFFs for weight, underline, and escapement + maModel.setBiff12Scheme( nScheme ); maModel.setBiffHeight( nHeight ); maModel.setBiffWeight( nWeight ); maModel.setBiffUnderline( nUnderline ); maModel.setBiffEscapement( nEscapement ); maModel.mnFamily = nFamily; maModel.mnCharSet = nCharSet; - // equal flags in BIFF and OOBIN + // equal flags in all BIFFs maModel.mbItalic = getFlag( nFlags, BIFF_FONTFLAG_ITALIC ); maModel.mbStrikeout = getFlag( nFlags, BIFF_FONTFLAG_STRIKEOUT ); maModel.mbOutline = getFlag( nFlags, BIFF_FONTFLAG_OUTLINE ); maModel.mbShadow = getFlag( nFlags, BIFF_FONTFLAG_SHADOW ); } -void Font::importDxfName( RecordInputStream& rStrm ) +void Font::importDxfName( SequenceInputStream& rStrm ) { OSL_ENSURE( mbDxf, "Font::importDxfName - missing conditional formatting flag" ); - maModel.maName = rStrm.readString( false ); + maModel.maName = BiffHelper::readString( rStrm, false ); maUsedFlags.mbColorUsed = true; } -void Font::importDxfColor( RecordInputStream& rStrm ) +void Font::importDxfColor( SequenceInputStream& rStrm ) { OSL_ENSURE( mbDxf, "Font::importDxfColor - missing conditional formatting flag" ); rStrm >> maModel.maColor; maUsedFlags.mbColorUsed = true; } -void Font::importDxfScheme( RecordInputStream& rStrm ) +void Font::importDxfScheme( SequenceInputStream& rStrm ) { OSL_ENSURE( mbDxf, "Font::importDxfScheme - missing conditional formatting flag" ); - maModel.setBinScheme( rStrm.readuInt8() ); + maModel.setBiff12Scheme( rStrm.readuInt8() ); maUsedFlags.mbSchemeUsed = true; } -void Font::importDxfHeight( RecordInputStream& rStrm ) +void Font::importDxfHeight( SequenceInputStream& rStrm ) { OSL_ENSURE( mbDxf, "Font::importDxfHeight - missing conditional formatting flag" ); maModel.setBiffHeight( rStrm.readuInt16() ); maUsedFlags.mbHeightUsed = true; } -void Font::importDxfWeight( RecordInputStream& rStrm ) +void Font::importDxfWeight( SequenceInputStream& rStrm ) { OSL_ENSURE( mbDxf, "Font::importDxfWeight - missing conditional formatting flag" ); maModel.setBiffWeight( rStrm.readuInt16() ); maUsedFlags.mbWeightUsed = true; } -void Font::importDxfUnderline( RecordInputStream& rStrm ) +void Font::importDxfUnderline( SequenceInputStream& rStrm ) { OSL_ENSURE( mbDxf, "Font::importDxfUnderline - missing conditional formatting flag" ); maModel.setBiffUnderline( rStrm.readuInt16() ); maUsedFlags.mbUnderlineUsed = true; } -void Font::importDxfEscapement( RecordInputStream& rStrm ) +void Font::importDxfEscapement( SequenceInputStream& rStrm ) { OSL_ENSURE( mbDxf, "Font::importDxfEscapement - missing conditional formatting flag" ); maModel.setBiffEscapement( rStrm.readuInt16() ); maUsedFlags.mbEscapementUsed = true; } -void Font::importDxfFlag( sal_Int32 nElement, RecordInputStream& rStrm ) +void Font::importDxfFlag( sal_Int32 nElement, SequenceInputStream& rStrm ) { OSL_ENSURE( mbDxf, "Font::importDxfFlag - missing conditional formatting flag" ); bool bFlag = rStrm.readuInt8() != 0; @@ -1039,7 +1045,8 @@ void Font::finalizeImport() // supported script types if( maUsedFlags.mbNameUsed ) { - Reference< XDevice > xDevice = getReferenceDevice(); + PropertySet aDocProps( getDocument() ); + Reference< XDevice > xDevice( aDocProps.getAnyProperty( PROP_ReferenceDevice ), UNO_QUERY ); if( xDevice.is() ) { Reference< XFont2 > xFont( xDevice->getFont( maApiData.maDesc ), UNO_QUERY ); @@ -1226,7 +1233,7 @@ AlignmentModel::AlignmentModel() : { } -void AlignmentModel::setBinHorAlign( sal_uInt8 nHorAlign ) +void AlignmentModel::setBiffHorAlign( sal_uInt8 nHorAlign ) { static const sal_Int32 spnHorAligns[] = { XML_general, XML_left, XML_center, XML_right, @@ -1234,14 +1241,14 @@ void AlignmentModel::setBinHorAlign( sal_uInt8 nHorAlign ) mnHorAlign = STATIC_ARRAY_SELECT( spnHorAligns, nHorAlign, XML_general ); } -void AlignmentModel::setBinVerAlign( sal_uInt8 nVerAlign ) +void AlignmentModel::setBiffVerAlign( sal_uInt8 nVerAlign ) { static const sal_Int32 spnVerAligns[] = { XML_top, XML_center, XML_bottom, XML_justify, XML_distributed }; mnVerAlign = STATIC_ARRAY_SELECT( spnVerAligns, nVerAlign, XML_bottom ); } -void AlignmentModel::setBinTextOrient( sal_uInt8 nTextOrient ) +void AlignmentModel::setBiffTextOrient( sal_uInt8 nTextOrient ) { static const sal_Int32 spnRotations[] = { OOX_XF_ROTATION_NONE, OOX_XF_ROTATION_STACKED, @@ -1295,49 +1302,49 @@ void Alignment::importAlignment( const AttributeList& rAttribs ) maModel.mbJustLastLine = rAttribs.getBool( XML_justifyLastLine, false ); } -void Alignment::setBinData( sal_uInt32 nFlags ) +void Alignment::setBiff12Data( sal_uInt32 nFlags ) { - maModel.setBinHorAlign( extractValue< sal_uInt8 >( nFlags, 16, 3 ) ); - maModel.setBinVerAlign( extractValue< sal_uInt8 >( nFlags, 19, 3 ) ); + maModel.setBiffHorAlign( extractValue< sal_uInt8 >( nFlags, 16, 3 ) ); + maModel.setBiffVerAlign( extractValue< sal_uInt8 >( nFlags, 19, 3 ) ); maModel.mnTextDir = extractValue< sal_Int32 >( nFlags, 26, 2 ); maModel.mnRotation = extractValue< sal_Int32 >( nFlags, 0, 8 ); maModel.mnIndent = extractValue< sal_uInt8 >( nFlags, 8, 8 ); - maModel.mbWrapText = getFlag( nFlags, OOBIN_XF_WRAPTEXT ); - maModel.mbShrink = getFlag( nFlags, OOBIN_XF_SHRINK ); - maModel.mbJustLastLine = getFlag( nFlags, OOBIN_XF_JUSTLASTLINE ); + maModel.mbWrapText = getFlag( nFlags, BIFF12_XF_WRAPTEXT ); + maModel.mbShrink = getFlag( nFlags, BIFF12_XF_SHRINK ); + maModel.mbJustLastLine = getFlag( nFlags, BIFF12_XF_JUSTLASTLINE ); } void Alignment::setBiff2Data( sal_uInt8 nFlags ) { - maModel.setBinHorAlign( extractValue< sal_uInt8 >( nFlags, 0, 3 ) ); + maModel.setBiffHorAlign( extractValue< sal_uInt8 >( nFlags, 0, 3 ) ); } void Alignment::setBiff3Data( sal_uInt16 nAlign ) { - maModel.setBinHorAlign( extractValue< sal_uInt8 >( nAlign, 0, 3 ) ); + maModel.setBiffHorAlign( extractValue< sal_uInt8 >( nAlign, 0, 3 ) ); maModel.mbWrapText = getFlag( nAlign, BIFF_XF_WRAPTEXT ); // new in BIFF3 } void Alignment::setBiff4Data( sal_uInt16 nAlign ) { - maModel.setBinHorAlign( extractValue< sal_uInt8 >( nAlign, 0, 3 ) ); - maModel.setBinVerAlign( extractValue< sal_uInt8 >( nAlign, 4, 2 ) ); // new in BIFF4 - maModel.setBinTextOrient( extractValue< sal_uInt8 >( nAlign, 6, 2 ) ); // new in BIFF4 + maModel.setBiffHorAlign( extractValue< sal_uInt8 >( nAlign, 0, 3 ) ); + maModel.setBiffVerAlign( extractValue< sal_uInt8 >( nAlign, 4, 2 ) ); // new in BIFF4 + maModel.setBiffTextOrient( extractValue< sal_uInt8 >( nAlign, 6, 2 ) ); // new in BIFF4 maModel.mbWrapText = getFlag( nAlign, BIFF_XF_WRAPTEXT ); } void Alignment::setBiff5Data( sal_uInt16 nAlign ) { - maModel.setBinHorAlign( extractValue< sal_uInt8 >( nAlign, 0, 3 ) ); - maModel.setBinVerAlign( extractValue< sal_uInt8 >( nAlign, 4, 3 ) ); - maModel.setBinTextOrient( extractValue< sal_uInt8 >( nAlign, 8, 2 ) ); + maModel.setBiffHorAlign( extractValue< sal_uInt8 >( nAlign, 0, 3 ) ); + maModel.setBiffVerAlign( extractValue< sal_uInt8 >( nAlign, 4, 3 ) ); + maModel.setBiffTextOrient( extractValue< sal_uInt8 >( nAlign, 8, 2 ) ); maModel.mbWrapText = getFlag( nAlign, BIFF_XF_WRAPTEXT ); } void Alignment::setBiff8Data( sal_uInt16 nAlign, sal_uInt16 nMiscAttrib ) { - maModel.setBinHorAlign( extractValue< sal_uInt8 >( nAlign, 0, 3 ) ); - maModel.setBinVerAlign( extractValue< sal_uInt8 >( nAlign, 4, 3 ) ); + maModel.setBiffHorAlign( extractValue< sal_uInt8 >( nAlign, 0, 3 ) ); + maModel.setBiffVerAlign( extractValue< sal_uInt8 >( nAlign, 4, 3 ) ); maModel.mnTextDir = extractValue< sal_Int32 >( nMiscAttrib, 6, 2 ); // new in BIFF8 maModel.mnRotation = extractValue< sal_Int32 >( nAlign, 8, 8 ); // new in BIFF8 maModel.mnIndent = extractValue< sal_uInt8 >( nMiscAttrib, 0, 4 ); // new in BIFF8 @@ -1375,11 +1382,11 @@ void Alignment::finalizeImport() } /* indentation: expressed as number of blocks of 3 space characters in - OOX, and as multiple of 10 points in BIFF. */ + OOXML/BIFF12, and as multiple of 10 points in BIFF8. */ sal_Int32 nIndent = 0; switch( getFilterType() ) { - case FILTER_OOX: nIndent = getUnitConverter().scaleToMm100( 3.0 * maModel.mnIndent, UNIT_SPACE ); break; + case FILTER_OOXML: nIndent = getUnitConverter().scaleToMm100( 3.0 * maModel.mnIndent, UNIT_SPACE ); break; case FILTER_BIFF: nIndent = getUnitConverter().scaleToMm100( 10.0 * maModel.mnIndent, UNIT_POINT ); break; case FILTER_UNKNOWN: break; } @@ -1459,10 +1466,10 @@ void Protection::importProtection( const AttributeList& rAttribs ) maModel.mbHidden = rAttribs.getBool( XML_hidden, false ); } -void Protection::setBinData( sal_uInt32 nFlags ) +void Protection::setBiff12Data( sal_uInt32 nFlags ) { - maModel.mbLocked = getFlag( nFlags, OOBIN_XF_LOCKED ); - maModel.mbHidden = getFlag( nFlags, OOBIN_XF_HIDDEN ); + maModel.mbLocked = getFlag( nFlags, BIFF12_XF_LOCKED ); + maModel.mbHidden = getFlag( nFlags, BIFF12_XF_HIDDEN ); } void Protection::setBiff2Data( sal_uInt8 nNumFmt ) @@ -1645,11 +1652,11 @@ void Border::importColor( sal_Int32 nElement, const AttributeList& rAttribs ) pBorderLine->maColor.importColor( rAttribs ); } -void Border::importBorder( RecordInputStream& rStrm ) +void Border::importBorder( SequenceInputStream& rStrm ) { sal_uInt8 nFlags = rStrm.readuInt8(); - maModel.mbDiagTLtoBR = getFlag( nFlags, OOBIN_BORDER_DIAG_TLBR ); - maModel.mbDiagBLtoTR = getFlag( nFlags, OOBIN_BORDER_DIAG_BLTR ); + maModel.mbDiagTLtoBR = getFlag( nFlags, BIFF12_BORDER_DIAG_TLBR ); + maModel.mbDiagBLtoTR = getFlag( nFlags, BIFF12_BORDER_DIAG_BLTR ); maModel.maTop.setBiffStyle( rStrm.readuInt16() ); rStrm >> maModel.maTop.maColor; maModel.maBottom.setBiffStyle( rStrm.readuInt16() ); @@ -1662,7 +1669,7 @@ void Border::importBorder( RecordInputStream& rStrm ) rStrm >> maModel.maDiagonal.maColor; } -void Border::importDxfBorder( sal_Int32 nElement, RecordInputStream& rStrm ) +void Border::importDxfBorder( sal_Int32 nElement, SequenceInputStream& rStrm ) { OSL_ENSURE( mbDxf, "Border::importDxfBorder - missing conditional formatting flag" ); if( BorderLineModel* pBorderLine = getBorderLine( nElement ) ) @@ -1823,7 +1830,7 @@ PatternFillModel::PatternFillModel( bool bDxf ) : maFillColor.setIndexed( OOX_COLOR_WINDOWBACK ); } -void PatternFillModel::setBinPattern( sal_Int32 nPattern ) +void PatternFillModel::setBiffPattern( sal_Int32 nPattern ) { static const sal_Int32 spnPatternIds[] = { XML_none, XML_solid, XML_mediumGray, XML_darkGray, @@ -1838,8 +1845,8 @@ void PatternFillModel::setBiffData( sal_uInt16 nPatternColor, sal_uInt16 nFillCo { maPatternColor.setIndexed( nPatternColor ); maFillColor.setIndexed( nFillColor ); - // patterns equal in BIFF and OOBIN - setBinPattern( nPattern ); + // patterns equal in all BIFFs + setBiffPattern( nPattern ); } // ---------------------------------------------------------------------------- @@ -1854,7 +1861,7 @@ GradientFillModel::GradientFillModel() : { } -void GradientFillModel::readGradient( RecordInputStream& rStrm ) +void GradientFillModel::readGradient( SequenceInputStream& rStrm ) { sal_Int32 nType; rStrm >> nType >> mfAngle >> mfLeft >> mfRight >> mfTop >> mfBottom; @@ -1862,7 +1869,7 @@ void GradientFillModel::readGradient( RecordInputStream& rStrm ) mnType = STATIC_ARRAY_SELECT( spnTypes, nType, XML_TOKEN_INVALID ); } -void GradientFillModel::readGradientStop( RecordInputStream& rStrm, bool bDxf ) +void GradientFillModel::readGradientStop( SequenceInputStream& rStrm, bool bDxf ) { Color aColor; double fPosition; @@ -1969,11 +1976,11 @@ void Fill::importColor( const AttributeList& rAttribs, double fPosition ) mxGradientModel->maColors[ fPosition ].importColor( rAttribs ); } -void Fill::importFill( RecordInputStream& rStrm ) +void Fill::importFill( SequenceInputStream& rStrm ) { OSL_ENSURE( !mbDxf, "Fill::importFill - unexpected conditional formatting flag" ); sal_Int32 nPattern = rStrm.readInt32(); - if( nPattern == OOBIN_FILL_GRADIENT ) + if( nPattern == BIFF12_FILL_GRADIENT ) { mxGradientModel.reset( new GradientFillModel ); sal_Int32 nStopCount; @@ -1986,21 +1993,21 @@ void Fill::importFill( RecordInputStream& rStrm ) else { mxPatternModel.reset( new PatternFillModel( mbDxf ) ); - mxPatternModel->setBinPattern( nPattern ); + mxPatternModel->setBiffPattern( nPattern ); rStrm >> mxPatternModel->maPatternColor >> mxPatternModel->maFillColor; } } -void Fill::importDxfPattern( RecordInputStream& rStrm ) +void Fill::importDxfPattern( SequenceInputStream& rStrm ) { OSL_ENSURE( mbDxf, "Fill::importDxfPattern - missing conditional formatting flag" ); if( !mxPatternModel ) mxPatternModel.reset( new PatternFillModel( mbDxf ) ); - mxPatternModel->setBinPattern( rStrm.readuInt8() ); + mxPatternModel->setBiffPattern( rStrm.readuInt8() ); mxPatternModel->mbPatternUsed = true; } -void Fill::importDxfFgColor( RecordInputStream& rStrm ) +void Fill::importDxfFgColor( SequenceInputStream& rStrm ) { OSL_ENSURE( mbDxf, "Fill::importDxfFgColor - missing conditional formatting flag" ); if( !mxPatternModel ) @@ -2009,7 +2016,7 @@ void Fill::importDxfFgColor( RecordInputStream& rStrm ) mxPatternModel->mbPattColorUsed = true; } -void Fill::importDxfBgColor( RecordInputStream& rStrm ) +void Fill::importDxfBgColor( SequenceInputStream& rStrm ) { OSL_ENSURE( mbDxf, "Fill::importDxfBgColor - missing conditional formatting flag" ); if( !mxPatternModel ) @@ -2018,7 +2025,7 @@ void Fill::importDxfBgColor( RecordInputStream& rStrm ) mxPatternModel->mbFillColorUsed = true; } -void Fill::importDxfGradient( RecordInputStream& rStrm ) +void Fill::importDxfGradient( SequenceInputStream& rStrm ) { OSL_ENSURE( mbDxf, "Fill::importDxfGradient - missing conditional formatting flag" ); if( !mxGradientModel ) @@ -2026,7 +2033,7 @@ void Fill::importDxfGradient( RecordInputStream& rStrm ) mxGradientModel->readGradient( rStrm ); } -void Fill::importDxfStop( RecordInputStream& rStrm ) +void Fill::importDxfStop( SequenceInputStream& rStrm ) { OSL_ENSURE( mbDxf, "Fill::importDxfStop - missing conditional formatting flag" ); if( !mxGradientModel ) @@ -2096,7 +2103,7 @@ void Fill::finalizeImport() if( mxPatternModel.get() ) { - // finalize the OOX data struct + // finalize the OOXML data struct PatternFillModel& rModel = *mxPatternModel; if( mbDxf ) { @@ -2248,7 +2255,7 @@ void Xf::importProtection( const AttributeList& rAttribs ) maProtection.importProtection( rAttribs ); } -void Xf::importXf( RecordInputStream& rStrm, bool bCellXf ) +void Xf::importXf( SequenceInputStream& rStrm, bool bCellXf ) { maModel.mbCellXf = bCellXf; maModel.mnStyleXfId = rStrm.readuInt16(); @@ -2257,16 +2264,16 @@ void Xf::importXf( RecordInputStream& rStrm, bool bCellXf ) maModel.mnFillId = rStrm.readuInt16(); maModel.mnBorderId = rStrm.readuInt16(); sal_uInt32 nFlags = rStrm.readuInt32(); - maAlignment.setBinData( nFlags ); - maProtection.setBinData( nFlags ); + maAlignment.setBiff12Data( nFlags ); + maProtection.setBiff12Data( nFlags ); // used flags, see comments in Xf::setBiffUsedFlags() sal_uInt16 nUsedFlags = rStrm.readuInt16(); - maModel.mbFontUsed = maModel.mbCellXf == getFlag( nUsedFlags, OOBIN_XF_FONT_USED ); - maModel.mbNumFmtUsed = maModel.mbCellXf == getFlag( nUsedFlags, OOBIN_XF_NUMFMT_USED ); - maModel.mbAlignUsed = maModel.mbCellXf == getFlag( nUsedFlags, OOBIN_XF_ALIGN_USED ); - maModel.mbProtUsed = maModel.mbCellXf == getFlag( nUsedFlags, OOBIN_XF_PROT_USED ); - maModel.mbBorderUsed = maModel.mbCellXf == getFlag( nUsedFlags, OOBIN_XF_BORDER_USED ); - maModel.mbAreaUsed = maModel.mbCellXf == getFlag( nUsedFlags, OOBIN_XF_AREA_USED ); + maModel.mbFontUsed = maModel.mbCellXf == getFlag( nUsedFlags, BIFF12_XF_FONT_USED ); + maModel.mbNumFmtUsed = maModel.mbCellXf == getFlag( nUsedFlags, BIFF12_XF_NUMFMT_USED ); + maModel.mbAlignUsed = maModel.mbCellXf == getFlag( nUsedFlags, BIFF12_XF_ALIGN_USED ); + maModel.mbProtUsed = maModel.mbCellXf == getFlag( nUsedFlags, BIFF12_XF_PROT_USED ); + maModel.mbBorderUsed = maModel.mbCellXf == getFlag( nUsedFlags, BIFF12_XF_BORDER_USED ); + maModel.mbAreaUsed = maModel.mbCellXf == getFlag( nUsedFlags, BIFF12_XF_AREA_USED ); } void Xf::importXf( BiffInputStream& rStrm ) @@ -2539,7 +2546,7 @@ void Dxf::importProtection( const AttributeList& rAttribs ) mxProtection->importProtection( rAttribs ); } -void Dxf::importDxf( RecordInputStream& rStrm ) +void Dxf::importDxf( SequenceInputStream& rStrm ) { sal_Int32 nNumFmtId = -1; OUString aFmtCode; @@ -2554,28 +2561,28 @@ void Dxf::importDxf( RecordInputStream& rStrm ) nRecEnd += nSubRecSize; switch( nSubRecId ) { - case OOBIN_DXF_FILL_PATTERN: createFill( false )->importDxfPattern( rStrm ); break; - case OOBIN_DXF_FILL_FGCOLOR: createFill( false )->importDxfFgColor( rStrm ); break; - case OOBIN_DXF_FILL_BGCOLOR: createFill( false )->importDxfBgColor( rStrm ); break; - case OOBIN_DXF_FILL_GRADIENT: createFill( false )->importDxfGradient( rStrm ); break; - case OOBIN_DXF_FILL_STOP: createFill( false )->importDxfStop( rStrm ); break; - case OOBIN_DXF_FONT_COLOR: createFont( false )->importDxfColor( rStrm ); break; - case OOBIN_DXF_BORDER_TOP: createBorder( false )->importDxfBorder( XLS_TOKEN( top ), rStrm ); break; - case OOBIN_DXF_BORDER_BOTTOM: createBorder( false )->importDxfBorder( XLS_TOKEN( bottom ), rStrm ); break; - case OOBIN_DXF_BORDER_LEFT: createBorder( false )->importDxfBorder( XLS_TOKEN( left ), rStrm ); break; - case OOBIN_DXF_BORDER_RIGHT: createBorder( false )->importDxfBorder( XLS_TOKEN( right ), rStrm ); break; - case OOBIN_DXF_FONT_NAME: createFont( false )->importDxfName( rStrm ); break; - case OOBIN_DXF_FONT_WEIGHT: createFont( false )->importDxfWeight( rStrm ); break; - case OOBIN_DXF_FONT_UNDERLINE: createFont( false )->importDxfUnderline( rStrm ); break; - case OOBIN_DXF_FONT_ESCAPEMENT: createFont( false )->importDxfEscapement( rStrm ); break; - case OOBIN_DXF_FONT_ITALIC: createFont( false )->importDxfFlag( XML_i, rStrm ); break; - case OOBIN_DXF_FONT_STRIKE: createFont( false )->importDxfFlag( XML_strike, rStrm ); break; - case OOBIN_DXF_FONT_OUTLINE: createFont( false )->importDxfFlag( XML_outline, rStrm ); break; - case OOBIN_DXF_FONT_SHADOW: createFont( false )->importDxfFlag( XML_shadow, rStrm ); break; - case OOBIN_DXF_FONT_HEIGHT: createFont( false )->importDxfHeight( rStrm ); break; - case OOBIN_DXF_FONT_SCHEME: createFont( false )->importDxfScheme( rStrm ); break; - case OOBIN_DXF_NUMFMT_CODE: aFmtCode = rStrm.readString( false ); break; - case OOBIN_DXF_NUMFMT_ID: nNumFmtId = rStrm.readuInt16(); break; + case BIFF12_DXF_FILL_PATTERN: createFill( false )->importDxfPattern( rStrm ); break; + case BIFF12_DXF_FILL_FGCOLOR: createFill( false )->importDxfFgColor( rStrm ); break; + case BIFF12_DXF_FILL_BGCOLOR: createFill( false )->importDxfBgColor( rStrm ); break; + case BIFF12_DXF_FILL_GRADIENT: createFill( false )->importDxfGradient( rStrm ); break; + case BIFF12_DXF_FILL_STOP: createFill( false )->importDxfStop( rStrm ); break; + case BIFF12_DXF_FONT_COLOR: createFont( false )->importDxfColor( rStrm ); break; + case BIFF12_DXF_BORDER_TOP: createBorder( false )->importDxfBorder( XLS_TOKEN( top ), rStrm ); break; + case BIFF12_DXF_BORDER_BOTTOM: createBorder( false )->importDxfBorder( XLS_TOKEN( bottom ), rStrm ); break; + case BIFF12_DXF_BORDER_LEFT: createBorder( false )->importDxfBorder( XLS_TOKEN( left ), rStrm ); break; + case BIFF12_DXF_BORDER_RIGHT: createBorder( false )->importDxfBorder( XLS_TOKEN( right ), rStrm ); break; + case BIFF12_DXF_FONT_NAME: createFont( false )->importDxfName( rStrm ); break; + case BIFF12_DXF_FONT_WEIGHT: createFont( false )->importDxfWeight( rStrm ); break; + case BIFF12_DXF_FONT_UNDERLINE: createFont( false )->importDxfUnderline( rStrm ); break; + case BIFF12_DXF_FONT_ESCAPEMENT: createFont( false )->importDxfEscapement( rStrm ); break; + case BIFF12_DXF_FONT_ITALIC: createFont( false )->importDxfFlag( XML_i, rStrm ); break; + case BIFF12_DXF_FONT_STRIKE: createFont( false )->importDxfFlag( XML_strike, rStrm ); break; + case BIFF12_DXF_FONT_OUTLINE: createFont( false )->importDxfFlag( XML_outline, rStrm ); break; + case BIFF12_DXF_FONT_SHADOW: createFont( false )->importDxfFlag( XML_shadow, rStrm ); break; + case BIFF12_DXF_FONT_HEIGHT: createFont( false )->importDxfHeight( rStrm ); break; + case BIFF12_DXF_FONT_SCHEME: createFont( false )->importDxfScheme( rStrm ); break; + case BIFF12_DXF_NUMFMT_CODE: aFmtCode = BiffHelper::readString( rStrm, false ); break; + case BIFF12_DXF_NUMFMT_ID: nNumFmtId = rStrm.readuInt16(); break; } rStrm.seek( nRecEnd ); } @@ -2844,16 +2851,16 @@ void CellStyle::importCellStyle( const AttributeList& rAttribs ) maModel.mbHidden = rAttribs.getBool( XML_hidden, false ); } -void CellStyle::importCellStyle( RecordInputStream& rStrm ) +void CellStyle::importCellStyle( SequenceInputStream& rStrm ) { sal_uInt16 nFlags; rStrm >> maModel.mnXfId >> nFlags; maModel.mnBuiltinId = rStrm.readInt8(); maModel.mnLevel = rStrm.readInt8(); rStrm >> maModel.maName; - maModel.mbBuiltin = getFlag( nFlags, OOBIN_CELLSTYLE_BUILTIN ); - maModel.mbCustom = getFlag( nFlags, OOBIN_CELLSTYLE_CUSTOM ); - maModel.mbHidden = getFlag( nFlags, OOBIN_CELLSTYLE_HIDDEN ); + maModel.mbBuiltin = getFlag( nFlags, BIFF12_CELLSTYLE_BUILTIN ); + maModel.mbCustom = getFlag( nFlags, BIFF12_CELLSTYLE_CUSTOM ); + maModel.mbHidden = getFlag( nFlags, BIFF12_CELLSTYLE_HIDDEN ); } void CellStyle::importStyle( BiffInputStream& rStrm ) @@ -2945,7 +2952,7 @@ CellStyleRef CellStyleBuffer::importCellStyle( const AttributeList& rAttribs ) return xCellStyle; } -CellStyleRef CellStyleBuffer::importCellStyle( RecordInputStream& rStrm ) +CellStyleRef CellStyleBuffer::importCellStyle( SequenceInputStream& rStrm ) { CellStyleRef xCellStyle( new CellStyle( *this ) ); xCellStyle->importCellStyle( rStrm ); @@ -3093,6 +3100,19 @@ OUString CellStyleBuffer::createCellStyle( const CellStyleRef& rxCellStyle ) con // ============================================================================ +AutoFormatModel::AutoFormatModel() : + mnAutoFormatId( 0 ), + mbApplyNumFmt( false ), + mbApplyFont( false ), + mbApplyAlignment( false ), + mbApplyBorder( false ), + mbApplyFill( false ), + mbApplyProtection( false ) +{ +} + +// ============================================================================ + StylesBuffer::StylesBuffer( const WorkbookHelper& rHelper ) : WorkbookHelper( rHelper ), maPalette( rHelper ), @@ -3169,17 +3189,17 @@ CellStyleRef StylesBuffer::importCellStyle( const AttributeList& rAttribs ) return maCellStyles.importCellStyle( rAttribs ); } -void StylesBuffer::importPaletteColor( RecordInputStream& rStrm ) +void StylesBuffer::importPaletteColor( SequenceInputStream& rStrm ) { maPalette.importPaletteColor( rStrm ); } -void StylesBuffer::importNumFmt( RecordInputStream& rStrm ) +void StylesBuffer::importNumFmt( SequenceInputStream& rStrm ) { maNumFmts.importNumFmt( rStrm ); } -void StylesBuffer::importCellStyle( RecordInputStream& rStrm ) +void StylesBuffer::importCellStyle( SequenceInputStream& rStrm ) { maCellStyles.importCellStyle( rStrm ); } @@ -3236,6 +3256,11 @@ void StylesBuffer::importStyle( BiffInputStream& rStrm ) maCellStyles.importStyle( rStrm ); } +void StylesBuffer::importPalette( const Any& rPalette ) +{ + maPalette.importPalette( rPalette ); +} + void StylesBuffer::finalizeImport() { // fonts first, are needed to finalize unit converter and XFs below @@ -3319,7 +3344,7 @@ bool StylesBuffer::equalBorders( sal_Int32 nBorderId1, sal_Int32 nBorderId2 ) co switch( getFilterType() ) { - case FILTER_OOX: + case FILTER_OOXML: // in OOXML, borders are assumed to be unique return false; @@ -3344,7 +3369,7 @@ bool StylesBuffer::equalFills( sal_Int32 nFillId1, sal_Int32 nFillId2 ) const switch( getFilterType() ) { - case FILTER_OOX: + case FILTER_OOXML: // in OOXML, fills are assumed to be unique return false; @@ -3444,4 +3469,3 @@ void StylesBuffer::writeStyleXfToPropertySet( PropertySet& rPropSet, sal_Int32 n } // namespace xls } // namespace oox - diff --git a/oox/source/xls/stylesfragment.cxx b/oox/source/xls/stylesfragment.cxx index 217fce443209..c890196dc518 100644 --- a/oox/source/xls/stylesfragment.cxx +++ b/oox/source/xls/stylesfragment.cxx @@ -26,23 +26,26 @@ ************************************************************************/ #include "oox/xls/stylesfragment.hxx" -#include "oox/helper/attributelist.hxx" -using ::rtl::OUString; -using ::oox::core::ContextHandlerRef; -using ::oox::core::RecordInfo; +#include "oox/helper/attributelist.hxx" namespace oox { namespace xls { // ============================================================================ -OoxIndexedColorsContext::OoxIndexedColorsContext( OoxWorkbookFragmentBase& rFragment ) : - OoxWorkbookContextBase( rFragment ) +using namespace ::oox::core; + +using ::rtl::OUString; + +// ============================================================================ + +IndexedColorsContext::IndexedColorsContext( WorkbookFragmentBase& rFragment ) : + WorkbookContextBase( rFragment ) { } -ContextHandlerRef OoxIndexedColorsContext::onCreateContext( sal_Int32 nElement, const AttributeList& rAttribs ) +ContextHandlerRef IndexedColorsContext::onCreateContext( sal_Int32 nElement, const AttributeList& rAttribs ) { switch( getCurrentElement() ) { @@ -53,12 +56,12 @@ ContextHandlerRef OoxIndexedColorsContext::onCreateContext( sal_Int32 nElement, return 0; } -ContextHandlerRef OoxIndexedColorsContext::onCreateRecordContext( sal_Int32 nRecId, RecordInputStream& rStrm ) +ContextHandlerRef IndexedColorsContext::onCreateRecordContext( sal_Int32 nRecId, SequenceInputStream& rStrm ) { switch( getCurrentElement() ) { - case OOBIN_ID_INDEXEDCOLORS: - if( nRecId == OOBIN_ID_RGBCOLOR ) getStyles().importPaletteColor( rStrm ); + case BIFF12_ID_INDEXEDCOLORS: + if( nRecId == BIFF12_ID_RGBCOLOR ) getStyles().importPaletteColor( rStrm ); break; } return 0; @@ -66,7 +69,7 @@ ContextHandlerRef OoxIndexedColorsContext::onCreateRecordContext( sal_Int32 nRec // ============================================================================ -ContextHandlerRef OoxFontContext::onCreateContext( sal_Int32 nElement, const AttributeList& rAttribs ) +ContextHandlerRef FontContext::onCreateContext( sal_Int32 nElement, const AttributeList& rAttribs ) { if( mxFont.get() ) mxFont->importAttribs( nElement, rAttribs ); @@ -75,13 +78,13 @@ ContextHandlerRef OoxFontContext::onCreateContext( sal_Int32 nElement, const Att // ============================================================================ -void OoxBorderContext::onStartElement( const AttributeList& rAttribs ) +void BorderContext::onStartElement( const AttributeList& rAttribs ) { if( mxBorder.get() && (getCurrentElement() == XLS_TOKEN( border )) ) mxBorder->importBorder( rAttribs ); } -ContextHandlerRef OoxBorderContext::onCreateContext( sal_Int32 nElement, const AttributeList& rAttribs ) +ContextHandlerRef BorderContext::onCreateContext( sal_Int32 nElement, const AttributeList& rAttribs ) { if( mxBorder.get() ) switch( getCurrentElement() ) { @@ -98,7 +101,7 @@ ContextHandlerRef OoxBorderContext::onCreateContext( sal_Int32 nElement, const A // ============================================================================ -ContextHandlerRef OoxFillContext::onCreateContext( sal_Int32 nElement, const AttributeList& rAttribs ) +ContextHandlerRef FillContext::onCreateContext( sal_Int32 nElement, const AttributeList& rAttribs ) { if( mxFill.get() ) switch( getCurrentElement() ) { @@ -133,13 +136,13 @@ ContextHandlerRef OoxFillContext::onCreateContext( sal_Int32 nElement, const Att // ============================================================================ -void OoxXfContext::onStartElement( const AttributeList& rAttribs ) +void XfContext::onStartElement( const AttributeList& rAttribs ) { if( mxXf.get() && (getCurrentElement() == XLS_TOKEN( xf )) ) mxXf->importXf( rAttribs, mbCellXf ); } -ContextHandlerRef OoxXfContext::onCreateContext( sal_Int32 nElement, const AttributeList& rAttribs ) +ContextHandlerRef XfContext::onCreateContext( sal_Int32 nElement, const AttributeList& rAttribs ) { if( mxXf.get() ) switch( getCurrentElement() ) { @@ -156,16 +159,16 @@ ContextHandlerRef OoxXfContext::onCreateContext( sal_Int32 nElement, const Attri // ============================================================================ -ContextHandlerRef OoxDxfContext::onCreateContext( sal_Int32 nElement, const AttributeList& rAttribs ) +ContextHandlerRef DxfContext::onCreateContext( sal_Int32 nElement, const AttributeList& rAttribs ) { if( mxDxf.get() ) switch( getCurrentElement() ) { case XLS_TOKEN( dxf ): switch( nElement ) { - case XLS_TOKEN( font ): return new OoxFontContext( *this, mxDxf->createFont() ); - case XLS_TOKEN( border ): return new OoxBorderContext( *this, mxDxf->createBorder() ); - case XLS_TOKEN( fill ): return new OoxFillContext( *this, mxDxf->createFill() ); + case XLS_TOKEN( font ): return new FontContext( *this, mxDxf->createFont() ); + case XLS_TOKEN( border ): return new BorderContext( *this, mxDxf->createBorder() ); + case XLS_TOKEN( fill ): return new FillContext( *this, mxDxf->createFill() ); case XLS_TOKEN( numFmt ): mxDxf->importNumFmt( rAttribs ); break; #if 0 @@ -180,14 +183,12 @@ ContextHandlerRef OoxDxfContext::onCreateContext( sal_Int32 nElement, const Attr // ============================================================================ -OoxStylesFragment::OoxStylesFragment( const WorkbookHelper& rHelper, const OUString& rFragmentPath ) : - OoxWorkbookFragmentBase( rHelper, rFragmentPath ) +StylesFragment::StylesFragment( const WorkbookHelper& rHelper, const OUString& rFragmentPath ) : + WorkbookFragmentBase( rHelper, rFragmentPath ) { } -// oox.core.ContextHandler2Helper interface ----------------------------------- - -ContextHandlerRef OoxStylesFragment::onCreateContext( sal_Int32 nElement, const AttributeList& rAttribs ) +ContextHandlerRef StylesFragment::onCreateContext( sal_Int32 nElement, const AttributeList& rAttribs ) { switch( getCurrentElement() ) { @@ -211,28 +212,28 @@ ContextHandlerRef OoxStylesFragment::onCreateContext( sal_Int32 nElement, const break; case XLS_TOKEN( colors ): - if( nElement == XLS_TOKEN( indexedColors ) ) return new OoxIndexedColorsContext( *this ); + if( nElement == XLS_TOKEN( indexedColors ) ) return new IndexedColorsContext( *this ); break; case XLS_TOKEN( numFmts ): if( nElement == XLS_TOKEN( numFmt ) ) getStyles().importNumFmt( rAttribs ); break; case XLS_TOKEN( fonts ): - if( nElement == XLS_TOKEN( font ) ) return new OoxFontContext( *this, getStyles().createFont() ); + if( nElement == XLS_TOKEN( font ) ) return new FontContext( *this, getStyles().createFont() ); break; case XLS_TOKEN( borders ): - if( nElement == XLS_TOKEN( border ) ) return new OoxBorderContext( *this, getStyles().createBorder() ); + if( nElement == XLS_TOKEN( border ) ) return new BorderContext( *this, getStyles().createBorder() ); break; case XLS_TOKEN( fills ): - if( nElement == XLS_TOKEN( fill ) ) return new OoxFillContext( *this, getStyles().createFill() ); + if( nElement == XLS_TOKEN( fill ) ) return new FillContext( *this, getStyles().createFill() ); break; case XLS_TOKEN( cellXfs ): - if( nElement == XLS_TOKEN( xf ) ) return new OoxXfContext( *this, getStyles().createCellXf(), true ); + if( nElement == XLS_TOKEN( xf ) ) return new XfContext( *this, getStyles().createCellXf(), true ); break; case XLS_TOKEN( cellStyleXfs ): - if( nElement == XLS_TOKEN( xf ) ) return new OoxXfContext( *this, getStyles().createStyleXf(), false ); + if( nElement == XLS_TOKEN( xf ) ) return new XfContext( *this, getStyles().createStyleXf(), false ); break; case XLS_TOKEN( dxfs ): - if( nElement == XLS_TOKEN( dxf ) ) return new OoxDxfContext( *this, getStyles().createDxf() ); + if( nElement == XLS_TOKEN( dxf ) ) return new DxfContext( *this, getStyles().createDxf() ); break; case XLS_TOKEN( cellStyles ): if( nElement == XLS_TOKEN( cellStyle ) ) getStyles().importCellStyle( rAttribs ); @@ -241,85 +242,83 @@ ContextHandlerRef OoxStylesFragment::onCreateContext( sal_Int32 nElement, const return 0; } -ContextHandlerRef OoxStylesFragment::onCreateRecordContext( sal_Int32 nRecId, RecordInputStream& rStrm ) +ContextHandlerRef StylesFragment::onCreateRecordContext( sal_Int32 nRecId, SequenceInputStream& rStrm ) { switch( getCurrentElement() ) { case XML_ROOT_CONTEXT: - if( nRecId == OOBIN_ID_STYLESHEET ) return this; + if( nRecId == BIFF12_ID_STYLESHEET ) return this; break; - case OOBIN_ID_STYLESHEET: + case BIFF12_ID_STYLESHEET: switch( nRecId ) { - case OOBIN_ID_COLORS: - case OOBIN_ID_NUMFMTS: - case OOBIN_ID_FONTS: - case OOBIN_ID_BORDERS: - case OOBIN_ID_FILLS: - case OOBIN_ID_CELLXFS: - case OOBIN_ID_CELLSTYLEXFS: - case OOBIN_ID_DXFS: - case OOBIN_ID_CELLSTYLES: return this; + case BIFF12_ID_COLORS: + case BIFF12_ID_NUMFMTS: + case BIFF12_ID_FONTS: + case BIFF12_ID_BORDERS: + case BIFF12_ID_FILLS: + case BIFF12_ID_CELLXFS: + case BIFF12_ID_CELLSTYLEXFS: + case BIFF12_ID_DXFS: + case BIFF12_ID_CELLSTYLES: return this; } break; - case OOBIN_ID_COLORS: - if( nRecId == OOBIN_ID_INDEXEDCOLORS ) return new OoxIndexedColorsContext( *this ); + case BIFF12_ID_COLORS: + if( nRecId == BIFF12_ID_INDEXEDCOLORS ) return new IndexedColorsContext( *this ); break; - case OOBIN_ID_NUMFMTS: - if( nRecId == OOBIN_ID_NUMFMT ) getStyles().importNumFmt( rStrm ); + case BIFF12_ID_NUMFMTS: + if( nRecId == BIFF12_ID_NUMFMT ) getStyles().importNumFmt( rStrm ); break; - case OOBIN_ID_FONTS: - if( nRecId == OOBIN_ID_FONT ) getStyles().createFont()->importFont( rStrm ); + case BIFF12_ID_FONTS: + if( nRecId == BIFF12_ID_FONT ) getStyles().createFont()->importFont( rStrm ); break; - case OOBIN_ID_BORDERS: - if( nRecId == OOBIN_ID_BORDER ) getStyles().createBorder()->importBorder( rStrm ); + case BIFF12_ID_BORDERS: + if( nRecId == BIFF12_ID_BORDER ) getStyles().createBorder()->importBorder( rStrm ); break; - case OOBIN_ID_FILLS: - if( nRecId == OOBIN_ID_FILL ) getStyles().createFill()->importFill( rStrm ); + case BIFF12_ID_FILLS: + if( nRecId == BIFF12_ID_FILL ) getStyles().createFill()->importFill( rStrm ); break; - case OOBIN_ID_CELLXFS: - if( nRecId == OOBIN_ID_XF ) getStyles().createCellXf()->importXf( rStrm, true ); + case BIFF12_ID_CELLXFS: + if( nRecId == BIFF12_ID_XF ) getStyles().createCellXf()->importXf( rStrm, true ); break; - case OOBIN_ID_CELLSTYLEXFS: - if( nRecId == OOBIN_ID_XF ) getStyles().createStyleXf()->importXf( rStrm, false ); + case BIFF12_ID_CELLSTYLEXFS: + if( nRecId == BIFF12_ID_XF ) getStyles().createStyleXf()->importXf( rStrm, false ); break; - case OOBIN_ID_DXFS: - if( nRecId == OOBIN_ID_DXF ) getStyles().createDxf()->importDxf( rStrm ); + case BIFF12_ID_DXFS: + if( nRecId == BIFF12_ID_DXF ) getStyles().createDxf()->importDxf( rStrm ); break; - case OOBIN_ID_CELLSTYLES: - if( nRecId == OOBIN_ID_CELLSTYLE ) getStyles().importCellStyle( rStrm ); + case BIFF12_ID_CELLSTYLES: + if( nRecId == BIFF12_ID_CELLSTYLE ) getStyles().importCellStyle( rStrm ); break; } return 0; } -// oox.core.FragmentHandler2 interface ---------------------------------------- - -const RecordInfo* OoxStylesFragment::getRecordInfos() const +const RecordInfo* StylesFragment::getRecordInfos() const { static const RecordInfo spRecInfos[] = { - { OOBIN_ID_BORDERS, OOBIN_ID_BORDERS + 1 }, - { OOBIN_ID_CELLSTYLES, OOBIN_ID_CELLSTYLES + 1 }, - { OOBIN_ID_CELLSTYLEXFS, OOBIN_ID_CELLSTYLEXFS + 1 }, - { OOBIN_ID_CELLXFS, OOBIN_ID_CELLXFS + 1 }, - { OOBIN_ID_COLORS, OOBIN_ID_COLORS + 1 }, - { OOBIN_ID_DXFS, OOBIN_ID_DXFS + 1 }, - { OOBIN_ID_FILLS, OOBIN_ID_FILLS + 1 }, - { OOBIN_ID_FONTS, OOBIN_ID_FONTS + 1 }, - { OOBIN_ID_INDEXEDCOLORS, OOBIN_ID_INDEXEDCOLORS + 1 }, - { OOBIN_ID_MRUCOLORS, OOBIN_ID_MRUCOLORS + 1 }, - { OOBIN_ID_NUMFMTS, OOBIN_ID_NUMFMTS + 1 }, - { OOBIN_ID_STYLESHEET, OOBIN_ID_STYLESHEET + 1 }, - { OOBIN_ID_TABLESTYLES, OOBIN_ID_TABLESTYLES + 1 }, + { BIFF12_ID_BORDERS, BIFF12_ID_BORDERS + 1 }, + { BIFF12_ID_CELLSTYLES, BIFF12_ID_CELLSTYLES + 1 }, + { BIFF12_ID_CELLSTYLEXFS, BIFF12_ID_CELLSTYLEXFS + 1 }, + { BIFF12_ID_CELLXFS, BIFF12_ID_CELLXFS + 1 }, + { BIFF12_ID_COLORS, BIFF12_ID_COLORS + 1 }, + { BIFF12_ID_DXFS, BIFF12_ID_DXFS + 1 }, + { BIFF12_ID_FILLS, BIFF12_ID_FILLS + 1 }, + { BIFF12_ID_FONTS, BIFF12_ID_FONTS + 1 }, + { BIFF12_ID_INDEXEDCOLORS, BIFF12_ID_INDEXEDCOLORS + 1 }, + { BIFF12_ID_MRUCOLORS, BIFF12_ID_MRUCOLORS + 1 }, + { BIFF12_ID_NUMFMTS, BIFF12_ID_NUMFMTS + 1 }, + { BIFF12_ID_STYLESHEET, BIFF12_ID_STYLESHEET + 1 }, + { BIFF12_ID_TABLESTYLES, BIFF12_ID_TABLESTYLES + 1 }, { -1, -1 } }; return spRecInfos; } -void OoxStylesFragment::finalizeImport() +void StylesFragment::finalizeImport() { getStyles().finalizeImport(); } @@ -328,4 +327,3 @@ void OoxStylesFragment::finalizeImport() } // namespace xls } // namespace oox - diff --git a/oox/source/xls/tablebuffer.cxx b/oox/source/xls/tablebuffer.cxx index 452df7a1171a..91fad31e6ee4 100644 --- a/oox/source/xls/tablebuffer.cxx +++ b/oox/source/xls/tablebuffer.cxx @@ -26,28 +26,26 @@ ************************************************************************/ #include "oox/xls/tablebuffer.hxx" -#include <com/sun/star/sheet/XDatabaseRanges.hpp> + #include <com/sun/star/sheet/XDatabaseRange.hpp> -#include "properties.hxx" #include "oox/helper/attributelist.hxx" -#include "oox/helper/containerhelper.hxx" +#include "oox/helper/binaryinputstream.hxx" #include "oox/helper/propertyset.hxx" -#include "oox/helper/recordinputstream.hxx" #include "oox/xls/addressconverter.hxx" -using ::rtl::OUString; -using ::com::sun::star::uno::Reference; -using ::com::sun::star::uno::Exception; -using ::com::sun::star::uno::UNO_QUERY_THROW; -using ::com::sun::star::container::XNameAccess; -using ::com::sun::star::sheet::XDatabaseRanges; -using ::com::sun::star::sheet::XDatabaseRange; - namespace oox { namespace xls { // ============================================================================ +using namespace ::com::sun::star::container; +using namespace ::com::sun::star::sheet; +using namespace ::com::sun::star::uno; + +using ::rtl::OUString; + +// ============================================================================ + TableModel::TableModel() : mnId( -1 ), mnType( XML_worksheet ), @@ -60,6 +58,7 @@ TableModel::TableModel() : Table::Table( const WorkbookHelper& rHelper ) : WorkbookHelper( rHelper ), + maAutoFilters( rHelper ), mnTokenIndex( -1 ) { } @@ -75,7 +74,7 @@ void Table::importTable( const AttributeList& rAttribs, sal_Int16 nSheet ) maModel.mnTotalsRows = rAttribs.getInteger( XML_totalsRowCount, 0 ); } -void Table::importTable( RecordInputStream& rStrm, sal_Int16 nSheet ) +void Table::importTable( SequenceInputStream& rStrm, sal_Int16 nSheet ) { BinRange aBinRange; sal_Int32 nType; @@ -90,22 +89,20 @@ void Table::importTable( RecordInputStream& rStrm, sal_Int16 nSheet ) void Table::finalizeImport() { - // validate cell range - maDestRange = maModel.maRange; - bool bValidRange = getAddressConverter().validateCellRange( maDestRange, true, true ); - // create database range - if( bValidRange && (maModel.mnId > 0) && (maModel.maDisplayName.getLength() > 0) ) try + if( (maModel.mnId > 0) && (maModel.maDisplayName.getLength() > 0) ) try { - // find an unused name - Reference< XDatabaseRanges > xDatabaseRanges = getDatabaseRanges(); - Reference< XNameAccess > xNameAccess( xDatabaseRanges, UNO_QUERY_THROW ); - OUString aName = ContainerHelper::getUnusedName( xNameAccess, maModel.maDisplayName, '_' ); - xDatabaseRanges->addNewByName( aName, maModel.maRange ); - Reference< XDatabaseRange > xDatabaseRange( xDatabaseRanges->getByName( aName ), UNO_QUERY_THROW ); + maDBRangeName = maModel.maDisplayName; + Reference< XDatabaseRange > xDatabaseRange( createDatabaseRangeObject( maDBRangeName, maModel.maRange ), UNO_SET_THROW ); + maDestRange = xDatabaseRange->getDataArea(); + + // get formula token index of the database range PropertySet aPropSet( xDatabaseRange ); if( !aPropSet.getProperty( mnTokenIndex, PROP_TokenIndex ) ) mnTokenIndex = -1; + + // filter settings + maAutoFilters.finalizeImport( xDatabaseRange ); } catch( Exception& ) { @@ -120,24 +117,19 @@ TableBuffer::TableBuffer( const WorkbookHelper& rHelper ) : { } -TableRef TableBuffer::importTable( const AttributeList& rAttribs, sal_Int16 nSheet ) +Table& TableBuffer::createTable() { - TableRef xTable( new Table( *this ) ); - xTable->importTable( rAttribs, nSheet ); - insertTable( xTable ); - return xTable; -} - -TableRef TableBuffer::importTable( RecordInputStream& rStrm, sal_Int16 nSheet ) -{ - TableRef xTable( new Table( *this ) ); - xTable->importTable( rStrm, nSheet ); - insertTable( xTable ); - return xTable; + TableVector::value_type xTable( new Table( *this ) ); + maTables.push_back( xTable ); + return *xTable; } void TableBuffer::finalizeImport() { + // map all tables by identifier and display name + for( TableVector::iterator aIt = maTables.begin(), aEnd = maTables.end(); aIt != aEnd; ++aIt ) + insertTableToMaps( *aIt ); + // finalize all valid tables maIdTables.forEachMem( &Table::finalizeImport ); } @@ -153,16 +145,16 @@ TableRef TableBuffer::getTable( const OUString& rDispName ) const // private -------------------------------------------------------------------- -void TableBuffer::insertTable( TableRef xTable ) +void TableBuffer::insertTableToMaps( const TableRef& rxTable ) { - sal_Int32 nTableId = xTable->getTableId(); - const OUString& rDispName = xTable->getDisplayName(); + sal_Int32 nTableId = rxTable->getTableId(); + const OUString& rDispName = rxTable->getDisplayName(); if( (nTableId > 0) && (rDispName.getLength() > 0) ) { - OSL_ENSURE( maIdTables.find( nTableId ) == maIdTables.end(), "TableBuffer::insertTable - multiple table identifier" ); - maIdTables[ nTableId ] = xTable; - OSL_ENSURE( maNameTables.find( rDispName ) == maNameTables.end(), "TableBuffer::insertTable - multiple table name" ); - maNameTables[ rDispName ] = xTable; + OSL_ENSURE( !maIdTables.has( nTableId ), "TableBuffer::insertTableToMaps - multiple table identifier" ); + maIdTables[ nTableId ] = rxTable; + OSL_ENSURE( !maNameTables.has( rDispName ), "TableBuffer::insertTableToMaps - multiple table name" ); + maNameTables[ rDispName ] = rxTable; } } @@ -170,4 +162,3 @@ void TableBuffer::insertTable( TableRef xTable ) } // namespace xls } // namespace oox - diff --git a/oox/source/xls/tablefragment.cxx b/oox/source/xls/tablefragment.cxx index 800a45cd9530..37503f8577fb 100644 --- a/oox/source/xls/tablefragment.cxx +++ b/oox/source/xls/tablefragment.cxx @@ -27,54 +27,75 @@ #include "oox/xls/tablefragment.hxx" -using ::rtl::OUString; -using ::oox::core::ContextHandlerRef; -using ::oox::core::RecordInfo; +#include "oox/xls/autofilterbuffer.hxx" +#include "oox/xls/autofiltercontext.hxx" +#include "oox/xls/tablebuffer.hxx" namespace oox { namespace xls { // ============================================================================ -OoxTableFragment::OoxTableFragment( const WorksheetHelper& rHelper, const OUString& rFragmentPath ) : - OoxWorksheetFragmentBase( rHelper, rFragmentPath ) +using namespace ::oox::core; + +using ::rtl::OUString; + +// ============================================================================ + +TableFragment::TableFragment( const WorksheetHelper& rHelper, const OUString& rFragmentPath ) : + WorksheetFragmentBase( rHelper, rFragmentPath ), + mrTable( getTables().createTable() ) { } -// oox.core.ContextHandler2Helper interface ----------------------------------- - -ContextHandlerRef OoxTableFragment::onCreateContext( sal_Int32 nElement, const AttributeList& rAttribs ) +ContextHandlerRef TableFragment::onCreateContext( sal_Int32 nElement, const AttributeList& rAttribs ) { switch( getCurrentElement() ) { case XML_ROOT_CONTEXT: if( nElement == XLS_TOKEN( table ) ) - mxTable = getTables().importTable( rAttribs, getSheetIndex() ); + { + mrTable.importTable( rAttribs, getSheetIndex() ); + return this; + } + break; + case XLS_TOKEN( table ): + if( nElement == XLS_TOKEN( autoFilter ) ) + return new AutoFilterContext( *this, mrTable.createAutoFilter() ); break; } return 0; } -ContextHandlerRef OoxTableFragment::onCreateRecordContext( sal_Int32 nRecId, RecordInputStream& rStrm ) +ContextHandlerRef TableFragment::onCreateRecordContext( sal_Int32 nRecId, SequenceInputStream& rStrm ) { switch( getCurrentElement() ) { case XML_ROOT_CONTEXT: - if( nRecId == OOBIN_ID_TABLE ) - mxTable = getTables().importTable( rStrm, getSheetIndex() ); + if( nRecId == BIFF12_ID_TABLE ) + { + mrTable.importTable( rStrm, getSheetIndex() ); + return this; + } + break; + case BIFF12_ID_TABLE: + if( nRecId == BIFF12_ID_AUTOFILTER ) + return new AutoFilterContext( *this, mrTable.createAutoFilter() ); break; } return 0; } -// oox.core.FragmentHandler2 interface ---------------------------------------- - -const RecordInfo* OoxTableFragment::getRecordInfos() const +const RecordInfo* TableFragment::getRecordInfos() const { static const RecordInfo spRecInfos[] = { - { OOBIN_ID_TABLE, OOBIN_ID_TABLE + 1 }, - { -1, -1 } + { BIFF12_ID_AUTOFILTER, BIFF12_ID_AUTOFILTER + 1 }, + { BIFF12_ID_CUSTOMFILTERS, BIFF12_ID_CUSTOMFILTERS + 1 }, + { BIFF12_ID_DISCRETEFILTERS, BIFF12_ID_DISCRETEFILTERS + 1 }, + { BIFF12_ID_FILTERCOLUMN, BIFF12_ID_FILTERCOLUMN + 1 }, + { BIFF12_ID_TABLE, BIFF12_ID_TABLE + 1 }, + { -1, -1 } }; return spRecInfos; } @@ -83,4 +104,3 @@ const RecordInfo* OoxTableFragment::getRecordInfos() const } // namespace xls } // namespace oox - diff --git a/oox/source/xls/themebuffer.cxx b/oox/source/xls/themebuffer.cxx index 23617287dc57..c3e016327133 100644 --- a/oox/source/xls/themebuffer.cxx +++ b/oox/source/xls/themebuffer.cxx @@ -26,16 +26,18 @@ ************************************************************************/ #include "oox/xls/themebuffer.hxx" -#include "oox/xls/stylesbuffer.hxx" -#include "tokens.hxx" -using ::oox::drawingml::ClrScheme; +#include "oox/xls/stylesbuffer.hxx" namespace oox { namespace xls { // ============================================================================ +using ::oox::drawingml::ClrScheme; + +// ============================================================================ + namespace { /** Specifies default theme fonts for a specific locale. */ @@ -91,7 +93,7 @@ ThemeBuffer::ThemeBuffer( const WorkbookHelper& rHelper ) : { switch( getFilterType() ) { - case FILTER_OOX: + case FILTER_OOXML: //! TODO: locale dependent font name mxDefFontModel->maName = CREATE_OUSTRING( "Cambria" ); mxDefFontModel->mfHeight = 11.0; @@ -119,4 +121,3 @@ sal_Int32 ThemeBuffer::getColorByToken( sal_Int32 nToken ) const } // namespace xls } // namespace oox - diff --git a/oox/source/xls/unitconverter.cxx b/oox/source/xls/unitconverter.cxx index 170a1f66f2e2..1b5f1e9b072c 100644 --- a/oox/source/xls/unitconverter.cxx +++ b/oox/source/xls/unitconverter.cxx @@ -26,30 +26,31 @@ ************************************************************************/ #include "oox/xls/unitconverter.hxx" -#include <rtl/math.hxx> + +#include <com/sun/star/awt/DeviceInfo.hpp> #include <com/sun/star/awt/FontDescriptor.hpp> #include <com/sun/star/awt/XDevice.hpp> -#include <com/sun/star/awt/DeviceInfo.hpp> #include <com/sun/star/awt/XFont.hpp> #include <com/sun/star/util/Date.hpp> #include <com/sun/star/util/DateTime.hpp> +#include <rtl/math.hxx> #include "oox/core/filterbase.hxx" +#include "oox/helper/propertyset.hxx" #include "oox/xls/stylesbuffer.hxx" -using ::rtl::OUString; -using ::com::sun::star::uno::Reference; -using ::com::sun::star::awt::FontDescriptor; -using ::com::sun::star::awt::XDevice; -using ::com::sun::star::awt::DeviceInfo; -using ::com::sun::star::awt::XFont; -using ::com::sun::star::util::Date; -using ::com::sun::star::util::DateTime; - namespace oox { namespace xls { // ============================================================================ +using namespace ::com::sun::star::awt; +using namespace ::com::sun::star::uno; +using namespace ::com::sun::star::util; + +using ::rtl::OUString; + +// ============================================================================ + namespace { const double MM100_PER_INCH = 2540.0; @@ -132,7 +133,8 @@ UnitConverter::UnitConverter( const WorkbookHelper& rHelper ) : void UnitConverter::finalizeImport() { - Reference< XDevice > xDevice = getReferenceDevice(); + PropertySet aDocProps( getDocument() ); + Reference< XDevice > xDevice( aDocProps.getAnyProperty( PROP_ReferenceDevice ), UNO_QUERY ); if( xDevice.is() ) { // get reference device metric first, needed to get character widths below @@ -255,4 +257,3 @@ double UnitConverter::getCoefficient( Unit eUnit ) const } // namespace xls } // namespace oox - diff --git a/oox/source/xls/viewsettings.cxx b/oox/source/xls/viewsettings.cxx index 05dfa7bf9f96..c9658dd41cf9 100644 --- a/oox/source/xls/viewsettings.cxx +++ b/oox/source/xls/viewsettings.cxx @@ -26,128 +26,121 @@ ************************************************************************/ #include "oox/xls/viewsettings.hxx" + #include <com/sun/star/awt/Point.hpp> #include <com/sun/star/awt/Size.hpp> #include <com/sun/star/beans/PropertyValue.hpp> -#include <com/sun/star/container/XNameContainer.hpp> #include <com/sun/star/container/XIndexContainer.hpp> +#include <com/sun/star/container/XNameContainer.hpp> #include <com/sun/star/document/XViewDataSupplier.hpp> -#include <com/sun/star/text/WritingMode2.hpp> #include <comphelper/mediadescriptor.hxx> -#include "properties.hxx" +#include "oox/core/filterbase.hxx" #include "oox/helper/attributelist.hxx" #include "oox/helper/containerhelper.hxx" #include "oox/helper/propertymap.hxx" #include "oox/helper/propertyset.hxx" -#include "oox/helper/recordinputstream.hxx" -#include "oox/core/filterbase.hxx" #include "oox/xls/addressconverter.hxx" #include "oox/xls/biffinputstream.hxx" #include "oox/xls/unitconverter.hxx" #include "oox/xls/workbooksettings.hxx" #include "oox/xls/worksheetbuffer.hxx" -using ::rtl::OUString; -using ::com::sun::star::awt::Point; -using ::com::sun::star::awt::Size; -using ::com::sun::star::container::XNameContainer; -using ::com::sun::star::container::XIndexContainer; -using ::com::sun::star::container::XIndexAccess; -using ::com::sun::star::document::XViewDataSupplier; -using ::com::sun::star::table::CellAddress; -using ::com::sun::star::table::CellRangeAddress; -using ::com::sun::star::uno::Any; -using ::com::sun::star::uno::Exception; -using ::com::sun::star::uno::Reference; -using ::com::sun::star::uno::Sequence; -using ::com::sun::star::uno::UNO_QUERY_THROW; -using ::oox::core::FilterBase; - namespace oox { namespace xls { // ============================================================================ +using namespace ::com::sun::star::awt; +using namespace ::com::sun::star::container; +using namespace ::com::sun::star::document; +using namespace ::com::sun::star::table; +using namespace ::com::sun::star::uno; + +using ::oox::core::FilterBase; +using ::rtl::OUString; + +// ============================================================================ + namespace { -const sal_Int32 OOX_BOOKVIEW_TABBARRATIO_DEF = 600; /// Default tabbar ratio. -const sal_Int32 OOX_SHEETVIEW_NORMALZOOM_DEF = 100; /// Default zoom for normal view. -const sal_Int32 OOX_SHEETVIEW_SHEETLAYZOOM_DEF = 60; /// Default zoom for pagebreak preview. -const sal_Int32 OOX_SHEETVIEW_PAGELAYZOOM_DEF = 100; /// Default zoom for page layout view. - -const sal_uInt8 OOBIN_PANE_FROZEN = 0x01; -const sal_uInt8 OOBIN_PANE_FROZENNOSPLIT = 0x02; - -const sal_uInt16 OOBIN_SHEETVIEW_WINPROTECTED = 0x0001; -const sal_uInt16 OOBIN_SHEETVIEW_SHOWFORMULAS = 0x0002; -const sal_uInt16 OOBIN_SHEETVIEW_SHOWGRID = 0x0004; -const sal_uInt16 OOBIN_SHEETVIEW_SHOWHEADINGS = 0x0008; -const sal_uInt16 OOBIN_SHEETVIEW_SHOWZEROS = 0x0010; -const sal_uInt16 OOBIN_SHEETVIEW_RIGHTTOLEFT = 0x0020; -const sal_uInt16 OOBIN_SHEETVIEW_SELECTED = 0x0040; -const sal_uInt16 OOBIN_SHEETVIEW_SHOWRULER = 0x0080; -const sal_uInt16 OOBIN_SHEETVIEW_SHOWOUTLINE = 0x0100; -const sal_uInt16 OOBIN_SHEETVIEW_DEFGRIDCOLOR = 0x0200; -const sal_uInt16 OOBIN_SHEETVIEW_SHOWWHITESPACE = 0x0400; - -const sal_uInt16 OOBIN_CHARTSHEETVIEW_SELECTED = 0x0001; -const sal_uInt16 OOBIN_CHARTSHEETVIEW_ZOOMTOFIT = 0x0002; - -const sal_uInt8 OOBIN_WBVIEW_HIDDEN = 0x01; -const sal_uInt8 OOBIN_WBVIEW_MINIMIZED = 0x02; -const sal_uInt8 OOBIN_WBVIEW_SHOWHORSCROLL = 0x08; -const sal_uInt8 OOBIN_WBVIEW_SHOWVERSCROLL = 0x10; -const sal_uInt8 OOBIN_WBVIEW_SHOWTABBAR = 0x20; -const sal_uInt8 OOBIN_WBVIEW_AUTOFILTERGROUP = 0x40; - -const sal_uInt8 BIFF_PANE_BOTTOMRIGHT = 0; /// Bottom-right pane. -const sal_uInt8 BIFF_PANE_TOPRIGHT = 1; /// Right, or top-right pane. -const sal_uInt8 BIFF_PANE_BOTTOMLEFT = 2; /// Bottom, or bottom-left pane. -const sal_uInt8 BIFF_PANE_TOPLEFT = 3; /// Single, top, left, or top-left pane. - -const sal_uInt16 BIFF_WINDOW1_HIDDEN = 0x0001; -const sal_uInt16 BIFF_WINDOW1_MINIMIZED = 0x0002; -const sal_uInt16 BIFF_WINDOW1_SHOWHORSCROLL = 0x0008; -const sal_uInt16 BIFF_WINDOW1_SHOWVERSCROLL = 0x0010; -const sal_uInt16 BIFF_WINDOW1_SHOWTABBAR = 0x0020; - -const sal_uInt16 BIFF_WINDOW2_SHOWFORMULAS = 0x0001; -const sal_uInt16 BIFF_WINDOW2_SHOWGRID = 0x0002; -const sal_uInt16 BIFF_WINDOW2_SHOWHEADINGS = 0x0004; -const sal_uInt16 BIFF_WINDOW2_FROZEN = 0x0008; -const sal_uInt16 BIFF_WINDOW2_SHOWZEROS = 0x0010; -const sal_uInt16 BIFF_WINDOW2_DEFGRIDCOLOR = 0x0020; -const sal_uInt16 BIFF_WINDOW2_RIGHTTOLEFT = 0x0040; -const sal_uInt16 BIFF_WINDOW2_SHOWOUTLINE = 0x0080; -const sal_uInt16 BIFF_WINDOW2_FROZENNOSPLIT = 0x0100; -const sal_uInt16 BIFF_WINDOW2_SELECTED = 0x0200; -const sal_uInt16 BIFF_WINDOW2_DISPLAYED = 0x0400; -const sal_uInt16 BIFF_WINDOW2_PAGEBREAKMODE = 0x0800; +const sal_Int32 OOX_BOOKVIEW_TABBARRATIO_DEF = 600; /// Default tabbar ratio. +const sal_Int32 OOX_SHEETVIEW_NORMALZOOM_DEF = 100; /// Default zoom for normal view. +const sal_Int32 OOX_SHEETVIEW_SHEETLAYZOOM_DEF = 60; /// Default zoom for pagebreak preview. +const sal_Int32 OOX_SHEETVIEW_PAGELAYZOOM_DEF = 100; /// Default zoom for page layout view. + +const sal_uInt8 BIFF12_PANE_FROZEN = 0x01; +const sal_uInt8 BIFF12_PANE_FROZENNOSPLIT = 0x02; + +const sal_uInt16 BIFF12_SHEETVIEW_WINPROTECTED = 0x0001; +const sal_uInt16 BIFF12_SHEETVIEW_SHOWFORMULAS = 0x0002; +const sal_uInt16 BIFF12_SHEETVIEW_SHOWGRID = 0x0004; +const sal_uInt16 BIFF12_SHEETVIEW_SHOWHEADINGS = 0x0008; +const sal_uInt16 BIFF12_SHEETVIEW_SHOWZEROS = 0x0010; +const sal_uInt16 BIFF12_SHEETVIEW_RIGHTTOLEFT = 0x0020; +const sal_uInt16 BIFF12_SHEETVIEW_SELECTED = 0x0040; +const sal_uInt16 BIFF12_SHEETVIEW_SHOWRULER = 0x0080; +const sal_uInt16 BIFF12_SHEETVIEW_SHOWOUTLINE = 0x0100; +const sal_uInt16 BIFF12_SHEETVIEW_DEFGRIDCOLOR = 0x0200; +const sal_uInt16 BIFF12_SHEETVIEW_SHOWWHITESPACE = 0x0400; + +const sal_uInt16 BIFF12_CHARTSHEETVIEW_SELECTED = 0x0001; +const sal_uInt16 BIFF12_CHARTSHEETVIEW_ZOOMTOFIT = 0x0002; + +const sal_uInt8 BIFF12_WBVIEW_HIDDEN = 0x01; +const sal_uInt8 BIFF12_WBVIEW_MINIMIZED = 0x02; +const sal_uInt8 BIFF12_WBVIEW_SHOWHORSCROLL = 0x08; +const sal_uInt8 BIFF12_WBVIEW_SHOWVERSCROLL = 0x10; +const sal_uInt8 BIFF12_WBVIEW_SHOWTABBAR = 0x20; +const sal_uInt8 BIFF12_WBVIEW_AUTOFILTERGROUP = 0x40; + +const sal_uInt8 BIFF_PANE_BOTTOMRIGHT = 0; /// Bottom-right pane. +const sal_uInt8 BIFF_PANE_TOPRIGHT = 1; /// Right, or top-right pane. +const sal_uInt8 BIFF_PANE_BOTTOMLEFT = 2; /// Bottom, or bottom-left pane. +const sal_uInt8 BIFF_PANE_TOPLEFT = 3; /// Single, top, left, or top-left pane. + +const sal_uInt16 BIFF_WINDOW1_HIDDEN = 0x0001; +const sal_uInt16 BIFF_WINDOW1_MINIMIZED = 0x0002; +const sal_uInt16 BIFF_WINDOW1_SHOWHORSCROLL = 0x0008; +const sal_uInt16 BIFF_WINDOW1_SHOWVERSCROLL = 0x0010; +const sal_uInt16 BIFF_WINDOW1_SHOWTABBAR = 0x0020; + +const sal_uInt16 BIFF_WINDOW2_SHOWFORMULAS = 0x0001; +const sal_uInt16 BIFF_WINDOW2_SHOWGRID = 0x0002; +const sal_uInt16 BIFF_WINDOW2_SHOWHEADINGS = 0x0004; +const sal_uInt16 BIFF_WINDOW2_FROZEN = 0x0008; +const sal_uInt16 BIFF_WINDOW2_SHOWZEROS = 0x0010; +const sal_uInt16 BIFF_WINDOW2_DEFGRIDCOLOR = 0x0020; +const sal_uInt16 BIFF_WINDOW2_RIGHTTOLEFT = 0x0040; +const sal_uInt16 BIFF_WINDOW2_SHOWOUTLINE = 0x0080; +const sal_uInt16 BIFF_WINDOW2_FROZENNOSPLIT = 0x0100; +const sal_uInt16 BIFF_WINDOW2_SELECTED = 0x0200; +const sal_uInt16 BIFF_WINDOW2_DISPLAYED = 0x0400; +const sal_uInt16 BIFF_WINDOW2_PAGEBREAKMODE = 0x0800; // Attention: view settings in Calc do not use com.sun.star.view.DocumentZoomType! -const sal_Int16 API_ZOOMTYPE_PERCENT = 0; /// Zoom value in percent. +const sal_Int16 API_ZOOMTYPE_PERCENT = 0; /// Zoom value in percent. -const sal_Int32 API_ZOOMVALUE_MIN = 20; /// Minimum zoom in Calc. -const sal_Int32 API_ZOOMVALUE_MAX = 400; /// Maximum zoom in Calc. +const sal_Int32 API_ZOOMVALUE_MIN = 20; /// Minimum zoom in Calc. +const sal_Int32 API_ZOOMVALUE_MAX = 400; /// Maximum zoom in Calc. // no predefined constants for split mode -const sal_Int16 API_SPLITMODE_NONE = 0; /// No splits in window. -const sal_Int16 API_SPLITMODE_SPLIT = 1; /// Window is split. -const sal_Int16 API_SPLITMODE_FREEZE = 2; /// Window has frozen panes. +const sal_Int16 API_SPLITMODE_NONE = 0; /// No splits in window. +const sal_Int16 API_SPLITMODE_SPLIT = 1; /// Window is split. +const sal_Int16 API_SPLITMODE_FREEZE = 2; /// Window has frozen panes. // no predefined constants for pane idetifiers -const sal_Int16 API_SPLITPANE_TOPLEFT = 0; /// Top-left, or top pane. -const sal_Int16 API_SPLITPANE_TOPRIGHT = 1; /// Top-right pane. -const sal_Int16 API_SPLITPANE_BOTTOMLEFT = 2; /// Bottom-left, bottom, left, or single pane. -const sal_Int16 API_SPLITPANE_BOTTOMRIGHT = 3; /// Bottom-right, or right pane. +const sal_Int16 API_SPLITPANE_TOPLEFT = 0; /// Top-left, or top pane. +const sal_Int16 API_SPLITPANE_TOPRIGHT = 1; /// Top-right pane. +const sal_Int16 API_SPLITPANE_BOTTOMLEFT = 2; /// Bottom-left, bottom, left, or single pane. +const sal_Int16 API_SPLITPANE_BOTTOMRIGHT = 3; /// Bottom-right, or right pane. // ---------------------------------------------------------------------------- -/** Returns the OOXML pane identifier from the passed OOBIN or BIFF pane id. */ -sal_Int32 lclGetOoxPaneId( sal_Int32 nBinPaneId, sal_Int32 nDefaultPaneId ) +/** Returns the OOXML pane identifier from the passed BIFF pane id. */ +sal_Int32 lclGetOoxPaneId( sal_Int32 nBiffPaneId, sal_Int32 nDefaultPaneId ) { static const sal_Int32 spnPaneIds[] = { XML_bottomRight, XML_topRight, XML_bottomLeft, XML_topLeft }; - return STATIC_ARRAY_SELECT( spnPaneIds, nBinPaneId, nDefaultPaneId ); + return STATIC_ARRAY_SELECT( spnPaneIds, nBiffPaneId, nDefaultPaneId ); } } // namespace @@ -295,7 +288,7 @@ void SheetViewSettings::importChartSheetView( const AttributeList& rAttribs ) rModel.mbZoomToFit = rAttribs.getBool( XML_zoomToFit, false ); } -void SheetViewSettings::importSheetView( RecordInputStream& rStrm ) +void SheetViewSettings::importSheetView( SequenceInputStream& rStrm ) { SheetViewModel& rModel = *createSheetView(); sal_uInt16 nFlags; @@ -312,17 +305,17 @@ void SheetViewSettings::importSheetView( RecordInputStream& rStrm ) rModel.maFirstPos = getAddressConverter().createValidCellAddress( aFirstPos, getSheetIndex(), false ); static const sal_Int32 spnViewTypes[] = { XML_normal, XML_pageBreakPreview, XML_pageLayout }; rModel.mnViewType = STATIC_ARRAY_SELECT( spnViewTypes, nViewType, XML_normal ); - rModel.mbSelected = getFlag( nFlags, OOBIN_SHEETVIEW_SELECTED ); - rModel.mbRightToLeft = getFlag( nFlags, OOBIN_SHEETVIEW_RIGHTTOLEFT ); - rModel.mbDefGridColor = getFlag( nFlags, OOBIN_SHEETVIEW_DEFGRIDCOLOR ); - rModel.mbShowFormulas = getFlag( nFlags, OOBIN_SHEETVIEW_SHOWFORMULAS ); - rModel.mbShowGrid = getFlag( nFlags, OOBIN_SHEETVIEW_SHOWGRID ); - rModel.mbShowHeadings = getFlag( nFlags, OOBIN_SHEETVIEW_SHOWHEADINGS ); - rModel.mbShowZeros = getFlag( nFlags, OOBIN_SHEETVIEW_SHOWZEROS ); - rModel.mbShowOutline = getFlag( nFlags, OOBIN_SHEETVIEW_SHOWOUTLINE ); + rModel.mbSelected = getFlag( nFlags, BIFF12_SHEETVIEW_SELECTED ); + rModel.mbRightToLeft = getFlag( nFlags, BIFF12_SHEETVIEW_RIGHTTOLEFT ); + rModel.mbDefGridColor = getFlag( nFlags, BIFF12_SHEETVIEW_DEFGRIDCOLOR ); + rModel.mbShowFormulas = getFlag( nFlags, BIFF12_SHEETVIEW_SHOWFORMULAS ); + rModel.mbShowGrid = getFlag( nFlags, BIFF12_SHEETVIEW_SHOWGRID ); + rModel.mbShowHeadings = getFlag( nFlags, BIFF12_SHEETVIEW_SHOWHEADINGS ); + rModel.mbShowZeros = getFlag( nFlags, BIFF12_SHEETVIEW_SHOWZEROS ); + rModel.mbShowOutline = getFlag( nFlags, BIFF12_SHEETVIEW_SHOWOUTLINE ); } -void SheetViewSettings::importPane( RecordInputStream& rStrm ) +void SheetViewSettings::importPane( SequenceInputStream& rStrm ) { OSL_ENSURE( !maSheetViews.empty(), "SheetViewSettings::importPane - missing sheet view model" ); if( !maSheetViews.empty() ) @@ -336,11 +329,11 @@ void SheetViewSettings::importPane( RecordInputStream& rStrm ) rModel.maSecondPos = getAddressConverter().createValidCellAddress( aSecondPos, getSheetIndex(), false ); rModel.mnActivePaneId = lclGetOoxPaneId( nActivePaneId, XML_topLeft ); - rModel.mnPaneState = getFlagValue( nFlags, OOBIN_PANE_FROZEN, getFlagValue( nFlags, OOBIN_PANE_FROZENNOSPLIT, XML_frozen, XML_frozenSplit ), XML_split ); + rModel.mnPaneState = getFlagValue( nFlags, BIFF12_PANE_FROZEN, getFlagValue( nFlags, BIFF12_PANE_FROZENNOSPLIT, XML_frozen, XML_frozenSplit ), XML_split ); } } -void SheetViewSettings::importSelection( RecordInputStream& rStrm ) +void SheetViewSettings::importSelection( SequenceInputStream& rStrm ) { OSL_ENSURE( !maSheetViews.empty(), "SheetViewSettings::importSelection - missing sheet view model" ); if( !maSheetViews.empty() ) @@ -360,14 +353,14 @@ void SheetViewSettings::importSelection( RecordInputStream& rStrm ) } } -void SheetViewSettings::importChartSheetView( RecordInputStream& rStrm ) +void SheetViewSettings::importChartSheetView( SequenceInputStream& rStrm ) { SheetViewModel& rModel = *createSheetView(); sal_uInt16 nFlags; rStrm >> nFlags >> rModel.mnCurrentZoom >> rModel.mnWorkbookViewId; - rModel.mbSelected = getFlag( nFlags, OOBIN_CHARTSHEETVIEW_SELECTED ); - rModel.mbZoomToFit = getFlag( nFlags, OOBIN_CHARTSHEETVIEW_ZOOMTOFIT ); + rModel.mbSelected = getFlag( nFlags, BIFF12_CHARTSHEETVIEW_SELECTED ); + rModel.mbZoomToFit = getFlag( nFlags, BIFF12_CHARTSHEETVIEW_ZOOMTOFIT ); } void SheetViewSettings::importWindow2( BiffInputStream& rStrm ) @@ -502,13 +495,6 @@ void SheetViewSettings::finalizeImport() xModel->mbShowOutline = true; } - // mirrored sheet (this is not a view setting in Calc) - if( xModel->mbRightToLeft ) - { - PropertySet aPropSet( getSheet() ); - aPropSet.setProperty( PROP_TableLayout, ::com::sun::star::text::WritingMode2::RL_TB ); - } - // sheet selected (active sheet must be selected) bool bSelected = xModel->mbSelected || (getSheetIndex() == getViewSettings().getActiveCalcSheet()); @@ -599,6 +585,11 @@ void SheetViewSettings::finalizeImport() getViewSettings().setSheetViewSettings( getSheetIndex(), xModel, Any( aPropMap.makePropertyValueSequence() ) ); } +bool SheetViewSettings::isSheetRightToLeft() const +{ + return !maSheetViews.empty() && maSheetViews.front()->mbRightToLeft; +} + // private -------------------------------------------------------------------- SheetViewModelRef SheetViewSettings::createSheetView() @@ -657,19 +648,19 @@ void ViewSettings::importOleSize( const AttributeList& rAttribs ) mbValidOleSize = getAddressConverter().convertToCellRange( maOleSize, aRange, 0, true, false ); } -void ViewSettings::importWorkbookView( RecordInputStream& rStrm ) +void ViewSettings::importWorkbookView( SequenceInputStream& rStrm ) { WorkbookViewModel& rModel = createWorkbookView(); sal_uInt8 nFlags; rStrm >> rModel.mnWinX >> rModel.mnWinY >> rModel.mnWinWidth >> rModel.mnWinHeight >> rModel.mnTabBarWidth >> rModel.mnFirstVisSheet >> rModel.mnActiveSheet >> nFlags; - rModel.mnVisibility = getFlagValue( nFlags, OOBIN_WBVIEW_HIDDEN, XML_hidden, XML_visible ); - rModel.mbShowTabBar = getFlag( nFlags, OOBIN_WBVIEW_SHOWTABBAR ); - rModel.mbShowHorScroll = getFlag( nFlags, OOBIN_WBVIEW_SHOWHORSCROLL ); - rModel.mbShowVerScroll = getFlag( nFlags, OOBIN_WBVIEW_SHOWVERSCROLL ); - rModel.mbMinimized = getFlag( nFlags, OOBIN_WBVIEW_MINIMIZED ); + rModel.mnVisibility = getFlagValue( nFlags, BIFF12_WBVIEW_HIDDEN, XML_hidden, XML_visible ); + rModel.mbShowTabBar = getFlag( nFlags, BIFF12_WBVIEW_SHOWTABBAR ); + rModel.mbShowHorScroll = getFlag( nFlags, BIFF12_WBVIEW_SHOWHORSCROLL ); + rModel.mbShowVerScroll = getFlag( nFlags, BIFF12_WBVIEW_SHOWVERSCROLL ); + rModel.mbMinimized = getFlag( nFlags, BIFF12_WBVIEW_MINIMIZED ); } -void ViewSettings::importOleSize( RecordInputStream& rStrm ) +void ViewSettings::importOleSize( SequenceInputStream& rStrm ) { BinRange aBinRange; rStrm >> aBinRange; diff --git a/oox/source/xls/webquerybuffer.cxx b/oox/source/xls/webquerybuffer.cxx deleted file mode 100644 index 2babebd4a8d7..000000000000 --- a/oox/source/xls/webquerybuffer.cxx +++ /dev/null @@ -1,199 +0,0 @@ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2000, 2010 Oracle and/or its affiliates. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * <http://www.openoffice.org/license.html> - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -#include "oox/xls/webquerybuffer.hxx" -#include "oox/helper/attributelist.hxx" - -#define DEBUG_OOX_WEBQUERY_BUFFER 1 - -#if DEBUG_OOX_WEBQUERY_BUFFER -#include <stdio.h> -#endif - -using ::rtl::OUString; - -namespace oox { -namespace xls { - -const sal_Int32 Connection::CONNECTION_ODBC_SOURCE = 1; -const sal_Int32 Connection::CONNECTION_DAO_SOURCE = 2; -const sal_Int32 Connection::CONNECTION_FILE_SOURCE = 3; -const sal_Int32 Connection::CONNECTION_WEBQUERY = 4; -const sal_Int32 Connection::CONNECTION_OLEDB_SOURCE = 5; -const sal_Int32 Connection::CONNECTION_TEXT_SOURCE = 6; -const sal_Int32 Connection::CONNECTION_ADO_RECORD_SET = 7; -const sal_Int32 Connection::CONNECTION_DSP = 8; - -// ============================================================================ - -WebQueryBuffer::WebQueryBuffer( const WorkbookHelper& rHelper ) : - WorkbookHelper( rHelper ) -{ - maQueryTableMap.clear(); -} - -void WebQueryBuffer::importQueryTable( const AttributeList& rAttribs ) -{ - OUString aName = rAttribs.getString( XML_name, OUString() ); - if ( !aName.getLength() ) - return; - - QueryTable aQTable; - aQTable.mnConnectionId = rAttribs.getInteger( XML_connectionId, 0 ); - - maQueryTableMap.insert( QueryTableHashMap::value_type( aName, aQTable ) ); - - // All documented attributes of queryTable: - // adjustColumnWidth (bool) - // applyAlignmentFormats (bool) - // applyBorderFormats (bool) - // applyFontFormats (bool) - // applyNumberFormats (bool) - // applyPatternFormats (bool) - // applyWidthHeightFormats (bool) - // autoFormatId (unsigned int) - // backgroundRefresh (bool) - // connectionId (unsigned int) - // disableEdit (bool) - // disableRefresh (bool) - // fillFormulas (bool) - // firstBackgroundRefresh (bool) - // growShrinkType (insertClear, insertDelete, overwriteClear) - // headers (bool) - // intermediate (bool) - // name (string) - // preserveFormatting(bool) - // refreshOnLoad (bool) - // removeDataOnSave (bool) - // rowNumbers (bool) -} - -void WebQueryBuffer::importConnection( const AttributeList& rAttribs ) -{ - if ( !rAttribs.hasAttribute( XML_id ) || !rAttribs.hasAttribute( XML_name ) ) - { - mnCurConnId = -1; - return; - } - - sal_uInt32 nId = rAttribs.getUnsigned( XML_id, 0 ); - if ( maConnections.size() < (nId + 1) ) - maConnections.resize(nId + 1); - - Connection aConn; - aConn.maName = rAttribs.getString( XML_name, OUString() ); - aConn.mnType = rAttribs.getInteger( XML_type, 0 ); - maConnections[nId] = aConn; - mnCurConnId = nId; - - // All documented attributes of connection. - // background (bool) - // credentials (integrated, none, prompt, stored) - // deleted (bool) - // description (string) - // id (unsigned int) - // interval (unsigned int) - // keepAlive (bool) - // minRefreshableVersion (unsigned byte) - // name (string) - // new (bool) - // odcFile (string) - // onlyUseConnectionFile (bool) - // reconnectionMethod (unsigned int) - // refreshedVersion (unsigned byte) - // refreshOnLoad (bool) - // saveData (bool) - // savePassword (bool) - // singleSignOnId (string) - // sourceFile (string) - // type (unsigned int) -} - -void WebQueryBuffer::importWebPr( const AttributeList& rAttribs ) -{ - if ( 0 > mnCurConnId ) - return; - - Connection& rConn = maConnections[mnCurConnId]; - rConn.mpProperties.reset( new WebProperties ); - WebProperties* pWebPr = static_cast< WebProperties* >( rConn.mpProperties.get() ); - pWebPr->maURL = rAttribs.getString( XML_url, OUString() ); - - // All available attributes: - // consecutive (bool) - // editPage (string) - // firstRow (bool) - // htmlFormat (all, none, rtf) - // htmlTables (bool) - // parsePre (bool) - // post (string) - // sourceData (bool) - // textDates (bool) - // url (string) - // xl2000 (bool) - // xl97 (bool) - // xml (bool) -} - -void WebQueryBuffer::dump() const -{ -#if DEBUG_OOX_WEBQUERY_BUFFER - fprintf(stdout, "----------------------------------------\n"); - { - using ::std::vector; - vector< Connection >::const_iterator itr = maConnections.begin(), itrEnd = maConnections.end(); - sal_Int32 nId = 0; - for (; itr != itrEnd; ++itr, ++nId) - { - if ( itr->mnType == Connection::CONNECTION_WEBQUERY ) - { - WebProperties* pWebPr = static_cast< WebProperties* >( itr->mpProperties.get() ); - fprintf(stdout, "WebQueryBuffer::dump: id = %d url = %s\n", - (int)nId, - OUStringToOString(pWebPr->maURL, RTL_TEXTENCODING_UTF8).getStr()); - } - } - } - - QueryTableHashMap::const_iterator itr = maQueryTableMap.begin(), itrEnd = maQueryTableMap.end(); - for (; itr != itrEnd; ++itr) - { - fprintf(stdout, "WebQueryBuffer::dump: name = %s connection ID = %d\n", - OUStringToOString(itr->first, RTL_TEXTENCODING_UTF8).getStr(), - (int)(itr->second.mnConnectionId)); - } - - fprintf(stdout, "----------------------------------------\n"); - fflush(stdout); -#endif -} - -// ============================================================================ - -} // namespace xls -} // namespace oox - diff --git a/oox/source/xls/workbookfragment.cxx b/oox/source/xls/workbookfragment.cxx index 6e43a32495be..dce3c8eb461e 100644 --- a/oox/source/xls/workbookfragment.cxx +++ b/oox/source/xls/workbookfragment.cxx @@ -26,14 +26,14 @@ ************************************************************************/ #include "oox/xls/workbookfragment.hxx" + #include <com/sun/star/table/CellAddress.hpp> +#include "oox/core/filterbase.hxx" +#include "oox/drawingml/themefragmenthandler.hxx" #include "oox/helper/attributelist.hxx" #include "oox/helper/progressbar.hxx" #include "oox/helper/propertyset.hxx" -#include "oox/helper/recordinputstream.hxx" #include "oox/ole/olestorage.hxx" -#include "oox/core/filterbase.hxx" -#include "oox/drawingml/themefragmenthandler.hxx" #include "oox/xls/biffinputstream.hxx" #include "oox/xls/chartsheetfragment.hxx" #include "oox/xls/connectionsfragment.hxx" @@ -50,25 +50,21 @@ #include "oox/xls/worksheetbuffer.hxx" #include "oox/xls/worksheetfragment.hxx" -using ::rtl::OUString; -using ::com::sun::star::uno::Reference; -using ::com::sun::star::uno::Exception; -using ::com::sun::star::uno::UNO_QUERY; -using ::com::sun::star::uno::UNO_QUERY_THROW; -using ::com::sun::star::uno::UNO_SET_THROW; -using ::com::sun::star::io::XInputStream; -using ::com::sun::star::table::CellAddress; -using ::oox::core::ContextHandlerRef; -using ::oox::core::FragmentHandlerRef; -using ::oox::core::RecordInfo; -using ::oox::core::Relation; -using ::oox::drawingml::ThemeFragmentHandler; - namespace oox { namespace xls { // ============================================================================ +using namespace ::com::sun::star::io; +using namespace ::com::sun::star::table; +using namespace ::com::sun::star::uno; +using namespace ::oox::core; + +using ::oox::drawingml::ThemeFragmentHandler; +using ::rtl::OUString; + +// ============================================================================ + namespace { const double PROGRESS_LENGTH_GLOBALS = 0.1; /// 10% of progress bar for globals import. @@ -77,15 +73,12 @@ const double PROGRESS_LENGTH_GLOBALS = 0.1; /// 10% of progress bar // ============================================================================ -OoxWorkbookFragment::OoxWorkbookFragment( - const WorkbookHelper& rHelper, const OUString& rFragmentPath ) : - OoxWorkbookFragmentBase( rHelper, rFragmentPath ) +WorkbookFragment::WorkbookFragment( const WorkbookHelper& rHelper, const OUString& rFragmentPath ) : + WorkbookFragmentBase( rHelper, rFragmentPath ) { } -// oox.core.ContextHandler2Helper interface ----------------------------------- - -ContextHandlerRef OoxWorkbookFragment::onCreateContext( sal_Int32 nElement, const AttributeList& rAttribs ) +ContextHandlerRef WorkbookFragment::onCreateContext( sal_Int32 nElement, const AttributeList& rAttribs ) { switch( getCurrentElement() ) { @@ -128,108 +121,102 @@ ContextHandlerRef OoxWorkbookFragment::onCreateContext( sal_Int32 nElement, cons return 0; } -void OoxWorkbookFragment::onEndElement( const OUString& rChars ) +void WorkbookFragment::onCharacters( const OUString& rChars ) { - switch( getCurrentElement() ) - { - case XLS_TOKEN( definedName ): - if( mxCurrName.get() ) mxCurrName->setFormula( rChars ); - break; - } + if( isCurrentElement( XLS_TOKEN( definedName ) ) && mxCurrName.get() ) + mxCurrName->setFormula( rChars ); } -ContextHandlerRef OoxWorkbookFragment::onCreateRecordContext( sal_Int32 nRecId, RecordInputStream& rStrm ) +ContextHandlerRef WorkbookFragment::onCreateRecordContext( sal_Int32 nRecId, SequenceInputStream& rStrm ) { switch( getCurrentElement() ) { case XML_ROOT_CONTEXT: - if( nRecId == OOBIN_ID_WORKBOOK ) return this; + if( nRecId == BIFF12_ID_WORKBOOK ) return this; break; - case OOBIN_ID_WORKBOOK: + case BIFF12_ID_WORKBOOK: switch( nRecId ) { - case OOBIN_ID_SHEETS: - case OOBIN_ID_BOOKVIEWS: - case OOBIN_ID_EXTERNALREFS: - case OOBIN_ID_PIVOTCACHES: return this; - - case OOBIN_ID_FILESHARING: getWorkbookSettings().importFileSharing( rStrm ); break; - case OOBIN_ID_WORKBOOKPR: getWorkbookSettings().importWorkbookPr( rStrm ); break; - case OOBIN_ID_CALCPR: getWorkbookSettings().importCalcPr( rStrm ); break; - case OOBIN_ID_OLESIZE: getViewSettings().importOleSize( rStrm ); break; - case OOBIN_ID_DEFINEDNAME: getDefinedNames().importDefinedName( rStrm ); break; + case BIFF12_ID_SHEETS: + case BIFF12_ID_BOOKVIEWS: + case BIFF12_ID_EXTERNALREFS: + case BIFF12_ID_PIVOTCACHES: return this; + + case BIFF12_ID_FILESHARING: getWorkbookSettings().importFileSharing( rStrm ); break; + case BIFF12_ID_WORKBOOKPR: getWorkbookSettings().importWorkbookPr( rStrm ); break; + case BIFF12_ID_CALCPR: getWorkbookSettings().importCalcPr( rStrm ); break; + case BIFF12_ID_OLESIZE: getViewSettings().importOleSize( rStrm ); break; + case BIFF12_ID_DEFINEDNAME: getDefinedNames().importDefinedName( rStrm ); break; } break; - case OOBIN_ID_SHEETS: - if( nRecId == OOBIN_ID_SHEET ) getWorksheets().importSheet( rStrm ); + case BIFF12_ID_SHEETS: + if( nRecId == BIFF12_ID_SHEET ) getWorksheets().importSheet( rStrm ); break; - case OOBIN_ID_BOOKVIEWS: - if( nRecId == OOBIN_ID_WORKBOOKVIEW ) getViewSettings().importWorkbookView( rStrm ); + case BIFF12_ID_BOOKVIEWS: + if( nRecId == BIFF12_ID_WORKBOOKVIEW ) getViewSettings().importWorkbookView( rStrm ); break; - case OOBIN_ID_EXTERNALREFS: + case BIFF12_ID_EXTERNALREFS: switch( nRecId ) { - case OOBIN_ID_EXTERNALREF: importExternalRef( rStrm ); break; - case OOBIN_ID_EXTERNALSELF: getExternalLinks().importExternalSelf( rStrm ); break; - case OOBIN_ID_EXTERNALSAME: getExternalLinks().importExternalSame( rStrm ); break; - case OOBIN_ID_EXTERNALADDIN: getExternalLinks().importExternalAddin( rStrm ); break; - case OOBIN_ID_EXTERNALSHEETS: getExternalLinks().importExternalSheets( rStrm ); break; + case BIFF12_ID_EXTERNALREF: importExternalRef( rStrm ); break; + case BIFF12_ID_EXTERNALSELF: getExternalLinks().importExternalSelf( rStrm ); break; + case BIFF12_ID_EXTERNALSAME: getExternalLinks().importExternalSame( rStrm ); break; + case BIFF12_ID_EXTERNALADDIN: getExternalLinks().importExternalAddin( rStrm ); break; + case BIFF12_ID_EXTERNALSHEETS: getExternalLinks().importExternalSheets( rStrm ); break; } break; - case OOBIN_ID_PIVOTCACHES: - if( nRecId == OOBIN_ID_PIVOTCACHE ) importPivotCache( rStrm ); + case BIFF12_ID_PIVOTCACHES: + if( nRecId == BIFF12_ID_PIVOTCACHE ) importPivotCache( rStrm ); } return 0; } -// oox.core.FragmentHandler2 interface ---------------------------------------- - -const RecordInfo* OoxWorkbookFragment::getRecordInfos() const +const RecordInfo* WorkbookFragment::getRecordInfos() const { static const RecordInfo spRecInfos[] = { - { OOBIN_ID_BOOKVIEWS, OOBIN_ID_BOOKVIEWS + 1 }, - { OOBIN_ID_EXTERNALREFS, OOBIN_ID_EXTERNALREFS + 1 }, - { OOBIN_ID_FUNCTIONGROUPS, OOBIN_ID_FUNCTIONGROUPS + 2 }, - { OOBIN_ID_PIVOTCACHE, OOBIN_ID_PIVOTCACHE + 1 }, - { OOBIN_ID_PIVOTCACHES, OOBIN_ID_PIVOTCACHES + 1 }, - { OOBIN_ID_SHEETS, OOBIN_ID_SHEETS + 1 }, - { OOBIN_ID_WORKBOOK, OOBIN_ID_WORKBOOK + 1 }, - { -1, -1 } + { BIFF12_ID_BOOKVIEWS, BIFF12_ID_BOOKVIEWS + 1 }, + { BIFF12_ID_EXTERNALREFS, BIFF12_ID_EXTERNALREFS + 1 }, + { BIFF12_ID_FUNCTIONGROUPS, BIFF12_ID_FUNCTIONGROUPS + 2 }, + { BIFF12_ID_PIVOTCACHE, BIFF12_ID_PIVOTCACHE + 1 }, + { BIFF12_ID_PIVOTCACHES, BIFF12_ID_PIVOTCACHES + 1 }, + { BIFF12_ID_SHEETS, BIFF12_ID_SHEETS + 1 }, + { BIFF12_ID_WORKBOOK, BIFF12_ID_WORKBOOK + 1 }, + { -1, -1 } }; return spRecInfos; } -void OoxWorkbookFragment::finalizeImport() +void WorkbookFragment::finalizeImport() { ISegmentProgressBarRef xGlobalSegment = getProgressBar().createSegment( PROGRESS_LENGTH_GLOBALS ); // read the theme substream - OUString aThemeFragmentPath = getFragmentPathFromFirstType( CREATE_OFFICEDOC_RELATIONSTYPE( "theme" ) ); + OUString aThemeFragmentPath = getFragmentPathFromFirstType( CREATE_OFFICEDOC_RELATION_TYPE( "theme" ) ); if( aThemeFragmentPath.getLength() > 0 ) importOoxFragment( new ThemeFragmentHandler( getFilter(), aThemeFragmentPath, getTheme() ) ); xGlobalSegment->setPosition( 0.25 ); // read the styles substream (requires finalized theme buffer) - OUString aStylesFragmentPath = getFragmentPathFromFirstType( CREATE_OFFICEDOC_RELATIONSTYPE( "styles" ) ); + OUString aStylesFragmentPath = getFragmentPathFromFirstType( CREATE_OFFICEDOC_RELATION_TYPE( "styles" ) ); if( aStylesFragmentPath.getLength() > 0 ) - importOoxFragment( new OoxStylesFragment( *this, aStylesFragmentPath ) ); + importOoxFragment( new StylesFragment( *this, aStylesFragmentPath ) ); xGlobalSegment->setPosition( 0.5 ); // read the shared string table substream (requires finalized styles buffer) - OUString aSstFragmentPath = getFragmentPathFromFirstType( CREATE_OFFICEDOC_RELATIONSTYPE( "sharedStrings" ) ); + OUString aSstFragmentPath = getFragmentPathFromFirstType( CREATE_OFFICEDOC_RELATION_TYPE( "sharedStrings" ) ); if( aSstFragmentPath.getLength() > 0 ) - importOoxFragment( new OoxSharedStringsFragment( *this, aSstFragmentPath ) ); + importOoxFragment( new SharedStringsFragment( *this, aSstFragmentPath ) ); xGlobalSegment->setPosition( 0.75 ); // read the connections substream - OUString aConnFragmentPath = getFragmentPathFromFirstType( CREATE_OFFICEDOC_RELATIONSTYPE( "connections" ) ); + OUString aConnFragmentPath = getFragmentPathFromFirstType( CREATE_OFFICEDOC_RELATION_TYPE( "connections" ) ); if( aConnFragmentPath.getLength() > 0 ) - importOoxFragment( new OoxConnectionsFragment( *this, aConnFragmentPath ) ); + importOoxFragment( new ConnectionsFragment( *this, aConnFragmentPath ) ); xGlobalSegment->setPosition( 1.0 ); /* Create fragments for all sheets, before importing them. Needed to do @@ -248,35 +235,35 @@ void OoxWorkbookFragment::finalizeImport() { // get fragment path of the sheet OUString aFragmentPath = getFragmentPathFromRelation( *pRelation ); - OSL_ENSURE( aFragmentPath.getLength() > 0, "OoxWorkbookFragment::finalizeImport - cannot access sheet fragment" ); + OSL_ENSURE( aFragmentPath.getLength() > 0, "WorkbookFragment::finalizeImport - cannot access sheet fragment" ); if( aFragmentPath.getLength() > 0 ) { - ::rtl::Reference< OoxWorksheetFragmentBase > xFragment; + ::rtl::Reference< WorksheetFragmentBase > xFragment; double fSegmentLength = getProgressBar().getFreeLength() / (nWorksheetCount - nWorksheet); ISegmentProgressBarRef xSheetSegment = getProgressBar().createSegment( fSegmentLength ); // create the fragment according to the sheet type - if( pRelation->maType == CREATE_OFFICEDOC_RELATIONSTYPE( "worksheet" ) ) + if( pRelation->maType == CREATE_OFFICEDOC_RELATION_TYPE( "worksheet" ) ) { - xFragment.set( new OoxWorksheetFragment( *this, aFragmentPath, xSheetSegment, SHEETTYPE_WORKSHEET, nCalcSheet ) ); + xFragment.set( new WorksheetFragment( *this, aFragmentPath, xSheetSegment, SHEETTYPE_WORKSHEET, nCalcSheet ) ); } - else if( pRelation->maType == CREATE_OFFICEDOC_RELATIONSTYPE( "chartsheet" ) ) + else if( pRelation->maType == CREATE_OFFICEDOC_RELATION_TYPE( "chartsheet" ) ) { - xFragment.set( new OoxChartsheetFragment( *this, aFragmentPath, xSheetSegment, nCalcSheet ) ); + xFragment.set( new ChartsheetFragment( *this, aFragmentPath, xSheetSegment, nCalcSheet ) ); } - else if( (pRelation->maType == CREATE_MSOFFICE_RELATIONSTYPE( "xlMacrosheet" )) || - (pRelation->maType == CREATE_MSOFFICE_RELATIONSTYPE( "xlIntlMacrosheet" )) ) + else if( (pRelation->maType == CREATE_MSOFFICE_RELATION_TYPE( "xlMacrosheet" )) || + (pRelation->maType == CREATE_MSOFFICE_RELATION_TYPE( "xlIntlMacrosheet" )) ) { - xFragment.set( new OoxWorksheetFragment( *this, aFragmentPath, xSheetSegment, SHEETTYPE_MACROSHEET, nCalcSheet ) ); + xFragment.set( new WorksheetFragment( *this, aFragmentPath, xSheetSegment, SHEETTYPE_MACROSHEET, nCalcSheet ) ); } - else if( pRelation->maType == CREATE_OFFICEDOC_RELATIONSTYPE( "dialogsheet" ) ) + else if( pRelation->maType == CREATE_OFFICEDOC_RELATION_TYPE( "dialogsheet" ) ) { - xFragment.set( new OoxWorksheetFragment( *this, aFragmentPath, xSheetSegment, SHEETTYPE_DIALOGSHEET, nCalcSheet ) ); + xFragment.set( new WorksheetFragment( *this, aFragmentPath, xSheetSegment, SHEETTYPE_DIALOGSHEET, nCalcSheet ) ); } // insert the fragment into the map - OSL_ENSURE( xFragment.is(), "OoxWorkbookFragment::finalizeImport - unknown sheet type" ); - OSL_ENSURE( !xFragment.is() || xFragment->isValidSheet(), "OoxWorkbookFragment::finalizeImport - missing sheet in document" ); + OSL_ENSURE( xFragment.is(), "WorkbookFragment::finalizeImport - unknown sheet type" ); + OSL_ENSURE( !xFragment.is() || xFragment->isValidSheet(), "WorkbookFragment::finalizeImport - missing sheet in document" ); if( xFragment.is() && xFragment->isValidSheet() ) aSheetFragments.push_back( xFragment.get() ); } @@ -297,7 +284,7 @@ void OoxWorkbookFragment::finalizeImport() } // open the VBA project storage - OUString aVbaFragmentPath = getFragmentPathFromFirstType( CREATE_MSOFFICE_RELATIONSTYPE( "vbaProject" ) ); + OUString aVbaFragmentPath = getFragmentPathFromFirstType( CREATE_MSOFFICE_RELATION_TYPE( "vbaProject" ) ); if( aVbaFragmentPath.getLength() > 0 ) { Reference< XInputStream > xInStrm = getBaseFilter().openInputStream( aVbaFragmentPath ); @@ -311,45 +298,45 @@ void OoxWorkbookFragment::finalizeImport() // private -------------------------------------------------------------------- -void OoxWorkbookFragment::importExternalReference( const AttributeList& rAttribs ) +void WorkbookFragment::importExternalReference( const AttributeList& rAttribs ) { if( ExternalLink* pExtLink = getExternalLinks().importExternalReference( rAttribs ).get() ) importExternalLinkFragment( *pExtLink ); } -void OoxWorkbookFragment::importDefinedName( const AttributeList& rAttribs ) +void WorkbookFragment::importDefinedName( const AttributeList& rAttribs ) { mxCurrName = getDefinedNames().importDefinedName( rAttribs ); } -void OoxWorkbookFragment::importPivotCache( const AttributeList& rAttribs ) +void WorkbookFragment::importPivotCache( const AttributeList& rAttribs ) { sal_Int32 nCacheId = rAttribs.getInteger( XML_cacheId, -1 ); OUString aRelId = rAttribs.getString( R_TOKEN( id ), OUString() ); importPivotCacheDefFragment( aRelId, nCacheId ); } -void OoxWorkbookFragment::importExternalRef( RecordInputStream& rStrm ) +void WorkbookFragment::importExternalRef( SequenceInputStream& rStrm ) { if( ExternalLink* pExtLink = getExternalLinks().importExternalRef( rStrm ).get() ) importExternalLinkFragment( *pExtLink ); } -void OoxWorkbookFragment::importPivotCache( RecordInputStream& rStrm ) +void WorkbookFragment::importPivotCache( SequenceInputStream& rStrm ) { sal_Int32 nCacheId = rStrm.readInt32(); - OUString aRelId = rStrm.readString(); + OUString aRelId = BiffHelper::readString( rStrm ); importPivotCacheDefFragment( aRelId, nCacheId ); } -void OoxWorkbookFragment::importExternalLinkFragment( ExternalLink& rExtLink ) +void WorkbookFragment::importExternalLinkFragment( ExternalLink& rExtLink ) { OUString aFragmentPath = getFragmentPathFromRelId( rExtLink.getRelId() ); if( aFragmentPath.getLength() > 0 ) - importOoxFragment( new OoxExternalLinkFragment( *this, aFragmentPath, rExtLink ) ); + importOoxFragment( new ExternalLinkFragment( *this, aFragmentPath, rExtLink ) ); } -void OoxWorkbookFragment::importPivotCacheDefFragment( const OUString& rRelId, sal_Int32 nCacheId ) +void WorkbookFragment::importPivotCacheDefFragment( const OUString& rRelId, sal_Int32 nCacheId ) { // pivot caches will be imported on demand, here we just store the fragment path in the buffer getPivotCaches().registerPivotCacheFragment( nCacheId, getFragmentPathFromRelId( rRelId ) ); @@ -431,14 +418,15 @@ bool BiffWorkbookFragment::importWorkspaceFragment() // import the workspace globals ISegmentProgressBarRef xGlobalsProgress = getProgressBar().createSegment( PROGRESS_LENGTH_GLOBALS ); bool bLoop = true; - while( bRet && bLoop && mrStrm.startNextRecord() && (mrStrm.getRecId() != BIFF_ID_EOF) ) + BiffInputStream& rStrm = getInputStream(); + while( bRet && bLoop && rStrm.startNextRecord() && (rStrm.getRecId() != BIFF_ID_EOF) ) { - switch( mrStrm.getRecId() ) + switch( rStrm.getRecId() ) { - case BIFF_ID_SHEET: rWorksheets.importSheet( mrStrm ); break; - case BIFF_ID_CODEPAGE: setCodePage( mrStrm.readuInt16() ); break; - case BIFF_ID_FILEPASS: bRet = getCodecHelper().importFilePass( mrStrm ); break; - case BIFF_ID_SHEETHEADER: mrStrm.rewindRecord(); bLoop = false; break; + case BIFF_ID_SHEET: rWorksheets.importSheet( rStrm ); break; + case BIFF_ID_CODEPAGE: setCodePage( rStrm.readuInt16() ); break; + case BIFF_ID_FILEPASS: bRet = getCodecHelper().importFilePass( rStrm ); break; + case BIFF_ID_SHEETHEADER: rStrm.rewindRecord(); bLoop = false; break; } } xGlobalsProgress->setPosition( 1.0 ); @@ -448,15 +436,15 @@ bool BiffWorkbookFragment::importWorkspaceFragment() for( sal_Int32 nWorksheet = 0, nWorksheetCount = rWorksheets.getWorksheetCount(); bNextSheet && (nWorksheet < nWorksheetCount); ++nWorksheet ) { // try to start a new sheet fragment (with leading SHEETHEADER record) - bNextSheet = mrStrm.startNextRecord() && (mrStrm.getRecId() == BIFF_ID_SHEETHEADER); + bNextSheet = rStrm.startNextRecord() && (rStrm.getRecId() == BIFF_ID_SHEETHEADER); if( bNextSheet ) { double fSegmentLength = getProgressBar().getFreeLength() / (nWorksheetCount - nWorksheet); ISegmentProgressBarRef xSheetProgress = getProgressBar().createSegment( fSegmentLength ); /* Read current sheet name (sheet substreams may not be in the same order as SHEET records are). */ - mrStrm.skip( 4 ); - OUString aSheetName = mrStrm.readByteStringUC( false, getTextEncoding() ); + rStrm.skip( 4 ); + OUString aSheetName = rStrm.readByteStringUC( false, getTextEncoding() ); sal_Int16 nCurrSheet = rWorksheets.getCalcSheetIndex( aSheetName ); // load the sheet fragment records BiffFragmentType eSheetFragment = startFragment( getBiff() ); @@ -485,27 +473,28 @@ bool BiffWorkbookFragment::importGlobalsFragment( ISegmentProgressBar& rProgress bool bRet = true; bool bLoop = true; - while( bRet && bLoop && mrStrm.startNextRecord() ) + BiffInputStream& rStrm = getInputStream(); + while( bRet && bLoop && rStrm.startNextRecord() ) { - sal_uInt16 nRecId = mrStrm.getRecId(); + sal_uInt16 nRecId = rStrm.getRecId(); bool bExtLinkRec = false; /* #i56376# BIFF5-BIFF8: If an EOF record for globals is missing, simulate it. The issue is about a document where the sheet fragment starts directly after the EXTSST record, without terminating the globals fragment with an EOF record. */ - if( isBofRecord() || (nRecId == BIFF_ID_EOF) ) + if( BiffHelper::isBofRecord( rStrm ) || (nRecId == BIFF_ID_EOF) ) { bLoop = false; } else switch( nRecId ) { // records in all BIFF versions - case BIFF_ID_CODEPAGE: setCodePage( mrStrm.readuInt16() ); break; - case BIFF_ID_DATEMODE: rWorkbookSett.importDateMode( mrStrm ); break; - case BIFF_ID_FILEPASS: bRet = getCodecHelper().importFilePass( mrStrm ); break; - case BIFF_ID_PRECISION: rWorkbookSett.importPrecision( mrStrm ); break; - case BIFF_ID_WINDOW1: rViewSett.importWindow1( mrStrm ); break; + case BIFF_ID_CODEPAGE: setCodePage( rStrm.readuInt16() ); break; + case BIFF_ID_DATEMODE: rWorkbookSett.importDateMode( rStrm ); break; + case BIFF_ID_FILEPASS: bRet = getCodecHelper().importFilePass( rStrm ); break; + case BIFF_ID_PRECISION: rWorkbookSett.importPrecision( rStrm ); break; + case BIFF_ID_WINDOW1: rViewSett.importWindow1( rStrm ); break; // BIFF specific records default: switch( getBiff() ) @@ -515,10 +504,10 @@ bool BiffWorkbookFragment::importGlobalsFragment( ISegmentProgressBar& rProgress case BIFF2_ID_DEFINEDNAME: bExtLinkRec = true; break; case BIFF2_ID_EXTERNALNAME: bExtLinkRec = true; break; case BIFF_ID_EXTERNSHEET: bExtLinkRec = true; break; - case BIFF2_ID_FONT: rStyles.importFont( mrStrm ); break; - case BIFF_ID_FONTCOLOR: rStyles.importFontColor( mrStrm ); break; - case BIFF2_ID_FORMAT: rStyles.importFormat( mrStrm ); break; - case BIFF2_ID_XF: rStyles.importXf( mrStrm ); break; + case BIFF2_ID_FONT: rStyles.importFont( rStrm ); break; + case BIFF_ID_FONTCOLOR: rStyles.importFontColor( rStrm ); break; + case BIFF2_ID_FORMAT: rStyles.importFormat( rStrm ); break; + case BIFF2_ID_XF: rStyles.importXf( rStrm ); break; } break; @@ -528,14 +517,14 @@ bool BiffWorkbookFragment::importGlobalsFragment( ISegmentProgressBar& rProgress case BIFF3_ID_DEFINEDNAME: bExtLinkRec = true; break; case BIFF3_ID_EXTERNALNAME: bExtLinkRec = true; break; case BIFF_ID_EXTERNSHEET: bExtLinkRec = true; break; - case BIFF_ID_FILESHARING: rWorkbookSett.importFileSharing( mrStrm ); break; - case BIFF3_ID_FONT: rStyles.importFont( mrStrm ); break; - case BIFF2_ID_FORMAT: rStyles.importFormat( mrStrm ); break; - case BIFF_ID_HIDEOBJ: rWorkbookSett.importHideObj( mrStrm ); break; - case BIFF_ID_PALETTE: rStyles.importPalette( mrStrm ); break; - case BIFF_ID_STYLE: rStyles.importStyle( mrStrm ); break; + case BIFF_ID_FILESHARING: rWorkbookSett.importFileSharing( rStrm ); break; + case BIFF3_ID_FONT: rStyles.importFont( rStrm ); break; + case BIFF2_ID_FORMAT: rStyles.importFormat( rStrm ); break; + case BIFF_ID_HIDEOBJ: rWorkbookSett.importHideObj( rStrm ); break; + case BIFF_ID_PALETTE: rStyles.importPalette( rStrm ); break; + case BIFF_ID_STYLE: rStyles.importStyle( rStrm ); break; case BIFF_ID_XCT: bExtLinkRec = true; break; - case BIFF3_ID_XF: rStyles.importXf( mrStrm ); break; + case BIFF3_ID_XF: rStyles.importXf( rStrm ); break; } break; @@ -545,62 +534,62 @@ bool BiffWorkbookFragment::importGlobalsFragment( ISegmentProgressBar& rProgress case BIFF3_ID_DEFINEDNAME: bExtLinkRec = true; break; case BIFF3_ID_EXTERNALNAME: bExtLinkRec = true; break; case BIFF_ID_EXTERNSHEET: bExtLinkRec = true; break; - case BIFF_ID_FILESHARING: rWorkbookSett.importFileSharing( mrStrm ); break; - case BIFF3_ID_FONT: rStyles.importFont( mrStrm ); break; - case BIFF4_ID_FORMAT: rStyles.importFormat( mrStrm ); break; - case BIFF_ID_HIDEOBJ: rWorkbookSett.importHideObj( mrStrm ); break; - case BIFF_ID_PALETTE: rStyles.importPalette( mrStrm ); break; - case BIFF_ID_STYLE: rStyles.importStyle( mrStrm ); break; + case BIFF_ID_FILESHARING: rWorkbookSett.importFileSharing( rStrm ); break; + case BIFF3_ID_FONT: rStyles.importFont( rStrm ); break; + case BIFF4_ID_FORMAT: rStyles.importFormat( rStrm ); break; + case BIFF_ID_HIDEOBJ: rWorkbookSett.importHideObj( rStrm ); break; + case BIFF_ID_PALETTE: rStyles.importPalette( rStrm ); break; + case BIFF_ID_STYLE: rStyles.importStyle( rStrm ); break; case BIFF_ID_XCT: bExtLinkRec = true; break; - case BIFF4_ID_XF: rStyles.importXf( mrStrm ); break; + case BIFF4_ID_XF: rStyles.importXf( rStrm ); break; } break; case BIFF5: switch( nRecId ) { - case BIFF_ID_BOOKBOOL: rWorkbookSett.importBookBool( mrStrm ); break; + case BIFF_ID_BOOKBOOL: rWorkbookSett.importBookBool( rStrm ); break; case BIFF_ID_CRN: bExtLinkRec = true; break; case BIFF5_ID_DEFINEDNAME: bExtLinkRec = true; break; case BIFF5_ID_EXTERNALNAME: bExtLinkRec = true; break; case BIFF_ID_EXTERNSHEET: bExtLinkRec = true; break; - case BIFF_ID_FILESHARING: rWorkbookSett.importFileSharing( mrStrm ); break; - case BIFF5_ID_FONT: rStyles.importFont( mrStrm ); break; - case BIFF4_ID_FORMAT: rStyles.importFormat( mrStrm ); break; - case BIFF_ID_HIDEOBJ: rWorkbookSett.importHideObj( mrStrm ); break; - case BIFF_ID_OLESIZE: rViewSett.importOleSize( mrStrm ); break; - case BIFF_ID_PALETTE: rStyles.importPalette( mrStrm ); break; - case BIFF_ID_PIVOTCACHE: rPivotCaches.importPivotCacheRef( mrStrm ); break; - case BIFF_ID_SHEET: rWorksheets.importSheet( mrStrm ); break; - case BIFF_ID_STYLE: rStyles.importStyle( mrStrm ); break; + case BIFF_ID_FILESHARING: rWorkbookSett.importFileSharing( rStrm ); break; + case BIFF5_ID_FONT: rStyles.importFont( rStrm ); break; + case BIFF4_ID_FORMAT: rStyles.importFormat( rStrm ); break; + case BIFF_ID_HIDEOBJ: rWorkbookSett.importHideObj( rStrm ); break; + case BIFF_ID_OLESIZE: rViewSett.importOleSize( rStrm ); break; + case BIFF_ID_PALETTE: rStyles.importPalette( rStrm ); break; + case BIFF_ID_PIVOTCACHE: rPivotCaches.importPivotCacheRef( rStrm ); break; + case BIFF_ID_SHEET: rWorksheets.importSheet( rStrm ); break; + case BIFF_ID_STYLE: rStyles.importStyle( rStrm ); break; case BIFF_ID_XCT: bExtLinkRec = true; break; - case BIFF5_ID_XF: rStyles.importXf( mrStrm ); break; + case BIFF5_ID_XF: rStyles.importXf( rStrm ); break; } break; case BIFF8: switch( nRecId ) { - case BIFF_ID_BOOKBOOL: rWorkbookSett.importBookBool( mrStrm ); break; - case BIFF_ID_CODENAME: rWorkbookSett.importCodeName( mrStrm ); break; + case BIFF_ID_BOOKBOOL: rWorkbookSett.importBookBool( rStrm ); break; + case BIFF_ID_CODENAME: rWorkbookSett.importCodeName( rStrm ); break; case BIFF_ID_CRN: bExtLinkRec = true; break; case BIFF5_ID_DEFINEDNAME: bExtLinkRec = true; break; case BIFF_ID_EXTERNALBOOK: bExtLinkRec = true; break; case BIFF5_ID_EXTERNALNAME: bExtLinkRec = true; break; case BIFF_ID_EXTERNSHEET: bExtLinkRec = true; break; - case BIFF_ID_FILESHARING: rWorkbookSett.importFileSharing( mrStrm ); break; - case BIFF5_ID_FONT: rStyles.importFont( mrStrm ); break; - case BIFF4_ID_FORMAT: rStyles.importFormat( mrStrm ); break; - case BIFF_ID_HIDEOBJ: rWorkbookSett.importHideObj( mrStrm ); break; - case BIFF_ID_OLESIZE: rViewSett.importOleSize( mrStrm ); break; - case BIFF_ID_PALETTE: rStyles.importPalette( mrStrm ); break; - case BIFF_ID_PIVOTCACHE: rPivotCaches.importPivotCacheRef( mrStrm ); break; - case BIFF_ID_SHEET: rWorksheets.importSheet( mrStrm ); break; - case BIFF_ID_SST: rSharedStrings.importSst( mrStrm ); break; - case BIFF_ID_STYLE: rStyles.importStyle( mrStrm ); break; - case BIFF_ID_USESELFS: rWorkbookSett.importUsesElfs( mrStrm ); break; + case BIFF_ID_FILESHARING: rWorkbookSett.importFileSharing( rStrm ); break; + case BIFF5_ID_FONT: rStyles.importFont( rStrm ); break; + case BIFF4_ID_FORMAT: rStyles.importFormat( rStrm ); break; + case BIFF_ID_HIDEOBJ: rWorkbookSett.importHideObj( rStrm ); break; + case BIFF_ID_OLESIZE: rViewSett.importOleSize( rStrm ); break; + case BIFF_ID_PALETTE: rStyles.importPalette( rStrm ); break; + case BIFF_ID_PIVOTCACHE: rPivotCaches.importPivotCacheRef( rStrm ); break; + case BIFF_ID_SHEET: rWorksheets.importSheet( rStrm ); break; + case BIFF_ID_SST: rSharedStrings.importSst( rStrm ); break; + case BIFF_ID_STYLE: rStyles.importStyle( rStrm ); break; + case BIFF_ID_USESELFS: rWorkbookSett.importUsesElfs( rStrm ); break; case BIFF_ID_VBAPROJECT: bHasVbaProject = true; break; case BIFF_ID_VBAPROJECTEMPTY: bEmptyVbaProject = true; break; case BIFF_ID_XCT: bExtLinkRec = true; break; - case BIFF5_ID_XF: rStyles.importXf( mrStrm ); break; + case BIFF5_ID_XF: rStyles.importXf( rStrm ); break; } break; @@ -609,7 +598,7 @@ bool BiffWorkbookFragment::importGlobalsFragment( ISegmentProgressBar& rProgress } if( bExtLinkRec ) - aExtLinkRecs.push_back( mrStrm.getRecHandle() ); + aExtLinkRecs.push_back( rStrm.getRecHandle() ); } // finalize global buffers @@ -626,16 +615,16 @@ bool BiffWorkbookFragment::importGlobalsFragment( ISegmentProgressBar& rProgress if( bRet && !aExtLinkRecs.empty() ) { // remember current stream position (the EOF record) - sal_Int64 nEofHandle = mrStrm.getRecHandle(); - // this fragment class implements import of external link records - BiffExternalLinkFragment aLinkFragment( *this, true ); + sal_Int64 nEofHandle = rStrm.getRecHandle(); + // context handler implementing import of external link records + BiffExternalSheetDataContext aSheetContext( *this, true ); // import all records by using their cached record handle - for( RecordHandleVec::const_iterator aIt = aExtLinkRecs.begin(), aEnd = aExtLinkRecs.end(); (aIt != aEnd) && mrStrm.startRecordByHandle( *aIt ); ++aIt ) - aLinkFragment.importRecord(); + for( RecordHandleVec::const_iterator aIt = aExtLinkRecs.begin(), aEnd = aExtLinkRecs.end(); (aIt != aEnd) && rStrm.startRecordByHandle( *aIt ); ++aIt ) + aSheetContext.importRecord( rStrm ); // finalize global buffers - aLinkFragment.finalizeImport(); + getDefinedNames().finalizeImport(); // seek back to the EOF record of the workbook globals fragment - bRet = mrStrm.startRecordByHandle( nEofHandle ); + bRet = rStrm.startRecordByHandle( nEofHandle ); } // open the VBA project storage @@ -643,8 +632,8 @@ bool BiffWorkbookFragment::importGlobalsFragment( ISegmentProgressBar& rProgress setVbaProjectStorage( getBaseFilter().openSubStorage( CREATE_OUSTRING( "_VBA_PROJECT_CUR" ), false ) ); // #i56376# missing EOF - rewind before worksheet BOF record (see above) - if( bRet && isBofRecord() ) - mrStrm.rewindRecord(); + if( bRet && BiffHelper::isBofRecord( rStrm ) ) + rStrm.rewindRecord(); rProgressBar.setPosition( 1.0 ); return bRet; @@ -673,6 +662,7 @@ bool BiffWorkbookFragment::importSheetFragment( ISegmentProgressBar& rProgressBa createBuffersPerSheet( nCalcSheet ); // preprocess some records + BiffInputStream& rStrm = getInputStream(); switch( getBiff() ) { // load the workbook globals fragment records in BIFF2-BIFF4 @@ -681,12 +671,12 @@ bool BiffWorkbookFragment::importSheetFragment( ISegmentProgressBar& rProgressBa case BIFF4: { // remember current record to seek back below - sal_Int64 nRecHandle = mrStrm.getRecHandle(); + sal_Int64 nRecHandle = rStrm.getRecHandle(); // import the global records ISegmentProgressBarRef xGlobalsProgress = rProgressBar.createSegment( PROGRESS_LENGTH_GLOBALS ); importGlobalsFragment( *xGlobalsProgress ); // rewind stream to fragment BOF record - mrStrm.startRecordByHandle( nRecHandle ); + rStrm.startRecordByHandle( nRecHandle ); } break; @@ -694,11 +684,11 @@ bool BiffWorkbookFragment::importSheetFragment( ISegmentProgressBar& rProgressBa case BIFF5: { // remember current record to seek back below - sal_Int64 nRecHandle = mrStrm.getRecHandle(); + sal_Int64 nRecHandle = rStrm.getRecHandle(); // fragment implementing import of external link records - BiffExternalLinkFragment( *this, false ).importFragment(); + BiffExternalLinkFragment( *this ).importFragment(); // rewind stream to fragment BOF record - mrStrm.startRecordByHandle( nRecHandle ); + rStrm.startRecordByHandle( nRecHandle ); } break; @@ -735,4 +725,3 @@ bool BiffWorkbookFragment::importSheetFragment( ISegmentProgressBar& rProgressBa } // namespace xls } // namespace oox - diff --git a/oox/source/xls/workbookhelper.cxx b/oox/source/xls/workbookhelper.cxx index ceba5690004c..8cd2748101d7 100644 --- a/oox/source/xls/workbookhelper.cxx +++ b/oox/source/xls/workbookhelper.cxx @@ -26,31 +26,31 @@ ************************************************************************/ #include "oox/xls/workbookhelper.hxx" -#include <osl/thread.h> + #include <com/sun/star/container/XIndexAccess.hpp> #include <com/sun/star/container/XNameContainer.hpp> -#include <com/sun/star/awt/XDevice.hpp> #include <com/sun/star/document/XActionLockable.hpp> -#include <com/sun/star/table/CellAddress.hpp> -#include <com/sun/star/sheet/XSpreadsheetDocument.hpp> -#include <com/sun/star/sheet/XSpreadsheet.hpp> +#include <com/sun/star/sheet/XDatabaseRange.hpp> +#include <com/sun/star/sheet/XDatabaseRanges.hpp> #include <com/sun/star/sheet/XNamedRange.hpp> #include <com/sun/star/sheet/XNamedRanges.hpp> -#include <com/sun/star/sheet/XDatabaseRanges.hpp> -#include <com/sun/star/sheet/XExternalDocLinks.hpp> +#include <com/sun/star/sheet/XSpreadsheet.hpp> +#include <com/sun/star/sheet/XSpreadsheetDocument.hpp> #include <com/sun/star/style/XStyle.hpp> #include <com/sun/star/style/XStyleFamiliesSupplier.hpp> -#include "properties.hxx" +#include <com/sun/star/table/CellAddress.hpp> +#include <osl/thread.h> +#include "oox/drawingml/theme.hxx" #include "oox/helper/progressbar.hxx" #include "oox/helper/propertyset.hxx" -#include "oox/drawingml/theme.hxx" +#include "oox/ole/vbaproject.hxx" #include "oox/xls/addressconverter.hxx" #include "oox/xls/biffinputstream.hxx" #include "oox/xls/biffcodec.hxx" +#include "oox/xls/connectionsbuffer.hxx" #include "oox/xls/defnamesbuffer.hxx" #include "oox/xls/excelchartconverter.hxx" #include "oox/xls/excelfilter.hxx" -#include "oox/xls/excelvbaproject.hxx" #include "oox/xls/externallinkbuffer.hxx" #include "oox/xls/formulaparser.hxx" #include "oox/xls/pagesettings.hxx" @@ -63,43 +63,29 @@ #include "oox/xls/themebuffer.hxx" #include "oox/xls/unitconverter.hxx" #include "oox/xls/viewsettings.hxx" -#include "oox/xls/webquerybuffer.hxx" #include "oox/xls/workbooksettings.hxx" #include "oox/xls/worksheetbuffer.hxx" -using ::rtl::OUString; -using ::com::sun::star::uno::Any; -using ::com::sun::star::uno::Reference; -using ::com::sun::star::uno::Exception; -using ::com::sun::star::uno::UNO_QUERY; -using ::com::sun::star::uno::UNO_QUERY_THROW; -using ::com::sun::star::uno::UNO_SET_THROW; -using ::com::sun::star::container::XIndexAccess; -using ::com::sun::star::container::XNameAccess; -using ::com::sun::star::container::XNameContainer; -using ::com::sun::star::lang::XMultiServiceFactory; -using ::com::sun::star::awt::XDevice; -using ::com::sun::star::document::XActionLockable; -using ::com::sun::star::table::CellAddress; -using ::com::sun::star::table::CellRangeAddress; -using ::com::sun::star::table::XCell; -using ::com::sun::star::table::XCellRange; -using ::com::sun::star::sheet::XSpreadsheetDocument; -using ::com::sun::star::sheet::XSpreadsheet; -using ::com::sun::star::sheet::XNamedRange; -using ::com::sun::star::sheet::XNamedRanges; -using ::com::sun::star::sheet::XDatabaseRanges; -using ::com::sun::star::sheet::XExternalDocLinks; -using ::com::sun::star::style::XStyle; -using ::com::sun::star::style::XStyleFamiliesSupplier; +namespace oox { +namespace xls { + +// ============================================================================ + +using namespace ::com::sun::star::awt; +using namespace ::com::sun::star::container; +using namespace ::com::sun::star::document; +using namespace ::com::sun::star::lang; +using namespace ::com::sun::star::sheet; +using namespace ::com::sun::star::style; +using namespace ::com::sun::star::table; +using namespace ::com::sun::star::uno; + using ::oox::core::BinaryFilterBase; using ::oox::core::FilterBase; using ::oox::core::FragmentHandler; using ::oox::core::XmlFilterBase; using ::oox::drawingml::Theme; - -namespace oox { -namespace xls { +using ::rtl::OUString; // ============================================================================ @@ -145,22 +131,14 @@ public: /** Returns a reference to the source/target spreadsheet document model. */ inline Reference< XSpreadsheetDocument > getDocument() const { return mxDoc; } - /** Returns the reference device of the document. */ - Reference< XDevice > getReferenceDevice() const; - /** Returns the container for defined names from the Calc document. */ - Reference< XNamedRanges > getNamedRanges() const; - /** Returns the container for database ranges from the Calc document. */ - Reference< XDatabaseRanges > getDatabaseRanges() const; - /** Returns the container for external documents from the Calc document. */ - Reference< XExternalDocLinks > getExternalDocLinks() const; - /** Returns the container for DDE links from the Calc document. */ - Reference< XNameAccess > getDdeLinks() const; /** Returns the cell or page styles container from the Calc document. */ Reference< XNameContainer > getStyleFamily( bool bPageStyles ) const; /** 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, sal_Int32 nNameFlags ) 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 a com.sun.star.style.Style object for cells or pages. */ Reference< XStyle > createStyleObject( OUString& orStyleName, bool bPageStyle ) const; @@ -186,8 +164,8 @@ public: inline TableBuffer& getTables() const { return *mxTables; } /** Returns the scenarios collection. */ inline ScenarioBuffer& getScenarios() const { return *mxScenarios; } - /** Returns the web queries. */ - inline WebQueryBuffer& getWebQueries() const { return *mxWebQueries; } + /** Returns the collection of external data connections. */ + inline ConnectionsBuffer& getConnections() const { return *mxConnections; } /** Returns the collection of pivot caches. */ inline PivotCacheBuffer& getPivotCaches() const { return *mxPivotCaches; } /** Returns the collection of pivot tables. */ @@ -206,12 +184,12 @@ public: /** Returns the page/print settings converter. */ inline PageSettingsConverter& getPageSettingsConverter() const { return *mxPageSettConverter; } - // OOX specific ----------------------------------------------------------- + // OOXML/BIFF12 specific -------------------------------------------------- - /** Returns the base OOX filter object. */ + /** Returns the base OOXML/BIFF12 filter object. */ inline XmlFilterBase& getOoxFilter() const { return *mpOoxFilter; } - // BIFF specific ---------------------------------------------------------- + // BIFF2-BIFF8 specific --------------------------------------------------- /** Returns the base BIFF filter object. */ inline BinaryFilterBase& getBiffFilter() const { return *mpBiffFilter; } @@ -250,7 +228,7 @@ private: typedef ::std::auto_ptr< DefinedNamesBuffer > DefNamesBfrPtr; typedef ::std::auto_ptr< TableBuffer > TableBfrPtr; typedef ::std::auto_ptr< ScenarioBuffer > ScenarioBfrPtr; - typedef ::std::auto_ptr< WebQueryBuffer > WebQueryBfrPtr; + typedef ::std::auto_ptr< ConnectionsBuffer > ConnectionsBfrPtr; typedef ::std::auto_ptr< PivotCacheBuffer > PivotCacheBfrPtr; typedef ::std::auto_ptr< PivotTableBuffer > PivotTableBfrPtr; typedef ::std::auto_ptr< FormulaParser > FormulaParserPtr; @@ -284,7 +262,7 @@ private: DefNamesBfrPtr mxDefNames; /// All defined names. TableBfrPtr mxTables; /// All tables (database ranges). ScenarioBfrPtr mxScenarios; /// All scenarios. - WebQueryBfrPtr mxWebQueries; /// Web queries buffer. + ConnectionsBfrPtr mxConnections; /// All external data connections. PivotCacheBfrPtr mxPivotCaches; /// All pivot caches in the document. PivotTableBfrPtr mxPivotTables; /// All pivot tables in the document. @@ -295,11 +273,11 @@ private: ExcelChartConvPtr mxChartConverter; /// Chart object converter. PageSettConvPtr mxPageSettConverter; /// Page/print settings converter. - // OOX specific - XmlFilterBase* mpOoxFilter; /// Base OOX filter object. + // OOXML/BIFF12 specific + XmlFilterBase* mpOoxFilter; /// Base OOXML/BIFF12 filter object. - // BIFF specific - BinaryFilterBase* mpBiffFilter; /// Base BIFF filter object. + // BIFF2-BIFF8 specific + BinaryFilterBase* mpBiffFilter; /// Base BIFF2-BIFF8 filter object. BiffCodecHelperPtr mxCodecHelper; /// Encoder/decoder helper. BiffType meBiff; /// BIFF version for BIFF import/export. rtl_TextEncoding meTextEnc; /// BIFF byte string text encoding. @@ -311,7 +289,7 @@ private: WorkbookData::WorkbookData( ExcelFilter& rFilter ) : mrBaseFilter( rFilter ), mrExcelBase( rFilter ), - meFilterType( FILTER_OOX ), + meFilterType( FILTER_OOXML ), mpOoxFilter( &rFilter ), mpBiffFilter( 0 ), meBiff( BIFF_UNKNOWN ) @@ -342,46 +320,6 @@ WorkbookData::~WorkbookData() // document model ------------------------------------------------------------- -Reference< XDevice > WorkbookData::getReferenceDevice() const -{ - PropertySet aPropSet( mxDoc ); - Reference< XDevice > xDevice; - aPropSet.getProperty( xDevice, PROP_ReferenceDevice ); - return xDevice; -} - -Reference< XNamedRanges > WorkbookData::getNamedRanges() const -{ - PropertySet aPropSet( mxDoc ); - Reference< XNamedRanges > xNamedRanges; - aPropSet.getProperty( xNamedRanges, PROP_NamedRanges ); - return xNamedRanges; -} - -Reference< XDatabaseRanges > WorkbookData::getDatabaseRanges() const -{ - PropertySet aPropSet( mxDoc ); - Reference< XDatabaseRanges > xDatabaseRanges; - aPropSet.getProperty( xDatabaseRanges, PROP_DatabaseRanges ); - return xDatabaseRanges; -} - -Reference< XExternalDocLinks > WorkbookData::getExternalDocLinks() const -{ - PropertySet aPropSet( mxDoc ); - Reference< XExternalDocLinks > xDocLinks; - aPropSet.getProperty( xDocLinks, PROP_ExternalDocLinks ); - return xDocLinks; -} - -Reference< XNameAccess > WorkbookData::getDdeLinks() const -{ - PropertySet aPropSet( mxDoc ); - Reference< XNameAccess > xDdeLinks; - aPropSet.getProperty( xDdeLinks, PROP_DDELinks ); - return xDdeLinks; -} - Reference< XNameContainer > WorkbookData::getStyleFamily( bool bPageStyles ) const { Reference< XNameContainer > xStylesNC; @@ -415,16 +353,16 @@ Reference< XStyle > WorkbookData::getStyleObject( const OUString& rStyleName, bo Reference< XNamedRange > WorkbookData::createNamedRangeObject( OUString& orName, sal_Int32 nNameFlags ) const { - // find an unused name - Reference< XNamedRanges > xNamedRanges = getNamedRanges(); - Reference< XNameAccess > xNameAccess( xNamedRanges, UNO_QUERY ); - if( xNameAccess.is() ) - orName = ContainerHelper::getUnusedName( xNameAccess, orName, '_' ); - // create the name and insert it into the Calc document Reference< XNamedRange > xNamedRange; - if( xNamedRanges.is() && (orName.getLength() > 0) ) try + if( orName.getLength() > 0 ) try { + // find an unused name + PropertySet aDocProps( mxDoc ); + Reference< XNamedRanges > xNamedRanges( aDocProps.getAnyProperty( PROP_NamedRanges ), UNO_QUERY_THROW ); + Reference< XNameAccess > xNameAccess( xNamedRanges, UNO_QUERY_THROW ); + orName = ContainerHelper::getUnusedName( xNameAccess, orName, '_' ); + // create the named range xNamedRanges->addNewByName( orName, OUString(), CellAddress( 0, 0, 0 ), nNameFlags ); xNamedRange.set( xNamedRanges->getByName( orName ), UNO_QUERY ); } @@ -435,6 +373,32 @@ Reference< XNamedRange > WorkbookData::createNamedRangeObject( OUString& orName, return xNamedRange; } +Reference< XDatabaseRange > WorkbookData::createDatabaseRangeObject( OUString& orName, const CellRangeAddress& rRangeAddr ) const +{ + // validate cell range + CellRangeAddress aDestRange = rRangeAddr; + bool bValidRange = getAddressConverter().validateCellRange( aDestRange, true, true ); + + // create database range and insert it into the Calc document + Reference< XDatabaseRange > xDatabaseRange; + if( bValidRange && (orName.getLength() > 0) ) try + { + // find an unused name + PropertySet aDocProps( mxDoc ); + Reference< XDatabaseRanges > xDatabaseRanges( aDocProps.getAnyProperty( PROP_DatabaseRanges ), UNO_QUERY_THROW ); + Reference< XNameAccess > xNameAccess( xDatabaseRanges, UNO_QUERY_THROW ); + orName = ContainerHelper::getUnusedName( xNameAccess, orName, '_' ); + // create the database range + xDatabaseRanges->addNewByName( orName, aDestRange ); + xDatabaseRange.set( xDatabaseRanges->getByName( orName ), UNO_QUERY ); + } + catch( Exception& ) + { + } + OSL_ENSURE( xDatabaseRange.is(), "WorkbookData::createDatabaseRangeObject - cannot create database range" ); + return xDatabaseRange; +} + Reference< XStyle > WorkbookData::createStyleObject( OUString& orStyleName, bool bPageStyle ) const { Reference< XStyle > xStyle; @@ -542,7 +506,7 @@ void WorkbookData::initialize( bool bWorkbookFile ) mxDefNames.reset( new DefinedNamesBuffer( *this ) ); mxTables.reset( new TableBuffer( *this ) ); mxScenarios.reset( new ScenarioBuffer( *this ) ); - mxWebQueries.reset( new WebQueryBuffer( *this ) ); + mxConnections.reset( new ConnectionsBuffer( *this ) ); mxPivotCaches.reset( new PivotCacheBuffer( *this ) ); mxPivotTables.reset( new PivotTableBuffer( *this ) ); @@ -564,7 +528,7 @@ void WorkbookData::initialize( bool bWorkbookFile ) // disable automatic update of linked sheets and DDE links aPropSet.setProperty( PROP_IsExecuteLinkEnabled, false ); // #i79890# disable automatic update of defined names - Reference< XActionLockable > xLockable( getNamedRanges(), UNO_QUERY ); + Reference< XActionLockable > xLockable( aPropSet.getAnyProperty( PROP_NamedRanges ), UNO_QUERY ); if( xLockable.is() ) xLockable->addActionLock(); @@ -585,7 +549,7 @@ void WorkbookData::initialize( bool bWorkbookFile ) mxCodecHelper.reset( new BiffCodecHelper( *this ) ); break; - case FILTER_OOX: + case FILTER_OOXML: break; case FILTER_UNKNOWN: @@ -602,7 +566,7 @@ void WorkbookData::finalize() // #i74668# do not insert default sheets aPropSet.setProperty( PROP_IsLoaded, true ); // #i79890# enable automatic update of defined names (before IsAdjustHeightEnabled!) - Reference< XActionLockable > xLockable( getNamedRanges(), UNO_QUERY ); + Reference< XActionLockable > xLockable( aPropSet.getAnyProperty( PROP_NamedRanges ), UNO_QUERY ); if( xLockable.is() ) xLockable->removeActionLock(); // enable automatic update of linked sheets and DDE links @@ -613,6 +577,8 @@ void WorkbookData::finalize() aPropSet.setProperty( PROP_IsUndoEnabled, true ); // disable editing read-only documents (e.g. from read-only files) aPropSet.setProperty( PROP_IsChangeReadOnlyEnabled, false ); + // #111099# open forms in alive mode (has no effect, if no controls in document) + aPropSet.setProperty( PROP_ApplyFormDesignMode, false ); } } @@ -631,7 +597,7 @@ FilterBase& WorkbookHelper::getBaseFilter() const Reference< XMultiServiceFactory > WorkbookHelper::getGlobalFactory() const { - return mrBookData.getBaseFilter().getGlobalFactory(); + return mrBookData.getBaseFilter().getServiceFactory(); } FilterType WorkbookHelper::getFilterType() const @@ -690,10 +656,7 @@ void WorkbookHelper::finalizeWorkbookImport() contains the workbook code name). */ StorageRef xVbaPrjStrg = mrBookData.getVbaProjectStorage(); if( xVbaPrjStrg.get() && xVbaPrjStrg->isStorage() ) - { - ExcelVbaProject aVbaProject( getGlobalFactory(), getDocument() ); - aVbaProject.importVbaProject( *xVbaPrjStrg, getBaseFilter().getGraphicHelper() ); - } + getBaseFilter().getVbaProject().importVbaProject( *xVbaPrjStrg, getBaseFilter().getGraphicHelper() ); } // document model ------------------------------------------------------------- @@ -708,31 +671,6 @@ Reference< XMultiServiceFactory > WorkbookHelper::getDocumentFactory() const return mrBookData.getBaseFilter().getModelFactory(); } -Reference< XDevice > WorkbookHelper::getReferenceDevice() const -{ - return mrBookData.getReferenceDevice(); -} - -Reference< XNamedRanges > WorkbookHelper::getNamedRanges() const -{ - return mrBookData.getNamedRanges(); -} - -Reference< XDatabaseRanges > WorkbookHelper::getDatabaseRanges() const -{ - return mrBookData.getDatabaseRanges(); -} - -Reference< XExternalDocLinks > WorkbookHelper::getExternalDocLinks() const -{ - return mrBookData.getExternalDocLinks(); -} - -Reference< XNameAccess > WorkbookHelper::getDdeLinks() const -{ - return mrBookData.getDdeLinks(); -} - Reference< XSpreadsheet > WorkbookHelper::getSheetFromDoc( sal_Int16 nSheet ) const { Reference< XSpreadsheet > xSheet; @@ -804,6 +742,11 @@ Reference< XNamedRange > WorkbookHelper::createNamedRangeObject( OUString& orNam return mrBookData.createNamedRangeObject( orName, nNameFlags ); } +Reference< XDatabaseRange > WorkbookHelper::createDatabaseRangeObject( OUString& orName, const CellRangeAddress& rRangeAddr ) const +{ + return mrBookData.createDatabaseRangeObject( orName, rRangeAddr ); +} + Reference< XStyle > WorkbookHelper::createStyleObject( OUString& orStyleName, bool bPageStyle ) const { return mrBookData.createStyleObject( orStyleName, bPageStyle ); @@ -861,9 +804,9 @@ ScenarioBuffer& WorkbookHelper::getScenarios() const return mrBookData.getScenarios(); } -WebQueryBuffer& WorkbookHelper::getWebQueries() const +ConnectionsBuffer& WorkbookHelper::getConnections() const { - return mrBookData.getWebQueries(); + return mrBookData.getConnections(); } PivotCacheBuffer& WorkbookHelper::getPivotCaches() const @@ -903,11 +846,11 @@ PageSettingsConverter& WorkbookHelper::getPageSettingsConverter() const return mrBookData.getPageSettingsConverter(); } -// OOX specific --------------------------------------------------------------- +// OOXML/BIFF12 specific ------------------------------------------------------ XmlFilterBase& WorkbookHelper::getOoxFilter() const { - OSL_ENSURE( mrBookData.getFilterType() == FILTER_OOX, "WorkbookHelper::getOoxFilter - invalid call" ); + OSL_ENSURE( mrBookData.getFilterType() == FILTER_OOXML, "WorkbookHelper::getOoxFilter - invalid call" ); return mrBookData.getOoxFilter(); } @@ -1002,4 +945,3 @@ bool WorkbookHelperRoot::isValid() const } // namespace xls } // namespace oox - diff --git a/oox/source/xls/workbooksettings.cxx b/oox/source/xls/workbooksettings.cxx index 51d60ebafe3b..6889d42ed2f6 100644 --- a/oox/source/xls/workbooksettings.cxx +++ b/oox/source/xls/workbooksettings.cxx @@ -26,48 +26,45 @@ ************************************************************************/ #include "oox/xls/workbooksettings.hxx" + #include <com/sun/star/sheet/XCalculatable.hpp> #include <com/sun/star/util/Date.hpp> #include <com/sun/star/util/XNumberFormatsSupplier.hpp> #include <comphelper/mediadescriptor.hxx> -#include "properties.hxx" +#include "oox/core/filterbase.hxx" #include "oox/helper/attributelist.hxx" #include "oox/helper/propertyset.hxx" -#include "oox/helper/recordinputstream.hxx" -#include "oox/core/filterbase.hxx" #include "oox/xls/biffinputstream.hxx" #include "oox/xls/unitconverter.hxx" -using ::rtl::OUString; -using ::com::sun::star::beans::XPropertySet; -using ::com::sun::star::sheet::XCalculatable; -using ::com::sun::star::uno::Any; -using ::com::sun::star::uno::Exception; -using ::com::sun::star::uno::Reference; -using ::com::sun::star::uno::UNO_QUERY; -using ::com::sun::star::uno::UNO_QUERY_THROW; -using ::com::sun::star::util::Date; -using ::com::sun::star::util::XNumberFormatsSupplier; -using ::comphelper::MediaDescriptor; -using ::oox::core::CodecHelper; - namespace oox { namespace xls { // ============================================================================ +using namespace ::com::sun::star::beans; +using namespace ::com::sun::star::sheet; +using namespace ::com::sun::star::uno; +using namespace ::com::sun::star::util; + +using ::comphelper::MediaDescriptor; +using ::oox::core::CodecHelper; +using ::rtl::OUString; + +// ============================================================================ + namespace { -const sal_uInt32 OOBIN_WORKBOOKPR_DATE1904 = 0x00000001; -const sal_uInt32 OOBIN_WORKBOOKPR_STRIPEXT = 0x00000080; +const sal_uInt32 BIFF12_WORKBOOKPR_DATE1904 = 0x00000001; +const sal_uInt32 BIFF12_WORKBOOKPR_STRIPEXT = 0x00000080; -const sal_uInt16 OOBIN_CALCPR_A1 = 0x0002; -const sal_uInt16 OOBIN_CALCPR_ITERATE = 0x0004; -const sal_uInt16 OOBIN_CALCPR_FULLPRECISION = 0x0008; -const sal_uInt16 OOBIN_CALCPR_CALCCOMPLETED = 0x0010; -const sal_uInt16 OOBIN_CALCPR_CALCONSAVE = 0x0020; -const sal_uInt16 OOBIN_CALCPR_CONCURRENT = 0x0040; -const sal_uInt16 OOBIN_CALCPR_MANUALPROC = 0x0080; +const sal_uInt16 BIFF12_CALCPR_A1 = 0x0002; +const sal_uInt16 BIFF12_CALCPR_ITERATE = 0x0004; +const sal_uInt16 BIFF12_CALCPR_FULLPRECISION = 0x0008; +const sal_uInt16 BIFF12_CALCPR_CALCCOMPLETED = 0x0010; +const sal_uInt16 BIFF12_CALCPR_CALCONSAVE = 0x0020; +const sal_uInt16 BIFF12_CALCPR_CONCURRENT = 0x0040; +const sal_uInt16 BIFF12_CALCPR_MANUALPROC = 0x0080; // no predefined constants for show objects mode const sal_Int16 API_SHOWMODE_SHOW = 0; /// Show drawing objects. @@ -95,7 +92,7 @@ WorkbookSettingsModel::WorkbookSettingsModel() : { } -void WorkbookSettingsModel::setBinObjectMode( sal_uInt16 nObjMode ) +void WorkbookSettingsModel::setBiffObjectMode( sal_uInt16 nObjMode ) { static const sal_Int32 spnObjModes[] = { XML_all, XML_placeholders, XML_none }; mnShowObjectMode = STATIC_ARRAY_SELECT( spnObjModes, nObjMode, XML_all ); @@ -158,37 +155,37 @@ void WorkbookSettings::importCalcPr( const AttributeList& rAttribs ) maCalcSettings.mbConcurrent = rAttribs.getBool( XML_concurrentCalc, true ); } -void WorkbookSettings::importFileSharing( RecordInputStream& rStrm ) +void WorkbookSettings::importFileSharing( SequenceInputStream& rStrm ) { maFileSharing.mbRecommendReadOnly = rStrm.readuInt16() != 0; rStrm >> maFileSharing.mnPasswordHash >> maFileSharing.maUserName; } -void WorkbookSettings::importWorkbookPr( RecordInputStream& rStrm ) +void WorkbookSettings::importWorkbookPr( SequenceInputStream& rStrm ) { sal_uInt32 nFlags; rStrm >> nFlags >> maBookSettings.mnDefaultThemeVer >> maBookSettings.maCodeName; - maBookSettings.setBinObjectMode( extractValue< sal_uInt16 >( nFlags, 13, 2 ) ); + maBookSettings.setBiffObjectMode( extractValue< sal_uInt16 >( nFlags, 13, 2 ) ); // set flag means: strip external link values - maBookSettings.mbSaveExtLinkValues = !getFlag( nFlags, OOBIN_WORKBOOKPR_STRIPEXT ); - setDateMode( getFlag( nFlags, OOBIN_WORKBOOKPR_DATE1904 ) ); + maBookSettings.mbSaveExtLinkValues = !getFlag( nFlags, BIFF12_WORKBOOKPR_STRIPEXT ); + setDateMode( getFlag( nFlags, BIFF12_WORKBOOKPR_DATE1904 ) ); } -void WorkbookSettings::importCalcPr( RecordInputStream& rStrm ) +void WorkbookSettings::importCalcPr( SequenceInputStream& rStrm ) { sal_Int32 nCalcMode, nProcCount; sal_uInt16 nFlags; rStrm >> maCalcSettings.mnCalcId >> nCalcMode >> maCalcSettings.mnIterateCount >> maCalcSettings.mfIterateDelta >> nProcCount >> nFlags; static const sal_Int32 spnCalcModes[] = { XML_manual, XML_auto, XML_autoNoTable }; - maCalcSettings.mnRefMode = getFlagValue( nFlags, OOBIN_CALCPR_A1, XML_A1, XML_R1C1 ); + maCalcSettings.mnRefMode = getFlagValue( nFlags, BIFF12_CALCPR_A1, XML_A1, XML_R1C1 ); maCalcSettings.mnCalcMode = STATIC_ARRAY_SELECT( spnCalcModes, nCalcMode, XML_auto ); - maCalcSettings.mnProcCount = getFlagValue< sal_Int32 >( nFlags, OOBIN_CALCPR_MANUALPROC, nProcCount, -1 ); - maCalcSettings.mbCalcOnSave = getFlag( nFlags, OOBIN_CALCPR_CALCONSAVE ); - maCalcSettings.mbCalcCompleted = getFlag( nFlags, OOBIN_CALCPR_CALCCOMPLETED ); - maCalcSettings.mbFullPrecision = getFlag( nFlags, OOBIN_CALCPR_FULLPRECISION ); - maCalcSettings.mbIterate = getFlag( nFlags, OOBIN_CALCPR_ITERATE ); - maCalcSettings.mbConcurrent = getFlag( nFlags, OOBIN_CALCPR_CONCURRENT ); + maCalcSettings.mnProcCount = getFlagValue< sal_Int32 >( nFlags, BIFF12_CALCPR_MANUALPROC, nProcCount, -1 ); + maCalcSettings.mbCalcOnSave = getFlag( nFlags, BIFF12_CALCPR_CALCONSAVE ); + maCalcSettings.mbCalcCompleted = getFlag( nFlags, BIFF12_CALCPR_CALCCOMPLETED ); + maCalcSettings.mbFullPrecision = getFlag( nFlags, BIFF12_CALCPR_FULLPRECISION ); + maCalcSettings.mbIterate = getFlag( nFlags, BIFF12_CALCPR_ITERATE ); + maCalcSettings.mbConcurrent = getFlag( nFlags, BIFF12_CALCPR_CONCURRENT ); } void WorkbookSettings::setSaveExtLinkValues( bool bSaveExtLinks ) @@ -248,7 +245,7 @@ void WorkbookSettings::importFileSharing( BiffInputStream& rStrm ) void WorkbookSettings::importHideObj( BiffInputStream& rStrm ) { - maBookSettings.setBinObjectMode( rStrm.readuInt16() ); + maBookSettings.setBiffObjectMode( rStrm.readuInt16() ); } void WorkbookSettings::importIteration( BiffInputStream& rStrm ) @@ -288,7 +285,7 @@ void WorkbookSettings::finalizeImport() PropertySet aPropSet( getDocument() ); switch( getFilterType() ) { - case FILTER_OOX: + case FILTER_OOXML: case FILTER_BIFF: aPropSet.setProperty( PROP_IgnoreCase, true ); // always in Excel aPropSet.setProperty( PROP_RegularExpressions, false ); // not supported in Excel @@ -367,4 +364,3 @@ void WorkbookSettings::setDateMode( bool bDateMode1904 ) } // namespace xls } // namespace oox - diff --git a/oox/source/xls/worksheetbuffer.cxx b/oox/source/xls/worksheetbuffer.cxx index 6f8d50ff38f6..6144c35d6a55 100644 --- a/oox/source/xls/worksheetbuffer.cxx +++ b/oox/source/xls/worksheetbuffer.cxx @@ -26,37 +26,35 @@ ************************************************************************/ #include "oox/xls/worksheetbuffer.hxx" -#include <rtl/ustrbuf.hxx> + #include <com/sun/star/container/XIndexAccess.hpp> #include <com/sun/star/container/XNameAccess.hpp> #include <com/sun/star/container/XNamed.hpp> -#include <com/sun/star/sheet/XSpreadsheetDocument.hpp> #include <com/sun/star/sheet/XExternalSheetName.hpp> #include <com/sun/star/sheet/XSheetLinkable.hpp> -#include "properties.hxx" +#include <com/sun/star/sheet/XSpreadsheetDocument.hpp> +#include <rtl/ustrbuf.hxx> +#include "oox/core/filterbase.hxx" #include "oox/helper/attributelist.hxx" +#include "oox/helper/containerhelper.hxx" #include "oox/helper/propertyset.hxx" -#include "oox/helper/recordinputstream.hxx" -#include "oox/core/filterbase.hxx" #include "oox/xls/biffinputstream.hxx" #include "oox/xls/excelhandlers.hxx" -using ::rtl::OUString; -using ::rtl::OUStringBuffer; -using ::com::sun::star::uno::Reference; -using ::com::sun::star::uno::Exception; -using ::com::sun::star::uno::UNO_QUERY_THROW; -using ::com::sun::star::container::XIndexAccess; -using ::com::sun::star::container::XNameAccess; -using ::com::sun::star::container::XNamed; -using ::com::sun::star::sheet::XSpreadsheetDocument; -using ::com::sun::star::sheet::XSpreadsheets; - namespace oox { namespace xls { // ============================================================================ +using namespace ::com::sun::star::container; +using namespace ::com::sun::star::sheet; +using namespace ::com::sun::star::uno; + +using ::rtl::OUString; +using ::rtl::OUStringBuffer; + +// ============================================================================ + SheetInfoModel::SheetInfoModel() : mnBiffHandle( -1 ), mnSheetId( -1 ), @@ -97,7 +95,7 @@ void WorksheetBuffer::importSheet( const AttributeList& rAttribs ) insertSheet( aModel ); } -void WorksheetBuffer::importSheet( RecordInputStream& rStrm ) +void WorksheetBuffer::importSheet( SequenceInputStream& rStrm ) { sal_Int32 nState; SheetInfoModel aModel; @@ -258,4 +256,3 @@ void WorksheetBuffer::insertSheet( const SheetInfoModel& rModel ) } // namespace xls } // namespace oox - diff --git a/oox/source/xls/worksheetfragment.cxx b/oox/source/xls/worksheetfragment.cxx index bee58fdbaff3..4867c7c350c1 100644 --- a/oox/source/xls/worksheetfragment.cxx +++ b/oox/source/xls/worksheetfragment.cxx @@ -26,11 +26,12 @@ ************************************************************************/ #include "oox/xls/worksheetfragment.hxx" -#include "oox/helper/attributelist.hxx" -#include "oox/helper/recordinputstream.hxx" + #include "oox/core/filterbase.hxx" #include "oox/core/relations.hxx" +#include "oox/helper/attributelist.hxx" #include "oox/xls/addressconverter.hxx" +#include "oox/xls/autofilterbuffer.hxx" #include "oox/xls/autofiltercontext.hxx" #include "oox/xls/biffinputstream.hxx" #include "oox/xls/commentsfragment.hxx" @@ -38,7 +39,6 @@ #include "oox/xls/drawingfragment.hxx" #include "oox/xls/externallinkbuffer.hxx" #include "oox/xls/pagesettings.hxx" -#include "oox/xls/pivottablebuffer.hxx" #include "oox/xls/pivottablefragment.hxx" #include "oox/xls/querytablefragment.hxx" #include "oox/xls/scenariobuffer.hxx" @@ -49,23 +49,20 @@ #include "oox/xls/workbooksettings.hxx" #include "oox/xls/worksheetsettings.hxx" -using ::rtl::OUString; -using ::rtl::OUStringBuffer; -using ::com::sun::star::uno::Any; -using ::com::sun::star::uno::Reference; -using ::com::sun::star::uno::Exception; -using ::com::sun::star::table::CellAddress; -using ::com::sun::star::table::CellRangeAddress; -using ::oox::core::ContextHandlerRef; -using ::oox::core::RecordInfo; -using ::oox::core::Relations; -using ::oox::core::RelationsRef; - namespace oox { namespace xls { // ============================================================================ +using namespace ::com::sun::star::table; +using namespace ::com::sun::star::uno; +using namespace ::oox::core; + +using ::rtl::OUString; +using ::rtl::OUStringBuffer; + +// ============================================================================ + namespace { const sal_uInt16 BIFF_COLINFO_HIDDEN = 0x0001; @@ -87,23 +84,23 @@ const sal_uInt32 BIFF_DATAVAL_SHOWERROR = 0x00080000; const sal_uInt32 BIFF_SHRFEATHEAD_SHEETPROT = 2; -const sal_Int32 OOBIN_OLEOBJECT_CONTENT = 1; -const sal_Int32 OOBIN_OLEOBJECT_ICON = 4; -const sal_Int32 OOBIN_OLEOBJECT_ALWAYS = 1; -const sal_Int32 OOBIN_OLEOBJECT_ONCALL = 3; -const sal_uInt16 OOBIN_OLEOBJECT_LINKED = 0x0001; -const sal_uInt16 OOBIN_OLEOBJECT_AUTOLOAD = 0x0002; +const sal_Int32 BIFF12_OLEOBJECT_CONTENT = 1; +const sal_Int32 BIFF12_OLEOBJECT_ICON = 4; +const sal_Int32 BIFF12_OLEOBJECT_ALWAYS = 1; +const sal_Int32 BIFF12_OLEOBJECT_ONCALL = 3; +const sal_uInt16 BIFF12_OLEOBJECT_LINKED = 0x0001; +const sal_uInt16 BIFF12_OLEOBJECT_AUTOLOAD = 0x0002; } // namespace // ============================================================================ -OoxDataValidationsContext::OoxDataValidationsContext( OoxWorksheetFragmentBase& rFragment ) : - OoxWorksheetContextBase( rFragment ) +DataValidationsContext::DataValidationsContext( WorksheetFragmentBase& rFragment ) : + WorksheetContextBase( rFragment ) { } -ContextHandlerRef OoxDataValidationsContext::onCreateContext( sal_Int32 nElement, const AttributeList& rAttribs ) +ContextHandlerRef DataValidationsContext::onCreateContext( sal_Int32 nElement, const AttributeList& rAttribs ) { switch( getCurrentElement() ) { @@ -119,7 +116,7 @@ ContextHandlerRef OoxDataValidationsContext::onCreateContext( sal_Int32 nElement { case XLS_TOKEN( formula1 ): case XLS_TOKEN( formula2 ): - return this; // collect formulas in onEndElement() + return this; // collect formulas in onCharacters() } break; } @@ -138,7 +135,7 @@ ApiTokenSequence lclImportDataValFormula( FormulaParser& rParser, const OUString } // namespace -void OoxDataValidationsContext::onEndElement( const OUString& rChars ) +void DataValidationsContext::onCharacters( const OUString& rChars ) { if( mxValModel.get() ) switch( getCurrentElement() ) { @@ -153,22 +150,27 @@ void OoxDataValidationsContext::onEndElement( const OUString& rChars ) mxValModel->maTokens2 = lclImportDataValFormula( getFormulaParser(), rChars, mxValModel->maRanges.getBaseAddress() ); break; - case XLS_TOKEN( dataValidation ): - setValidation( *mxValModel ); - mxValModel.reset(); - break; + } +} + +void DataValidationsContext::onEndElement() +{ + if( isCurrentElement( XLS_TOKEN( dataValidation ) ) && mxValModel.get() ) + { + setValidation( *mxValModel ); + mxValModel.reset(); } } -ContextHandlerRef OoxDataValidationsContext::onCreateRecordContext( sal_Int32 nRecId, RecordInputStream& rStrm ) +ContextHandlerRef DataValidationsContext::onCreateRecordContext( sal_Int32 nRecId, SequenceInputStream& rStrm ) { - if( nRecId == OOBIN_ID_DATAVALIDATION ) + if( nRecId == BIFF12_ID_DATAVALIDATION ) importDataValidation( rStrm ); return 0; } -void OoxDataValidationsContext::importDataValidation( const AttributeList& rAttribs ) +void DataValidationsContext::importDataValidation( const AttributeList& rAttribs ) { mxValModel.reset( new ValidationModel ); getAddressConverter().convertToCellRangeList( mxValModel->maRanges, rAttribs.getString( XML_sqref, OUString() ), getSheetIndex(), true ); @@ -188,7 +190,7 @@ void OoxDataValidationsContext::importDataValidation( const AttributeList& rAttr mxValModel->mbAllowBlank = rAttribs.getBool( XML_allowBlank, false ); } -void OoxDataValidationsContext::importDataValidation( RecordInputStream& rStrm ) +void DataValidationsContext::importDataValidation( SequenceInputStream& rStrm ) { ValidationModel aModel; @@ -196,10 +198,10 @@ void OoxDataValidationsContext::importDataValidation( RecordInputStream& rStrm ) BinRangeList aRanges; rStrm >> nFlags >> aRanges >> aModel.maErrorTitle >> aModel.maErrorMessage >> aModel.maInputTitle >> aModel.maInputMessage; - // equal flags in BIFF and OOBIN - aModel.setBinType( extractValue< sal_uInt8 >( nFlags, 0, 4 ) ); - aModel.setBinOperator( extractValue< sal_uInt8 >( nFlags, 20, 4 ) ); - aModel.setBinErrorStyle( extractValue< sal_uInt8 >( nFlags, 4, 3 ) ); + // equal flags in all BIFFs + aModel.setBiffType( extractValue< sal_uInt8 >( nFlags, 0, 4 ) ); + aModel.setBiffOperator( extractValue< sal_uInt8 >( nFlags, 20, 4 ) ); + aModel.setBiffErrorStyle( extractValue< sal_uInt8 >( nFlags, 4, 3 ) ); aModel.mbAllowBlank = getFlag( nFlags, BIFF_DATAVAL_ALLOWBLANK ); aModel.mbNoDropDown = getFlag( nFlags, BIFF_DATAVAL_NODROPDOWN ); aModel.mbShowInputMsg = getFlag( nFlags, BIFF_DATAVAL_SHOWINPUT ); @@ -226,24 +228,22 @@ void OoxDataValidationsContext::importDataValidation( RecordInputStream& rStrm ) // ============================================================================ -OoxWorksheetFragment::OoxWorksheetFragment( const WorkbookHelper& rHelper, - const OUString& rFragmentPath, ISegmentProgressBarRef xProgressBar, WorksheetType eSheetType, sal_Int16 nSheet ) : - OoxWorksheetFragmentBase( rHelper, rFragmentPath, xProgressBar, eSheetType, nSheet ) +WorksheetFragment::WorksheetFragment( const WorkbookHelper& rHelper, + const OUString& rFragmentPath, const ISegmentProgressBarRef& rxProgressBar, WorksheetType eSheetType, sal_Int16 nSheet ) : + WorksheetFragmentBase( rHelper, rFragmentPath, rxProgressBar, eSheetType, nSheet ) { // import data tables related to this worksheet - RelationsRef xTableRels = getRelations().getRelationsFromType( CREATE_OFFICEDOC_RELATIONSTYPE( "table" ) ); + RelationsRef xTableRels = getRelations().getRelationsFromType( CREATE_OFFICEDOC_RELATION_TYPE( "table" ) ); for( Relations::const_iterator aIt = xTableRels->begin(), aEnd = xTableRels->end(); aIt != aEnd; ++aIt ) - importOoxFragment( new OoxTableFragment( *this, getFragmentPathFromRelation( aIt->second ) ) ); + importOoxFragment( new TableFragment( *this, getFragmentPathFromRelation( aIt->second ) ) ); // import comments related to this worksheet - OUString aCommentsFragmentPath = getFragmentPathFromFirstType( CREATE_OFFICEDOC_RELATIONSTYPE( "comments" ) ); + OUString aCommentsFragmentPath = getFragmentPathFromFirstType( CREATE_OFFICEDOC_RELATION_TYPE( "comments" ) ); if( aCommentsFragmentPath.getLength() > 0 ) - importOoxFragment( new OoxCommentsFragment( *this, aCommentsFragmentPath ) ); + importOoxFragment( new CommentsFragment( *this, aCommentsFragmentPath ) ); } -// oox.core.ContextHandler2Helper interface ----------------------------------- - -ContextHandlerRef OoxWorksheetFragment::onCreateContext( sal_Int32 nElement, const AttributeList& rAttribs ) +ContextHandlerRef WorksheetFragment::onCreateContext( sal_Int32 nElement, const AttributeList& rAttribs ) { switch( getCurrentElement() ) { @@ -252,7 +252,7 @@ ContextHandlerRef OoxWorksheetFragment::onCreateContext( sal_Int32 nElement, con case SHEETTYPE_WORKSHEET: return (nElement == XLS_TOKEN( worksheet )) ? this : 0; case SHEETTYPE_CHARTSHEET: return 0; case SHEETTYPE_MACROSHEET: return (nElement == XM_TOKEN( macrosheet )) ? this : 0; - case SHEETTYPE_DIALOGSHEET: return (nElement == XM_TOKEN( dialogsheet )) ? this : 0; + case SHEETTYPE_DIALOGSHEET: return (nElement == XLS_TOKEN( dialogsheet )) ? this : 0; case SHEETTYPE_MODULESHEET: return 0; case SHEETTYPE_EMPTYSHEET: return 0; } @@ -260,12 +260,14 @@ ContextHandlerRef OoxWorksheetFragment::onCreateContext( sal_Int32 nElement, con case XLS_TOKEN( worksheet ): case XM_TOKEN( macrosheet ): + case XLS_TOKEN( dialogsheet ): switch( nElement ) { - case XLS_TOKEN( sheetData ): return new OoxSheetDataContext( *this ); - case XLS_TOKEN( autoFilter ): return new OoxAutoFilterContext( *this ); - case XLS_TOKEN( conditionalFormatting ): return new OoxCondFormatContext( *this ); - case XLS_TOKEN( dataValidations ): return new OoxDataValidationsContext( *this ); + case XLS_TOKEN( sheetData ): return new SheetDataContext( *this ); + case XLS_TOKEN( conditionalFormatting ): return new CondFormatContext( *this ); + case XLS_TOKEN( dataValidations ): return new DataValidationsContext( *this ); + case XLS_TOKEN( autoFilter ): return new AutoFilterContext( *this, getAutoFilters().createAutoFilter() ); + case XLS_TOKEN( scenarios ): return new ScenariosContext( *this ); case XLS_TOKEN( sheetViews ): case XLS_TOKEN( cols ): @@ -288,8 +290,6 @@ ContextHandlerRef OoxWorksheetFragment::onCreateContext( sal_Int32 nElement, con case XLS_TOKEN( picture ): getPageSettings().importPicture( getRelations(), rAttribs ); break; case XLS_TOKEN( drawing ): importDrawing( rAttribs ); break; case XLS_TOKEN( legacyDrawing ): importLegacyDrawing( rAttribs ); break; - case XLS_TOKEN( scenarios ): - return new OoxScenariosContext( *this ); } break; @@ -340,7 +340,7 @@ ContextHandlerRef OoxWorksheetFragment::onCreateContext( sal_Int32 nElement, con case XLS_TOKEN( oddHeader ): case XLS_TOKEN( oddFooter ): case XLS_TOKEN( evenHeader ): - case XLS_TOKEN( evenFooter ): return this; // collect h/f contents in onEndElement() + case XLS_TOKEN( evenFooter ): return this; // collect h/f contents in onCharacters() } break; @@ -354,7 +354,7 @@ ContextHandlerRef OoxWorksheetFragment::onCreateContext( sal_Int32 nElement, con return 0; } -void OoxWorksheetFragment::onEndElement( const OUString& rChars ) +void WorksheetFragment::onCharacters( const OUString& rChars ) { switch( getCurrentElement() ) { @@ -369,134 +369,136 @@ void OoxWorksheetFragment::onEndElement( const OUString& rChars ) } } -ContextHandlerRef OoxWorksheetFragment::onCreateRecordContext( sal_Int32 nRecId, RecordInputStream& rStrm ) +ContextHandlerRef WorksheetFragment::onCreateRecordContext( sal_Int32 nRecId, SequenceInputStream& rStrm ) { switch( getCurrentElement() ) { case XML_ROOT_CONTEXT: - if( nRecId == OOBIN_ID_WORKSHEET ) return this; + if( nRecId == BIFF12_ID_WORKSHEET ) return this; break; - case OOBIN_ID_WORKSHEET: + case BIFF12_ID_WORKSHEET: switch( nRecId ) { - case OOBIN_ID_SHEETDATA: return new OoxSheetDataContext( *this ); - case OOBIN_ID_CONDFORMATTING: return new OoxCondFormatContext( *this ); - case OOBIN_ID_DATAVALIDATIONS: return new OoxDataValidationsContext( *this ); - - case OOBIN_ID_SHEETVIEWS: - case OOBIN_ID_COLS: - case OOBIN_ID_MERGECELLS: - case OOBIN_ID_ROWBREAKS: - case OOBIN_ID_COLBREAKS: - case OOBIN_ID_OLEOBJECTS: - case OOBIN_ID_CONTROLS: return this; - - case OOBIN_ID_SHEETPR: getWorksheetSettings().importSheetPr( rStrm ); break; - case OOBIN_ID_DIMENSION: importDimension( rStrm ); break; - case OOBIN_ID_SHEETFORMATPR: importSheetFormatPr( rStrm ); break; - case OOBIN_ID_HYPERLINK: importHyperlink( rStrm ); break; - case OOBIN_ID_PAGEMARGINS: getPageSettings().importPageMargins( rStrm ); break; - case OOBIN_ID_PAGESETUP: getPageSettings().importPageSetup( getRelations(), rStrm ); break; - case OOBIN_ID_PRINTOPTIONS: getPageSettings().importPrintOptions( rStrm ); break; - case OOBIN_ID_HEADERFOOTER: getPageSettings().importHeaderFooter( rStrm ); break; - case OOBIN_ID_PICTURE: getPageSettings().importPicture( getRelations(), rStrm ); break; - case OOBIN_ID_SHEETPROTECTION: getWorksheetSettings().importSheetProtection( rStrm ); break; - case OOBIN_ID_PHONETICPR: getWorksheetSettings().importPhoneticPr( rStrm ); break; - case OOBIN_ID_DRAWING: importDrawing( rStrm ); break; - case OOBIN_ID_LEGACYDRAWING: importLegacyDrawing( rStrm ); break; - case OOBIN_ID_SCENARIOS: - return new OoxScenariosContext( *this ); + case BIFF12_ID_SHEETDATA: return new SheetDataContext( *this ); + case BIFF12_ID_CONDFORMATTING: return new CondFormatContext( *this ); + case BIFF12_ID_DATAVALIDATIONS: return new DataValidationsContext( *this ); + case BIFF12_ID_AUTOFILTER: return new AutoFilterContext( *this, getAutoFilters().createAutoFilter() ); + case BIFF12_ID_SCENARIOS: return new ScenariosContext( *this ); + + case BIFF12_ID_SHEETVIEWS: + case BIFF12_ID_COLS: + case BIFF12_ID_MERGECELLS: + case BIFF12_ID_ROWBREAKS: + case BIFF12_ID_COLBREAKS: + case BIFF12_ID_OLEOBJECTS: + case BIFF12_ID_CONTROLS: return this; + + case BIFF12_ID_SHEETPR: getWorksheetSettings().importSheetPr( rStrm ); break; + case BIFF12_ID_DIMENSION: importDimension( rStrm ); break; + case BIFF12_ID_SHEETFORMATPR: importSheetFormatPr( rStrm ); break; + case BIFF12_ID_HYPERLINK: importHyperlink( rStrm ); break; + case BIFF12_ID_PAGEMARGINS: getPageSettings().importPageMargins( rStrm ); break; + case BIFF12_ID_PAGESETUP: getPageSettings().importPageSetup( getRelations(), rStrm ); break; + case BIFF12_ID_PRINTOPTIONS: getPageSettings().importPrintOptions( rStrm ); break; + case BIFF12_ID_HEADERFOOTER: getPageSettings().importHeaderFooter( rStrm ); break; + case BIFF12_ID_PICTURE: getPageSettings().importPicture( getRelations(), rStrm ); break; + case BIFF12_ID_SHEETPROTECTION: getWorksheetSettings().importSheetProtection( rStrm ); break; + case BIFF12_ID_PHONETICPR: getWorksheetSettings().importPhoneticPr( rStrm ); break; + case BIFF12_ID_DRAWING: importDrawing( rStrm ); break; + case BIFF12_ID_LEGACYDRAWING: importLegacyDrawing( rStrm ); break; } break; - case OOBIN_ID_SHEETVIEWS: + case BIFF12_ID_SHEETVIEWS: switch( nRecId ) { - case OOBIN_ID_SHEETVIEW: getSheetViewSettings().importSheetView( rStrm ); return this; + case BIFF12_ID_SHEETVIEW: getSheetViewSettings().importSheetView( rStrm ); return this; } break; - case OOBIN_ID_SHEETVIEW: + case BIFF12_ID_SHEETVIEW: switch( nRecId ) { - case OOBIN_ID_PANE: getSheetViewSettings().importPane( rStrm ); break; - case OOBIN_ID_SELECTION: getSheetViewSettings().importSelection( rStrm ); break; + case BIFF12_ID_PANE: getSheetViewSettings().importPane( rStrm ); break; + case BIFF12_ID_SELECTION: getSheetViewSettings().importSelection( rStrm ); break; } break; - case OOBIN_ID_COLS: - if( nRecId == OOBIN_ID_COL ) importCol( rStrm ); + case BIFF12_ID_COLS: + if( nRecId == BIFF12_ID_COL ) importCol( rStrm ); break; - case OOBIN_ID_MERGECELLS: - if( nRecId == OOBIN_ID_MERGECELL ) importMergeCell( rStrm ); + case BIFF12_ID_MERGECELLS: + if( nRecId == BIFF12_ID_MERGECELL ) importMergeCell( rStrm ); break; - case OOBIN_ID_ROWBREAKS: - if( nRecId == OOBIN_ID_BRK ) importBrk( rStrm, true ); + case BIFF12_ID_ROWBREAKS: + if( nRecId == BIFF12_ID_BRK ) importBrk( rStrm, true ); break; - case OOBIN_ID_COLBREAKS: - if( nRecId == OOBIN_ID_BRK ) importBrk( rStrm, false ); + case BIFF12_ID_COLBREAKS: + if( nRecId == BIFF12_ID_BRK ) importBrk( rStrm, false ); break; - case OOBIN_ID_OLEOBJECTS: - if( nRecId == OOBIN_ID_OLEOBJECT ) importOleObject( rStrm ); + case BIFF12_ID_OLEOBJECTS: + if( nRecId == BIFF12_ID_OLEOBJECT ) importOleObject( rStrm ); break; - case OOBIN_ID_CONTROLS: - if( nRecId == OOBIN_ID_CONTROL ) importControl( rStrm ); + case BIFF12_ID_CONTROLS: + if( nRecId == BIFF12_ID_CONTROL ) importControl( rStrm ); break; } return 0; } -// oox.core.FragmentHandler2 interface ---------------------------------------- - -const RecordInfo* OoxWorksheetFragment::getRecordInfos() const +const RecordInfo* WorksheetFragment::getRecordInfos() const { static const RecordInfo spRecInfos[] = { - { OOBIN_ID_CFRULE, OOBIN_ID_CFRULE + 1 }, - { OOBIN_ID_COLBREAKS, OOBIN_ID_COLBREAKS + 1 }, - { OOBIN_ID_COLORSCALE, OOBIN_ID_COLORSCALE + 1 }, - { OOBIN_ID_COLS, OOBIN_ID_COLS + 1 }, - { OOBIN_ID_CONDFORMATTING, OOBIN_ID_CONDFORMATTING + 1 }, - { OOBIN_ID_CONTROLS, OOBIN_ID_CONTROLS + 2 }, - { OOBIN_ID_CUSTOMSHEETVIEW, OOBIN_ID_CUSTOMSHEETVIEW + 1 }, - { OOBIN_ID_CUSTOMSHEETVIEWS, OOBIN_ID_CUSTOMSHEETVIEWS + 3 }, - { OOBIN_ID_DATABAR, OOBIN_ID_DATABAR + 1 }, - { OOBIN_ID_DATAVALIDATIONS, OOBIN_ID_DATAVALIDATIONS + 1 }, - { OOBIN_ID_HEADERFOOTER, OOBIN_ID_HEADERFOOTER + 1 }, - { OOBIN_ID_ICONSET, OOBIN_ID_ICONSET + 1 }, - { OOBIN_ID_MERGECELLS, OOBIN_ID_MERGECELLS + 1 }, - { OOBIN_ID_OLEOBJECTS, OOBIN_ID_OLEOBJECTS + 2 }, - { OOBIN_ID_ROW, -1 }, - { OOBIN_ID_ROWBREAKS, OOBIN_ID_ROWBREAKS + 1 }, - { OOBIN_ID_SCENARIO, OOBIN_ID_SCENARIO + 1 }, - { OOBIN_ID_SCENARIOS, OOBIN_ID_SCENARIOS + 1 }, - { OOBIN_ID_SHEETDATA, OOBIN_ID_SHEETDATA + 1 }, - { OOBIN_ID_SHEETVIEW, OOBIN_ID_SHEETVIEW + 1 }, - { OOBIN_ID_SHEETVIEWS, OOBIN_ID_SHEETVIEWS + 1 }, - { OOBIN_ID_TABLEPARTS, OOBIN_ID_TABLEPARTS + 2 }, - { OOBIN_ID_WORKSHEET, OOBIN_ID_WORKSHEET + 1 }, + { BIFF12_ID_AUTOFILTER, BIFF12_ID_AUTOFILTER + 1 }, + { BIFF12_ID_CFRULE, BIFF12_ID_CFRULE + 1 }, + { BIFF12_ID_COLBREAKS, BIFF12_ID_COLBREAKS + 1 }, + { BIFF12_ID_COLORSCALE, BIFF12_ID_COLORSCALE + 1 }, + { BIFF12_ID_COLS, BIFF12_ID_COLS + 1 }, + { BIFF12_ID_CONDFORMATTING, BIFF12_ID_CONDFORMATTING + 1 }, + { BIFF12_ID_CONTROLS, BIFF12_ID_CONTROLS + 2 }, + { BIFF12_ID_CUSTOMFILTERS, BIFF12_ID_CUSTOMFILTERS + 1 }, + { BIFF12_ID_CUSTOMSHEETVIEW, BIFF12_ID_CUSTOMSHEETVIEW + 1 }, + { BIFF12_ID_CUSTOMSHEETVIEWS, BIFF12_ID_CUSTOMSHEETVIEWS + 3 }, + { BIFF12_ID_DATABAR, BIFF12_ID_DATABAR + 1 }, + { BIFF12_ID_DATAVALIDATIONS, BIFF12_ID_DATAVALIDATIONS + 1 }, + { BIFF12_ID_DISCRETEFILTERS, BIFF12_ID_DISCRETEFILTERS + 1 }, + { BIFF12_ID_FILTERCOLUMN, BIFF12_ID_FILTERCOLUMN + 1 }, + { BIFF12_ID_HEADERFOOTER, BIFF12_ID_HEADERFOOTER + 1 }, + { BIFF12_ID_ICONSET, BIFF12_ID_ICONSET + 1 }, + { BIFF12_ID_MERGECELLS, BIFF12_ID_MERGECELLS + 1 }, + { BIFF12_ID_OLEOBJECTS, BIFF12_ID_OLEOBJECTS + 2 }, + { BIFF12_ID_ROW, -1 }, + { BIFF12_ID_ROWBREAKS, BIFF12_ID_ROWBREAKS + 1 }, + { BIFF12_ID_SCENARIO, BIFF12_ID_SCENARIO + 1 }, + { BIFF12_ID_SCENARIOS, BIFF12_ID_SCENARIOS + 1 }, + { BIFF12_ID_SHEETDATA, BIFF12_ID_SHEETDATA + 1 }, + { BIFF12_ID_SHEETVIEW, BIFF12_ID_SHEETVIEW + 1 }, + { BIFF12_ID_SHEETVIEWS, BIFF12_ID_SHEETVIEWS + 1 }, + { BIFF12_ID_TABLEPARTS, BIFF12_ID_TABLEPARTS + 2 }, + { BIFF12_ID_WORKSHEET, BIFF12_ID_WORKSHEET + 1 }, { -1, -1 } }; return spRecInfos; } -void OoxWorksheetFragment::initializeImport() +void WorksheetFragment::initializeImport() { // initial processing in base class WorksheetHelper initializeWorksheetImport(); // import query table fragments related to this worksheet - RelationsRef xQueryRels = getRelations().getRelationsFromType( CREATE_OFFICEDOC_RELATIONSTYPE( "queryTable" ) ); + RelationsRef xQueryRels = getRelations().getRelationsFromType( CREATE_OFFICEDOC_RELATION_TYPE( "queryTable" ) ); for( Relations::const_iterator aIt = xQueryRels->begin(), aEnd = xQueryRels->end(); aIt != aEnd; ++aIt ) - importOoxFragment( new OoxQueryTableFragment( *this, getFragmentPathFromRelation( aIt->second ) ) ); + importOoxFragment( new QueryTableFragment( *this, getFragmentPathFromRelation( aIt->second ) ) ); // import pivot table fragments related to this worksheet - RelationsRef xPivotRels = getRelations().getRelationsFromType( CREATE_OFFICEDOC_RELATIONSTYPE( "pivotTable" ) ); + RelationsRef xPivotRels = getRelations().getRelationsFromType( CREATE_OFFICEDOC_RELATION_TYPE( "pivotTable" ) ); for( Relations::const_iterator aIt = xPivotRels->begin(), aEnd = xPivotRels->end(); aIt != aEnd; ++aIt ) - importOoxFragment( new OoxPivotTableFragment( *this, getFragmentPathFromRelation( aIt->second ) ) ); + importOoxFragment( new PivotTableFragment( *this, getFragmentPathFromRelation( aIt->second ) ) ); } -void OoxWorksheetFragment::finalizeImport() +void WorksheetFragment::finalizeImport() { // final processing in base class WorksheetHelper finalizeWorksheetImport(); @@ -504,13 +506,13 @@ void OoxWorksheetFragment::finalizeImport() // private -------------------------------------------------------------------- -void OoxWorksheetFragment::importPageSetUpPr( const AttributeList& rAttribs ) +void WorksheetFragment::importPageSetUpPr( const AttributeList& rAttribs ) { // for whatever reason, this flag is still stored separated from the page settings getPageSettings().setFitToPagesMode( rAttribs.getBool( XML_fitToPage, false ) ); } -void OoxWorksheetFragment::importDimension( const AttributeList& rAttribs ) +void WorksheetFragment::importDimension( const AttributeList& rAttribs ) { CellRangeAddress aRange; getAddressConverter().convertToCellRangeUnchecked( aRange, rAttribs.getString( XML_ref, OUString() ), getSheetIndex() ); @@ -522,7 +524,7 @@ void OoxWorksheetFragment::importDimension( const AttributeList& rAttribs ) extendUsedArea( aRange ); } -void OoxWorksheetFragment::importSheetFormatPr( const AttributeList& rAttribs ) +void WorksheetFragment::importSheetFormatPr( const AttributeList& rAttribs ) { // default column settings setBaseColumnWidth( rAttribs.getInteger( XML_baseColWidth, 8 ) ); @@ -536,7 +538,7 @@ void OoxWorksheetFragment::importSheetFormatPr( const AttributeList& rAttribs ) rAttribs.getBool( XML_thickBottom, false ) ); } -void OoxWorksheetFragment::importCol( const AttributeList& rAttribs ) +void WorksheetFragment::importCol( const AttributeList& rAttribs ) { ColumnModel aModel; aModel.mnFirstCol = rAttribs.getInteger( XML_min, -1 ); @@ -551,14 +553,14 @@ void OoxWorksheetFragment::importCol( const AttributeList& rAttribs ) setColumnModel( aModel ); } -void OoxWorksheetFragment::importMergeCell( const AttributeList& rAttribs ) +void WorksheetFragment::importMergeCell( const AttributeList& rAttribs ) { CellRangeAddress aRange; if( getAddressConverter().convertToCellRange( aRange, rAttribs.getString( XML_ref, OUString() ), getSheetIndex(), true, true ) ) setMergedRange( aRange ); } -void OoxWorksheetFragment::importHyperlink( const AttributeList& rAttribs ) +void WorksheetFragment::importHyperlink( const AttributeList& rAttribs ) { HyperlinkModel aModel; if( getAddressConverter().convertToCellRange( aModel.maRange, rAttribs.getString( XML_ref, OUString() ), getSheetIndex(), true, true ) ) @@ -571,7 +573,7 @@ void OoxWorksheetFragment::importHyperlink( const AttributeList& rAttribs ) } } -void OoxWorksheetFragment::importBrk( const AttributeList& rAttribs, bool bRowBreak ) +void WorksheetFragment::importBrk( const AttributeList& rAttribs, bool bRowBreak ) { PageBreakModel aModel; aModel.mnColRow = rAttribs.getInteger( XML_id, 0 ); @@ -581,22 +583,22 @@ void OoxWorksheetFragment::importBrk( const AttributeList& rAttribs, bool bRowBr setPageBreak( aModel, bRowBreak ); } -void OoxWorksheetFragment::importDrawing( const AttributeList& rAttribs ) +void WorksheetFragment::importDrawing( const AttributeList& rAttribs ) { setDrawingPath( getFragmentPathFromRelId( rAttribs.getString( R_TOKEN( id ), OUString() ) ) ); } -void OoxWorksheetFragment::importLegacyDrawing( const AttributeList& rAttribs ) +void WorksheetFragment::importLegacyDrawing( const AttributeList& rAttribs ) { setVmlDrawingPath( getFragmentPathFromRelId( rAttribs.getString( R_TOKEN( id ), OUString() ) ) ); } -void OoxWorksheetFragment::importOleObject( const AttributeList& rAttribs ) +void WorksheetFragment::importOleObject( const AttributeList& rAttribs ) { ::oox::vml::OleObjectInfo aInfo; aInfo.setShapeId( rAttribs.getInteger( XML_shapeId, 0 ) ); OSL_ENSURE( rAttribs.hasAttribute( XML_link ) != rAttribs.hasAttribute( R_TOKEN( id ) ), - "OoxWorksheetFragment::importOleObject - OLE object must be either linked or embedded" ); + "WorksheetFragment::importOleObject - OLE object must be either linked or embedded" ); aInfo.mbLinked = rAttribs.hasAttribute( XML_link ); if( aInfo.mbLinked ) aInfo.maTargetLink = getFormulaParser().importOleTargetLink( rAttribs.getString( XML_link, OUString() ) ); @@ -609,7 +611,7 @@ void OoxWorksheetFragment::importOleObject( const AttributeList& rAttribs ) getVmlDrawing().registerOleObject( aInfo ); } -void OoxWorksheetFragment::importControl( const AttributeList& rAttribs ) +void WorksheetFragment::importControl( const AttributeList& rAttribs ) { ::oox::vml::ControlInfo aInfo; aInfo.setShapeId( rAttribs.getInteger( XML_shapeId, 0 ) ); @@ -618,7 +620,7 @@ void OoxWorksheetFragment::importControl( const AttributeList& rAttribs ) getVmlDrawing().registerControl( aInfo ); } -void OoxWorksheetFragment::importDimension( RecordInputStream& rStrm ) +void WorksheetFragment::importDimension( SequenceInputStream& rStrm ) { BinRange aBinRange; aBinRange.read( rStrm ); @@ -632,7 +634,7 @@ void OoxWorksheetFragment::importDimension( RecordInputStream& rStrm ) extendUsedArea( aRange ); } -void OoxWorksheetFragment::importSheetFormatPr( RecordInputStream& rStrm ) +void WorksheetFragment::importSheetFormatPr( SequenceInputStream& rStrm ) { sal_Int32 nDefaultWidth; sal_uInt16 nBaseWidth, nDefaultHeight, nFlags; @@ -640,9 +642,9 @@ void OoxWorksheetFragment::importSheetFormatPr( RecordInputStream& rStrm ) // base column with setBaseColumnWidth( nBaseWidth ); - // default width is stored as 1/256th of a character in OOBIN, convert to entire character + // default width is stored as 1/256th of a character in BIFF12, convert to entire character setDefaultColumnWidth( static_cast< double >( nDefaultWidth ) / 256.0 ); - // row height is in twips in OOBIN, convert to points; equal flags in BIFF and OOBIN + // row height is in twips in BIFF12, convert to points; equal flags in all BIFFs setDefaultRowSettings( nDefaultHeight / 20.0, getFlag( nFlags, BIFF_DEFROW_CUSTOMHEIGHT ), @@ -651,7 +653,7 @@ void OoxWorksheetFragment::importSheetFormatPr( RecordInputStream& rStrm ) getFlag( nFlags, BIFF_DEFROW_THICKBOTTOM ) ); } -void OoxWorksheetFragment::importCol( RecordInputStream& rStrm ) +void WorksheetFragment::importCol( SequenceInputStream& rStrm ) { ColumnModel aModel; @@ -659,12 +661,12 @@ void OoxWorksheetFragment::importCol( RecordInputStream& rStrm ) sal_uInt16 nFlags; rStrm >> aModel.mnFirstCol >> aModel.mnLastCol >> nWidth >> aModel.mnXfId >> nFlags; - // column indexes are 0-based in OOBIN, but ColumnModel expects 1-based + // column indexes are 0-based in BIFF12, but ColumnModel expects 1-based ++aModel.mnFirstCol; ++aModel.mnLastCol; - // width is stored as 1/256th of a character in OOBIN, convert to entire character + // width is stored as 1/256th of a character in BIFF12, convert to entire character aModel.mfWidth = static_cast< double >( nWidth ) / 256.0; - // equal flags in BIFF and OOBIN + // equal flags in all BIFFs aModel.mnLevel = extractValue< sal_Int32 >( nFlags, 8, 3 ); aModel.mbShowPhonetic = getFlag( nFlags, BIFF_COLINFO_SHOWPHONETIC ); aModel.mbHidden = getFlag( nFlags, BIFF_COLINFO_HIDDEN ); @@ -673,7 +675,7 @@ void OoxWorksheetFragment::importCol( RecordInputStream& rStrm ) setColumnModel( aModel ); } -void OoxWorksheetFragment::importMergeCell( RecordInputStream& rStrm ) +void WorksheetFragment::importMergeCell( SequenceInputStream& rStrm ) { BinRange aBinRange; rStrm >> aBinRange; @@ -682,20 +684,20 @@ void OoxWorksheetFragment::importMergeCell( RecordInputStream& rStrm ) setMergedRange( aRange ); } -void OoxWorksheetFragment::importHyperlink( RecordInputStream& rStrm ) +void WorksheetFragment::importHyperlink( SequenceInputStream& rStrm ) { BinRange aBinRange; rStrm >> aBinRange; HyperlinkModel aModel; if( getAddressConverter().convertToCellRange( aModel.maRange, aBinRange, getSheetIndex(), true, true ) ) { - aModel.maTarget = getRelations().getExternalTargetFromRelId( rStrm.readString() ); + aModel.maTarget = getRelations().getExternalTargetFromRelId( BiffHelper::readString( rStrm ) ); rStrm >> aModel.maLocation >> aModel.maTooltip >> aModel.maDisplay; setHyperlink( aModel ); } } -void OoxWorksheetFragment::importBrk( RecordInputStream& rStrm, bool bRowBreak ) +void WorksheetFragment::importBrk( SequenceInputStream& rStrm, bool bRowBreak ) { PageBreakModel aModel; sal_Int32 nManual; @@ -704,44 +706,44 @@ void OoxWorksheetFragment::importBrk( RecordInputStream& rStrm, bool bRowBreak ) setPageBreak( aModel, bRowBreak ); } -void OoxWorksheetFragment::importDrawing( RecordInputStream& rStrm ) +void WorksheetFragment::importDrawing( SequenceInputStream& rStrm ) { - setDrawingPath( getFragmentPathFromRelId( rStrm.readString() ) ); + setDrawingPath( getFragmentPathFromRelId( BiffHelper::readString( rStrm ) ) ); } -void OoxWorksheetFragment::importLegacyDrawing( RecordInputStream& rStrm ) +void WorksheetFragment::importLegacyDrawing( SequenceInputStream& rStrm ) { - setVmlDrawingPath( getFragmentPathFromRelId( rStrm.readString() ) ); + setVmlDrawingPath( getFragmentPathFromRelId( BiffHelper::readString( rStrm ) ) ); } -void OoxWorksheetFragment::importOleObject( RecordInputStream& rStrm ) +void WorksheetFragment::importOleObject( SequenceInputStream& rStrm ) { ::oox::vml::OleObjectInfo aInfo; sal_Int32 nAspect, nUpdateMode, nShapeId; sal_uInt16 nFlags; rStrm >> nAspect >> nUpdateMode >> nShapeId >> nFlags >> aInfo.maProgId; - aInfo.mbLinked = getFlag( nFlags, OOBIN_OLEOBJECT_LINKED ); + aInfo.mbLinked = getFlag( nFlags, BIFF12_OLEOBJECT_LINKED ); if( aInfo.mbLinked ) aInfo.maTargetLink = getFormulaParser().importOleTargetLink( rStrm ); else - importEmbeddedOleData( aInfo.maEmbeddedData, rStrm.readString() ); + importEmbeddedOleData( aInfo.maEmbeddedData, BiffHelper::readString( rStrm ) ); aInfo.setShapeId( nShapeId ); - aInfo.mbShowAsIcon = nAspect == OOBIN_OLEOBJECT_ICON; - aInfo.mbAutoUpdate = nUpdateMode == OOBIN_OLEOBJECT_ALWAYS; - aInfo.mbAutoLoad = getFlag( nFlags, OOBIN_OLEOBJECT_AUTOLOAD ); + aInfo.mbShowAsIcon = nAspect == BIFF12_OLEOBJECT_ICON; + aInfo.mbAutoUpdate = nUpdateMode == BIFF12_OLEOBJECT_ALWAYS; + aInfo.mbAutoLoad = getFlag( nFlags, BIFF12_OLEOBJECT_AUTOLOAD ); getVmlDrawing().registerOleObject( aInfo ); } -void OoxWorksheetFragment::importControl( RecordInputStream& rStrm ) +void WorksheetFragment::importControl( SequenceInputStream& rStrm ) { ::oox::vml::ControlInfo aInfo; aInfo.setShapeId( rStrm.readInt32() ); - aInfo.maFragmentPath = getFragmentPathFromRelId( rStrm.readString() ); + aInfo.maFragmentPath = getFragmentPathFromRelId( BiffHelper::readString( rStrm ) ); rStrm >> aInfo.maName; getVmlDrawing().registerControl( aInfo ); } -void OoxWorksheetFragment::importEmbeddedOleData( StreamDataSequence& orEmbeddedData, const OUString& rRelId ) +void WorksheetFragment::importEmbeddedOleData( StreamDataSequence& orEmbeddedData, const OUString& rRelId ) { OUString aFragmentPath = getFragmentPathFromRelId( rRelId ); if( aFragmentPath.getLength() > 0 ) @@ -750,8 +752,9 @@ void OoxWorksheetFragment::importEmbeddedOleData( StreamDataSequence& orEmbedded // ============================================================================ -BiffWorksheetFragment::BiffWorksheetFragment( const BiffWorkbookFragmentBase& rParent, ISegmentProgressBarRef xProgressBar, WorksheetType eSheetType, sal_Int16 nSheet ) : - BiffWorksheetFragmentBase( rParent, xProgressBar, eSheetType, nSheet ) +BiffWorksheetFragment::BiffWorksheetFragment( const BiffWorkbookFragmentBase& rParent, + const ISegmentProgressBarRef& rxProgressBar, WorksheetType eSheetType, sal_Int16 nSheet ) : + BiffWorksheetFragmentBase( rParent, rxProgressBar, eSheetType, nSheet ) { } @@ -774,9 +777,10 @@ bool BiffWorksheetFragment::importFragment() PageSettings& rPageSett = getPageSettings(); // process all record in this sheet fragment - while( mrStrm.startNextRecord() && (mrStrm.getRecId() != BIFF_ID_EOF) ) + BiffInputStream& rStrm = getInputStream(); + while( rStrm.startNextRecord() && (rStrm.getRecId() != BIFF_ID_EOF) ) { - if( isBofRecord() ) + if( BiffHelper::isBofRecord( rStrm ) ) { // skip unknown embedded fragments (BOF/EOF blocks) skipFragment(); @@ -784,126 +788,130 @@ bool BiffWorksheetFragment::importFragment() else { // cache base stream position to detect if record is already processed - sal_Int64 nStrmPos = mrStrm.tellBase(); - sal_uInt16 nRecId = mrStrm.getRecId(); + sal_Int64 nStrmPos = rStrm.tellBase(); + sal_uInt16 nRecId = rStrm.getRecId(); switch( nRecId ) { // records in all BIFF versions - case BIFF_ID_BOTTOMMARGIN: rPageSett.importBottomMargin( mrStrm ); break; - case BIFF_ID_CALCCOUNT: rWorkbookSett.importCalcCount( mrStrm ); break; - case BIFF_ID_CALCMODE: rWorkbookSett.importCalcMode( mrStrm ); break; - case BIFF_ID_DEFCOLWIDTH: importDefColWidth(); break; - case BIFF_ID_DELTA: rWorkbookSett.importDelta( mrStrm ); break; - case BIFF2_ID_DIMENSION: importDimension(); break; - case BIFF3_ID_DIMENSION: importDimension(); break; - case BIFF_ID_FOOTER: rPageSett.importFooter( mrStrm ); break; - case BIFF_ID_HEADER: rPageSett.importHeader( mrStrm ); break; - case BIFF_ID_HORPAGEBREAKS: importPageBreaks( true ); break; - case BIFF_ID_ITERATION: rWorkbookSett.importIteration( mrStrm ); break; - case BIFF_ID_LEFTMARGIN: rPageSett.importLeftMargin( mrStrm ); break; - case BIFF_ID_PANE: rSheetViewSett.importPane( mrStrm ); break; - case BIFF_ID_PASSWORD: rWorksheetSett.importPassword( mrStrm ); break; - case BIFF_ID_PRINTGRIDLINES: rPageSett.importPrintGridLines( mrStrm ); break; - case BIFF_ID_PRINTHEADERS: rPageSett.importPrintHeaders( mrStrm ); break; - case BIFF_ID_PROTECT: rWorksheetSett.importProtect( mrStrm ); break; - case BIFF_ID_REFMODE: rWorkbookSett.importRefMode( mrStrm ); break; - case BIFF_ID_RIGHTMARGIN: rPageSett.importRightMargin( mrStrm ); break; - case BIFF_ID_SELECTION: rSheetViewSett.importSelection( mrStrm ); break; - case BIFF_ID_TOPMARGIN: rPageSett.importTopMargin( mrStrm ); break; - case BIFF_ID_VERPAGEBREAKS: importPageBreaks( false ); break; + case BIFF_ID_BOTTOMMARGIN: rPageSett.importBottomMargin( rStrm ); break; + case BIFF_ID_CALCCOUNT: rWorkbookSett.importCalcCount( rStrm ); break; + case BIFF_ID_CALCMODE: rWorkbookSett.importCalcMode( rStrm ); break; + case BIFF_ID_DEFCOLWIDTH: importDefColWidth( rStrm ); break; + case BIFF_ID_DELTA: rWorkbookSett.importDelta( rStrm ); break; + case BIFF2_ID_DIMENSION: importDimension( rStrm ); break; + case BIFF3_ID_DIMENSION: importDimension( rStrm ); break; + case BIFF_ID_FOOTER: rPageSett.importFooter( rStrm ); break; + case BIFF_ID_HEADER: rPageSett.importHeader( rStrm ); break; + case BIFF_ID_HORPAGEBREAKS: importPageBreaks( rStrm, true ); break; + case BIFF_ID_ITERATION: rWorkbookSett.importIteration( rStrm ); break; + case BIFF_ID_LEFTMARGIN: rPageSett.importLeftMargin( rStrm ); break; + case BIFF_ID_PANE: rSheetViewSett.importPane( rStrm ); break; + case BIFF_ID_PASSWORD: rWorksheetSett.importPassword( rStrm ); break; + case BIFF_ID_PRINTGRIDLINES: rPageSett.importPrintGridLines( rStrm ); break; + case BIFF_ID_PRINTHEADERS: rPageSett.importPrintHeaders( rStrm ); break; + case BIFF_ID_PROTECT: rWorksheetSett.importProtect( rStrm ); break; + case BIFF_ID_REFMODE: rWorkbookSett.importRefMode( rStrm ); break; + case BIFF_ID_RIGHTMARGIN: rPageSett.importRightMargin( rStrm ); break; + case BIFF_ID_SELECTION: rSheetViewSett.importSelection( rStrm ); break; + case BIFF_ID_TOPMARGIN: rPageSett.importTopMargin( rStrm ); break; + case BIFF_ID_VERPAGEBREAKS: importPageBreaks( rStrm, false ); break; // BIFF specific records default: switch( getBiff() ) { case BIFF2: switch( nRecId ) { - case BIFF_ID_COLUMNDEFAULT: importColumnDefault(); break; - case BIFF_ID_COLWIDTH: importColWidth(); break; - case BIFF2_ID_DEFROWHEIGHT: importDefRowHeight(); break; - case BIFF2_ID_WINDOW2: rSheetViewSett.importWindow2( mrStrm ); break; + case BIFF_ID_COLUMNDEFAULT: importColumnDefault( rStrm ); break; + case BIFF_ID_COLWIDTH: importColWidth( rStrm ); break; + case BIFF2_ID_DEFROWHEIGHT: importDefRowHeight( rStrm ); break; + case BIFF2_ID_WINDOW2: rSheetViewSett.importWindow2( rStrm ); break; } break; case BIFF3: switch( nRecId ) { - case BIFF_ID_COLINFO: importColInfo(); break; - case BIFF_ID_DEFCOLWIDTH: importDefColWidth(); break; - case BIFF3_ID_DEFROWHEIGHT: importDefRowHeight(); break; - case BIFF_ID_HCENTER: rPageSett.importHorCenter( mrStrm ); break; - case BIFF_ID_OBJECTPROTECT: rWorksheetSett.importObjectProtect( mrStrm ); break; - case BIFF_ID_SAVERECALC: rWorkbookSett.importSaveRecalc( mrStrm ); break; - case BIFF_ID_SHEETPR: rWorksheetSett.importSheetPr( mrStrm ); break; - case BIFF_ID_UNCALCED: rWorkbookSett.importUncalced( mrStrm ); break; - case BIFF_ID_VCENTER: rPageSett.importVerCenter( mrStrm ); break; - case BIFF3_ID_WINDOW2: rSheetViewSett.importWindow2( mrStrm ); break; + case BIFF_ID_COLINFO: importColInfo( rStrm ); break; + case BIFF_ID_DEFCOLWIDTH: importDefColWidth( rStrm ); break; + case BIFF3_ID_DEFROWHEIGHT: importDefRowHeight( rStrm ); break; + case BIFF_ID_HCENTER: rPageSett.importHorCenter( rStrm ); break; + case BIFF_ID_OBJECTPROTECT: rWorksheetSett.importObjectProtect( rStrm ); break; + case BIFF_ID_SAVERECALC: rWorkbookSett.importSaveRecalc( rStrm ); break; + case BIFF_ID_SHEETPR: rWorksheetSett.importSheetPr( rStrm ); break; + case BIFF_ID_UNCALCED: rWorkbookSett.importUncalced( rStrm ); break; + case BIFF_ID_VCENTER: rPageSett.importVerCenter( rStrm ); break; + case BIFF3_ID_WINDOW2: rSheetViewSett.importWindow2( rStrm ); break; } break; case BIFF4: switch( nRecId ) { - case BIFF_ID_COLINFO: importColInfo(); break; - case BIFF3_ID_DEFROWHEIGHT: importDefRowHeight(); break; - case BIFF_ID_HCENTER: rPageSett.importHorCenter( mrStrm ); break; - case BIFF_ID_OBJECTPROTECT: rWorksheetSett.importObjectProtect( mrStrm ); break; - case BIFF_ID_PAGESETUP: rPageSett.importPageSetup( mrStrm ); break; - case BIFF_ID_SAVERECALC: rWorkbookSett.importSaveRecalc( mrStrm ); break; - case BIFF_ID_SHEETPR: rWorksheetSett.importSheetPr( mrStrm ); break; - case BIFF_ID_STANDARDWIDTH: importStandardWidth(); break; - case BIFF_ID_UNCALCED: rWorkbookSett.importUncalced( mrStrm ); break; - case BIFF_ID_VCENTER: rPageSett.importVerCenter( mrStrm ); break; - case BIFF3_ID_WINDOW2: rSheetViewSett.importWindow2( mrStrm ); break; + case BIFF_ID_COLINFO: importColInfo( rStrm ); break; + case BIFF3_ID_DEFROWHEIGHT: importDefRowHeight( rStrm ); break; + case BIFF_ID_HCENTER: rPageSett.importHorCenter( rStrm ); break; + case BIFF_ID_OBJECTPROTECT: rWorksheetSett.importObjectProtect( rStrm ); break; + case BIFF_ID_PAGESETUP: rPageSett.importPageSetup( rStrm ); break; + case BIFF_ID_SAVERECALC: rWorkbookSett.importSaveRecalc( rStrm ); break; + case BIFF_ID_SHEETPR: rWorksheetSett.importSheetPr( rStrm ); break; + case BIFF_ID_STANDARDWIDTH: importStandardWidth( rStrm ); break; + case BIFF_ID_UNCALCED: rWorkbookSett.importUncalced( rStrm ); break; + case BIFF_ID_VCENTER: rPageSett.importVerCenter( rStrm ); break; + case BIFF3_ID_WINDOW2: rSheetViewSett.importWindow2( rStrm ); break; } break; case BIFF5: switch( nRecId ) { - case BIFF_ID_COLINFO: importColInfo(); break; - case BIFF3_ID_DEFROWHEIGHT: importDefRowHeight(); break; - case BIFF_ID_HCENTER: rPageSett.importHorCenter( mrStrm ); break; - case BIFF_ID_MERGEDCELLS: importMergedCells(); break; // #i62300# also in BIFF5 - case BIFF_ID_OBJECTPROTECT: rWorksheetSett.importObjectProtect( mrStrm ); break; - case BIFF_ID_PAGESETUP: rPageSett.importPageSetup( mrStrm ); break; - case BIFF_ID_PTDEFINITION: importPTDefinition(); break; - case BIFF_ID_SAVERECALC: rWorkbookSett.importSaveRecalc( mrStrm ); break; - case BIFF_ID_SCENPROTECT: rWorksheetSett.importScenProtect( mrStrm ); break; - case BIFF_ID_SCL: rSheetViewSett.importScl( mrStrm ); break; - case BIFF_ID_SHEETPR: rWorksheetSett.importSheetPr( mrStrm ); break; - case BIFF_ID_STANDARDWIDTH: importStandardWidth(); break; - case BIFF_ID_UNCALCED: rWorkbookSett.importUncalced( mrStrm ); break; - case BIFF_ID_VCENTER: rPageSett.importVerCenter( mrStrm ); break; - case BIFF3_ID_WINDOW2: rSheetViewSett.importWindow2( mrStrm ); break; + case BIFF_ID_AUTOFILTER: importAutoFilter( rStrm ); break; + case BIFF_ID_COLINFO: importColInfo( rStrm ); break; + case BIFF3_ID_DEFROWHEIGHT: importDefRowHeight( rStrm ); break; + case BIFF_ID_HCENTER: rPageSett.importHorCenter( rStrm ); break; + case BIFF_ID_MERGEDCELLS: importMergedCells( rStrm ); break; // #i62300# also in BIFF5 + case BIFF_ID_OBJECTPROTECT: rWorksheetSett.importObjectProtect( rStrm ); break; + case BIFF_ID_PAGESETUP: rPageSett.importPageSetup( rStrm ); break; + case BIFF_ID_PTDEFINITION: importPTDefinition( rStrm ); break; + case BIFF_ID_SAVERECALC: rWorkbookSett.importSaveRecalc( rStrm ); break; + case BIFF_ID_SCENPROTECT: rWorksheetSett.importScenProtect( rStrm ); break; + case BIFF_ID_SCL: rSheetViewSett.importScl( rStrm ); break; + case BIFF_ID_SHEETPR: rWorksheetSett.importSheetPr( rStrm ); break; + case BIFF_ID_STANDARDWIDTH: importStandardWidth( rStrm ); break; + case BIFF_ID_UNCALCED: rWorkbookSett.importUncalced( rStrm ); break; + case BIFF_ID_VCENTER: rPageSett.importVerCenter( rStrm ); break; + case BIFF3_ID_WINDOW2: rSheetViewSett.importWindow2( rStrm ); break; } break; case BIFF8: switch( nRecId ) { - case BIFF_ID_CFHEADER: rCondFormats.importCfHeader( mrStrm ); break; - case BIFF_ID_CODENAME: rWorksheetSett.importCodeName( mrStrm ); break; - case BIFF_ID_COLINFO: importColInfo(); break; - case BIFF_ID_DATAVALIDATION: importDataValidation(); break; - case BIFF_ID_DATAVALIDATIONS: importDataValidations(); break; - case BIFF3_ID_DEFROWHEIGHT: importDefRowHeight(); break; - case BIFF_ID_HCENTER: rPageSett.importHorCenter( mrStrm ); break; - case BIFF_ID_HYPERLINK: importHyperlink(); break; - case BIFF_ID_LABELRANGES: importLabelRanges(); break; - case BIFF_ID_MERGEDCELLS: importMergedCells(); break; - case BIFF_ID_OBJECTPROTECT: rWorksheetSett.importObjectProtect( mrStrm ); break; - case BIFF_ID_PAGESETUP: rPageSett.importPageSetup( mrStrm ); break; - case BIFF_ID_PHONETICPR: rWorksheetSett.importPhoneticPr( mrStrm ); break; - case BIFF_ID_PICTURE: rPageSett.importPicture( mrStrm ); break; - case BIFF_ID_PTDEFINITION: importPTDefinition(); break; - case BIFF_ID_SAVERECALC: rWorkbookSett.importSaveRecalc( mrStrm ); break; - case BIFF_ID_SCENARIOS: importScenarios(); break; - case BIFF_ID_SCENPROTECT: rWorksheetSett.importScenProtect( mrStrm ); break; - case BIFF_ID_SCL: rSheetViewSett.importScl( mrStrm ); break; - case BIFF_ID_SHEETPR: rWorksheetSett.importSheetPr( mrStrm ); break; - case BIFF_ID_SHAREDFEATHEAD: importSharedFeatHead(); break; - case BIFF_ID_STANDARDWIDTH: importStandardWidth(); break; - case BIFF_ID_UNCALCED: rWorkbookSett.importUncalced( mrStrm ); break; - case BIFF_ID_VCENTER: rPageSett.importVerCenter( mrStrm ); break; - case BIFF3_ID_WINDOW2: rSheetViewSett.importWindow2( mrStrm ); break; + case BIFF_ID_AUTOFILTER: importAutoFilter( rStrm ); break; + case BIFF_ID_CFHEADER: rCondFormats.importCfHeader( rStrm ); break; + case BIFF_ID_CODENAME: rWorksheetSett.importCodeName( rStrm ); break; + case BIFF_ID_COLINFO: importColInfo( rStrm ); break; + case BIFF_ID_DATAVALIDATION: importDataValidation( rStrm ); break; + case BIFF_ID_DATAVALIDATIONS: importDataValidations( rStrm ); break; + case BIFF3_ID_DEFROWHEIGHT: importDefRowHeight( rStrm ); break; + case BIFF_ID_HCENTER: rPageSett.importHorCenter( rStrm ); break; + case BIFF_ID_HYPERLINK: importHyperlink( rStrm ); break; + case BIFF_ID_LABELRANGES: importLabelRanges( rStrm ); break; + case BIFF_ID_MERGEDCELLS: importMergedCells( rStrm ); break; + case BIFF_ID_OBJECTPROTECT: rWorksheetSett.importObjectProtect( rStrm ); break; + case BIFF_ID_PAGESETUP: rPageSett.importPageSetup( rStrm ); break; + case BIFF_ID_PHONETICPR: rWorksheetSett.importPhoneticPr( rStrm ); break; + case BIFF_ID_PICTURE: rPageSett.importPicture( rStrm ); break; + case BIFF_ID_PTDEFINITION: importPTDefinition( rStrm ); break; + case BIFF_ID_QUERYTABLE: importQueryTable( rStrm ); break; + case BIFF_ID_SAVERECALC: rWorkbookSett.importSaveRecalc( rStrm ); break; + case BIFF_ID_SCENARIOS: importScenarios( rStrm ); break; + case BIFF_ID_SCENPROTECT: rWorksheetSett.importScenProtect( rStrm ); break; + case BIFF_ID_SCL: rSheetViewSett.importScl( rStrm ); break; + case BIFF_ID_SHEETEXT: rWorksheetSett.importSheetExt( rStrm ); break; + case BIFF_ID_SHEETPR: rWorksheetSett.importSheetPr( rStrm ); break; + case BIFF_ID_SHAREDFEATHEAD: importSharedFeatHead( rStrm ); break; + case BIFF_ID_STANDARDWIDTH: importStandardWidth( rStrm ); break; + case BIFF_ID_UNCALCED: rWorkbookSett.importUncalced( rStrm ); break; + case BIFF_ID_VCENTER: rPageSett.importVerCenter( rStrm ); break; + case BIFF3_ID_WINDOW2: rSheetViewSett.importWindow2( rStrm ); break; } break; @@ -911,26 +919,41 @@ bool BiffWorksheetFragment::importFragment() } } - // record not processed, try cell records - if( mrStrm.tellBase() == nStrmPos ) - aSheetData.importRecord(); - // record still not processed, try pivot table records - if( mxPTContext.get() && (mrStrm.tellBase() == nStrmPos) ) - mxPTContext->importRecord(); + // record not processed, try record context objects + if( rStrm.tellBase() == nStrmPos ) + { + // first, try cell table records + aSheetData.importRecord( rStrm ); + // handle another open record context + if( mxContext.get() ) + { + // if it was a cell table record, forget the other record context + if( rStrm.tellBase() == nStrmPos ) + mxContext->importRecord( rStrm ); + else + mxContext.reset(); + } + } } } // final processing in base class WorksheetHelper finalizeWorksheetImport(); - return mrStrm.getRecId() == BIFF_ID_EOF; + return rStrm.getRecId() == BIFF_ID_EOF; } // private -------------------------------------------------------------------- -void BiffWorksheetFragment::importColInfo() +void BiffWorksheetFragment::importAutoFilter( BiffInputStream& rStrm ) +{ + mxContext.reset( new BiffAutoFilterContext( *this, getAutoFilters().createAutoFilter() ) ); + mxContext->importRecord( rStrm ); +} + +void BiffWorksheetFragment::importColInfo( BiffInputStream& rStrm ) { sal_uInt16 nFirstCol, nLastCol, nWidth, nXfId, nFlags; - mrStrm >> nFirstCol >> nLastCol >> nWidth >> nXfId >> nFlags; + rStrm >> nFirstCol >> nLastCol >> nWidth >> nXfId >> nFlags; ColumnModel aModel; // column indexes are 0-based in BIFF, but ColumnModel expects 1-based @@ -947,18 +970,18 @@ void BiffWorksheetFragment::importColInfo() setColumnModel( aModel ); } -void BiffWorksheetFragment::importColumnDefault() +void BiffWorksheetFragment::importColumnDefault( BiffInputStream& rStrm ) { sal_uInt16 nFirstCol, nLastCol, nXfId; - mrStrm >> nFirstCol >> nLastCol >> nXfId; + rStrm >> nFirstCol >> nLastCol >> nXfId; setDefaultColumnFormat( nFirstCol, nLastCol, nXfId ); } -void BiffWorksheetFragment::importColWidth() +void BiffWorksheetFragment::importColWidth( BiffInputStream& rStrm ) { sal_uInt8 nFirstCol, nLastCol; sal_uInt16 nWidth; - mrStrm >> nFirstCol >> nLastCol >> nWidth; + rStrm >> nFirstCol >> nLastCol >> nWidth; ColumnModel aModel; // column indexes are 0-based in BIFF, but ColumnModel expects 1-based @@ -970,20 +993,20 @@ void BiffWorksheetFragment::importColWidth() setColumnModel( aModel ); } -void BiffWorksheetFragment::importDefColWidth() +void BiffWorksheetFragment::importDefColWidth( BiffInputStream& rStrm ) { /* Stored as entire number of characters without padding pixels, which will be added in setBaseColumnWidth(). Call has no effect, if a width has already been set from the STANDARDWIDTH record. */ - setBaseColumnWidth( mrStrm.readuInt16() ); + setBaseColumnWidth( rStrm.readuInt16() ); } -void BiffWorksheetFragment::importDefRowHeight() +void BiffWorksheetFragment::importDefRowHeight( BiffInputStream& rStrm ) { sal_uInt16 nFlags = BIFF_DEFROW_CUSTOMHEIGHT, nHeight; if( getBiff() != BIFF2 ) - mrStrm >> nFlags; - mrStrm >> nHeight; + rStrm >> nFlags; + rStrm >> nHeight; if( getBiff() == BIFF2 ) nHeight &= BIFF2_DEFROW_MASK; // row height is in twips in BIFF, convert to points @@ -995,11 +1018,11 @@ void BiffWorksheetFragment::importDefRowHeight() getFlag( nFlags, BIFF_DEFROW_THICKBOTTOM ) ); } -void BiffWorksheetFragment::importDataValidations() +void BiffWorksheetFragment::importDataValidations( BiffInputStream& rStrm ) { sal_Int32 nObjId; - mrStrm.skip( 10 ); - mrStrm >> nObjId; + rStrm.skip( 10 ); + rStrm >> nObjId; //! TODO: invalidate object id in drawing object manager } @@ -1026,50 +1049,50 @@ ApiTokenSequence lclReadDataValFormula( BiffInputStream& rStrm, FormulaParser& r } // namespace -void BiffWorksheetFragment::importDataValidation() +void BiffWorksheetFragment::importDataValidation( BiffInputStream& rStrm ) { ValidationModel aModel; // flags sal_uInt32 nFlags; - mrStrm >> nFlags; - aModel.setBinType( extractValue< sal_uInt8 >( nFlags, 0, 4 ) ); - aModel.setBinOperator( extractValue< sal_uInt8 >( nFlags, 20, 4 ) ); - aModel.setBinErrorStyle( extractValue< sal_uInt8 >( nFlags, 4, 3 ) ); + rStrm >> nFlags; + aModel.setBiffType( extractValue< sal_uInt8 >( nFlags, 0, 4 ) ); + aModel.setBiffOperator( extractValue< sal_uInt8 >( nFlags, 20, 4 ) ); + aModel.setBiffErrorStyle( extractValue< sal_uInt8 >( nFlags, 4, 3 ) ); aModel.mbAllowBlank = getFlag( nFlags, BIFF_DATAVAL_ALLOWBLANK ); aModel.mbNoDropDown = getFlag( nFlags, BIFF_DATAVAL_NODROPDOWN ); aModel.mbShowInputMsg = getFlag( nFlags, BIFF_DATAVAL_SHOWINPUT ); aModel.mbShowErrorMsg = getFlag( nFlags, BIFF_DATAVAL_SHOWERROR ); // message strings - aModel.maInputTitle = lclReadDataValMessage( mrStrm ); - aModel.maErrorTitle = lclReadDataValMessage( mrStrm ); - aModel.maInputMessage = lclReadDataValMessage( mrStrm ); - aModel.maErrorMessage = lclReadDataValMessage( mrStrm ); + aModel.maInputTitle = lclReadDataValMessage( rStrm ); + aModel.maErrorTitle = lclReadDataValMessage( rStrm ); + aModel.maInputMessage = lclReadDataValMessage( rStrm ); + aModel.maErrorMessage = lclReadDataValMessage( rStrm ); // condition formula(s) FormulaParser& rParser = getFormulaParser(); - aModel.maTokens1 = lclReadDataValFormula( mrStrm, rParser ); - aModel.maTokens2 = lclReadDataValFormula( mrStrm, rParser ); + aModel.maTokens1 = lclReadDataValFormula( rStrm, rParser ); + aModel.maTokens2 = lclReadDataValFormula( rStrm, rParser ); // process string list of a list validation (convert to list of string tokens) if( (aModel.mnType == XML_list) && getFlag( nFlags, BIFF_DATAVAL_STRINGLIST ) ) rParser.convertStringToStringList( aModel.maTokens1, '\0', true ); // cell range list BinRangeList aRanges; - mrStrm >> aRanges; + rStrm >> aRanges; getAddressConverter().convertToCellRangeList( aModel.maRanges, aRanges, getSheetIndex(), true ); // set validation data setValidation( aModel ); } -void BiffWorksheetFragment::importDimension() +void BiffWorksheetFragment::importDimension( BiffInputStream& rStrm ) { // 32-bit row indexes in BIFF8 - bool bInt32Rows = (mrStrm.getRecId() == BIFF3_ID_DIMENSION) && (getBiff() == BIFF8); + bool bInt32Rows = (rStrm.getRecId() == BIFF3_ID_DIMENSION) && (getBiff() == BIFF8); BinRange aBinRange; - aBinRange.read( mrStrm, true, bInt32Rows ); + aBinRange.read( rStrm, true, bInt32Rows ); /* BIFF stores the used area with end column and end row increased by 1 (first unused column and row). */ if( (aBinRange.maFirst.mnCol < aBinRange.maLast.mnCol) && (aBinRange.maFirst.mnRow < aBinRange.maLast.mnRow) ) @@ -1083,13 +1106,13 @@ void BiffWorksheetFragment::importDimension() } } -void BiffWorksheetFragment::importHyperlink() +void BiffWorksheetFragment::importHyperlink( BiffInputStream& rStrm ) { HyperlinkModel aModel; // read cell range for the hyperlink BinRange aBiffRange; - mrStrm >> aBiffRange; + rStrm >> aBiffRange; // #i80006# Excel silently ignores invalid hi-byte of column index (TODO: everywhere?) aBiffRange.maFirst.mnCol &= 0xFF; aBiffRange.maLast.mnCol &= 0xFF; @@ -1097,15 +1120,15 @@ void BiffWorksheetFragment::importHyperlink() return; // try to read the StdHlink data - if( !::oox::ole::OleHelper::importStdHlink( aModel, mrStrm, true ) ) + if( !::oox::ole::OleHelper::importStdHlink( aModel, rStrm, true ) ) return; // try to read the optional following SCREENTIP record - if( (mrStrm.getNextRecId() == BIFF_ID_SCREENTIP) && mrStrm.startNextRecord() ) + if( (rStrm.getNextRecId() == BIFF_ID_SCREENTIP) && rStrm.startNextRecord() ) { - mrStrm.skip( 2 ); // repeated record id + rStrm.skip( 2 ); // repeated record id // the cell range, again - mrStrm >> aBiffRange; + rStrm >> aBiffRange; CellRangeAddress aRange; if( getAddressConverter().convertToCellRange( aRange, aBiffRange, getSheetIndex(), true, true ) && (aRange.StartColumn == aModel.maRange.StartColumn) && @@ -1115,7 +1138,7 @@ void BiffWorksheetFragment::importHyperlink() { /* This time, we have no string length, no flag field, and a null-terminated 16-bit character array. */ - aModel.maTooltip = mrStrm.readNulUnicodeArray(); + aModel.maTooltip = rStrm.readNulUnicodeArray(); } } @@ -1123,72 +1146,78 @@ void BiffWorksheetFragment::importHyperlink() setHyperlink( aModel ); } -void BiffWorksheetFragment::importLabelRanges() +void BiffWorksheetFragment::importLabelRanges( BiffInputStream& rStrm ) { BinRangeList aBiffRowRanges, aBiffColRanges; - mrStrm >> aBiffRowRanges >> aBiffColRanges; + rStrm >> aBiffRowRanges >> aBiffColRanges; ApiCellRangeList aColRanges, aRowRanges; getAddressConverter().convertToCellRangeList( aColRanges, aBiffColRanges, getSheetIndex(), true ); getAddressConverter().convertToCellRangeList( aRowRanges, aBiffRowRanges, getSheetIndex(), true ); setLabelRanges( aColRanges, aRowRanges ); } -void BiffWorksheetFragment::importMergedCells() +void BiffWorksheetFragment::importMergedCells( BiffInputStream& rStrm ) { BinRangeList aBiffRanges; - mrStrm >> aBiffRanges; + rStrm >> aBiffRanges; ApiCellRangeList aRanges; getAddressConverter().convertToCellRangeList( aRanges, aBiffRanges, getSheetIndex(), true ); for( ApiCellRangeList::const_iterator aIt = aRanges.begin(), aEnd = aRanges.end(); aIt != aEnd; ++aIt ) setMergedRange( *aIt ); } -void BiffWorksheetFragment::importPageBreaks( bool bRowBreak ) +void BiffWorksheetFragment::importPageBreaks( BiffInputStream& rStrm, bool bRowBreak ) { PageBreakModel aModel; aModel.mbManual = true; // only manual breaks stored in BIFF bool bBiff8 = getBiff() == BIFF8; // skip start/end columns or rows in BIFF8 sal_uInt16 nCount; - mrStrm >> nCount; - for( sal_uInt16 nIndex = 0; !mrStrm.isEof() && (nIndex < nCount); ++nIndex ) + rStrm >> nCount; + for( sal_uInt16 nIndex = 0; !rStrm.isEof() && (nIndex < nCount); ++nIndex ) { - aModel.mnColRow = mrStrm.readuInt16(); + aModel.mnColRow = rStrm.readuInt16(); setPageBreak( aModel, bRowBreak ); if( bBiff8 ) - mrStrm.skip( 4 ); + rStrm.skip( 4 ); } } -void BiffWorksheetFragment::importPTDefinition() +void BiffWorksheetFragment::importPTDefinition( BiffInputStream& rStrm ) { - mxPTContext.reset( new BiffPivotTableContext( *this, getPivotTables().createPivotTable() ) ); - mxPTContext->importRecord(); + mxContext.reset( new BiffPivotTableContext( *this ) ); + mxContext->importRecord( rStrm ); } -void BiffWorksheetFragment::importScenarios() +void BiffWorksheetFragment::importQueryTable( BiffInputStream& rStrm ) { - getScenarios().createSheetScenarios( getSheetIndex() ).importScenarios( mrStrm ); + mxContext.reset( new BiffQueryTableContext( *this ) ); + mxContext->importRecord( rStrm ); } -void BiffWorksheetFragment::importSharedFeatHead() +void BiffWorksheetFragment::importScenarios( BiffInputStream& rStrm ) { - mrStrm.skip( 12 ); - sal_uInt16 nType = mrStrm.readuInt16(); - mrStrm.skip( 5 ); + getScenarios().createSheetScenarios( getSheetIndex() ).importScenarios( rStrm ); +} + +void BiffWorksheetFragment::importSharedFeatHead( BiffInputStream& rStrm ) +{ + rStrm.skip( 12 ); + sal_uInt16 nType = rStrm.readuInt16(); + rStrm.skip( 5 ); switch( nType ) { case BIFF_SHRFEATHEAD_SHEETPROT: - if( mrStrm.getRemaining() >= 4 ) - getWorksheetSettings().importSheetProtection( mrStrm ); + if( rStrm.getRemaining() >= 4 ) + getWorksheetSettings().importSheetProtection( rStrm ); break; } } -void BiffWorksheetFragment::importStandardWidth() +void BiffWorksheetFragment::importStandardWidth( BiffInputStream& rStrm ) { sal_uInt16 nWidth; - mrStrm >> nWidth; + rStrm >> nWidth; // width is stored as 1/256th of a character in BIFF, convert to entire character double fWidth = static_cast< double >( nWidth ) / 256.0; // set as default width, will override the width from DEFCOLWIDTH record @@ -1199,4 +1228,3 @@ void BiffWorksheetFragment::importStandardWidth() } // namespace xls } // namespace oox - diff --git a/oox/source/xls/worksheethelper.cxx b/oox/source/xls/worksheethelper.cxx index d2d42f2be369..48ffac388cfd 100644 --- a/oox/source/xls/worksheethelper.cxx +++ b/oox/source/xls/worksheethelper.cxx @@ -26,10 +26,10 @@ ************************************************************************/ #include "oox/xls/worksheethelper.hxx" + #include <algorithm> -#include <utility> #include <list> -#include <rtl/ustrbuf.hxx> +#include <utility> #include <com/sun/star/awt/Point.hpp> #include <com/sun/star/awt/Size.hpp> #include <com/sun/star/drawing/XDrawPageSupplier.hpp> @@ -37,33 +37,35 @@ #include <com/sun/star/sheet/TableValidationVisibility.hpp> #include <com/sun/star/sheet/ValidationType.hpp> #include <com/sun/star/sheet/ValidationAlertStyle.hpp> -#include <com/sun/star/sheet/XSpreadsheet.hpp> -#include <com/sun/star/sheet/XSheetCellRangeContainer.hpp> -#include <com/sun/star/sheet/XSheetCondition.hpp> #include <com/sun/star/sheet/XCellAddressable.hpp> #include <com/sun/star/sheet/XCellRangeAddressable.hpp> #include <com/sun/star/sheet/XFormulaTokens.hpp> +#include <com/sun/star/sheet/XLabelRanges.hpp> #include <com/sun/star/sheet/XMultiFormulaTokens.hpp> -#include <com/sun/star/sheet/XSheetOutline.hpp> #include <com/sun/star/sheet/XMultipleOperation.hpp> -#include <com/sun/star/sheet/XLabelRanges.hpp> +#include <com/sun/star/sheet/XSheetCellRangeContainer.hpp> +#include <com/sun/star/sheet/XSheetCondition.hpp> +#include <com/sun/star/sheet/XSheetOutline.hpp> +#include <com/sun/star/sheet/XSpreadsheet.hpp> #include <com/sun/star/table/XColumnRowRange.hpp> +#include <com/sun/star/text/WritingMode2.hpp> #include <com/sun/star/text/XText.hpp> #include <com/sun/star/util/NumberFormat.hpp> #include <com/sun/star/util/XMergeable.hpp> -#include <com/sun/star/util/XNumberFormatsSupplier.hpp> #include <com/sun/star/util/XNumberFormatTypes.hpp> -#include "properties.hxx" -#include "tokens.hxx" +#include <com/sun/star/util/XNumberFormatsSupplier.hpp> +#include <rtl/ustrbuf.hxx> +#include "oox/core/filterbase.hxx" #include "oox/helper/containerhelper.hxx" #include "oox/helper/propertyset.hxx" -#include "oox/core/filterbase.hxx" #include "oox/xls/addressconverter.hxx" +#include "oox/xls/autofilterbuffer.hxx" #include "oox/xls/commentsbuffer.hxx" #include "oox/xls/condformatbuffer.hxx" #include "oox/xls/drawingfragment.hxx" #include "oox/xls/formulaparser.hxx" #include "oox/xls/pagesettings.hxx" +#include "oox/xls/querytablebuffer.hxx" #include "oox/xls/sharedformulabuffer.hxx" #include "oox/xls/sharedstringsbuffer.hxx" #include "oox/xls/stylesbuffer.hxx" @@ -73,72 +75,42 @@ #include "oox/xls/worksheetbuffer.hxx" #include "oox/xls/worksheetsettings.hxx" -using ::rtl::OUString; -using ::rtl::OUStringBuffer; -using ::com::sun::star::awt::Point; -using ::com::sun::star::awt::Rectangle; -using ::com::sun::star::awt::Size; -using ::com::sun::star::beans::XPropertySet; -using ::com::sun::star::drawing::XDrawPage; -using ::com::sun::star::drawing::XDrawPageSupplier; -using ::com::sun::star::lang::Locale; -using ::com::sun::star::lang::XMultiServiceFactory; -using ::com::sun::star::sheet::ConditionOperator; -using ::com::sun::star::sheet::ValidationType; -using ::com::sun::star::sheet::ValidationAlertStyle; -using ::com::sun::star::sheet::XCellAddressable; -using ::com::sun::star::sheet::XCellRangeAddressable; -using ::com::sun::star::sheet::XFormulaTokens; -using ::com::sun::star::sheet::XLabelRanges; -using ::com::sun::star::sheet::XMultiFormulaTokens; -using ::com::sun::star::sheet::XMultipleOperation; -using ::com::sun::star::sheet::XSheetCellRangeContainer; -using ::com::sun::star::sheet::XSheetCellRanges; -using ::com::sun::star::sheet::XSheetCondition; -using ::com::sun::star::sheet::XSheetOutline; -using ::com::sun::star::sheet::XSpreadsheet; -using ::com::sun::star::table::BorderLine; -using ::com::sun::star::table::CellAddress; -using ::com::sun::star::table::CellRangeAddress; -using ::com::sun::star::table::XCell; -using ::com::sun::star::table::XCellRange; -using ::com::sun::star::table::XColumnRowRange; -using ::com::sun::star::table::XTableColumns; -using ::com::sun::star::table::XTableRows; -using ::com::sun::star::text::XText; -using ::com::sun::star::text::XTextContent; -using ::com::sun::star::text::XTextRange; -using ::com::sun::star::uno::Exception; -using ::com::sun::star::uno::Reference; -using ::com::sun::star::uno::UNO_QUERY; -using ::com::sun::star::uno::UNO_QUERY_THROW; -using ::com::sun::star::uno::UNO_SET_THROW; -using ::com::sun::star::util::DateTime; -using ::com::sun::star::util::XMergeable; -using ::com::sun::star::util::XNumberFormatsSupplier; -using ::com::sun::star::util::XNumberFormatTypes; - namespace oox { namespace xls { // ============================================================================ +using namespace ::com::sun::star::awt; +using namespace ::com::sun::star::beans; +using namespace ::com::sun::star::drawing; +using namespace ::com::sun::star::lang; +using namespace ::com::sun::star::sheet; +using namespace ::com::sun::star::table; +using namespace ::com::sun::star::text; +using namespace ::com::sun::star::uno; +using namespace ::com::sun::star::util; + +using ::rtl::OUString; +using ::rtl::OUStringBuffer; + +// ============================================================================ + namespace { -void lclUpdateProgressBar( ISegmentProgressBarRef xProgressBar, const CellRangeAddress& rUsedArea, sal_Int32 nRow ) +void lclUpdateProgressBar( const ISegmentProgressBarRef& rxProgressBar, const CellRangeAddress& rUsedArea, sal_Int32 nRow ) { - if( xProgressBar.get() && (rUsedArea.StartRow <= nRow) && (nRow <= rUsedArea.EndRow) ) + if( rxProgressBar.get() && (rUsedArea.StartRow <= nRow) && (nRow <= rUsedArea.EndRow) ) { double fPosition = static_cast< double >( nRow - rUsedArea.StartRow + 1 ) / (rUsedArea.EndRow - rUsedArea.StartRow + 1); - if( xProgressBar->getPosition() < fPosition ) - xProgressBar->setPosition( fPosition ); + if( rxProgressBar->getPosition() < fPosition ) + rxProgressBar->setPosition( fPosition ); } } -void lclUpdateProgressBar( ISegmentProgressBarRef xProgressBar, double fPosition ) +void lclUpdateProgressBar( const ISegmentProgressBarRef& rxProgressBar, double fPosition ) { - if( xProgressBar.get() ) - xProgressBar->setPosition( fPosition ); + if( rxProgressBar.get() ) + rxProgressBar->setPosition( fPosition ); } // ---------------------------------------------------------------------------- @@ -329,14 +301,14 @@ ValidationModel::ValidationModel() : { } -void ValidationModel::setBinType( sal_uInt8 nType ) +void ValidationModel::setBiffType( sal_uInt8 nType ) { static const sal_Int32 spnTypeIds[] = { XML_none, XML_whole, XML_decimal, XML_list, XML_date, XML_time, XML_textLength, XML_custom }; mnType = STATIC_ARRAY_SELECT( spnTypeIds, nType, XML_none ); } -void ValidationModel::setBinOperator( sal_uInt8 nOperator ) +void ValidationModel::setBiffOperator( sal_uInt8 nOperator ) { static const sal_Int32 spnOperators[] = { XML_between, XML_notBetween, XML_equal, XML_notEqual, @@ -344,7 +316,7 @@ void ValidationModel::setBinOperator( sal_uInt8 nOperator ) mnOperator = STATIC_ARRAY_SELECT( spnOperators, nOperator, XML_TOKEN_INVALID ); } -void ValidationModel::setBinErrorStyle( sal_uInt8 nErrorStyle ) +void ValidationModel::setBiffErrorStyle( sal_uInt8 nErrorStyle ) { static const sal_Int32 spnErrorStyles[] = { XML_stop, XML_warning, XML_information }; mnErrorStyle = STATIC_ARRAY_SELECT( spnErrorStyles, nErrorStyle, XML_stop ); @@ -358,7 +330,7 @@ class WorksheetData : public WorkbookHelper public: explicit WorksheetData( const WorkbookHelper& rHelper, - ISegmentProgressBarRef xProgressBar, + const ISegmentProgressBarRef& rxProgressBar, WorksheetType eSheetType, sal_Int16 nSheet ); @@ -416,11 +388,15 @@ public: inline CondFormatBuffer& getCondFormats() { return maCondFormats; } /** Returns the buffer for all cell comments in this sheet. */ inline CommentsBuffer& getComments() { return maComments; } + /** Returns the auto filters for the sheet. */ + inline AutoFilterBuffer& getAutoFilters() { return maAutoFilters; } + /** Returns the buffer for all web query tables in this sheet. */ + inline QueryTableBuffer& getQueryTables() { return maQueryTables; } /** Returns the page/print settings for this sheet. */ inline PageSettings& getPageSettings() { return maPageSett; } /** Returns the view settings for this sheet. */ inline SheetViewSettings& getSheetViewSettings() { return maSheetViewSett; } - /** Returns the VML drawing page for this sheet (OOX only!). */ + /** Returns the VML drawing page for this sheet (OOXML/BIFF12 only!). */ inline VmlDrawing& getVmlDrawing() { return *mxVmlDrawing; } /** Changes the current sheet type. */ @@ -543,13 +519,6 @@ private: /** Merges the passed merged range and updates right/bottom cell borders. */ void finalizeMergedRange( const CellRangeAddress& rRange ); - /** Imports the drawing layer of the sheet (DrawingML part). */ - void finalizeDrawing(); - /** Imports the drawing layer of the sheet (VML part). */ - void finalizeVmlDrawing(); - /** Extends the used cell area with the area used by drawing objects. */ - void finalizeUsedArea(); - /** Converts column properties for all columns in the sheet. */ void convertColumns(); /** Converts column properties. */ @@ -565,6 +534,9 @@ private: /** Groups columns or rows for the given range. */ void groupColumnsOrRows( sal_Int32 nFirstColRow, sal_Int32 nLastColRow, bool bCollapsed, bool bRows ); + /** Imports the drawings of the sheet (DML, VML), and updates the used area. */ + void finalizeDrawings(); + private: typedef ::std::auto_ptr< VmlDrawing > VmlDrawingPtr; @@ -589,6 +561,8 @@ private: SharedFormulaBuffer maSharedFmlas; /// Buffer for shared formulas in this sheet. CondFormatBuffer maCondFormats; /// Buffer for conditional formattings. CommentsBuffer maComments; /// Buffer for all cell comments in this sheet. + AutoFilterBuffer maAutoFilters; /// Sheet auto filters (not associated to a table). + QueryTableBuffer maQueryTables; /// Buffer for all web query tables in this sheet. PageSettings maPageSett; /// Page/print settings for this sheet. SheetViewSettings maSheetViewSett; /// View settings for this sheet. VmlDrawingPtr mxVmlDrawing; /// Collection of all VML shapes. @@ -605,7 +579,7 @@ private: // ---------------------------------------------------------------------------- -WorksheetData::WorksheetData( const WorkbookHelper& rHelper, ISegmentProgressBarRef xProgressBar, WorksheetType eSheetType, sal_Int16 nSheet ) : +WorksheetData::WorksheetData( const WorkbookHelper& rHelper, const ISegmentProgressBarRef& rxProgressBar, WorksheetType eSheetType, sal_Int16 nSheet ) : WorkbookHelper( rHelper ), maTrueFormula( CREATE_OUSTRING( "=TRUE()" ) ), maFalseFormula( CREATE_OUSTRING( "=FALSE()" ) ), @@ -617,9 +591,11 @@ WorksheetData::WorksheetData( const WorkbookHelper& rHelper, ISegmentProgressBar maSharedFmlas( *this ), maCondFormats( *this ), maComments( *this ), + maAutoFilters( *this ), + maQueryTables( *this ), maPageSett( *this ), maSheetViewSett( *this ), - mxProgressBar( xProgressBar ), + mxProgressBar( rxProgressBar ), meSheetType( eSheetType ), mbHasDefWidth( false ) { @@ -645,7 +621,7 @@ WorksheetData::WorksheetData( const WorkbookHelper& rHelper, ISegmentProgressBar maDefRowModel.mbCollapsed = false; // buffers - if( getFilterType() == FILTER_OOX ) + if( getFilterType() == FILTER_OOXML ) mxVmlDrawing.reset( new VmlDrawing( *this ) ); // prepare progress bars @@ -1021,25 +997,17 @@ void WorksheetData::extendUsedArea( const CellRangeAddress& rRange ) void WorksheetData::extendShapeBoundingBox( const Rectangle& rShapeRect ) { - // scale EMUs to 1/100 mm - const UnitConverter& rUnitConv = getUnitConverter(); - Rectangle aShapeRectHmm( - rUnitConv.scaleToMm100( rShapeRect.X, UNIT_EMU ), - rUnitConv.scaleToMm100( rShapeRect.Y, UNIT_EMU ), - rUnitConv.scaleToMm100( rShapeRect.Width, UNIT_EMU ), - rUnitConv.scaleToMm100( rShapeRect.Height, UNIT_EMU ) ); - if( (maShapeBoundingBox.Width == 0) && (maShapeBoundingBox.Height == 0) ) { // width and height of maShapeBoundingBox are assumed to be zero on first cell - maShapeBoundingBox = aShapeRectHmm; + maShapeBoundingBox = rShapeRect; } else { - sal_Int32 nEndX = ::std::max( maShapeBoundingBox.X + maShapeBoundingBox.Width, aShapeRectHmm.X + aShapeRectHmm.Width ); - sal_Int32 nEndY = ::std::max( maShapeBoundingBox.Y + maShapeBoundingBox.Height, aShapeRectHmm.Y + aShapeRectHmm.Height ); - maShapeBoundingBox.X = ::std::min( maShapeBoundingBox.X, aShapeRectHmm.X ); - maShapeBoundingBox.Y = ::std::min( maShapeBoundingBox.Y, aShapeRectHmm.Y ); + sal_Int32 nEndX = ::std::max( maShapeBoundingBox.X + maShapeBoundingBox.Width, rShapeRect.X + rShapeRect.Width ); + sal_Int32 nEndY = ::std::max( maShapeBoundingBox.Y + maShapeBoundingBox.Height, rShapeRect.Y + rShapeRect.Height ); + maShapeBoundingBox.X = ::std::min( maShapeBoundingBox.X, rShapeRect.X ); + maShapeBoundingBox.Y = ::std::min( maShapeBoundingBox.Y, rShapeRect.Y ); maShapeBoundingBox.Width = nEndX - maShapeBoundingBox.X; maShapeBoundingBox.Height = nEndY - maShapeBoundingBox.Y; } @@ -1069,7 +1037,7 @@ void WorksheetData::setDefaultColumnWidth( double fWidth ) void WorksheetData::setColumnModel( const ColumnModel& rModel ) { - // convert 1-based OOX column indexes to 0-based API column indexes + // convert 1-based OOXML column indexes to 0-based API column indexes sal_Int32 nFirstCol = rModel.mnFirstCol - 1; sal_Int32 nLastCol = rModel.mnLastCol - 1; if( (0 <= nFirstCol) && (nFirstCol <= mrMaxApiPos.Column) ) @@ -1093,7 +1061,7 @@ void WorksheetData::setDefaultRowSettings( double fHeight, bool bCustomHeight, b void WorksheetData::setRowModel( const RowModel& rModel ) { - // convert 1-based OOX row indexes to 0-based API row indexes + // convert 1-based OOXML row indexes to 0-based API row indexes sal_Int32 nFirstRow = rModel.mnFirstRow - 1; sal_Int32 nLastRow = rModel.mnLastRow - 1; if( (0 <= nFirstRow) && (nFirstRow <= mrMaxApiPos.Row) ) @@ -1161,8 +1129,10 @@ void WorksheetData::finalizeWorksheetImport() finalizeHyperlinkRanges(); finalizeValidationRanges(); finalizeMergedRanges(); + maAutoFilters.finalizeImport( getSheetIndex() ); maSheetSett.finalizeImport(); maCondFormats.finalizeImport(); + maQueryTables.finalizeImport(); maPageSett.finalizeImport(); maSheetViewSett.finalizeImport(); maSheetSett.finalizeImport(); @@ -1171,10 +1141,7 @@ void WorksheetData::finalizeWorksheetImport() convertColumns(); convertRows(); lclUpdateProgressBar( mxFinalProgress, 0.75 ); - finalizeDrawing(); - finalizeVmlDrawing(); - maComments.finalizeImport(); // after VML drawing - finalizeUsedArea(); // after DML and VML drawing + finalizeDrawings(); lclUpdateProgressBar( mxFinalProgress, 1.0 ); // reset current sheet index in global data @@ -1432,8 +1399,8 @@ void WorksheetData::finalizeValidationRanges() const { PropertySet aPropSet( getCellRangeList( aIt->maRanges ) ); - Reference< XPropertySet > xValidation; - if( aPropSet.getProperty( xValidation, PROP_Validation ) && xValidation.is() ) + Reference< XPropertySet > xValidation( aPropSet.getAnyProperty( PROP_Validation ), UNO_QUERY ); + if( xValidation.is() ) { PropertySet aValProps( xValidation ); namespace csss = ::com::sun::star::sheet; @@ -1561,42 +1528,6 @@ void WorksheetData::finalizeMergedRange( const CellRangeAddress& rRange ) } } -void WorksheetData::finalizeDrawing() -{ - OSL_ENSURE( (getFilterType() == FILTER_OOX) || (maDrawingPath.getLength() == 0), - "WorksheetData::finalizeDrawing - unexpected DrawingML path" ); - if( (getFilterType() == FILTER_OOX) && (maDrawingPath.getLength() > 0) ) - importOoxFragment( new OoxDrawingFragment( *this, maDrawingPath ) ); -} - -void WorksheetData::finalizeVmlDrawing() -{ - OSL_ENSURE( (getFilterType() == FILTER_OOX) || (maVmlDrawingPath.getLength() == 0), - "WorksheetData::finalizeVmlDrawing - unexpected VML path" ); - if( (getFilterType() == FILTER_OOX) && (maVmlDrawingPath.getLength() > 0) ) - importOoxFragment( new OoxVmlDrawingFragment( *this, maVmlDrawingPath ) ); -} - -void WorksheetData::finalizeUsedArea() -{ - /* Extend used area of the sheet by cells covered with drawing objects. - Needed if the imported document is inserted as "OLE object from file" - and thus does not provide an OLE size property by itself. */ - if( (maShapeBoundingBox.Width > 0) || (maShapeBoundingBox.Height > 0) ) - extendUsedArea( getCellRangeFromRectangle( maShapeBoundingBox ) ); - - // if no used area is set, default to A1 - if( maUsedArea.StartColumn > maUsedArea.EndColumn ) - maUsedArea.StartColumn = maUsedArea.EndColumn = 0; - if( maUsedArea.StartRow > maUsedArea.EndRow ) - maUsedArea.StartRow = maUsedArea.EndRow = 0; - - /* Register the used area of this sheet in global view settings. The - global view settings will set the visible area if this document is an - embedded OLE object. */ - getViewSettings().setSheetUsedArea( maUsedArea ); -} - void WorksheetData::convertColumns() { sal_Int32 nNextCol = 0; @@ -1606,7 +1537,7 @@ void WorksheetData::convertColumns() for( ColumnModelMap::const_iterator aIt = maColModels.begin(), aEnd = maColModels.end(); aIt != aEnd; ++aIt ) { - // convert 1-based OOX column indexes to 0-based API column indexes + // convert 1-based OOXML column indexes to 0-based API column indexes sal_Int32 nFirstCol = ::std::max( aIt->second.mnFirstCol - 1, nNextCol ); sal_Int32 nLastCol = ::std::min( aIt->second.mnLastCol - 1, nMaxCol ); @@ -1656,7 +1587,7 @@ void WorksheetData::convertRows() for( RowModelMap::const_iterator aIt = maRowModels.begin(), aEnd = maRowModels.end(); aIt != aEnd; ++aIt ) { - // convert 1-based OOX row indexes to 0-based API row indexes + // convert 1-based OOXML row indexes to 0-based API row indexes sal_Int32 nFirstRow = ::std::max( aIt->second.mnFirstRow - 1, nNextRow ); sal_Int32 nLastRow = ::std::min( aIt->second.mnLastRow - 1, nMaxRow ); @@ -1761,6 +1692,55 @@ void WorksheetData::groupColumnsOrRows( sal_Int32 nFirstColRow, sal_Int32 nLastC } } +void WorksheetData::finalizeDrawings() +{ + switch( getFilterType() ) + { + case FILTER_OOXML: + // import DML and VML + if( maDrawingPath.getLength() > 0 ) + importOoxFragment( new DrawingFragment( *this, maDrawingPath ) ); + if( maVmlDrawingPath.getLength() > 0 ) + importOoxFragment( new VmlDrawingFragment( *this, maVmlDrawingPath ) ); + break; + + case FILTER_BIFF: + // TODO: import DFF shapes + break; + + case FILTER_UNKNOWN: + break; + } + + // comments (after callout shapes have been imported from VML/DFF) + maComments.finalizeImport(); + + /* Extend used area of the sheet by cells covered with drawing objects. + Needed if the imported document is inserted as "OLE object from file" + and thus does not provide an OLE size property by itself. */ + if( (maShapeBoundingBox.Width > 0) || (maShapeBoundingBox.Height > 0) ) + extendUsedArea( getCellRangeFromRectangle( maShapeBoundingBox ) ); + + // if no used area is set, default to A1 + if( maUsedArea.StartColumn > maUsedArea.EndColumn ) + maUsedArea.StartColumn = maUsedArea.EndColumn = 0; + if( maUsedArea.StartRow > maUsedArea.EndRow ) + maUsedArea.StartRow = maUsedArea.EndRow = 0; + + /* Register the used area of this sheet in global view settings. The + global view settings will set the visible area if this document is an + embedded OLE object. */ + getViewSettings().setSheetUsedArea( maUsedArea ); + + /* #i103686# Set right-to-left sheet layout. Must be done after all + drawing shapes to simplify calculation of shape coordinates. */ + if( maSheetViewSett.isSheetRightToLeft() ) + { + PropertySet aPropSet( mxSheet ); + aPropSet.setProperty( PROP_TableLayout, ::com::sun::star::text::WritingMode2::RL_TB ); + } +} + // ============================================================================ // ============================================================================ @@ -1942,6 +1922,16 @@ CommentsBuffer& WorksheetHelper::getComments() const return mrSheetData.getComments(); } +AutoFilterBuffer& WorksheetHelper::getAutoFilters() const +{ + return mrSheetData.getAutoFilters(); +} + +QueryTableBuffer& WorksheetHelper::getQueryTables() const +{ + return mrSheetData.getQueryTables(); +} + PageSettings& WorksheetHelper::getPageSettings() const { return mrSheetData.getPageSettings(); @@ -2140,44 +2130,51 @@ void WorksheetHelper::setTableOperation( const CellRangeAddress& rRange, const D void WorksheetHelper::setLabelRanges( const ApiCellRangeList& rColRanges, const ApiCellRangeList& rRowRanges ) { const CellAddress& rMaxPos = getAddressConverter().getMaxApiAddress(); - Reference< XLabelRanges > xLabelRanges; PropertySet aPropSet( getSheet() ); - if( !rColRanges.empty() && aPropSet.getProperty( xLabelRanges, PROP_ColumnLabelRanges ) && xLabelRanges.is() ) + if( !rColRanges.empty() ) { - for( ApiCellRangeList::const_iterator aIt = rColRanges.begin(), aEnd = rColRanges.end(); aIt != aEnd; ++aIt ) + Reference< XLabelRanges > xLabelRanges( aPropSet.getAnyProperty( PROP_ColumnLabelRanges ), UNO_QUERY ); + if( xLabelRanges.is() ) { - CellRangeAddress aDataRange = *aIt; - if( aDataRange.EndRow < rMaxPos.Row ) + for( ApiCellRangeList::const_iterator aIt = rColRanges.begin(), aEnd = rColRanges.end(); aIt != aEnd; ++aIt ) { - aDataRange.StartRow = aDataRange.EndRow + 1; - aDataRange.EndRow = rMaxPos.Row; - } - else if( aDataRange.StartRow > 0 ) - { - aDataRange.EndRow = aDataRange.StartRow - 1; - aDataRange.StartRow = 0; + CellRangeAddress aDataRange = *aIt; + if( aDataRange.EndRow < rMaxPos.Row ) + { + aDataRange.StartRow = aDataRange.EndRow + 1; + aDataRange.EndRow = rMaxPos.Row; + } + else if( aDataRange.StartRow > 0 ) + { + aDataRange.EndRow = aDataRange.StartRow - 1; + aDataRange.StartRow = 0; + } + xLabelRanges->addNew( *aIt, aDataRange ); } - xLabelRanges->addNew( *aIt, aDataRange ); } } - if( !rRowRanges.empty() && aPropSet.getProperty( xLabelRanges, PROP_RowLabelRanges ) && xLabelRanges.is() ) + if( !rRowRanges.empty() ) { - for( ApiCellRangeList::const_iterator aIt = rRowRanges.begin(), aEnd = rRowRanges.end(); aIt != aEnd; ++aIt ) + Reference< XLabelRanges > xLabelRanges( aPropSet.getAnyProperty( PROP_RowLabelRanges ), UNO_QUERY ); + if( xLabelRanges.is() ) { - CellRangeAddress aDataRange = *aIt; - if( aDataRange.EndColumn < rMaxPos.Column ) + for( ApiCellRangeList::const_iterator aIt = rRowRanges.begin(), aEnd = rRowRanges.end(); aIt != aEnd; ++aIt ) { - aDataRange.StartColumn = aDataRange.EndColumn + 1; - aDataRange.EndColumn = rMaxPos.Column; - } - else if( aDataRange.StartColumn > 0 ) - { - aDataRange.EndColumn = aDataRange.StartColumn - 1; - aDataRange.StartColumn = 0; + CellRangeAddress aDataRange = *aIt; + if( aDataRange.EndColumn < rMaxPos.Column ) + { + aDataRange.StartColumn = aDataRange.EndColumn + 1; + aDataRange.EndColumn = rMaxPos.Column; + } + else if( aDataRange.StartColumn > 0 ) + { + aDataRange.EndColumn = aDataRange.StartColumn - 1; + aDataRange.StartColumn = 0; + } + xLabelRanges->addNew( *aIt, aDataRange ); } - xLabelRanges->addNew( *aIt, aDataRange ); } } } @@ -2264,8 +2261,8 @@ WorksheetDataOwner::~WorksheetDataOwner() // ---------------------------------------------------------------------------- -WorksheetHelperRoot::WorksheetHelperRoot( const WorkbookHelper& rHelper, ISegmentProgressBarRef xProgressBar, WorksheetType eSheetType, sal_Int16 nSheet ) : - prv::WorksheetDataOwner( prv::WorksheetDataRef( new WorksheetData( rHelper, xProgressBar, eSheetType, nSheet ) ) ), +WorksheetHelperRoot::WorksheetHelperRoot( const WorkbookHelper& rHelper, const ISegmentProgressBarRef& rxProgressBar, WorksheetType eSheetType, sal_Int16 nSheet ) : + prv::WorksheetDataOwner( prv::WorksheetDataRef( new WorksheetData( rHelper, rxProgressBar, eSheetType, nSheet ) ) ), WorksheetHelper( *mxSheetData ) { } @@ -2292,4 +2289,3 @@ bool WorksheetHelperRoot::isValidSheet() const } // namespace xls } // namespace oox - diff --git a/oox/source/xls/worksheetsettings.cxx b/oox/source/xls/worksheetsettings.cxx index 0cc9d5f17780..cc1aa45f2012 100644 --- a/oox/source/xls/worksheetsettings.cxx +++ b/oox/source/xls/worksheetsettings.cxx @@ -26,41 +26,41 @@ ************************************************************************/ #include "oox/xls/worksheetsettings.hxx" + +#include <com/sun/star/util/XProtectable.hpp> +#include "oox/core/filterbase.hxx" #include "oox/helper/attributelist.hxx" -#include "oox/helper/recordinputstream.hxx" #include "oox/xls/biffinputstream.hxx" #include "oox/xls/pagesettings.hxx" #include "oox/xls/workbooksettings.hxx" -#include "oox/core/filterbase.hxx" -#include "properties.hxx" - -#include <com/sun/star/util/XProtectable.hpp> - -using ::rtl::OUString; -using ::com::sun::star::beans::XPropertySet; -using ::com::sun::star::uno::Any; -using ::com::sun::star::uno::Exception; -using ::com::sun::star::uno::Reference; -using ::com::sun::star::uno::UNO_QUERY_THROW; -using ::com::sun::star::util::XProtectable; -using ::oox::core::CodecHelper; namespace oox { namespace xls { // ============================================================================ +using namespace ::com::sun::star::beans; +using namespace ::com::sun::star::uno; +using namespace ::com::sun::star::util; + +using ::oox::core::CodecHelper; +using ::rtl::OUString; + +// ============================================================================ + namespace { -const sal_uInt8 OOBIN_SHEETPR_FILTERMODE = 0x01; -const sal_uInt8 OOBIN_SHEETPR_EVAL_CF = 0x02; +const sal_uInt8 BIFF12_SHEETPR_FILTERMODE = 0x01; +const sal_uInt8 BIFF12_SHEETPR_EVAL_CF = 0x02; + +const sal_uInt32 BIFF_SHEETEXT_NOTABCOLOR = 0x7F; const sal_uInt16 BIFF_SHEETPR_DIALOGSHEET = 0x0010; const sal_uInt16 BIFF_SHEETPR_APPLYSTYLES = 0x0020; const sal_uInt16 BIFF_SHEETPR_SYMBOLSBELOW = 0x0040; const sal_uInt16 BIFF_SHEETPR_SYMBOLSRIGHT = 0x0080; const sal_uInt16 BIFF_SHEETPR_FITTOPAGES = 0x0100; -const sal_uInt16 BIFF_SHEETPR_SKIPEXT = 0x0200; /// BIFF3-BIFF4 +const sal_uInt16 BIFF_SHEETPR_SKIPEXT = 0x0200; // BIFF3-BIFF4 const sal_uInt32 BIFF_SHEETPROT_OBJECTS = 0x00000001; const sal_uInt32 BIFF_SHEETPROT_SCENARIOS = 0x00000002; @@ -177,7 +177,7 @@ void WorksheetSettings::importPhoneticPr( const AttributeList& rAttribs ) maPhoneticSett.importPhoneticPr( rAttribs ); } -void WorksheetSettings::importSheetPr( RecordInputStream& rStrm ) +void WorksheetSettings::importSheetPr( SequenceInputStream& rStrm ) { sal_uInt16 nFlags1; sal_uInt8 nFlags2; @@ -185,8 +185,8 @@ void WorksheetSettings::importSheetPr( RecordInputStream& rStrm ) rStrm.skip( 8 ); // sync anchor cell rStrm >> maSheetSettings.maCodeName; // sheet settings - maSheetSettings.mbFilterMode = getFlag( nFlags2, OOBIN_SHEETPR_FILTERMODE ); - // outline settings, equal flags in BIFF and OOBIN + maSheetSettings.mbFilterMode = getFlag( nFlags2, BIFF12_SHEETPR_FILTERMODE ); + // outline settings, equal flags in all BIFFs maSheetSettings.mbApplyStyles = getFlag( nFlags1, BIFF_SHEETPR_APPLYSTYLES ); maSheetSettings.mbSummaryRight = getFlag( nFlags1, BIFF_SHEETPR_SYMBOLSRIGHT ); maSheetSettings.mbSummaryBelow = getFlag( nFlags1, BIFF_SHEETPR_SYMBOLSBELOW ); @@ -195,13 +195,13 @@ void WorksheetSettings::importSheetPr( RecordInputStream& rStrm ) getPageSettings().setFitToPagesMode( getFlag( nFlags1, BIFF_SHEETPR_FITTOPAGES ) ); } -void WorksheetSettings::importChartSheetPr( RecordInputStream& rStrm ) +void WorksheetSettings::importChartSheetPr( SequenceInputStream& rStrm ) { rStrm.skip( 2 ); // flags, contains only the 'published' flag rStrm >> maSheetSettings.maTabColor >> maSheetSettings.maCodeName; } -void WorksheetSettings::importSheetProtection( RecordInputStream& rStrm ) +void WorksheetSettings::importSheetProtection( SequenceInputStream& rStrm ) { rStrm >> maSheetProt.mnPasswordHash; // no flags field for all these boolean flags?!? @@ -223,7 +223,7 @@ void WorksheetSettings::importSheetProtection( RecordInputStream& rStrm ) maSheetProt.mbSelectUnlocked = rStrm.readInt32() != 0; } -void WorksheetSettings::importChartProtection( RecordInputStream& rStrm ) +void WorksheetSettings::importChartProtection( SequenceInputStream& rStrm ) { rStrm >> maSheetProt.mnPasswordHash; // no flags field for all these boolean flags?!? @@ -231,11 +231,21 @@ void WorksheetSettings::importChartProtection( RecordInputStream& rStrm ) maSheetProt.mbObjects = rStrm.readInt32() != 0; } -void WorksheetSettings::importPhoneticPr( RecordInputStream& rStrm ) +void WorksheetSettings::importPhoneticPr( SequenceInputStream& rStrm ) { maPhoneticSett.importPhoneticPr( rStrm ); } +void WorksheetSettings::importSheetExt( BiffInputStream& rStrm ) +{ + rStrm.skip( 16 ); + sal_uInt32 nFlags; + rStrm >> nFlags; + sal_uInt8 nColorIdx = extractValue< sal_uInt8 >( nFlags, 0, 7 ); + if( nColorIdx != BIFF_SHEETEXT_NOTABCOLOR ) + maSheetSettings.maTabColor.setPaletteClr( nColorIdx ); +} + void WorksheetSettings::importSheetPr( BiffInputStream& rStrm ) { sal_uInt16 nFlags; @@ -324,10 +334,11 @@ void WorksheetSettings::finalizeImport() PropertySet aPropSet( getSheet() ); aPropSet.setProperty( PROP_CodeName, maSheetSettings.maCodeName ); - if (!maSheetSettings.maTabColor.isAuto()) + // sheet tab color + if( !maSheetSettings.maTabColor.isAuto() ) { - sal_Int32 nColor = maSheetSettings.maTabColor.getColor(getBaseFilter().getGraphicHelper()); - aPropSet.setProperty(PROP_TabColor, nColor); + sal_Int32 nColor = maSheetSettings.maTabColor.getColor( getBaseFilter().getGraphicHelper() ); + aPropSet.setProperty( PROP_TabColor, nColor ); } } @@ -335,4 +346,3 @@ void WorksheetSettings::finalizeImport() } // namespace xls } // namespace oox - |