diff options
Diffstat (limited to 'sc/source/filter/xml/xmlexprt.cxx')
-rw-r--r-- | sc/source/filter/xml/xmlexprt.cxx | 4458 |
1 files changed, 0 insertions, 4458 deletions
diff --git a/sc/source/filter/xml/xmlexprt.cxx b/sc/source/filter/xml/xmlexprt.cxx deleted file mode 100644 index 268c8d2a2..000000000 --- a/sc/source/filter/xml/xmlexprt.cxx +++ /dev/null @@ -1,4458 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/************************************************************************* - * - * 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. - * - ************************************************************************/ - -// MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_sc.hxx" - -// INCLUDE --------------------------------------------------------------- - -#include <editeng/eeitem.hxx> - -#include "xmlexprt.hxx" -#include "XMLConverter.hxx" -#include "xmlstyle.hxx" -#include "unonames.hxx" -#include "document.hxx" -#include "olinetab.hxx" -#include "cellsuno.hxx" -#include "cell.hxx" -#include "rangenam.hxx" -#include "XMLTableMasterPageExport.hxx" -#include "drwlayer.hxx" -#include "XMLExportDataPilot.hxx" -#include "XMLExportDatabaseRanges.hxx" -#include "XMLExportDDELinks.hxx" -#include "XMLExportIterator.hxx" -#include "XMLColumnRowGroupExport.hxx" -#include "XMLStylesExportHelper.hxx" -#include "XMLChangeTrackingExportHelper.hxx" -#include "sheetdata.hxx" -#include "docoptio.hxx" -#include "XMLExportSharedData.hxx" -#include "chgviset.hxx" -#include "docuno.hxx" -#include "textuno.hxx" -#include "chartlis.hxx" -#include "scitems.hxx" -#include "docpool.hxx" -#include "userdat.hxx" -#include "dociter.hxx" -#include "chgtrack.hxx" -#include "rangeutl.hxx" -#include "convuno.hxx" -#include "postit.hxx" -#include "externalrefmgr.hxx" -#include "editutil.hxx" -#include "tabprotection.hxx" -#include "cachedattraccess.hxx" - -#include <xmloff/xmltoken.hxx> -#include <xmloff/xmlnmspe.hxx> -#include <xmloff/xmluconv.hxx> -#include <xmloff/nmspmap.hxx> -#include <xmloff/families.hxx> -#include <xmloff/numehelp.hxx> -#include <xmloff/xmluconv.hxx> -#include <xmloff/txtparae.hxx> -#include <xmloff/xmlcnitm.hxx> -#include <xmloff/xmlerror.hxx> -#include <xmloff/XMLEventExport.hxx> - -#include <rtl/ustring.hxx> - -#include "tools/color.hxx" -#include <rtl/math.hxx> -#include <svl/zforlist.hxx> -#include <svx/unoshape.hxx> -#include <comphelper/extract.hxx> -#include <editeng/eeitem.hxx> -#include <toolkit/helper/convert.hxx> -#include <svx/svdobj.hxx> -#include <svx/svdocapt.hxx> -#include <editeng/outlobj.hxx> -#include <svx/svditer.hxx> -#include <svx/svdpage.hxx> - -#include <comphelper/processfactory.hxx> -#include <com/sun/star/sheet/XUsedAreaCursor.hpp> -#include <com/sun/star/sheet/XCellRangeAddressable.hpp> -#include <com/sun/star/sheet/XAreaLinks.hpp> -#include <com/sun/star/sheet/XAreaLink.hpp> -#include <com/sun/star/drawing/XDrawPageSupplier.hpp> -#include <com/sun/star/table/XColumnRowRange.hpp> -#include <com/sun/star/sheet/XPrintAreas.hpp> -#include <com/sun/star/container/XNamed.hpp> -#include <com/sun/star/util/XProtectable.hpp> -#include <com/sun/star/style/XStyleFamiliesSupplier.hpp> -#include <com/sun/star/sheet/XUniqueCellFormatRangesSupplier.hpp> -#include <com/sun/star/sheet/XCellRangesQuery.hpp> -#include <com/sun/star/sheet/CellFlags.hpp> -#include <com/sun/star/util/XMergeable.hpp> -#include <com/sun/star/sheet/XArrayFormulaRange.hpp> -#include <com/sun/star/text/XText.hpp> -#include <com/sun/star/sheet/XLabelRanges.hpp> -#include <com/sun/star/sheet/XLabelRange.hpp> -#include <com/sun/star/sheet/XNamedRanges.hpp> -#include <com/sun/star/sheet/XNamedRange.hpp> -#include <com/sun/star/sheet/XCellRangeReferrer.hpp> -#include <com/sun/star/sheet/NamedRangeFlag.hpp> -#include <com/sun/star/container/XNamed.hpp> -#include <com/sun/star/sheet/XSheetLinkable.hpp> -#include <com/sun/star/form/XFormsSupplier2.hpp> -#include <com/sun/star/io/XActiveDataSource.hpp> -#include <com/sun/star/io/XSeekable.hpp> -#include <com/sun/star/beans/XPropertySet.hpp> - -#include <com/sun/star/chart2/XChartDocument.hpp> -#include <com/sun/star/chart2/data/XRangeXMLConversion.hpp> -#include <com/sun/star/chart2/data/XDataReceiver.hpp> - -#include <com/sun/star/document/XDocumentProperties.hpp> -#include <com/sun/star/document/XDocumentPropertiesSupplier.hpp> - -#include "XMLCodeNameProvider.hxx" - -#include <sfx2/objsh.hxx> - -#include <vector> - -//! not found in unonames.hxx -#define SC_STANDARDFORMAT "StandardFormat" -#define SC_LAYERID "LayerID" - -#define SC_DEFAULT_TABLE_COUNT 3 -#define SC_VIEWCHANGES_COUNT 13 -#define SC_SHOW_CHANGES 0 -#define SC_SHOW_ACCEPTED_CHANGES 1 -#define SC_SHOW_REJECTED_CHANGES 2 -#define SC_SHOW_CHANGES_BY_DATETIME 3 -#define SC_SHOW_CHANGES_BY_DATETIME_MODE 4 -#define SC_SHOW_CHANGES_BY_DATETIME_FIRST_DATETIME 5 -#define SC_SHOW_CHANGES_BY_DATETIME_SECOND_DATETIME 6 -#define SC_SHOW_CHANGES_BY_AUTHOR 7 -#define SC_SHOW_CHANGES_BY_AUTHOR_NAME 8 -#define SC_SHOW_CHANGES_BY_COMMENT 9 -#define SC_SHOW_CHANGES_BY_COMMENT_TEXT 10 -#define SC_SHOW_CHANGES_BY_RANGES 11 -#define SC_SHOW_CHANGES_BY_RANGES_LIST 12 - -using namespace formula; -using namespace com::sun::star; -using namespace xmloff::token; -using ::std::vector; -using ::rtl::OUString; -using ::rtl::OUStringBuffer; -using ::com::sun::star::uno::Reference; -using ::com::sun::star::uno::UNO_QUERY; - -//---------------------------------------------------------------------------- - -namespace -{ -OUString lcl_RangeSequenceToString( - const uno::Sequence< OUString > & rRanges, - const uno::Reference< chart2::data::XRangeXMLConversion > & xFormatConverter ) -{ - OUStringBuffer aResult; - const sal_Int32 nMaxIndex( rRanges.getLength() - 1 ); - const sal_Unicode cSep( sal_Char(' ')); - for( sal_Int32 i=0; i<=nMaxIndex; ++i ) - { - OUString aRange( rRanges[i] ); - if( xFormatConverter.is()) - aRange = xFormatConverter->convertRangeToXML( aRange ); - aResult.append( aRange ); - if( i < nMaxIndex ) - aResult.append( cSep ); - } - return aResult.makeStringAndClear(); -} - -OUString lcl_GetRawString( ScDocument* pDoc, const ScAddress& rPos ) -{ - // return text/edit cell string content, with line feeds in edit cells - - String aVal; // document uses tools-strings - if (pDoc) - { - ScBaseCell* pCell = pDoc->GetCell( rPos ); - if (pCell) - { - CellType eType = pCell->GetCellType(); - if ( eType == CELLTYPE_STRING ) - static_cast<ScStringCell*>(pCell)->GetString(aVal); // string cell: content - else if ( eType == CELLTYPE_EDIT ) - { - // edit cell: text with line breaks - const EditTextObject* pData = static_cast<ScEditCell*>(pCell)->GetData(); - if (pData) - { - EditEngine& rEngine = pDoc->GetEditEngine(); - rEngine.SetText( *pData ); - aVal = rEngine.GetText( LINEEND_LF ); - } - } - } - } - return aVal; -} -} // anonymous namespace - -//---------------------------------------------------------------------------- - -OUString SAL_CALL ScXMLOOoExport_getImplementationName() throw() -{ - return rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.comp.Calc.XMLExporter" ) ); -} - -uno::Sequence< rtl::OUString > SAL_CALL ScXMLOOoExport_getSupportedServiceNames() throw() -{ - const rtl::OUString aServiceName( ScXMLOOoExport_getImplementationName() ); - return uno::Sequence< rtl::OUString >( &aServiceName, 1 ); -} - -uno::Reference< uno::XInterface > SAL_CALL ScXMLOOoExport_createInstance( - const uno::Reference< lang::XMultiServiceFactory > & rSMgr ) throw( uno::Exception ) -{ - return (cppu::OWeakObject*)new ScXMLExport( rSMgr, EXPORT_ALL ); -} - -OUString SAL_CALL ScXMLOOoExport_Meta_getImplementationName() throw() -{ - return rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.comp.Calc.XMLMetaExporter" ) ); -} - -uno::Sequence< rtl::OUString > SAL_CALL ScXMLOOoExport_Meta_getSupportedServiceNames() throw() -{ - const rtl::OUString aServiceName( ScXMLOOoExport_Meta_getImplementationName() ); - return uno::Sequence< rtl::OUString > ( &aServiceName, 1 ); -} - -uno::Reference< uno::XInterface > SAL_CALL ScXMLOOoExport_Meta_createInstance( - const uno::Reference< lang::XMultiServiceFactory > & rSMgr ) throw( uno::Exception ) -{ - return (cppu::OWeakObject*)new ScXMLExport( rSMgr, EXPORT_META ); -} - -OUString SAL_CALL ScXMLOOoExport_Styles_getImplementationName() throw() -{ - return rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.comp.Calc.XMLStylesExporter" ) ); -} - -uno::Sequence< rtl::OUString > SAL_CALL ScXMLOOoExport_Styles_getSupportedServiceNames() throw() -{ - const rtl::OUString aServiceName( ScXMLOOoExport_Styles_getImplementationName() ); - return uno::Sequence< rtl::OUString > ( &aServiceName, 1 ); -} - -uno::Reference< uno::XInterface > SAL_CALL ScXMLOOoExport_Styles_createInstance( - const uno::Reference< lang::XMultiServiceFactory > & rSMgr ) throw( uno::Exception ) -{ - return (cppu::OWeakObject*)new ScXMLExport( rSMgr, EXPORT_STYLES|EXPORT_MASTERSTYLES|EXPORT_AUTOSTYLES|EXPORT_FONTDECLS); -} - -OUString SAL_CALL ScXMLOOoExport_Content_getImplementationName() throw() -{ - return rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.comp.Calc.XMLContentExporter" ) ); -} - -uno::Sequence< rtl::OUString > SAL_CALL ScXMLOOoExport_Content_getSupportedServiceNames() throw() -{ - const rtl::OUString aServiceName( ScXMLOOoExport_Content_getImplementationName() ); - return uno::Sequence< rtl::OUString > ( &aServiceName, 1 ); -} - -uno::Reference< uno::XInterface > SAL_CALL ScXMLOOoExport_Content_createInstance( - const uno::Reference< lang::XMultiServiceFactory > & rSMgr ) throw( uno::Exception ) -{ - return (cppu::OWeakObject*)new ScXMLExport( rSMgr, EXPORT_AUTOSTYLES|EXPORT_CONTENT|EXPORT_SCRIPTS|EXPORT_FONTDECLS); -} - -OUString SAL_CALL ScXMLOOoExport_Settings_getImplementationName() throw() -{ - return rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.comp.Calc.XMLSettingsExporter" ) ); -} - -uno::Sequence< rtl::OUString > SAL_CALL ScXMLOOoExport_Settings_getSupportedServiceNames() throw() -{ - const rtl::OUString aServiceName( ScXMLOOoExport_Settings_getImplementationName() ); - return uno::Sequence< rtl::OUString > ( &aServiceName, 1 ); -} - -uno::Reference< uno::XInterface > SAL_CALL ScXMLOOoExport_Settings_createInstance( - const uno::Reference< lang::XMultiServiceFactory > & rSMgr ) throw( uno::Exception ) -{ - return (cppu::OWeakObject*)new ScXMLExport( rSMgr, EXPORT_SETTINGS ); -} - -// Oasis Filter - -OUString SAL_CALL ScXMLOasisExport_getImplementationName() throw() -{ - return rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.comp.Calc.XMLOasisExporter" ) ); -} - -uno::Sequence< rtl::OUString > SAL_CALL ScXMLOasisExport_getSupportedServiceNames() throw() -{ - const rtl::OUString aServiceName( ScXMLOasisExport_getImplementationName() ); - const uno::Sequence< rtl::OUString > aSeq( &aServiceName, 1 ); - return aSeq; -} - -uno::Reference< uno::XInterface > SAL_CALL ScXMLOasisExport_createInstance( - const uno::Reference< lang::XMultiServiceFactory > & rSMgr ) throw( uno::Exception ) -{ - return (cppu::OWeakObject*)new ScXMLExport(rSMgr, EXPORT_ALL|EXPORT_OASIS); -} - -OUString SAL_CALL ScXMLOasisExport_Meta_getImplementationName() throw() -{ - return rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.comp.Calc.XMLOasisMetaExporter" ) ); -} - -uno::Sequence< rtl::OUString > SAL_CALL ScXMLOasisExport_Meta_getSupportedServiceNames() throw() -{ - const rtl::OUString aServiceName( ScXMLOasisExport_Meta_getImplementationName() ); - const uno::Sequence< rtl::OUString > aSeq( &aServiceName, 1 ); - return aSeq; -} - -uno::Reference< uno::XInterface > SAL_CALL ScXMLOasisExport_Meta_createInstance( - const uno::Reference< lang::XMultiServiceFactory > & rSMgr ) throw( uno::Exception ) -{ - return (cppu::OWeakObject*)new ScXMLExport(rSMgr, EXPORT_META|EXPORT_OASIS); -} - -OUString SAL_CALL ScXMLOasisExport_Styles_getImplementationName() throw() -{ - return rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.comp.Calc.XMLOasisStylesExporter" ) ); -} - -uno::Sequence< rtl::OUString > SAL_CALL ScXMLOasisExport_Styles_getSupportedServiceNames() throw() -{ - const rtl::OUString aServiceName( ScXMLOasisExport_Styles_getImplementationName() ); - const uno::Sequence< rtl::OUString > aSeq( &aServiceName, 1 ); - return aSeq; -} - -uno::Reference< uno::XInterface > SAL_CALL ScXMLOasisExport_Styles_createInstance( - const uno::Reference< lang::XMultiServiceFactory > & rSMgr ) throw( uno::Exception ) -{ - return (cppu::OWeakObject*)new ScXMLExport(rSMgr, EXPORT_STYLES|EXPORT_MASTERSTYLES|EXPORT_AUTOSTYLES|EXPORT_FONTDECLS|EXPORT_OASIS); -} - -OUString SAL_CALL ScXMLOasisExport_Content_getImplementationName() throw() -{ - return rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.comp.Calc.XMLOasisContentExporter" ) ); -} - -uno::Sequence< rtl::OUString > SAL_CALL ScXMLOasisExport_Content_getSupportedServiceNames() throw() -{ - const rtl::OUString aServiceName( ScXMLOasisExport_Content_getImplementationName() ); - const uno::Sequence< rtl::OUString > aSeq( &aServiceName, 1 ); - return aSeq; -} - -uno::Reference< uno::XInterface > SAL_CALL ScXMLOasisExport_Content_createInstance( - const uno::Reference< lang::XMultiServiceFactory > & rSMgr ) throw( uno::Exception ) -{ - return (cppu::OWeakObject*)new ScXMLExport(rSMgr, EXPORT_AUTOSTYLES|EXPORT_CONTENT|EXPORT_SCRIPTS|EXPORT_FONTDECLS|EXPORT_OASIS); -} - -OUString SAL_CALL ScXMLOasisExport_Settings_getImplementationName() throw() -{ - return rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.comp.Calc.XMLOasisSettingsExporter" ) ); -} - -uno::Sequence< rtl::OUString > SAL_CALL ScXMLOasisExport_Settings_getSupportedServiceNames() throw() -{ - const rtl::OUString aServiceName( ScXMLOasisExport_Settings_getImplementationName() ); - const uno::Sequence< rtl::OUString > aSeq( &aServiceName, 1 ); - return aSeq; -} - -uno::Reference< uno::XInterface > SAL_CALL ScXMLOasisExport_Settings_createInstance( - const uno::Reference< lang::XMultiServiceFactory > & rSMgr ) throw( uno::Exception ) -{ - return (cppu::OWeakObject*)new ScXMLExport(rSMgr, EXPORT_SETTINGS|EXPORT_OASIS); -} -//---------------------------------------------------------------------------- - -class ScXMLShapeExport : public XMLShapeExport -{ -public: - ScXMLShapeExport(SvXMLExport& rExp) : XMLShapeExport(rExp) {} - ~ScXMLShapeExport(); - - /** is called before a shape element for the given XShape is exported */ - virtual void onExport( const uno::Reference < drawing::XShape >& xShape ); -}; - -ScXMLShapeExport::~ScXMLShapeExport() -{ -} - -void ScXMLShapeExport::onExport( const uno::Reference < drawing::XShape >& xShape ) -{ - uno::Reference< beans::XPropertySet > xShapeProp( xShape, uno::UNO_QUERY ); - if( xShapeProp.is() ) - { - sal_Int16 nLayerID = 0; - if( (xShapeProp->getPropertyValue(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( SC_LAYERID ))) >>= nLayerID) && (nLayerID == SC_LAYER_BACK) ) - GetExport().AddAttribute(XML_NAMESPACE_TABLE, XML_TABLE_BACKGROUND, XML_TRUE); - } -} - -//---------------------------------------------------------------------------- - -sal_Int16 ScXMLExport::GetFieldUnit() -{ - com::sun::star::uno::Reference<com::sun::star::beans::XPropertySet> xProperties( - comphelper::getProcessServiceFactory()->createInstance( - rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.sheet.GlobalSheetSettings" )) ), - com::sun::star::uno::UNO_QUERY); - if (xProperties.is()) - { - sal_Int16 nFieldUnit = 0; - if (xProperties->getPropertyValue(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Metric"))) >>= nFieldUnit) - return nFieldUnit; - } - return 0; -} - - -// #110680# -ScXMLExport::ScXMLExport( - const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory > xServiceFactory, - const sal_uInt16 nExportFlag) -: SvXMLExport( xServiceFactory, SvXMLUnitConverter::GetMapUnit(GetFieldUnit()), XML_SPREADSHEET, nExportFlag ), - pDoc(NULL), - nSourceStreamPos(0), - pNumberFormatAttributesExportHelper(NULL), - pSharedData(NULL), - pColumnStyles(NULL), - pRowStyles(NULL), - pCellStyles(NULL), - pRowFormatRanges(NULL), - aTableStyles(), - pGroupColumns (NULL), - pGroupRows (NULL), - pDefaults(NULL), - pChartListener(NULL), - pCurrentCell(NULL), - pMergedRangesContainer(NULL), - pValidationsContainer(NULL), - pCellsItr(NULL), - pChangeTrackingExportHelper(NULL), - sLayerID(RTL_CONSTASCII_USTRINGPARAM( SC_LAYERID )), - sCaptionShape(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.drawing.CaptionShape")), - nOpenRow(-1), - nProgressCount(0), - nCurrentTable(0), - bHasRowHeader(false), - bRowHeaderOpen(false), - mbShowProgress( false ) -{ - if (getExportFlags() & EXPORT_CONTENT) - { - pGroupColumns = new ScMyOpenCloseColumnRowGroup(*this, XML_TABLE_COLUMN_GROUP); - pGroupRows = new ScMyOpenCloseColumnRowGroup(*this, XML_TABLE_ROW_GROUP); - pColumnStyles = new ScColumnStyles(); - pRowStyles = new ScRowStyles(); - pRowFormatRanges = new ScRowFormatRanges(); - pMergedRangesContainer = new ScMyMergedRangesContainer(); - pValidationsContainer = new ScMyValidationsContainer(); - pCellsItr = new ScMyNotEmptyCellsIterator(*this); - pDefaults = new ScMyDefaultStyles(); - } - pCellStyles = new ScFormatRangeStyles(); - - // document is not set here - create ScChangeTrackingExportHelper later - - xScPropHdlFactory = new XMLScPropHdlFactory; - xCellStylesPropertySetMapper = new XMLPropertySetMapper((XMLPropertyMapEntry*)aXMLScCellStylesProperties, xScPropHdlFactory); - xColumnStylesPropertySetMapper = new XMLPropertySetMapper((XMLPropertyMapEntry*)aXMLScColumnStylesProperties, xScPropHdlFactory); - xRowStylesPropertySetMapper = new XMLPropertySetMapper((XMLPropertyMapEntry*)aXMLScRowStylesProperties, xScPropHdlFactory); - xTableStylesPropertySetMapper = new XMLPropertySetMapper((XMLPropertyMapEntry*)aXMLScTableStylesProperties, xScPropHdlFactory); - xCellStylesExportPropertySetMapper = new ScXMLCellExportPropertyMapper(xCellStylesPropertySetMapper); - xCellStylesExportPropertySetMapper->ChainExportMapper(XMLTextParagraphExport::CreateParaExtPropMapper(*this)); - xColumnStylesExportPropertySetMapper = new ScXMLColumnExportPropertyMapper(xColumnStylesPropertySetMapper); - xRowStylesExportPropertySetMapper = new ScXMLRowExportPropertyMapper(xRowStylesPropertySetMapper); - xTableStylesExportPropertySetMapper = new ScXMLTableExportPropertyMapper(xTableStylesPropertySetMapper); - - GetAutoStylePool()->AddFamily(XML_STYLE_FAMILY_TABLE_CELL, rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(XML_STYLE_FAMILY_TABLE_CELL_STYLES_NAME)), - xCellStylesExportPropertySetMapper, rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(XML_STYLE_FAMILY_TABLE_CELL_STYLES_PREFIX))); - GetAutoStylePool()->AddFamily(XML_STYLE_FAMILY_TABLE_COLUMN, rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(XML_STYLE_FAMILY_TABLE_COLUMN_STYLES_NAME)), - xColumnStylesExportPropertySetMapper, rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(XML_STYLE_FAMILY_TABLE_COLUMN_STYLES_PREFIX))); - GetAutoStylePool()->AddFamily(XML_STYLE_FAMILY_TABLE_ROW, rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(XML_STYLE_FAMILY_TABLE_ROW_STYLES_NAME)), - xRowStylesExportPropertySetMapper, rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(XML_STYLE_FAMILY_TABLE_ROW_STYLES_PREFIX))); - GetAutoStylePool()->AddFamily(XML_STYLE_FAMILY_TABLE_TABLE, rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(XML_STYLE_FAMILY_TABLE_TABLE_STYLES_NAME)), - xTableStylesExportPropertySetMapper, rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(XML_STYLE_FAMILY_TABLE_TABLE_STYLES_PREFIX))); - - if( (getExportFlags() & (EXPORT_STYLES|EXPORT_AUTOSTYLES|EXPORT_MASTERSTYLES|EXPORT_CONTENT) ) != 0 ) - { - // This name is reserved for the external ref cache tables. This - // should not conflict with user-defined styles since this name is - // used for a table style which is not available in the UI. - sExternalRefTabStyleName = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ta_extref")); - GetAutoStylePool()->RegisterName(XML_STYLE_FAMILY_TABLE_TABLE, sExternalRefTabStyleName); - - sAttrName = GetNamespaceMap().GetQNameByKey( XML_NAMESPACE_TABLE, GetXMLToken(XML_NAME)); - sAttrStyleName = GetNamespaceMap().GetQNameByKey( XML_NAMESPACE_TABLE, GetXMLToken(XML_STYLE_NAME)); - sAttrColumnsRepeated = GetNamespaceMap().GetQNameByKey( XML_NAMESPACE_TABLE, GetXMLToken(XML_NUMBER_COLUMNS_REPEATED)); - sAttrFormula = GetNamespaceMap().GetQNameByKey( XML_NAMESPACE_TABLE, GetXMLToken(XML_FORMULA)); - sAttrStringValue = GetNamespaceMap().GetQNameByKey( XML_NAMESPACE_OFFICE, GetXMLToken(XML_STRING_VALUE)); - sAttrValueType = GetNamespaceMap().GetQNameByKey( XML_NAMESPACE_OFFICE, GetXMLToken(XML_VALUE_TYPE)); - sElemCell = GetNamespaceMap().GetQNameByKey( XML_NAMESPACE_TABLE, GetXMLToken(XML_TABLE_CELL)); - sElemCoveredCell = GetNamespaceMap().GetQNameByKey( XML_NAMESPACE_TABLE, GetXMLToken(XML_COVERED_TABLE_CELL)); - sElemCol = GetNamespaceMap().GetQNameByKey( XML_NAMESPACE_TABLE, GetXMLToken(XML_TABLE_COLUMN)); - sElemRow = GetNamespaceMap().GetQNameByKey( XML_NAMESPACE_TABLE, GetXMLToken(XML_TABLE_ROW)); - sElemTab = GetNamespaceMap().GetQNameByKey( XML_NAMESPACE_TABLE, GetXMLToken(XML_TABLE)); - sElemP = GetNamespaceMap().GetQNameByKey( XML_NAMESPACE_TEXT, GetXMLToken(XML_P)); - } -} - - -ScXMLExport::~ScXMLExport() -{ - if (pGroupColumns) - delete pGroupColumns; - if (pGroupRows) - delete pGroupRows; - if (pColumnStyles) - delete pColumnStyles; - if (pRowStyles) - delete pRowStyles; - if (pCellStyles) - delete pCellStyles; - if (pRowFormatRanges) - delete pRowFormatRanges; - if (pMergedRangesContainer) - delete pMergedRangesContainer; - if (pValidationsContainer) - delete pValidationsContainer; - if (pChangeTrackingExportHelper) - delete pChangeTrackingExportHelper; - if (pChartListener) - delete pChartListener; - if (pCellsItr) - delete pCellsItr; - if (pDefaults) - delete pDefaults; - if (pNumberFormatAttributesExportHelper) - delete pNumberFormatAttributesExportHelper; -} - -void ScXMLExport::SetSourceStream( const uno::Reference<io::XInputStream>& xNewStream ) -{ - xSourceStream = xNewStream; - - if ( xSourceStream.is() ) - { - // make sure it's a plain UTF-8 stream as written by OOo itself - - const sal_Char pXmlHeader[] = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"; - sal_Int32 nLen = strlen(pXmlHeader); - - uno::Sequence<sal_Int8> aFileStart(nLen); - sal_Int32 nRead = xSourceStream->readBytes( aFileStart, nLen ); - - if ( nRead != nLen || rtl_compareMemory( aFileStart.getConstArray(), pXmlHeader, nLen ) != 0 ) - { - // invalid - ignore stream, save normally - xSourceStream.clear(); - } - else - { - // keep track of the bytes already read - nSourceStreamPos = nRead; - - const ScSheetSaveData* pSheetData = ScModelObj::getImplementation(GetModel())->GetSheetSaveData(); - if (pSheetData) - { - // add the loaded namespaces to the name space map - - if ( !pSheetData->AddLoadedNamespaces( _GetNamespaceMap() ) ) - { - // conflicts in the namespaces - ignore the stream, save normally - xSourceStream.clear(); - } - } - } - } -} - -sal_Int32 ScXMLExport::GetNumberFormatStyleIndex(sal_Int32 nNumFmt) const -{ - NumberFormatIndexMap::const_iterator itr = aNumFmtIndexMap.find(nNumFmt); - if (itr == aNumFmtIndexMap.end()) - return -1; - - return itr->second; -} - -sal_Bool ScXMLExport::HasDrawPages(uno::Reference <sheet::XSpreadsheetDocument>& xDoc) -{ - uno::Reference <beans::XPropertySet> xDocProps( xDoc, uno::UNO_QUERY ); - return (xDocProps.is() && ::cppu::any2bool( xDocProps->getPropertyValue(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(SC_UNO_HASDRAWPAGES))) )); -} - -void ScXMLExport::CollectSharedData(sal_Int32& nTableCount, sal_Int32& nShapesCount, const sal_Int32 nCellCount) -{ - if (GetModel().is()) - { - uno::Reference <sheet::XSpreadsheetDocument> xSpreadDoc( GetModel(), uno::UNO_QUERY ); - if ( xSpreadDoc.is()) - { - uno::Reference<container::XIndexAccess> xIndex( xSpreadDoc->getSheets(), uno::UNO_QUERY ); - if ( xIndex.is() ) - { - nTableCount = xIndex->getCount(); - if (!pSharedData) - CreateSharedData(nTableCount); - pCellStyles->AddNewTable(nTableCount - 1); - pDoc->InitializeAllNoteCaptions( true ); - if (HasDrawPages(xSpreadDoc)) - { - rtl::OUString sCaptionPoint( RTL_CONSTASCII_USTRINGPARAM( "CaptionPoint" )); - for (SCTAB nTable = 0; nTable < nTableCount; ++nTable) - { - nCurrentTable = sal::static_int_cast<sal_uInt16>( nTable ); - uno::Reference<drawing::XDrawPageSupplier> xDrawPageSupplier(xIndex->getByIndex(nTable), uno::UNO_QUERY); - if (xDrawPageSupplier.is()) - { - uno::Reference<drawing::XDrawPage> xDrawPage(xDrawPageSupplier->getDrawPage()); - ScMyDrawPage aDrawPage; - aDrawPage.bHasForms = false; - aDrawPage.xDrawPage.set(xDrawPage); - pSharedData->AddDrawPage(aDrawPage, nTable); - uno::Reference<container::XIndexAccess> xShapesIndex (xDrawPage, uno::UNO_QUERY); - if (xShapesIndex.is()) - { - sal_Int32 nShapes(xShapesIndex->getCount()); - for (sal_Int32 nShape = 0; nShape < nShapes; ++nShape) - { - uno::Reference<drawing::XShape> xShape(xShapesIndex->getByIndex(nShape), uno::UNO_QUERY); - if (xShape.is()) - { - uno::Reference< beans::XPropertySet > xShapeProp( xShape, uno::UNO_QUERY ); - if( xShapeProp.is() ) - { - sal_Int16 nLayerID = 0; - if( xShapeProp->getPropertyValue(sLayerID) >>= nLayerID ) - { - if( (nLayerID == SC_LAYER_INTERN) || (nLayerID == SC_LAYER_HIDDEN) ) - CollectInternalShape( xShape ); - else - { - ++nShapesCount; - if (SvxShape* pShapeImp = SvxShape::getImplementation(xShape)) - { - if (SdrObject *pSdrObj = pShapeImp->GetSdrObject()) - { - if (ScDrawObjData *pAnchor = ScDrawLayer::GetObjData( pSdrObj )) - { - ScMyShape aMyShape; - aMyShape.aAddress = pAnchor->maStart; - aMyShape.aEndAddress = pAnchor->maEnd; - aMyShape.nEndX = pAnchor->maEndOffset.X(); - aMyShape.nEndY = pAnchor->maEndOffset.Y(); - aMyShape.xShape = xShape; - pSharedData->AddNewShape(aMyShape); - pSharedData->SetLastColumn(nTable, pAnchor->maStart.Col()); - pSharedData->SetLastRow(nTable, pAnchor->maStart.Row()); - } - else - pSharedData->AddTableShape(nTable, xShape); - } - } - } - } - } - } - } - } - } - } - } - } - } - } - sal_Int32 nRef(nCellCount + (2 * nTableCount) + (2 * nShapesCount)); - GetProgressBarHelper()->SetReference(nRef); - GetProgressBarHelper()->SetValue(0); -} - -void ScXMLExport::CollectShapesAutoStyles(const sal_Int32 nTableCount) -{ - // #i84077# To avoid compiler warnings about uninitialized aShapeItr, - // it's initialized using this dummy list. The iterator contains shapes - // from all sheets, so it can't be declared inside the nTable loop where - // it is used. - ScMyShapeList aDummyInitList; - - pSharedData->SortShapesContainer(); - pSharedData->SortNoteShapes(); - const ScMyShapeList* pShapeList(NULL); - ScMyShapeList::const_iterator aShapeItr = aDummyInitList.end(); - if (pSharedData->GetShapesContainer()) - { - pShapeList = pSharedData->GetShapesContainer()->GetShapes(); - aShapeItr = pShapeList->begin(); - } - if (pSharedData->HasDrawPage()) - { - for (SCTAB nTable = 0; nTable < nTableCount; ++nTable) - { - uno::Reference<drawing::XDrawPage> xDrawPage(pSharedData->GetDrawPage(nTable)); - uno::Reference<drawing::XShapes> xShapes (xDrawPage, uno::UNO_QUERY); - - if (xShapes.is()) - { - GetShapeExport()->seekShapes(xShapes); - uno::Reference< form::XFormsSupplier2 > xFormsSupplier( xDrawPage, uno::UNO_QUERY ); - if( xFormsSupplier.is() && xFormsSupplier->hasForms() ) - { - GetFormExport()->examineForms(xDrawPage); - pSharedData->SetDrawPageHasForms(nTable, sal_True); - } - ScMyTableShapes* pTableShapes(pSharedData->GetTableShapes()); - if (pTableShapes) - { - ScMyTableXShapes::iterator aItr((*pTableShapes)[nTable].begin()); - ScMyTableXShapes::iterator aEndItr((*pTableShapes)[nTable].end()); - while (aItr != aEndItr) - { - GetShapeExport()->collectShapeAutoStyles(*aItr); - IncrementProgressBar(false); - ++aItr; - } - } - if (pShapeList) - { - ScMyShapeList::const_iterator aEndItr(pShapeList->end()); - while (aShapeItr != aEndItr && (static_cast<sal_Int32>(aShapeItr->aAddress.Tab()) == nTable)) - { - GetShapeExport()->collectShapeAutoStyles(aShapeItr->xShape); - IncrementProgressBar(false); - ++aShapeItr; - } - } - const ScMyNoteShapeList* pNoteShapes = NULL; - ScMyNoteShapeList::const_iterator aNoteShapeItr; - ScMyNoteShapeList::const_iterator aNoteShapeEndItr; - if (pSharedData->GetNoteShapes()) - { - pNoteShapes = pSharedData->GetNoteShapes()->GetNotes(); - if (pNoteShapes) - { - aNoteShapeItr = pNoteShapes->begin(); - aNoteShapeEndItr = pNoteShapes->end(); - } - } - if (pNoteShapes) - { - while (aNoteShapeItr != aNoteShapeEndItr) - { - if (static_cast<sal_Int32>(aNoteShapeItr->aPos.Tab()) == nTable) - GetShapeExport()->collectShapeAutoStyles(aNoteShapeItr->xShape); - ++aNoteShapeItr; - } - } - } - } - } - pSharedData->SortNoteShapes(); // sort twice, because some more shapes are added -} - -void ScXMLExport::_ExportMeta() -{ - sal_Int32 nCellCount(pDoc ? pDoc->GetCellCount() : 0); - sal_Int32 nTableCount(0); - sal_Int32 nShapesCount(0); - GetAutoStylePool()->ClearEntries(); - CollectSharedData(nTableCount, nShapesCount, nCellCount); - - uno::Sequence<beans::NamedValue> stats(3); - stats[0] = beans::NamedValue(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("TableCount")), - uno::makeAny(nTableCount)); - stats[1] = beans::NamedValue(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("CellCount")), - uno::makeAny(nCellCount)); - stats[2] = beans::NamedValue(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ObjectCount")), - uno::makeAny(nShapesCount)); - - // update document statistics at the model - uno::Reference<document::XDocumentPropertiesSupplier> xPropSup(GetModel(), - uno::UNO_QUERY_THROW); - uno::Reference<document::XDocumentProperties> xDocProps( - xPropSup->getDocumentProperties()); - if (xDocProps.is()) { - xDocProps->setDocumentStatistics(stats); - } - - // export document properties - SvXMLExport::_ExportMeta(); -} - -void ScXMLExport::_ExportFontDecls() -{ - GetFontAutoStylePool(); // make sure the pool is created - SvXMLExport::_ExportFontDecls(); -} - -table::CellRangeAddress ScXMLExport::GetEndAddress(const uno::Reference<sheet::XSpreadsheet>& xTable, const sal_Int32 /* nTable */) -{ - table::CellRangeAddress aCellAddress; - uno::Reference<sheet::XSheetCellCursor> xCursor(xTable->createCursor()); - uno::Reference<sheet::XUsedAreaCursor> xUsedArea (xCursor, uno::UNO_QUERY); - uno::Reference<sheet::XCellRangeAddressable> xCellAddress (xCursor, uno::UNO_QUERY); - if (xUsedArea.is() && xCellAddress.is()) - { - xUsedArea->gotoEndOfUsedArea(sal_True); - aCellAddress = xCellAddress->getRangeAddress(); - } - return aCellAddress; -} - -void ScXMLExport::GetAreaLinks( uno::Reference< sheet::XSpreadsheetDocument>& xSpreadDoc, - ScMyAreaLinksContainer& rAreaLinks ) -{ - uno::Reference< beans::XPropertySet > xPropSet( xSpreadDoc, uno::UNO_QUERY ); - if( !xPropSet.is() ) return; - - uno::Reference< container::XIndexAccess > xLinksIAccess( xPropSet->getPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( SC_UNO_AREALINKS ) ) ), uno::UNO_QUERY); - if( xLinksIAccess.is() ) - { - const OUString sFilter( RTL_CONSTASCII_USTRINGPARAM( SC_UNONAME_FILTER ) ); - const OUString sFilterOpt( RTL_CONSTASCII_USTRINGPARAM( SC_UNONAME_FILTOPT ) ); - const OUString sURL( RTL_CONSTASCII_USTRINGPARAM( SC_UNONAME_LINKURL ) ); - const OUString sRefresh( RTL_CONSTASCII_USTRINGPARAM( SC_UNONAME_REFDELAY ) ); - - sal_Int32 nCount(xLinksIAccess->getCount()); - for( sal_Int32 nIndex = 0; nIndex < nCount; ++nIndex ) - { - uno::Reference< sheet::XAreaLink > xAreaLink(xLinksIAccess->getByIndex( nIndex ), uno::UNO_QUERY); - if( xAreaLink.is() ) - { - ScMyAreaLink aAreaLink; - aAreaLink.aDestRange = xAreaLink->getDestArea(); - aAreaLink.sSourceStr = xAreaLink->getSourceArea(); - uno::Reference< beans::XPropertySet > xLinkProp( xAreaLink, uno::UNO_QUERY ); - if( xLinkProp.is() ) - { - xLinkProp->getPropertyValue( sFilter ) >>= aAreaLink.sFilter; - xLinkProp->getPropertyValue( sFilterOpt ) >>= aAreaLink.sFilterOptions; - xLinkProp->getPropertyValue( sURL ) >>= aAreaLink.sURL; - xLinkProp->getPropertyValue( sRefresh ) >>= aAreaLink.nRefresh; - } - rAreaLinks.AddNewAreaLink( aAreaLink ); - } - } - } - rAreaLinks.Sort(); -} - -// core implementation -void ScXMLExport::GetDetectiveOpList( ScMyDetectiveOpContainer& rDetOp ) -{ - if (pDoc) - { - ScDetOpList* pOpList(pDoc->GetDetOpList()); - if( pOpList ) - { - sal_uInt32 nCount(pOpList->Count()); - for( sal_uInt32 nIndex = 0; nIndex < nCount; ++nIndex ) - { - ScDetOpData* pDetData(pOpList->GetObject( static_cast<sal_uInt16>(nIndex) )); - if( pDetData ) - { - const ScAddress& rDetPos = pDetData->GetPos(); - SCTAB nTab = rDetPos.Tab(); - if ( nTab < pDoc->GetTableCount() ) - { - rDetOp.AddOperation( pDetData->GetOperation(), rDetPos, nIndex ); - - // cells with detective operations are written even if empty - pSharedData->SetLastColumn( nTab, rDetPos.Col() ); - pSharedData->SetLastRow( nTab, rDetPos.Row() ); - } - } - } - rDetOp.Sort(); - } - } -} - -void ScXMLExport::WriteSingleColumn(const sal_Int32 nRepeatColumns, const sal_Int32 nStyleIndex, - const sal_Int32 nIndex, const sal_Bool bIsAutoStyle, const sal_Bool bIsVisible) -{ - CheckAttrList(); - AddAttribute(sAttrStyleName, *pColumnStyles->GetStyleNameByIndex(nStyleIndex)); - if (!bIsVisible) - AddAttribute(XML_NAMESPACE_TABLE, XML_VISIBILITY, XML_COLLAPSE); - if (nRepeatColumns > 1) - { - OUString sOUEndCol(OUString::valueOf(static_cast <sal_Int32> (nRepeatColumns))); - AddAttribute(sAttrColumnsRepeated, sOUEndCol); - } - if (nIndex != -1) - AddAttribute(XML_NAMESPACE_TABLE, XML_DEFAULT_CELL_STYLE_NAME, *pCellStyles->GetStyleNameByIndex(nIndex, bIsAutoStyle)); - SvXMLElementExport aElemC(*this, sElemCol, sal_True, sal_True); -} - -void ScXMLExport::WriteColumn(const sal_Int32 nColumn, const sal_Int32 nRepeatColumns, - const sal_Int32 nStyleIndex, const sal_Bool bIsVisible) -{ - sal_Int32 nRepeat(1); - sal_Int32 nPrevIndex((*pDefaults->GetColDefaults())[nColumn].nIndex); - sal_Bool bPrevAutoStyle((*pDefaults->GetColDefaults())[nColumn].bIsAutoStyle); - for (sal_Int32 i = nColumn + 1; i < nColumn + nRepeatColumns; ++i) - { - if (((*pDefaults->GetColDefaults())[i].nIndex != nPrevIndex) || - ((*pDefaults->GetColDefaults())[i].bIsAutoStyle != bPrevAutoStyle)) - { - WriteSingleColumn(nRepeat, nStyleIndex, nPrevIndex, bPrevAutoStyle, bIsVisible); - nPrevIndex = (*pDefaults->GetColDefaults())[i].nIndex; - bPrevAutoStyle = (*pDefaults->GetColDefaults())[i].bIsAutoStyle; - nRepeat = 1; - } - else - ++nRepeat; - } - WriteSingleColumn(nRepeat, nStyleIndex, nPrevIndex, bPrevAutoStyle, bIsVisible); -} - -void ScXMLExport::OpenHeaderColumn() -{ - StartElement( XML_NAMESPACE_TABLE, XML_TABLE_HEADER_COLUMNS, sal_True ); -} - -void ScXMLExport::CloseHeaderColumn() -{ - EndElement(XML_NAMESPACE_TABLE, XML_TABLE_HEADER_COLUMNS, sal_True); -} - -void ScXMLExport::ExportColumns(const sal_Int32 nTable, const table::CellRangeAddress& aColumnHeaderRange, const sal_Bool bHasColumnHeader) -{ - sal_Int32 nColsRepeated (1); - rtl::OUString sParent; - sal_Int32 nIndex; - sal_Int32 nPrevColumn(0); - sal_Bool bPrevIsVisible (sal_True); - sal_Bool bWasHeader (false); - sal_Bool bIsHeader (false); - sal_Bool bIsClosed (sal_True); - sal_Int32 nPrevIndex (-1); - sal_Int32 nColumn; - for (nColumn = 0; nColumn <= pSharedData->GetLastColumn(nTable); ++nColumn) - { - CheckAttrList(); - sal_Bool bIsVisible(sal_True); - nIndex = pColumnStyles->GetStyleNameIndex(nTable, nColumn, bIsVisible); - - bIsHeader = bHasColumnHeader && (aColumnHeaderRange.StartColumn <= nColumn) && (nColumn <= aColumnHeaderRange.EndColumn); - if (bIsHeader != bWasHeader) - { - if (bIsHeader) - { - if (nColumn > 0) - { - WriteColumn(nPrevColumn, nColsRepeated, nPrevIndex, bPrevIsVisible); - if (pGroupColumns->IsGroupEnd(nColumn - 1)) - pGroupColumns->CloseGroups(nColumn - 1); - } - bPrevIsVisible = bIsVisible; - nPrevIndex = nIndex; - nPrevColumn = nColumn; - nColsRepeated = 1; - if(pGroupColumns->IsGroupStart(nColumn)) - pGroupColumns->OpenGroups(nColumn); - OpenHeaderColumn(); - bWasHeader = sal_True; - bIsClosed = false; - } - else - { - WriteColumn(nPrevColumn, nColsRepeated, nPrevIndex, bPrevIsVisible); - CloseHeaderColumn(); - if (pGroupColumns->IsGroupEnd(nColumn - 1)) - pGroupColumns->CloseGroups(nColumn - 1); - if(pGroupColumns->IsGroupStart(nColumn)) - pGroupColumns->OpenGroups(nColumn); - bPrevIsVisible = bIsVisible; - nPrevIndex = nIndex; - nPrevColumn = nColumn; - nColsRepeated = 1; - bWasHeader = false; - bIsClosed = sal_True; - } - } - else if (nColumn == 0) - { - if (pGroupColumns->IsGroupStart(nColumn)) - pGroupColumns->OpenGroups(nColumn); - bPrevIsVisible = bIsVisible; - nPrevIndex = nIndex; - } - else if ((bIsVisible == bPrevIsVisible) && (nIndex == nPrevIndex) && - !pGroupColumns->IsGroupStart(nColumn) && !pGroupColumns->IsGroupEnd(nColumn - 1)) - ++nColsRepeated; - else - { - WriteColumn(nPrevColumn, nColsRepeated, nPrevIndex, bPrevIsVisible); - if (pGroupColumns->IsGroupEnd(nColumn - 1)) - { - if (bIsHeader) - CloseHeaderColumn(); - pGroupColumns->CloseGroups(nColumn - 1); - if (bIsHeader) - OpenHeaderColumn(); - } - if (pGroupColumns->IsGroupStart(nColumn)) - { - if (bIsHeader) - CloseHeaderColumn(); - pGroupColumns->OpenGroups(nColumn); - if (bIsHeader) - OpenHeaderColumn(); - } - bPrevIsVisible = bIsVisible; - nPrevIndex = nIndex; - nPrevColumn = nColumn; - nColsRepeated = 1; - } - } - WriteColumn(nPrevColumn, nColsRepeated, nPrevIndex, bPrevIsVisible); - if (!bIsClosed) - CloseHeaderColumn(); - if (pGroupColumns->IsGroupEnd(nColumn - 1)) - pGroupColumns->CloseGroups(nColumn - 1); -} - -void ScXMLExport::ExportExternalRefCacheStyles() -{ - sal_Int32 nEntryIndex = GetCellStylesPropertySetMapper()->FindEntryIndex( - "NumberFormat", XML_NAMESPACE_STYLE, OUString(RTL_CONSTASCII_USTRINGPARAM("data-style-name"))); - - if (nEntryIndex < 0) - // No entry index for the number format is found. - return; - - ScExternalRefManager* pRefMgr = pDoc->GetExternalRefManager(); - if (!pRefMgr->hasExternalData()) - // No external reference data cached. - return; - - // Export each unique number format used in the external ref cache. - vector<sal_uInt32> aNumFmts; - pRefMgr->getAllCachedNumberFormats(aNumFmts); - const OUString aDefaultStyle = OUString(RTL_CONSTASCII_USTRINGPARAM("Default")).intern(); - for (vector<sal_uInt32>::const_iterator itr = aNumFmts.begin(), itrEnd = aNumFmts.end(); - itr != itrEnd; ++itr) - { - sal_Int32 nNumFmt = static_cast<sal_Int32>(*itr); - - addDataStyle(nNumFmt); - - uno::Any aVal; - aVal <<= nNumFmt; - vector<XMLPropertyState> aProps; - aProps.push_back(XMLPropertyState(nEntryIndex, aVal)); - aVal <<= aDefaultStyle; - aProps.push_back(XMLPropertyState(nEntryIndex, aVal)); - - OUString aName; - sal_Int32 nIndex; - if (GetAutoStylePool()->Add(aName, XML_STYLE_FAMILY_TABLE_CELL, aDefaultStyle, aProps)) - { - OUString* pTemp(new OUString(aName)); - if (!pCellStyles->AddStyleName(pTemp, nIndex, true)) - delete pTemp; - } - else - { - sal_Bool bIsAuto; - nIndex = pCellStyles->GetIndexOfStyleName( - aName, OUString(RTL_CONSTASCII_USTRINGPARAM(XML_STYLE_FAMILY_TABLE_CELL_STYLES_PREFIX)), bIsAuto); - } - - // store the number format to index mapping for later use. - aNumFmtIndexMap.insert(NumberFormatIndexMap::value_type(nNumFmt, nIndex)); - } -} - -void ScXMLExport::WriteRowContent() -{ - ScMyRowFormatRange aRange; - sal_Int32 nIndex(-1); -#if OSL_DEBUG_LEVEL > 0 - sal_Int32 nPrevCol(0); -#endif - sal_Int32 nCols(0); - sal_Int32 nPrevValidationIndex(-1); - sal_Bool bIsAutoStyle(sal_True); - sal_Bool bIsFirst(sal_True); - while (pRowFormatRanges->GetNext(aRange)) - { -#if OSL_DEBUG_LEVEL > 0 - OSL_ENSURE(bIsFirst || (!bIsFirst && (nPrevCol + nCols == aRange.nStartColumn)), "here are some columns missing"); -#endif - if (bIsFirst) - { - nIndex = aRange.nIndex; - nPrevValidationIndex = aRange.nValidationIndex; - bIsAutoStyle = aRange.bIsAutoStyle; - nCols = aRange.nRepeatColumns; - bIsFirst = false; -#if OSL_DEBUG_LEVEL > 0 - nPrevCol = aRange.nStartColumn; -#endif - } - else - { - if (((aRange.nIndex == nIndex && aRange.bIsAutoStyle == bIsAutoStyle) || - (aRange.nIndex == nIndex && nIndex == -1)) && - nPrevValidationIndex == aRange.nValidationIndex) - nCols += aRange.nRepeatColumns; - else - { - if (nIndex != -1) - AddAttribute(sAttrStyleName, *pCellStyles->GetStyleNameByIndex(nIndex, bIsAutoStyle)); - if (nPrevValidationIndex > -1) - AddAttribute(XML_NAMESPACE_TABLE, XML_CONTENT_VALIDATION_NAME, pValidationsContainer->GetValidationName(nPrevValidationIndex)); - if (nCols > 1) - { - rtl::OUStringBuffer aBuf; - GetMM100UnitConverter().convertNumber(aBuf, nCols); - AddAttribute(sAttrColumnsRepeated, aBuf.makeStringAndClear()); - } - SvXMLElementExport aElemC(*this, sElemCell, sal_True, sal_True); - nIndex = aRange.nIndex; - bIsAutoStyle = aRange.bIsAutoStyle; - nCols = aRange.nRepeatColumns; - nPrevValidationIndex = aRange.nValidationIndex; -#if OSL_DEBUG_LEVEL > 0 - nPrevCol = aRange.nStartColumn; -#endif - } - } - } - if (!bIsFirst) - { - table::CellAddress aCellAddress; - if (nIndex != -1) - AddAttribute(sAttrStyleName, *pCellStyles->GetStyleNameByIndex(nIndex, bIsAutoStyle)); - if (nPrevValidationIndex > -1) - AddAttribute(XML_NAMESPACE_TABLE, XML_CONTENT_VALIDATION_NAME, pValidationsContainer->GetValidationName(nPrevValidationIndex)); - if (nCols > 1) - { - rtl::OUStringBuffer aBuf; - GetMM100UnitConverter().convertNumber(aBuf, nCols); - AddAttribute(sAttrColumnsRepeated, aBuf.makeStringAndClear()); - } - SvXMLElementExport aElemC(*this, sElemCell, sal_True, sal_True); - } -} - -void ScXMLExport::WriteRowStartTag( - sal_Int32 nRow, const sal_Int32 nIndex, const sal_Int32 nEqualRows, - bool bHidden, bool bFiltered) -{ - AddAttribute(sAttrStyleName, *pRowStyles->GetStyleNameByIndex(nIndex)); - if (bHidden) - { - if (bFiltered) - AddAttribute(XML_NAMESPACE_TABLE, XML_VISIBILITY, XML_FILTER); - else - AddAttribute(XML_NAMESPACE_TABLE, XML_VISIBILITY, XML_COLLAPSE); - } - if (nEqualRows > 1) - { - rtl::OUStringBuffer aBuf; - GetMM100UnitConverter().convertNumber(aBuf, nEqualRows); - AddAttribute(XML_NAMESPACE_TABLE, XML_NUMBER_ROWS_REPEATED, aBuf.makeStringAndClear()); - } - - const ScMyDefaultStyleList& rRowDefaults = *pDefaults->GetRowDefaults(); - if ( nRow >= sal::static_int_cast<sal_Int32>( rRowDefaults.size() ) ) - { - // used to happen with detective operations - if there are more cases, use the last row's style - OSL_FAIL("WriteRowStartTag: not enough defaults"); - nRow = rRowDefaults.size() - 1; - } - sal_Int32 nCellStyleIndex(rRowDefaults[nRow].nIndex); - if (nCellStyleIndex != -1) - AddAttribute(XML_NAMESPACE_TABLE, XML_DEFAULT_CELL_STYLE_NAME, - *pCellStyles->GetStyleNameByIndex(nCellStyleIndex, - (*pDefaults->GetRowDefaults())[nRow].bIsAutoStyle)); - StartElement( sElemRow, sal_True); -} - -void ScXMLExport::OpenHeaderRows() -{ - StartElement( XML_NAMESPACE_TABLE, XML_TABLE_HEADER_ROWS, sal_True); - bRowHeaderOpen = sal_True; -} - -void ScXMLExport::CloseHeaderRows() -{ - EndElement(XML_NAMESPACE_TABLE, XML_TABLE_HEADER_ROWS, sal_True); -} - -void ScXMLExport::OpenNewRow( - const sal_Int32 nIndex, const sal_Int32 nStartRow, const sal_Int32 nEqualRows, - bool bHidden, bool bFiltered) -{ - nOpenRow = nStartRow; - if (pGroupRows->IsGroupStart(nStartRow)) - { - if (bHasRowHeader && bRowHeaderOpen) - CloseHeaderRows(); - pGroupRows->OpenGroups(nStartRow); - if (bHasRowHeader && bRowHeaderOpen) - OpenHeaderRows(); - } - if (bHasRowHeader && !bRowHeaderOpen && nStartRow >= aRowHeaderRange.StartRow && nStartRow <= aRowHeaderRange.EndRow) - { - if (nStartRow == aRowHeaderRange.StartRow) - OpenHeaderRows(); - sal_Int32 nEquals; - if (aRowHeaderRange.EndRow < nStartRow + nEqualRows - 1) - nEquals = aRowHeaderRange.EndRow - nStartRow + 1; - else - nEquals = nEqualRows; - WriteRowStartTag(nStartRow, nIndex, nEquals, bHidden, bFiltered); - nOpenRow = nStartRow + nEquals - 1; - if (nEquals < nEqualRows) - { - CloseRow(nStartRow + nEquals - 1); - WriteRowStartTag(nStartRow, nIndex, nEqualRows - nEquals, bHidden, bFiltered); - nOpenRow = nStartRow + nEqualRows - 1; - } - } - else - WriteRowStartTag(nStartRow, nIndex, nEqualRows, bHidden, bFiltered); -} - -void ScXMLExport::OpenAndCloseRow( - const sal_Int32 nIndex, const sal_Int32 nStartRow, const sal_Int32 nEqualRows, - bool bHidden, bool bFiltered) -{ - OpenNewRow(nIndex, nStartRow, nEqualRows, bHidden, bFiltered); - WriteRowContent(); - CloseRow(nStartRow + nEqualRows - 1); - pRowFormatRanges->Clear(); -} - -void ScXMLExport::OpenRow(const sal_Int32 nTable, const sal_Int32 nStartRow, const sal_Int32 nRepeatRow, ScXMLCachedRowAttrAccess& rRowAttr) -{ - if (nRepeatRow > 1) - { - sal_Int32 nPrevIndex(0), nIndex; - bool bPrevHidden = false; - bool bPrevFiltered = false; - bool bHidden = false; - bool bFiltered = false; - sal_Int32 nEqualRows(1); - sal_Int32 nEndRow(nStartRow + nRepeatRow); - sal_Int32 nRow; - for (nRow = nStartRow; nRow < nEndRow; ++nRow) - { - if (nRow == nStartRow) - { - nPrevIndex = pRowStyles->GetStyleNameIndex(nTable, nRow); - if (pDoc) - { - bPrevHidden = rRowAttr.rowHidden(nTable, nRow); - bPrevFiltered = rRowAttr.rowFiltered(nTable, nRow); - } - } - else - { - nIndex = pRowStyles->GetStyleNameIndex(nTable, nRow); - if (pDoc) - { - bHidden = rRowAttr.rowHidden(nTable, nRow); - bFiltered = rRowAttr.rowFiltered(nTable, nRow); - } - if (nIndex == nPrevIndex && bHidden == bPrevHidden && bFiltered == bPrevFiltered && - !(bHasRowHeader && ((nRow == aRowHeaderRange.StartRow) || (nRow - 1 == aRowHeaderRange.EndRow))) && - !(pGroupRows->IsGroupStart(nRow)) && - !(pGroupRows->IsGroupEnd(nRow - 1))) - ++nEqualRows; - else - { - if (nRow < nEndRow) - { - ScRowFormatRanges* pTempRowFormatRanges = new ScRowFormatRanges(pRowFormatRanges); - OpenAndCloseRow(nPrevIndex, nRow - nEqualRows, nEqualRows, bPrevHidden, bPrevFiltered); - delete pRowFormatRanges; - pRowFormatRanges = pTempRowFormatRanges; - } - else - OpenAndCloseRow(nPrevIndex, nRow - nEqualRows, nEqualRows, bPrevHidden, bPrevFiltered); - nEqualRows = 1; - nPrevIndex = nIndex; - bPrevHidden = bHidden; - bPrevFiltered = bFiltered; - } - } - } - OpenNewRow(nPrevIndex, nRow - nEqualRows, nEqualRows, bPrevHidden, bPrevFiltered); - } - else - { - sal_Int32 nIndex = pRowStyles->GetStyleNameIndex(nTable, nStartRow); - bool bHidden = false; - bool bFiltered = false; - if (pDoc) - { - bHidden = rRowAttr.rowHidden(nTable, nStartRow); - bFiltered = rRowAttr.rowFiltered(nTable, nStartRow); - } - OpenNewRow(nIndex, nStartRow, 1, bHidden, bFiltered); - } - nOpenRow = nStartRow + nRepeatRow - 1; -} - -void ScXMLExport::CloseRow(const sal_Int32 nRow) -{ - if (nOpenRow > -1) - { - EndElement(sElemRow, sal_True); - if (bHasRowHeader && nRow == aRowHeaderRange.EndRow) - { - CloseHeaderRows(); - bRowHeaderOpen = false; - } - if (pGroupRows->IsGroupEnd(nRow)) - { - if (bHasRowHeader && bRowHeaderOpen) - CloseHeaderRows(); - pGroupRows->CloseGroups(nRow); - if (bHasRowHeader && bRowHeaderOpen) - OpenHeaderRows(); - } - } - nOpenRow = -1; -} - -void ScXMLExport::ExportFormatRanges(const sal_Int32 nStartCol, const sal_Int32 nStartRow, - const sal_Int32 nEndCol, const sal_Int32 nEndRow, const sal_Int32 nSheet) -{ - pRowFormatRanges->Clear(); - ScXMLCachedRowAttrAccess aRowAttr(pDoc); - if (nStartRow == nEndRow) - { - pCellStyles->GetFormatRanges(nStartCol, nEndCol, nStartRow, nSheet, pRowFormatRanges); - if (nOpenRow == - 1) - OpenRow(nSheet, nStartRow, 1, aRowAttr); - WriteRowContent(); - pRowFormatRanges->Clear(); - } - else - { - if (nOpenRow > -1) - { - pCellStyles->GetFormatRanges(nStartCol, pSharedData->GetLastColumn(nSheet), nStartRow, nSheet, pRowFormatRanges); - WriteRowContent(); - CloseRow(nStartRow); - sal_Int32 nRows(1); - sal_Int32 nTotalRows(nEndRow - nStartRow + 1 - 1); - while (nRows < nTotalRows) - { - pRowFormatRanges->Clear(); - pCellStyles->GetFormatRanges(0, pSharedData->GetLastColumn(nSheet), nStartRow + nRows, nSheet, pRowFormatRanges); - sal_Int32 nMaxRows = pRowFormatRanges->GetMaxRows(); - OSL_ENSURE(nMaxRows, "something wents wrong"); - if (nMaxRows >= nTotalRows - nRows) - { - OpenRow(nSheet, nStartRow + nRows, nTotalRows - nRows, aRowAttr); - nRows += nTotalRows - nRows; - } - else - { - OpenRow(nSheet, nStartRow + nRows, nMaxRows, aRowAttr); - nRows += nMaxRows; - } - if (!pRowFormatRanges->GetSize()) - pCellStyles->GetFormatRanges(0, pSharedData->GetLastColumn(nSheet), nStartRow + nRows, nSheet, pRowFormatRanges); - WriteRowContent(); - CloseRow(nStartRow + nRows - 1); - } - if (nTotalRows == 1) - CloseRow(nStartRow); - OpenRow(nSheet, nEndRow, 1, aRowAttr); - pRowFormatRanges->Clear(); - pCellStyles->GetFormatRanges(0, nEndCol, nEndRow, nSheet, pRowFormatRanges); - WriteRowContent(); - } - else - { - sal_Int32 nRows(0); - sal_Int32 nTotalRows(nEndRow - nStartRow + 1 - 1); - while (nRows < nTotalRows) - { - pCellStyles->GetFormatRanges(0, pSharedData->GetLastColumn(nSheet), nStartRow + nRows, nSheet, pRowFormatRanges); - sal_Int32 nMaxRows = pRowFormatRanges->GetMaxRows(); - if (nMaxRows >= nTotalRows - nRows) - { - OpenRow(nSheet, nStartRow + nRows, nTotalRows - nRows, aRowAttr); - nRows += nTotalRows - nRows; - } - else - { - OpenRow(nSheet, nStartRow + nRows, nMaxRows, aRowAttr); - nRows += nMaxRows; - } - if (!pRowFormatRanges->GetSize()) - pCellStyles->GetFormatRanges(0, pSharedData->GetLastColumn(nSheet), nStartRow + nRows, nSheet, pRowFormatRanges); - WriteRowContent(); - CloseRow(nStartRow + nRows - 1); - } - OpenRow(nSheet, nEndRow, 1, aRowAttr); - pRowFormatRanges->Clear(); - pCellStyles->GetFormatRanges(0, nEndCol, nEndRow, nSheet, pRowFormatRanges); - WriteRowContent(); - } - } -} - -void ScXMLExport::GetColumnRowHeader(sal_Bool& rHasColumnHeader, table::CellRangeAddress& rColumnHeaderRange, - sal_Bool& rHasRowHeader, table::CellRangeAddress& rRowHeaderRange, - rtl::OUString& rPrintRanges) const -{ - uno::Reference <sheet::XPrintAreas> xPrintAreas (xCurrentTable, uno::UNO_QUERY); - if (xPrintAreas.is()) - { - rHasRowHeader = xPrintAreas->getPrintTitleRows(); - rHasColumnHeader = xPrintAreas->getPrintTitleColumns(); - rRowHeaderRange = xPrintAreas->getTitleRows(); - rColumnHeaderRange = xPrintAreas->getTitleColumns(); - uno::Sequence< table::CellRangeAddress > aRangeList( xPrintAreas->getPrintAreas() ); - ScRangeStringConverter::GetStringFromRangeList( rPrintRanges, aRangeList, pDoc, FormulaGrammar::CONV_OOO ); - } -} - -void ScXMLExport::FillFieldGroup(ScOutlineArray* pFields, ScMyOpenCloseColumnRowGroup* pGroups) -{ - sal_Int32 nDepth(pFields->GetDepth()); - for(sal_Int32 i = 0; i < nDepth; ++i) - { - sal_Int32 nFields = pFields->GetCount(static_cast<sal_uInt16>(i)); - for (sal_Int32 j = 0; j < nFields; ++j) - { - ScMyColumnRowGroup aGroup; - ScOutlineEntry* pEntry(pFields->GetEntry(static_cast<sal_uInt16>(i), static_cast<sal_uInt16>(j))); - aGroup.nField = pEntry->GetStart(); - aGroup.nLevel = static_cast<sal_Int16>(i); - aGroup.bDisplay = !(pEntry->IsHidden()); - pGroups->AddGroup(aGroup, pEntry->GetEnd()); - } - } - if (nDepth) - pGroups->Sort(); -} - -void ScXMLExport::FillColumnRowGroups() -{ - if (pDoc) - { - ScOutlineTable* pOutlineTable = pDoc->GetOutlineTable( static_cast<SCTAB>(nCurrentTable), false ); - if(pOutlineTable) - { - ScOutlineArray* pCols(pOutlineTable->GetColArray()); - ScOutlineArray* pRows(pOutlineTable->GetRowArray()); - if (pCols) - FillFieldGroup(pCols, pGroupColumns); - if (pRows) - FillFieldGroup(pRows, pGroupRows); - pSharedData->SetLastColumn(nCurrentTable, pGroupColumns->GetLast()); - pSharedData->SetLastRow(nCurrentTable, pGroupRows->GetLast()); - } - } -} - -void ScXMLExport::SetBodyAttributes() -{ - if (pDoc && pDoc->IsDocProtected()) - { - AddAttribute(XML_NAMESPACE_TABLE, XML_STRUCTURE_PROTECTED, XML_TRUE); - rtl::OUStringBuffer aBuffer; - uno::Sequence<sal_Int8> aPassHash; - ScPasswordHash eHashUsed = PASSHASH_UNSPECIFIED; - const ScDocProtection* p = pDoc->GetDocProtection(); - if (p) - { - if (p->hasPasswordHash(PASSHASH_SHA1)) - { - aPassHash = p->getPasswordHash(PASSHASH_SHA1); - eHashUsed = PASSHASH_SHA1; - } - else if (p->hasPasswordHash(PASSHASH_XL, PASSHASH_SHA1)) - { - aPassHash = p->getPasswordHash(PASSHASH_XL, PASSHASH_SHA1); - eHashUsed = PASSHASH_XL; - } - } - SvXMLUnitConverter::encodeBase64(aBuffer, aPassHash); - if (aBuffer.getLength()) - { - AddAttribute(XML_NAMESPACE_TABLE, XML_PROTECTION_KEY, aBuffer.makeStringAndClear()); - if (eHashUsed == PASSHASH_XL) - { - AddAttribute(XML_NAMESPACE_TABLE, XML_PROTECTION_KEY_DIGEST_ALGORITHM, - ScPassHashHelper::getHashURI(PASSHASH_XL)); - AddAttribute(XML_NAMESPACE_TABLE, XML_PROTECTION_KEY_DIGEST_ALGORITHM_2, - ScPassHashHelper::getHashURI(PASSHASH_SHA1)); - } - else if (eHashUsed == PASSHASH_SHA1) - AddAttribute(XML_NAMESPACE_TABLE, XML_PROTECTION_KEY_DIGEST_ALGORITHM, - ScPassHashHelper::getHashURI(PASSHASH_SHA1)); - } - } -} - -static bool lcl_CopyStreamElement( const uno::Reference< io::XInputStream >& xInput, - const uno::Reference< io::XOutputStream >& xOutput, - sal_Int32 nCount ) -{ - const sal_Int32 nBufSize = 16*1024; - uno::Sequence<sal_Int8> aSequence(nBufSize); - - sal_Int32 nRemaining = nCount; - bool bFirst = true; - - while ( nRemaining > 0 ) - { - sal_Int32 nRead = xInput->readBytes( aSequence, std::min( nRemaining, nBufSize ) ); - if (bFirst) - { - // safety check: Make sure the copied part actually points to the start of an element - if ( nRead < 1 || aSequence[0] != static_cast<sal_Int8>('<') ) - { - return false; // abort and set an error - } - bFirst = false; - } - if (nRead == nRemaining) - { - // safety check: Make sure the copied part also ends at the end of an element - if ( aSequence[nRead-1] != static_cast<sal_Int8>('>') ) - { - return false; // abort and set an error - } - } - - if ( nRead == nBufSize ) - { - xOutput->writeBytes( aSequence ); - nRemaining -= nRead; - } - else - { - if ( nRead > 0 ) - { - uno::Sequence<sal_Int8> aTempBuf( aSequence.getConstArray(), nRead ); - xOutput->writeBytes( aTempBuf ); - } - nRemaining = 0; - } - } - return true; // successful -} - -static void lcl_SkipBytesInBlocks( const uno::Reference< io::XInputStream >& xInput, sal_Int32 nBytesToSkip ) -{ - // skipBytes in zip stream is implemented as reading. - // For now, split into several calls to avoid allocating a large buffer. - // Later, skipBytes should be changed. - - const sal_Int32 nMaxSize = 32*1024; - - if ( nBytesToSkip > 0 ) - { - sal_Int32 nRemaining = nBytesToSkip; - while ( nRemaining > 0 ) - { - sal_Int32 nSkip = std::min( nRemaining, nMaxSize ); - xInput->skipBytes( nSkip ); - nRemaining -= nSkip; - } - } -} - -void ScXMLExport::CopySourceStream( sal_Int32 nStartOffset, sal_Int32 nEndOffset, sal_Int32& rNewStart, sal_Int32& rNewEnd ) -{ - uno::Reference<xml::sax::XDocumentHandler> xHandler = GetDocHandler(); - uno::Reference<io::XActiveDataSource> xDestSource( xHandler, uno::UNO_QUERY ); - if ( xDestSource.is() ) - { - uno::Reference<io::XOutputStream> xDestStream = xDestSource->getOutputStream(); - uno::Reference<io::XSeekable> xDestSeek( xDestStream, uno::UNO_QUERY ); - if ( xDestSeek.is() ) - { - // temporary: set same stream again to clear buffer - xDestSource->setOutputStream( xDestStream ); - - if ( getExportFlags() & EXPORT_PRETTY ) - { - ByteString aOutStr("\n "); - uno::Sequence<sal_Int8> aOutSeq( (sal_Int8*)aOutStr.GetBuffer(), aOutStr.Len() ); - xDestStream->writeBytes( aOutSeq ); - } - - rNewStart = (sal_Int32)xDestSeek->getPosition(); - - if ( nStartOffset > nSourceStreamPos ) - lcl_SkipBytesInBlocks( xSourceStream, nStartOffset - nSourceStreamPos ); - - if ( !lcl_CopyStreamElement( xSourceStream, xDestStream, nEndOffset - nStartOffset ) ) - { - // If copying went wrong, set an error. - // ScXMLImportWrapper then resets all stream flags, so the next save attempt will use normal saving. - - uno::Sequence<OUString> aEmptySeq; - SetError(XMLERROR_CANCEL|XMLERROR_FLAG_SEVERE, aEmptySeq); - } - nSourceStreamPos = nEndOffset; - - rNewEnd = (sal_Int32)xDestSeek->getPosition(); - } - } -} - -void ScXMLExport::_ExportContent() -{ - nCurrentTable = 0; - if (!pSharedData) - { - sal_Int32 nTableCount(0); - sal_Int32 nShapesCount(0); - sal_Int32 nCellCount(pDoc ? pDoc->GetCellCount() : 0); - CollectSharedData(nTableCount, nShapesCount, nCellCount); - OSL_FAIL("no shared data setted"); - } - ScXMLExportDatabaseRanges aExportDatabaseRanges(*this); - if (!GetModel().is()) - return; - - uno::Reference <sheet::XSpreadsheetDocument> xSpreadDoc( GetModel(), uno::UNO_QUERY ); - if ( !xSpreadDoc.is() ) - return; - - ScSheetSaveData* pSheetData = ScModelObj::getImplementation(xSpreadDoc)->GetSheetSaveData(); - if (pSheetData) - pSheetData->ResetSaveEntries(); - - uno::Reference<container::XIndexAccess> xIndex( xSpreadDoc->getSheets(), uno::UNO_QUERY ); - if ( xIndex.is() ) - { - //_GetNamespaceMap().ClearQNamesCache(); - pChangeTrackingExportHelper->CollectAndWriteChanges(); - WriteCalculationSettings(xSpreadDoc); - sal_Int32 nTableCount(xIndex->getCount()); - ScMyAreaLinksContainer aAreaLinks; - GetAreaLinks( xSpreadDoc, aAreaLinks ); - ScMyEmptyDatabaseRangesContainer aEmptyRanges(aExportDatabaseRanges.GetEmptyDatabaseRanges()); - ScMyDetectiveOpContainer aDetectiveOpContainer; - GetDetectiveOpList( aDetectiveOpContainer ); - - pCellStyles->Sort(); - pMergedRangesContainer->Sort(); - pSharedData->GetDetectiveObjContainer()->Sort(); - - pCellsItr->Clear(); - pCellsItr->SetShapes( pSharedData->GetShapesContainer() ); - pCellsItr->SetNoteShapes( pSharedData->GetNoteShapes() ); - pCellsItr->SetMergedRanges( pMergedRangesContainer ); - pCellsItr->SetAreaLinks( &aAreaLinks ); - pCellsItr->SetEmptyDatabaseRanges( &aEmptyRanges ); - pCellsItr->SetDetectiveObj( pSharedData->GetDetectiveObjContainer() ); - pCellsItr->SetDetectiveOp( &aDetectiveOpContainer ); - - if (nTableCount > 0) - pValidationsContainer->WriteValidations(*this); - WriteTheLabelRanges( xSpreadDoc ); - for (sal_Int32 nTable = 0; nTable < nTableCount; ++nTable) - { - sal_Int32 nStartOffset = -1; - sal_Int32 nEndOffset = -1; - if (pSheetData && pDoc && pDoc->IsStreamValid((SCTAB)nTable)) - pSheetData->GetStreamPos( nTable, nStartOffset, nEndOffset ); - - if ( nStartOffset >= 0 && nEndOffset >= 0 && xSourceStream.is() ) - { - sal_Int32 nNewStart = -1; - sal_Int32 nNewEnd = -1; - CopySourceStream( nStartOffset, nEndOffset, nNewStart, nNewEnd ); - - // store position of copied sheet in output - pSheetData->AddSavePos( nTable, nNewStart, nNewEnd ); - - // skip iterator entries for this sheet - pCellsItr->SkipTable(static_cast<SCTAB>(nTable)); - } - else - { - uno::Reference<sheet::XSpreadsheet> xTable(xIndex->getByIndex(nTable), uno::UNO_QUERY); - WriteTable(nTable, xTable); - } - IncrementProgressBar(false); - } - } - WriteExternalRefCaches(); - WriteNamedExpressions(xSpreadDoc); - aExportDatabaseRanges.WriteDatabaseRanges(); - ScXMLExportDataPilot aExportDataPilot(*this); - aExportDataPilot.WriteDataPilots(xSpreadDoc); - WriteConsolidation(); - ScXMLExportDDELinks aExportDDELinks(*this); - aExportDDELinks.WriteDDELinks(xSpreadDoc); - IncrementProgressBar(sal_True, 0); - GetProgressBarHelper()->SetValue(GetProgressBarHelper()->GetReference()); -} - -void ScXMLExport::_ExportStyles( sal_Bool bUsed ) -{ - if (!pSharedData) - { - sal_Int32 nTableCount(0); - sal_Int32 nShapesCount(0); - sal_Int32 nCellCount(pDoc ? pDoc->GetCellCount() : 0); - CollectSharedData(nTableCount, nShapesCount, nCellCount); - } - ScXMLStyleExport aStylesExp(*this, rtl::OUString(), GetAutoStylePool().get()); - if (GetModel().is()) - { - uno::Reference <lang::XMultiServiceFactory> xMultiServiceFactory(GetModel(), uno::UNO_QUERY); - if (xMultiServiceFactory.is()) - { - uno::Reference <beans::XPropertySet> xProperties(xMultiServiceFactory->createInstance(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.sheet.Defaults"))), uno::UNO_QUERY); - if (xProperties.is()) - aStylesExp.exportDefaultStyle(xProperties, rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(XML_STYLE_FAMILY_TABLE_CELL_STYLES_NAME)), xCellStylesExportPropertySetMapper); - if (pSharedData->HasShapes()) - { - GetShapeExport()->ExportGraphicDefaults(); - } - } - uno::Reference <style::XStyleFamiliesSupplier> xStyleFamiliesSupplier (GetModel(), uno::UNO_QUERY); - if (xStyleFamiliesSupplier.is()) - { - uno::Reference <container::XNameAccess> xStylesFamilies(xStyleFamiliesSupplier->getStyleFamilies()); - if (xStylesFamilies.is()) - { - uno::Reference <container::XIndexAccess> xCellStyles(xStylesFamilies->getByName(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("CellStyles"))), uno::UNO_QUERY); - if (xCellStyles.is()) - { - sal_Int32 nCount(xCellStyles->getCount()); - rtl::OUString sNumberFormat(RTL_CONSTASCII_USTRINGPARAM(SC_UNONAME_NUMFMT)); - for (sal_Int32 i = 0; i < nCount; ++i) - { - uno::Reference <beans::XPropertySet> xCellProperties(xCellStyles->getByIndex(i), uno::UNO_QUERY); - if (xCellProperties.is()) - { - sal_Int32 nNumberFormat = 0; - if (xCellProperties->getPropertyValue(sNumberFormat) >>= nNumberFormat) - addDataStyle(nNumberFormat); - } - } - } - } - } - } - exportDataStyles(); - - aStylesExp.exportStyleFamily(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("CellStyles")), - rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(XML_STYLE_FAMILY_TABLE_CELL_STYLES_NAME)), xCellStylesExportPropertySetMapper, false, XML_STYLE_FAMILY_TABLE_CELL); - - SvXMLExport::_ExportStyles(bUsed); -} - -void ScXMLExport::AddStyleFromCells(const uno::Reference<beans::XPropertySet>& xProperties, - const uno::Reference<sheet::XSpreadsheet>& xTable, - sal_Int32 nTable, const rtl::OUString* pOldName) -{ - //! pass xCellRanges instead - uno::Reference<sheet::XSheetCellRanges> xCellRanges( xProperties, uno::UNO_QUERY ); - - rtl::OUString SC_SCELLPREFIX(RTL_CONSTASCII_USTRINGPARAM(XML_STYLE_FAMILY_TABLE_CELL_STYLES_PREFIX)); - rtl::OUString SC_NUMBERFORMAT(RTL_CONSTASCII_USTRINGPARAM(SC_UNONAME_NUMFMT)); - - rtl::OUString sStyleName; - sal_Int32 nNumberFormat(-1); - sal_Int32 nValidationIndex(-1); - std::vector< XMLPropertyState > xPropStates(xCellStylesExportPropertySetMapper->Filter( xProperties )); - std::vector< XMLPropertyState >::iterator aItr(xPropStates.begin()); - std::vector< XMLPropertyState >::iterator aEndItr(xPropStates.end()); - sal_Int32 nCount(0); - while (aItr != aEndItr) - { - if (aItr->mnIndex != -1) - { - switch (xCellStylesPropertySetMapper->GetEntryContextId(aItr->mnIndex)) - { - case CTF_SC_VALIDATION : - { - pValidationsContainer->AddValidation(aItr->maValue, nValidationIndex); - // this is not very slow, because it is most the last property or - // if it is not the last property it is the property before the last property, - // so in the worst case only one property has to be copied, but in the best case no - // property has to be copied - aItr = xPropStates.erase(aItr); - aEndItr = xPropStates.end(); // old aEndItr is invalidated! - } - break; - case CTF_SC_CELLSTYLE : - { - aItr->maValue >>= sStyleName; - aItr->mnIndex = -1; - ++aItr; - ++nCount; - } - break; - case CTF_SC_NUMBERFORMAT : - { - if (aItr->maValue >>= nNumberFormat) - addDataStyle(nNumberFormat); - ++aItr; - ++nCount; - } - break; - default: - { - ++aItr; - ++nCount; - } - break; - } - } - else - { - ++aItr; - ++nCount; - } - } - if (nCount == 1) // this is the CellStyle and should be removed if alone - xPropStates.clear(); - if (nNumberFormat == -1) - xProperties->getPropertyValue(SC_NUMBERFORMAT) >>= nNumberFormat; - if (sStyleName.getLength()) - { - if (xPropStates.size()) - { - sal_Int32 nIndex; - if (pOldName) - { - if (GetAutoStylePool()->AddNamed(*pOldName, XML_STYLE_FAMILY_TABLE_CELL, sStyleName, xPropStates)) - { - GetAutoStylePool()->RegisterName(XML_STYLE_FAMILY_TABLE_CELL, *pOldName); - // add to pCellStyles, so the name is found for normal sheets - rtl::OUString* pTemp(new rtl::OUString(*pOldName)); - if (!pCellStyles->AddStyleName(pTemp, nIndex)) - delete pTemp; - } - } - else - { - rtl::OUString sName; - sal_Bool bIsAutoStyle(sal_True); - if (GetAutoStylePool()->Add(sName, XML_STYLE_FAMILY_TABLE_CELL, sStyleName, xPropStates)) - { - rtl::OUString* pTemp(new rtl::OUString(sName)); - if (!pCellStyles->AddStyleName(pTemp, nIndex)) - delete pTemp; - } - else - nIndex = pCellStyles->GetIndexOfStyleName(sName, SC_SCELLPREFIX, bIsAutoStyle); - - uno::Sequence<table::CellRangeAddress> aAddresses(xCellRanges->getRangeAddresses()); - table::CellRangeAddress* pAddresses(aAddresses.getArray()); - sal_Bool bGetMerge(sal_True); - for (sal_Int32 i = 0; i < aAddresses.getLength(); ++i, ++pAddresses) - { - pSharedData->SetLastColumn(nTable, pAddresses->EndColumn); - pSharedData->SetLastRow(nTable, pAddresses->EndRow); - pCellStyles->AddRangeStyleName(*pAddresses, nIndex, bIsAutoStyle, nValidationIndex, nNumberFormat); - if (bGetMerge) - bGetMerge = GetMerged(pAddresses, xTable); - } - } - } - else - { - rtl::OUString* pTemp(new rtl::OUString(EncodeStyleName(sStyleName))); - sal_Int32 nIndex(0); - if (!pCellStyles->AddStyleName(pTemp, nIndex, false)) - { - delete pTemp; - pTemp = NULL; - } - if ( !pOldName ) - { - uno::Sequence<table::CellRangeAddress> aAddresses(xCellRanges->getRangeAddresses()); - table::CellRangeAddress* pAddresses(aAddresses.getArray()); - sal_Bool bGetMerge(sal_True); - for (sal_Int32 i = 0; i < aAddresses.getLength(); ++i, ++pAddresses) - { - if (bGetMerge) - bGetMerge = GetMerged(pAddresses, xTable); - pCellStyles->AddRangeStyleName(*pAddresses, nIndex, false, nValidationIndex, nNumberFormat); - if (!sStyleName.equalsAsciiL("Default", 7) || nValidationIndex != -1) - { - pSharedData->SetLastColumn(nTable, pAddresses->EndColumn); - pSharedData->SetLastRow(nTable, pAddresses->EndRow); - } - } - } - } - } -} - -void ScXMLExport::AddStyleFromColumn(const uno::Reference<beans::XPropertySet>& xColumnProperties, - const rtl::OUString* pOldName, sal_Int32& rIndex, sal_Bool& rIsVisible) -{ - rtl::OUString SC_SCOLUMNPREFIX(RTL_CONSTASCII_USTRINGPARAM(XML_STYLE_FAMILY_TABLE_COLUMN_STYLES_PREFIX)); - - std::vector<XMLPropertyState> xPropStates(xColumnStylesExportPropertySetMapper->Filter(xColumnProperties)); - if(xPropStates.size()) - { - std::vector< XMLPropertyState >::iterator aItr(xPropStates.begin()); - std::vector< XMLPropertyState >::iterator aEndItr(xPropStates.end()); - while (aItr != aEndItr) - { - if (xColumnStylesPropertySetMapper->GetEntryContextId(aItr->mnIndex) == CTF_SC_ISVISIBLE) - { - aItr->maValue >>= rIsVisible; - break; - } - ++aItr; - } - - rtl::OUString sParent; - if (pOldName) - { - if (GetAutoStylePool()->AddNamed(*pOldName, XML_STYLE_FAMILY_TABLE_COLUMN, sParent, xPropStates)) - { - GetAutoStylePool()->RegisterName(XML_STYLE_FAMILY_TABLE_COLUMN, *pOldName); - // add to pColumnStyles, so the name is found for normal sheets - rtl::OUString* pTemp(new rtl::OUString(*pOldName)); - rIndex = pColumnStyles->AddStyleName(pTemp); - } - } - else - { - rtl::OUString sName; - if (GetAutoStylePool()->Add(sName, XML_STYLE_FAMILY_TABLE_COLUMN, sParent, xPropStates)) - { - rtl::OUString* pTemp(new rtl::OUString(sName)); - rIndex = pColumnStyles->AddStyleName(pTemp); - } - else - rIndex = pColumnStyles->GetIndexOfStyleName(sName, SC_SCOLUMNPREFIX); - } - } -} - -void ScXMLExport::AddStyleFromRow(const uno::Reference<beans::XPropertySet>& xRowProperties, - const rtl::OUString* pOldName, sal_Int32& rIndex) -{ - rtl::OUString SC_SROWPREFIX(RTL_CONSTASCII_USTRINGPARAM(XML_STYLE_FAMILY_TABLE_ROW_STYLES_PREFIX)); - - std::vector<XMLPropertyState> xPropStates(xRowStylesExportPropertySetMapper->Filter(xRowProperties)); - if(xPropStates.size()) - { - rtl::OUString sParent; - if (pOldName) - { - if (GetAutoStylePool()->AddNamed(*pOldName, XML_STYLE_FAMILY_TABLE_ROW, sParent, xPropStates)) - { - GetAutoStylePool()->RegisterName(XML_STYLE_FAMILY_TABLE_ROW, *pOldName); - // add to pRowStyles, so the name is found for normal sheets - rtl::OUString* pTemp(new rtl::OUString(*pOldName)); - rIndex = pRowStyles->AddStyleName(pTemp); - } - } - else - { - rtl::OUString sName; - if (GetAutoStylePool()->Add(sName, XML_STYLE_FAMILY_TABLE_ROW, sParent, xPropStates)) - { - rtl::OUString* pTemp(new rtl::OUString(sName)); - rIndex = pRowStyles->AddStyleName(pTemp); - } - else - rIndex = pRowStyles->GetIndexOfStyleName(sName, SC_SROWPREFIX); - } - } -} - -uno::Any lcl_GetEnumerated( uno::Reference<container::XEnumerationAccess> xEnumAccess, sal_Int32 nIndex ) -{ - uno::Any aRet; - uno::Reference<container::XEnumeration> xEnum( xEnumAccess->createEnumeration() ); - try - { - sal_Int32 nSkip = nIndex; - while ( nSkip > 0 ) - { - (void) xEnum->nextElement(); - --nSkip; - } - aRet = xEnum->nextElement(); - } - catch (container::NoSuchElementException&) - { - // leave aRet empty - } - return aRet; -} - -void ScXMLExport::_ExportAutoStyles() -{ - if (!GetModel().is()) - return; - - Reference <sheet::XSpreadsheetDocument> xSpreadDoc( GetModel(), uno::UNO_QUERY ); - if (!xSpreadDoc.is()) - return; - - Reference<container::XIndexAccess> xIndex( xSpreadDoc->getSheets(), uno::UNO_QUERY ); - if (!xIndex.is()) - return; - - if (getExportFlags() & EXPORT_CONTENT) - { - // re-create automatic styles with old names from stored data - ScSheetSaveData* pSheetData = ScModelObj::getImplementation(xSpreadDoc)->GetSheetSaveData(); - if (pSheetData && pDoc) - { - // formulas have to be calculated now, to detect changed results - // (during normal save, they will be calculated anyway) - SCTAB nTabCount = pDoc->GetTableCount(); - for (SCTAB nTab=0; nTab<nTabCount; ++nTab) - if (pDoc->IsStreamValid(nTab)) - { - ScCellIterator aIter( pDoc, 0,0,nTab, MAXCOL,MAXROW,nTab ); - ScBaseCell* pCell = aIter.GetFirst(); - while (pCell) - { - if (pCell->GetCellType() == CELLTYPE_FORMULA) - static_cast<ScFormulaCell*>(pCell)->IsValue(); // interpret if dirty - pCell = aIter.GetNext(); - } - } - - // stored cell styles - const std::vector<ScCellStyleEntry>& rCellEntries = pSheetData->GetCellStyles(); - std::vector<ScCellStyleEntry>::const_iterator aCellIter = rCellEntries.begin(); - std::vector<ScCellStyleEntry>::const_iterator aCellEnd = rCellEntries.end(); - while (aCellIter != aCellEnd) - { - ScAddress aPos = aCellIter->maCellPos; - sal_Int32 nTable = aPos.Tab(); - bool bCopySheet = pDoc->IsStreamValid( static_cast<SCTAB>(nTable) ); - if (bCopySheet) - { - Reference <sheet::XSpreadsheet> xTable(xIndex->getByIndex(nTable), uno::UNO_QUERY); - Reference <beans::XPropertySet> xProperties( - xTable->getCellByPosition( aPos.Col(), aPos.Row() ), uno::UNO_QUERY ); - - AddStyleFromCells(xProperties, xTable, nTable, &aCellIter->maName); - } - ++aCellIter; - } - - // stored column styles - const std::vector<ScCellStyleEntry>& rColumnEntries = pSheetData->GetColumnStyles(); - std::vector<ScCellStyleEntry>::const_iterator aColumnIter = rColumnEntries.begin(); - std::vector<ScCellStyleEntry>::const_iterator aColumnEnd = rColumnEntries.end(); - while (aColumnIter != aColumnEnd) - { - ScAddress aPos = aColumnIter->maCellPos; - sal_Int32 nTable = aPos.Tab(); - bool bCopySheet = pDoc->IsStreamValid( static_cast<SCTAB>(nTable) ); - if (bCopySheet) - { - Reference<table::XColumnRowRange> xColumnRowRange(xIndex->getByIndex(nTable), uno::UNO_QUERY); - Reference<table::XTableColumns> xTableColumns(xColumnRowRange->getColumns()); - Reference<beans::XPropertySet> xColumnProperties(xTableColumns->getByIndex( aPos.Col() ), uno::UNO_QUERY); - - sal_Int32 nIndex(-1); - sal_Bool bIsVisible(sal_True); - AddStyleFromColumn( xColumnProperties, &aColumnIter->maName, nIndex, bIsVisible ); - } - ++aColumnIter; - } - - // stored row styles - const std::vector<ScCellStyleEntry>& rRowEntries = pSheetData->GetRowStyles(); - std::vector<ScCellStyleEntry>::const_iterator aRowIter = rRowEntries.begin(); - std::vector<ScCellStyleEntry>::const_iterator aRowEnd = rRowEntries.end(); - while (aRowIter != aRowEnd) - { - ScAddress aPos = aRowIter->maCellPos; - sal_Int32 nTable = aPos.Tab(); - bool bCopySheet = pDoc->IsStreamValid( static_cast<SCTAB>(nTable) ); - if (bCopySheet) - { - Reference<table::XColumnRowRange> xColumnRowRange(xIndex->getByIndex(nTable), uno::UNO_QUERY); - Reference<table::XTableRows> xTableRows(xColumnRowRange->getRows()); - Reference<beans::XPropertySet> xRowProperties(xTableRows->getByIndex( aPos.Row() ), uno::UNO_QUERY); - - sal_Int32 nIndex(-1); - AddStyleFromRow( xRowProperties, &aRowIter->maName, nIndex ); - } - ++aRowIter; - } - - // stored table styles - const std::vector<ScCellStyleEntry>& rTableEntries = pSheetData->GetTableStyles(); - std::vector<ScCellStyleEntry>::const_iterator aTableIter = rTableEntries.begin(); - std::vector<ScCellStyleEntry>::const_iterator aTableEnd = rTableEntries.end(); - while (aTableIter != aTableEnd) - { - ScAddress aPos = aTableIter->maCellPos; - sal_Int32 nTable = aPos.Tab(); - bool bCopySheet = pDoc->IsStreamValid( static_cast<SCTAB>(nTable) ); - if (bCopySheet) - { - //! separate method AddStyleFromTable needed? - Reference<beans::XPropertySet> xTableProperties(xIndex->getByIndex(nTable), uno::UNO_QUERY); - if (xTableProperties.is()) - { - std::vector<XMLPropertyState> xPropStates(xTableStylesExportPropertySetMapper->Filter(xTableProperties)); - rtl::OUString sParent; - rtl::OUString sName( aTableIter->maName ); - GetAutoStylePool()->AddNamed(sName, XML_STYLE_FAMILY_TABLE_TABLE, sParent, xPropStates); - GetAutoStylePool()->RegisterName(XML_STYLE_FAMILY_TABLE_TABLE, sName); - } - } - ++aTableIter; - } - - // stored styles for notes - - UniReference<SvXMLExportPropertyMapper> xShapeMapper = XMLShapeExport::CreateShapePropMapper( *this ); - GetShapeExport(); // make sure the graphics styles family is added - - const std::vector<ScNoteStyleEntry>& rNoteEntries = pSheetData->GetNoteStyles(); - std::vector<ScNoteStyleEntry>::const_iterator aNoteIter = rNoteEntries.begin(); - std::vector<ScNoteStyleEntry>::const_iterator aNoteEnd = rNoteEntries.end(); - while (aNoteIter != aNoteEnd) - { - ScAddress aPos = aNoteIter->maCellPos; - sal_Int32 nTable = aPos.Tab(); - bool bCopySheet = pDoc->IsStreamValid( static_cast<SCTAB>(nTable) ); - if (bCopySheet) - { - //! separate method AddStyleFromNote needed? - - ScPostIt* pNote = pDoc->GetNote( aPos ); - OSL_ENSURE( pNote, "note not found" ); - if (pNote) - { - SdrCaptionObj* pDrawObj = pNote->GetOrCreateCaption( aPos ); - // all uno shapes are created anyway in CollectSharedData - Reference<beans::XPropertySet> xShapeProperties( pDrawObj->getUnoShape(), uno::UNO_QUERY ); - if (xShapeProperties.is()) - { - if ( aNoteIter->maStyleName.getLength() ) - { - std::vector<XMLPropertyState> xPropStates(xShapeMapper->Filter(xShapeProperties)); - rtl::OUString sParent; - rtl::OUString sName( aNoteIter->maStyleName ); - GetAutoStylePool()->AddNamed(sName, XML_STYLE_FAMILY_SD_GRAPHICS_ID, sParent, xPropStates); - GetAutoStylePool()->RegisterName(XML_STYLE_FAMILY_SD_GRAPHICS_ID, sName); - } - if ( aNoteIter->maTextStyle.getLength() ) - { - std::vector<XMLPropertyState> xPropStates( - GetTextParagraphExport()->GetParagraphPropertyMapper()->Filter(xShapeProperties)); - rtl::OUString sParent; - rtl::OUString sName( aNoteIter->maTextStyle ); - GetAutoStylePool()->AddNamed(sName, XML_STYLE_FAMILY_TEXT_PARAGRAPH, sParent, xPropStates); - GetAutoStylePool()->RegisterName(XML_STYLE_FAMILY_TEXT_PARAGRAPH, sName); - } - } - } - } - ++aNoteIter; - } - - // note paragraph styles - - UniReference<SvXMLExportPropertyMapper> xParaPropMapper = GetTextParagraphExport()->GetParagraphPropertyMapper(); - - const std::vector<ScTextStyleEntry>& rNoteParaEntries = pSheetData->GetNoteParaStyles(); - std::vector<ScTextStyleEntry>::const_iterator aNoteParaIter = rNoteParaEntries.begin(); - std::vector<ScTextStyleEntry>::const_iterator aNoteParaEnd = rNoteParaEntries.end(); - while (aNoteParaIter != aNoteParaEnd) - { - ScAddress aPos = aNoteParaIter->maCellPos; - sal_Int32 nTable = aPos.Tab(); - bool bCopySheet = pDoc->IsStreamValid( static_cast<SCTAB>(nTable) ); - if (bCopySheet) - { - ScPostIt* pNote = pDoc->GetNote( aPos ); - OSL_ENSURE( pNote, "note not found" ); - if (pNote) - { - SdrCaptionObj* pDrawObj = pNote->GetOrCreateCaption( aPos ); - Reference<container::XEnumerationAccess> xCellText(pDrawObj->getUnoShape(), uno::UNO_QUERY); - Reference<beans::XPropertySet> xParaProp( - lcl_GetEnumerated( xCellText, aNoteParaIter->maSelection.nStartPara ), uno::UNO_QUERY ); - if ( xParaProp.is() ) - { - std::vector<XMLPropertyState> xPropStates(xParaPropMapper->Filter(xParaProp)); - rtl::OUString sParent; - rtl::OUString sName( aNoteParaIter->maName ); - GetAutoStylePool()->AddNamed(sName, XML_STYLE_FAMILY_TEXT_PARAGRAPH, sParent, xPropStates); - GetAutoStylePool()->RegisterName(XML_STYLE_FAMILY_TEXT_PARAGRAPH, sName); - } - } - } - ++aNoteParaIter; - } - - // note text styles - - UniReference<SvXMLExportPropertyMapper> xTextPropMapper = XMLTextParagraphExport::CreateCharExtPropMapper( *this ); - - const std::vector<ScTextStyleEntry>& rNoteTextEntries = pSheetData->GetNoteTextStyles(); - std::vector<ScTextStyleEntry>::const_iterator aNoteTextIter = rNoteTextEntries.begin(); - std::vector<ScTextStyleEntry>::const_iterator aNoteTextEnd = rNoteTextEntries.end(); - while (aNoteTextIter != aNoteTextEnd) - { - ScAddress aPos = aNoteTextIter->maCellPos; - sal_Int32 nTable = aPos.Tab(); - bool bCopySheet = pDoc->IsStreamValid( static_cast<SCTAB>(nTable) ); - if (bCopySheet) - { - ScPostIt* pNote = pDoc->GetNote( aPos ); - OSL_ENSURE( pNote, "note not found" ); - if (pNote) - { - SdrCaptionObj* pDrawObj = pNote->GetOrCreateCaption( aPos ); - Reference<text::XSimpleText> xCellText(pDrawObj->getUnoShape(), uno::UNO_QUERY); - Reference<beans::XPropertySet> xCursorProp(xCellText->createTextCursor(), uno::UNO_QUERY); - ScDrawTextCursor* pCursor = ScDrawTextCursor::getImplementation( xCursorProp ); - if (pCursor) - { - pCursor->SetSelection( aNoteTextIter->maSelection ); - - std::vector<XMLPropertyState> xPropStates(xTextPropMapper->Filter(xCursorProp)); - rtl::OUString sParent; - rtl::OUString sName( aNoteTextIter->maName ); - GetAutoStylePool()->AddNamed(sName, XML_STYLE_FAMILY_TEXT_TEXT, sParent, xPropStates); - GetAutoStylePool()->RegisterName(XML_STYLE_FAMILY_TEXT_TEXT, sName); - } - } - } - ++aNoteTextIter; - } - - // stored text styles - - const std::vector<ScTextStyleEntry>& rTextEntries = pSheetData->GetTextStyles(); - std::vector<ScTextStyleEntry>::const_iterator aTextIter = rTextEntries.begin(); - std::vector<ScTextStyleEntry>::const_iterator aTextEnd = rTextEntries.end(); - while (aTextIter != aTextEnd) - { - ScAddress aPos = aTextIter->maCellPos; - sal_Int32 nTable = aPos.Tab(); - bool bCopySheet = pDoc->IsStreamValid( static_cast<SCTAB>(nTable) ); - if (bCopySheet) - { - //! separate method AddStyleFromText needed? - //! cache sheet object - - Reference<table::XCellRange> xCellRange(xIndex->getByIndex(nTable), uno::UNO_QUERY); - Reference<text::XSimpleText> xCellText(xCellRange->getCellByPosition(aPos.Col(), aPos.Row()), uno::UNO_QUERY); - Reference<beans::XPropertySet> xCursorProp(xCellText->createTextCursor(), uno::UNO_QUERY); - ScCellTextCursor* pCursor = ScCellTextCursor::getImplementation( xCursorProp ); - if (pCursor) - { - pCursor->SetSelection( aTextIter->maSelection ); - - std::vector<XMLPropertyState> xPropStates(xTextPropMapper->Filter(xCursorProp)); - rtl::OUString sParent; - rtl::OUString sName( aTextIter->maName ); - GetAutoStylePool()->AddNamed(sName, XML_STYLE_FAMILY_TEXT_TEXT, sParent, xPropStates); - GetAutoStylePool()->RegisterName(XML_STYLE_FAMILY_TEXT_TEXT, sName); - } - } - ++aTextIter; - } - } - - ExportExternalRefCacheStyles(); - - if (!pSharedData) - { - sal_Int32 nTableCount(0); - sal_Int32 nShapesCount(0); - sal_Int32 nCellCount(pDoc ? pDoc->GetCellCount() : 0); - CollectSharedData(nTableCount, nShapesCount, nCellCount); - } - sal_Int32 nTableCount(xIndex->getCount()); - pCellStyles->AddNewTable(nTableCount - 1); - CollectShapesAutoStyles(nTableCount); - for (sal_Int32 nTable = 0; nTable < nTableCount; ++nTable, IncrementProgressBar(false)) - { - bool bUseStream = pSheetData && pDoc && pDoc->IsStreamValid((SCTAB)nTable) && - pSheetData->HasStreamPos(nTable) && xSourceStream.is(); - - Reference <sheet::XSpreadsheet> xTable(xIndex->getByIndex(nTable), uno::UNO_QUERY); - if (!xTable.is()) - continue; - - // table styles array must be complete, including copied tables - Add should find the stored style - Reference<beans::XPropertySet> xTableProperties(xTable, uno::UNO_QUERY); - if (xTableProperties.is()) - { - std::vector<XMLPropertyState> xPropStates(xTableStylesExportPropertySetMapper->Filter(xTableProperties)); - if(xPropStates.size()) - { - rtl::OUString sParent; - rtl::OUString sName; - GetAutoStylePool()->Add(sName, XML_STYLE_FAMILY_TABLE_TABLE, sParent, xPropStates); - aTableStyles.push_back(sName); - } - } - - if (bUseStream) - continue; - - // collect other auto-styles only for non-copied sheets - Reference<sheet::XUniqueCellFormatRangesSupplier> xCellFormatRanges ( xTable, uno::UNO_QUERY ); - if ( xCellFormatRanges.is() ) - { - Reference<container::XIndexAccess> xFormatRangesIndex(xCellFormatRanges->getUniqueCellFormatRanges()); - if (xFormatRangesIndex.is()) - { - sal_Int32 nFormatRangesCount(xFormatRangesIndex->getCount()); - GetProgressBarHelper()->ChangeReference(GetProgressBarHelper()->GetReference() + nFormatRangesCount); - for (sal_Int32 nFormatRange = 0; nFormatRange < nFormatRangesCount; ++nFormatRange) - { - Reference< sheet::XSheetCellRanges> xCellRanges(xFormatRangesIndex->getByIndex(nFormatRange), uno::UNO_QUERY); - if (xCellRanges.is()) - { - Reference <beans::XPropertySet> xProperties (xCellRanges, uno::UNO_QUERY); - if (xProperties.is()) - { - AddStyleFromCells(xProperties, xTable, nTable, NULL); - IncrementProgressBar(false); - } - } - } - } - } - Reference<table::XColumnRowRange> xColumnRowRange (xTable, uno::UNO_QUERY); - if (xColumnRowRange.is()) - { - if (pDoc) - { - pDoc->SyncColRowFlags(); - Reference<table::XTableColumns> xTableColumns(xColumnRowRange->getColumns()); - if (xTableColumns.is()) - { - sal_Int32 nColumns(pDoc->GetLastChangedCol(sal::static_int_cast<SCTAB>(nTable))); - pSharedData->SetLastColumn(nTable, nColumns); - table::CellRangeAddress aCellAddress(GetEndAddress(xTable, nTable)); - if (aCellAddress.EndColumn > nColumns) - { - ++nColumns; - pColumnStyles->AddNewTable(nTable, aCellAddress.EndColumn); - } - else - pColumnStyles->AddNewTable(nTable, nColumns); - sal_Int32 nColumn = 0; - while (nColumn <= MAXCOL) - { - sal_Int32 nIndex(-1); - sal_Bool bIsVisible(sal_True); - Reference <beans::XPropertySet> xColumnProperties(xTableColumns->getByIndex(nColumn), uno::UNO_QUERY); - if (xColumnProperties.is()) - { - AddStyleFromColumn( xColumnProperties, NULL, nIndex, bIsVisible ); - pColumnStyles->AddFieldStyleName(nTable, nColumn, nIndex, bIsVisible); - } - sal_Int32 nOld(nColumn); - nColumn = pDoc->GetNextDifferentChangedCol(sal::static_int_cast<SCTAB>(nTable), static_cast<SCCOL>(nColumn)); - for (sal_Int32 i = nOld + 1; i < nColumn; ++i) - pColumnStyles->AddFieldStyleName(nTable, i, nIndex, bIsVisible); - } - if (aCellAddress.EndColumn > nColumns) - { - sal_Bool bIsVisible(sal_True); - sal_Int32 nIndex(pColumnStyles->GetStyleNameIndex(nTable, nColumns, bIsVisible)); - for (sal_Int32 i = nColumns + 1; i <= aCellAddress.EndColumn; ++i) - pColumnStyles->AddFieldStyleName(nTable, i, nIndex, bIsVisible); - } - } - Reference<table::XTableRows> xTableRows(xColumnRowRange->getRows()); - if (xTableRows.is()) - { - sal_Int32 nRows(pDoc->GetLastChangedRow(sal::static_int_cast<SCTAB>(nTable))); - pSharedData->SetLastRow(nTable, nRows); - table::CellRangeAddress aCellAddress(GetEndAddress(xTable, nTable)); - if (aCellAddress.EndRow > nRows) - { - ++nRows; - pRowStyles->AddNewTable(nTable, aCellAddress.EndRow); - } - else - pRowStyles->AddNewTable(nTable, nRows); - sal_Int32 nRow = 0; - while (nRow <= nRows && nRow <= MAXROW) - { - sal_Int32 nIndex = 0; - Reference <beans::XPropertySet> xRowProperties(xTableRows->getByIndex(nRow), uno::UNO_QUERY); - if(xRowProperties.is()) - { - AddStyleFromRow( xRowProperties, NULL, nIndex ); - pRowStyles->AddFieldStyleName(nTable, nRow, nIndex); - } - sal_Int32 nOld(nRow); - nRow = pDoc->GetNextDifferentChangedRow(sal::static_int_cast<SCTAB>(nTable), static_cast<SCROW>(nRow), false); - if (nRow > nOld + 1) - pRowStyles->AddFieldStyleName(nTable, nOld + 1, nIndex, nRow - 1); - } - if (aCellAddress.EndRow > nRows) - { - sal_Int32 nIndex(pRowStyles->GetStyleNameIndex(nTable, nRows)); - pRowStyles->AddFieldStyleName(nTable, nRows + 1, nIndex, aCellAddress.EndRow); - } - } - } - } - Reference<sheet::XCellRangesQuery> xCellRangesQuery (xTable, uno::UNO_QUERY); - if (xCellRangesQuery.is()) - { - Reference<sheet::XSheetCellRanges> xSheetCellRanges(xCellRangesQuery->queryContentCells(sheet::CellFlags::FORMATTED)); - Reference<sheet::XSheetOperation> xSheetOperation(xSheetCellRanges, uno::UNO_QUERY); - if (xSheetCellRanges.is() && xSheetOperation.is()) - { - sal_uInt32 nCount(sal_uInt32(xSheetOperation->computeFunction(sheet::GeneralFunction_COUNT))); - Reference<container::XEnumerationAccess> xCellsAccess(xSheetCellRanges->getCells()); - if (xCellsAccess.is()) - { - GetProgressBarHelper()->ChangeReference(GetProgressBarHelper()->GetReference() + nCount); - Reference<container::XEnumeration> xCells(xCellsAccess->createEnumeration()); - if (xCells.is()) - { - sal_uInt32 nCount2(0); - while (xCells->hasMoreElements()) - { - Reference<text::XText> xText(xCells->nextElement(), uno::UNO_QUERY); - if (xText.is()) - GetTextParagraphExport()->collectTextAutoStyles(xText, false, false); - ++nCount2; - IncrementProgressBar(false); - } - if(nCount2 > nCount) - GetProgressBarHelper()->SetReference(GetProgressBarHelper()->GetReference() + nCount2 - nCount); - } - } - } - } - } - pChangeTrackingExportHelper->CollectAutoStyles(); - - GetAutoStylePool()->exportXML(XML_STYLE_FAMILY_TABLE_COLUMN, - GetDocHandler(), GetMM100UnitConverter(), GetNamespaceMap()); - GetAutoStylePool()->exportXML(XML_STYLE_FAMILY_TABLE_ROW, - GetDocHandler(), GetMM100UnitConverter(), GetNamespaceMap()); - GetAutoStylePool()->exportXML(XML_STYLE_FAMILY_TABLE_TABLE, - GetDocHandler(), GetMM100UnitConverter(), GetNamespaceMap()); - exportAutoDataStyles(); - GetAutoStylePool()->exportXML(XML_STYLE_FAMILY_TABLE_CELL, - GetDocHandler(), GetMM100UnitConverter(), GetNamespaceMap()); - - GetShapeExport()->exportAutoStyles(); - GetFormExport()->exportAutoStyles( ); - - if (pDoc) - { - ScExternalRefManager* pRefMgr = pDoc->GetExternalRefManager(); - // #i100879# write the table style for cached tables only if there are cached tables - // (same logic as in ExportExternalRefCacheStyles) - if (pRefMgr->hasExternalData()) - { - // Special table style for the external ref cache tables. - AddAttribute(XML_NAMESPACE_STYLE, XML_NAME, sExternalRefTabStyleName); - AddAttribute(XML_NAMESPACE_STYLE, XML_FAMILY, XML_TABLE); - SvXMLElementExport aElemStyle(*this, XML_NAMESPACE_STYLE, XML_STYLE, sal_True, sal_True); - AddAttribute(XML_NAMESPACE_TABLE, XML_DISPLAY, XML_FALSE); - SvXMLElementExport aElemStyleTabProps(*this, XML_NAMESPACE_STYLE, XML_TABLE_PROPERTIES, sal_True, sal_True); - } - } - } - - if (getExportFlags() & EXPORT_MASTERSTYLES) - { - GetPageExport()->collectAutoStyles(sal_True); - GetPageExport()->exportAutoStyles(); - } - - // #i30251#; only write Text Styles once - - if ((getExportFlags() & EXPORT_CONTENT) || (getExportFlags() & EXPORT_MASTERSTYLES)) - GetTextParagraphExport()->exportTextAutoStyles(); -} - -void ScXMLExport::_ExportMasterStyles() -{ - GetPageExport()->exportMasterStyles( sal_True ); -} - -void ScXMLExport::CollectInternalShape( uno::Reference< drawing::XShape > xShape ) -{ - // detective objects and notes - if( SvxShape* pShapeImp = SvxShape::getImplementation( xShape ) ) - { - if( SdrObject* pObject = pShapeImp->GetSdrObject() ) - { - // collect note caption objects from all layers (internal or hidden) - if( ScDrawObjData* pCaptData = ScDrawLayer::GetNoteCaptionData( pObject, static_cast< SCTAB >( nCurrentTable ) ) ) - { - pSharedData->AddNoteObj( xShape, pCaptData->maStart ); - - // #i60851# When the file is saved while editing a new note, - // the cell is still empty -> last column/row must be updated - OSL_ENSURE( pCaptData->maStart.Tab() == nCurrentTable, "invalid table in object data" ); - pSharedData->SetLastColumn( nCurrentTable, pCaptData->maStart.Col() ); - pSharedData->SetLastRow( nCurrentTable, pCaptData->maStart.Row() ); - } - // other objects from internal layer only (detective) - else if( pObject->GetLayer() == SC_LAYER_INTERN ) - { - ScDetectiveFunc aDetFunc( pDoc, static_cast<SCTAB>(nCurrentTable) ); - ScAddress aPosition; - ScRange aSourceRange; - sal_Bool bRedLine; - ScDetectiveObjType eObjType = aDetFunc.GetDetectiveObjectType( - pObject, nCurrentTable, aPosition, aSourceRange, bRedLine ); - pSharedData->GetDetectiveObjContainer()->AddObject( eObjType, static_cast<SCTAB>(nCurrentTable), aPosition, aSourceRange, bRedLine ); - } - } - } -} - -sal_Bool ScXMLExport::GetMerged (const table::CellRangeAddress* pCellAddress, - const uno::Reference <sheet::XSpreadsheet>& xTable) -{ - sal_Bool bReady(false); - sal_Int32 nRow(pCellAddress->StartRow); - sal_Int32 nCol(pCellAddress->StartColumn); - sal_Int32 nEndRow(pCellAddress->EndRow); - sal_Int32 nEndCol(pCellAddress->EndColumn); - sal_Bool bRowInc(nEndRow > nRow); - while(!bReady && nRow <= nEndRow && nCol <= nEndCol) - { - uno::Reference<sheet::XSheetCellRange> xSheetCellRange(xTable->getCellRangeByPosition(nCol, nRow, nCol, nRow), uno::UNO_QUERY); - if (xSheetCellRange.is()) - { - uno::Reference<sheet::XSheetCellCursor> xCursor(xTable->createCursorByRange(xSheetCellRange)); - if(xCursor.is()) - { - uno::Reference<sheet::XCellRangeAddressable> xCellAddress (xCursor, uno::UNO_QUERY); - xCursor->collapseToMergedArea(); - table::CellRangeAddress aCellAddress2(xCellAddress->getRangeAddress()); - if ((aCellAddress2.EndRow > nRow || - aCellAddress2.EndColumn > nCol) && - aCellAddress2.StartRow == nRow && - aCellAddress2.StartColumn == nCol) - { - pMergedRangesContainer->AddRange(aCellAddress2); - pSharedData->SetLastColumn(aCellAddress2.Sheet, aCellAddress2.EndColumn); - pSharedData->SetLastRow(aCellAddress2.Sheet, aCellAddress2.EndRow); - } - else - bReady = sal_True; - } - } - if (!bReady) - { - if (bRowInc) - ++nRow; - else - ++nCol; - } - } - OSL_ENSURE(!(!bReady && nEndRow > nRow && nEndCol > nCol), "should not be possible"); - return !bReady; -} - -sal_Bool ScXMLExport::IsMatrix (const ScAddress& aCell, - table::CellRangeAddress& aCellAddress, sal_Bool& bIsFirst) const -{ - bIsFirst = false; - - ScRange aMatrixRange; - - if (pDoc && pDoc->GetMatrixFormulaRange(aCell, aMatrixRange)) - { - ScUnoConversion::FillApiRange( aCellAddress, aMatrixRange ); - if ((aCellAddress.StartColumn == aCell.Col() && aCellAddress.StartRow == aCell.Row()) && - (aCellAddress.EndColumn > aCell.Col() || aCellAddress.EndRow > aCell.Row())) - { - bIsFirst = sal_True; - return sal_True; - } - else if (aCellAddress.StartColumn != aCell.Col() || aCellAddress.StartRow != aCell.Row() || - aCellAddress.EndColumn != aCell.Col() || aCellAddress.EndRow != aCell.Row()) - return sal_True; - else - { - bIsFirst = sal_True; - return sal_True; - } - } - - return false; -} - -sal_Bool ScXMLExport::GetCellText (ScMyCell& rMyCell, const ScAddress& aPos) const -{ - if (rMyCell.bHasStringValue) - return sal_True; - else - { - rMyCell.sStringValue = ScCellObj::GetOutputString_Impl(pDoc, aPos); - rMyCell.bHasStringValue = sal_True; - return sal_True; - } -} - -void ScXMLExport::WriteTable(sal_Int32 nTable, const Reference<sheet::XSpreadsheet>& xTable) -{ - if (!xTable.is()) - return; - - xCurrentTable.set(xTable); - xCurrentTableCellRange.set(xTable, uno::UNO_QUERY); - uno::Reference<container::XNamed> xName (xTable, uno::UNO_QUERY ); - if (!xName.is()) - return; - - nCurrentTable = sal::static_int_cast<sal_uInt16>( nTable ); - rtl::OUString sOUTableName(xName->getName()); - AddAttribute(sAttrName, sOUTableName); - AddAttribute(sAttrStyleName, aTableStyles[nTable]); - - uno::Reference<util::XProtectable> xProtectable (xTable, uno::UNO_QUERY); - ScTableProtection* pProtect = NULL; - if (xProtectable.is() && xProtectable->isProtected()) - { - AddAttribute(XML_NAMESPACE_TABLE, XML_PROTECTED, XML_TRUE); - if (pDoc) - { - pProtect = pDoc->GetTabProtection(nTable); - if (pProtect) - { - rtl::OUStringBuffer aBuffer; - ScPasswordHash eHashUsed = PASSHASH_UNSPECIFIED; - if (pProtect->hasPasswordHash(PASSHASH_SHA1)) - { - SvXMLUnitConverter::encodeBase64(aBuffer, pProtect->getPasswordHash(PASSHASH_SHA1)); - eHashUsed = PASSHASH_SHA1; - } - else if (pProtect->hasPasswordHash(PASSHASH_XL, PASSHASH_SHA1)) - { - // Double-hash this by SHA1 on top of the legacy xls hash. - uno::Sequence<sal_Int8> aHash = pProtect->getPasswordHash(PASSHASH_XL, PASSHASH_SHA1); - SvXMLUnitConverter::encodeBase64(aBuffer, aHash); - eHashUsed = PASSHASH_XL; - } - if (aBuffer.getLength()) - { - AddAttribute(XML_NAMESPACE_TABLE, XML_PROTECTION_KEY, aBuffer.makeStringAndClear()); - if (eHashUsed == PASSHASH_XL) - { - AddAttribute(XML_NAMESPACE_TABLE, XML_PROTECTION_KEY_DIGEST_ALGORITHM, - ScPassHashHelper::getHashURI(PASSHASH_XL)); - AddAttribute(XML_NAMESPACE_TABLE, XML_PROTECTION_KEY_DIGEST_ALGORITHM_2, - ScPassHashHelper::getHashURI(PASSHASH_SHA1)); - } - else if (eHashUsed == PASSHASH_SHA1) - AddAttribute(XML_NAMESPACE_TABLE, XML_PROTECTION_KEY_DIGEST_ALGORITHM, - ScPassHashHelper::getHashURI(PASSHASH_SHA1)); - } - } - } - } - rtl::OUString sPrintRanges; - table::CellRangeAddress aColumnHeaderRange; - sal_Bool bHasColumnHeader; - GetColumnRowHeader(bHasColumnHeader, aColumnHeaderRange, bHasRowHeader, aRowHeaderRange, sPrintRanges); - if( sPrintRanges.getLength() ) - AddAttribute( XML_NAMESPACE_TABLE, XML_PRINT_RANGES, sPrintRanges ); - else if (!pDoc->IsPrintEntireSheet(static_cast<SCTAB>(nTable))) - AddAttribute( XML_NAMESPACE_TABLE, XML_PRINT, XML_FALSE); - SvXMLElementExport aElemT(*this, sElemTab, sal_True, sal_True); - - if (pProtect && pProtect->isProtected()) - { - if (pProtect->isOptionEnabled(ScTableProtection::SELECT_LOCKED_CELLS)) - AddAttribute(XML_NAMESPACE_TABLE, XML_SELECT_PROTECTED_CELLS, XML_TRUE); - if (pProtect->isOptionEnabled(ScTableProtection::SELECT_UNLOCKED_CELLS)) - AddAttribute(XML_NAMESPACE_TABLE, XML_SELECT_UNPROTECTED_CELLS, XML_TRUE); - - rtl::OUString aElemName = GetNamespaceMap().GetQNameByKey( - XML_NAMESPACE_TABLE, GetXMLToken(XML_TABLE_PROTECTION)); - - SvXMLElementExport aElemProtected(*this, aElemName, true, true); - } - - CheckAttrList(); - - if ( pDoc && pDoc->GetSheetEvents( static_cast<SCTAB>(nTable) ) && - getDefaultVersion() == SvtSaveOptions::ODFVER_LATEST ) - { - // store sheet events - uno::Reference<document::XEventsSupplier> xSupplier(xTable, uno::UNO_QUERY); - uno::Reference<container::XNameAccess> xEvents(xSupplier->getEvents(), uno::UNO_QUERY); - GetEventExport().ExportExt( xEvents ); - } - - WriteTableSource(); - WriteScenario(); - uno::Reference<drawing::XDrawPage> xDrawPage; - if (pSharedData->HasForm(nTable, xDrawPage) && xDrawPage.is()) - { - ::xmloff::OOfficeFormsExport aForms(*this); - GetFormExport()->exportForms( xDrawPage ); - sal_Bool bRet(GetFormExport()->seekPage( xDrawPage )); - OSL_ENSURE( bRet, "OFormLayerXMLExport::seekPage failed!" ); - (void)bRet; // avoid warning in product version - } - if (pSharedData->HasDrawPage()) - { - GetShapeExport()->seekShapes(uno::Reference<drawing::XShapes>(pSharedData->GetDrawPage(nTable), uno::UNO_QUERY)); - WriteTableShapes(); - } - table::CellRangeAddress aRange(GetEndAddress(xTable, nTable)); - pSharedData->SetLastColumn(nTable, aRange.EndColumn); - pSharedData->SetLastRow(nTable, aRange.EndRow); - pCellsItr->SetCurrentTable(static_cast<SCTAB>(nTable), xCurrentTable); - pGroupColumns->NewTable(); - pGroupRows->NewTable(); - FillColumnRowGroups(); - if (bHasColumnHeader) - pSharedData->SetLastColumn(nTable, aColumnHeaderRange.EndColumn); - bRowHeaderOpen = sal_False; - if (bHasRowHeader) - pSharedData->SetLastRow(nTable, aRowHeaderRange.EndRow); - pDefaults->FillDefaultStyles(nTable, pSharedData->GetLastRow(nTable), - pSharedData->GetLastColumn(nTable), pCellStyles, pDoc); - pRowFormatRanges->SetRowDefaults(pDefaults->GetRowDefaults()); - pRowFormatRanges->SetColDefaults(pDefaults->GetColDefaults()); - pCellStyles->SetRowDefaults(pDefaults->GetRowDefaults()); - pCellStyles->SetColDefaults(pDefaults->GetColDefaults()); - ExportColumns(nTable, aColumnHeaderRange, bHasColumnHeader); - sal_Bool bIsFirst(sal_True); - sal_Int32 nEqualCells(0); - ScMyCell aCell; - ScMyCell aPrevCell; - while(pCellsItr->GetNext(aCell, pCellStyles)) - { - if (bIsFirst) - { - ExportFormatRanges(0, 0, aCell.aCellAddress.Column - 1, aCell.aCellAddress.Row, nTable); - aPrevCell = aCell; - bIsFirst = sal_False; - } - else - { - if ((aPrevCell.aCellAddress.Row == aCell.aCellAddress.Row) && - (aPrevCell.aCellAddress.Column + nEqualCells + 1 == aCell.aCellAddress.Column)) - { - if(IsCellEqual(aPrevCell, aCell)) - ++nEqualCells; - else - { - SetRepeatAttribute(nEqualCells); - WriteCell(aPrevCell); - nEqualCells = 0; - aPrevCell = aCell; - } - } - else - { - SetRepeatAttribute(nEqualCells); - WriteCell(aPrevCell); - ExportFormatRanges(aPrevCell.aCellAddress.Column + nEqualCells + 1, aPrevCell.aCellAddress.Row, - aCell.aCellAddress.Column - 1, aCell.aCellAddress.Row, nTable); - nEqualCells = 0; - aPrevCell = aCell; - } - } - } - if (!bIsFirst) - { - SetRepeatAttribute(nEqualCells); - WriteCell(aPrevCell); - ExportFormatRanges(aPrevCell.aCellAddress.Column + nEqualCells + 1, aPrevCell.aCellAddress.Row, - pSharedData->GetLastColumn(nTable), pSharedData->GetLastRow(nTable), nTable); - } - else - ExportFormatRanges(0, 0, pSharedData->GetLastColumn(nTable), pSharedData->GetLastRow(nTable), nTable); - - CloseRow(pSharedData->GetLastRow(nTable)); - nEqualCells = 0; - - if (pDoc) - { - // Export sheet-local named ranges. - ScRangeName* pRN = pDoc->GetRangeName(nTable); - if (pRN && !pRN->empty()) - { - SvXMLElementExport aElemNEs(*this, XML_NAMESPACE_TABLE, XML_NAMED_EXPRESSIONS, sal_True, sal_True); - ScRangeName::const_iterator itr = pRN->begin(), itrEnd = pRN->end(); - for (; itr != itrEnd; ++itr) - { - CheckAttrList(); - - // name - OUString aStr = itr->GetName(); - AddAttribute(XML_NAMESPACE_TABLE, XML_NAME, aStr); - - // base cell - ScAddress aPos = itr->GetPos(); - aPos.Format(aStr, SCA_ABS_3D, pDoc, FormulaGrammar::CONV_OOO); - AddAttribute(XML_NAMESPACE_TABLE, XML_BASE_CELL_ADDRESS, aStr); - - // expression - itr->GetSymbol(aStr, pDoc->GetStorageGrammar()); - AddAttribute(XML_NAMESPACE_TABLE, XML_EXPRESSION, aStr); - - SvXMLElementExport aElemNR(*this, XML_NAMESPACE_TABLE, XML_NAMED_EXPRESSION, sal_True, sal_True); - } - } - } -} - -void ScXMLExport::WriteCell (ScMyCell& aCell) -{ - ScAddress aCellPos; - ScUnoConversion::FillScAddress( aCellPos, aCell.aCellAddress ); - if (aCell.nStyleIndex != -1) - AddAttribute(sAttrStyleName, *pCellStyles->GetStyleNameByIndex(aCell.nStyleIndex, aCell.bIsAutoStyle)); - if (aCell.nValidationIndex > -1) - AddAttribute(XML_NAMESPACE_TABLE, XML_CONTENT_VALIDATION_NAME, pValidationsContainer->GetValidationName(aCell.nValidationIndex)); - sal_Bool bIsMatrix(aCell.bIsMatrixBase || aCell.bIsMatrixCovered); - sal_Bool bIsFirstMatrixCell(aCell.bIsMatrixBase); - if (bIsFirstMatrixCell) - { - sal_Int32 nColumns(aCell.aMatrixRange.EndColumn - aCell.aMatrixRange.StartColumn + 1); - sal_Int32 nRows(aCell.aMatrixRange.EndRow - aCell.aMatrixRange.StartRow + 1); - rtl::OUStringBuffer sColumns; - rtl::OUStringBuffer sRows; - SvXMLUnitConverter::convertNumber(sColumns, nColumns); - SvXMLUnitConverter::convertNumber(sRows, nRows); - AddAttribute(XML_NAMESPACE_TABLE, XML_NUMBER_MATRIX_COLUMNS_SPANNED, sColumns.makeStringAndClear()); - AddAttribute(XML_NAMESPACE_TABLE, XML_NUMBER_MATRIX_ROWS_SPANNED, sRows.makeStringAndClear()); - } - sal_Bool bIsEmpty(false); - switch (aCell.nType) - { - case table::CellContentType_EMPTY : - { - bIsEmpty = sal_True; - } - break; - case table::CellContentType_VALUE : - { - if (!aCell.bHasDoubleValue) - { - aCell.fValue = pDoc->GetValue( aCellPos ); - aCell.bHasDoubleValue = sal_True; - } - GetNumberFormatAttributesExportHelper()->SetNumberFormatAttributes( - aCell.nNumberFormat, aCell.fValue); - } - break; - case table::CellContentType_TEXT : - { - if (GetCellText(aCell, aCellPos)) - { - rtl::OUString sFormula(lcl_GetRawString(pDoc, aCellPos)); - GetNumberFormatAttributesExportHelper()->SetNumberFormatAttributes( - sFormula, aCell.sStringValue, sal_True, sal_True); - } - } - break; - case table::CellContentType_FORMULA : - { - ScBaseCell* pBaseCell = pDoc ? pDoc->GetCell(aCellPos) : NULL; - if (pBaseCell && pBaseCell->GetCellType() == CELLTYPE_FORMULA) - { - rtl::OUStringBuffer sFormula; - ScFormulaCell* pFormulaCell((ScFormulaCell*) pBaseCell); - if (!bIsMatrix || (bIsMatrix && bIsFirstMatrixCell)) - { - const formula::FormulaGrammar::Grammar eGrammar = pDoc->GetStorageGrammar(); - sal_uInt16 nNamespacePrefix = (eGrammar == formula::FormulaGrammar::GRAM_ODFF ? XML_NAMESPACE_OF : XML_NAMESPACE_OOOC); - pFormulaCell->GetFormula(sFormula, eGrammar); - rtl::OUString sOUFormula(sFormula.makeStringAndClear()); - if (!bIsMatrix) - { - AddAttribute(sAttrFormula, GetNamespaceMap().GetQNameByKey( nNamespacePrefix, sOUFormula, false )); - } - else - { - AddAttribute(sAttrFormula, GetNamespaceMap().GetQNameByKey( nNamespacePrefix, sOUFormula.copy(1, sOUFormula.getLength() - 2), false )); - } - } - if (pFormulaCell->IsValue()) - { - sal_Bool bIsStandard; - rtl::OUString sCurrency; - GetNumberFormatAttributesExportHelper()->GetCellType(aCell.nNumberFormat, sCurrency, bIsStandard); - if (bIsStandard) - { - if (pDoc) - GetNumberFormatAttributesExportHelper()->SetNumberFormatAttributes( - pFormulaCell->GetStandardFormat(*pDoc->GetFormatTable(), 0), - pDoc->GetValue( aCellPos )); - } - else - { - if (pDoc) - GetNumberFormatAttributesExportHelper()->SetNumberFormatAttributes( - aCell.nNumberFormat, pDoc->GetValue( aCellPos )); - } - } - else - { - if (GetCellText(aCell, aCellPos)) - if (aCell.sStringValue.getLength()) - { - AddAttribute(sAttrValueType, XML_STRING); - AddAttribute(sAttrStringValue, aCell.sStringValue); - } - } - } - } - break; - default: - { - // added to avoid warnings - } - } - rtl::OUString* pCellString(&sElemCell); - if (aCell.bIsCovered) - { - pCellString = &sElemCoveredCell; - } - else - { - if (aCell.bIsMergedBase) - { - sal_Int32 nColumns(aCell.aMergeRange.EndColumn - aCell.aMergeRange.StartColumn + 1); - sal_Int32 nRows(aCell.aMergeRange.EndRow - aCell.aMergeRange.StartRow + 1); - rtl::OUStringBuffer sColumns; - rtl::OUStringBuffer sRows; - SvXMLUnitConverter::convertNumber(sColumns, nColumns); - SvXMLUnitConverter::convertNumber(sRows, nRows); - AddAttribute(XML_NAMESPACE_TABLE, XML_NUMBER_COLUMNS_SPANNED, sColumns.makeStringAndClear()); - AddAttribute(XML_NAMESPACE_TABLE, XML_NUMBER_ROWS_SPANNED, sRows.makeStringAndClear()); - } - } - SvXMLElementExport aElemC(*this, *pCellString, sal_True, sal_True); - CheckAttrList(); - WriteAreaLink(aCell); - WriteAnnotation(aCell); - WriteDetective(aCell); - - sal_Bool bEditCell = false; - - if (!bIsEmpty) - { - if ((aCell.nType == table::CellContentType_TEXT && IsEditCell(aCell)) || - (aCell.nType == table::CellContentType_FORMULA && IsMultiLineFormulaCell(aCell))) - { - bEditCell = sal_True; - uno::Reference<text::XText> xText(xCurrentTableCellRange->getCellByPosition(aCell.aCellAddress.Column, aCell.aCellAddress.Row), uno::UNO_QUERY); - if ( xText.is()) - GetTextParagraphExport()->exportText(xText, false, false); - } - else - { - SvXMLElementExport aElemP(*this, sElemP, sal_True, false); - sal_Bool bPrevCharWasSpace(sal_True); - if (GetCellText(aCell, aCellPos)) - GetTextParagraphExport()->exportText(aCell.sStringValue, bPrevCharWasSpace); - } - } - WriteShapes(aCell); - if (!bIsEmpty) - IncrementProgressBar(bEditCell); -} - -void ScXMLExport::ExportShape(const uno::Reference < drawing::XShape >& xShape, awt::Point* pPoint) -{ - uno::Reference < beans::XPropertySet > xShapeProps ( xShape, uno::UNO_QUERY ); - bool bIsChart( false ); - rtl::OUString sPropCLSID (RTL_CONSTASCII_USTRINGPARAM("CLSID")); - rtl::OUString sPropModel (RTL_CONSTASCII_USTRINGPARAM("Model")); - rtl::OUString sPersistName (RTL_CONSTASCII_USTRINGPARAM("PersistName")); - if (xShapeProps.is()) - { - sal_Int32 nZOrder = 0; - if (xShapeProps->getPropertyValue(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ZOrder"))) >>= nZOrder) - { - rtl::OUStringBuffer sBuffer; - GetMM100UnitConverter().convertNumber(sBuffer, nZOrder); - AddAttribute(XML_NAMESPACE_DRAW, XML_ZINDEX, sBuffer.makeStringAndClear()); - } - uno::Reference< beans::XPropertySetInfo > xPropSetInfo = xShapeProps->getPropertySetInfo(); - if( xPropSetInfo->hasPropertyByName( sPropCLSID ) ) - { - rtl::OUString sCLSID; - if (xShapeProps->getPropertyValue( sPropCLSID ) >>= sCLSID) - { - if ( sCLSID.equalsIgnoreAsciiCase(GetChartExport()->getChartCLSID()) ) - { - // we have a chart - ::rtl::OUString sRanges; - if ( pDoc ) - { - ::rtl::OUString aChartName; - xShapeProps->getPropertyValue( sPersistName ) >>= aChartName; - ScRange aEmptyRange; - ScChartListener aSearcher( aChartName, pDoc, aEmptyRange ); - sal_uInt16 nIndex = 0; - ScChartListenerCollection* pCollection = pDoc->GetChartListenerCollection(); - if ( pCollection && pCollection->Search( &aSearcher, nIndex ) ) - { - ScChartListener* pListener = static_cast< ScChartListener* >( pCollection->At( nIndex ) ); - if ( pListener ) - { - const ScRangeListRef& rRangeList = pListener->GetRangeList(); - if ( rRangeList.Is() ) - { - ScRangeStringConverter::GetStringFromRangeList( sRanges, rRangeList, pDoc, FormulaGrammar::CONV_OOO ); - if ( sRanges.getLength() > 0 ) - { - bIsChart = true; - SvXMLAttributeList* pAttrList = new SvXMLAttributeList(); - if ( pAttrList ) - { - pAttrList->AddAttribute( - GetNamespaceMap().GetQNameByKey( XML_NAMESPACE_DRAW, GetXMLToken( XML_NOTIFY_ON_UPDATE_OF_RANGES ) ), sRanges ); - } - GetShapeExport()->exportShape( xShape, SEF_EXPORT_NO_CHART_DATA | SEF_DEFAULT, pPoint, pAttrList ); - } - } - } - } - } - - if ( sRanges.getLength() == 0 ) - { - uno::Reference< frame::XModel > xChartModel; - if( ( xShapeProps->getPropertyValue( sPropModel ) >>= xChartModel ) && - xChartModel.is()) - { - uno::Reference< chart2::XChartDocument > xChartDoc( xChartModel, uno::UNO_QUERY ); - uno::Reference< chart2::data::XDataReceiver > xReceiver( xChartModel, uno::UNO_QUERY ); - if( xChartDoc.is() && xReceiver.is() && - ! xChartDoc->hasInternalDataProvider()) - { - // we have a chart that gets its data from Calc - bIsChart = true; - uno::Sequence< ::rtl::OUString > aRepresentations( - xReceiver->getUsedRangeRepresentations()); - SvXMLAttributeList* pAttrList = 0; - if(aRepresentations.getLength()) - { - // add the ranges used by the chart to the shape - // element to be able to start listening after - // load (when the chart is not yet loaded) - uno::Reference< chart2::data::XRangeXMLConversion > xRangeConverter( xChartDoc->getDataProvider(), uno::UNO_QUERY ); - sRanges = lcl_RangeSequenceToString( aRepresentations, xRangeConverter ); - pAttrList = new SvXMLAttributeList(); - pAttrList->AddAttribute( - GetNamespaceMap().GetQNameByKey( XML_NAMESPACE_DRAW, GetXMLToken(XML_NOTIFY_ON_UPDATE_OF_RANGES) ), sRanges ); - } - GetShapeExport()->exportShape(xShape, SEF_EXPORT_NO_CHART_DATA | SEF_DEFAULT, pPoint, pAttrList); - } - } - } - } - } - } - } - if (!bIsChart) - { - // #i66550 HLINK_FOR_SHAPES - rtl::OUString sHlink; - uno::Reference< beans::XPropertySet > xProps( xShape, uno::UNO_QUERY ); - if ( xProps.is() ) - xProps->getPropertyValue( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( SC_UNONAME_HYPERLINK ) ) ) >>= sHlink; - - std::auto_ptr< SvXMLElementExport > pDrawA; - // enlose shapes with <draw:a> element only if sHlink contains something - if ( sHlink.getLength() > 0 ) - { - // need to get delete the attributes that are pre-loaded - // for the shape export ( otherwise they will become - // attributes of the draw:a element ) This *shouldn't* - // affect performance adversely as there are only a - // couple of attributes involved - uno::Reference< xml::sax::XAttributeList > xSaveAttribs( new SvXMLAttributeList( GetAttrList() ) ); - ClearAttrList(); - // Add Hlink - AddAttribute( XML_NAMESPACE_XLINK, XML_TYPE, XML_SIMPLE ); - AddAttribute( XML_NAMESPACE_XLINK, XML_HREF, sHlink); - pDrawA.reset( new SvXMLElementExport( *this, XML_NAMESPACE_DRAW, XML_A, false, false ) ); - // Attribute list has been cleared by previous operation - // re-add pre-loaded attributes - AddAttributeList( xSaveAttribs ); - } - GetShapeExport()->exportShape(xShape, SEF_DEFAULT, pPoint); - } - IncrementProgressBar(false); -} - -void ScXMLExport::WriteShapes(const ScMyCell& rMyCell) -{ - if( rMyCell.bHasShape && !rMyCell.aShapeList.empty() && pDoc ) - { - awt::Point aPoint; - Rectangle aRec = pDoc->GetMMRect(static_cast<SCCOL>(rMyCell.aCellAddress.Column), static_cast<SCROW>(rMyCell.aCellAddress.Row), - static_cast<SCCOL>(rMyCell.aCellAddress.Column), static_cast<SCROW>(rMyCell.aCellAddress.Row), static_cast<SCTAB>(rMyCell.aCellAddress.Sheet)); - sal_Bool bNegativePage(pDoc->IsNegativePage(rMyCell.aCellAddress.Sheet)); - if (bNegativePage) - aPoint.X = aRec.Right(); - else - aPoint.X = aRec.Left(); - aPoint.Y = aRec.Top(); - ScMyShapeList::const_iterator aItr = rMyCell.aShapeList.begin(); - ScMyShapeList::const_iterator aEndItr(rMyCell.aShapeList.end()); - while (aItr != aEndItr) - { - if (aItr->xShape.is()) - { - if (bNegativePage) - aPoint.X = 2 * aItr->xShape->getPosition().X + aItr->xShape->getSize().Width - aPoint.X; - if ( !aItr->xShape->getShapeType().equals(sCaptionShape) ) - { - Rectangle aEndRec(pDoc->GetMMRect(aItr->aEndAddress.Col(), aItr->aEndAddress.Row(), - aItr->aEndAddress.Col(), aItr->aEndAddress.Row(), aItr->aEndAddress.Tab())); - rtl::OUString sEndAddress; - ScRangeStringConverter::GetStringFromAddress(sEndAddress, aItr->aEndAddress, pDoc, FormulaGrammar::CONV_OOO); - AddAttribute(XML_NAMESPACE_TABLE, XML_END_CELL_ADDRESS, sEndAddress); - rtl::OUStringBuffer sBuffer; - GetMM100UnitConverter().convertMeasure(sBuffer, aItr->nEndX); - AddAttribute(XML_NAMESPACE_TABLE, XML_END_X, sBuffer.makeStringAndClear()); - GetMM100UnitConverter().convertMeasure(sBuffer, aItr->nEndY); - AddAttribute(XML_NAMESPACE_TABLE, XML_END_Y, sBuffer.makeStringAndClear()); - } - ExportShape(aItr->xShape, &aPoint); - } - ++aItr; - } - } -} - -void ScXMLExport::WriteTableShapes() -{ - ScMyTableShapes* pTableShapes(pSharedData->GetTableShapes()); - if (pTableShapes && !(*pTableShapes)[nCurrentTable].empty()) - { - OSL_ENSURE(pTableShapes->size() > static_cast<size_t>(nCurrentTable), "wrong Table"); - SvXMLElementExport aShapesElem(*this, XML_NAMESPACE_TABLE, XML_SHAPES, sal_True, false); - ScMyTableXShapes::iterator aItr((*pTableShapes)[nCurrentTable].begin()); - ScMyTableXShapes::iterator aEndItr((*pTableShapes)[nCurrentTable].end()); - while (aItr != aEndItr) - { - if (aItr->is()) - { - if (pDoc->IsNegativePage(static_cast<SCTAB>(nCurrentTable))) - { - awt::Point aPoint((*aItr)->getPosition()); - awt::Size aSize((*aItr)->getSize()); - aPoint.X += aPoint.X + aSize.Width; - aPoint.Y = 0; - ExportShape(*aItr, &aPoint); - } - else - ExportShape(*aItr, NULL); - } - aItr = (*pTableShapes)[nCurrentTable].erase(aItr); - } - } -} - -void ScXMLExport::WriteAreaLink( const ScMyCell& rMyCell ) -{ - if( rMyCell.bHasAreaLink ) - { - const ScMyAreaLink& rAreaLink = rMyCell.aAreaLink; - AddAttribute( XML_NAMESPACE_TABLE, XML_NAME, rAreaLink.sSourceStr ); - AddAttribute( XML_NAMESPACE_XLINK, XML_TYPE, XML_SIMPLE ); - AddAttribute( XML_NAMESPACE_XLINK, XML_HREF, GetRelativeReference(rAreaLink.sURL) ); - AddAttribute( XML_NAMESPACE_TABLE, XML_FILTER_NAME, rAreaLink.sFilter ); - if( rAreaLink.sFilterOptions.getLength() ) - AddAttribute( XML_NAMESPACE_TABLE, XML_FILTER_OPTIONS, rAreaLink.sFilterOptions ); - OUStringBuffer sValue; - SvXMLUnitConverter::convertNumber( sValue, rAreaLink.GetColCount() ); - AddAttribute( XML_NAMESPACE_TABLE, XML_LAST_COLUMN_SPANNED, sValue.makeStringAndClear() ); - SvXMLUnitConverter::convertNumber( sValue, rAreaLink.GetRowCount() ); - AddAttribute( XML_NAMESPACE_TABLE, XML_LAST_ROW_SPANNED, sValue.makeStringAndClear() ); - if( rAreaLink.nRefresh ) - { - SvXMLUnitConverter::convertTime( sValue, (double)rAreaLink.nRefresh / 86400 ); - AddAttribute( XML_NAMESPACE_TABLE, XML_REFRESH_DELAY, sValue.makeStringAndClear() ); - } - SvXMLElementExport aElem( *this, XML_NAMESPACE_TABLE, XML_CELL_RANGE_SOURCE, sal_True, sal_True ); - } -} - -void ScXMLExport::exportAnnotationMeta( const uno::Reference < drawing::XShape >& xShape) -{ - if (pCurrentCell && pCurrentCell->xNoteShape.is() && pCurrentCell->xNoteShape.get() == xShape.get() && pCurrentCell->xAnnotation.is()) - { - rtl::OUString sAuthor(pCurrentCell->xAnnotation->getAuthor()); - if (sAuthor.getLength()) - { - SvXMLElementExport aCreatorElem( *this, XML_NAMESPACE_DC, - XML_CREATOR, sal_True, - false ); - Characters(sAuthor); - } - - String aDate(pCurrentCell->xAnnotation->getDate()); - if (pDoc) - { - SvNumberFormatter* pNumForm = pDoc->GetFormatTable(); - double fDate; - sal_uInt32 nfIndex = pNumForm->GetFormatIndex(NF_DATE_SYS_DDMMYYYY, LANGUAGE_SYSTEM); - if (pNumForm->IsNumberFormat(aDate, nfIndex, fDate)) - { - rtl::OUStringBuffer sBuf; - GetMM100UnitConverter().convertDateTime(sBuf, fDate,sal_True); - SvXMLElementExport aDateElem( *this, XML_NAMESPACE_DC, - XML_DATE, sal_True, - false ); - Characters(sBuf.makeStringAndClear()); - } - else - { - SvXMLElementExport aDateElem( *this, XML_NAMESPACE_META, - XML_DATE_STRING, sal_True, - false ); - Characters(rtl::OUString(aDate)); - } - } - else - { - SvXMLElementExport aDateElem( *this, XML_NAMESPACE_META, - XML_DATE_STRING, sal_True, - false ); - Characters(rtl::OUString(aDate)); - } - } -} - -void ScXMLExport::WriteAnnotation(ScMyCell& rMyCell) -{ - if( rMyCell.bHasAnnotation && rMyCell.xAnnotation.is()) - { - - if (rMyCell.xAnnotation->getIsVisible()) - AddAttribute(XML_NAMESPACE_OFFICE, XML_DISPLAY, XML_TRUE); - - pCurrentCell = &rMyCell; - - if(rMyCell.xNoteShape.is()) - GetShapeExport()->exportShape(rMyCell.xNoteShape, SEF_DEFAULT|SEF_EXPORT_ANNOTATION, NULL); - - pCurrentCell = NULL; - - rMyCell.xNoteShape.clear(); - } -} - -void ScXMLExport::WriteDetective( const ScMyCell& rMyCell ) -{ - if( rMyCell.bHasDetectiveObj || rMyCell.bHasDetectiveOp ) - { - const ScMyDetectiveObjVec& rObjVec = rMyCell.aDetectiveObjVec; - const ScMyDetectiveOpVec& rOpVec = rMyCell.aDetectiveOpVec; - sal_Int32 nObjCount(rObjVec.size()); - sal_Int32 nOpCount(rOpVec.size()); - if( nObjCount || nOpCount ) - { - SvXMLElementExport aDetElem( *this, XML_NAMESPACE_TABLE, XML_DETECTIVE, sal_True, sal_True ); - OUString sString; - ScMyDetectiveObjVec::const_iterator aObjItr(rObjVec.begin()); - ScMyDetectiveObjVec::const_iterator aEndObjItr(rObjVec.end()); - while(aObjItr != aEndObjItr) - { - if (aObjItr->eObjType != SC_DETOBJ_CIRCLE) - { - if( (aObjItr->eObjType == SC_DETOBJ_ARROW) || (aObjItr->eObjType == SC_DETOBJ_TOOTHERTAB)) - { - ScRangeStringConverter::GetStringFromRange( sString, aObjItr->aSourceRange, pDoc, FormulaGrammar::CONV_OOO ); - AddAttribute( XML_NAMESPACE_TABLE, XML_CELL_RANGE_ADDRESS, sString ); - } - ScXMLConverter::GetStringFromDetObjType( sString, aObjItr->eObjType ); - AddAttribute( XML_NAMESPACE_TABLE, XML_DIRECTION, sString ); - if( aObjItr->bHasError ) - AddAttribute( XML_NAMESPACE_TABLE, XML_CONTAINS_ERROR, XML_TRUE ); - } - else - AddAttribute( XML_NAMESPACE_TABLE, XML_MARKED_INVALID, XML_TRUE ); - SvXMLElementExport aRangeElem( *this, XML_NAMESPACE_TABLE, XML_HIGHLIGHTED_RANGE, sal_True, sal_True ); - ++aObjItr; - } - OUStringBuffer aBuffer; - ScMyDetectiveOpVec::const_iterator aOpItr(rOpVec.begin()); - ScMyDetectiveOpVec::const_iterator aEndOpItr(rOpVec.end()); - while(aOpItr != aEndOpItr) - { - OUString sOpString; - ScXMLConverter::GetStringFromDetOpType( sOpString, aOpItr->eOpType ); - AddAttribute( XML_NAMESPACE_TABLE, XML_NAME, sOpString ); - SvXMLUnitConverter::convertNumber( aBuffer, aOpItr->nIndex ); - AddAttribute( XML_NAMESPACE_TABLE, XML_INDEX, aBuffer.makeStringAndClear() ); - SvXMLElementExport aRangeElem( *this, XML_NAMESPACE_TABLE, XML_OPERATION, sal_True, sal_True ); - ++aOpItr; - } - } - } -} - -void ScXMLExport::SetRepeatAttribute (const sal_Int32 nEqualCellCount) -{ - if (nEqualCellCount > 0) - { - sal_Int32 nTemp(nEqualCellCount + 1); - OUString sOUEqualCellCount(OUString::valueOf(nTemp)); - AddAttribute(sAttrColumnsRepeated, sOUEqualCellCount); - IncrementProgressBar(false, nEqualCellCount); - } -} - -sal_Bool ScXMLExport::IsCellTypeEqual (const ScMyCell& aCell1, const ScMyCell& aCell2) const -{ - return (aCell1.nType == aCell2.nType); -} - -sal_Bool ScXMLExport::IsEditCell(const com::sun::star::table::CellAddress& aAddress, ScMyCell* pMyCell) const -{ - ScAddress aCoreAddress(static_cast<SCCOL>(aAddress.Column), - static_cast<SCROW>(aAddress.Row), - static_cast<SCTAB>(aAddress.Sheet)); - ScBaseCell* pBaseCell = GetDocument() ? GetDocument()->GetCell(aCoreAddress) : NULL; - if (pMyCell) - pMyCell->pBaseCell = pBaseCell; - - if (pBaseCell) - return (pBaseCell->GetCellType() == CELLTYPE_EDIT); - return false; -} - -sal_Bool ScXMLExport::IsEditCell(ScMyCell& rCell) const -{ - if (rCell.bKnowWhetherIsEditCell) - return rCell.bIsEditCell; - else - { - rCell.bIsEditCell = IsEditCell(rCell.aCellAddress, &rCell); - rCell.bKnowWhetherIsEditCell = sal_True; - return rCell.bIsEditCell; - } -} - -sal_Bool ScXMLExport::IsMultiLineFormulaCell(ScMyCell& rCell) const -{ - if (rCell.pBaseCell) - { - if (rCell.pBaseCell->GetCellType() != CELLTYPE_FORMULA) - return false; - - return static_cast<ScFormulaCell*>(rCell.pBaseCell)->IsMultilineResult(); - } - - ScAddress aAddr(static_cast<SCCOL>(rCell.aCellAddress.Column), - static_cast<SCROW>(rCell.aCellAddress.Row), - static_cast<SCTAB>(rCell.aCellAddress.Sheet)); - ScBaseCell* pBaseCell = pDoc ? pDoc->GetCell(aAddr) : NULL; - if (!pBaseCell) - return false; - - rCell.pBaseCell = pBaseCell; - if (rCell.pBaseCell->GetCellType() != CELLTYPE_FORMULA) - return false; - - return static_cast<ScFormulaCell*>(rCell.pBaseCell)->IsMultilineResult(); -} - -sal_Bool ScXMLExport::IsCellEqual (ScMyCell& aCell1, ScMyCell& aCell2) -{ - ScAddress aCellPos1; - ScUnoConversion::FillScAddress( aCellPos1, aCell1.aCellAddress ); - ScAddress aCellPos2; - ScUnoConversion::FillScAddress( aCellPos2, aCell2.aCellAddress ); - sal_Bool bIsEqual = false; - if( !aCell1.bIsMergedBase && !aCell2.bIsMergedBase && - aCell1.bIsCovered == aCell2.bIsCovered && - !aCell1.bIsMatrixBase && !aCell2.bIsMatrixBase && - aCell1.bIsMatrixCovered == aCell2.bIsMatrixCovered && - aCell1.bHasAnnotation == aCell2.bHasAnnotation && - !aCell1.bHasShape && !aCell2.bHasShape && - aCell1.bHasAreaLink == aCell2.bHasAreaLink && - !aCell1.bHasDetectiveObj && !aCell2.bHasDetectiveObj) - { - if( (aCell1.bHasAreaLink && - (aCell1.aAreaLink.GetColCount() == 1) && - (aCell2.aAreaLink.GetColCount() == 1) && - aCell1.aAreaLink.Compare( aCell2.aAreaLink ) ) || - !aCell1.bHasAreaLink ) - { - if (!aCell1.bHasAnnotation || (aCell1.bHasAnnotation && false/*IsAnnotationEqual(aCell1.xCell, aCell2.xCell)*/)) // no longer compareable - { - if ((((aCell1.nStyleIndex == aCell2.nStyleIndex) && (aCell1.bIsAutoStyle == aCell2.bIsAutoStyle)) || - ((aCell1.nStyleIndex == aCell2.nStyleIndex) && (aCell1.nStyleIndex == -1))) && - (aCell1.nValidationIndex == aCell2.nValidationIndex) && - IsCellTypeEqual(aCell1, aCell2)) - { - switch ( aCell1.nType ) - { - case table::CellContentType_EMPTY : - { - bIsEqual = sal_True; - } - break; - case table::CellContentType_VALUE : - { - if(!aCell1.bHasDoubleValue) - { - aCell1.fValue = pDoc->GetValue( aCellPos1 ); - aCell1.bHasDoubleValue = sal_True; - } - if (!aCell2.bHasDoubleValue) - { - aCell2.fValue = pDoc->GetValue( aCellPos2 ); - aCell2.bHasDoubleValue = sal_True; - } - // #i29101# number format may be different from column default styles, - // but can lead to different value types, so it must also be compared - bIsEqual = (aCell1.nNumberFormat == aCell2.nNumberFormat) && - (aCell1.fValue == aCell2.fValue); - } - break; - case table::CellContentType_TEXT : - { - if (IsEditCell(aCell1) || IsEditCell(aCell2)) - bIsEqual = false; - else - { - if (GetCellText(aCell1, aCellPos1) && GetCellText(aCell2, aCellPos2)) - { - bIsEqual = (aCell1.sStringValue == aCell2.sStringValue) && - (lcl_GetRawString(pDoc, aCellPos1) == lcl_GetRawString(pDoc, aCellPos2)); - } - else - bIsEqual = false; - } - } - break; - case table::CellContentType_FORMULA : - { - bIsEqual = false; - } - break; - default : - { - bIsEqual = false; - } - break; - } - } - } - } - } - return bIsEqual; -} - -void ScXMLExport::WriteCalculationSettings(const uno::Reference <sheet::XSpreadsheetDocument>& xSpreadDoc) -{ - uno::Reference<beans::XPropertySet> xPropertySet(xSpreadDoc, uno::UNO_QUERY); - if (xPropertySet.is()) - { - sal_Bool bCalcAsShown (::cppu::any2bool( xPropertySet->getPropertyValue(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(SC_UNO_CALCASSHOWN))) )); - sal_Bool bIgnoreCase (::cppu::any2bool( xPropertySet->getPropertyValue(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(SC_UNO_IGNORECASE))) )); - sal_Bool bLookUpLabels (::cppu::any2bool( xPropertySet->getPropertyValue(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(SC_UNO_LOOKUPLABELS))) )); - sal_Bool bMatchWholeCell (::cppu::any2bool( xPropertySet->getPropertyValue(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(SC_UNO_MATCHWHOLE))) )); - sal_Bool bUseRegularExpressions (::cppu::any2bool( xPropertySet->getPropertyValue(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(SC_UNO_REGEXENABLED))) )); - sal_Bool bIsIterationEnabled (::cppu::any2bool( xPropertySet->getPropertyValue(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(SC_UNO_ITERENABLED))) )); - sal_uInt16 nYear2000 (pDoc ? pDoc->GetDocOptions().GetYear2000() : 0); - sal_Int32 nIterationCount(100); - xPropertySet->getPropertyValue( rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(SC_UNO_ITERCOUNT))) >>= nIterationCount; - double fIterationEpsilon = 0; - xPropertySet->getPropertyValue( rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(SC_UNO_ITEREPSILON))) >>= fIterationEpsilon; - util::Date aNullDate; - xPropertySet->getPropertyValue( rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(SC_UNO_NULLDATE))) >>= aNullDate; - if (bCalcAsShown || bIgnoreCase || !bLookUpLabels || !bMatchWholeCell || !bUseRegularExpressions || - bIsIterationEnabled || nIterationCount != 100 || !::rtl::math::approxEqual(fIterationEpsilon, 0.001) || - aNullDate.Day != 30 || aNullDate.Month != 12 || aNullDate.Year != 1899 || nYear2000 != 1930) - { - if (bIgnoreCase) - AddAttribute(XML_NAMESPACE_TABLE, XML_CASE_SENSITIVE, XML_FALSE); - if (bCalcAsShown) - AddAttribute(XML_NAMESPACE_TABLE, XML_PRECISION_AS_SHOWN, XML_TRUE); - if (!bMatchWholeCell) - AddAttribute(XML_NAMESPACE_TABLE, XML_SEARCH_CRITERIA_MUST_APPLY_TO_WHOLE_CELL, XML_FALSE); - if (!bLookUpLabels) - AddAttribute(XML_NAMESPACE_TABLE, XML_AUTOMATIC_FIND_LABELS, XML_FALSE); - if (!bUseRegularExpressions) - AddAttribute(XML_NAMESPACE_TABLE, XML_USE_REGULAR_EXPRESSIONS, XML_FALSE); - if (nYear2000 != 1930) - { - rtl::OUStringBuffer sBuffer; - GetMM100UnitConverter().convertNumber(sBuffer, nYear2000); - AddAttribute(XML_NAMESPACE_TABLE, XML_NULL_YEAR, sBuffer.makeStringAndClear()); - } - SvXMLElementExport aCalcSettings(*this, XML_NAMESPACE_TABLE, XML_CALCULATION_SETTINGS, sal_True, sal_True); - { - if (aNullDate.Day != 30 || aNullDate.Month != 12 || aNullDate.Year != 1899) - { - rtl::OUStringBuffer sDate; - GetMM100UnitConverter().convertDateTime(sDate, 0.0, aNullDate); - AddAttribute(XML_NAMESPACE_TABLE, XML_DATE_VALUE, sDate.makeStringAndClear()); - SvXMLElementExport aElemNullDate(*this, XML_NAMESPACE_TABLE, XML_NULL_DATE, sal_True, sal_True); - } - if (bIsIterationEnabled || nIterationCount != 100 || !::rtl::math::approxEqual(fIterationEpsilon, 0.001)) - { - rtl::OUStringBuffer sBuffer; - if (bIsIterationEnabled) - AddAttribute(XML_NAMESPACE_TABLE, XML_STATUS, XML_ENABLE); - if (nIterationCount != 100) - { - GetMM100UnitConverter().convertNumber(sBuffer, nIterationCount); - AddAttribute(XML_NAMESPACE_TABLE, XML_STEPS, sBuffer.makeStringAndClear()); - } - if (!::rtl::math::approxEqual(fIterationEpsilon, 0.001)) - { - GetMM100UnitConverter().convertDouble(sBuffer, fIterationEpsilon); - AddAttribute(XML_NAMESPACE_TABLE, XML_MAXIMUM_DIFFERENCE, sBuffer.makeStringAndClear()); - } - SvXMLElementExport aElemIteration(*this, XML_NAMESPACE_TABLE, XML_ITERATION, sal_True, sal_True); - } - } - } - } -} - -void ScXMLExport::WriteTableSource() -{ - uno::Reference <sheet::XSheetLinkable> xLinkable (xCurrentTable, uno::UNO_QUERY); - if (xLinkable.is() && GetModel().is()) - { - sheet::SheetLinkMode nMode (xLinkable->getLinkMode()); - if (nMode != sheet::SheetLinkMode_NONE) - { - rtl::OUString sLink (xLinkable->getLinkUrl()); - uno::Reference <beans::XPropertySet> xProps (GetModel(), uno::UNO_QUERY); - if (xProps.is()) - { - uno::Reference <container::XIndexAccess> xIndex(xProps->getPropertyValue(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(SC_UNO_SHEETLINKS))), uno::UNO_QUERY); - if (xIndex.is()) - { - sal_Int32 nCount(xIndex->getCount()); - if (nCount) - { - sal_Bool bFound(false); - uno::Reference <beans::XPropertySet> xLinkProps; - for (sal_Int32 i = 0; (i < nCount) && !bFound; ++i) - { - xLinkProps.set(xIndex->getByIndex(i), uno::UNO_QUERY); - if (xLinkProps.is()) - { - rtl::OUString sNewLink; - if (xLinkProps->getPropertyValue(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(SC_UNONAME_LINKURL))) >>= sNewLink) - bFound = sLink.equals(sNewLink); - } - } - if (bFound && xLinkProps.is()) - { - rtl::OUString sFilter; - rtl::OUString sFilterOptions; - rtl::OUString sTableName (xLinkable->getLinkSheetName()); - sal_Int32 nRefresh(0); - xLinkProps->getPropertyValue(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(SC_UNONAME_FILTER))) >>= sFilter; - xLinkProps->getPropertyValue(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(SC_UNONAME_FILTOPT))) >>= sFilterOptions; - xLinkProps->getPropertyValue(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(SC_UNONAME_REFDELAY))) >>= nRefresh; - if (sLink.getLength()) - { - AddAttribute(XML_NAMESPACE_XLINK, XML_TYPE, XML_SIMPLE); - AddAttribute(XML_NAMESPACE_XLINK, XML_HREF, GetRelativeReference(sLink)); - if (sTableName.getLength()) - AddAttribute(XML_NAMESPACE_TABLE, XML_TABLE_NAME, sTableName); - if (sFilter.getLength()) - AddAttribute(XML_NAMESPACE_TABLE, XML_FILTER_NAME, sFilter); - if (sFilterOptions.getLength()) - AddAttribute(XML_NAMESPACE_TABLE, XML_FILTER_OPTIONS, sFilterOptions); - if (nMode != sheet::SheetLinkMode_NORMAL) - AddAttribute(XML_NAMESPACE_TABLE, XML_MODE, XML_COPY_RESULTS_ONLY); - if( nRefresh ) - { - rtl::OUStringBuffer sBuffer; - SvXMLUnitConverter::convertTime( sBuffer, (double)nRefresh / 86400 ); - AddAttribute( XML_NAMESPACE_TABLE, XML_REFRESH_DELAY, sBuffer.makeStringAndClear() ); - } - SvXMLElementExport aSourceElem(*this, XML_NAMESPACE_TABLE, XML_TABLE_SOURCE, sal_True, sal_True); - } - } - } - } - } - } - } -} - -// core implementation -void ScXMLExport::WriteScenario() -{ - if (pDoc && pDoc->IsScenario(static_cast<SCTAB>(nCurrentTable))) - { - String sComment; - Color aColor; - sal_uInt16 nFlags; - pDoc->GetScenarioData(static_cast<SCTAB>(nCurrentTable), sComment, aColor, nFlags); - if (!(nFlags & SC_SCENARIO_SHOWFRAME)) - AddAttribute(XML_NAMESPACE_TABLE, XML_DISPLAY_BORDER, XML_FALSE); - rtl::OUStringBuffer aBuffer; - SvXMLUnitConverter::convertColor(aBuffer, aColor); - AddAttribute(XML_NAMESPACE_TABLE, XML_BORDER_COLOR, aBuffer.makeStringAndClear()); - if (!(nFlags & SC_SCENARIO_TWOWAY)) - AddAttribute(XML_NAMESPACE_TABLE, XML_COPY_BACK, XML_FALSE); - if (!(nFlags & SC_SCENARIO_ATTRIB)) - AddAttribute(XML_NAMESPACE_TABLE, XML_COPY_STYLES, XML_FALSE); - if (nFlags & SC_SCENARIO_VALUE) - AddAttribute(XML_NAMESPACE_TABLE, XML_COPY_FORMULAS, XML_FALSE); - if (nFlags & SC_SCENARIO_PROTECT) - AddAttribute(XML_NAMESPACE_TABLE, XML_PROTECTED, XML_TRUE); - SvXMLUnitConverter::convertBool(aBuffer, pDoc->IsActiveScenario(static_cast<SCTAB>(nCurrentTable))); - AddAttribute(XML_NAMESPACE_TABLE, XML_IS_ACTIVE, aBuffer.makeStringAndClear()); - const ScRangeList* pRangeList = pDoc->GetScenarioRanges(static_cast<SCTAB>(nCurrentTable)); - rtl::OUString sRangeListStr; - ScRangeStringConverter::GetStringFromRangeList( sRangeListStr, pRangeList, pDoc, FormulaGrammar::CONV_OOO ); - AddAttribute(XML_NAMESPACE_TABLE, XML_SCENARIO_RANGES, sRangeListStr); - if (sComment.Len()) - AddAttribute(XML_NAMESPACE_TABLE, XML_COMMENT, rtl::OUString(sComment)); - SvXMLElementExport aElem(*this, XML_NAMESPACE_TABLE, XML_SCENARIO, sal_True, sal_True); - } -} - -void ScXMLExport::WriteTheLabelRanges( const uno::Reference< sheet::XSpreadsheetDocument >& xSpreadDoc ) -{ - uno::Reference< beans::XPropertySet > xDocProp( xSpreadDoc, uno::UNO_QUERY ); - if( !xDocProp.is() ) return; - - sal_Int32 nCount(0); - uno::Reference< container::XIndexAccess > xColRangesIAccess(xDocProp->getPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( SC_UNO_COLLABELRNG ) ) ), uno::UNO_QUERY); - if( xColRangesIAccess.is() ) - nCount += xColRangesIAccess->getCount(); - - uno::Reference< container::XIndexAccess > xRowRangesIAccess(xDocProp->getPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( SC_UNO_ROWLABELRNG ) ) ), uno::UNO_QUERY); - if( xRowRangesIAccess.is() ) - nCount += xRowRangesIAccess->getCount(); - - if( nCount ) - { - SvXMLElementExport aElem( *this, XML_NAMESPACE_TABLE, XML_LABEL_RANGES, sal_True, sal_True ); - WriteLabelRanges( xColRangesIAccess, sal_True ); - WriteLabelRanges( xRowRangesIAccess, false ); - } -} - -void ScXMLExport::WriteLabelRanges( const uno::Reference< container::XIndexAccess >& xRangesIAccess, sal_Bool bColumn ) -{ - if( !xRangesIAccess.is() ) return; - - sal_Int32 nCount(xRangesIAccess->getCount()); - for( sal_Int32 nIndex = 0; nIndex < nCount; ++nIndex ) - { - uno::Reference< sheet::XLabelRange > xRange(xRangesIAccess->getByIndex( nIndex ), uno::UNO_QUERY); - if( xRange.is() ) - { - OUString sRangeStr; - table::CellRangeAddress aCellRange( xRange->getLabelArea() ); - ScRangeStringConverter::GetStringFromRange( sRangeStr, aCellRange, pDoc, FormulaGrammar::CONV_OOO ); - AddAttribute( XML_NAMESPACE_TABLE, XML_LABEL_CELL_RANGE_ADDRESS, sRangeStr ); - aCellRange = xRange->getDataArea(); - ScRangeStringConverter::GetStringFromRange( sRangeStr, aCellRange, pDoc, FormulaGrammar::CONV_OOO ); - AddAttribute( XML_NAMESPACE_TABLE, XML_DATA_CELL_RANGE_ADDRESS, sRangeStr ); - AddAttribute( XML_NAMESPACE_TABLE, XML_ORIENTATION, bColumn ? XML_COLUMN : XML_ROW ); - SvXMLElementExport aElem( *this, XML_NAMESPACE_TABLE, XML_LABEL_RANGE, sal_True, sal_True ); - } - } -} - -void ScXMLExport::WriteNamedExpressions(const com::sun::star::uno::Reference <com::sun::star::sheet::XSpreadsheetDocument>& xSpreadDoc) -{ - uno::Reference <beans::XPropertySet> xPropertySet (xSpreadDoc, uno::UNO_QUERY); - if (!xPropertySet.is()) - return; - - uno::Reference <sheet::XNamedRanges> xNamedRanges(xPropertySet->getPropertyValue(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(SC_UNO_NAMEDRANGES))), uno::UNO_QUERY); - CheckAttrList(); - if (!xNamedRanges.is()) - return; - - uno::Sequence <rtl::OUString> aRangesNames(xNamedRanges->getElementNames()); - sal_Int32 nNamedRangesCount = aRangesNames.getLength(); - if (nNamedRangesCount <= 0) - return; - - if (!pDoc) - return; - - ScRangeName* pNamedRanges = pDoc->GetRangeName(); - SvXMLElementExport aElemNEs(*this, XML_NAMESPACE_TABLE, XML_NAMED_EXPRESSIONS, sal_True, sal_True); - for (sal_Int32 i = 0; i < nNamedRangesCount; ++i) - { - CheckAttrList(); - rtl::OUString sNamedRange(aRangesNames[i]); - uno::Reference <sheet::XNamedRange> xNamedRange(xNamedRanges->getByName(sNamedRange), uno::UNO_QUERY); - if (!xNamedRange.is()) - continue; - - uno::Reference <container::XNamed> xNamed (xNamedRange, uno::UNO_QUERY); - uno::Reference <sheet::XCellRangeReferrer> xCellRangeReferrer (xNamedRange, uno::UNO_QUERY); - if (!xNamed.is() || !xCellRangeReferrer.is()) - continue; - - rtl::OUString sOUName(xNamed->getName()); - AddAttribute(sAttrName, sOUName); - - OUString sOUBaseCellAddress; - ScRangeStringConverter::GetStringFromAddress( sOUBaseCellAddress, - xNamedRange->getReferencePosition(), pDoc, FormulaGrammar::CONV_OOO, ' ', sal_False, SCA_ABS_3D ); - AddAttribute(XML_NAMESPACE_TABLE, XML_BASE_CELL_ADDRESS, sOUBaseCellAddress); - - const ScRangeData* pNamedRange = pNamedRanges->findByName(sOUName); - String sContent; - pNamedRange->GetSymbol(sContent, pDoc->GetStorageGrammar()); - rtl::OUString sOUTempContent(sContent); - uno::Reference <table::XCellRange> xCellRange(xCellRangeReferrer->getReferredCells()); - if(xCellRange.is()) - { - rtl::OUString sOUContent(sOUTempContent.copy(1, sOUTempContent.getLength() - 2)); - AddAttribute(XML_NAMESPACE_TABLE, XML_CELL_RANGE_ADDRESS, sOUContent); - sal_Int32 nRangeType(xNamedRange->getType()); - rtl::OUStringBuffer sBufferRangeType; - if ((nRangeType & sheet::NamedRangeFlag::COLUMN_HEADER) == sheet::NamedRangeFlag::COLUMN_HEADER) - sBufferRangeType.append(GetXMLToken(XML_REPEAT_COLUMN)); - if ((nRangeType & sheet::NamedRangeFlag::ROW_HEADER) == sheet::NamedRangeFlag::ROW_HEADER) - { - if (sBufferRangeType.getLength() > 0) - sBufferRangeType.appendAscii(" "); - sBufferRangeType.append(GetXMLToken(XML_REPEAT_ROW)); - } - if ((nRangeType & sheet::NamedRangeFlag::FILTER_CRITERIA) == sheet::NamedRangeFlag::FILTER_CRITERIA) - { - if (sBufferRangeType.getLength() > 0) - sBufferRangeType.appendAscii(" "); - sBufferRangeType.append(GetXMLToken(XML_FILTER)); - } - if ((nRangeType & sheet::NamedRangeFlag::PRINT_AREA) == sheet::NamedRangeFlag::PRINT_AREA) - { - if (sBufferRangeType.getLength() > 0) - sBufferRangeType.appendAscii(" "); - sBufferRangeType.append(GetXMLToken(XML_PRINT_RANGE)); - } - rtl::OUString sRangeType = sBufferRangeType.makeStringAndClear(); - if (sRangeType.getLength()) - AddAttribute(XML_NAMESPACE_TABLE, XML_RANGE_USABLE_AS, sRangeType); - SvXMLElementExport aElemNR(*this, XML_NAMESPACE_TABLE, XML_NAMED_RANGE, sal_True, sal_True); - } - else - { - AddAttribute(XML_NAMESPACE_TABLE, XML_EXPRESSION, sOUTempContent); - SvXMLElementExport aElemNE(*this, XML_NAMESPACE_TABLE, XML_NAMED_EXPRESSION, sal_True, sal_True); - } - } -} - -void ScXMLExport::WriteExternalRefCaches() -{ - if (!pDoc) - return; - - ScExternalRefManager* pRefMgr = pDoc->GetExternalRefManager(); - pRefMgr->resetSrcFileData(GetOrigFileName()); - sal_uInt16 nCount = pRefMgr->getExternalFileCount(); - for (sal_uInt16 nFileId = 0; nFileId < nCount; ++nFileId) - { - const OUString* pUrl = pRefMgr->getExternalFileName(nFileId); - if (!pUrl) - continue; - - vector<OUString> aTabNames; - pRefMgr->getAllCachedTableNames(nFileId, aTabNames); - if (aTabNames.empty()) - continue; - - for (vector<OUString>::const_iterator itr = aTabNames.begin(), itrEnd = aTabNames.end(); - itr != itrEnd; ++itr) - { - ScExternalRefCache::TableTypeRef pTable = pRefMgr->getCacheTable(nFileId, *itr, false); - if (!pTable.get() || !pTable->isReferenced()) - continue; - - OUStringBuffer aBuf; - aBuf.append(sal_Unicode('\'')); - aBuf.append(*pUrl); - aBuf.append(sal_Unicode('\'')); - aBuf.append(sal_Unicode('#')); - aBuf.append(*itr); - AddAttribute(XML_NAMESPACE_TABLE, XML_NAME, aBuf.makeStringAndClear()); - AddAttribute(XML_NAMESPACE_TABLE, XML_PRINT, GetXMLToken(XML_FALSE)); - AddAttribute(XML_NAMESPACE_TABLE, XML_STYLE_NAME, sExternalRefTabStyleName); - SvXMLElementExport aElemTable(*this, XML_NAMESPACE_TABLE, XML_TABLE, sal_True, sal_True); - { - const ScExternalRefManager::SrcFileData* pExtFileData = pRefMgr->getExternalFileData(nFileId); - if (pExtFileData) - { - OUString aRelUrl; - if (!pExtFileData->maRelativeName.isEmpty()) - aRelUrl = pExtFileData->maRelativeName; - else - aRelUrl = GetRelativeReference(pExtFileData->maRelativeName); - AddAttribute(XML_NAMESPACE_XLINK, XML_TYPE, XML_SIMPLE); - AddAttribute(XML_NAMESPACE_XLINK, XML_HREF, aRelUrl); - AddAttribute(XML_NAMESPACE_TABLE, XML_TABLE_NAME, *itr); - if (!pExtFileData->maFilterName.isEmpty()) - AddAttribute(XML_NAMESPACE_TABLE, XML_FILTER_NAME, pExtFileData->maFilterName); - if (!pExtFileData->maFilterOptions.isEmpty()) - AddAttribute(XML_NAMESPACE_TABLE, XML_FILTER_OPTIONS, pExtFileData->maFilterOptions); - AddAttribute(XML_NAMESPACE_TABLE, XML_MODE, XML_COPY_RESULTS_ONLY); - } - SvXMLElementExport aElemTableSource(*this, XML_NAMESPACE_TABLE, XML_TABLE_SOURCE, sal_True, sal_True); - } - - // Determine maximum column count of used area, for repeated cells. - SCCOL nMaxColsUsed = 1; // assume that there is at least one cell somewhere.. - vector<SCROW> aRows; - pTable->getAllRows(aRows); - for (vector<SCROW>::const_iterator itrRow = aRows.begin(), itrRowEnd = aRows.end(); - itrRow != itrRowEnd; ++itrRow) - { - SCROW nRow = *itrRow; - vector<SCCOL> aCols; - pTable->getAllCols(nRow, aCols); - if (!aCols.empty()) - { - SCCOL nCol = aCols.back(); - if (nMaxColsUsed <= nCol) - nMaxColsUsed = nCol + 1; - } - } - - // Column definitions have to be present to make a valid file - { - if (nMaxColsUsed > 1) - AddAttribute(XML_NAMESPACE_TABLE, XML_NUMBER_COLUMNS_REPEATED, - OUString::valueOf(static_cast<sal_Int32>(nMaxColsUsed))); - SvXMLElementExport aElemColumn(*this, XML_NAMESPACE_TABLE, XML_TABLE_COLUMN, sal_True, sal_True); - } - - // Write cache content for this table. - SCROW nLastRow = 0; - bool bFirstRow = true; - for (vector<SCROW>::const_iterator itrRow = aRows.begin(), itrRowEnd = aRows.end(); - itrRow != itrRowEnd; ++itrRow) - { - SCROW nRow = *itrRow; - if (bFirstRow) - { - if (nRow > 0) - { - if (nRow > 1) - { - OUStringBuffer aVal; - aVal.append(nRow); - AddAttribute(XML_NAMESPACE_TABLE, XML_NUMBER_ROWS_REPEATED, aVal.makeStringAndClear()); - } - SvXMLElementExport aElemRow(*this, XML_NAMESPACE_TABLE, XML_TABLE_ROW, sal_True, sal_True); - OUStringBuffer aVal; - aVal.append(static_cast<sal_Int32>(nMaxColsUsed)); - AddAttribute(XML_NAMESPACE_TABLE, XML_NUMBER_COLUMNS_REPEATED, aVal.makeStringAndClear()); - SvXMLElementExport aElemCell(*this, XML_NAMESPACE_TABLE, XML_TABLE_CELL, sal_True, sal_True); - } - } - else - { - SCROW nRowGap = nRow - nLastRow; - if (nRowGap > 1) - { - if (nRowGap > 2) - { - OUStringBuffer aVal; - aVal.append(static_cast<sal_Int32>(nRowGap-1)); - AddAttribute(XML_NAMESPACE_TABLE, XML_NUMBER_ROWS_REPEATED, aVal.makeStringAndClear()); - } - SvXMLElementExport aElemRow(*this, XML_NAMESPACE_TABLE, XML_TABLE_ROW, sal_True, sal_True); - OUStringBuffer aVal; - aVal.append(static_cast<sal_Int32>(nMaxColsUsed)); - AddAttribute(XML_NAMESPACE_TABLE, XML_NUMBER_COLUMNS_REPEATED, aVal.makeStringAndClear()); - SvXMLElementExport aElemCell(*this, XML_NAMESPACE_TABLE, XML_TABLE_CELL, sal_True, sal_True); - } - } - SvXMLElementExport aElemRow(*this, XML_NAMESPACE_TABLE, XML_TABLE_ROW, sal_True, sal_True); - - vector<SCCOL> aCols; - pTable->getAllCols(nRow, aCols); - SCCOL nLastCol = 0; - bool bFirstCol = true; - for (vector<SCCOL>::const_iterator itrCol = aCols.begin(), itrColEnd = aCols.end(); - itrCol != itrColEnd; ++itrCol) - { - SCCOL nCol = *itrCol; - if (bFirstCol) - { - if (nCol > 0) - { - if (nCol > 1) - { - OUStringBuffer aVal; - aVal.append(static_cast<sal_Int32>(nCol)); - AddAttribute(XML_NAMESPACE_TABLE, XML_NUMBER_COLUMNS_REPEATED, aVal.makeStringAndClear()); - } - SvXMLElementExport aElemCell(*this, XML_NAMESPACE_TABLE, XML_TABLE_CELL, sal_True, sal_True); - } - } - else - { - SCCOL nColGap = nCol - nLastCol; - if (nColGap > 1) - { - if (nColGap > 2) - { - OUStringBuffer aVal; - aVal.append(static_cast<sal_Int32>(nColGap-1)); - AddAttribute(XML_NAMESPACE_TABLE, XML_NUMBER_COLUMNS_REPEATED, aVal.makeStringAndClear()); - } - SvXMLElementExport aElemCell(*this, XML_NAMESPACE_TABLE, XML_TABLE_CELL, sal_True, sal_True); - } - } - - // Write out this cell. - sal_uInt32 nNumFmt = 0; - ScExternalRefCache::TokenRef pToken = pTable->getCell(nCol, nRow, &nNumFmt); - OUString aStrVal; - if (pToken.get()) - { - sal_Int32 nIndex = GetNumberFormatStyleIndex(nNumFmt); - if (nIndex >= 0) - { - const OUString aStyleName = *pCellStyles->GetStyleNameByIndex(nIndex, true); - AddAttribute(XML_NAMESPACE_TABLE, XML_STYLE_NAME, aStyleName); - } - - switch(pToken->GetType()) - { - case svDouble: - { - AddAttribute(XML_NAMESPACE_OFFICE, XML_VALUE_TYPE, XML_FLOAT); - OUStringBuffer aVal; - aVal.append(pToken->GetDouble()); - aStrVal = aVal.makeStringAndClear(); - AddAttribute(XML_NAMESPACE_OFFICE, XML_VALUE, aStrVal); - } - break; - case svString: - { - AddAttribute(XML_NAMESPACE_OFFICE, XML_VALUE_TYPE, XML_STRING); - aStrVal = pToken->GetString(); - } - break; - default: - ; - } - } - SvXMLElementExport aElemCell(*this, XML_NAMESPACE_TABLE, XML_TABLE_CELL, sal_True, sal_True); - SvXMLElementExport aElemText(*this, XML_NAMESPACE_TEXT, XML_P, sal_True, false); - Characters(aStrVal); - - nLastCol = nCol; - bFirstCol = false; - } - nLastRow = nRow; - bFirstRow = false; - } - } - } -} - -// core implementation -void ScXMLExport::WriteConsolidation() -{ - if (pDoc) - { - const ScConsolidateParam* pCons(pDoc->GetConsolidateDlgData()); - if( pCons ) - { - OUString sStrData; - - ScXMLConverter::GetStringFromFunction( sStrData, pCons->eFunction ); - AddAttribute( XML_NAMESPACE_TABLE, XML_FUNCTION, sStrData ); - - sStrData = OUString(); - for( sal_Int32 nIndex = 0; nIndex < pCons->nDataAreaCount; ++nIndex ) - ScRangeStringConverter::GetStringFromArea( sStrData, *pCons->ppDataAreas[ nIndex ], pDoc, FormulaGrammar::CONV_OOO, sal_True ); - AddAttribute( XML_NAMESPACE_TABLE, XML_SOURCE_CELL_RANGE_ADDRESSES, sStrData ); - - ScRangeStringConverter::GetStringFromAddress( sStrData, ScAddress( pCons->nCol, pCons->nRow, pCons->nTab ), pDoc, FormulaGrammar::CONV_OOO ); - AddAttribute( XML_NAMESPACE_TABLE, XML_TARGET_CELL_ADDRESS, sStrData ); - - if( pCons->bByCol && !pCons->bByRow ) - AddAttribute( XML_NAMESPACE_TABLE, XML_USE_LABEL, XML_COLUMN ); - else if( !pCons->bByCol && pCons->bByRow ) - AddAttribute( XML_NAMESPACE_TABLE, XML_USE_LABEL, XML_ROW ); - else if( pCons->bByCol && pCons->bByRow ) - AddAttribute( XML_NAMESPACE_TABLE, XML_USE_LABEL, XML_BOTH ); - - if( pCons->bReferenceData ) - AddAttribute( XML_NAMESPACE_TABLE, XML_LINK_TO_SOURCE_DATA, XML_TRUE ); - - SvXMLElementExport aElem( *this, XML_NAMESPACE_TABLE, XML_CONSOLIDATION, sal_True, sal_True ); - } - } -} - -SvXMLAutoStylePoolP* ScXMLExport::CreateAutoStylePool() -{ - return new ScXMLAutoStylePoolP(*this); -} - -XMLPageExport* ScXMLExport::CreatePageExport() -{ - return new XMLTableMasterPageExport( *this ); -} - -void ScXMLExport::GetChangeTrackViewSettings(uno::Sequence<beans::PropertyValue>& rProps) -{ - ScChangeViewSettings* pViewSettings(GetDocument() ? GetDocument()->GetChangeViewSettings() : NULL); - if (pViewSettings) - { - sal_Int32 nChangePos(rProps.getLength()); - rProps.realloc(nChangePos + 1); - beans::PropertyValue* pProps(rProps.getArray()); - if (pProps) - { - uno::Sequence<beans::PropertyValue> aChangeProps(SC_VIEWCHANGES_COUNT); - beans::PropertyValue* pChangeProps(aChangeProps.getArray()); - if (pChangeProps) - { - pChangeProps[SC_SHOW_CHANGES].Name = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ShowChanges")); - pChangeProps[SC_SHOW_CHANGES].Value <<= pViewSettings->ShowChanges(); - pChangeProps[SC_SHOW_ACCEPTED_CHANGES].Name = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ShowAcceptedChanges")); - pChangeProps[SC_SHOW_ACCEPTED_CHANGES].Value <<= pViewSettings->IsShowAccepted(); - pChangeProps[SC_SHOW_REJECTED_CHANGES].Name = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ShowRejectedChanges")); - pChangeProps[SC_SHOW_REJECTED_CHANGES].Value <<= pViewSettings->IsShowRejected(); - pChangeProps[SC_SHOW_CHANGES_BY_DATETIME].Name = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ShowChangesByDatetime")); - pChangeProps[SC_SHOW_CHANGES_BY_DATETIME].Value <<= pViewSettings->HasDate(); - pChangeProps[SC_SHOW_CHANGES_BY_DATETIME_MODE].Name = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ShowChangesByDatetimeMode")); - pChangeProps[SC_SHOW_CHANGES_BY_DATETIME_MODE].Value <<= static_cast<sal_Int16>(pViewSettings->GetTheDateMode()); - util::DateTime aDateTime; - ScXMLConverter::ConvertCoreToAPIDateTime(pViewSettings->GetTheFirstDateTime(), aDateTime); - pChangeProps[SC_SHOW_CHANGES_BY_DATETIME_FIRST_DATETIME].Name = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ShowChangesByDatetimeFirstDatetime")); - pChangeProps[SC_SHOW_CHANGES_BY_DATETIME_FIRST_DATETIME].Value <<= aDateTime; - ScXMLConverter::ConvertCoreToAPIDateTime(pViewSettings->GetTheLastDateTime(), aDateTime); - pChangeProps[SC_SHOW_CHANGES_BY_DATETIME_SECOND_DATETIME].Name = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ShowChangesByDatetimeSecondDatetime")); - pChangeProps[SC_SHOW_CHANGES_BY_DATETIME_SECOND_DATETIME].Value <<= aDateTime; - pChangeProps[SC_SHOW_CHANGES_BY_AUTHOR].Name = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ShowChangesByAuthor")); - pChangeProps[SC_SHOW_CHANGES_BY_AUTHOR].Value <<= pViewSettings->HasAuthor(); - pChangeProps[SC_SHOW_CHANGES_BY_AUTHOR_NAME].Name = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ShowChangesByAuthorName")); - pChangeProps[SC_SHOW_CHANGES_BY_AUTHOR_NAME].Value <<= rtl::OUString (pViewSettings->GetTheAuthorToShow()); - pChangeProps[SC_SHOW_CHANGES_BY_COMMENT].Name = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ShowChangesByComment")); - pChangeProps[SC_SHOW_CHANGES_BY_COMMENT].Value <<= pViewSettings->HasComment(); - pChangeProps[SC_SHOW_CHANGES_BY_COMMENT_TEXT].Name = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ShowChangesByCommentText")); - pChangeProps[SC_SHOW_CHANGES_BY_COMMENT_TEXT].Value <<= rtl::OUString (pViewSettings->GetTheComment()); - pChangeProps[SC_SHOW_CHANGES_BY_RANGES].Name = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ShowChangesByRanges")); - pChangeProps[SC_SHOW_CHANGES_BY_RANGES].Value <<= pViewSettings->HasRange(); - rtl::OUString sRangeList; - ScRangeStringConverter::GetStringFromRangeList(sRangeList, &(pViewSettings->GetTheRangeList()), GetDocument(), FormulaGrammar::CONV_OOO); - pChangeProps[SC_SHOW_CHANGES_BY_RANGES_LIST].Name = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ShowChangesByRangesList")); - pChangeProps[SC_SHOW_CHANGES_BY_RANGES_LIST].Value <<= sRangeList; - - pProps[nChangePos].Name = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("TrackedChangesViewSettings")); - pProps[nChangePos].Value <<= aChangeProps; - } - } - } -} - -void ScXMLExport::GetViewSettings(uno::Sequence<beans::PropertyValue>& rProps) -{ - rProps.realloc(4); - beans::PropertyValue* pProps(rProps.getArray()); - if(pProps) - { - if (GetModel().is()) - { - ScModelObj* pDocObj(ScModelObj::getImplementation( GetModel() )); - if (pDocObj) - { - SfxObjectShell* pEmbeddedObj = pDocObj->GetEmbeddedObject(); - if (pEmbeddedObj) - { - Rectangle aRect(pEmbeddedObj->GetVisArea()); - sal_uInt16 i(0); - pProps[i].Name = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("VisibleAreaTop")); - pProps[i].Value <<= static_cast<sal_Int32>(aRect.getY()); - pProps[++i].Name = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("VisibleAreaLeft")); - pProps[i].Value <<= static_cast<sal_Int32>(aRect.getX()); - pProps[++i].Name = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("VisibleAreaWidth")); - pProps[i].Value <<= static_cast<sal_Int32>(aRect.getWidth()); - pProps[++i].Name = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("VisibleAreaHeight")); - pProps[i].Value <<= static_cast<sal_Int32>(aRect.getHeight()); - } - } - } - } - GetChangeTrackViewSettings(rProps); -} - - - - -void ScXMLExport::GetConfigurationSettings(uno::Sequence<beans::PropertyValue>& rProps) -{ - if (GetModel().is()) - { - uno::Reference <lang::XMultiServiceFactory> xMultiServiceFactory(GetModel(), uno::UNO_QUERY); - if (xMultiServiceFactory.is()) - { - uno::Reference <beans::XPropertySet> xProperties(xMultiServiceFactory->createInstance(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.comp.SpreadsheetSettings"))), uno::UNO_QUERY); - if (xProperties.is()) - SvXMLUnitConverter::convertPropertySet(rProps, xProperties); - - sal_Int32 nPropsToAdd = 0; - rtl::OUStringBuffer aTrackedChangesKey; - if (GetDocument() && GetDocument()->GetChangeTrack() && GetDocument()->GetChangeTrack()->IsProtected()) - { - SvXMLUnitConverter::encodeBase64(aTrackedChangesKey, GetDocument()->GetChangeTrack()->GetProtection()); - if (aTrackedChangesKey.getLength()) - ++nPropsToAdd; - } - - bool bVBACompat = false; - uno::Reference <container::XNameAccess> xCodeNameAccess; - OSL_ENSURE( pDoc, "ScXMLExport::GetConfigurationSettings - no ScDocument!" ); - if( pDoc && pDoc->IsInVBAMode() ) - { - // VBA compatibility mode - bVBACompat = true; - ++nPropsToAdd; - // code names - xCodeNameAccess = new XMLCodeNameProvider( pDoc ); - if( xCodeNameAccess->hasElements() ) - ++nPropsToAdd; - else - xCodeNameAccess.clear(); - } - - if( nPropsToAdd > 0 ) - { - sal_Int32 nCount(rProps.getLength()); - rProps.realloc(nCount + nPropsToAdd); - if (aTrackedChangesKey.getLength()) - { - rProps[nCount].Name = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("TrackedChangesProtectionKey")); - rProps[nCount].Value <<= aTrackedChangesKey.makeStringAndClear(); - ++nCount; - } - if( bVBACompat ) - { - rProps[nCount].Name = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("VBACompatibilityMode")); - rProps[nCount].Value <<= bVBACompat; - ++nCount; - } - if( xCodeNameAccess.is() ) - { - rProps[nCount].Name = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ScriptConfiguration")); - rProps[nCount].Value <<= xCodeNameAccess; - ++nCount; - } - } - } - } -} - -XMLShapeExport* ScXMLExport::CreateShapeExport() -{ - return new ScXMLShapeExport(*this); -} - -void ScXMLExport::CreateSharedData(const sal_Int32 nTableCount) -{ - pSharedData = new ScMySharedData(nTableCount); -} - -XMLNumberFormatAttributesExportHelper* ScXMLExport::GetNumberFormatAttributesExportHelper() -{ - if (!pNumberFormatAttributesExportHelper) - pNumberFormatAttributesExportHelper = new XMLNumberFormatAttributesExportHelper(GetNumberFormatsSupplier(), *this ); - return pNumberFormatAttributesExportHelper; -} - -void ScXMLExport::CollectUserDefinedNamespaces(const SfxItemPool* pPool, sal_uInt16 nAttrib) -{ - const SfxPoolItem* pItem; - sal_uInt32 nItems(pPool->GetItemCount2( nAttrib )); - for( sal_uInt32 i = 0; i < nItems; ++i ) - { - if( 0 != (pItem = pPool->GetItem2( nAttrib, i ) ) ) - { - const SvXMLAttrContainerItem *pUnknown((const SvXMLAttrContainerItem *)pItem); - if( (pUnknown->GetAttrCount() > 0) ) - { - sal_uInt16 nIdx(pUnknown->GetFirstNamespaceIndex()); - while( USHRT_MAX != nIdx ) - { - if( (XML_NAMESPACE_UNKNOWN_FLAG & nIdx) != 0 ) - { - const OUString& rPrefix = pUnknown->GetPrefix( nIdx ); - // Add namespace declaration for unknown attributes if - // there aren't existing ones for the prefix used by the - // attibutes - _GetNamespaceMap().Add( rPrefix, - pUnknown->GetNamespace( nIdx ), - XML_NAMESPACE_UNKNOWN ); - } - nIdx = pUnknown->GetNextNamespaceIndex( nIdx ); - } - } - } - } - - // #i66550# needed for 'presentation:event-listener' element for URLs in shapes - _GetNamespaceMap().Add( - GetXMLToken( XML_NP_PRESENTATION ), - GetXMLToken( XML_N_PRESENTATION ), - XML_NAMESPACE_PRESENTATION ); -} - -void ScXMLExport::IncrementProgressBar(sal_Bool bEditCell, sal_Int32 nInc) -{ - nProgressCount += nInc; - if (bEditCell || nProgressCount > 100) - { - GetProgressBarHelper()->Increment(nProgressCount); - nProgressCount = 0; - } -} - -sal_uInt32 ScXMLExport::exportDoc( enum XMLTokenEnum eClass ) -{ - if( (getExportFlags() & (EXPORT_FONTDECLS|EXPORT_STYLES| - EXPORT_MASTERSTYLES|EXPORT_CONTENT)) != 0 ) - { - if (GetDocument()) - { - CollectUserDefinedNamespaces(GetDocument()->GetPool(), ATTR_USERDEF); - CollectUserDefinedNamespaces(GetDocument()->GetEditPool(), EE_PARA_XMLATTRIBS); - CollectUserDefinedNamespaces(GetDocument()->GetEditPool(), EE_CHAR_XMLATTRIBS); - ScDrawLayer* pDrawLayer = GetDocument()->GetDrawLayer(); - if (pDrawLayer) - { - CollectUserDefinedNamespaces(&pDrawLayer->GetItemPool(), EE_PARA_XMLATTRIBS); - CollectUserDefinedNamespaces(&pDrawLayer->GetItemPool(), EE_CHAR_XMLATTRIBS); - CollectUserDefinedNamespaces(&pDrawLayer->GetItemPool(), SDRATTR_XMLATTRIBUTES); - } - - // sheet events use officeooo namespace - if( (getExportFlags() & EXPORT_CONTENT) != 0 && - getDefaultVersion() == SvtSaveOptions::ODFVER_LATEST ) - { - bool bAnySheetEvents = false; - SCTAB nTabCount = pDoc->GetTableCount(); - for (SCTAB nTab=0; nTab<nTabCount; ++nTab) - if (pDoc->GetSheetEvents(nTab)) - bAnySheetEvents = true; - if (bAnySheetEvents) - _GetNamespaceMap().Add( - GetXMLToken( XML_NP_OFFICE_EXT ), - GetXMLToken( XML_N_OFFICE_EXT ), - XML_NAMESPACE_OFFICE_EXT ); - } - } - } - return SvXMLExport::exportDoc( eClass ); -} - -// XExporter -void SAL_CALL ScXMLExport::setSourceDocument( const uno::Reference<lang::XComponent>& xComponent ) - throw(lang::IllegalArgumentException, uno::RuntimeException) -{ - SolarMutexGuard aGuard; - SvXMLExport::setSourceDocument( xComponent ); - - pDoc = ScXMLConverter::GetScDocument( GetModel() ); - OSL_ENSURE( pDoc, "ScXMLExport::setSourceDocument - no ScDocument!" ); - if (!pDoc) - throw lang::IllegalArgumentException(); - - // create ScChangeTrackingExportHelper after document is known - pChangeTrackingExportHelper = new ScChangeTrackingExportHelper(*this); - - // Set the document's storage grammar corresponding to the ODF version that - // is to be written. - SvtSaveOptions::ODFDefaultVersion meODFDefaultVersion = getDefaultVersion(); - switch (meODFDefaultVersion) - { - // ODF 1.0 and 1.1 use GRAM_PODF, everything later or unspecified GRAM_ODFF - case SvtSaveOptions::ODFVER_010: - case SvtSaveOptions::ODFVER_011: - pDoc->SetStorageGrammar( formula::FormulaGrammar::GRAM_PODF); - break; - default: - pDoc->SetStorageGrammar( formula::FormulaGrammar::GRAM_ODFF); - } -} - -// XFilter -sal_Bool SAL_CALL ScXMLExport::filter( const ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue >& aDescriptor ) - throw(::com::sun::star::uno::RuntimeException) -{ - SolarMutexGuard aGuard; - if (pDoc) - pDoc->DisableIdle(sal_True); - sal_Bool bReturn(SvXMLExport::filter(aDescriptor)); - if (pDoc) - pDoc->DisableIdle(false); - return bReturn; -} - -void SAL_CALL ScXMLExport::cancel() - throw(::com::sun::star::uno::RuntimeException) -{ - SolarMutexGuard aGuard; - if (pDoc) - pDoc->DisableIdle(false); - SvXMLExport::cancel(); -} - -// XInitialization -void SAL_CALL ScXMLExport::initialize( const ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Any >& aArguments ) - throw(::com::sun::star::uno::Exception, ::com::sun::star::uno::RuntimeException) -{ - SolarMutexGuard aGuard; - SvXMLExport::initialize(aArguments); -} - -// XServiceInfo -::rtl::OUString SAL_CALL ScXMLExport::getImplementationName( ) - throw(::com::sun::star::uno::RuntimeException) -{ - SolarMutexGuard aGuard; - - sal_uInt16 nFlags = getExportFlags(); - if (nFlags & EXPORT_OASIS) - { - nFlags |= EXPORT_OASIS; - switch( nFlags ) - { - case EXPORT_ALL: - return ScXMLOasisExport_getImplementationName(); - case (EXPORT_STYLES|EXPORT_MASTERSTYLES|EXPORT_AUTOSTYLES|EXPORT_FONTDECLS): - return ScXMLOasisExport_Styles_getImplementationName(); - case (EXPORT_AUTOSTYLES|EXPORT_CONTENT|EXPORT_SCRIPTS|EXPORT_FONTDECLS): - return ScXMLOasisExport_Content_getImplementationName(); - case EXPORT_META: - return ScXMLOasisExport_Meta_getImplementationName(); - case EXPORT_SETTINGS: - return ScXMLOasisExport_Settings_getImplementationName(); - default: - // generic name for 'unknown' cases - return ScXMLOasisExport_getImplementationName(); - } - } - else - { - switch( nFlags ) - { - case EXPORT_ALL: - return ScXMLOOoExport_getImplementationName(); - case (EXPORT_STYLES|EXPORT_MASTERSTYLES|EXPORT_AUTOSTYLES|EXPORT_FONTDECLS): - return ScXMLOOoExport_Styles_getImplementationName(); - case (EXPORT_AUTOSTYLES|EXPORT_CONTENT|EXPORT_SCRIPTS|EXPORT_FONTDECLS): - return ScXMLOOoExport_Content_getImplementationName(); - case EXPORT_META: - return ScXMLOOoExport_Meta_getImplementationName(); - case EXPORT_SETTINGS: - return ScXMLOOoExport_Settings_getImplementationName(); - default: - // generic name for 'unknown' cases - return ScXMLOOoExport_getImplementationName(); - } - } - return SvXMLExport::getImplementationName(); -} - -sal_Bool SAL_CALL ScXMLExport::supportsService( const ::rtl::OUString& ServiceName ) - throw(::com::sun::star::uno::RuntimeException) -{ - SolarMutexGuard aGuard; - return SvXMLExport::supportsService( ServiceName ); -} - -::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL ScXMLExport::getSupportedServiceNames( ) - throw(::com::sun::star::uno::RuntimeException) -{ - SolarMutexGuard aGuard; - return SvXMLExport::getSupportedServiceNames(); -} - -// XUnoTunnel -sal_Int64 SAL_CALL ScXMLExport::getSomething( const ::com::sun::star::uno::Sequence< sal_Int8 >& aIdentifier ) - throw(::com::sun::star::uno::RuntimeException) -{ - SolarMutexGuard aGuard; - return SvXMLExport::getSomething(aIdentifier); -} - -void ScXMLExport::DisposingModel() -{ - SvXMLExport::DisposingModel(); - pDoc = NULL; - xCurrentTable = 0; -} - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |